2023. 9. 25. 18:11ㆍPython
피파 온라인 4 데이터
- 이 게임은 유저별로 11명의 선수로 구성된 스쿼드를 구성해 플레이 하는 축구 게임이다.
피파온라인4 홈페이지에 10000명의 랭커 정보를 공개하고 있는데 약 3000명의 랭커들의 스쿼드 정보를 수집했다.
추천알고리즘에 대해서 공부하면서 Movielens란 데이터를 활용해서 Tf-idf의 실습을 해보다가 다른 데이터에도 적용을 해보면 어떨까 하다가 시작하게 됐다.
마치 Movielens 데이터에서 내가 좋아하는 영화들이 있는데 나랑 비슷한 유저들의 영화 목록을 추천해주듯이 한자리가 고민일 경우에 다른 유저들의 스쿼드 정보를 바탕으로 한명의 선수를 추천해줄수 있지 않을까? 라고 생각이 들었다.
데이터 수집
데이터 수집부터 애를 먹었다. 처음에는 셀레니움을 이용해 수집하다가 아무리 시도를 해도 모든 정보를 들고 올 수 없는 경우가 있어서 UI Path라는 툴을 이용해 수집하였다.
UI Path는 매크로 툴로 랭커 10000명에 대한 스쿼드 정보를 사람 손으로 다 가져오려면 한계가 있기 때문에 자동화해주는 툴이다.
UI Path를 통해 랭커 10000명에 대한 프로필 페이지에 접속해 개발자 도구 콘솔창에 명령어를 통해 스쿼드에 대한 정보를 추출하고 그 추출된 정보를 다시 메모장에 저장하는 형태로 가져왔다.
컬럼 소개
아래의 그림은 Json 형태로 수집한 데이터를 정재해 파이썬 데이터프레임으로 변환시킨 것이다.
- spid : 선수카드 고유번호(seasonID + playerID)
- name : 선수 이름
- role : 사용 포지션
- buildUp : 카드 강화단계
- price : 가격
- teamColor : 사용 팀컬러
- user_id : 유저 고유번호
TF-IDF?
TF-IDF는 문장 내에서 자주 등장하는 단어는 중요하며 다만 어디에서나 흔한 단어는 중요하지 않다는 아이디어를 이용한 것으로 상대적으로 적은 문서에 나오면서 특정 문서에 자주 나온 단어에 점수를 많이 주는 방법이다.
우선 TF 행렬을 생성한다
TF 행렬을 보면 한 유저당 당연하게도 같은 선수는 한 명밖에 사용할 수 없기 떄문에 모두 1로 채워지는 것을 확인할 수 있다.
이제 IDF 행렬을 보자
다른 유저들이 많이 사용했을 수록 값이 낮아지는 것을 확인할 수 있었다.
이제 TF행렬과 IDF행렬을 행렬 곱을 통해 최종 TF-IDF 행렬을 만들어 주면 대략 아래와 같은 결과가 나오는데
같은 선수를 가지고 있다면 모든 유저가 그 해당 선수에 같은 값을 가지고 있을 것이고 이 때 내가 가지지 않은 선수 중에 다른사람에게 가장 많이 사용된 선수를 가지고 있는 유저가 나와 가장 유사한 스쿼드를 갖게 된다고 볼 수 있다.
유사도는 코사인 유사도를 통해 아래와 같이 계산하였다.
결과
유저 75과 가장 유사한 유저를 찾을 수 있었고 이때 총 6명의 선수를 공유하고 있는 것을 확인했다.
그리고 위에서 설명했던 것처럼 유저 75번이 가지지 않은 선수들 중에서 가장 대중적인 선수들을 가지고 있는 유저를 찾았을 것이다.
아레올라, 베이날둠, 하키미, 킴펨베, 율리안 드락슬러는 모두 PSG란 축구팀에서 가장 많이 사용되는 선수들 중 하나이기 때문이다.
그리고 마지막으로 저위 컬럼에서 보이는 sdprice는 선수가격/전체선수 가격(즉 가격비중) 인데 75번은 음바페의 비중이 전체에서 10% 밖에 차지 하지 않고 오른쪽 유저 1883번은 무려 47%를 차지하고 있는 걸 볼 수 있는데 어떤 선수를 비중있게 쓰느냐에 따라서 플레이 스타일이나 스쿼드도 바뀔 것 같다는 생각이 든다.
결론
TF-IDF를 통해 유사한 유저를 찾는 방법을 실습해보았다. 이는 유저들마다 가진 돈의 크기, 선수별 다양한 포지션 활용, 포메이션, 시즌, 급여 등의 변수들을 고려치 못했다. 또한 TF-IDF는 주로 아이템들간의 유사도를 측정하는 컨텐츠 기반의 추천 시스템이지만 이를 살짝 틀어 유저들간의 유사도를 측정해보았다...
추후에는 다른 가중치 방법을 찾아 유사도를 측정하는 방법이나 급여, 시즌, 포메이션 등의 변수들을 추가로 고려할 수 있는 추천 알고리즘을 찾아 실습해봐야겠다.
'Python' 카테고리의 다른 글
서울시 도로소통정보 시각화(with folium)-(1) (1) | 2023.11.21 |
---|---|
VM과 MobaXterm 연동하기 (1) | 2023.10.25 |
Python 가상 환경 만들기 (0) | 2023.08.29 |
REST API 호출해 데이터 프레임 생성하기 (0) | 2023.08.23 |
Linux에 Python offline 설치하기 (0) | 2023.02.08 |