다시 이음

시계열 로그 데이터를 분석하여 이탈자 예측하기 프로젝트 본문

프로젝트

시계열 로그 데이터를 분석하여 이탈자 예측하기 프로젝트

Taeho(Damon) 2022. 2. 4. 11:56

 

안녕하세요.

 

오늘은 제가 3주간 진행한 프로젝트에 대한 리뷰 시간을 가져보려고 합니다.

 

총평으로는 

이렇게 긴 기간동안 프로젝트를 진행한 적이 없었고, 팀원과 같이 커뮤니케이션하면서 진행하는 기업협업 프로젝트였기에 실무에서 사용하는 데이터를 사용할 수 있었고 팀원간의 커뮤니케이션과 의견 합일에 대해서도 많이 생각하게되었습니다.  이러한 전체적인 과정은 긴장되면서도 많은 것을 배우고 생각하게 된 프로젝트였습니다.

 

이 리뷰를 작성하면서 기업과 맺은 계약 때문에 하나하나의 설명보다는 어떤 기술을 사용했고 어떤 방식으로 진행했는지만을 상세히 다뤄보려고 합니다.

 

BASE

이 프로젝트를 하기 앞서 저희가 제공받았던 데이터는 반정형 데이터의 형태인 로그 데이터였습니다.

이 로그데이터를 분석하고 여러가지 게임 이용자에 적용할 수 있는 임베딩을 만들어 이탈자 예측을 해내는 것이 프로젝트의 목표였습니다.

 

프로젝트에 대한 설명이 그렇게 자세하거나 하진 않았고 기본적인 길라잡이 정도의 프리젠테이션 이후 거의 0부터 시작하는 수준이었습니다.

 

방향 잡기

 

저희가 프로젝트를 시작할 때 데이터(재료), 진행 방법(학습)에 대하여 분담해서 정보를 모았습니다.

 

저는 시계열 데이터에 대한 교재를 통해 추세, 계절성, 주기, 시각화방법, 분석 방법 에 집중하여 데이터를 어떻게 바라보고 어떻게 분석하여 어떠한 기준으로 이탈자를 구분할지와 같은 데이터 중심의 분석을 위주로 정보를 모았습니다.

 

팀원의 경우에는 그 이후에 이루어질 임베딩 방식와 딥러닝 방식에 대해서 정보를 수집하여 매일매일 서로가 공부한 내용을 공유하고 설명하는 시간을 가졌습니다.

 

사실 이 시간이 많이 길어지면 안됐지만 샘플데이터만 주어졌을 뿐 시계열을 확인 할 수 있는 데이터는 2주 마지막쯤에 전달이 되었기 때문에 어쩔 수 없이 정보수집 기간이 길어지게 됩니다.

 

 

어느정도 정보를  수집했다고 생각한 저희는 데이터에 대한 예측을 통해 필요한 기술과 진행 방향을 논의합니다.

 

 

프로젝트 진행

 

1) EDA, 데이터 전처리

 

저희가 받은 로그 데이터는 로그 기록 시간, 유저 id, 게임 id 등 기본적인 내용만 가지고 있었으며, 저희는 EDA를 통해 이상치를 제거하고 유의미하지 않다고 생각되는 데이터에 대해서 전처리를 진행하였습니다.

 

로그 데이터를 분석하였을 때, 저희 목표인 이탈예측에 크게 영향을 미치지 않을 것이라고 가정한 부분은 아래와 같습니다.

 

1. 총 15일 기간의 데이터를 분석함에 있어서 분,초 단위의 데이터는 통합하여 관리하여도 충분하다고 가정

2. 로그 데이터에 입력된 접속 기록은 총 15가지의 범위형 데이터로 분류할 수 있었고 그에 따른 요약이 가능하다.

3. 시간 데이터와 범위형 데이터을 그룹화 하여 시간 내에 발생한 데이터를 범위형 데이터 별로 count함으로써 데이터 요약에 따른 데이터 소실을 최소화 할 수 있다.

 

모든 요소를 살려내어 진행하기에는 100GB이상의 데이터의 크기가 한정된 컴퓨터 자원에서 사용하기 어려웠기 때문에 최대한의 효율성을 가지기 위하여 데이터를 요약하는 방식을 채택하였습니다.

 

 

