Giter Site home page Giter Site logo

karttrack-lap / kartrider-game-analysis Goto Github PK

View Code? Open in Web Editor NEW
5.0 1.0 0.0 35.11 MB

유저가 선호하는 트랙을 만들기 위해서는 어떤 특성을 고려해야할까요? 카트타고 출근팀의 Kartrider-game-anlysis는 신규 트랙 디자인을 고민하는 카트라이더 트랙 디자이너를 위해 유저가 선호하는 트랙의 특징을 분석하는 프로젝트입니다.

Jupyter Notebook 100.00%
data-analysis game kartrider regression-analysis game-data-analysis

kartrider-game-analysis's Introduction

Kartrider-game-analysis

By TEAM 카트타고 출근

유저가 선호하는 트랙을 만들기 위해서는 어떤 특성을 고려해야하는지 분석하는 프로젝트



목차

1️⃣ 프로젝트 소개
2️⃣ 가설 설정
3️⃣ 사용 기술
4️⃣ 데이터
5️⃣ 디렉토리 설명
6️⃣ 분석 내용
7️⃣ 분석 결과 및 활용 제안
8️⃣ 팀원 소개 및 컨택트 정보



1️⃣ 프로젝트 소개

1. 문제 상황

  • 크레이지레이싱 카트라이더는 2004년에 서비스를 시작한 레이싱 비디오게임으로 18년째 많은 유저들에게 사랑을 받고 있습니다. 그러나 오랜 시간 서비스를 하고 있는 만큼 장점과 동시에 단점도 가지고 있습니다. 그 중 하나는 최근 출시된 스피드전 트랙들이 많이 플레이되지 않고 있다는 것입니다.

  • 실제로 2022.09.12 ~ 2022.10.10의 카트라이더 플레이 데이터를 살펴보니, 최근 5년간 출시된 스피드전 트랙 44개중 32개(72.7%)는 스피드 개인전 상위 50개 트랙에 이름을 올리지 못했음을 알 수 있었습니다.

2. 프로젝트 목적

  • 위의 문제상황을 포착한 팀 ‘카트타고 출근’은 최근에 출시된 트랙들이 상위 트랙에 포함되지 못하는 문제점을 해결하고자 분석 프로젝트를 기획하였습니다.
  • 해당 문제를 해결하기 위해 유저가 선호하는 트랙의 특징을 파악하려 합니다. 그리고 신규 트랙을 출시 할때 고민인 트랙 디자이너에게 어떤 것을 고려해야하는지 분석 결과를 통해 제안하고자합니다. 분석을 통해 파악한 상위 트랙의 특징을 신규 트랙에 적용한다면, 지속적으로 사랑받는 트랙을 제작할 수 있을 것입니다.


2️⃣ 가설 설정

  • 유저가 선호하는 트랙에는 특징이 있을 것이다.
    • 유저가 ‘트랙을 선호한다’ 를 트랙 사용 수가 많다로 정의
    • 트랙 사용수 = 경기에서 유저가 트랙을 선택한 횟수


3️⃣ 사용 기술




4️⃣ 데이터

1. 사용한 데이터

2. ERD 테이블

*ERD와 관련하여 자세한 내용을 확인하고 싶으시면, ERD 위키 페이지를 참고해주세요.

  • ERD 구조

  • ERD 구조 설명



5️⃣ 디렉토리 설명

*디렉토리와 관련하여 자세한 내용을 확인하고 싶으시면, 디렉토리 위키 페이지를 참고해주세요.

├── api
│	├── api-data-collecting-functions.ipynb
│	├── api-data-calculated-metrics-extraction.sql
│	└── match-indicator-extraction.csv
├── data-analysis
│	├── data-analysis-regression-cnt_match.ipynb
│	├── data-analysis-regression-AVG_record.ipynb
│	└── data-analysis-regression-difficulty.ipynb
├── data
│	├── match.csv
│	├── match_type.csv
│	├── track.csv
│	├── track_curve.csv
│	├── track_obstacle.csv
│	├── track_road.csv
│	├── track_shortcut.csv
│	├── track_straight.csv
│	└── track_trigger.csv
├── raw-data
│	├── api-rawdata-singleplay.csv
│	├── scraping-rawdata-error-track.csv
│	└── scraping-rawdata.csv
├── scraping
│	├── scraping-data-collecting-functions.ipynb
│	├── scraping-text-preprocessing.ipynb
│	└── scraping.csv
├──survey
│	├── survey.csv
│	└── survey-wordcloud.ipynb
└── README.md


6️⃣ 분석 내용

