콘텐츠로 이동

hossam.my_cluster

hossam.my_cluster

kmeans

kmeans(
    data,
    k,
    columns=None,
    scaling="standard",
    cluster_name="그룹번호",
    random_state=RANDOM_STATE,
    n_init=10,
    verbose=True,
    plot=True,
    x=None,
    y=None,
    title=None,
    palette="tab10",
    size=100,
    edgecolor="#ffffff",
    linewidth=1.5,
    alpha=1,
    outline=True,
    center=True,
    center_marker="X",
    center_size=150,
    center_color="#ff0000",
    center_edgecolor="#000000",
    center_linewidth=1.5,
    equal_scale=False,
    width=1280,
    height=640,
    save_path=None,
    ax=None,
)

데이터를 k개의 군집으로 나누고, 군집 결과와 중심점을 시각화하는 함수

K-Means는 데이터 사이의 '거리'로 그룹을 나누므로, 변수마다 값의 범위가 다르면 범위가 큰 변수 하나가 거리를 지배하게 된다. 그래서 스케일링을 기본으로 수행한다.

Args (기본값은 위의 함수 정의 참고): data, k: 군집화할 데이터프레임과 나눌 군집의 개수 columns, cluster_name, random_state: 사용할 컬럼(None이면 수치형 전체), 군집 번호를 저장할 컬럼명, 중심점의 초기 위치를 결정하는 랜덤시드 n_init: 시작 위치를 바꿔 가며 시도할 횟수 중 가장 좋은 결과를 채택한다 (sklearn의 기본값 'auto'는 1회만 시도하므로 초기값 운에 따라 나쁜 국소최적해에 빠질 수 있다.) scaling: 스케일러 이름('standard'/'minmax'/'robust'/'maxabs', None이면 원본 값) verbose: 스케일링 전후의 값의 범위를 출력할지 여부 plot, x, y, title: 시각화 여부, 산점도의 x·y축 컬럼명(None이면 대상 컬럼의 앞 두 개), 그래프 제목(None이면 군집 개수를 포함하여 자동 생성) palette, size, edgecolor, linewidth, alpha: 데이터 포인트의 색상 팔레트, 마커 크기, 테두리 색상, 테두리 두께, 투명도 outline: 군집의 외곽선(ConvexHull)을 표시할지 여부 center: 모델이 찾은 중심점을 표시할지 여부 center_marker, center_size, center_color, center_edgecolor, center_linewidth: 중심점의 마커 모양, 크기, 색상, 테두리 색상, 테두리 두께 equal_scale: x축의 범위를 y축과 동일하게 맞출지 여부 (모델이 실제로 본 거리 관계를 그대로 확인할 때 사용한다) width, height, save_path, ax: 캔버스 가로·세로 픽셀, 저장 경로, 그래프를 그릴 Axes 객체(None이면 새로 생성)

Returns:

Name Type Description
tuple

(estimator, df, center_df) — 학습이 완료된 모델, 군집 번호 컬럼이 추가된 데이터(스케일링 적용 후), 각 군집의 중심점 좌표(컬럼명은 대상 컬럼과 동일)

visualize_silhouette

visualize_silhouette(
    estimator,
    data,
    columns=None,
    cluster_name="그룹번호",
    x=None,
    y=None,
    title=None,
    palette="tab10",
    size=50,
    edgecolor="#ffffff",
    linewidth=1.5,
    alpha=1,
    outline=True,
    center=True,
    center_marker="X",
    center_size=150,
    center_color="#ff0000",
    center_edgecolor="#000000",
    center_linewidth=1.5,
    width=800,
    height=580,
    save_path=None,
)

군집별 실루엣 계수 막대(왼쪽)와 군집 산점도(오른쪽)를 나란히 그리는 함수

