| Week | Data Analysis | Difficulty | This Notebook |
|---|---|---|---|
| 1 | 서울시 인구 데이터 | ⭐️ | |
| 2 | 화장품 성분 데이터 | ⭐️⭐️⭐️ | |
| 3 | 올림픽 데이터 | ⭐️⭐️ | 👈 |
| 4 | 국가별 인터넷 사용률 데이터 | ⭐️⭐️ | |
| 5 | 전국 박물관/미술관 정보 표준 데이터 | ⭐️⭐️⭐️ | |
| 6 | 서울시 흡연율 통계 데이터 | ⭐️⭐️ | |
| 7 | 웹크롤링 | ⭐️ | |
| 8 | 서울시 지하철 호선별 역별 유/무임 승하차 인원 정보 데이터 | ⭐️⭐️ | |
| 9 | 서울시 교통사고 현황 (사고유형별) 통계 데이터 | ⭐️⭐️ | |
| 10 | 서울시 교통사고 현황 (사고유형별) 통계 + 서울시 차량통행속도 (구별/월별) 통계 + 서울시 인구밀도 (구별) 통계 | ⭐️⭐️⭐️ |
해당 데이터는 공식 데이터(국제스포츠정보센터)와 차이가 있음.
복식/단체 종목의 경우 한 종목에서 여러명이 메달을 획득하지만, 국가 순위 집계시 1개로 집계됨
올림픽 메달 취소 등 반영 안되어있음
복식/단체 종목의 선수 수, 당시 메달 수여 룰, 메달 취소 및 승격/승계 등의 실제 메타데이터가 없이는 확인 어려움
이러한 이유로 해당 자료 자체만으로 Test 진행 할 예정이며, 국가별 메달 집계시 동일종목당 1개의 메달로 계산
위에 제시된 링크 혹은 datas 폴더에 있는 데이터(Summer-Olympic-medals-1976-to-2008.csv)를 Pandas DataFrame으로 읽어 오세요.

완료 후 결과 dataframe 변수를 check_01_01 함수에 입력하여 채점하세요.
# 1-1
import pandas as pd
from grading import *
df_target =pd.read_csv("./datas/Summer-Olympic-medals-1976-to-2008.csv", encoding="latin-1")
df_target

1-1에서 읽은 Data에는 missing data가 있습니다. missing data를 확인하고 처리하세요.
완료 후 결과 dataframe 변수를 check_01_02 함수에 입력하여 채점하세요.
# 1-2
df_target.info()

# missing data 존재 시 row 삭제
df_target.dropna(axis=0, inplace=True)
# index 초기화
df_target.reset_index(drop=True, inplace=True)
df_target

1-2에서 만든 DataFrame을 아래의 조건에 따라 데이터의 타입을 확인하고 변경해주세요.
완료 후 결과 dataframe 변수를 check_01_03 함수에 입력하여 채점하세요.
df_target.info()

df_target["Year"] = df_target["Year"].astype("Int64")
문제 1에서 만든 DataFrame을 이용하여 2008년 베이징 올림픽 양궁 종목에서 금메달을 획득한 선수들을 찾아보세요.

참고: 추후 문제풀이시 문제 없게 하기 위해서 현재데이터를 deep copy하여 진행하시는 것을 추천드립니다.
하지 않아도 문제는 없으나 코드 작성 방법에 따라 다음 문제 풀이시 다시 load하고 전처리 진행해야 할 수도 있습니다.
완료 후 결과 dataframe 변수를 check_02_01 함수에 입력하여 채점하세요.
# 2-1
import copy
df = df_target.copy()
df_archery = df[(df["City"]=="Beijing") &
(df["Year"]==2008) &
(df["Sport"]=="Archery") &
(df["Country_Code"]=="KOR") &
(df["Medal"]=="Gold")
]
df_archery

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

hint1: 앞서 이야기 한 바와 같이, 메달 숫자는 복식/단체 종목을 감안하여 선수명(Athlete)과 성별(Gender)를 제외한 내용이 일치할 경우 같은 경기에서 획득한 메달로 간주하시면 됩니다.
hint2: 내용이 일치하는 데이터를 삭제하기 위한 방법은 drop_duplicate, groupby, pivot_table 등 다양한 방법이 있습니다.
hint3: Medal Index의 정렬 순서를 'Gold'-'Silver'-'Bronze'로 하기 위해서 sort_index의 'key' argument에 dictionary를 활용할 수 있습니다.
참고1: 예시와 같이 컬럼명은 City 등 아무 컬럼명이든 상관 없습니다. 하나의 컬럼만 보여주세요.
참고2: 추후 문제풀이시 문제 없게 하기 위해서 현재데이터를 deep copy하여 진행하시는 것을 추천드립니다.
참고3: 대한민국은 1980년 모스크바 올림픽에 참가하지 않았습니다.
완료 후 결과 dataframe 변수를 check_02_02 함수에 입력하여 채점하세요.
# 2-2
# df_target 데이터 중 한국 데이터만 copy
df_kor = df_target[(df_target['Country_Code'] == 'KOR')].copy()
# 중복 데이터 제거
df_kor = df_kor.drop_duplicates(["City","Year","Sport","Discipline","Event",
"Country_Code","Country","Event_gender","Medal"])
# pivot_table로 원하는 형태 설정
df_kor = df_kor.pivot_table(index=["Year","Medal"], values ='City', aggfunc="count")
# Medal Index 정렬 순서 지정
df_kor = df_kor.reindex(['Gold', 'Silver', 'Bronze'], level=1)
df_kor

