奥运会数据集分析

项目来自和鲸社区奥运会数据集分析

1. 数据载入与总览

1.1 数据加载

import numpy as np
import pandas as pd
%matplotlib inline
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS

import warnings
warnings.filterwarnings('ignore')
#plt.rcParams ['font.sans-serif'] = ['SimHei'] # 坐标轴标题正常显示中文
#plt.rcParams ['axes.unicode_minus'] = False # 坐标轴刻度正常显示负号
"""
也可以修改文件.\Anaconda\Lib\site-packages\matplotlib\mpl-data\matplotlibrc
249 font.family  : sans-serif,去除注释
257 font.sans-serif : Microsoft YaHei, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif,去除注释并添加字体(Microsoft YaHei)
"""
athlete_events = pd.read_csv('./athlete_events.csv')

1.2 数据总览

athlete_events.head()  # 查看前n行(默认5)

在这里插入图片描述

athlete_events.isnull().sum() # 查看各个字段的空值的个数

在这里插入图片描述

athlete_events.info() # 查看列名及其数据类型

在这里插入图片描述

athlete_events.describe() # 数据的描述性统计

在这里插入图片描述

2. 奥运会运动项目词云

athlete_events.Sport.unique() # 对Sport去重得到所有的运动项目名称

在这里插入图片描述

stopwords = set(STOPWORDS) # 设置停用词

def show_wordcloud(data, title = None):
    wordcloud = WordCloud(
    	background_color= 'white', 
    	stopwords= stopwords, 
    	max_words= 200, 
    	max_font_size= 40, 
    	scale= 3,  # scale,缩放比例
    	random_state= 1).generate(str(data))
    
    fig = plt.figure(1, figsize= (15, 15))
    plt.axis('off')
    if title:
        fig.suptitle(title, fontsize = 20)
        fig.subplots_adjust(top = 2.3)
    
    plt.imshow(wordcloud)
    plt.show()

show_wordcloud(athlete_events['Sport'], title = "往届奥运比赛项目词云")

在这里插入图片描述

3. 查看参赛者的男女基本信息

原项目从这里开始是用plotly绘制的,而我因为是在jupyterlab中写的,需要用插件才能显示绘制效果,我嫌麻烦就用matplotlib代替了

3.1. 120年来参赛者的男女比例

"""
labels:饼图中每个楔形的标签
autopct:楔形的数值标签,百分比形式,.1f是一位小数
startangle:饼图的绘制起点的角度
counterclock: 饼图的绘制方向,默认为True
wedgeprops:
	width: 甜甜圈的大小,范围是[0,1]
	edgecolor: 每个楔形边缘的颜色
"""
plt.pie(athlete_events['Sex'].value_counts(), labels= ['男', '女'], autopct='%1.1f%%', startangle=90, counterclock = False, wedgeprops= dict(width=0.6, edgecolor='w'))

plt.axis('equal') # 保证你画的圆是圆,而不是椭圆
plt.title("参赛者的男女比例")

plt.show()

在这里插入图片描述

3.2. 查看参赛者的男性与女性的年龄分布

s_f = athlete_events.query("Sex == 'F'")
s_m = athlete_events.query("Sex == 'M'")

fif, ax = plt.subplots(ncols= 2,figsize = (8, 5))
s_f.Age.plot(kind = 'box', ax = ax[0], title = "男性年龄分布")
s_m.Age.plot(kind = 'box', ax = ax[1], title = "女性年龄分布")

plt.show()
"""
# Age中有空值,boxplot无法作用
s_f = athlete_events[athlete_events['Sex'] == 'F'].Age.dropna()
s_m = athlete_events[athlete_events['Sex'] == 'M'].Age.dropna()

box1, box2 = s_f, s_m
plt.subplots(figsize = (6,10))
plt.boxplot([box1, box2])

plt.show()
"""

在这里插入图片描述

超出箱线图的上限和下限都为 异常值,男性与女性的年龄异常值都集中在较大值一侧,所以年龄分布都呈右偏态。

3.3. 查看1896-2014年男女参赛者的平均年龄变化

f_year_mean = athlete_events[athlete_events['Sex'] == 'F'].groupby('Year').Age.mean()
m_year_mean = athlete_events[athlete_events['Sex'] == 'M'].groupby('Year').Age.mean()

fig, ax = plt.subplots(figsize = (15, 8))
ax.plot(f_year_mean, label = "女性")
ax.plot(m_year_mean, label = "男性")

plt.legend(loc = 'upper right') # 显示图例,位置为右上方
plt.title(label = "历年男性女性参赛选手的平均年龄变化")

plt.show()

在这里插入图片描述

3.4. 查看120年来🌞夏季🌞奥运会获奖运动员不同性别的平均年龄变化

medal_s_f = athlete_events[(athlete_events['Sex'] == 'F')&
                            (athlete_events['Season'] == 'Summer')&
                            (athlete_events['Medal'].notnull())].groupby('Year').Age.mean()
