2018년 2학기, 텍스트마이닝 과목을 들으면서
기말고사 대체 프로젝트(자유주제)가 있길래 어떤 데이터를 가지고 할 지 고민을 해봤습니다.
좋아하는 쪽으로 분석해야 잘 된다는 누군가의 조언을 따라 게임데이터를 크롤링해서 분석하기로 했습니다.
(여담이지만 SSAFY 면접때도 게임이야기를 해서 합격한걸 보면 게임이랑 인연이 있는 것 같기도 합니다.)
참고자료 : 텍스트마이닝.pdf
분석 과제
목적 : (한때는 흥했다가)망한 게임과 장수하는 게임의 차이점을 파악하라!
-
광고 대행업체를 통해 게임 개발비용을 충당하는 인디게임들을 분석하는 것 보다도,
많은 돈을 들여서 광고를 하였음에도 결국엔 망한 게임을 분석하는 것이 더 의미가 있을 것이라 판단해서 흥했던 게임들만 타겟으로 잡았습니다.
재료 : 구글 플레이 스토어 모바일게임 리뷰 데이터
1. 리뷰 데이터 수집
-
게임 순위 수집
망한 게임과 흥한 게임을 판별해야 하므로 게임 순위를 수집하는것이 매우 중요한데요
마침 모바일인덱스 라는 사이트에서 수집할 수 있었습니다.
다만, 2018년도에 생성된 게임들은 장수하고 있는지 아닌지 판별할 만한 충분한 기간이 확보되지 않았기 때문에 제외시켰습니다.
-
게임 데이터 수집
사실, 구글 플레이스토어 영어데이터는 이 사이트 에서 쉽게 csv파일로 수집가능하다고 하는데..
그런데, 유료이기도 하고 한국어 데이터 분석이 목적이었기 때문에( 영어는 봐도 몰라요 ㅠㅠ ) 결국 플레이스토어 사이트를 들어가서 직접 긁어오는 수 밖에 없었습니다.
좀 힘들었던 점은 플레이스토어 사이트가 모바일버전이 있는 것도 아니고, 굉장히 수집하기 까다로웠기 때문에 결국 Selenium이라는 라이브러리를 사용해야 했습니다.
Selenium은 웹 브라우저를 직접 조종하기 때문에 requests 라이브러리로 표현할 수 없는 자바스크립트 기반의 장치들도 전부 커버할 수 있으며, 키보드 입력도 표현할 수 있어 거의 만능에 가깝습니다. (단점은 많이 느립니다..)
5시간 동안 총 180개 게임, 70만개 리뷰 가량의 데이터를 수집했습니다.
2. 데이터 전처리
데이터를 보자마자 숨이 턱 막혔습니다.
욕은 기본이요, 띄어쓰기 안하는 것은 상식, 이모티콘 난사하는경우도 많았고
이상한 광고링크도 있어서 처리해야할 것이 너무 많았습니다.
-
스팸 리뷰 제거
-
빈도가 적은 이모티콘 제거
-
반복되는 문자 제거
-
soyspacing 라이브러리를 이용해서 띄어쓰기 교정
(비지도학습 기반의 모델로서, 데이터에 맞춘 띄어쓰기 모델이 학습됩니다.)
-
이모티콘 띄우기, 숫자 통일하기 등등…
3. 데이터 분석
-
일단 레이블을 만들어야합니다.
모바일인덱스 사이트를 통해서 얻은 순위는 “최고순위”와 “현재순위”가 있는데
한 번 망하면 다시 복구하기 힘든 모바일게임 시장의 특성에 미루어 보면, 현재순위가 낮다면 망한 게임으로 판단해도 큰 무리가 없을 것이라고 생각했습니다.
=> 흥한 게임 19개, 망한 게임 77개
180개 게임을 전부 사용하지 않은 이유는, 애초에 흥했던 적이 없던 게임들이 많았기 때문입니다.
(최고순위 30위 미만)
-
레이블을 만들고 나서는, 빈도분석을 해보았습니다.
망한 게임의 단어 빈도순위와 흥한 게임의 단어 빈도순위가 어떠한 차이가 있는지를 비교해보았습니다.
결론적으로 망한 게임들은 흥한 게임들에 비해서,
돈 관련 키워드(현질,돈,과금,카드,광고)의 순위가 낮았으며,
게임 오류 관련 키워드(안되다,렉,오류,버그)의 순위는 비슷했고,
해결, 보상 관련 키워드(업데이트,이벤트,고치다,보상,해결,수정)의 순위도 더 낮았습니다.
=> 즉, 돈을 밝히지 않으며 해결도 잘 안해준다는 것 같은데.. 얼추 맞는 것 같아보입니다.
4. 예측 모델 구성
결국, 이 게임이 흥했는지 망했는지 예측(binary classification)하기 위해서는 게임 하나를 인스턴스로 구성해야 하는데,
이것이 쉽지가 않았습니다. 왜냐하면 게임의 수는 너무나도 적고, 그 게임에 달린 리뷰들은 너무 많았기 때문이죠.
그렇지만 모든 리뷰들을 합친 것을 하나의 인스턴스로 구성하는 것은 매우 좋지 않은 판단입니다.
왜냐하면, 평점 1점 리뷰에서 “잘한다”와, 평점 5점 리뷰에서 “잘한다”는 매우 다른 뜻일 가능성이 높기 때문이죠. (아마도 반어법)
따라서, 평점을 기준으로 데이터를 클러스터링하고, 그럼에도 불구하고 데이터의 숫자가 너무 부족해서 샘플링 기법을 통해서 학습 데이터를 억지로 충당했습니다.
그렇게 만든 데이터들을 Word2Vec weighted TF-IDF를 통해서 벡터로 만들고, Deep neural network의 input으로 투입해서 학습을 한 결과..
처참한 결과가 나왔습니다.
망한 게임으로 전부 투표하는 것과 비슷한 정확도가 나왔기 때문이죠..
결국 방향을 선회해서, 예측보다는 해석에 집중하기로 했습니다.
근거없는 샘플링을 하지 않으며, 해석에 집중하기 위해 평점 기준으로 클러스터링도 하지 않았습니다.
대신에 모든 단어가 아니라, 특정 게임 도메인에서만 사용되는 명사 단어(40개 정도)들만 가져왔기 때문에 이는 평점에 따라서 의미의 영향을 크게 갖지 않을 것이라 판단했습니다.
그리고, 해석을 가장 하기 좋은 모델인 의사결정 나무를 통해서 학습시켰습니다.
(사실 과적합을 막기 위해서 적절한 max depth, max feature를 bayesian optimize해야 한다고 들었지만, 베이지안 통계에 대해서 아는것이 없어서 대략적으로 정했습니다.)
나무의 결과에 따르면,
스토리와 로딩문제가 가장 큰 요인이라고 판단했습니다.
앞선 빈도분석과는 사뭇 다른 결과여서 약간 의외였는데요. 분석 과제를 하고 나니 공부를 좀 많이 해야겠다는 생각이 들어서 나름 뜻깊었던 것 같습니다.