본문 바로가기
프로젝트

파이널 프로젝트 군집분석 수행기!

by 포 키 2023. 11. 13.
728x90

오늘은 군집분석을 수행했다.

1차 멘토링때 군집분석이나 요인분석을 활용해보라고 하셨어서 예측 이후에 예측값을 토대로 하려했었다.

2차 멘토링때는 다른 멘토분께서 고령층을 선정한 이유가 탄탄하지 못하다고 하셔서 군집분석으로 해보기로 했다.

그래서 오늘은 예측에도 활용할 수 있는지를 확인하기 위해 전체 컬럼에 대한 군집분석,

고령층이 타겟층이 된 이유를 보강하기 위한 나이대 컬럼에 대한 군집분석을 진행했다.

 

전체 컬럼에 대한 군집분석

전체적으로 군집분석을 먼저 진행해봤다.

진짜 다사다난하게 오래걸릴 이유가 없는 부분인데 힘들게 돌아갔다. ㅋㅋㅋㅋ

먼저 범주형 데이터는 원핫 인코딩이 된 상태여서 문제가 없었고, 수치형 변수들만 표준형 스케일링을 진행했다.

보통 군집분석을 시행할 때, 표준형이나 정규형으로 스케일링을 진행한다길래 표준형으로 스케일링을 해봤다.

중복된 컬럼과, 제로값의 비중이 커서 다른 값들이 이상치로 여겨질 가능성이 큰 컬럼을 제외했다.

전체 컬럼에 대해서는 군집의 갯수를 여러개 변경해봐도 확 와닿게 군집이 잘 형성되는 것을 확인하지 못했다.

군집수를 변경하고 평가하고를 반복했지만, Calinski-Harabasz 점수가 1000점 조금 넘기는 수치로만 나왔다.

실루엣 점수에 대한 평가도 진행해보고 일반적인 기준을 찾아봤을 때 0.5 이상이면 군집이 잘됐다고 하는데,

군집수를 어떻게 해도 0.20을 넘기지 못해 군집 자체가 형성은 됐지만, 최적화된 군집이라고는 할 수 없었다.

그래서 전체적으로 추이를 보는 용도로만 사용해야겠구나 싶어 나이대에 대한 군집분석을 새로 시행해봤다.

 

결론

평가한 결과를 작성하겠다.

from sklearn.metrics import calinski_harabasz_score, silhouette_score

calinski_harabasz = calinski_harabasz_score(df.drop('Churn', axis=1), df['Cluster'])
print("Calinski-Harabasz 점수:", calinski_harabasz)

silhouette_avg = silhouette_score(df.drop('Churn', axis=1), df['Cluster'])
print("실루엣 점수:", silhouette_avg)
Calinski-Harabasz 점수: 1154.954837622202
실루엣 점수: 0.148981196709718

 

군집수는 그나마 Calinski-Harabasz 점수가 높으면서 시각화로 너무 난발되어 있지 않은 것으로 선택했다.

matplotlib 으로 나눔고딕 폰트만 입히면 꼭 마이너스 부분을 인식하지 못하는 에러가 생기는 것 같다.(이 부분은 프로젝트가 끝난 후에 따로 찾아보고 포스팅을 작성해보겠다.)군집분석을 시각화하기 위해 주성분분석을 활용했다.

 

 

전체 컬럼에 대한 군집분석은 결과적으로 성공적으로 하진 못하고, 큰 군집 형성은 얼추 볼 수 있는 수준이었다.

 

나이대 컬럼에 대한 군집분석

전체 컬럼에 대한 군집 분석에서는 우리에게 가장 필요했던 나이대 컬럼이 특출나게 보여주지 못했다.

그래서 이탈 여부와 이탈 점수(파생변수 X, 로우 데이터)와 더미변수로 나눈 각 나이대에 대한 이진변수를 추출해봤다.

나이대와 이탈 여부만 하려다가 이탈 점수도 함께 해보면 설득력이 높아질 듯 해서 함께 선택했다.

나이대와 이탈과의 관계성을 알아보기에 딱 적절했던 것 같다.

일단 컬럼수도 원하는 것만 추출되어있어 한정적이라 그런지 평가 결과가 좋게 나왔다.

from sklearn.metrics import calinski_harabasz_score, silhouette_score

calinski_harabasz = calinski_harabasz_score(df_selected.drop('Churn', axis=1), df_selected['Cluster'])
print("Calinski-Harabasz 점수:", calinski_harabasz)

silhouette_avg = silhouette_score(df_selected.drop('Churn', axis=1), df_selected['Cluster'])
print("실루엣 점수:", silhouette_avg)
Calinski-Harabasz 점수: 53130.53105953316
실루엣 점수: 0.6088407756853492

 

앞의 전체 컬럼과의 군집분석을 진행했을 때와는 점수가 확연히 차이나는 것을 볼 수 있다.

군집 분석에 대한 결과도 우리가 원데이터를 EDA에 활용할 때, 얻은 결과를 그대로 보여주었다.

고령층을 타겟으로 삼은 이유가, 팀장님께서 진행하셨던 EDA에 고령층의 이탈율이 높다고 해서였는데,

타겟팅에 대한 구체적인 지표를 제시할 수 있는 정도가 아니었어서 문제였다.

이제는 구체적인 분석 결과를 보여주면서 타겟층 선택에 대한 증명을 할 수 있게 되어 다행이었다.

 

결론

결과를 나타내자면, 다음과 같이 해석이 가능했다.

=> 최종적으로 Over65 만 두고 생각했을 때, 모든 군집에 골고루 분포되어 있음.
특히 Cluster 3, 8에는 기본 평균 비율에 비해 높은 비율로 분포되어있음.
Cluster 3, 8은 모두 이탈한 그룹을 나타내며, 65세 이상 그룹이 이탈율이 높음을 알 수 있음.

 

이 군집분석으로 주제 선정 배경에 대한 뒷받침으로 신뢰성을 줄 수 있게 되었다.

728x90