1. 분석 정의

  • 유저가 ‘트랙을 선호한다’를 ‘트랙 사용 수가 많다’로 정의하였습니다.
  • 트랙 사용 수를 종속변수로 두고 어떠한 요소들이 영향을 주는지 알아보고자 합니다.

2. 독립변수 선정을 위한 설문조사 진행

*설문조사와 관련하여 자세한 내용을 확인하고 싶으시면, 설문조사 위키 페이지를 참고해주세요.

  • 독립변수를 설정하기 위해 크레이지레이싱 카트라이더 유저를 대상으로 설문조사 진행했습니다.

  • 설문조사는 10/19~10/25 동안 진행하였고, 총 120명의 응답을 확보하였습니다. 이를 통해 유저가 트랙을 선택할 때 중요하게 생각하는 요소를 파악해 워드클라우드로 표현했습니다.

  • 위의 워드클라우드를 반영하여 분석에 필요한 독립변수를 아래와 같이 선정하였습니다.


3. 데이터 수집


4. 데이터 분석

1) 종속변수가 ‘트랙 사용 수’인 회귀분석 진행.

*종속변수가 트랙 사용 수인 회귀분석과 관련하여 자세한 내용을 확인하고 싶으시면, '트랙 사용 수' 분석 위키 페이지를 참고해주세요.

  • 다음과 같은 분석 결과를 도출하였습니다. image

  • 특히 주목해야하는 점은 단일 회귀 분석으로 트랙 사용 수 를 21% 설명하는 평균 주행시간이 증가할수록 트랙 사용 수가 감소한다는 것입니다. 다시 말해, “평균 주행시간을 낮춰야 트랙을 많이 사용한다.” 는 것을 알 수 있습니다.



2) 종속변수가 ‘평균 주행시간’인 회귀분석 진행

*종속변수가 평균 주행 시간 인 회귀분석과 관련하여 자세한 내용을 확인하고 싶으시면, '평균 주행 시간' 분석 위키 페이지를 참고해주세요.

  • 다음과 같은 분석 결과를 도출하였습니다. image

  • 특히 흥미로웠던 결과는 아래의 두가지 포인트입니다.

    • 직선 구간 비율 이 높을수록 평균 주행 시간이 늘어납니다.
      즉, “평균 주행 시간을 줄이기 위해서는 직선 구간 비율을 줄여야 함”을 알 수 있습니다.
    • 내리막길 비율이 높을수록 평균 주행 시간이 늘어납니다.
      따라서 평균 주행 시간을 줄이기 위해서는 내리막길 비율을 줄여야 합니다.


  • 그러나 직선 구간 비율을 줄이고, 내리막길 비율을 줄여 평균 주행 시간만을 낮추면 유저들이 그 트랙을 많이 이용할까요? ⇒ 아닙니다.
  • 트랙을 플레이하는 유저들의 레벨이 다르기 때문에, 각 레벨별 유저들에게 재미를 제공할 수 있도록 트랙의 난이도 또한 고려하여야 합니다. 그렇다면 난이도에는 어떤 변수들이 영향을 줄까요?

3) 종속변수가 ‘난이도’인 회귀분석 진행

*종속변수가 난이도 인 회귀분석과 관련하여 자세한 내용을 확인하고 싶으시면, '난이도' 분석 위키 페이지를 참고해주세요.

  • 다음과 같은 분석 결과를 도출하였습니다. image

  • 트랙의 난이도 에는 펜스 없는 구간 유무 , 내리막길 개수 , 전체 직선 개수 , 트랙 이동 개수 , 감속 트리거 개수 , 점프 트리거 개수 , 헤어핀 구간 개수, 전체 곡선 구간 개수, 전체 장애물 개수 가 영향을 준다는 것을 알 수 있었습니다.


7️⃣ 분석 결과 및 활용 제안

1. 분석 결과 정리

  • 분석 결과를 정리하자면 크게 다음과 같습니다.
    • 트랙 사용 수 에는 난이도, 평균 주행시간, 테마 가 영향을 미친다.
    • 평균 주행 시간 에는 내리막길 비율, 예각 커브 개수 , 헤어핀 구간 개수, 둔각 커브 개수, 직선 구간 비율, 펜스 구간 유무, 고정 장애물 개수 가 영향을 미친다.
    • 난이도 에는 내리막길 개수, 전체 직선 개수, 전체 곡선 개수, 헤어핀 구간 개수, 총 장애물 개수, 펜스 구간 유무, 트랙 이동 개수, 감속 트리거, 점프 트리거 가 영향을 미친다.

2. 트랙 계산기와 트랙 제작

