tak's data blog

피파온라인4 이탈, 진성유저 분석_데이터프레임 생성 본문

프로젝트/인과관계를 고려한 피파4 이탈분석

피파온라인4 이탈, 진성유저 분석_데이터프레임 생성

hyuntaek 2022. 6. 24. 14:11
반응형
SMALL

 

피파4 api를 통해서 데이터를 불러오고 활용할만한 데이터를 수집하는 법을 작성하도록 하겠다.

 

아래는 실제 나의 닉네임이다. 닉네임을 입력하면 아래와 같이 json형태로 데이터가 구성되어 있음을 확인할 수 있다.  유저 고유의 accessid랑 level등이 존재한다. 피파온라인4와 같은 게임은 rpg게임과 다르게 부캐를 육성하는 사람들이 대다수이므로 레벨은 추후 분석에서 제외하고 진행할 예정이다.

 

 

 

우선 위의 accessId를 기준으로 유저의 매치정보, 상세정보, 게임 내 슛, 수비, 패스 등의 정보도 추가로 가져올 수 있다.

accessId를 통해 데이터를 불러오는 과정을 아래와 같이 함수로 정의하였다.

import json
import requests 
import pandas as pd
import numpy as np
import datetime as dt
from tqdm.notebook import tqdm


#api_key ="본인이 발급받은 api_key"
#access = "유저 고유 식별자 accessid"

def user_df(api_key, access):
    headers = {'Authorization' : api_key} 
    # 매치기록(공식경기: 50) 조회를 위한 파라미터
    match_parameter = {'matchtype' : 50, 'offset' : 0, 'limit' : 100}
    match_record_url = requests.get(f'https://api.nexon.co.kr/fifaonline4/v1.0/users/{access}/matches?',\
                                params=match_parameter, headers = headers)
    
    match_record_parsed_data = match_record_url.json()
    match_user = pd.DataFrame()
    
    for i, m in tqdm(enumerate(match_record_parsed_data)):
        matchid = match_record_parsed_data[i]
        # 매치 상세정보 조회를 위한 코드
        match_detail_url = requests.get(f'https://api.nexon.co.kr/fifaonline4/v1.0/matches/{matchid}', headers = headers)
        match_detail_parsed_data = match_detail_url.json()
        temp = pd.DataFrame(match_detail_parsed_data)
        match_user = pd.concat([match_user, temp], axis = 0)
    
    matchid = match_record_parsed_data[0]
    match_detail_url = requests.get(f'https://api.nexon.co.kr/fifaonline4/v1.0/matches/{matchid}', headers = headers)
    match_detail_parsed_data = match_detail_url.json()
    
    # 매치 정보, 상세정보, 슛, 패스, 수비 등의 정보를 위한 데이터프레임 생성
    match_Info = pd.DataFrame()
    match_Detail = pd.DataFrame()
    match_Shoot = pd.DataFrame()
    match_Pass = pd.DataFrame()
    match_Defence = pd.DataFrame()
    
    # PlayerDTO를 활용해서 선수 정보도 추가 가능
    
    # DTO 정보 리스트 형태로 만들기
    li_accessId = [i.get('accessId') for i in match_user['matchInfo']]
    li_nickname = [i.get('nickname') for i in match_user['matchInfo']]
    li_matchDetail = [i.get('matchDetail') for i in match_user['matchInfo']]
    li_shootDetail = [i.get('shoot') for i in match_user['matchInfo']]
    li_passDetail = [i.get('pass') for i in match_user['matchInfo']]
    li_defenceDetail = [i.get('defence') for i in match_user['matchInfo']]

    
    match_Info = match_user.iloc[:, :2].reset_index(drop=True)
    accessId_data = pd.DataFrame(li_accessId)
    nickname_data = pd.DataFrame(li_nickname)
    match_Detail = pd.DataFrame(li_matchDetail)
    match_Shoot = pd.DataFrame(li_shootDetail)
    match_Pass = pd.DataFrame(li_passDetail)
    match_Defence = pd.DataFrame(li_defenceDetail)
    
    accessId_data = accessId_data.rename(columns={0 : 'accessId'})
    nickname_data = nickname_data.rename(columns={0 : 'nickname'})
    
    user = pd.concat([match_Info, accessId_data, nickname_data, match_Detail,
                      match_Shoot, match_Pass, match_Defence], axis = 1)
    
    return user

 

 

위의 코드를 실행하면 아래와 같은 데이터프레임 형태가 나온다.

매치기록의 수집이다 보니 동일한 유저가 여러번 나올 수 있는 문제가 있다. 그래서 유저 고유 accessid를 기준으로 데이터를 수집하고 경기기록(matchDate)간의 차이로 이탈 기간을 정한 후 나머지 중복된 행은 drop_duplicate를 통해 제거할 예정이다.

이렇게 하면 수많은 유저표본은 구하진 못하지만 이탈 기간 정의가 가능해진다. 

 

 

위의 과정으로 데이터 수집이 완료되었고, 이탈에 따른 유저 플레이 형태를 살펴볼 예정이다.

반응형
LIST