2) Feature Engineering

 

저희는 특성공학을 통하여 최종적으로 15개의 특성을 활용하게 되었습니다.

 

추가 특성으로는 날짜 데이터를 통해 유저별로 총 15일 기간내에 발생한 총 접속일 수, 날짜별 접속  주기, 평균 접속 주기 등을 생성하였고 그중 클러스터링에 대한 부분에 집중했습니다.

 

 

클러스터링

 

저희는 로그데이터를 통해 유저별 혹은 게임별로 행동패턴을 파악할 수 있다고 가정하였고, 그에 따라 비지도학습인 클러스터링을 활용하여 유의미하게 다른 패턴을 보이는 경우 이탈자 예측에 큰 도움이 될 수 있다고 생각하였습니다.

 

1. 실험한 데이터의 분류 : StandarScaler(표준화) 진행 유무, PCA(차원축소) 진행 유무, 날짜 데이터 사용유무

 

2. 실험한 클러스터링 방법 : K-means 클러스터링, DBSCAN 클러스터링, DTW 클러스터링

 

3. 결론 

 

 데이터 : 표준화, PCA를 사용하여 전처리하고 날짜 데이터를 제외했을 때 가장 유의미한 클러스터링이 진행

 K-means 클러스터링 : 사용자가 클러스터링의 개수를 지정할 수 있으나 정확도가 떨어지는 단점

 DBSCAN : 패턴을 잘 파악하나 표준화된 데이터를 사용할 수 가 없음

 DTW(Dynamic time wrapping) : 시계열 데이터에 대해 길이가 다른 데이터도 사용 가능

 

 

클러스터링 실험 경과 보고

 

1. 게임별 클러스터링

 

진행 방법

 

 (1) 특정 기간(3일) 마다 그룹화 하여 게임 별로 카테고리 별 행동 수를 총합하여 데이터프레임을 생성

 (2) StandarScaler를 통해 표준화를 진행하고 PCA를 통해 차원축소하여 데이터를 전처리

 (3) 나누어진 기간 별로 K-means 클러스터링(3)을 진행

 (4) 생성된 기간의 클러스터링을 시간 순서에 따라 다시 클러스터링을 통해 패턴 추출

 

결과 - 최종적으로 사용 불가 판정

 

 (1)  로그 데이터가 각 게임 별로 특성을 추출할 만큼 다양한 분포를 보이고 있지 않다.

 (2) 기간 별로 클러스터링 실행한 데이터를 확인 하였을 때 다수의 결측치가 포함

 (3) 0 = 접속 수가 적은 게임 , 1~2 : 접속 수가 많은 게임 으로 귀결

 (4) 0과 1~2로 클러스터링 된 게임을 살펴 보았을 때, 0으로 클러스터링 된 게임이 1~2로, 1~2로 클러스터링 된 게임이 0으로 변환된 경우가 없기 때문에 시간 순서로 클러스터링하는 방법이 부적합하다고 판단

 

2. 유저별 클러스터링

 

진행 방법

 

 (1) 특정 기간(3일) 마다 그룹화 하여 유저 별로 카테고리 별 행동 수를 총합하여 데이터프레임을 생성

 (2) 표준화 없이 PCA를 통해 차원축소하여 데이터를 전처리

 (3) 나누어진 기간 별로 DBSCAN 클러스터링을 진행 ( 원하는 클러스터링 개수를 지정할 수 없다.)

 (4) 생성된 기간의 클러스터링을 시간 순서에 따라 DTW 클러스터링을 통해 패턴 추출

 

결과 - 가장 클러스터링 분류가 명확한 방법을 사용

 

 (1)  날짜 데이터를 사용할 시 클러스터링이 제대로 작동하지 않음을 확인 - 제외하여 진행

 (2) 날짜 데이터 대신 총 로그 누적일(15일)에서 특정기간(3일)으로 그룹화하여 총 5번의 클러스터링(DBSCAN)을 진행 - 보완

 (3) 5개의 클러스터링 정보를 다시 클러스터링(DTW) 함으로써 유의미한 구분을 가진 클러스터링 완성

