2024/25 Premier League 시계열 데이터 수집 및 시각화 프로젝트
프리미어리그 공식 API에서 팀 정보와 전체 라운드(1-38) 순위표 데이터를 자동으로 수집하여, 팀별 성적 추이를 시계열로 분석할 수 있는 데이터 파이프라인 및 대시보드 프로젝트입니다.
기존 축구 데이터 서비스는 경기 결과 위주의 단편적 정보만 제공하여, 다음과 같은 한계가 있습니다:
- 팀의 장기적 흐름을 한눈에 파악하기 어려움
- 순위 변동의 맥락과 원인을 이해하기 어려움
- 홈/원정 성적 차이를 시계열로 비교하기 어려움
- 특정 구간에서의 팀 상태(상승세/하락세)를 정량적으로 판단하기 어려움
- 모든 라운드(1-38)의 데이터를 시계열로 재구성하여 팀별 순위 추이를 직관적으로 확인
- Overall, Home, Away 통계를 분리하여 경기 장소별 성적 패턴 분석 가능
- 프리미어리그 공식 API를 활용한 실시간 데이터 수집
- Rate Limit 및 에러 처리를 포함한 안정적인 재시도 로직 구현
- 4개 테이블(teams, overall_stats, home_stats, away_stats)로 정규화
- 엑셀 형식으로 저장하여 Tableau 등 BI 도구와의 연계 용이
- ✅ 팀 정보 수집: 20개 EPL 팀의 기본 정보, 경기장 정보, 로고 URL
- ✅ 순위표 수집: 전체 38라운드의 팀별 순위 및 통계 (Overall/Home/Away)
- ✅ 중복 제거: 경기가 없는 라운드의 중복 데이터 자동 필터링
- ✅ 에러 핸들링: Rate Limit, Network Error 등 예외 상황 대응
- ✅ 타입 안정성: TypedDict 기반 타입 정의로 데이터 구조 명확화
- ✅ 데이터 검증: 팀별 played 값 추적으로 실제 경기 진행 여부 판단
- ✅ 정렬 및 정제: 라운드/순위 기준 자동 정렬
- Python 3.11+: 메인 언어
- Requests: HTTP API 통신
- Pandas: 데이터 처리 및 엑셀 저장
- Rich: CLI 진행 상황 시각화
- Premier League Official API: 실시간 데이터 수집
- Tableau Public: 대시보드 시각화
git clone https://github.com/yourusername/premier-league-table.git
cd premier-league-table# Windows
python -m venv .venv
.venv\Scripts\activate
# macOS/Linux
python3 -m venv .venv
source .venv/bin/activatepip install requests pandas rich openpyxl또는 requirements.txt가 있는 경우:
pip install -r requirements.txtpython src/main.py실행이 완료되면 data/premier_league_table_2024-25.xlsx 파일이 생성됩니다.
═══ Premier League Data Collection (2024/25) ═══
Step 1: 팀 데이터 수집 중...
✓ 완료: 20개 팀 정보 수집
Step 2: 순위표 데이터 수집 중 (1-38 라운드)...
진행 ━━━━━━━━━━━━━━━━━━━━━━━━━━ 100%
✓ 완료: 38개 라운드 데이터 수집
Step 3: 엑셀 파일로 저장 중...
✓ 저장 완료: data/premier_league_table_2024-25.xlsx
• teams: 20개 레코드
• overall_stats: 760개 레코드
• home_stats: 380개 레코드
• away_stats: 380개 레코드
═══ 모든 작업 완료! ═══
premier-league-table/
├── src/
│ └── main.py # 메인 데이터 수집 스크립트
├── data/
│ └── premier_league_table_2024-25.xlsx # 수집된 데이터 (자동 생성)
├── .venv/ # 가상환경 (git 제외)
├── .gitignore
├── README.md
└── requirements.txt # (선택) 의존성 목록
erDiagram
teams ||--o{ overall_stats : "has"
teams ||--o{ home_stats : "has"
teams ||--o{ away_stats : "has"
teams {
INT ID PK
STRING code
STRING short_name
STRING name
STRING county
STRING city
STRING stadium
INT capacity
STRING logo_URL
}
overall_stats {
INT round PK
INT ID FK
INT goals_for
INT goals_against
INT won
INT drawn
INT lost
INT played
INT poINTs
INT position
INT starting_position
}
home_stats {
INT round PK
INT ID FK
INT goals_for
INT goals_against
INT won
INT drawn
INT lost
INT played
INT poINTs
INT position
}
away_stats {
INT round PK
INT ID FK
INT goals_for
INT goals_against
INT won
INT drawn
INT lost
INT played
INT poINTs
INT position
}
- 20개 EPL 팀의 고유 정보, 경기장 정보, 로고 URL 포함
ID를 기준으로 통계 테이블과 조인
- 각 라운드별 팀의 전체 성적 (홈+원정 통합)
starting_position: 해당 라운드 시작 전 순위 (추이 분석용)
- 홈 경기를 진행한 라운드에만 데이터 존재
- 팀별 홈 성적 패턴 분석에 활용
- 원정 경기를 진행한 라운드에만 데이터 존재
- 팀별 원정 성적 패턴 분석에 활용
- ✅ 시계열 완전성: 전체 38라운드의 빠짐없는 데이터 수집
- ✅ 중복 제거: 경기가 없는 라운드의 중복 레코드 자동 필터링
- ✅ 데이터 정합성: Home + Away 통계 합계 = Overall 통계 검증 가능
- ✅ 흐름 중심 분석: 단순 결과 나열을 넘어, 팀의 반등/하락 시점 예측 가능
- ✅ 홈/원정 패턴: 경기 장소별 성적 차이 시각화로 전략적 인사이트 도출
- ✅ 모멘텀 추적: 연속 승리/패배 구간 식별로 팀 컨디션 파악
수집된 데이터를 기반으로 제작된 인터랙티브 대시보드입니다.
- 순위 추이 차트: 시즌 전체 라운드에 걸친 팀별 순위 변화
- 득점/실점 트렌드: 공격력과 수비력의 시계열 변화
- 홈/원정 성적 비교: 경기 장소별 성적 차이 분석
- 모멘텀 지표: 최근 N 라운드 승점 추이
대시보드 링크: Tableau Public에서 보기
class TeamData(TypedDict):
"""팀 정보 데이터 구조"""
ID: int
code: str
short_name: str
name: str
# ...
class StatsData(TypedDict, total=False):
"""통계 데이터 구조"""
round: int
ID: int
goals_for: int
goals_against: int
# ...fetch_with_retry(): Rate Limit 대응 HTTP 요청extract_teams_data(): 팀 정보 추출extract_standings_data(): 순위표 데이터 추출 및 중복 제거save_to_excel(): 4개 테이블을 엑셀로 저장
This project is licensed under the MIT License.
- GitHub: @jaebinary
- Tableau Public: 프로필 링크