실루엣 계수는 "내가 속한 군집의 이웃들과는 얼마나 가깝고, 가장 가까운 다른 군집과는 얼마나 먼가"를 데이터 하나마다 -1~1 사이의 값으로 나타낸 것이다. 평균값 하나만 보면 "군집 하나가 통째로 망가진 경우"와 "모든 군집이 고만고만한 경우"를 구분할 수 없으므로, 군집별 분포를 막대로 펼쳐서 함께 확인한다.

Args (기본값은 위의 함수 정의 참고): estimator: 학습이 끝난 군집 모델 (KMeans, AgglomerativeClustering 등) data (DataFrame): 군집에 사용한 데이터 (kmeans 함수의 반환값처럼 군집 번호 컬럼이 포함되어 있어도 된다) columns, cluster_name: 실루엣 계산에 사용할 컬럼(None이면 군집 번호 컬럼을 제외한 수치형 전체), 데이터에 포함된 군집 번호 컬럼의 이름 x, y, title: 산점도의 x·y축 컬럼명(None이면 대상 컬럼의 앞 두 개), 그래프 상단 제목(None이면 군집 개수와 실루엣 스코어로 자동 생성) palette, size, edgecolor, linewidth, alpha, outline: 산점도의 색상 팔레트, 마커 크기, 테두리 색상, 테두리 두께, 투명도, 외곽선 표시 여부 (왼쪽 막대의 색상도 같은 팔레트를 사용하므로 두 그래프의 군집 색이 일치한다) center, center_marker, center_size, center_color, center_edgecolor, center_linewidth: 중심점 표시 여부와 마커 모양·크기·색상·테두리 색상·테두리 두께 (중심점을 제공하는 모델에서만 표시된다) width, height, save_path: 그래프 한 칸의 가로·세로 픽셀, 저장 경로

best_k_elbow

best_k_elbow(
    data,
    klist=None,
    columns=None,
    scaling="standard",
    sensitivity=0.01,
    random_state=RANDOM_STATE,
    n_init=10,
    verbose=True,
    plot=True,
    title=None,
    color="#1f77b4",
    marker="o",
    linestyle=":",
    best_color="#ff0000",
    width=1280,
    height=640,
    save_path=None,
    ax=None,
)

이너셔의 감소폭이 꺾이는 지점(엘보우 포인트)을 찾아 최적의 k를 추정하는 함수

이너셔(군집 중심까지 거리의 제곱합)는 k가 커지면 항상 줄어들기 때문에 가장 작은 값을 고르는 것은 의미가 없다. 대신 "k를 하나 더 늘려도 이제 별 이득이 없어지는" 지점을 찾는다. 꺾이는 지점은 KneeLocator가 계산하며, 이너셔는 뭉침만 보는 지표이므로 이 결과는 최종 답이 아니라 후보다.

Args (기본값은 위의 함수 정의 참고): data, klist: 군집화할 데이터, 확인할 k 목록(None이면 2~10) columns, scaling, random_state: 사용할 컬럼(None이면 수치형 전체), 스케일러 이름(None이면 원본 값), 중심점의 초기 위치를 결정하는 랜덤시드 n_init: 시작 위치를 바꿔 가며 시도할 횟수 (k끼리 공정하게 비교하려면 1회로는 부족하다) sensitivity: KneeLocator의 민감도(S). 작을수록 작은 꺾임에도 반응한다 verbose, plot, title: 계산 결과 출력 여부, 시각화 여부, 그래프 제목(None이면 자동 생성) color, marker, linestyle, best_color: 이너셔 선의 색상·마커 모양·선 스타일, 엘보우 포인트를 표시할 세로선의 색상 width, height, save_path, ax: 캔버스 가로·세로 픽셀, 저장 경로, 그래프를 그릴 Axes 객체(None이면 새로 생성)

Returns:

Name Type Description
tuple

(best_k, result_df) — 엘보우 포인트, k별 이너셔와 감소량이 담긴 데이터프레임

best_k_silhouette

