1. 회고
월요일 부터 모델링 구현에 힘쓰는 중이다. 그런데 생각보다 잘 안굴러가서 머리가 아프다.
월요일에는 우수 셀러 선정을 위해 파생변수를 만들어냈고, 화요일에는 그 파생변수를 기반으로 우수 셀러를 선정하기 위한 군집을 시행했다.
우리가 선정한 기준은 '인기도', '신뢰도', '회사 이윤' 측면에서 도움을 주는 셀러들이다.
튜터님께서 올려주신 군집 강의를 보면서 코드 진행 방식에 대해서 복습했다.
2. 모델링
(1) K-means 클러스터링의 정의: 데이터 포인트를 k개의 클러스터로 나누는 알고리즘
- 클러스터의 개수 K를 설정
- 초기 클러스터 중심을 무작위로 선택
- 각 데이터 포인트를 가장 가까운 클러스터 중심으로 할당
- 각 클러스터에 대해 중심을 재계산
- 클러스터 중심이 수렴하거나 최대 반복 횟수에 도달하면 종료
(2) 클러스터링 결과 품질 측정 지표
엘보우 기법(Elbow method) : 클러스터의 중심 간의 거리를 측정한 후 제곱하여 모든 클러스터에 대한 제곱 오차를 합산한 값을 활용
실루엣(Silhouette) 지표: 실루엣 점수가 높을수록 클러스터링 품질이 좋음을 나타냄
실루엣 점수 범위: −1 에서+1
- 1: 데이터 포인트가 완벽하게 적절한 클러스터에 속함
- 0: 클러스터 경계에 위치
- -1: 잘못된 클러스터에 할당됨
(3) PCA:
- 데이터의 주요 분산 방향을 찾는 차원 축소 기법
- 고차원의 데이터를 저차원으로 변환하면서 중요한 정보를 유지
# 필요한 변수 선택 및 결측값 제거
selected_features = ["avg_ships_within", "company_profit", "seller_num_followers"]
df_selected = df[selected_features].dropna()
#샘플링 (전체 데이터의 10%만 사용)
df_sample = df_selected.sample(frac=0.05, random_state=42)
#데이터 정규화 (K-Means는 거리 기반 알고리즘이므로 필요)
scaler = StandardScaler()
scaled_sample = scaler.fit_transform(df_sample)
#최적 클러스터 개수 찾기 (Elbow Method & Silhouette Score)
wcss = [] # 클러스터 내 거리 제곱합
silhouette_scores = []
k_values = list(range(2, 10)) # k=2부터 10까지 테스트
for k in k_values:
kmeans = KMeans(n_clusters=k, n_init=10, max_iter=100, random_state=42)
kmeans.fit(scaled_sample)
wcss.append(kmeans.inertia_)
silhouette_avg = silhouette_score(scaled_sample, kmeans.labels_)
silhouette_scores.append(silhouette_avg)
#Elbow Method 시각화
plt.figure(figsize=(8, 5))
plt.plot(k_values, wcss, marker="o", linestyle="-", color="b")
plt.xlabel("Number of Clusters (k)")
plt.ylabel("WCSS (Within-Cluster Sum of Squares)")
plt.title("Elbow Method for Optimal k (Sample Data)")
plt.grid()
plt.show()
#Silhouette Score 시각화
plt.figure(figsize=(8, 5))
plt.plot(k_values, silhouette_scores, marker="o", linestyle="-", color="g")
plt.xlabel("Number of Clusters (k)")
plt.ylabel("Silhouette Score")
plt.title("Silhouette Score for Optimal k")
plt.grid()
plt.show()
# 최적 k 값 선택 (Silhouette Score가 가장 높은 k 사용)
optimal_k = 4
print(f"새로운 최적 클러스터 개수 (k): {optimal_k}")
# 최적 k 값으로 K-Means 재적용
kmeans = KMeans(n_clusters=optimal_k, init='k-means++', n_init=10, max_iter=100, random_state=42)
df_sample["cluster"] = kmeans.fit_predict(scaled_sample)
# X 데이터: 클러스터링에 사용한 원본 특성 데이터
X = df_sample[["avg_ships_within", "company_profit", "seller_num_followers"]].values
# K-Means 클러스터링 실행
kmeans = KMeans(n_clusters=4, random_state=42)
labels = kmeans.fit_predict(X)
# 실루엣 점수 계산
silhouette_avg = silhouette_score(X, labels)
print(f"Silhouette Score: {silhouette_avg:.4f}")
#군집 개수 확인
print(df_sample["cluster"].value_counts()) # 각 군집에 속한 데이터 개수 출력
#3D 시각화
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(
sample_df["seller_pass_rate"],
sample_df["log_follower"],
sample_df["log_profit"],
c=sample_df["cluster"],
cmap="viridis",
alpha=0.7
)
ax.set_title("K-Means Clustering Result (3D View)")
ax.set_xlabel("Seller Pass Rate")
ax.set_ylabel("Product Like Avg")
ax.set_zlabel("Log of Company Profit")
plt.colorbar(scatter, ax=ax, label='Cluster')
plt.show()
'데이터분석캠프 TIL' 카테고리의 다른 글
250405 데이터 분석 캠프 최종프로젝트 (0) | 2025.04.15 |
---|---|
250401 데이터분석과정: 최종 프로젝트 TIL(태블로 대시보드) (1) | 2025.04.01 |
250313 TIL 데이터분석과정(최종 프로젝트 EDA 시각화) (0) | 2025.03.17 |
250311 TIL 데이터분석과정(EDA, 전처리) (0) | 2025.03.11 |
250307 TIL 데이터분석과정 (SQLD 공부, 최종프로젝트, 퍼널분석) (0) | 2025.03.07 |