R로 kmean 비계층적 군집분석 하는법
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()