best_k_silhouette(
    data,
    klist=None,
    columns=None,
    scaling="standard",
    random_state=RANDOM_STATE,
    n_init=10,
    verbose=True,
    plot=True,
    plot_each=False,
    title=None,
    palette="tab10",
    width=800,
    height=580,
    save_path=None,
)

실루엣 막대의 면적과 두께를 함께 평가해 최적의 k를 찾는 함수

Args (기본값은 위의 함수 정의 참고): data, klist: 군집화할 데이터, 확인할 k 목록(None이면 2~10) columns, scaling, random_state: 사용할 컬럼(None이면 수치형 전체), 스케일러 이름(None이면 원본 값), 중심점의 초기 위치를 결정하는 랜덤시드 n_init: 시작 위치를 바꿔 가며 시도할 횟수 (k끼리 공정하게 비교하려면 1회로는 부족하다) verbose, plot, plot_each: 계산 결과 출력 여부, 선택된 k의 실루엣 막대·산점도(visualize_silhouette)를 그릴지 여부, 선택된 k뿐 아니라 모든 k에 대해 같은 그림을 그릴지 여부 title, palette: 그래프 제목(None이면 군집 개수와 스코어로 자동 생성), 산점도와 막대에 함께 쓰이는 색상 팔레트 width, height, save_path: 그래프 한 칸의 가로·세로 픽셀, 저장 경로

Returns:

Name Type Description
tuple

(best_k, result_df) — 균형지수가 가장 높은 k, k별 스코어·전체면적·두께비·최소상대면적·균형지수가 담긴 데이터프레임

best_k

best_k(
    data,
    klist=None,
    columns=None,
    scaling="standard",
    sensitivity=0.01,
    random_state=RANDOM_STATE,
    n_init=10,
    verbose=True,
    plot=True,
    plot_each=False,
    title=None,
    width=1280,
    height=640,
)

엘보우 포인트와 실루엣 균형지수를 함께 확인해 최종 k를 결정하는 함수

Args (기본값은 위의 함수 정의 참고): data, klist: 군집화할 데이터, 확인할 k 목록(None이면 2~10) columns, scaling, random_state: 사용할 컬럼(None이면 수치형 전체), 스케일러 이름(None이면 원본 값), 중심점의 초기 위치를 결정하는 랜덤시드 n_init: 시작 위치를 바꿔 가며 시도할 횟수 (k끼리 공정하게 비교하려면 1회로는 부족하다) sensitivity: KneeLocator의 민감도(S). 작을수록 작은 꺾임에도 반응한다 verbose, plot, plot_each, title: 판단 과정 출력 여부, 시각화 여부, k마다 실루엣 막대·산점도를 그릴지 여부, 그래프 제목(None이면 자동 생성) width, height: 캔버스 한 칸의 가로·세로 픽셀

Returns:

Name Type Description
tuple

(best_k, result_df) — 최종 선택한 k, k별 이너셔·감소량·실루엣 지표를 한 표로 합친 데이터프레임

dendrogram_source

dendrogram_source(estimator)

계층적 군집 모델을 scipy의 dendrogram()이 읽는 linkage 행렬로 변환하는 함수

sklearn의 AgglomerativeClustering은 "무엇과 무엇을 합쳤는지(children_)"와 "얼마나 먼 거리에서 합쳤는지(distances_)"를 따로 들고 있을 뿐, 덴드로그램을 바로 그려주지는 않는다. 그림을 그리려면 여기에 "그 가지 아래에 원본 데이터가 몇 개나 들어 있는지"를 더한 네 칸짜리 표가 필요하므로 그 개수를 세어 붙인다.

Parameters:

Name Type Description Default
estimator

compute_distances=True 로 학습한 AgglomerativeClustering 모델

required

Returns:

Name Type Description
ndarray

[자식1, 자식2, 병합거리, 포함 샘플수] 형태의 linkage 행렬

plot_dendrogram