*‘트랙 계산기 개발’과 관련 자세한 내용을 확인하고 싶으시면, 트랙 계산기 개발 위키 페이지를 참고해주세요.
*‘트랙 제작’과 관련 자세한 내용을 확인하고 싶으시면, 트랙 제작 위키 페이지를 참고해주세요.

  • 분석 결과를 활용하여 트랙 계산기를 개발하였습니다. 트랙 계산기 링크로 접속하면 트랙 계산기를 이용할 수 있습니다.
    트랙 계산기 화면은 아래와 같이 구성되어 있습니다. 트랙 구성요소들을 계산기에 넣으면 평균 주행시간과 난이도를 알 수 있습니다.

  • 트랙 계산기를 활용하여 ‘빌리지 테마’의 ‘난이도2’ 트랙을 제작하였습니다.
    팀 ‘카트 타고 출근’이 제작한 트랙 ‘빌리지 해마의 여행’ 입니다.



8️⃣ 팀원 소개 및 컨택트 정보

*팀원에 관련하여 자세한 내용을 확인하고 싶으시면 팀원 소개 위키 페이지를 참고해주세요.

kartrider-game-analysis's People

Contributors

goodkse7 avatar hhyojjin avatar hoinnovation avatar hyeming-king avatar jiyoonlee18 avatar junetofeb avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

kartrider-game-analysis's Issues

[Data 지표추출] API_ percent_retire가 100이상인 문제 해결

Issue : [Data 지표추출] API

Description

percent_retire는 cnt_retire_user/cnt_user*100으로 100이상이 나오면 안되는데, 100이상인 값을 발견해서 해결하고자합니다.

To-do

  • SQL 쿼리 '05-single_09121010api-EDA' 확인
  • 쿼리 수정 후 percent_retire 재 추출

[Data 전처리] 크롤링_crawl_data_with_theme 파일을 Meta 데이터 기반으로 조인 변경

Issue : [데이터 전처리]

Description

242fac7 [크롤링/테마/메타(raw)데이터 텍스트 전처리 코드]

  • crawl_data_with_theme (크롤링 데이터 기반 데이터) 데이터와 map_name_with_theme(Meta 데이터 기반데이터) 데이터를 merge하는 코드
  • 위 과정에서 crawl_data_with_theme (크롤링 데이터 기반 데이터)를 기준으로 merge 되어 일부 Meta 데이터 유실 발생

To-do

map_name_with_theme(Meta 데이터 기반데이터) 기반으로 재 merge 작업 필요

ETC

기존 데이터 변경 커밋 필요

[Data 전처리] crawl-data-with-theme + api_Kpi 결측치 채우기

Issue : [Data 전처리]

Description

#30 에서 확인한 API_KPI 데이터 기반 상위/하위 트랙의 결측치를 수기로 채워넣습니다.
해당 결측치는 Crawling 단계에서 크롤링이 불가능하였던 데이터로 수기작업이 불가피합니다!

To-do

카트라이더 공식 문서 기준 결측치를 수가로 채워넣었습니다!

ETC

이 작업을 끝으로 API_KPI 데이터 기반 상위/하위 트랙 데이터가 완성됩니다👏👏

[데이터] - api 데이터 확인하기

api 데이터 가져오기 & 데이터 확인하기

과정 :

  • API를 통해 response를 확인하는 request 코드 구현
  • API가 연결되면, 데이터 보여주는 코드 (.json())
  • 매치 상세정보 조회 데이터 파악 (MATCH, USER 데이터 분리 위함)
  • MATCH, USER

파악 필요한 것

  • 한 번에 몇 건의 데이터를 불러올 수 있는지 (Limit)
  • offset(시작점)에 따라 겹치는 데이터가 있는지
  • limit, offset의 한계로 출력되지 못하는 데이터가 있는지
  • 요청 시간에 플레이 되고있는 모든 데이터를 출력하는지
    - 만약 그렇다면, 플레이타임 (총 2분, 1분 시작 3분 종료) 기준
    - 0-2분 / 2-4분 모두에 존재하는 데이터 중복의 가능성 있음
  • drop_duplicates를 썼을 때와 안쓰고 nunique() 값을 쓸때 왜 값이 다르게 나오는지 (2022-10-16 추가)
  • 현재는 2분 기준으로 api를 날리게끔 되어 있는데 1분 단위로 날리면 매치 건수가 다르게 나올지 (2022-10-16 추가)

[Data 전처리] API_ 데이터 정합성 파악하기

데이터 정합성(Data Consistency) 파악하기

  • api로 카트라이더에서 제공한 데이터에 중복이 있는지 확인 필요!
  • 일정 기간 이후 id 값이 변경되는 경우가 있을 수도 있으니, 같은 이름을 가지는 id 값이 있는 지 확인해 보아야함

