주성분분석과 클러스터링

2021. 7. 27. 12:45야구데이터분석 공부

비슷하면서도 다른 목적을 가진 분석기법이 많다.

여러 변수들을 합쳐서 공통된 잠재 변수를 찾아내는 분석을 요인분석이라고 하며,

대표적으로 주성분분석이 있다. 

요인분석에서 한 단계 발전한 형태로 테이블 각 행에 있는 관측값들을 변수의 유사성에

따라 그룹지어서 구분하는 클러스터링분석이 있다

클러스터링분석을 야구에 다양하게 적용할수있다.

각종 기록들을 이용해 메이저리그 30개 팀을 구분해볼수있다.

장타력과 투수력은 팀들을 구별하는데 있어 어떤 지표보다도 결정적인 역할을 해왔다.

 

변수가 2개 이상 존재할 경우 주요인분석으로 구한 잠재 변수를 이용해 

관측값을 그룹화 하므로 군집분석과 요인분석이 동시에 사용된다.

 

team <- subset(Teams,yearID == 2015, select = c(teamID,X2B,X3B,ERA,RA))
View(team)
rownames(team) <- team[,1] #숫자로되어있던 인덱스 값들을 1열의 팀이름으로 바꿔줌
team[,1] <- NULL # 그리고 팀1열의 값들은 NULL 처리
team_st <- scale(team)#표준화

install.packages("factoextra")
library(factoextra)

fviz_nbclust(team_st,kmeans,method = "gap_stat") #군집할 개수를 구함

1개일때와 3개일때가 가장 높지만 자세히보면 3개가 더높고 k가 1이면 좀 이상하다..

그래서 3개로 결정

residual <- kmeans(team_st,3,nstart = 25)
residual

K-means clustering with 3 clusters of sizes 10, 11, 9

Cluster means:
         X2B        X3B        ERA         RA
1 -1.0794637 -0.6697055  0.2349028  0.2339084
2  0.7180795 -0.1765587 -0.9829213 -1.0029988
3  0.3217514  0.9599113  0.9403452  0.9659892

Clustering vector:
ARI ATL BAL BOS CHA CHN CIN CLE COL DET HOU KCA LAA LAN MIA MIL MIN NYA NYN OAK PHI PIT SDN SEA SFN SLN 
  3   1   1   3   1   2   1   2   3   3   2   2   1   2   1   3   3   1   2   3   3   2   1   1   2   2 
TBA TEX TOR WAS 
  2   3   2   1 

Within cluster sum of squares by cluster:
[1] 13.69561 18.27653 13.50195
 (between_SS / total_SS =  60.8 %)

 

3개의 그룹을 만들고 10,11,9 개팀이 각 그룹에 속해있다.

Cluster means 는 각 그룹의 항목별 평균이 나오고

Clustering vector 은 팀이 소속된 그룹에 대한 정보이다.

within cluster sum of squares by cluster 은

각 그룹별 관측점들의 분산 정도를 제시한다.

between_ss(군집간분산)/total_ss(전체분산) 이 클수록 군집모델 적합성이 높으며 적합성은 60.8%이다.

fviz_cluster(residual,data = team_st)

fviz_cluster()은 그룹의 중심으로 부터 각 팀들이 벗어나 있는 정도를 2개의 차원을 기반으로 

군집을 그리기 떄문에 , 상관성이 높은 변수를 통합해서 차원을 축소하는 주요인분석기능을 보유하고있다.

문제는 각 차원이 어떤 관측변수로 구성됐는지 모르기 때문에 실제 Dim1 , Dim2가 의미하는 바를 이해할수없다.

 

library(FactoMineR)
pca.res <- PCA(team_st, graph = FALSE)
par(mfrow=c(2,2))
fviz_contrib(pca.res,choice = "var",axes = 1,top = 4)
fviz_contrib(pca.res,choice = "var",axes = 2,top = 4)

방어율(ERA)와 실점(RA) 변수가 주 요인으로 적용 됐다. 

투수의 방어율이 높은 것과 실점과의 상관관계는 매우 높기 때문에 , 두변수가 하나의 차원으로 묶이는것은 

적합해 보이며 '실점 방어 차원' 정도로 지정하면 좋겠다.

 

두번째 차원은 2루타와 3루타가 주요인이며 사실상 2루타와 3루타는 상관성이 매우 높기때문에 

하나의 차원으로 묶이는건 당연하다. '장타력 차원'으로 이름지으면 되겠다.

 

그리고 다시 이그림을 본다면 3번 그룹은 장타력,방어율이 다 좋은팀들이므로 성적이 상위권일것이다.