2018/19 EPL 데이터 분석

상단사진

Tech Stack

Python
Data Analysis
Data Visualization

Description

평소 관심이 있던 축구 데이터를 직접 분석해보기 위해 2018/19 시즌 잉글랜드 프리미어리그를 주제로 선정했습니다.

해당 시즌은 맨체스터 시티와 리버풀이 각각 98점과 97점을 기록하며 우승 경쟁을 펼친 시즌입니다. 선수 개인 기록을 시각화하는 것에서 출발해 심판의 카드 부여 성향과 팀의 리그 성적에 관련된 지표까지 분석 범위를 확장했습니다.

FootyStats에서 제공하는 리그·경기·선수·팀 단위 CSV 데이터를 Pandas로 가공하고, Matplotlib과 Seaborn을 활용해 분석 결과를 시각화했습니다.

  • 선수·경기·팀·리그 단위로 구성된 2018/19 EPL CSV 데이터 활용
  • 분석 목적에 맞는 열 선택, 정렬, 집계 및 파생변수 생성
  • 공동 순위를 반영한 선수 기록 순위표 생성
  • 경기별 카드 데이터를 심판 단위로 집계하여 성향 비교
  • 팀별 지표의 상관계수 분석과 시즌 성과 시각화

Project Goals

프로젝트는 공식 리그 사이트에서 일반적으로 제공하는 기록 순위를 직접 재현하고, 기존 순위표만으로는 확인하기 어려운 심판과 팀 단위의 특징을 추가로 분석하는 것을 목표로 진행했습니다.

  • 득점·도움·태클·클린시트 등 선수별 기록을 순위표 형태로 재구성
  • 심판별 카드 부여 빈도를 이용해 상대적으로 엄격한 심판 탐색
  • 팀의 최종 리그 순위와 관련성이 높은 공격·수비 지표 분석
  • 맨체스터 시티와 리버풀을 비롯한 20개 팀의 시즌 성과 비교

Data Collection

FootyStats에서 제공하는 2018/19 EPL 데이터를 사용했습니다. 데이터는 분석 단위에 따라 League, Matches, Players, Teams의 네 개 파일로 구성되어 있습니다.

  • League CSV: 전체 경기 수와 리그 평균 득점 등 시즌 단위 지표
  • Matches CSV: 380경기의 홈·원정 팀, 심판, 득점과 카드 기록
  • Players CSV: 570여 명 선수의 소속 팀, 국적, 포지션과 개인 기록
  • Teams CSV: 20개 팀의 승점, 득실, 점유율, 슈팅과 클린시트 기록

Player Ranking

선수별 주요 기록 순위표

EPL 공식 사이트의 선수 기록 순위 화면

EPL 공식 사이트의 통계 페이지를 참고하여 선수 기록을 ‘순위·선수명·소속 클럽·국적·기록’ 형태로 정리했습니다.

어떤 기록 열을 입력하더라도 동일한 형식의 순위표를 생성할 수 있도록 organize_data 함수를 작성했습니다.

  • 선수명·소속 클럽·국적과 분석 대상 기록을 Players 데이터에서 추출
  • 선택한 기록을 기준으로 내림차순 정렬
  • 동일한 기록을 가진 선수에게 같은 순위를 부여하는 공동 순위 로직 구현
  • 함수의 입력 열을 변경해 득점·도움·태클 등 여러 기록에 재사용할 수 있도록 구성
EPL 공식 사이트의 선수 기록 순위 화면

득점 기록에 함수를 적용한 결과 사디오 마네, 모하메드 살라와 피에르에메릭 오바메양이 각각 22골로 공동 1위에 해당하는 것을 확인했습니다.

Referee Analysis

경기당 카드 수를 활용한 심판 성향 비교

심판이 담당한 경기에서 홈·원정 팀에 부여한 옐로카드와 레드카드를 합산하고, 이를 담당 경기 수로 나누어 심판별 경기당 평균 카드 수를 계산했습니다.

경기당 카드 수를 판정 성향을 살펴보기 위한 간단한 대리지표로 사용하여 어떤 심판이 상대적으로 카드를 자주 부여했는지 비교했습니다.

심판별 경기당 카드 수 산출 방식
  • 380경기의 심판명과 홈·원정 팀 카드 기록 추출
  • Dictionary를 활용해 심판별 전체 카드 수와 담당 경기 수 누적
  • 전체 카드 수를 담당 경기 수로 나누어 경기당 평균 카드 수 계산
  • 계산 결과를 DataFrame으로 변환하고 평균 카드 수 기준으로 정렬
Mike Dean의 EPL 통산 레드카드 100장 기록 관련 자료

분석 결과 Mike Dean이 경기당 약 4.97장으로 가장 높은 카드 수를 기록했습니다. Roger East가 4.40장, Craig Pawson이 약 3.81장으로 뒤를 이었습니다.

Mike Dean의 EPL 통산 레드카드 100장 기록 관련 자료

Mike Dean은 EPL에서 최초로 레드카드 100장을 부여한 심판으로 알려져 있어, 데이터에서 나타난 높은 카드 부여 빈도와 실제 심판 성향에 관한 기록을 함께 비교했습니다.

Team Performance Analysis

팀의 리그 성과와 관련된 요인 분석