유저별 클러스터링 결과

 

2) Labeling

 

 

기존에 가이드라인으로 주어졌던 기준일에 따른 라벨링 방식은 해당 데이터에 적합하지 않다고 판단하였습니다.

 

그 이유로는 아래와 같습니다.

 

1. 총 15일 밖에 되지 않는 데이터에서 제대로 된 이탈자 파악이 어렵기 때문에 기준일 설정에 대한 근거가 부족하다고 생각

2. 프로젝트의 목표가 여러 게임에 적용할 수 있는 모델을 만드는 것이기 때문에 1게임에 대해 적용할 수 있는 확실한 기준일 근거는 준비할 수 있으나 여러 게임에 대한 기준일 근거는 준비할 수 없다고 생각

 

그에 따라 저희는 유연하게 적용이 가능한 방법을 찾았고 그 방법이 바로 Risk ratio(위탈 위험비율)을 계산하여 적용하는 것입니다.

 

 

이탈 위험 비율이란?

 

[최근 접속 경과일] / [평균 접속 주기] : 유저별로 평균 접속 주기를 구하여 유저별 패턴을 확인하고 ,마지막으로 주어진 날짜로부터 그 이전 날짜의 로그데이터가 언제 기록되었는지를 확인한 최근 접속 경과일을 평균 접속 주기로 나누어 구한 비율입니다.

 

 

이탈 위험 비율을 왜 사용하였나?

 

이 방법은 유저별로 유연하게 적용될 수 있고 그에 따라 게임에 따른 구분을 따르지 않아 전범위로 사용가능하다고 생각했습니다.

 

그 뿐만아니라 데이터의 기록일자가 15일 밖에 안되기 때문에 생겼던 단점, 이탈자에 대한 명확한 구분이 어렵다. 라는 부분을 데이터의 기간이 늘어나면 자동적으로 갱신할 수 있는 아이디어라고 생각했습니다.

 

또한 저희는 이 이탈 위험 비율이라는 개념에 충성도라는 개념을 접목하였습니다.

 

 

충성도란?

 

평균 접속 주기가 짧을 수록 1일만 접속을 하지 않아도 이탈자로 구분될 수 있는 경우가 있습니다.

 

예를 들어 매일 접속하는 유저(평균 접속주기가 1)가 마지막날에 2일 접속을 하지 않았다면 비율이라는 개념의 함정과 같이 이탈 위험 비율이 너무 커지게 됩니다. 이 값은 3일에 한 번 접속하는 유저가 1주일을 접속하지 않은 것과 같은 값을 가집니다.

 

이러한 부분에 대해 저희는 충성도라는 어드벤티지 개념을 만들어내어 이탈자로 분류되는 것을 방지할 수 있도록 하였습니다.

 

 

충성도 적용 방식

 

그리하여 저희는 평균 접속 주기가 1~2 사이의 유저들에게 충성도를 적용하기로 하였습니다.

 

1. 평균 접속 주기가 1인 집단

 

해당 집단에게는 전체적으로 일괄 적용되는 충성도를 만들었습니다.

 

나뉘어지는 평균 접속 주기 값을 1*1.98로 계산하여 적용시켰습니다.

 

여기서 1.98은 로그 데이터 특성상 12월 10일 01시에 접속을 하고 12월 11일 23시에 접속을 하여도 평균 접속 주기가 1로 매핑된다는 점을 고려하여 최대 허용 시간을 계산 "2일-(1/48시간)"으로 계산하여 1.98이라는 수를 만들었습니다. 

 

2. 평균 접속 주기가 1.5인 집단

 

해당 집단에 대해서는 집단 속 최근 접속 경과일의 평균을 구하여 평균보다 작은 값을 가지고 있는 유저들에게 꾸준히 접속 주기가 작을 것이라는 패턴을 가정하여 충성도를 부여했습니다. ( 기준일로 하여금 최근 접속 경과일이 늘어나면 점점 접속 주기가 뜸해지고 이탈자로 구분될 확률이 크다고 생각 )

 

3. 접속로그가 한번 뿐인 집단

 

