본문 바로가기
Dev/python

싸늘하다...가슴에 성적표가 날아와 꽂힌다...한 경기씩 채점하며 지금까지의 적중률을 계산해봅시다!

by 혜옹쓰 2021. 10. 27.

참...어차피 부당해고 당할거 뭐 이리 블로그를 열심히 썼나 싶다...^^


문득 DB를 확인해보니, 벌써 모델링을 구체화해서 DB에 쌓기 시작한지도 한 달이 다 되어가더라구요! 스케쥴러까지 돌려놓으니, 어제처럼 공휴일에도 컴퓨터 혼자 알아서 모델링하고 DB까지 쌓아줘서 하루하루 뿌듯함을 느끼고 있어요 ;)

하지만! 알아서 잘 하고 있다고해서 무시하고 있을수는 없겠죠! 지금까지의 적중률을 계산해서 중간점검 성적표를 내보고, 더욱 고도화시킬 수 있는 방법을 연구해보도록 해요!

 

일단 현재까지 적중률을 확인해보고, 앞으로는 적중률을 매 주 확인할 수 있도록 하는 코드를 함께 짜러 가봅시다! 먼저 model 테이블과 경기 일정과 결과를 보여주는 match_info 테이블을 주피터로 가져와서 확인해보도록 해요.

어차피 일반 승무패만을 확인할거니까 모델 테이블에서 base_line 열은 삭제해주고요, 인포 테이블에서는 경기 일자, 홈팀, 원정팀, 승자를 보여주는 winner 열만 남기고 모두 삭제해줄게요!

가장 기본인 일반 승무패에 대한 적중률을 확인할 예정이기 때문에, category는 normal 인 행들만 필터링해주었어요! 이제 모델과 인포 데이터 프레임을 하나로 합쳐줄건데요, merge 함수를 활용해줄거에요. 공통된 열인 날짜, 홈팀 아이디, 원정팀 아이디를 기준으로 합쳐주고, winner에 따라 실제 home_result_pts를 추가해줄게요! 참고로 winner 가 0으로 표시된 경우 무승부를 뜻합니다!

test = pd.merge(model, info, how='inner', on = ['date','home_id','away_id'])
test.insert(12,'Label_result',0)
    
for i in range(0,len(test)):
    if test['winner'][i] == 0:
        test['Label_result'][i] = 1.0
    elif test['winner'][i] == test['home_id'][i]:
        test['Label_result'][i] = 3.0
    elif test['winner'][i] == test['away_id'][i]:
        test['Label_result'][i] = 0.0
test

그럼 이렇게 Label과 Label_result를 함께 확인할 수 있는 데이터 프레임이 완성됩니다! 이제 마지막으로 두 열을 비교해서, 확률을 구하는 코드를 작성하러 가시죠!

num=0
for i in range(0,len(test)):
    if test['Label'][i] == test['Label_result'][i]:
        num += 1
    else:
        pass
percentage = (num / len(test) * 100)

전체 모델링 결과 중 적중 성공한 경기 수는 num이라는 변수를 이용해서 구해줄거에요. num을 0으로 지정해놓고, 예측값인 Label과 실제 결과값인 Label_result가 같다면 +1, 아니면 넘어가는 식으로 구해주고 전체 개수로 나눠준다음 100을 곱해주면 적중률의 백분율을 구할 수 있습니다! 참 쉽죠? ;)

저는 앞서 말했듯이 매주 월요일, 한 주간의 적중 결과를 확인하는 코드를 짤 예정이라 위의 코드를 한 셀에 모두 정리해서 넣었구요, if문을 활용해서 매 주 월요일에만 코드가 돌아가도록 했어요. 추가로, 원래 코드가 잘 돌아가는지 확인용이었던 텔레그램봇을 활용해서 적중률을 구하도록 했어요! 예를 들면 이렇게 확인할 수 있답니다!

56.25% 라니, 절반밖에 적중하지 못한거야? 라고 생각하실수도 있지만 예측하기 어렵다는 게 스포츠의 묘미가 아닐까 싶기도 하구요,,^^절대 변명은 아니고..!

(50%라는게 크다면 크고 작다면 작은 확률 아니겠ㅇ어요?ㅎㅎㅎ)