Churn Analysis

신포도….

저건 신포도야….

그렇게 생각하기 위해서 포스팅을 쓴다.

 

근 몇일동안 crowdanalytix.com의 Churn 분석을 수행해 봤다. 일반적인 데이터마이닝 과정의 정석을 따라가다보니 0.03374의 에러율을 가지는 모델을 만들었고, 대략 10위 정도에 머물러 있는 것을 확인했다.

 

image

 

간단하게 분석 과정을 요약하면, 다중공선성을 띌 수 있는 변수들을 제거하고, decision tree류의 알고리즘으로 모델링을 해보고 올린 모델이 0.05정도의 에러율을 보였으며, 이후 randomForest 알고리즘으로 약 0.02정도의 에러율을 줄였다.

아참… 모델링 테크닉중에서 imbalanced 학습셋에 대한 보정을 해주는 것도 하나의 팁이 될 것이다(물론 보정 방법은 여러가지다). 아마도 0.05정도까지 가지 못한 사람들 대부분은 이부분을 간과해서 그럴것이다.

PCA로 더 이상 변수를 줄여보려 했지만 분석결과를 보니 큰 의미 없어보였으며, gbm, adaboost류의 알고리즘으로 성능향상을 꾀하였으나 효과가 없었다.

그래서 내 테스트셋에서 어떤 데이터를 분류하지 못하고 있는지 모델에서 나온 확률값과 정답을 출력해 봤는데, 대략 좌절이다.

1이 churn한 고객을 의미하고, 0이 그 반대 고객인데 7번째 고객은 churn할 확률이 0.9가 넘음에도 불구하고 정답은 머무른 고객이 되고 말았다. 사실 이런 패턴을 가진 셋이 상당히 많아서 이들에 대한 적중 모델을 만들 수 있다고 하더라도 이전에 잘 분류했던 것들을 보존할 수 있을지 사실 자신이 안선다.

일단 randomForest 알고리즘은 알고리즘 특성상 모델 튜닝을 아무리 하더라도 아래 데이터를 성공적으로 분류하기는 힘드니 색다른 접근 방법이 필요하다. 

R > error_rec
     [,1]    [,2]
15   "0.676" "0" 
109  "0.47"  "1" 
169  "0.5"   "1" 
254  "0.108" "1" 
449  "0.02"  "1" 
547  "0.156" "1" 
649  "0.932" "0" 
726  "0.032" "1" 
905  "0.012" "1" 
1088 "0.68"  "0" 
1121 "0.5"   "1" 
1179 "0.002" "1" 
1189 "0.026" "1" 
1256 "0.002" "1" 
1272 "0.008" "1" 
1312 "0.28"  "1" 
1506 "0.524" "1" 
1570 "0.038" "1" 
1693 "0.902" "0" 
1707 "0.586" "0" 
2005 "0.214" "1" 
2044 "0.028" "1" 
2077 "0.044" "1" 
2241 "0.45"  "1" 
2522 "0.734" "0" 
2875 "0.136" "1" 
3020 "0.006" "1" 
3340 "0.136" "1" 
3386 "0.028" "1" 
3418 "0.278" "1" 
3477 "0.08"  "1" 
3495 "0.93"  "0" 
3876 "0.59"  "0"

 

머리속에 한가지 아이디어가 떠오르는데, 이 방법이 성능을 향상시킬 수 있는 방법일 수도 있긴 하지만 모델이 overfitting으로 가는 듯한 느낌을 지울 수가 없구나…

이 방법은 흡사 canibalization 느낌이 든단 말이지..

일단 신포도 논의는 나중에 하고 시도나 좀 해봐야 겠다.

CC BY-NC 4.0 Churn Analysis by from __future__ import dream is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.