(R,데이터분석) 로지스틱 회귀 분석

가설:

피처폰에서 스마트폰으로 이용자수가 변화함에 따라
ID이전 실패로 인해 모바일 게임을 탈퇴한 유저가 많다.

* 정답을 포함한 데이터 없이 모델 세우기

정답을 포함하지 않은 데이터에 대해 억지로 모델을 만들어서 제안한다는 건 학술적으로 완전히 용납되지 않습니다. 그러나 비즈니스에서는 매번 정답을 포함한 데이터를 손에 넣을 수 있다고 장담할 수 없습니다.
가설에서처럼 ID이전 실패로 인해 탈퇴한 유저수가 많은 경우를 생각해봅시다. 
따라서 탈퇴자 전체에 대한 'ID 이전 실패로 인한 탈퇴'의 비율이 높을 때는 탈퇴 유저와 이전 유저간에 1월의 이용횟수가 크게 다르지 않을 것입니다.
1월의 이용횟수가 크게 다르지 않다는 건 이용횟수를 가지고는 모델을 만들 수 없다는 뜻입니다. 
반대로 말하면 'ID 이전 실패로 인한 탈퇴'가 적다면 이용횟수의 차이가 분명히 드러날 것이기 때문에 모델을 만들 수 있다는 뜻이 됩니다.
따라서 모델이 만들어진다면 ID이전 실패로 인한 탈퇴자수가 그리 많지 않으므로 기존 ID이전 기능의 복잡함이 크게 문제되지 않는 다는 해석이 가능해집니다.


*어떤 모델을 사용할 것인가?

이번 사례는 'ID 이전 유저'와 '탈퇴 유저'의 판별 모델을 구축할 필요가 있다.
판별 모델에는 여러가지가 있는데, 이번에는 가지고 있는 데이터에 정답이 포함되어 있지 않기 때문에 SVM(서포트 벡터 머신)이나 뉴럴 네트워크 등과 같이 정확도는 높지만 계산이 오래 걸리는 모델을 굳이 쓸 필요는 없습니다.
그래서 단순한 방법으로 재빨리 결과를 뽑기 좋은 '로지스틱 회귀 분석'을 사용합니다.



로지스틱 회귀분석이란? 예를들어, 목적변수가 '구매하기/구매하지 않기'와 같이 두 가지가 값을 가질 때 사용하는 회귀모델로서, 신속하게 데이터의 경향을 파악하기에 적합합니다.



로지스틱 회귀분석을 설명하기 위해 'ID 이전유저'를 1, '탈퇴유저'를 0이라고 정한 데이터를 생각해봅시다. 
무엇보다 선형회귀분석은 0/1과 같은 두 가지 값을 가지는 데이터에는 적절하지 않습니다. 예측값이 0보다 작거나 1보다 커지기도 합니다. 이처럼 0/1과 같은 데이터에 대해서는 그 값 자체가 아니라, 1의 비율로 다루는 것이 적절합니다. 그리하여 앞의 데이터를 가지고 0의 횟수와 1의 횟수를 그래프로 그려 확인해보자.


그래프를 확인해보면, 이용횟수가 적을 떄는 1의 데이터가 거의 보이지 않고, 이용횟수가 많아질수록 1의 데이터가 커지며 최종적으로는 0의 데이터가 없어지는 모습을 볼 수 있습니다.이것을 비율로 표현하고, 이 비율데이터를 로지스틱 곡선이라 불리는 곡선을 끼워 맞추는 것이 바로 로지스틱 회귀 분석입니다.
로지스틱 곡선은 S자 모양의 곡선으로, 어떤 값까지는 거의0이며, 그 값을 넘어서면서부터 급격히 증가해서 1에 가까워지고, 1에 가까워질수록 서서히 증가하는 모습을 그리는 곡선입니다.


그림을 보면 선형회귀분석과 달리 0미만의 값이나 1이상의 값이 등장하지 않는 것을 볼 수 있습니다. 또한 이 곡선에 있어서 'ID이전 유저'의 비율이 절반(0.5)이 되는 이용횟수를 역치로 삼고, 그것보다 크면 'ID 이전유저', 작으면 '탈퇴 유저'로 판별할 수 있습니다.



1. 모델 구축과 모델 검증

