메이플랜드 유튜브 채널을 운영하며 게임 데이터 분석
(1) 프로젝트 개요
메이플랜드라는 옛날 메이플스토리 재현 게임 관련 공략을 업로드하는
유튜브를 운영 중입니다. 개인으로서 게임 데이터를 직접 수집해볼 기회가 한정적이지만 게임을 플레이하며 데이터 수집 아이디어를 얻었습니다. 효율적인 파티 사냥을 위해 공식 디스코드채널에서 파티 모집을 합니다. 이 데이터에서 날짜, 시간은 물론 레벨, 직업, 스펙 (공격력), 맵 등의 정보를 수집할 수 있습니다. 비정형 데이터라는 문제가 있지만 정규표현식과 이상치 처리로 분석 가능한 양질의 데이터셋을 만드는 데 성공했습니다. 데이터셋과 코드는
깃허브에 공개했고 메이플랜드 유튜브 데이터분석 컨텐츠 재생목록에서도 확인 가능합니다.
- 목표: 디스코드 파티 구인글에서 맵, 직업, 레벨, 스펙 데이터를 추출하고, 이를 분석하여 구독자에게 유저 맞춤형 사냥터를 추천
- 문제 정의:
- 디스코드 파티 구인글을 바탕으로 맵, 직업, 레벨, 스펙을 추출하여 데이터 분석을 통해 맞춤형 사냥터 추천
- 과거 메이플스토리의 복원 버전으로, 5년간의 업데이트 내용을 1년 안에 압축하여 진행하면서 메타 변화가 빠름
- 유저들의 최적화에 따라 사냥 구성 문화가 각 주마다 변경되는 특징을 갖고 있음
- 분석 프로세스:
(2) 데이터 수집 및 전처리
- 데이터 수집 출처
- 메이플랜드 공식 디스코드 100레벨 이상 파티 모집 채널 웹버전에서 수집, 하루 평균 약 5000줄의 텍스트를 수집, 가공 후 하루 기준 약 400개의 데이터로 환산
- 수집한 데이터 원본은 링크에서 확인할 수 있음
김밍 — 오늘 오후 1:12
⭐️망가진 용의 둥지 / 알까기⭐️ - 1시 50분종료
⭐️ 답 없으면 구한 겁니다 죄송합니다 ⭐️
💰 좌2 지원비 150 / 좌1 지원비 150 💰
✅ 1젠 띱자리 / 105~130 랩 까지 추천 드립니다 / 경험치 350만+
✅ 도어캐릭 O / 좌2 원거리 낚시자리 포션사용 X
✅ 예약가능 / 좌1 궁수 실버호크 > 포션사용X
┏━━━━━━━━━━━━━━━┓ ┏━━━━━━━━━━━━━━━┓
110 경심프리 우3 161허밋 3100+
┗━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━┛
┏━━━━━━━━━━━━━━━┓ ┏━━━━━━━━━━━━━━━┓
좌2: 115허밋(지원비150지참) 우2 147썬콜
┗━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━┛
┏━━━━━━━━━━━━━━━┓ ┏━━━━━━━━━━━━━━━┓
좌1: 궁수구인중(지원비150지참) 우1: 165허밋 3200+
┗━━━━━━━━━━━━━━━┛ ┗━━━━━━━━━━━━━━━┛
- 정규 표현식을 활용하여 디스코드 메시지 데이터를 효율적으로 분류하고, 필요한 정보(맵, 직업, 레벨, 스펙)를 추출
- 디스코드 메시지 텍스트에 가장 먼저 아이디가 나오고 그 뒤에 공통적으로 “오늘” 이라는 텍스트가 등장합니다. “오늘”을 기준으로 split 해줘서 block이라는 단위로 저장, 각 계정이 보낸 메시지를 분류했습니다. 각 block에서 맵, 직업, 레벨, 스펙 데이터를 자연어 처리로 수집했습니다.
- 스펙, 레벨, 스펙, 맵은 범위와 자연어처리 패턴을 정해줬습니다.
- 직업을 기준으로 좌우를 탐색합니다.
- 데이터 수집 및 정제 완료한 데이터 프레임 결과
- 데이터 정제
- valid: 맵과 직업이 타당
- valid_spec: 스펙이 다른 데이터의 스펙과 레벨과 견주어 20% 범위 이내로 타당
- spec_by_level: 스펙 나누기 레벨 (스펙 없는 경우 avg_spec_by_level)
- avg_spec_by_level: 동직업 스펙 나누기 레벨의 평균
- spec_filled: avg_spec_by_level*level에 jitter 추가
- 이상치 탐지 및 제거
- 레벨을 기준으로 상위 0.01% 아웃라이어를 제거해주고, t-SNE를 이용하여 맵과 직업의 조합이 상위 0.01% 이상치로 탐지되면 아웃라이어로 취급하고 제거해줬습니다.
(3) 데이터 분석
- 특정 직업의 레벨별 사냥터 시각화
- 직업과 레벨에 적합한 사냥터를 한 눈에 파악 가능
- 직업과 레벨에 따른 예상 스펙 공식 제공
- 회귀분석 결과를 통해, 특정 직업의 해당 레벨 평균 스펙을 정확히 예측할 수 있으며, 이를 통해 유저들이 더 적합한 파티와 길드를 찾는 데 도움을 줄 수 있습니다. 예를 들어, 어떤 130레벨 썬콜 유저의 마력이 800인데 회귀공식에 따르면 850인 경우, 해당 스펙이 모집 목적에 적합한지 판단할 수 있습니다.
- 자신의 스펙이 동직업 동레벨 구직자의 평균과 얼마나 차이가 나는지 판단할 수 있어 목표 설정에 도움이 됩니다.
- 맵별 스펙 요구치 차이
- 동레벨, 동직업이라도 맵에 따라 스펙 차이가 발생할 수 있습니다. 특정 맵은 스펙 요구치가 높아 고자본 유저들이 선호할 수 있습니다. 이를 분석하면, 낮은 스펙을 가진 사용자가 더 낮은 요구치를 가진 사냥터를 선택해 구직할 가능성이 높다는 결론을 도출할 수 있습니다.
(4) 데이터 시각화
특정직업은 “허밋”으로 설정했고 특정 상황에 사냥터는 사용빈도가 5%이상인 경우만 분석
1. 특정직업 사냥터 레벨 분포 시각화
- 목표: 레벨에 맞는 적정 사냥터 판단
- 방법: 구인글에서 추출한 사냥터별 요구 레벨의 분포를 바이올린 플롯으로 시각화
2. 특정 직업의 레벨 구간 X 사냥터 히트맵 시각화
- 목표: 인기가 많은 사냥터 및 레벨 구간을 파악
- 방법: 구인글에서 추출한 사냥터 X 요구 레벨의 빈도를 히트맵으로 시각화
3. 특정직업의 사냥터별 레벨과 스펙 분포 시각화
- 목표: 특정 직업과 사냥터에서 필요한 레벨과 스펙을 파악
- 방법: 레벨과 스펙에 대한 산점도 및 등고선 그래프 시각화
- 해석 예시
- 120레벨 중반~140레벨까지는 공백기로 다른 사냥터를 찾는 게 좋음
- 레벨뿐만아니라 요구스펙, 예시로 최초 진입시 스펙 2000이 요구되고, 재진입 시점은 2400임을 알 수 있음
4. 특정 직업의 사냥터별 레벨과 스펙 간 회귀 모델링
- 목표: 특정 직업의 레벨 범위에 적합한 사냥터 파악, 사냥터간의 스펙 격차 파악
- 방법: 레벨과 스펙을 스캐터플롯으로 표현하고 맵을 색깔로 나타내고 동일맵끼리 회귀
- 해석 예시
- 블와둥이라는 맵의 진입 레벨과 스펙이 130레벨 중반의 2600 스펙이고, 만렙인 200레벨 가까이도 사냥 가능한 맵이라는 특징 파악 가능
- 망용둥 사냥터와 협동 사냥터 비교시 동레벨 기준 회귀선이 협동이 위에 있기 때문에 스펙요구치가 높은 사냥터임을 알 수 있음
5. 140 +-5레벨 썬콜의 레벨과 스펙 (spec_filled) KNN
- 목표: 비슷한 레벨, 스펙을 가진 데이터가 밀집한 사냥터를 찾아주는 알고리즘으로 사냥터 추천 가능
- 방법:
- 데이터 전처리:
- 필요한 열의 결측값 제거: level, spec_filled, map 열에 결측값이 있는 행을 제거
- 직업에 맞는 데이터 필터링: 입력된 job과 level 범위에 맞는 데이터를 필터링하여 사용
- KNN 모델 훈련:
- level과 spec_filled 값을 사용하여 KNN 모델을 훈련
- 입력값에 대한 추천 맵:
- 주어진 level에 대해 spec_filled의 평균 값을 사용하여 level과 spec_filled의 입력 벡터를 생성
- KNN 모델을 사용하여 가장 비슷한 3개의 맵 추천
Similarity scores for recommended maps:
Map: 협동, Score: 1.2336475589464726
Map: 망용둥, Score: 1.5880448040576784
Recommended Maps and Scores: ['협동', '망용둥']
6. 모든 데이터 t-SNE 2D 차원 축소 클러스터링
- 목표: 클러스터링 시각화로 사냥터와 직업의 특징을 파악, 아웃라이어 처리
- 방법: level, spec_filled, job, map 데이터 전처리 후 t-sne 클러스터링 적용 및 시각화
- 클러스터링 전처리 및 적용
- 범주형 변수(예: job, map) 인코딩.
- 수치형 변수에 대해 결측값 처리 (0으로 채우지 않음).
- 수치형 변수 정규화.
- 군집도가 낮은 상위 0.1% 데이터 아웃라이어 처리 - 5개의 데이터 제거
- 해석 예시
- 직업-맵 관계: 특정 직업들이 어떤 맵에서 주로 활동하는지를 보여주는지 표현
- 군집의 밀집도: 특정 직업-맵 조합이 밀집된 구역을 형성하는 경우 사냥터 활동 레벨이 좁음
- 맵의 구성: 맵에 어떤 직업들이 활동하는지, 직업 분포를 알 수 있음.
- 맵의 특성: 서로 가까운 위치에 있는 맵들은 비슷한 특성을 공유할 가능성이 있음. 예를 들어, '산양'과 '갈림길' 맵이 가까운 위치에 있다면, 두 맵이 게임 내에서 유사한 특성을 가지고 있을 수 있음.
mapleland/party
├── _00_main.ipynb # 프로젝트의 메인 노트북, 여러 분석 작업을 통합
├── _01_data_loading.ipynb # 데이터 수집 및 전처리 작업
├── _02_eda.ipynb # 탐색적 데이터 분석 (EDA)
├── _03_data_visualization.ipynb # 데이터 시각화 작업
└──_04_ modeling.ipynb # 머신러닝 모델링 작업
mapleland/party/jobs
├── _01_job-Crusader.ipynb # 크루세이더 직업 집중 분석
├── _02_job-DK.ipynb # 용기사 직업 집중 분석
└── _03_job-mage-IL.ipynb # 메이지 썬콜 직업 집중 분석
mapleland/party/data
├── output
│ ├── 1211_processed.csv # 12월 11일 관련 처리된 데이터
│ ├── 1212_processed.csv # 12월 12일 관련 처리된 데이터
│ ├── 1213_processed.csv # 12월 13일 관련 처리된 데이터
│ └── ... # 그 외 처리된 데이터 파일들
└── txt
├── 1211.txt # 12월 11일 관련 원본 텍스트 데이터
├── 1212.txt # 12월 12일 관련 원본 텍스트 데이터
├── 1213.txt # 12월 13일 관련 원본 텍스트 데이터
└── ... # 그 외 텍스트 데이터 파일들