前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python数据探索奥运数据,从中国队的男女比例找劣势项目

Python数据探索奥运数据,从中国队的男女比例找劣势项目

作者头像
咋咋
发布2021-09-01 11:28:21
6451
发布2021-09-01 11:28:21
举报
文章被收录于专栏:数据大宇宙

前言

最近在准备 pandas 专栏的工程化内容,其中用到一份奥运数据的探索分析。这里会截取一些技巧内容让大家参考学习,包括:

  1. 怎么找出每个项目首次出现在奥运的时间
  2. 哪些项目被取消?在哪一届被取消
  3. 有没有项目被取消之后,又重新纳入奥运项目
  4. ………………

完整的分析过程,包括如何组织代码,把一些固定参数和逻辑外置在 Excel上等高级技巧,请关注专栏相关章节。

导入这些库:

代码语言:javascript
复制
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

plt.rcParams['figure.figsize'] = [16,10]
plt.rcParams['figure.dpi'] = 140
plt.rcParams['font.size'] = 20

数据是从 kaggle 上下载的 csv 文件,此外为了方便阅读,数据中的项目与国家已自动化翻译成中文(google翻译):

代码语言:javascript
复制
df = pd.read_csv('athlete_events.csv')
df_trans = pd.read_excel('中英文.xlsx',sheet_name=None)

sport_trans = df_trans['Sport'].set_index('en')['cn']
noc_trans = df_trans['Noc'].set_index('en')['cn']

df['Sport_cn'] = df['Sport'].map(sport_trans)
df['NOC_region'] = df['NOC'].map(noc_trans)
df
  • 每一行表示一个运动员的记录,包括姓名、性别,国家、参与年份,项目(Sport),拿到的奖项(Medal)
  • 数据记录年份截止到2016年奥运(包含2016年数据)

首先创建一些常用函数:

代码语言:javascript
复制

# 对列比例
def cal_percent(col:pd.Series):
    return col/col.sum()

# 对表格每一行求比例
def cal_percent_byrow(data:pd.DataFrame):
    return data.div(data.sum(axis=1),axis=0)

# 柱状图
def plot_bar(data,**kws):
    data.plot.bar(**kws)

    
# 条形图
def plot_barh(data,**kws):
    data.plot.barh(**kws)

整体性别比例

看看整体情况:

代码语言:javascript
复制
df['Sex'].value_counts().pipe(cal_percent).pipe(plot_bar)
  • 意料之中,男性比例高达70%

但是,奥运是世界规模最大的综合性运动会,那么必然不会忽视男女平等问题。

看看历届奥运的男女比例:

代码语言:javascript
复制
(
    df.pivot_table(index='Year',
               columns='Sex',
               aggfunc='size',
               fill_value=0)
    .pipe(cal_percent_byrow)
    .sort_values('Year',ascending=False)
    .pipe(plot_barh,stacked=True)
)
  • 可以看到整体走势趋于男女比例均等

其实,奥运项目的增减都会影响男女比例,不妨看看各个项目的男女比例:

代码语言:javascript
复制
kws = {'figsize':[16,25]}
(
    df.pivot_table(index='Sport_cn',
               columns='Sex',
               aggfunc='size',
               fill_value=0)
    .pipe(cal_percent_byrow)
    .sort_values('M',ascending=True)
    .pipe(plot_barh,stacked=True,**kws)
)
  • 行1:因为项目较多,如果图表高度不够,会使得图中内容压缩,导致y轴内容重叠
  • 注意,有些项目只是短暂出现在很久以前的奥运会上

关于项目时间相关探索就不在本文展开


中国队的情况

我们自然关注中国队的情况:

代码语言:javascript
复制
(
    df.query("NOC_region=='中国' and Year>=2000 and Season=='Summer'")
    .pivot_table(index='Year',
               columns='Sex',
               aggfunc='size',
               fill_value=0)
    .pipe(cal_percent_byrow)
    .sort_values('Year',ascending=False)
    .pipe(plot_barh,stacked=True)
)
  • 除开 2008 年北京奥运会是男子占比略高于女子,其他年份都是女子比例更高

为什么呢?

不妨看看 2008 年中国队的参与项目,以及项目的男女比例:

代码语言:javascript
复制
kws = {'figsize':[16,40]}
(
    df.query("NOC_region=='中国' and Season=='Summer' and Year==2008")
    .pivot_table(index='Sport_cn',
               columns='Sex',
               aggfunc='size',
               fill_value=0)
    .pipe(cal_percent_byrow)
    .sort_values('M',ascending=False)
    .pipe(plot_barh,stacked=True,**kws)
)
  • 注意3大球类项目(足球、篮球、排球)都有男子项目

奥运东道主有一些"福利",受关注的项目可以直接晋级正赛,比如足球

但是,再看看最近的2016年的情况:

代码语言:javascript
复制
kws = {'figsize':[16,40]}
(
    df.query("NOC_region=='中国' and Season=='Summer' and Year==2008")
    .pivot_table(index='Sport_cn',
               columns='Sex',
               aggfunc='size',
               fill_value=0)
    .pipe(cal_percent_byrow)
    .sort_values('M',ascending=False)
    .pipe(plot_barh,stacked=True,**kws)
)
  • 可以看到,足球和排球项目,中国队的男子队都无法参与奥运
  • 此外,水球、网球这些小球项目中,中国队的男子队也退步了

此时2020年东京奥运如火如荼进行中,你觉得中国队经过4年的时间,这些项目能有所进步吗?

等2020年奥运数据一出来,马上就能知道

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据大宇宙 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 整体性别比例
  • 中国队的情况
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档