본문 바로가기
데이터 분석/축구 데이터 분석

4. EPL 20/21 시즌 최근 5경기 전적으로 살펴본 다음경기 결과

반응형

축구 데이터 - 4. EPL 20/21 시즌 최근 5경기 전적으로 살펴본 다음경기 결과

 

 


재미로 보는 축구데이터 , 네번째는 EPL 20/21 시즌 최근전적으로 다음경기 결과 알아보기 입니다.

 

대부분의 사람들이 팀의 최근 전적이 좋을 수록 다음경기를 이길 수 있다고 생각합니다.

 

EPL 20/21 시즌의 최근 전적 데이터와 경기 결과 데이터를 가지고 최근전적과 다음 경기의 결과과 연관성이 있는 지 살펴보도록 하겠습니다.

 


 

 

필요한 정보는 EPL 20/21 시즌 각 팀들의 최근 5경기 전적  ,  각 팀의 라운드별 승, 무, 패 기록입니다.

 

해당 정보들은 웹 크롤링을 통해 엑셀 파일로 만들어 두었습니다.

 

최근 전적의 경우 , 최근 5경기만을 보도록 하였습니다.

 

따라서 최근전적 데이터는 6라운드 이후의 데이터 입니다.

 

또한 EPL 20/21 시즌은 코로나와 선수들의 체력을 문제로 라운드의 순서가 지켜지지 않고 섞여져서 치뤄졌습니다.

 

최근 전적의 의미는 시간순으로 이루어진 경기들의 전적을 확인 하는 것 이므로 , 라운드 기준이 아닌 시간 순으로 최근 전적을 정리하였습니다.

 

EPL 20/21 각팀 전적  ,  각 팀의 라운드별 승, 무, 패 기록

 

 

import openpyxl

btk = openpyxl.load_workbook("./EPL2021최근전적.xlsx")
btk_sheet = btk.active
sp = 741 # 엑셀 팀별 인덱스
team_name = "셰필드 유나이티드 FC".replace(" ","") 

for i in range(1+sp,39+sp):
    if str(btk_sheet["A{}".format(i)].value).replace("\n","").replace(" ","") == team_name:
        if btk_sheet["C{}".format(i)].value > btk_sheet["D{}".format(i)].value : #팀이 이긴경우
            btk_sheet["H{}".format(i)] = "W"
        elif btk_sheet["C{}".format(i)].value == btk_sheet["D{}".format(i)].value : #팀이 비긴경우
            btk_sheet["H{}".format(i)] = "D"
        elif btk_sheet["C{}".format(i)].value < btk_sheet["D{}".format(i)].value : #팀이 진경우
            btk_sheet["H{}".format(i)] = "L"
    elif str(btk_sheet["B{}".format(i)].value).replace("\n","").replace(" ","") == team_name:
        if btk_sheet["C{}".format(i)].value > btk_sheet["D{}".format(i)].value: # 팀이 진경우
            btk_sheet["H{}".format(i)] = "L"
        elif btk_sheet["C{}".format(i)].value == btk_sheet["D{}".format(i)].value: # 팀이 비긴 경우
            btk_sheet["H{}".format(i)] = "D"
        elif btk_sheet["C{}".format(i)].value < btk_sheet["D{}".format(i)].value: # 팀이 이긴 경우
            btk_sheet["H{}".format(i)] = "W"

btk.save(filename="EPL2021최근전적.xlsx")

 

위 코드를 통해 EPL 20/21 시즌 경기 전적을 엑셀에 기록했습니다.

 

 

import openpyxl

btk = openpyxl.load_workbook("./EPL2021최근전적_REFORM.xlsx")
btk_sheet = btk.active

class win: # 아래의 표를 보고 최근전적을 구분 , 오늘 이겼을 때 지난 최근전적이 어땠는지
    w0_stack = [0, 0, 0, 0, 0, 0]
    w1_stack = [0, 0, 0, 0, 0]
    w2_stack = [0, 0, 0, 0]
    w3_stack = [0, 0, 0]
    w4_stack = [0, 0]
    w5_stack = [0]

class draw: # 아래의 표를 보고 최근전적을 구분 , 오늘 무승부 일때 지난 최근전적이 어땠는지
    w0_stack = [0, 0, 0, 0, 0, 0]
    w1_stack = [0, 0, 0, 0, 0]
    w2_stack = [0, 0, 0, 0]
    w3_stack = [0, 0, 0]
    w4_stack = [0, 0]
    w5_stack = [0]

class lose: # 아래의 표를 보고 최근전적을 구분 , 오늘 졌을 때 지난 최근전적이 어땠는지
    w0_stack = [0, 0, 0, 0, 0, 0]
    w1_stack = [0, 0, 0, 0, 0]
    w2_stack = [0, 0, 0, 0]
    w3_stack = [0, 0, 0]
    w4_stack = [0, 0]
    w5_stack = [0]

wh_w0_stack = [0, 0, 0, 0, 0, 0] # 전체 경우가 얼마나 나왔는지 확인용
wh_w1_stack = [0, 0, 0, 0, 0]
wh_w2_stack = [0, 0, 0, 0]
wh_w3_stack = [0, 0, 0]
wh_w4_stack = [0, 0]
wh_w5_stack = [0]

win_sit = win()
draw_sit = draw()
lose_sit = lose()

