[제로베이스 데이터 취업 스쿨] 9기 – EDA4: 역대(1976-2008) 하계 올림픽 메달리스트 데이터

Inhee Kim·2023년 2월 25일
0

Project

목록 보기
6/8
post-thumbnail
post-custom-banner

1. 데이터 설명

참고

  • 해당 데이터는 공식 데이터(국제스포츠정보센터)와 차이가 있음.

    • 대한민국 데이터 누락예시: 2008년 베이징올림픽 역도 48kg 은메달 임정화 누락
  • 복식/단체 종목의 경우 한 종목에서 여러명이 메달을 획득하지만, 국가 순위 집계시 1개로 집계됨

    • 동일 종목인 경우 1개로 계산하는 것이 용이
    • 단, 3,4위 모두에 동메달을 주는 경우 한 나라에서 동메달 2개 획득시 문제 발생
      - 대한민국 사례: 1992년 바르셀로나 올림픽 실제 탁구 남성복식 2팀 준결승 진출로 및 패배로 동메달 2개 획득
      - 당시 준결승 진출시 동메달 수여, 총 4명
      -> 이 자료에서는 누가 누구와 복식조를 이뤘는지 구분할 수 없으며 동일종목이므로 이 자료로 국가 순위 집계시 문제 발생
      - 참고: 현재 올림픽 탁구 복식 4위에게는 동메달을 수여하지 않음
  • 올림픽 메달 취소 등 반영 안되어있음

  • 복식/단체 종목의 선수 수, 당시 메달 수여 룰, 메달 취소 및 승격/승계 등의 실제 메타데이터가 없이는 확인 어려움

  • 이러한 이유로 해당 자료 자체만으로 진행 할 예정이며, 국가별 메달 집계시 동일종목당 1개의 메달로 계산하고자 함

2. Load Data & Preprocessing

1) Target data 가져오기

# Load DataFrame
import pandas as pd

df_target = pd.read_csv('./datas/Summer-Olympic-medals-1976-to-2008.csv', encoding = 'ISO-8859-1')
df_target.head()

2) Preprocessing: missing data 처리

  • 조건1: missing data가 있다면, 해당 row(행) 삭제(drop)
  • 조건2: Index를 초기화(reset)하고, 기존 Index 삭제(drop)
# 컬럼별 Missing data 확인
df_target.isnull().sum()

# Missing이 있는 행 삭제
df_target = df_target.dropna(axis = 0)

# index 초기화, 기존 index 삭제
df_target = df_target.reset_index(drop = True)
df_target.head(2)

3) Preprocessing: Data type 정리

  • 조건1: float data는 int로 변경
  • 조건2: float data외의 모든 데이터가 string 인지 확인
df_target.info()

# float data를 int로 변경
df_target = df_target.astype({'Year' : int})
df_target.dtypes

3. 원하는 Data로 가공

1) 2008년 대한민국 메달리스트 찾기

  • 2008년 베이징 올림픽 양궁 종목에서 금메달을 획득한 선수들을 찾기
    • 조건1: 2008년 베이징 올림픽 양궁 종목의 금메달리스트만 있는 DataFrame을 만들기
df_target.head(2)

df_target['City'].unique()

df_target['Sport'].unique()

df_2008_Archery_GoldMedal = df_target[(df_target['City'] == 'Beijing') &
                                      (df_target['Year'] == 2008) &
                                      (df_target['Sport'] == 'Archery') &
                                      (df_target['Medal'] == 'Gold') &
                                      (df_target['Country_Code'] == 'KOR')]
df_2008_Archery_GoldMedal.head(2)

2) 대한민국 역대(1976-2008) 하계 올림픽 메달 획득 내역 확인

  • 문제 1에서 만든 DataFrame과 Pandas 기능을 활용하여 아래 예시와 같은 형태의 대한민국 역대 메달 획득 내역 만들기
    • 조건1: Index는 Year - Medal로 보여주기(아래 예시 참고)
    • 조건2: Index에서 Year는 내림차순, Medal은 Gold-Silver-Bronze 순으로 보여주기
df_KOR_Medal = df_target[df_target['Country_Code'] == 'KOR']
df_KOR_Medal.head(2)

# 내용 일치 데이터 삭제 - 선수명(Athlete)과 성별(Gender)를 제외한 내용이 일치할 경우 같은 경기에서 획득한 메달로 간주
df_KOR_Medal.drop_duplicates(subset = ['City','Year', 'Sport', 'Discipline',
                                       'Event', 'Country_Code', 'Country',
                                       'Event_gender', 'Medal'])
