통계 이야기

빅데이터 분석 ;군집 ; Clustering

창이 2021. 7. 25.
728x90
반응형

군집분석이란 ?
군집의 개수, 내용, 구조 등이 완전히 알려지지 않은 상태에서,
변수 사이의 유사성(similarity)이나 비유사성(또는 거리, distance)에 근거하여 군집을 형성
하는 탐색적 자료분석입니다.

마케팅에서 주로 군집분석을 사용하죠 !

마케팅의 용어 중 "STP" 라고 다들 아시나요 ?

STP 중 Segmentation, 고객 분류 시 주로 clustering 사용하곤 해요 !

clustering은

계층적(Hierarchical) clustering과 비계층적(Non-hierarchical) clustering으로 나뉘는데요.

계층적 클러스터는 "Single Linkage" "Complete Linkage" "Average Linkage" "Ward" 다시 이렇게 나뉘어지고

비계층적 클러스터는 k-means 를 사용합니다.

Single Linkage는 변수간의 최소 거리를 통해 묶는 방법이고,

Complete Linkage는 최대 거리를통해 묶는 방법,

Average Linkage는 그 거리의 평균 거리로 묶는 방법입니다.

Ward는 거리 간 오차의 제곱합으로 묶는 방법입니다.

비계층적 클러스터 중 k-means는 k개의 군집으로 묶어달라, 라는 의미인데

주로 그래프가 꺾이는 지점을 적당한 k 값으로 설정하고 있어요.

데이터 읽기

univ <- read.table("UNIV.DAT")
names(univ) <- c("name", "sat", "top10", "accept", "sfratio", "expenses", "grad")

변수의 특성이 각각 다르기 때문에 변수 표준화

X <- scale(univ[,2:7])
str( univ)

그래프를 활용하여 데이터 탐색

par(mfrow = c(3, 4))
hist(univ$sat)
hist(univ$top10)
hist(univ$accept)
hist(univ$sfratio)
hist(univ$expenses)
hist(univ$grad)
barplot(table(univ$name))

계층적 군집분석을 활용한 군집분석

plot(hclust(dist(X),method="single"),xlab="",ylab="Distance",labels=univ$name)

"Single Linkage"

plot(hclust(dist(X),method="complete"),xlab="",ylab="Distance",labels=univ$name) 

"Complete Linkage"

plot(hclust(dist(X),method="average"),xlab="",ylab="Distance",labels=univ$name)

"Average Linkage"

plot(hclust(dist(X),method="ward"),xlab="",ylab="Distance",labels=univ$name)

"Ward"

K-means를 활용한 군집분석

군집 개수가 4개일 때와 5개일 때, 그리고 10번 수행했을 때 나온 결과 출력
kmeans(X,4) # the number of clusters, k = 4

kmeans(X,5) # the number of clusters, k = 5

10번 수행해서 제일 나은 결과 출력

kmeans(X,5,nstart=10)

적절한 k 수 정하기

WSS = pseudoF = numeric()
n = nrow(X)
for (k in 3:7) {
obj = kmeans(X,k)
WSS[k] = obj$tot.withinss
R.sq = 1 - obj$tot.withinss/obj$totss
pseudoF[k] = (R.sq/(k-1))/((1-R.sq)/(n-k))
}
par(mfrow=c(1,2))
plot(2:8,WSS[2:8],type="b",xlab="number of clusters",ylab="within SS")
plot(2:8,pseudoF[2:8],type="b",xlab="number of clusters",ylab="pseudo F statistic")

k = 5,6이 적절

Metric MDS : cmdscale 함수 이용 (stats 패키지)

cmdscale = 행렬 데이터 상의 데이터 값을 거리로 생각하고 2차원 상에 표현

D = dist(X)
names(D) = c(as.character(univ[,1]))
(obj = cmdscale(D,k=2))
plot(obj[,1],obj[,2],type="n",axes=F,xlab="",ylab="")
text(x=obj[,1],y=obj[,2],names(D),cex=0.9)

library(cluster)
fcl3 <- fanny(univ, 4)
fcl4 <- fanny(univ, 5)
summary(fcl3)
> ```


summary(fcl4)


par(mfrow = c(1, 2))
plot(fcl3)


plot(fcl4)

```

728x90
반응형

댓글

추천 글