# win 0 -> 5d 0l / 4d 1l / 3d 2l / 2d 3l / 1d 4l / 0d 5l
# win 1 -> 4d 0l / 3d 1l / 2d 2l / 1d 3l / 0d 4l
# win 2 -> 3d 0l / 2d 1l / 1d 2l / 0d 3l
# win 3 -> 2d 0l / 1d 1l / 0d 2l
# win 4 -> 1d 0l / 0d 1l
# win 5 -> 0d 0l
# 총 21개의 경우 존재 위의 순서대로

def check(rc_stack,result):
    global win_sit,lose_sit,draw_sit
    win = rc_stack.count("W")
    lose = rc_stack.count("L")
    if result == "W":
        if win == 0:
            wh_w0_stack[lose] += 1
            win_sit.w0_stack[lose] += 1
        elif win == 1:
            wh_w1_stack[lose] += 1
            win_sit.w1_stack[lose] += 1
        elif win == 2:
            wh_w2_stack[lose] += 1
            win_sit.w2_stack[lose] += 1
        elif win == 3:
            wh_w3_stack[lose] += 1
            win_sit.w3_stack[lose] += 1
        elif win == 4:
            wh_w4_stack[lose] += 1
            win_sit.w4_stack[lose] += 1
        elif win == 5:
            wh_w5_stack[lose] += 1
            win_sit.w5_stack[lose] += 1
    elif result =="D":
        if win == 0:
            wh_w0_stack[lose] += 1
            draw_sit.w0_stack[lose] += 1
        elif win == 1:
            wh_w1_stack[lose] += 1
            draw_sit.w1_stack[lose] += 1
        elif win == 2:
            wh_w2_stack[lose] += 1
            draw_sit.w2_stack[lose] += 1
        elif win == 3:
            wh_w3_stack[lose] += 1
            draw_sit.w3_stack[lose] += 1
        elif win == 4:
            wh_w4_stack[lose] += 1
            draw_sit.w4_stack[lose] += 1
        elif win == 5:
            wh_w5_stack[lose] += 1
            draw_sit.w5_stack[lose] += 1
    elif result =="L":
        if win == 0:
            wh_w0_stack[lose] += 1
            lose_sit.w0_stack[lose] += 1
        elif win == 1:
            wh_w1_stack[lose] += 1
            lose_sit.w1_stack[lose] += 1
        elif win == 2:
            wh_w2_stack[lose] += 1
            lose_sit.w2_stack[lose] += 1
        elif win == 3:
            wh_w3_stack[lose] += 1
            lose_sit.w3_stack[lose] += 1
        elif win == 4:
            wh_w4_stack[lose] += 1
            lose_sit.w4_stack[lose] += 1
        elif win == 5:
            wh_w5_stack[lose] += 1
            lose_sit.w5_stack[lose] += 1

for t in range(1,21):
    idx = 39*(t-1)
    record_stack = []
    cnt = 0
    for i in range(idx+38,idx,-1):
        if cnt <= 4:
            record_stack.append(btk_sheet["E{}".format(i)].value)
            cnt += 1
        else:
            check(record_stack,btk_sheet["E{}".format(i)].value)
            record_stack.pop(0)
            record_stack.append(btk_sheet["E{}".format(i)].value)

 

위의 코드를 이용해 단순하게 최근전적을 구분하고 , 해당 최근 전적 이후에 이겼는지 , 졌는지 , 비겼는지를 기준으로 각기 다른 리스트에 저장합니다.

 

어차피 이후 작업은 jupyter notebook 에서 진행할 것이기 때문에 해당 결과로 나온 리스트들을 jupyter notebook에 복사 붙여넣기만 하면 됩니다.

 

발생할 수 있는 최근 전적의 경우는 아래와 같습니다.

 

win 0 -> 5d 0l / 4d 1l / 3d 2l / 2d 3l / 1d 4l / 0d 5l
win 1 -> 4d 0l / 3d 1l / 2d 2l / 1d 3l / 0d 4l
win 2 -> 3d 0l / 2d 1l / 1d 2l / 0d 3l
win 3 -> 2d 0l / 1d 1l / 0d 2l
win 4 -> 1d 0l / 0d 1l
win 5 -> 0d 0l


총 21
개의 경우로 win + draw + lose = 5 이므로 데이터 프레임을 만들 때 draw는 표시하지 않아도 됩니다.

 

따라서 아래에서 데이터 프레임을 만들 때 행과 열을 win 과 lose의 수로 두고 만들었습니다.

 

얻어낸 최근전적별 승리 수 , 패배 수 , 비긴 경기 수 , 전체 최근전적 발생 수를 가지고 한번 최근전적이 다음 경기 결과에 영향이 있는지 알아보도록 하겠습니다.

 

 

 

 


정리

  • EPL 20/21 시즌 가장 많이 나온 최근 5경기 전적은 WIN-2 DRAW-1 LOSE-2 이다.
  • 대부분의 최근 5경기 전적은 이  WIN-2 DRAW-1 LOSE-2 근처를 벗어나지 않는다. ( WIN도 1~3 LOSE도 1~3 )
  • 최근 전적에 승리 수가 많을 수록 , 패배 수가 적을 수록 좋은 경기 성적을 낸 비율이 높아 지는 경향을 보이기는 한다.
  • 하지만 특정 경우에 대해 관측치가 적어 EPL의 다른 시즌에 대한 정보도 알아볼 필요가 있다.
반응형