from pandas.api.types import CategoricalDtype

cat_sort_medal = CategoricalDtype(['Gold', 'Silver', 'Bronze'], ordered=True)
df_KOR_Medal['Medal'] = df_KOR_Medal['Medal'].astype(cat_sort_medal)
df_KOR_Medal['Medal']

pivot1 = df_KOR_Medal.pivot_table(index = ['Year', 'Medal'],
                         values = ['City'],
                         aggfunc = len,
                        )
pivot1 = pd.DataFrame(pivot1)
pivot1

3) 1996년 애틀란타 올림픽 총 메달 개수 기준 상위 10개 국가 확인

  • 조건1: Index는 앞선 단계에서 Preprocessing한 Data의 Index 그대로 놔두기
  • 조건2: 총 메달 개수로 오름차순 정렬 후 상위 10개 국가만 나타내는 DataFrame을 만들기
  • 조건3: 결과 DataFrame의 Columns은 ['Country', 'Medal']
df_1996_Atlanta = df_target[df_target['Year'] == 1996]
df_1996_Atlanta.head(2)

# 내용 일치 데이터 삭제 - 선수명(Athlete)과 성별(Gender)를 제외한 내용이 일치할 경우 같은 경기에서 획득한 메달로 간주
df_1996_Atlanta.drop_duplicates(subset = ['City','Year', 'Sport', 'Discipline',
                                          'Event', 'Country_Code', 'Country',
                                          'Event_gender', 'Medal'])
Atlanta_medal_cnt = df_1996_Atlanta.groupby(['Country'])['Medal'].count().reset_index(name = 'Medal')
Atlanta_medal_cnt = Atlanta_medal_cnt.sort_values(by = 'Medal', ascending = False)
Atlanta_medal_cnt.head(10)

4) 1996년 애틀란타 올림픽 금매달 개수 기준 상위 10개 국가 확인

  • 조건1: 'Gold', 'Silver', 'Bronze' 컬럼을 만들고, 해당 Row(행)의 Medal 이 Gold면 'Gold' 컬럼에 1, Silver면 'Silver' 컬럼에 1, 'Bronze'면 'Bronze'컬럼에 1을 입력
  • 조건2: Index는 앞선 단계에서 Preprocessing한 Data의 Index 그대로 놔두기
  • 조건3: 금메달 개수로 내림차순 정렬 후 상위 10개 국가만 나타내는 DataFrame을 만드세요.
    만약 금메달 개수가 같다면, 은메달 개수가 많은 국가가 더 높은 순위이며 은메달 개수도 같다면 동메달 개수가 더 많은 국가가 상위
  • 조건4: 결과 DataFrame의 Columns은 ['Country', 'Gold', 'Silver', 'Bronze']
df_1996_Atlanta.head(2)

from pandas.api.types import CategoricalDtype

cat_sort_medal = CategoricalDtype(['Gold', 'Silver', 'Bronze'], ordered=True)
df_1996_Atlanta['Medal'] = df_1996_Atlanta['Medal'].astype(cat_sort_medal)
df_1996_Atlanta['Medal']

Atlanta_medal_cnt2 = df_1996_Atlanta.groupby(['Country', 'Medal']).count()
Atlanta_medal_cnt2

Atlanta_medal_cnt2 = Atlanta_medal_cnt2.reset_index()
Atlanta_medal_cnt2

Atlanta_medal_cnt2.drop(['Year', 'Sport', 'Discipline', 'Event',
                         'Athlete', 'Gender', 'Country_Code', 'Event_gender'],
                        axis = 1,
                        inplace = True)
Atlanta_medal_cnt2.head()

Atlanta_medal_cnt2 = Atlanta_medal_cnt2.pivot(index = 'Country', columns = 'Medal', values = 'City')
Atlanta_medal_cnt2.head()

Atlanta_medal_cnt2.info()

Atlanta_medal_cnt2 = Atlanta_medal_cnt2.reset_index()
Atlanta_medal_cnt2.head()

Atlanta_medal_cnt2 = Atlanta_medal_cnt2.sort_values(by = 'Gold', ascending = False)
Atlanta_medal_cnt2.head()

profile
Date Scientist & Data Analyst
post-custom-banner

0개의 댓글