옥냥이 불안전한 놀이터, EDA 해보기
본격적인 EDA를 하기에 앞서 추후에 쓸 자료를 분석해보고 싶었다.
그러니까 무슨 말이냐면, 옥냥이한테 "당신 마리오 카트 전적을 분석해보니 이렇게 나왔어!"
라고 팬카페에 쓸 건덕지 좀 마련하고 싶다는 말이다.
ㆍ 맵별 평균 순위
ㆍ 승률이 높은(혹은 낮은) 맵들
ㆍ 평균 승률
이런 것들을 가볍게 확인해보고자 한다.
df_td = df_td.sort_values(['win_ratio', '성공'], ascending=False)
df_td.head(10).plot.bar(
y=['성공', '실패'],
color=['lightcoral', 'royalblue'],
figsize=(10, 5),
rot=20,
)
plt.title("성공률이 높은 경기장 TOP 10")
plt.ylabel("판 수")
plt.grid(True, linestyle='--', linewidth=0.3, axis='y')
우선 가장 보편적으로 성공률이 가장 높은 경기장 TOP 10이 궁금했다.
df_td는 track_distribution 데이터를 갖는 데이터프레임이다.
track_K와 RESULT로 groupby한 다음에 각 경기장마다 성공/실패 여부가 몇 개인지 담긴 데이터프레임이다.
df_td를 win_ratio(승률)과 성공 컬럼을 기준으로 내림차순 정렬했다.
이때 승률은 (성공 판 수 / 전체 판 수)로 계산했다.
이때 경기장이 성공했다는 건 무슨 의미일까?
'3판 합계 15등'으로 놀이터가 열렸다고 해보자.
그리고 3판을 '비틀어진 맨션(3등)', 'Tour 마드리드 그란데(7등)', '미끌미끌 트위스터(4등)'으로 들어왔다고 하자.
그럼 놀이터 배팅 결과가 '성공'일 것이다.
그럼 위에서 언급한 3개의 경기장은 '성공' 데이터가 하나 쌓인 것이다.
정리하면 해당 경기장(track)을 달릴 시, 배팅을 성공할 확률이 높다는 말이다.
왜 다들 게임할 때, 손에 맞는 캐릭터가 있고 뭘 해도 안 되는 캐릭터가 있지 않은가.
옥냥이가 '빅 블루'는 못하고, 'N64 요시 밸리'는 잘하는 그런 느낌이다.
물론 전체 게임 횟수가 632개 뿐이고, 맵의 전체 개수는 96개밖에 없다.
단순 계산만 해봐도 평균 한 맵당 6.58번 플레이한 데이터 뿐이다.
즉 데이터 표본이 상당히 적어, 정말 참고용(팬카페 올릴 용도)임을 감안하자.
df_td = df_td.sort_values(['win_ratio', '실패'], ascending=[True, False])
df_td.head(10).plot.bar(
y=['성공', '실패'],
color=['lightcoral', 'royalblue'],
figsize=(10, 5),
rot=20,
)
plt.title("성공률이 낮은 경기장 TOP 10")
plt.ylabel("판 수")
plt.grid(True, linestyle='--', linewidth=0.3, axis='y')
마찬가지로 성공률이 낮은 경기장도 살펴보자.
높은 경기장의 정렬과는 조금 다른 정렬이 필요하다.
몰랐는데 단 한 번도 성공하지 못 한 경기장이 꽤 많이 있었다...
똑같이 승률이 0%라고 하더라도, 10판 승률 0%와 1판 승률 0%는 다르다.
그래서 'win_ratio' 컬럼은 오름차순, '실패' 컬럼은 내림차순으로 정렬해야 한다.
win_ratio는 말그대로 승률이기에 오름차순으로 해야, 가장 낮은 값이 처음에 온다.
이런... 성공률 하위 TOP 10은 전부 성공률 0%라니
그래도 옥냥이가 선샤인 공항을 할 때, 나름 잘했다고 생각했는데... 요시 아일랜드도...
여기서 이 방식의 문제점을 생각해볼 수 있다.
만약 '선샤인 공항'을 1등으로 들어왔다고 해보자.
그리고 나머지 2개의 경기를 12등 12등으로 들어와서 실패를 했다.
그럼 선샤인 공항은 실패 데이터가 하나 쌓이는 거다.
그렇다 선샤인 공항 데이터 입장에서는 억까를 당한 것이다.
근데 데이터가 적다고 하더라도, 선샤인 공항 실패가 10회라면 이건 실력 아닐까?
이런 문제점을 해결하면서, 경기장별 '진짜 승률'이 높은 순으로 시각화를 하고 싶었다.
df_td에서 사용한 win_ratio 컬럼은 데이터 개수를 고려하지 않았다.
10판 중 7판 승리한 경기장의 승률(70%)보다, 1판 중 1판 승리한 경기장의 승률(100%)이 당연히 더 높다.
이러면 안 된다고 생각헀다.
따라서 '신뢰구간'을 활용하여 데이터 표본에 따른 공정한 승률을 구하고자 헀다.
현재 살펴본 그래프들은 '성공과 실패'라는 두 가지 기준으로 평가했다.
성공과 실패라는 결과는 공존할 수 없는 독립적인 시행, 즉 베르누이 시행이다.
베르누이 시행 기반의 이항 분포 그래프는, 특정 조건을 만족하면 정규 분포로 근사할 수 있다.
특정 조건은 시행이 충분히 크거나, 확률 p가 극단적이지 않은 경우이다.
반대로 말하면 수집한 데이터가 너무 적거나, 확률이 너무 편향될 경우 잘 동작하지 않는다.
이를 위한 방법이 Wilson score confidence interval이다.
"R%의 신뢰 수준에서, 긍정적인 평가를 받을 확률은 최소 얼마에서 최대 얼마인가?"
라는 질문에 답을 얻을 수 있는 게 wilson score confidence interval이다.
이 방법은 긍정 평가 수, 전체 평가 수, 원하는 신뢰 수준을 입력으로 받는다.
그리고 긍정 평가가 가능한 범위(bound)를 반환한다.
시행(데이터 표본 수)이 적을수록 예측은 모호해진다.
따라서 wilson score는 적은 데이터에 대해 넓은 bound를 반환하고,
충분히 신뢰 가능한 만큼 데이터가 쌓이면 점차 bound를 좁혀나간다.
lower bound와 upper bound 중에서 lower bound를 보통 점수로 사용한다.
그러면 믿을 만한 데이터에 상대적으로 높은 점수를 주고, 충분하지 못 한 데이터에는 낮은 점수를 준다.
이렇게 불확실성에 대한 밸런스를 잡을 수 있다.
그렇게 wilson score 점수가 높은 순서대로 TOP 10 경기장을 산출해보았다.
쉽게 말하자면 '위의 10개의 경기장을 달린다면 그래도 좋은 순위를 기대할만하다!'라는 의미다.
이때 주의할 점은 min이 긍정이고, max가 부정이다.
min은 최소 순위로 1등에 가까운 데이터고, max는 최대 순위로 12등에 가까운 데이터다.
성공률 등수 | wilson-score 등수 | |
비틀어진 맨션 | 1 | 2 |
미끌미끌 트위스터 | 3 | 1 |
SFC 도넛 평야 3 | 4 | 3 |
Tour 시드니 스프린트 | 5 | 6 |
Tour 도쿄 블러 | 7 | 4 |
Wii 음매음매 컨트리 | 8 | 8 |
N64 요시 밸리 | 10 | 5 |
wilson score에서 설명할 때, 입력을 3가지 받는다고 했다.
그중 하나가 신뢰 수준으로, 편의상 가장 많이 사용하는 95%의 신뢰 수준으로 계산한 결과이다.
신뢰 수준에 따라 결과가 달라지겠지만, 95%로 잡은 현재로써는 '성공률이 높은 경기장 TOP 10'과 상당수 겹친다.
즉 위의 7개의 맵에 대해서는, 95%의 신뢰 수준으로 좋은 결과를 낸다고 볼 수 있겠다.
궁금해서 살펴본 성공/실패 판수다.
놀이터 성공 데이터는 180번, 실패 데이터는 443번으로 약 2.5배 차이가 난다.
생각보다 엄청 차이가 나지는 않는다!? 거의 5배는 날 줄 알았는데 역배가 꽤 터진다.
맵별 평균 승률과 최소ㆍ최대 승률은 모델링을 할 떄 다뤄보기로 하고,
여기서는 날짜별 평균 ㆍ최소 ㆍ최대 승률을 살펴본다.
하나의 사진으로 첨부하기에는 세로로 너무 길어서 임의로 2개의 데이터프레임으로 나눴다.
그러다가 든 생각이 날짜별 평균 승률을 나열해본다면, 에이징커브 그래프가 나올 수 있지 않을까? 생각이 들었다.
다행히(?) 아직 에이징커브 이슈가 있는 모양새는 아니다.
조금 더 보기 쉽게 가로 형태의 꺾은선 그래프를 그려보았다.
중간중간 (안 좋은 쪽으로) 튀는 데이터가 있기는 하지만 전반적으로 현재 상승 중이다.
옥냥이는 컨디션에 영향을 많이 받는 성장형 주인공인 걸로.