python北京奥运会_Python分析奥运会120年历史,谁才是奥运历史的王者?
主要通过分析研究夏季奥运会中广受欢迎的运动项目及其竞争情况,并重点关注哪个国家能够赢得最多金牌;此外还探讨夏季与冬季之间不同性别参赛者在年龄上的差异及变化趋势;同时深入分析中国选手在国际赛场上取得的成绩及表现如何?
项目链接,欢迎一键fork
目录
1. 导入包+基本的数据处理
2. 生成奥运会运动项目的词云(Word Cloud)
3. 查看参赛者的男女基本信息
3.1. 120年来参赛者的男女比例
3.2. 查看参赛者的男性与女性的年龄分布
3.3. 查看1896-2014年男女参赛者的平均年龄变化
3.4. 查看120年来 夏季 奥运会获奖运动员不同性别的平均年龄变化
3.5. 查看120年来❄️冬季❄️奥运会获奖运动员不同性别的平均年龄变化
4. 在120年来Top 20 得金牌最多的国家
5. 最热门 的体育项目
6. 中国 奥运会Performance
6.1. 中国历届奥运会运动员获得奖牌人数
6.2. Top 10 中国 的强项运动项目
1. 导入包+基本的数据处理
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from plotly.offline import iplot
from plotly.graph_objs import *
import colorlover as cl
import seaborn as sns
color = sns.color_palette()
f_p = '/home/kesci/input/olympic/athlete_events.csv'
athlete_events = pd.read_csv(f_p)
#查看dataframe的前四行数数据
athlete_events.head(4)
athlete_events.index.size
#查看数据中各个字段的空值的个数
athlete_events.isnull().sum()
#查看列名及其数值类型
athlete_events.info()
athlete_events.describe()
信息中显示历届奥运会的运动员平均年龄在25-26岁,平均身高175cm,平均体重70.7kg
2. 生成奥运会运动项目的词云(Word Cloud)
kindsport = set()
for m in athlete_events.Sport:
kindsport.update(g for g in m.split('\n'))
print(kindsport)
from wordcloud import WordCloud
wc = WordCloud(
background_color='white',
width=1200,
height=700,
max_words=3000,
random_state=200,
min_font_size=35,
max_font_size=80
)
wc.generate(",".join(kindsport))
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.show()
3. 查看参赛者的男女基本信息
3.1 120年来参赛者的男女比例
fig = {
"data":[{
"values":athlete_events['Sex'].value_counts(),
"labels":['男性','女性',],
"marker":{'colors':cl.scales['4']['div']['PuOr']},
"name":"参赛者的男女比例",
"hoverinfo":"label+percent+name",
"hole":.4,
"type":"pie"
}],"layout":{"title":"参赛者的男女比例"}
}
iplot(fig,filename='donut')
3.2 查看参赛者的男性与女性的年龄分布
y_f = athlete_events[athlete_events['Sex'] == 'F'].Age
y_m = athlete_events[athlete_events['Sex'] == 'M'].Age
trace_0 = Box(y = y_m,name="男性年龄分布")
trace_1 = Box(y = y_f,name="女性年龄分布")
data = [trace_0,trace_1]
layout = Layout(title = '参赛者不同性别的年龄分布')
fig = Figure(data = data,layout = layout)
iplot(fig)
将光标置于图中的年龄分布,可以看到
男性人口的中间年龄为25岁(值得注意的是这一数据),最低年龄段为10岁(这一范围内的个体占较大比例),最高人口年龄达到97岁(令人刮目相看的是…),最高年龄段定为39岁(这一设定反映了…),最低年龄段设定在12岁时展现出了…)
女性的中间值达到23岁;最低年龄段达到了11岁以上;最高年龄段设在74岁以上;上限位次设定在37岁以上;下限位次设定在11岁以下。
超出上下限的数据点在箱线图上被视为异常值;而男性和女性的年龄异常值主要集中在数值较高的区域;由于幼童通常较早达到发育成熟阶段,因此小于十岁的儿童往往被视为幼年期。
3.3. 查看1896-2014年男女参赛者的平均年龄变化
year_mean_age_f := athlete_events[athlete_events.Sex.isin(['F'])].groupby('Year').Age.agg({"mean"}).reset_index(names=["average_age"])
year_mean_age_m is calculated as the mean age of male athletes grouped by year.
y_age_f = year_mean_age_f.average_age
y_age_m = year_mean_age_m.average_age
time_f = year_mean_age_f.Year
time_m = year_mean_age_m.Year
trace1 = Scatter(x = time_f,y = y_age_f)
trace2 = Scatter(x = time_m,y = y_age_m)
data = [trace1, trace2]
layout = Layout(title = '历年男性女性参赛选手的平均年龄变化')
fig = Figure(data = data,layout = layout)
iplot(fig)
3.4. 查看120年来 夏季 奥运会获奖运动员不同性别的平均年龄变化
year_medal_age_f = athlete_events[(athlete_events.Season == 'Summer')
& (athlete_events['Sex'] == 'F')
& (athlete_events['Medal'].notnull())
].groupby(by = ['Year']).Age.agg('mean').reset_index(name = "average_age")
year_meadl_age_m = athlete_events[(athlete_events.Season == 'Summer')
& (athlete_events['Sex'] == 'M')
& (athlete_events['Medal'].notnull())
].groupby(by = ['Year']).Age.agg('mean').reset_index(name = "average_age")
trace0 被定义为一个 Scatter 对象,在其中设置 x 轴参数为 year\_medal\_age\_f.Year 并将 y 轴参数设为 year\_medal\_age\_f.average\_age;并将其 name 参数设置为 '获奖女性'
trace1 :=
go.Scatter(
x=year_meadl_age_m.Year,
y=year_meadl_age_m.average_age,
name="获奖男性"
)
data = [trace0, trace1]
布局设置为Layout(title=‘男性和女性参赛选手在不同年份夏季奥运会中的奖牌获得情况’)
fig = Figure(data = data,layout = layout)
iplot(fig)
男性获奖者群体的整体平均年龄通常都超过了女性获奖者的平均年龄水平;然而,在过去几十年中这一差距已经逐渐缩小。
同理冬季
4. 在120年来Top 20 得金牌最多的国家
按奖牌类型归类后分别统计不同奖牌的数量,并命名为'Medal_Count'。
改写说明
筛选出金牌类型的df,根据字段Medal_Count降序排列国家,选出前20个记录。
计算国家获得金牌的数量排名前20的国家奖牌情况时, 首先从原始数据集中筛选出所有获得金牌的国家记录, 然后按照 medal_count 进行降序排列, 最后提取排名靠前的 20 个国家的数据.
变量由Bar函数生成,并接受四个参数:x轴对应于国际奥运会奖牌榜国家球队;y轴对应于国家奖牌计数;以及一个用于配置颜色和缩放方向的字面量构造器。
layout = Layout(title = 'Top 20 的金牌数 最多的国家')
data = [trace]
fig = Figure(data = data,layout = layout)
iplot(fig)
5. 最热门 的体育项目
sports = athlete_events.Sport.value_counts()
analysis_result = VisualizationTool(
x=sports.index,
y=sports.values,
marker=dict(
color=dict(cl.scales['11']['div']['RdYlBu']),
reversescale=True
)
)
layout = Layout(title = "最热门的体育项目")
fig = Figure(data = [trace], layout = layout)
iplot(fig)
由上图可知:田径、体操、游泳 是最热门的三项体育项目。
6. 中国奥运会Performance
china = athlete_events[athlete_events.Team == 'China']
all_medal = china[china.Medal.isin(['Gold','Silver','Bronze'])]
print('2016年获奖运动员人数:{}。'.format(all_medal[all_medal.Year == 2016].shape[0]))
6.1. 中国历届奥运会运动员获得奖牌人数
从1856年前后开始分析冬季和夏季奥运会的举办情况。从1856年开始至1874年间并没有单独举行的冬季奥运会;同样地,在这一时间段内也没有单独举行的夏季奥运会。然而,从 ¹⁸⁵⁶ 年起,每隔四年就会依次举行冬季和夏季两届冬奥会以及冬残奥会;同样地,每隔四年也会依次举行夏季两届冬奥会以及冬残奥会。因此,在下文中的柱状图中可以看到,在某一列中包含了自 ¹⁸⁵⁶ 年以来的数据
1996年夏季奥运会首次举办时,在那场盛事上中国队收获了共计66枚银牌,在此后的多年间这也成为了中国体育代表团获得银牌数量最多的一届。
在最近几年的夏季奥运赛场上,
中国 consistently 展现出了强大的实力。
尤其是在2008年北京奥运会期间,
中国共有170名运动员赢得了奖牌,
其中72名选手斩获金牌,
另有49名选手夺得银牌和铜牌。
china = athlete_events[athlete_events.Team == 'China']
countrywise medalists are stored in china_medal, which is calculated by grouping china by year and calculating the medal counts, then resetting the index with medal_count as the name.
y0 = china_medal[china_medal.Medal == 'Gold'].medal_count
x0 = china_medal[china_medal.Medal == 'Gold'].Year
y1 = china_medal[china_medal.Medal == 'Silver'].medal_count
x1 = china_medal[china_medal.Medal == 'Silver'].Year
y2 = china_medal[china_medal.Medal == 'Bronze'].medal_count
x2 = china_medal[china_medal.Medal == 'Bronze'].Year
x = china_medal.Year
trace0 = Bar(
x = x0,
y = y0,
name = 'Gold',
text = y0,
textposition = 'auto',
marker=dict(
color='gold',
line=dict(
color='rgb(8,48,107)',
width=1.5),
),
opacity=0.6
)
trace1 = Bar(
x = x1,
y = y1,
name = 'Silver',
text = y1,
textposition = 'auto',
marker=dict(
color = 'silver',
line=dict(
color='rgb(8,48,107)',
width=1.5),
),
opacity=0.6
)
trace2 = Bar(
x = x2,
y = y2,
name = 'Bronze',
text = y2,
textposition = 'auto',
marker=dict(
color='olive',
line=dict(
color='rgb(8,48,107)',
width=1.5),
),
opacity=0.6
)
data = [trace0, trace1, trace2]
layout = Layout(
barmode='group',
width=800,
hovermode='closest',
title = '中国历届奥运会运动员获得 金牌 银牌 铜牌 的人数'
)
fig = Figure(data = data, layout = layout)
iplot(fig)
6.2. Top 10 中国的强项运动项目
选出中国金牌数据
china_gold = china[china.Medal == 'Gold']
将金牌字段值映射到1
china_gold.Medal = china_gold.Medal.map({'Gold' : 1})
#查看前四行数据
china_gold.head(4)
根据运动项目group,分别计算group内的值之合
china_sports = china_gold.groupby(by = 'Sport',as_index=False).Medal.agg('sum')
按从大到小的顺序排序
china_sports = china_sports.sort_values(['Medal'], ascending= False)
选出前10的运动项目
top10_china_sports = china_sports.head(10)
定义颜色盘
colors = ['#91BBF4', '#91F4F4', '#F79981', '#F7E781', '#C0F781','rgb(32,155,160)', 'rgb(253,93,124)', 'rgb(28,119,139)', 'rgb(182,231,235)', 'rgb(35,154,160)']
n_phase = top10_china_sports.Sport.shape[0]
plot_width = 200 # 绘制宽度
section_h = 100 # section的高度
section_d = 15 # sections之间的间隔
用来计算其他section的宽度的乘系数
unit_width = plot_width / max(top10_china_sports['Medal']) # 200 / 56 = 3.57
每个漏斗部分相对于绘图宽度的宽度
phase_w = [int(v * unit_width) for v in top10_china_sports['Medal']]
绘制图的总高度
height = section_h * n_phase + section_d * (n_phase - 1)
shapes = [] # 列表存储所有的绘制形状
label_y = [] # 列表存储每个section的name、value文本的Y轴地址
for i in range(n_phase):
if(i == n_phase - 1):
points = [phase_w[i] / 2, height, phase_w[i] / 2, height - section_h]
else:
points = [phase_w[i] / 2, height, phase_w[i+1] / 2, height - section_h]
path = 'M {0} {1} L {2} {3} L -{2} {3} L -{0} {1} Z'.format(*points)
shape = {'type': 'path','path': path,'fillcolor': colors[i],'line': {'width': 1,'color': colors[i]}}
shapes.append(shape)
Y-axis location for this section's details (text)
label_y.append(height - (section_h / 2))
height = height - (section_h + section_d)
label_trace = Scatter(
x=[-200]*n_phase,
y=label_y,
mode='text',
text= top10_china_sports['Sport'],
textfont=dict(
color='rgb(200,200,200)',
size=15
)
)
For phase values
value_trace = Scatter(
x=[-350]*n_phase,
y=label_y,
mode='text',
text=top10_china_sports['Medal'],
textfont=dict(
color='rgb(200,200,200)',
size=12
)
)
data = [label_trace, value_trace]
layout = Layout(
title="Top 10 中国 的强项运动项目 ",
titlefont=dict(
size=12,
color='rgb(203,203,203)'
),
shapes=shapes,
height=600,
width=800,
showlegend=False,
paper_bgcolor='rgba(44,58,71,1)',
plot_bgcolor='rgba(44,58,71,1)',
xaxis=dict(
showticklabels=False,
zeroline=False,
),
yaxis=dict(
showticklabels=False,
zeroline=False
)
)
fig = Figure(data=data, layout=layout)
iplot(fig)
根据中国的奖牌数量最多的排名中前十的运动项目的实力表现来看, 中国的主要优势项目主要包括跳水、体操等专项成绩