plot_dendrogram(
    estimator,
    cut_height=None,
    title=None,
    p=30,
    truncate_mode="lastp",
    leaf_rotation=0,
    leaf_font_size=8,
    count_sort="ascending",
    cut_line=True,
    cut_color="#ff0000",
    xlabel=None,
    ylabel="병합 거리",
    width=1280,
    height=640,
    save_path=None,
    ax=None,
)

계층적 군집 모델이 합쳐온 과정을 덴드로그램으로 그리는 함수

Args (기본값은 위의 함수 정의 참고): estimator: compute_distances=True 로 학습한 AgglomerativeClustering 모델 cut_height: 나무를 자른 높이(병합 거리). 이 높이 아래의 가지를 군집별로 다른 색으로 칠하고 가로선으로 표시한다. None이면 모델이 실제로 자른 높이를 직접 계산해서 쓰므로, 보통은 지정할 필요가 없다 title, xlabel, ylabel: 그래프 제목(None이면 '덴드로그램'), x축·y축 이름 (xlabel이 None이면 가지를 묶어 그리는지에 따라 자동으로 정한다) p, truncate_mode: 표시할 가지의 개수와 생략 방식 ('lastp'=마지막 p개의 가지만, None이면 데이터 전체를 그린다) leaf_rotation, leaf_font_size, count_sort: 아래쪽 눈금의 회전 각도, 글자 크기, 가지의 정렬 기준('ascending'이면 작은 덩어리를 왼쪽에 둔다) cut_line, cut_color: 자른 높이를 가로선으로 표시할지 여부와 그 색상 width, height, save_path, ax: 캔버스 가로·세로 픽셀, 저장 경로, 그래프를 그릴 Axes 객체(None이면 새로 생성)

agglomerative

agglomerative(
    data,
    k=None,
    distance_threshold=None,
    columns=None,
    scaling="standard",
    cluster_name="그룹번호",
    linkage="ward",
    metric="euclidean",
    verbose=True,
    plot=True,
    title=None,
    p=30,
    truncate_mode="lastp",
    leaf_rotation=0,
    leaf_font_size=8,
    count_sort="ascending",
    cut_line=True,
    cut_color="#ff0000",
    width=1280,
    height=640,
    save_path=None,
    ax=None,
)

데이터를 계층적으로 묶어 군집화하고, 합쳐온 과정을 덴드로그램으로 시각화하는 함수

Args (기본값은 위의 함수 정의 참고): data: 군집화할 데이터프레임 k: 나눌 군집의 개수 (distance_threshold 와 둘 중 하나만 지정한다) distance_threshold: 병합을 멈출 거리 기준 (이 값 이상 떨어진 덩어리는 합치지 않는다) columns, cluster_name: 사용할 컬럼(None이면 수치형 전체), 군집 번호를 저장할 컬럼명 scaling: 스케일러 이름('standard'/'minmax'/'robust'/'maxabs', None이면 원본 값) linkage: 두 덩어리 사이의 거리를 재는 방법 ('ward'=합쳤을 때 분산 증가가 최소, 'complete'=가장 먼 쌍, 'average'=모든 쌍의 평균, 'single'=가장 가까운 쌍) metric: 데이터 사이의 거리 계산 방식 (linkage='ward'는 'euclidean'만 지원한다) verbose: 스케일링 전후의 값의 범위와 군집별 데이터 개수를 출력할지 여부 plot, title: 덴드로그램 시각화 여부, 그래프 제목(None이면 자동 생성) p, truncate_mode: 덴드로그램에 표시할 가지의 개수와 생략 방식 ('lastp'=마지막 p개의 가지만, None이면 데이터 전체를 그린다) leaf_rotation, leaf_font_size, count_sort: 아래쪽 눈금의 회전 각도, 글자 크기, 가지의 정렬 기준('ascending'이면 작은 덩어리를 왼쪽에 둔다) cut_line, cut_color: 나무를 자른 높이를 가로선으로 표시할지 여부와 그 색상 width, height, save_path, ax: 캔버스 가로·세로 픽셀, 저장 경로, 그래프를 그릴 Axes 객체(None이면 새로 생성)