[데이터 import] - MySQL 데이터 업로드

Python을 이용하여 MySQL에 데이터를 바로 업로드 하는 방법입니다

  • MySQL에 반드시 SCEMA를 먼저 생성 후 시도해주세요!
  • 생성한 SCEMA이름에 따라 변수 명을 수정해 주세요!

[Data 지표 추출] API_ 트랙 사용률 기반 '인기' 상위, 하위 트랙 기준 정하기

사용 데이터 : 9/12 ~ 10/9 동안 카트라이더 OPEN API 기반 수집 데이터에서 아래의 기준을 적용한 가공 데이터 (이하 KPI)

기준(SQL 검색 조건 혹은 우리가 사용하게 될 1달 데이터에 대한 설명) 링크

각 트랙의 28일 사용 건수를 계산하고, 해당 지표를 트랙 인기의 척도로 확인합니다.

- 트랙 사용 건수 정의 : cnt_match 사용, 28일간 각 트랙 당 플레이 된 매치 수

데이터 가공

(1) 결측치 제거

  • track 메타 데이터와 kpi 데이터를 track_id를 기준으로 join하여 만든 데이터
  • 만약 null이 출력된다면 kpi 에는 존재하지만, track 메타 데이터에 track_id가 없는 값
  • 최종 kpi 데이터에서 출력되는 null값은 없었음.

(2) 지표 정하기

  • cnt_match : 28일간 각 트랙 당 플레이 된 매치 수
  • cnt_user : 28일간 각 트랙을 플레이 한 유저 수
    • 둘 중 어떤 지표로 '사용률'을 정의할 것인지 정의 필요
    • 두 지표가 큰 상관성을 가지는지 파악 위해 상관분석 진행
    • 두 지표는 0.81의 높은 상관성을 가지는 것으로 파악되어, 둘 중 어떤 지표를 사용하든 트랙 정렬에 있어 비슷한 추이를 보일 것이라고 판단.

(3) 이용하지 않을 데이터 삭제

  • 하루에 한 번도 플레이 하지 않았다면, 사용이 거의 되지 않는 맵이라고 판단
  • 28일 데이터 기준, 28회 이하로 플레이 된 맵은 삭제

(4) 상위, 하위 트랙 설정

  • 28회 초과 플레이 된 트랙들을 줄 세워 상위 25%, 하위 25%에 속하는 트랙을 각각 상위, 하위 트랙으로 설정
  • Q3 이상 44건, Q1 미만 44건을 각각 상위, 하위 트랙으로 출력하였음.

[트랙 분석] - 정량적 지표 기준 정하기

트랙분석을 통해 정량적 지표를 만들기 위한 기준 정하기

  1. 곡선과 직선 어떻게 구간화 할 것인지
  2. 장애물 분류 및 체크 방법 정하기
  3. 지름길 분류 및 체크 방법 정하기
  4. 도로폭, 벽면 체크 방법 정하기
  5. 오르막길, 내리막길 구간 기준 및 체크 방법 정하기

[Data EDA] API_ 3일치 데이터와 한 달 데이터 EDA진행

Api로 수집한 데이터 EDA

데이터 : 00-single_10031010.csv

  • 추출 시간 : 2021년 10/3(월) ~ 10/9(일) 7일 데이터

완료한 내용

  • EDA
  • 주요 지표 도출

확인 필요한 내용

  • 21년 데이터가 맞는지 확인 요청
    : 21년 데이터로 알고 있는데 올해 출시 된 메이플 트랙이 포함되어 있습니다. 21년 데이터가 맞는지 확인 필요

    • #10 에서 해결
  • rankinggrade2: 플레이어의 라이센스 확인 필요
    : 깃허브 글에서는 rankinggrade2는 플레이어의 라이센스로 0은 없음, 1-6은 초보부터 pro까지, 게임 종료시 "", single_10031010 데이터로 확인해보니, rankinggrade2는 0-6
    그리고 22년 1008일 데이터인 single_1008로 확인해보니 rankinggrade2는 0-5가 있었으니 다른 데이터 뽑아서 플레이어의 라이센스가 0-6인지 확인 필요

    • #10 에서 해결
  • 개인전 데이터가 뽑혔는지 확인 요청
    : 개인전이기 때문에, matchWin이 1(승리)이면, matchRank는 1 즉 1위만 승리하게 뽑혔는지 검증했는데요. 2위~7위,리타이어 된 유저가 matchWin이 1인 것을 발견, matchId에 개인전이 잘 들어간 건지 matchId를 넥슨 api홈페이지에서 검색해봤는데 개인전이 아닌 아이템 배틀임. 개인전이 잘 들어간건지 확인 필요

    • #18 에서 해결