맨체스터 시티와 리버풀이 다른 팀보다 높은 성과를 기록한 요인을 살펴보기 위해 리그 순위와 관련성이 있을 것으로 예상되는 팀별 지표를 선정하고 상관계수를 분석했습니다.

  • 리그 순위·경기당 승점·득점·실점·득실 차·클린시트 데이터 선택
  • 평균 점유율·전체 슈팅·유효 슈팅 등 경기력 관련 지표 추가
  • Seaborn Heatmap을 활용해 변수 간 상관계수 시각화
  • 리그 순위와 실점처럼 낮을수록 좋은 변수를 동일한 방향으로 변환

Direction Normalization

원래 리그 순위와 실점은 값이 낮을수록 좋은 지표인 반면, 승점·득점·득실 차 등은 높을수록 좋은 지표입니다.

상관계수를 직관적으로 해석할 수 있도록 리그 순위를 ‘20 - 기존 순위’로, 실점을 음수 값으로 변환하여 모든 지표가 높을수록 좋은 성과를 의미하도록 방향을 통일했습니다.

  • new_league_position = 20 - league_position
  • new_goals_conceded = -goals_conceded
  • 변환한 지표를 기준으로 상관계수 행렬 재계산

Correlation Results

변환된 리그 순위와 가장 높은 상관관계를 보인 지표는 경기당 승점과 득실 차였습니다.

  • 경기당 승점과 변환된 리그 순위의 상관계수: 약 0.954
  • 득실 차와 변환된 리그 순위의 상관계수: 약 0.944
  • 득점과 변환된 리그 순위의 상관계수: 약 0.900
  • 실점 변환값과 변환된 리그 순위의 상관계수: 약 0.906

경기당 승점은 리그 순위를 직접 결정하는 누적 승점에서 파생된 지표이므로 높은 상관관계가 자연스럽게 나타납니다. 따라서 실질적인 팀 경기력 비교에서는 공격과 수비 성과를 함께 반영하는 득실 차를 주요 축으로 함께 활용했습니다.

Team Performance Map

산점도 그래프

경기당 승점과 득실 차를 각각 좌표축으로 설정하고 20개 팀을 산점도에 배치했습니다. 점의 색상에는 변환된 리그 순위를 반영하여 각 팀의 성과를 한 화면에서 비교할 수 있도록 구성했습니다.

시각화 결과 맨체스터 시티와 리버풀이 다른 팀들과 분리된 최상위 영역에 위치하면서, 해당 시즌의 치열했던 양강 구도가 뚜렷하게 나타났습니다.

  • X축: 경기당 승점
  • Y축: 시즌 득실 차
  • 점의 색상: 최종 리그 순위
  • 각 좌표에 팀명을 표시하여 20개 팀의 상대적 위치 비교

Data Interpretation

프로젝트를 수행하며 단순히 그래프를 생성하는 것보다 데이터가 수집된 시점과 각 지표의 정확한 정의를 파악하는 과정이 중요하다는 점을 확인했습니다.

EPL 원본 데이터의 다양한 항목
  • 원본 데이터에서 분석에 필요한 열을 선별하고 목적에 맞게 가공하는 데 많은 시간이 필요함을 경험
  • 동일한 명칭의 지표라도 데이터 제공처마다 집계 대상과 정의가 다를 수 있음을 발견
  • 정확한 분석을 위해 데이터의 기준 시점과 메타데이터를 함께 확인해야 한다는 점을 학습
  • 선수 이적 이후 공식 사이트의 현재 소속 팀 정보가 과거 시즌 데이터와 달라질 수 있음을 확인(Ex_ Eden Hazard)
선수 이적에 따라 현재 소속 팀이 변경된 사례

Limitations & Improvements

본 프로젝트는 데이터 분석과 시각화의 기초를 익히기 위한 탐색적 분석으로, 상관관계를 특정 요인이 승리의 원인이라는 인과관계로 해석하지 않았습니다.

  • 경기당 승점은 최종 순위와 직접 연결된 지표이므로 독립적인 경기력 요인으로 해석하기 어려움
  • 리그에 참여한 팀이 20개뿐이므로 상관계수의 안정성을 일반화하기 어려움
  • 심판별 담당 경기 수가 달라 소수 경기만 담당한 심판의 평균값이 크게 변할 수 있음
  • 옐로카드와 레드카드의 가중치를 동일하게 합산하여 카드의 심각도를 반영하지 못함
  • 심판 성향 분석에 경기 강도·더비 여부·팀 반칙 수 등의 변수가 포함되지 않음
  • 팀별 시즌 집계 데이터만 사용해 경기별 변화와 홈·원정 효과를 분석하지 못함

향후에는 심판별 최소 담당 경기 수를 설정하고 카드 종류에 가중치를 부여하는 방식으로 성향 지표를 개선할 수 있습니다. 또한 경기 단위 데이터를 활용해 홈·원정, 상대 팀 수준과 경기 시점 등을 포함한 회귀 분석으로 확장할 수 있습니다.

What I Learned

  • Pandas를 활용한 CSV 데이터 탐색·정렬·집계 및 파생변수 생성
  • 함수화를 통해 여러 선수 기록에 재사용할 수 있는 순위 처리 로직 구현
  • Matplotlib과 Seaborn을 활용한 순위표·산점도·히트맵 시각화
  • 상관계수의 방향을 올바르게 해석하기 위한 변수 전처리
  • 데이터의 최신성과 지표 정의가 분석 결과에 미치는 영향 이해
  • 관심 분야의 질문을 데이터 분석 문제로 구체화하고 결과를 해석하는 경험

Repository

저장소에는 전체 분석 과정과 해석을 기록한 Jupyter Notebook, 2018/19 시즌의 리그·경기·선수·팀 CSV 데이터 및 참고 이미지가 포함되어 있습니다.


    Jihoon Han - AI & Software Engineer