Returns:

Name Type Description
tuple

(estimator, df) — 학습이 완료된 모델, 군집 번호 컬럼이 추가된 데이터(스케일링 적용 후)

best_eps

best_eps(
    data,
    min_samples=5,
    columns=None,
    scaling="standard",
    metric="euclidean",
    n_jobs=-1,
    sensitivity=1.0,
    verbose=True,
    plot=True,
    title=None,
    color="#1f77b4",
    linestyle="-",
    best_color="#ff0000",
    width=1280,
    height=640,
    save_path=None,
    ax=None,
)

k-distance plot 의 꺾이는 지점을 찾아 DBSCAN 의 최적 eps 를 추정하는 함수

Args (기본값은 위의 함수 정의 참고): data: 군집화할 데이터프레임 min_samples: 반경 안에 있어야 할 최소 데이터 개수 (이 값이 곧 k가 된다) columns, scaling: 사용할 컬럼(None이면 수치형 전체), 스케일러 이름(None이면 원본 값. 이미 스케일링한 데이터라면 None) metric, n_jobs: 거리 계산 방식, 사용할 CPU 수(-1이면 전부 사용) sensitivity: KneeLocator의 민감도(S). 작을수록 작은 꺾임에도 반응한다 verbose, plot, title: 계산 결과 출력 여부, 시각화 여부, 그래프 제목(None이면 자동 생성) color, linestyle, best_color: 거리 곡선의 색상·선 스타일, 꺾이는 지점을 표시할 가로·세로선의 색상 width, height, save_path, ax: 캔버스 가로·세로 픽셀, 저장 경로, 그래프를 그릴 Axes 객체(None이면 새로 생성)

Returns:

Name Type Description
tuple

(best_eps, result_df) — eps 후보, 거리 순위별 k번째 이웃까지의 거리가 담긴 데이터프레임

dbscan

dbscan(
    data,
    eps=0.5,
    min_samples=5,
    columns=None,
    scaling="standard",
    cluster_name="그룹번호",
    vector_name="벡터유형",
    metric="euclidean",
    n_jobs=-1,
    verbose=True,
    plot=True,
    x=None,
    y=None,
    title=None,
    outline=True,
    palette="tab10",
    size=100,
    edgecolor="#ffffff",
    linewidth=1.5,
    alpha=1,
    core_marker="o",
    border_marker="^",
    border_size=120,
    border_alpha=0.5,
    noise_marker="X",
    noise_size=150,
    noise_color="#ff0000",
    noise_edgecolor="#000000",
    noise_linewidth=1.5,
    width=1280,
    height=640,
    save_path=None,
    ax=None,
)

반경 안의 데이터 개수(밀도)를 기준으로 군집화하고, 그 결과를 시각화하는 함수