medal_s_m = athlete_events[(athlete_events['Sex'] == 'M')&
                            (athlete_events['Season'] == 'Summer')&
                            (athlete_events['Medal'].notnull())].groupby('Year').Age.mean()

fig, ax = plt.subplots(figsize = (15, 8))
ax.plot(medal_s_f, label = "获奖女性")
ax.plot(medal_s_m, label = "获奖男性")

"""
'best'            0
'upper right'     1
'upper left'      2
'lower left'      3
'lower right'     4
'right'           5
'center left'     6
'center right'    7
'lower center'    8
'upper center'    9
'center'          10
"""
plt.legend(loc = 1)
plt.title(label = "历年夏季🌞奥运会获得奖牌的男性女性参赛选手的平均年龄变化")

plt.show()

在这里插入图片描述
获奖男性运动员的平均年龄普遍比获奖女性运动员的平均年龄大,但在近年来,年龄差距在不断缩小。

3.5. 查看120年来❄️冬季❄️奥运会获奖运动员不同性别的平均年龄变化

medal_w_f = athlete_events[(athlete_events['Sex'] == 'F')&
                            (athlete_events['Season'] == 'Winter')&
                            (athlete_events['Medal'].notnull())].groupby('Year').Age.mean()
medal_w_m = athlete_events[(athlete_events['Sex'] == 'M')&
                            (athlete_events['Season'] == 'Winter')&
                            (athlete_events['Medal'].notnull())].groupby('Year').Age.mean()

fig, ax = plt.subplots(figsize = (15, 8))
ax.plot(medal_w_f, label = "获奖女性")
ax.plot(medal_w_m, label = "获奖男性")

plt.legend(loc = 1)
plt.title(label = "历年冬季❄️奥运会获得奖牌的男性女性参赛选手的平均年龄变化")

plt.show()

在这里插入图片描述

4. 在120年来Top 20🏅得金牌最多的国家

和原项目不同,这里我用了Team做为分组

team_medal = athlete_events.groupby(['Team']).Medal.value_counts().reset_index(name = 'Team_Count')
top20_team_medal = team_medal[team_medal.Medal == 'Gold'].sort_values(by = 'Team_Count', ascending = False).head(20)
top20_team_medal = top20_team_medal.set_index(top20_team_medal.Team)

# rot: x轴刻度标签旋转角度
top20_team_medal.plot(kind = 'bar', figsize = (12, 9), rot = -30, title = "Top 20 的金牌数🏅最多的国家")

plt.show()

在这里插入图片描述

5. 最热门🔥的体育项目

athlete_events.Sport.value_counts().plot(kind = 'bar',figsize = (12, 9), title = "最热门的体育项目")

plt.show()

在这里插入图片描述

6. 中国🇨🇳奥运会Performance

6.1. 中国历届奥运会运动员获得奖牌人数

china_medal = china.groupby('Year').Medal.value_counts().reset_index(name = "medal_counts")

x0 = china_medal[china_medal.Medal == 'Gold'].Year
x1 = china_medal[china_medal.Medal == 'Silver'].Year
x2 = china_medal[china_medal.Medal == 'Bronze'].Year
y0 = china_medal[china_medal.Medal == 'Gold'].medal_counts
y1 = china_medal[china_medal.Medal == 'Silver'].medal_counts
y2 = china_medal[china_medal.Medal == 'Bronze'].medal_counts

fig, ax = plt.subplots(figsize = (12, 9))
width = 0.35
ax.bar(x0 - width, y0, width, label = "金牌", color = 'Gold')
ax.bar(x1, y1, width, label = "银牌", color = 'Silver')
ax.bar(x2 + width, y2, width, label = "铜牌", color = 'Brown') # 铜色是什么色啊2333

plt.title("中国历届奥运会运动员获得 金牌🏅 银牌🥈 铜牌🥉 的人数")
plt.legend()

plt.show()

在这里插入图片描述

china = athlete_events[athlete_events['Team'] == 'China']
china_all_medal = china[china.Medal.isin(['Gold', 'Silver', 'Bronze'])]
print("2008年获奖运动员人数:{}。".format(china_all_medal[china_all_medal.Year == 2008].shape[0]))

在这里插入图片描述

一直到1992年,冬季奥运会与夏季奥运会都是在同一年举行的。冬季奥运会是从1994年开始4年举办一次,夏季奥运会是从1996开始4年举办一次。所以在下面的柱状图📊中,1992年及之前的金牌人数数据都是在一个柱状图中。
在1996年的第一次夏季奥运会上,中国队有66人获得了银牌🥈,也是这么多年以来银牌获得人数最多的一届。在近几届的夏季奥运会上,中国表现的都很不错。尤其在2008年夏季北京奥运会,中国共有170名运动员获得了奖牌,其中有72人获得了金牌,49人获得了银牌、49人获得了铜牌。

6.2 中国那些运动项目获金牌数最多。

china_gold = china[china.Medal == 'Gold']
china_gold.groupby('Sport').Medal.value_counts().sort_values(ascending = False)

在这里插入图片描述

原项目后面还有一个前10运动的漏斗图,matplotlib没有漏斗图,,,

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值