접속로그가 한번 뿐인 집단이 있습니다. 

 

이 집단에 대해서 모두 이탈자로 분류해야하는가 에 대해서 많은 생각과 논의가 오갔고 그중 채택된 방법은 이탈자로 분류되지 않을 유저(이탈 위험 비율이 1보다 작은 유저) 들의 최근 접속 경과일의 평균값(0.57), 중앙값(3.5), 최대값(7) 중 중앙값을 적용하여 반올림한 4보다 최근 접속 경과일이 큰 경우는 이탈자로 구분하였습니다.

 

 

3) Embedding

 

저희가 만든 데이터는 정형 데이터로 임베딩을 할 경우, 인코딩 과정을 거치는 경우 빼고는 임베딩을 형성할 수 없었습니다.

( 임베딩이 없어도 될 경우는 일반적인 ML이나 DL(Tabnet 모델)을 사용하려고 생각했습니다. )

 

그러한 방식이 프로젝트의 General Embedding을 생성해야한다는 목표와 맞지 않았기 때문에 저희는 데이터를 비정형 데이터로 변환하여 임베딩하는 방식을 고안하였습니다.

 

예시 ) game_id490 login_total4 login_mean1.98 cluster1 wednesday chart4 coupon2 gameinfo79 gamer22 post4 rank6 thursday chart6 coupon3 gameinfo142 gamer33 post6 rank9 friday chart2 coupon1 gameinfo53 gamer11 post2

 

비정형 데이터는 정형데이터로 만들어진 데이터를 단순 나열하는 방식을 사용했습니다.

 

비정형 데이터는 크게 

(1) 일부 범주형 데이터를 비정형 데이터로 변환한 비정형 데이터 A

(2) 전체 데이터를 비정형 데이터로 변환한 비정형 데이터 B

로 나누었습니다.

 

비정형 데이터로 변환된 데이터를 저희는 Word2vec과 오토인코더를 사용하여 임베딩을 하게 됩니다.

 

해당 방식을 사용하여 64,128,256 차원을 각각 생성하였습니다.

 

 

 

4) ML/DL 학습

 

저희가 학습한 모델은 CNN 모델과 XGBoost 모델입니다.

 

실험한 내용에 따라 아래와 같이 나뉩니다.

 

(1) Word2Vec + CNN : 비정형데이터 A

(2) Word2Vec + CNN : 비정형데이터 B

(3) [Word2Vec + CNN] + XGBoost : 비정형데이터 A + 정형데이터 ( 가장 높은 점수를 기록 )

(4) AutoEncoder + CNN  : 비정형데이터 B

 

 

한계와 아쉬운 점

 

1) DL,ML 모델은 단순한 모델을 사용하였으며, 하이퍼 파라미터 조정은 실행하지 못하였다는 아쉬운 점이 있습니다.

2) 오토인코더 + CNN 적용 모델은 임베딩 과정에서 비정형 데이터의 짧은 길이와 문장형식이 아닌 데이터 특성 때문에 차원축소 과정에서 문제가 있을 것으로 추정되어 아쉬운 결과를 기록하였습니다.

3) 프로젝트를 하면서 많은 논문에 나온 모델을 탐구하였음에도 적용하지 못한 아쉬움이 있습니다.

4) 좋은 결과를 내는 모델을 만들었지만 전처리 과정과 특성 공학의 복잡함이 General Embedding을 만들자는 목표에서는 벗어난 것 같아 한계가 있습니다.

 

기대하는 점

 

1) 기존 논문이나 컨퍼런스 등에서 주로 발표된 기준일 기준 이탈자 구분 방식보다 유연한 대처가 가능한 라벨링 방식을 채택하여 변칙적인 데이터에 유용할 것으로 기대됩니다.

 

2) 클러스터링 방법을 통하여 시간에 따른 유저 활동 패턴을 유의미 하게 구분할 수 있었습니다.

 

3) 최대한 많은 유저를 잠재 이탈자로 간주하는 Recall 평가지표가 높은 점수를 가지고 있기 때문에 이탈자에 대한 빠른 대응이 가능할 것으로 기대됩니다.

 

 

 

긴 글 읽어주셔서 감사합니다.