ADP실기공부/기초

R로 kmean 비계층적 군집분석 하는법

달문달 2023. 3. 20. 17:07


k-mean 분석

거리계산과 평균계산을 활용한
비계층적 군집분석 기법입니다.
거리 계산이 들어가므로
모델학습전에 정규화 혹은 표준화를 시행해주면 좋습니다.

R코드

kmeans(df_nor, centers= k ) #k군집수 설정

# 모델 결과해석 중 핵심내용
-k-means clustering with k clusters of sizes : 군집별 갯수
- cluster means : 각 군집 변수 평균


#실전응용

df=read.csv("diabetes.csv") 데이터셋 이용

문제1.kmeans군집 분석 실시시, 군집 개수 가장 큰 군집의 나이 평균? (군집수는 4개로 설정하고 seed는 123설정, 군집분석 전 minmax정규화 실시)

#정규화실시
model_nor=caret::preProcess(df,method="range") #정규화모델생성
df_nor = predict(model_nor, df) #df에 적용

#군집분석 학습
set.seed(123) ; model=kmeans(df_nor, centers=4)
#결과에서 가장 큰 군집 확인 #2번째군집

#정규화전 원본데이터에 군집 정보 넣기
df[,"cluster"]=model$cluster

#나이평균 계산하기
방법1. 군집(cluster==2)만 따로 처리
mean(df[df$cluster==2, "Age"])

방법2. 모든 cluster별 연산
aggregate(df, Age~cluster, FUN=mean)


문제2. 각 군집 중심점간 유클리드 거리가 가장 가까운 그룹간 거리?

#모델학습
set.seed(123); model=kmeans(df, center=4)

#각 군집중심점(centroid)간 거리
dist(model$centers, method="euclidean")

추가내용 : 적절한 K 구하는법

cluster 패키지 활용해서
실루엣계수 구하기


set.seed(123)
model=kmeans(df,center=k값변경해가며 확인)
sil=silhouette(model$cluster, distance=dist(df, method="euclidean"))

#계수의 평균값 기준으로 판단하기. 클수록 적절
mean(sil[,"sil_width"]


#그래프 판단
factoextra::fviz_nbclust()