[Data 전처리] crawl-data-with-theme + api_Kpi 데이터 조인

Issue : [Data 전처리]

Description

재 merge한 crawl-data-with-theme와 API기반 KPI 데이터를 조인합니다.
merged된 API_KPI데이터를 바탕으로 상위/하위 트랙을 추출합니다.

To-do

API 기반 KPI 데이터를 기준으로 재 merge한 crawl-data-with-theme를 붙여, KPI의 name(track_name) 기준 데이터가 남도록 합니다.

ETC

#31 API_KPI 데이터 기반 상위/하위 트랙 데이터에서 결측치 채우기 후속 작업이 필요합니다.

[데이터 환경 구축] 분석 환경_컬럼명, 테이블명 수정

Issue : [데이터 환경 구축]

Description

분석에 필요한 테이블에서 trigger 테이블명 변경, track_straight에서 속성 추가로 넣어주어야함
테이블 import 하면 index 함꼐 로드 됨.

To-do

  • 테이블명 오타 수정 tigger -> trigger

  • track_straight 테이블에 straight_all_section 추가로 넣어주기

  • 테이블 index = False 지정하여 내보내기

[Data 통계분석] 3일치 데이터 통계분석 테스트

  • 회정 : year로 독립변수, month 로 독립변수 단순 회귀 돌려보기 + 추가로 다른 변수를 합치면서 (시간 위주로)
  • 시은 : 트랙 9 등 일부 트랙 제외하고 회귀분석 진행해보기
  • 효진 : 종속변수를 rank로 변환해서 ols 단순 회귀 해보기
  • 혜민 : 각 변수 경향성 확인하기 → 왜도, 첨도 값 구하고 → 경향 있으면 이슈에 공유 → 전부 다 진행하면 회귀분석 넣고 빼고 하면서 진행

[설문조사]

📃1차 설문조사

  • 설문조사 기획하기 (설문조사를 통해 우리가 알고 싶은 것 정리하기)
  • 설문지 카테고리 정리하기 (ex : 1. screening question / 2. 카트 관련 질문 / 3. 트랙 관련 질문 / 4. 인구통계적 변수)
  • 각 카테고리별 질문, 설명, 측정법 정하기
  • 설문지 주의사항 체크하기

📃2차 설문조사

  • 설문조사 기획하기 (설문조사를 통해 우리가 알고 싶은 것 정리하기)
  • 설문지 카테고리 정리하기 (ex : 1. screening question / 2. 카트 관련 질문 / 3. 트랙 관련 질문 / 4. 인구통계적 변수)
  • 각 카테고리별 질문, 설명, 측정법 정하기
  • 설문지 주의사항 체크하기

[Data 환경 구축하기] 데이터 수집 환경_ 대용량 데이터 수집

대용량 api 원하는 데이터 뽑아올때

  • 하루 단위 데이터 뽑는 데 걸리는 시간 확인 (주말/평일)
  • 하루 단위 데이터 용량 확인 (주말/ 평일)

고민해볼 사항 + 방법 찾아보기

  • 파이썬 스크립트를 배치파일로 날짜 돌려가면서(자동으로 다음날짜 뽑기) 작동시킬 수는 없는지
  • 가능하다면 방법 더 찾아보기
  • 각각 다운받은 하루 데이터를 어디에서 모으고 합칠 수 있을지
    • AWS의 DB 환경으로 하루하루 데이터를 넣고 -> spark로 데이터베이스 연결해서 합치는 것이 좋을지
  • ⭐️ AWS S3이 배치 관련인 것 같음! 더 찾아봐야할 것 같음

등등
대용량 데이터를 처리하는 방법에 대해 고민해보아요 🙏🏻

[Data 전처리] 크롤링_ ERD기준에 맞게 테이블 컬럼 변경하고, 출시일 컬럼 삭제, null로 입력된 데이터 추가

Issue : [Data 전처리] 크롤링

Description

api 데이터로 추출한 kpi데이터와 크롤링 데이터를 조인하기 위해 크롤링 데이터 전처리를 진행합니다.

To-do

  • 1. ERD기준에 맞게 테이블 컬럼을 변경하는 작업을 진행합니다.
  • 2. 출시일과 첫 등장일 컬럼 내용이 동일해서 출시일 컬럼을 삭제합니다.
  • 3. null로 입력된 데이터를 직접 추가합니다.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.