문제 1에서 만든 DataFrame과 Pandas 기능을 활용하여 아래 예시와 같은 형태의 총 메달 개수 기준 상위 10개국 내역을 만들어주세요.
조건1: Index는 앞선 1단계에서 Preprocessing한 Data의 Index 그대로 나두어 주세요.
조건2: 총 메달 개수로 오름차순 정렬 후 상위 10개 국가만 나타내는 DataFrame을 만드세요.
조건3: 결과 DataFrame의 Columns은 ['Country', 'Medal'] 입니다.
- 예시: 1992년 바르셀로나 올림픽 총 메달 개수에 따른 상위 10개 국가

hint1: 앞서 이야기 한 바와 같이, 메달 숫자는 복식/단체 종목을 감안하여 선수명(Athlete)과 성별(Gender)를 제외한 내용이 일치할 경우 같은 경기에서 획득한 메달로 간주하시면 됩니다.
hint2: 내용이 일치하는 데이터를 삭제하기 위한 방법은 drop_duplicate, groupby, pivot_table 등 다양한 방법이 있습니다.
hint3: Groupby, Pivot_table 등의 기능을 활용하는 경우 'as_index' 혹은 'index'와 같은 argument를 활용하세요
참고: 추후 문제풀이시 문제 없게 하기 위해서 현재데이터를 deep copy하여 진행하시는 것을 추천드립니다.
완료 후 결과 dataframe 변수를 check_02_03 함수에 입력하여 채점하세요.
# 2-3
df_rank = df_target[df_target["Year"]==1996].copy()
df_rank = df_rank.drop_duplicates(["City","Year","Sport","Discipline","Event",
"Country_Code","Country","Event_gender","Medal"])
df_rank = df_rank.groupby(['Country'], as_index=False)['Medal'].count()
df_rank_10 = df_rank.sort_values(by='Medal', ascending=False)[:10]
df_rank_10

문제 1에서 만든 DataFrame과 Pandas 기능을 활용하여 아래 예시와 같은 형태의 금메달 개수 기준 상위 10개국 내역을 만들어주세요.
조건1: 'Gold', 'Silver', 'Bronze' 컬럼을 만들고, 해당 Row(행)의 Medal 이 Gold면 'Gold' 컬럼에 1, Silver면 'Silver' 컬럼에 1, 'Bronze'면 'Bronze'컬럼에 1을 입력하세요
조건2: Index는 앞선 1단계에서 Preprocessing한 Data의 Index 그대로 나두어 주세요.
조건3: 금메달 개수로 내림차순 정렬 후 상위 10개 국가만 나타내는 DataFrame을 만드세요.
조건4: 결과 DataFrame의 Columns은 ['Country', 'Gold', 'Silver', 'Bronze'] 입니다.
- 예시: 1992년 바르셀로나 올림픽 총 메달 개수에 따른 상위 10개 국가

hint1: 앞서 이야기 한 바와 같이, 메달 숫자는 복식/단체 종목을 감안하여 선수명(Athlete)과 성별(Gender)를 제외한 내용이 일치할 경우 같은 경기에서 획득한 메달로 간주하시면 됩니다.
hint2: 내용이 일치하는 데이터를 삭제하기 위한 방법은 drop_duplicate, groupby, pivot_table 등 다양한 방법이 있습니다.
hint3: Groupby, Pivot_table 등의 기능을 활용하는 경우 'as_index' 혹은 'index'와 같은 argument를 활용하세요
완료 후 결과 dataframe 변수를 check_02_04 함수에 입력하여 채점하세요.
# 2-4
import numpy as np
df_rank = df_target[df_target["Year"]==1996].copy()
df_rank = df_rank.drop_duplicates(["City","Year","Sport","Discipline","Event",
"Country_Code","Country","Event_gender","Medal"])
df_rank["Gold"] = np.NaN
df_rank["Silver"] = np.NaN
df_rank["Bronze"] = np.NaN
for idx, row in df_rank.iterrows():
if row["Medal"] == "Gold" :
df_rank.at[idx,"Gold"] = 1
elif row["Medal"] == "Silver" :
df_rank.at[idx,"Silver"] = 1
elif row["Medal"] == "Bronze" :
df_rank.at[idx,"Bronze"] = 1
df_rank_10 = df_rank[["Country","Gold","Silver","Bronze"]].groupby("Country",as_index=False).sum()
df_rank_10 = df_rank_10.sort_values(by=["Gold","Silver","Bronze"], ascending=False)[:10]
df_rank_10["Gold"] = df_rank_10["Gold"].astype("Int64")
df_rank_10["Silver"] = df_rank_10["Silver"].astype("Int64")
df_rank_10["Bronze"] = df_rank_10["Bronze"].astype("Int64")
df_rank_10