Args (기본값은 위의 함수 정의 참고): data: 군집화할 데이터프레임 eps: 이웃으로 인정할 반경 (가장 중요한 값. 표준화 기준 0.3~1.0 에서 탐색한다) min_samples: 반경 안에 있어야 할 최소 데이터 개수 (변수가 2~3개면 3~6) columns, cluster_name, vector_name: 사용할 컬럼(None이면 수치형 전체), 군집 번호·벡터 유형을 저장할 컬럼명 scaling: 스케일러 이름('standard'/'minmax'/'robust'/'maxabs', None이면 원본 값) metric, n_jobs: 거리 계산 방식, 사용할 CPU 수(-1이면 전부 사용) verbose, plot: 스케일링·군집 요약의 출력 여부, 시각화 여부 x, y, title: 산점도의 x·y축 컬럼명(None이면 대상 컬럼의 앞 두 개), 그래프 제목 outline: 군집의 외곽선(ConvexHull)을 표시할지 여부 palette, size, edgecolor, linewidth, alpha: 군집별 색상 팔레트(외곽 벡터·외곽선에도 같이 적용), 핵심 벡터의 마커 크기, 테두리 색상, 테두리 두께, 투명도 core_marker, border_marker, border_size, border_alpha: 핵심·외곽 벡터의 마커 모양, 외곽 벡터의 마커 크기와 투명도(색은 그대로 두고 농도만 낮춰 구분한다) noise_marker, noise_size, noise_color, noise_edgecolor, noise_linewidth: 노이즈 마커의 모양·크기·색상·테두리 색상·테두리 두께 width, height, save_path, ax: 캔버스 가로·세로 픽셀, 저장 경로, 그래프를 그릴 Axes 객체(None이면 새로 생성)

Returns:

Name Type Description
tuple

(estimator, df, summary_df) — 학습이 완료된 모델, 군집 번호·벡터 유형 컬럼이 추가된 데이터(스케일링 적용 후), 군집별 데이터 개수·비율·벡터 유형 개수를 정리한 표(노이즈는 -1 행)

persona

persona(
    data,
    labels=None,
    columns=None,
    cluster_name="ClusterID",
    num_columns=None,
    cat_columns=None,
    exclude=None,
    alpha=0.05,
    show_stat=True,
    verbose=True,
    plot=True,
    crosstab_plot=False,
    palette="tab10",
    cols=2,
    width=800,
    height=520,
    save_path=None,
)

군집별 대표값·구성비를 집계해 페르소나 표를 만들고, 군집별 분포를 시각화하는 함수

학습은 스케일링된 값으로 하지만 해석은 사람이 읽을 수 있는 원본 값으로 해야 하므로, 이 함수에는 스케일링 전의 원본 데이터를 넘긴다. 군집화에 쓰지 않은 변수까지 함께 집계하는 이유는, 거기서 나온 차이가 "나눠 놓고 보니 달랐다"는 더 강한 근거이기 때문이다.

Args (기본값은 위의 함수 정의 참고): data: 해석에 사용할 원본 데이터프레임 (스케일링 전의 값) labels: 군집 번호. 학습이 끝난 모델·배열·Series 모두 가능하며, None이면 data 안의 cluster_name 컬럼을 사용한다 columns: 군집화에 실제로 사용한 컬럼 목록 (그래프 제목에 사용 여부를 표시한다) cluster_name: 군집 번호 컬럼명 num_columns, cat_columns: 집계할 연속형·범주형 컬럼(None이면 자동 선택, 값이 모두 다른 식별자 컬럼은 자동으로 제외한다) exclude: 자동 선택에서 빼고 싶은 컬럼 목록 alpha: 정규성 검정의 유의수준 (p > alpha 이면 평균, 아니면 중앙값을 대표값으로 쓴다) show_stat: 평균과 중앙값을 모두 표에 넣고 채택한 쪽에 별표(*)를 붙일지 여부 (붙이면 해당 컬럼이 문자열이 되므로, 값을 계산에 쓸 때는 False로 지정한다. False면 채택한 대표값 하나만 숫자로 담는다) verbose: 대표값 선택 근거와 범주형 교차표를 출력할지 여부 plot, crosstab_plot: 군집별 상자그림을 그릴지 여부, 범주형 구성비를 히트맵으로도 그릴지 여부 palette, cols: 색상 팔레트, 상자그림을 배치할 열의 개수 width, height, save_path: 그래프 한 칸의 가로·세로 픽셀, 상자그림 저장 경로

Returns:

Name Type Description
tuple

(persona_df, ratio_dict) — 군집별 대표값 표(군집 번호 순), 범주형 컬럼별 구성비(%) 표의 딕셔너리(마지막 '전체' 행은 데이터 전체의 비율)