1월의 날짜별 이용상황(이용했음/안했음)이라는 31일간의 데이터를 가지고 2월에 ID이전을 할 확률을 산출하는모델을 작석하겠다.
이와같은 예측모델을 작성할 때는 분석을 크게 '모델구축'과 '모델검증'의 2단계로 나누어 진행합니다. 먼저 데이터로부터 로지스틱 회귀분석을 통해 예측모델을 구축합니다.
그 예측모델이 어느정도 신뢰할 수 있는지 검증하기 위해 그 모델의 예측값과 실제 데이터를 비교합니다. 
이때 모델의 예측값은 '다음달에 ID를 이전할 확률'이 되므로 0.5이상을 '다음달 ID이전'으로, 그 미만을 '탈퇴로' 정하겠습니다.


2. 로지스틱 회귀분석으로 모델 작성

그러면 로지스틱 회귀분석으로 모델을 구축해보자. 이번 사례에서는 설명변수가 과거 1개월(31일)의 이용상황인데, 설명변수로서는 조금 많은 것 같습니다. 설명변수로는 조금 많은 것 같다. 보다 적절한 모델을 만들기 위해서는 뭔가를 기준으로 변수를 선택해야 한다.
변수를 선택하는 방법은 이미 여러가지가 알려져있는데, 일반적으로 사용하는 것은 AIC(아카이케 정보 척도)라는 지표이다. 
이 지표를 가지고 변수를 선택하여 모델을 구축하면 아래와 같은데 X1day(1/1), X4day(1/4), X5day(1/5)..라는 변수가 선택된 것을 볼 수 있다.



>fit.logit<-step(glm(is_sp~.,data=fp.dau1.cast[,-1],family=binomial))


1. 잔차 분포
2. 계수의 추정값에 대한 개요
3. 아카이케 정보척도


--->위 결과를 보면 X5day와 X10day의 계수가 음수임을 알 수 있다. 이를 있는 그대로 해석하면 '5일과 10일에 이용하지 않으면 다음달(2월)에 ID를 이전함' 이라는 알 수 없는 뜻이됩니다.
이것은 설명변수 간에 상관이 있을 때 발생하는 현상으로 다중공선성(multocollinearity)이라고 합니다. 다중공선성이 발생하면 위와 같이 계수에 논의 할 수 없게 됩니다.
또한 장기예측이 불가능한 불안정한 모델이 되어버리는 문제도 있습니다.
일반적으로는 여기에서 더 나아가 변수의 선택이나 상호작용 항을 추가해서 더 높은 재현성을 지닌 모델을 구축할 수 있습닏.

-->로지스틱 회귀분석을 할 때는 glm함수를 사용한다. 여기서 family옵션에 binomal을 입력했는데, 이 부분이 로지스틱 회귀분석을 실시하라고 지시하는 곳이다.

또한 여기서는 step함수를 사용했는데, step함수는 AIC라는 지표를 사용하여 모델에 사용할 설명변수를 늘릴지 혹은 줄일지 자동으로 계산해서 찾아주는 함수이다.


*작성된 모델을 이용해서 예측하기

로지스틱 회귀분석에 의해 작성된 모델을 가지고 ID이전을 해서 이용할 확률을 계산해봅시다. R언어에서는 fitted함수로 예측값을 얻을 수 있습니다.

#SP(스마트폰)이전 확률
fp.dau1.cast$prob<-round(fitted(fit.logit),2)

#SP(스마트폰)로 이전할지 예측
fp.dau1.cast$pred<-ifelse(fp.dau1.cast$prob>0.5,1,0)



여기서 마지막 항목 pred를 사용해서 모델의 신뢰도를 확인해보자. 예측과 실제의 차이를 확인하는 방법은 여러 가지가 있지만, 여기서는 간단히 table함수를 사용해서 집계해보겠다.

이번에 로지스틱 회귀분석을 통해 작성된 모델로 '1'(ID 이전할 것)이라고 예측된 유저는 'pred'가 1인 열입니다. 한편 실제로 ID를 이전한 유저는 is_sp가 1인 행입니다.


즉, 180명은 탈퇴할 거이라고 예측되었으며 실제로 그렇게 헀고,42명은 ID를 이전할 것이라 예측되었으며 실제로 그렇게 했다는 것입니다. 정답률을 계산하면 (180+42)/(180+10+20+42)=88%로 신뢰할 만한 모델을 구축했다고 생각해도 무방합니다.

*예측결과로부터 유저군 추측하기

이 모델에서 '1'(ID 이전할 것)이라고 예측되어 실제로 탈퇴한 유저가 10명인데, 이들의 지난달 이용 상황을 고려하면 분명 ID이전을 하는게 자연스럽습니다. 그러나 실제로는 탈퇴해버렸습니다.


댓글

이 블로그의 인기 게시물

(18장) WebSocekt과 STOMP를 사용하여 메시징하기

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