데이터 분석이란?
데이터 분석은 주어진 자료를 가공하여 원하는 정보와 결론을 얻어내는 일련의 처리 과정을 의미합니다.
데이터 분석은 보통 아래의 단계로 이루어집니다.
- 주제 선정
- 데이터 구조 파악
- 데이터 전처리
- 데이터 분석 구현
주제 선정
어떤 데이터를 선정할 지, 데이터에서 어떤 가설을 세우고 분석을 시작할 지, 어떤 결론을 원하는 지 등 데이터 분석의 목적을 세웁니다.
데이터 구조 파악
데이터를 분석하기 위해서, 데이터가 저장된 형태와 자료형, 변수 이름 등을 미리 파악해야 합니다.
또는 데이터 프레임에 통계량 함수를 적용하여, 데이터의 분포도나 성향 등을 파악할 수 있습니다.
데이터 전처리
데이터를 분석하기 전, 필요한 변수만을 추출하거나 기존의 변수로 새로운 변수를 계산하여 만들기도 합니다.
데이터의 결측값과 이상값이 있다면, 이 단계에서 올바르게 제거하여야 데이터 분석 결과를 올바르게 확인할 수 있습니다.
데이터 분석
주제 선정 단계에서 세운 가설을 numpy, pandas 등으로 데이터를 연산, 가공하여 가설을 입증하거나 원하는 정보를 얻어내는 것을 구현 하는 단계입니다.
얻어낸 정보를 효과적으로 보여주기 위해 시각화를 하기도 합니다.
실습에서 주어지는 월드컵 데이터 셋 WorldCups.csv의 칼럼은 다음과 같습니다.
출처 : https://www.kaggle.com/abecklas/fifa-world-cup
변수명의미예시Year | 개최 연도 | 1930 |
Country | 개최 국가 | Uruguay |
Winner | 우승 국가 | Uruguay |
Runners-Up | 준우승 국가 | Argentina |
Third | 3위 국가 | USA |
Fourth | 4위 국가 | Yugoslavia |
GoalsScored | 총 득점 수 | 70 |
QualifiedTeams | 참가 국가 수 | 13 |
MatchesPlayed | 총 경기 수 | 18 |
Attendance | 총 관중 | 590549 |
역대 월드컵 대회들의 총 관중을 데이터 프레임으로 출력해보도록 하겠습니다.
Q1.
WorldCups.csv파일을 pandas의 DataFrame으로 만들어보세요.
Q2.
만든 데이터 프레임의 칼럼 중 Year 와
Attendance 칼럼만 추출하여 출력해보세요.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
'''
출력 형식을 위한 스켈레톤 코드입니다.
아래 줄 부터 문제에 맞는 코드를 작성해주세요.
'''
world_cups = pd.read_csv("WorldCups.csv")
world_cups = world_cups[['Year', 'Attendance']]
print(world_cups)
Year Attendance
0 1930 590549
1 1934 363000
2 1938 375000
3 1950 1045246
4 1954 768607
5 1958 819810
6 1962 893172
7 1966 1563135
8 1970 1603975
9 1974 1865753
10 1978 1545791
11 1982 2109723
12 1986 2394031
13 1990 2516215
14 1994 3587538
15 1998 2785100
16 2002 2705197
17 2006 3359439
18 2010 3178856
19 2014 3386810
20 2018 3031768
코드 실행이 완료되었습니다.
matplotlib의 plot 함수를 통해 월드컵 대회의 개최 연도를 x축, 관중 수를 y축으로 한 꺾은선 그래프를 그렸습니다.
plt.plot(world_cups['Year'], world_cups['Attendance'], marker='o', color='black')
plt.savefig("image.svg", format="svg")
elice_utils.send_image("image.svg")
역대 월드컵의 경기당 득점 수
역대 월드컵 중 가장 공격적인 축구가 펼쳐졌던 대회는 언제였을까요?
이를 알기 위해 역대 월드컵의 경기당 득점 수를 계산해보고자 합니다.
월드컵 대회들의 연도, 경기 수, 득점 수, 경기당 득점 수를 출력해보도록 하겠습니다.
Year GoalsScored MatchesPlayed GoalsPerMatch
0 1930 70 18 3.888889
1 1934 70 17 4.117647
2 1938 84 18 4.666667
3 1950 88 22 4.000000
4 1954 140 26 5.384615
5 1958 126 35 3.600000
6 1962 89 32 2.781250
7 1966 89 32 2.781250
8 1970 95 32 2.968750
9 1974 97 38 2.552632
10 1978 102 38 2.684211
11 1982 146 52 2.807692
12 1986 132 52 2.538462
13 1990 115 52 2.211538
14 1994 141 52 2.711538
15 1998 171 64 2.671875
16 2002 161 64 2.515625
17 2006 147 64 2.296875
18 2010 145 64 2.265625
19 2014 171 64 2.671875
20 2018 169 64 2.640625
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
'''
출력 형식을 위한 스켈레톤 코드입니다.
아래 줄 부터 문제에 맞는 코드를 작성해주세요.
'''
world_cups = pd.read_csv("./WorldCups.csv")
# print(world_cups)
world_cups = world_cups[['Year', 'GoalsScored', 'MatchesPlayed']]
# print(world)cups)
goalspermatch = world_cups["GoalsScored"] / world_cups["MatchesPlayed"]
world_cups["GoalsPerMatch"] = goalspermatch
print(world_cups)
역대 월드컵의 경기당 득점 수
변수 world_cups에 WorldCups.csv를 데이터 프레임으로 저장하였는데요,
world_cups를 이용하여 역대 월드컵의 경기 수와 득점 수를 그래프로 출력해보도록 하겠습니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
world_cups = pd.read_csv("WorldCups.csv")
'''
출력 형식을 위한 스켈레톤 코드입니다.
아래 줄 부터 문제에 맞는 코드를 작성해주세요.
'''
world_cups = world_cups[['Year', 'GoalsScored', 'MatchesPlayed']]
world_cups["GoalsPerMatch"] = world_cups["GoalsScored"] / world_cups["MatchesPlayed"]
# 첫 번째 그래프 출력
fig, axes = plt.subplots(1, 2, figsize=(8, 4))
axes[0].bar(x=world_cups['Year'], height=world_cups['GoalsScored'], color='grey', label='goals')
axes[0].plot(world_cups['Year'], world_cups['MatchesPlayed'], marker='o', color='blue', label='matches')
axes[0].legend(loc='upper left')
# 두 번째 그래프 출력
axes[1].grid(True)
axes[1].plot(world_cups['Year'], world_cups['GoalsPerMatch'], marker='o', color='red', label='goals_per_matches')
axes[1].legend(loc='lower left')
plt.savefig("image.svg", format="svg")
elice_utils.send_image("image.svg")
월드컵 매치 데이터 전처리
저장된 데이터 중 이상값, 결측값, 변경되어야 하는 값이 있을 경우 정제를 해야 합니다. 이를 ‘데이터 전처리‘ 라고 합니다.
WorldCupMatches.csv 파일에는 일부 이상값이 있기 때문에 전처리하도록 하겠습니다.
Q1
데이터 전처리를 위해 데이터 프레임의 일부 값을 replace 함수를 사용해 교체해줍니다.
Q2
위 코드로 데이터 프레임에 중복된 데이터가 얼마나 있는지 확인할 수 있습니다.
확인 결과 중복된 데이터가 16개 있으므로
world_cups_matches = world_cups_matches.drop_duplicates()
로 중복값을 제거해야 합니다.
import pandas as pd
import numpy as np
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
'''
출력 형식을 위한 스켈레톤 코드입니다.
아래 줄 부터 문제에 맞는 코드를 작성해주세요.
'''
world_cups_matches = pd.read_csv("./WorldCupMatches.csv")
world_cups_matches = world_cups_matches.replace("Germany FR", "Germany")
# print(world_cups_matches)
dupli = world_cups_matches.duplicated()
# print(len(dupli[dupli==True])) # 16
world_cups_matches = world_cups_matches.drop_duplicates()
Brazil 0 3 Netherlands 68034.0 0 2 HAIMOUDI Djamel (ALG) ACHIK Redouane (MAR) ETCHIALI Abdelhak (ALG) 255957 300186502 BRA NED
851 2014 13 Jul 2014 - 16:00 Final Estadio do Maracana Rio De Janeiro Germany 1 0 Argentina Germany win after extra time 74738.0 0 0 Nicola RIZZOLI (ITA) Renato FAVERANI (ITA) Andrea STEFANI (ITA) 255959 300186501 GER ARG
이런식으로 나옴
국가별 득점 수 구하기
축구 경기는 골을 상대방보다 많이 넣어야 이길 수 있습니다.
축구팀의 성패를 결정짓는 가장 중요한 실력은 득점력인데요,
역대 월드컵 경기를 통틀어 가장 많은 골을 넣은 국가는 어디였는지 출력해보도록 하겠습니다.
WorldCupMatches.csv파일에 역대 월드컵 경기의 기록이 담겨 있습니다.
해당 csv파일의 칼럼의 의미는 마크다운 문서를 참고해주세요.
각 국가들이 기록한 득점 수를 내림차순으로 정렬한 결과를 출력해보세요.
Q1.
이전에 전처리한 WorldCupMatches.csv파일이 주어집니다.
Q2.
전처리를 거친 데이터 프레임에서 홈 팀 득점을 나타내는 home 데이터 프레임과, 어웨이 팀 득점을 나타내는 away 데이터 프레임을 각각 만들어보고자 합니다.
Home Team Name으로 그룹을 묶고, Home Team Goals 칼럼을 추출하여 home에 저장합니다.
Away Team Name으로 그룹을 묶고, Away Team Goals 칼럼을 추출하여 away에 저장합니다.
Q3.
concat 메소드를 이용하여 home, away 데이터 프레임을 하나로 합치고, goal_per_country라는 새로운 데이터프레임에 저장하도록 하겠습니다.
그리고 결측값을 제거하기 위해 fillna 함수를 적용합니다.
Q5
goal_per_country 데이터 프레임에 새로운 칼럼 “Goals”를 만들도록 하겠습니다.
Home Team Goals와 Away Team Goals 를 덧셈 연산한 값을 Goals에 저장합니다.
Q6
goal_per_country 에서 Goals 칼럼만 추출하고, 내림차순으로 정렬합니다.
(이 때, goal_per_country는 시리즈 데이터가 됩니다.)
Q7
저장된 값의 dtype를 정수형으로 바꿉니다.
goal_per_country 데이터 프레임을 출력하여 값을 확인하고 제출해보세요.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()
import preprocess
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
'''
출력 형식을 위한 스켈레톤 코드입니다.
아래 줄 부터 문제에 맞는 코드를 작성해주세요.
'''
world_cups_matches = preprocess.world_cups_matches
home = world_cups_matches.groupby(["Home Team Name"])["Home Team Goals"].sum()
away = world_cups_matches.groupby(["Away Team Name"])["Away Team Goals"].sum()
goal_per_country = pd.concat([home, away], axis = 1, sort = True).fillna(0)
print(goal_per_country)
첫부분 코드 블록이다. Q3까지 하면 goal_per_country는 다음과 같다.
Home Team Goals Away Team Goals
Algeria 5.0 8.0
Angola 0.0 1.0
Argentina 109.0 22.0
Australia 7.0 4.0
Austria 31.0 12.0
Belgium 25.0 27.0
Bolivia 1.0 0.0
Bosnia and Herzegovina 3.0 1.0
goal_per_country["Goals"] = goal_per_country["Home Team Goals"] + goal_per_country["Away Team Goals"]
goal_per_country = goal_per_country["Goals"].sort_values(ascending = False)
print(goal_per_country)
두 값을 더해서 Goals라는 칼럼 하나만 추출한다. goal_per_country를 다시 프린트하면 다음과 같다
Germany 224.0
Brazil 221.0
Argentina 131.0
Italy 128.0
France 106.0
Spain 92.0
Hungary 87.0
Netherlands 86.0
Uruguay 80.0
England 79.0
Sweden 74.0
Russia 66.0
Yugoslavia 60.0
Mexico 57.0
Belgium 52.0
Switzerland 45.0
Czechoslovakia 44.0
Poland 44.0
Austria 43.0
Portugal 43.0
Chile 40.0
USA 37.0
Korea Republic 31.0
Romania 30.0
Paraguay 30.0
Denmark 27.0
Colombia 26.0
Scotland 25.0
Bulgaria 22.0
Croatia 21.0
Nigeria 20.0
Turkey 20.0
Peru 19.0
Cameroon 18.0
Costa Rica 17.0
Japan 14.0
Ghana 13.0
Algeria 13.0
Northern Ireland 13.0
Côte d'Ivoire 13.0
Morocco 12.0
Australia 11.0
South Africa 11.0
Ecuador 10.0
Republic of Ireland 10.0
Saudi Arabia 9.0
Tunisia 8.0
Norway 7.0
Senegal 7.0
Korea DPR 6.0
Greece 5.0
Slovakia 5.0
German DR 5.0
Iran 5.0
Ukraine 5.0
Cuba 5.0
Slovenia 5.0
Bosnia and Herzegovina 4.0
New Zealand 4.0
Wales 4.0
Czech Republic 3.0
Jamaica 3.0
Honduras 3.0
Egypt 3.0
Haiti 2.0
IR Iran 2.0
United Arab Emirates 2.0
Kuwait 2.0
Serbia 2.0
Serbia and Montenegro 2.0
Israel 1.0
El Salvador 1.0
Angola 1.0
Iraq 1.0
Bolivia 1.0
Togo 1.0
Trinidad and Tobago 0.0
Dutch East Indies 0.0
Canada 0.0
China PR 0.0
Zaire 0.0
Name: Goals, dtype: float64
코드 실행이 완료되었습니다.
goal_per_country = goal_per_country.astype(int)
print(goal_per_country)
마지막으로 .0을 생략해주기 위해 int형으로 바꿔준다.
역대 월드컵의 국가별 득점 수
월드컵 국가별 득점 수를 그래프로 나타내보도록 하겠습니다.
상위 10개 국가만 골라 출력합니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import preprocess
from elice_utils import EliceUtils
elice_utils = EliceUtils()
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
'''
출력 형식을 위한 스켈레톤 코드입니다.
아래 줄 부터 문제에 맞는 코드를 작성해주세요.
'''
goal_per_country = preprocess.goal_per_country
goal_per_country = goal_per_country[:10]
# x, y값 저장
x = goal_per_country.index
y = goal_per_country.values
#그래프 그리기
fig, ax = plt.subplots()
ax.bar(x, y, width = 0.5)
# x축 항목 이름 지정, 30도 회전
plt.xticks(x, rotation=30)
plt.tight_layout()
#그래프 출력
plt.savefig("image.svg", format="svg")
elice_utils.send_image("image.svg")
그전에 했던 잔처리를 다 수행했다 preprocess한 이후에는 상위 10개만 자른다.
import pandas as pd
import numpy as np
world_cups_matches = pd.read_csv("WorldCupMatches.csv")
world_cups_matches = world_cups_matches.replace('Germany FR', 'Germany')
world_cups_matches = world_cups_matches.replace('C�te d\'Ivoire', 'Côte d\'Ivoire')
world_cups_matches = world_cups_matches.replace('rn">Republic of Ireland',"Republic of Ireland")
world_cups_matches = world_cups_matches.replace('rn">Bosnia and Herzegovina',"Bosnia and Herzegovina")
world_cups_matches = world_cups_matches.replace('rn">Serbia and Montenegro',"Serbia and Montenegro")
world_cups_matches = world_cups_matches.replace('rn">Trinidad and Tobago',"Trinidad and Tobago")
world_cups_matches = world_cups_matches.replace('rn">United Arab Emirates',"United Arab Emirates")
world_cups_matches = world_cups_matches.replace("Soviet Union","Russia")
world_cups_matches = world_cups_matches.drop_duplicates()
home = world_cups_matches[['Home Team Name', 'Home Team Goals']]
away = world_cups_matches[['Away Team Name', 'Away Team Goals']]
goal_per_country = pd.DataFrame(columns=['countries', 'goals'])
goal_per_country = goal_per_country.append(home.rename(columns={'Home Team Name': 'countries', 'Home Team Goals': 'goals'}))
goal_per_country = goal_per_country.append(away.rename(columns={'Away Team Name': 'countries', 'Away Team Goals': 'goals'}))
goal_per_country = goal_per_country.groupby(['countries'])['goals'].sum().sort_values(ascending=False)
참고로 preprocess.py는 다음과 같다
x값과 y값을 지정한다. goal_per_country는 현재 국가와 goal수가 들어 있는 시리즈 데이터다.
이제 그래프를 그린다. subplots()로 fig, ax를 만들고
bar 바그래프를 위해 x와 y를 인자로 넣는다.
바 그래프를 예쁘게 하기 위한 애들이다.
xticks로 나라 이름을 조금 회전해서 긴 이름들이 서로 겹치지 않도록 하고
테두리 밖으로 나가지 않도록 tight하게 만든다
마지막으로 언제나 그랬듯이 그래프를 출력한다. ;D
2014 월드컵 다득점 국가 순위
2014 브라질 월드컵에서 각 국가가 기록한 득점 수를 내림차순으로 정렬하여 출력해보도록 하겠습니다.
Q1
전처리 작업이 된 world_cups_matches가 주어져 있습니다.
이 데이터 프레임에서 Year가 2014인 것들을 추출하세요. 마스킹 연산을 이용합니다.
Q2
2014년 월드컵 경기 데이터 중에서 홈 팀의 골 수와 원정 팀의 골 수를 각각 계산하려고 합니다.
데이터가 저장된 형태로 인해 홈 팀 데이터와 원정 팀 데이터를 각각 구한 뒤 합쳐주어야 합니다.
Home Team Name을 그룹으로 묶어 Home Team Goals의 합계를 구하고 home_team_goal 변수에 저장합니다.
Away Team Name을 그룹으로 묶어 Away Team Goals의 합계를 구하고 away_team_goal 변수에 저장합니다.
Q3
홈 득점 수와 원정 득점 수를 하나의 데이터로 합치겠습니다.
이 때, 결측값을 없애기 위해 fillna 함수를 적용합니다.
결측값이 존재한다는 것은, 골을 넣지 못했다는 의미이므로 0으로 대체합니다.
Q4
홈 팀 골과 원정 팀 골 수를 합한 새로운 칼럼 goals를 만들고, 기존 칼럼은 drop 함수를 이용해 삭제합니다.
Q5
저장된 값을 정수로 변환합니다.
Q6
데이터 프레임을 내림차순으로 정렬하고, 올바른 값이 출력되는지 확인합니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()
import preprocess
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
'''
출력 형식을 위한 스켈레톤 코드입니다.
아래 줄 부터 문제에 맞는 코드를 작성해주세요.
'''
world_cups_matches = preprocess.world_cups_matches
world_cups_matches = world_cups_matches[world_cups_matches['Year'] == 2014]
# print(world_cups_matches)
home_team_goal = world_cups_matches.groupby(['Home Team Name'])['Home Team Goals'].sum()
away_team_goal = world_cups_matches.groupby(['Away Team Name'])['Away Team Goals'].sum()
team_goal_2014 = pd.concat([home_team_goal, away_team_goal], axis = 1).fillna(0)
team_goal_2014['goals'] = team_goal_2014['Home Team Goals'] + team_goal_2014['Away Team Goals']
team_goal_2014 = team_goal_2014.drop(['Home Team Goals', 'Away Team Goals'], axis = 1)
team_goal_2014.astype('int')
team_goal_2014 = team_goal_2014['goals'].sort_values(ascending= False)
print(team_goal_2014)
이것도 전에 goals나오는거랑 비슷하다. drop이 있는거 빼고!
Germany 18
Netherlands 15
Colombia 12
Brazil 11
France 10
Argentina 8
Algeria 7
Switzerland 7
Croatia 6
Belgium 6
Chile 6
USA 5
Costa Rica 5
Mexico 5
Uruguay 4
Bosnia and Herzegovina 4
Spain 4
Ghana 4
Portugal 4
Côte d'Ivoire 4
Australia 3
Nigeria 3
Greece 3
Korea Republic 3
Ecuador 3
England 2
Russia 2
Italy 2
Japan 2
Cameroon 1
Honduras 1
IR Iran 1
Name: goals, dtype: int64
역대 월드컵의 경기당 득점 수
WorldCupMatches.csv에 역대 월드컵 경기에 대한 데이터가 담겨 있습니다.
변수 world_cups_matches에 WorldCupMatches.csv를 데이터 프레임으로 저장하였는데요,
world_cups_matches를 이용하여 국가별 득점 수를 그래프로 그려보도록 하겠습니다.
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
import preprocess
elice_utils = EliceUtils()
team_goal_2014 = preprocess.team_goal_2014
'''
출력 형식을 위한 스켈레톤 코드입니다.
아래 줄 부터 문제에 맞는 코드를 작성해주세요.
'''
team_goal_2014.plot(x=team_goal_2014.index, y=team_goal_2014.values, kind="bar", figsize=(12, 12), fontsize=14)
# fig, ax = plt.subplots()
# ax.bar(team_goal_2014.index, team_goal_2014.values)
# plt.xticks(rotation = 90)
# plt.tight_layout()
plt.savefig("image.svg", format="svg")
elice_utils.send_image("image.svg")
team_goal_2014.plot(x=team_goal_2014.index, y=team_goal_2014.values, kind="bar", figsize=(18, 8), fontsize=14)
처음 그래프 그리는 방식으로 그리면 다음과 같다. plot방식
fig, ax = plt.subplots()
ax.bar(team_goal_2014.index, team_goal_2014.values)
plt.xticks(rotation = 90)
plt.tight_layout()
주석 처리된 부분으로 그래프를 그려보면 다음과 같다.
월드컵 4강 이상 성적 집계하기
각 국가들의 4강 이상 월드컵 성적을 집계하여 출력해보도록 하겠습니다..
Q1
WorldCups.csv 을 데이터 프레임으로 만든 변수 world_cups가 주어졌습니다.
데이터 프레임에서 역대 대회 1위 국가, 2위 국가, 3위 국가, 4위 국가를 추출하여 각각 변수 winner, runners_up, third, fourth에 저장하도록 하겠습니다.
Q2
value_counts 함수를 이용해 각 시리즈 데이터에 저장된 값을 세어주고 저장합니다.
이 작업을 거치면, 국가별 1위, 2위, 3위, 4위 횟수가 각각 저장된 데이터가 만들어집니다.
Q3
위 데이터들을 하나의 데이터 프레임으로 합치도록 하겠습니다.
Q4
ranks에 들어있는 값이 NaN이라면, 해당 순위를 기록한 적이 없다는 의미입니다.
따라서 데이터의 결측값을 0으로 채우고, dtype을 int64로 다시 설정합니다.
Q5
각 국가들을 우승 횟수, 준우승 횟수, 3위 횟수, 4위 횟수 순서대로 내림차순 정렬하세요.
데이터 프레임이 올바르게 저장되었는지 확인해보고 출력하여 제출하세요.
Winner Runners_Up Third Fourth
Brazil 5 2 2 2
Germany 4 4 4 1
Italy 4 2 1 1
...
...
...
Bulgaria 0 0 0 1
Korea Republic 0 0 0 1
Russia 0 0 0 1
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
'''
출력 형식을 위한 스켈레톤 코드입니다.
아래 줄 부터 문제에 맞는 코드를 작성해주세요.
'''
world_cups = pd.read_csv("WorldCups.csv")
winner = world_cups["Winner"]
runners_up = world_cups["Runners-Up"]
third = world_cups["Third"]
fourth = world_cups["Fourth"]
winner_count = pd.Series(winner.value_counts())
# print(winner_count) Brazil 5 Germany 4 ...
runners_up_count = pd.Series(runners_up.value_counts())
third_count = pd.Series(third.value_counts())
fourth_count = pd.Series(fourth.value_counts())
ranks = pd.DataFrame({
"Winner" : winner_count,
"Runners_up" : runners_up_count,
"Third" : third_count,
"Fourth" : fourth_count
})
ranks = ranks.fillna(0).astype('int64')
ranks = ranks.sort_values(['Winner', 'Runners_up', 'Third', 'Fourth'], ascending = False)
print(ranks)
value_count라는 함수를 사용했다. Winner모으고 키워드로 숫자 더해주나봄
DataFrame을 계속 Dataframe이라 써서 에러난다 ㅎㅎㅎ
월드컵 4강 이상 성적 집계하기
WorldCups.csv에 역대 월드컵 대회에 대한 데이터가 담겨 있습니다.
변수 world_cups에 WorldCups.csv를 데이터 프레임으로 저장하였는데요,
각 국가의 월드컵 4강 이상 성적을 집계하여 그래프로 출력해보도록 하겠습니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from elice_utils import EliceUtils
elice_utils = EliceUtils()
import preprocess
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
ranks = preprocess.ranks
'''
출력 형식을 위한 스켈레톤 코드입니다.
아래 줄 부터 문제에 맞는 코드를 작성해주세요.
'''
# x축에 그려질 막대그래프들의 위치입니다.
x = np.array(list(range(0, len(ranks))))
# 그래프를 그립니다.
fig, ax = plt.subplots()
# x 위치에, 항목 이름으로 ranks.index(국가명)을 붙입니다.
plt.xticks(x, ranks.index, rotation=90)
plt.tight_layout()
# 4개의 막대를 차례대로 그립니다.
ax.bar(x - 0.3, ranks['Winner'], color = 'gold', width = 0.2, label = 'Winner')
ax.bar(x - 0.1, ranks['Runners_Up'], color = 'silver', width = 0.2, label = 'Runners_Up')
ax.bar(x + 0.1, ranks['Third'], color = 'brown', width = 0.2, label = 'Third')
ax.bar(x + 0.3, ranks['Fourth'], color = 'black', width = 0.2, label = 'Fourth')
plt.savefig("image.svg", format="svg")
elice_utils.send_image("image.svg")
그 전 까지 데이터 처리는 preprocess함수로 처리해버리기
아까랑 겹치는 내용이 많다.
x는 나라 이름 갯수로 만든 집합이고
fig, ax를 subplots로 만든다
xticks tightlayout은 항목 이름을 바꾸고 예쁘게 정렬하는 함수들.
다음으로 막대를 차례대로 그린다. 색깔은 다 다름.
-0.3 -0.1 0.1 0.3 간격으로 0.2넓이의 막대가 세워지도록 하고
각 나라마다 네개의 바를 그린 셈
그리고 그래프를 save하면 완성
'파이썬 > NIPA 데이터분석 강의' 카테고리의 다른 글
NIPA 온라인선택 데이터 머신러닝 03 머신러닝을 위한 데이터 이해하기 (0) | 2020.10.04 |
---|---|
NIPA 온라인선택 데이터 머신러닝 02 데이터 과학자 이해하기 for 비전공자 (0) | 2020.10.04 |
NIPA 온라인선택 데이터 머신러닝 01 머신러닝과 과학 이해하기 (0) | 2020.10.04 |
NIPA 데이터분석 첫번째 활용선택 : 06 실력확인테스트 (0) | 2020.09.30 |
NIPA 데이터분석 첫번째 활용선택 : 04 Matplotlib 2 - with pandas (0) | 2020.09.30 |
NIPA 데이터분석 첫번째 활용선택 : 04 Matplotlib 1 - line plot 옵션과 scatter bar hist (0) | 2020.09.30 |
NIPA 데이터분석 첫번째 활용선택 : 03 Pandas 심화 -b pivot 피리부는사나이 (0) | 2020.09.30 |
NIPA 데이터분석 첫번째 활용선택 : 03 Pandas 심화 -a apply group (0) | 2020.09.30 |