파이썬/NIPA 데이터분석 강의

NIPA 데이터분석 첫번째 활용선택 : 05 월드컵 데이터 분석해보기

mcdn 2020. 9. 30. 15:41
반응형

데이터 분석이란?

데이터 분석은 주어진 자료를 가공하여 원하는 정보와 결론을 얻어내는 일련의 처리 과정을 의미합니다.

데이터 분석은 보통 아래의 단계로 이루어집니다.

  • 주제 선정
  • 데이터 구조 파악
  • 데이터 전처리
  • 데이터 분석 구현

주제 선정

어떤 데이터를 선정할 지, 데이터에서 어떤 가설을 세우고 분석을 시작할 지, 어떤 결론을 원하는 지 등 데이터 분석의 목적을 세웁니다.

데이터 구조 파악

데이터를 분석하기 위해서, 데이터가 저장된 형태와 자료형, 변수 이름 등을 미리 파악해야 합니다.

또는 데이터 프레임에 통계량 함수를 적용하여, 데이터의 분포도나 성향 등을 파악할 수 있습니다.

데이터 전처리

데이터를 분석하기 전, 필요한 변수만을 추출하거나 기존의 변수로 새로운 변수를 계산하여 만들기도 합니다.

데이터의 결측값과 이상값이 있다면, 이 단계에서 올바르게 제거하여야 데이터 분석 결과를 올바르게 확인할 수 있습니다.

데이터 분석

주제 선정 단계에서 세운 가설을 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하면 완성 

 

 

반응형