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) — 군집별 대표값 표(군집 번호 순), 범주형 컬럼별 구성비(%) 표의 딕셔너리(마지막 '전체' 행은 데이터 전체의 비율) |