奥林匹克历史数据分析与金牌预测(上)

这是关于现代奥林匹克运动会的历史数据集,包括从1896年雅典到2016年里约奥运会的所有比赛。在2018年5月从www.sports-reference.com上抓取这些数据。文件athlete_events.csv包含271116行和15列。 每一行对应于参加个人奥运会(运动员比赛)的个体运动员。

 

列信息:

  1. ID - Unique number for each athlete
  2. Name - Athlete's name
  3. Sex - M or F
  4. Age - Integer
  5. Height - In centimeters
  6. Weight - In kilograms
  7. Team - Team name
  8. NOC - National Olympic Committee 3-letter code
  9. Games - Year and season
  10. Year - Integer
  11. Season - Summer or Winter
  12. City - Host city
  13. Sport - Sport
  14. Event - Event
  15. Medal - Gold, Silver, Bronze, or NA

数据集截图概要如下:

奥林匹克历史数据分析与金牌预测(上)_第1张图片

 

 

下面我们从10个问题来了解这120年来奥运会的发展轨迹:

问题1: 那些10个国家获得的奖牌数最多呢?

 

先看看我们奖牌的分布情况,这里我们观察到一个数据就是数据集里面很多比赛是最终产生奖牌的,而且金牌,银牌,铜牌的数据也不相同,有意思的是金牌最多。

奥林匹克历史数据分析与金牌预测(上)_第2张图片

 

    那么历史上获得奖牌数最多的10个国家是哪些呢?这里先要把没有奖牌的的数据过滤出去,然后按照国家分组即可,参考下面的代码。

#只选择夏季奥运会

athlete = athlete[athlete['Season'] == 'Summer']

 

def countmedalcountrys():

    athlete_winners = athlete[athlete.Medal.notnull()]

    winner_team = athlete_winners.groupby('Team').size().to_frame('medal_count')

    #采用升序排列

    winner_team = winner_team.reset_index().sort_values('medal_count',ascending=False)

    return winner_team.head(10)

 

def Drawmedalcountrys(data):

    x = data['Team'].astype(str)

    y = data['medal_count'].astype(str)

    ax = data.plot.bar(x='Team',y='medal_count')

    ax.set_xlabel('Top 10')

    ax.set_ylabel('Counts')

    plt.show()

    print (data)

 

top10data = countmedalcountrys()

Drawmedalcountrys(top10data)

 

这里我们将数据打印出来,这里可以清楚的看到美帝还真是体育强国足足领先苏联一倍的奖牌数,就算加上后期俄罗斯也差距惊人。

奥林匹克历史数据分析与金牌预测(上)_第3张图片

 

再用图表可视化显示一下可以更明显看出比例:

奥林匹克历史数据分析与金牌预测(上)_第4张图片

        

问题2:哪些国家在哪一界内获得在奖牌数最多,是多少块,哪一年?

 

这里分析一下我们要将每界比赛,每个国家获得的奖牌数进行分组,并进行排序即可得到答案。        

 

def  countMaxMedalCountry():

         athlete_winners = athlete[athlete.Medal.notnull()]

         return athlete_winners.groupby(['Team','Year']).size().to_frame('medal_count').reset_index().sort_values('medal_count',ascending=False).head(10)

 

这里打印出来的数据也是可以看到美国在多个年份都雄霸奖牌数第一,但1980年苏联获得了巨大的成功,我查了下原来1980年时莫斯科奥运会,主场作战难怪呢。

奥林匹克历史数据分析与金牌预测(上)_第5张图片

 

问题3 :为了了解每个国家体育发展的情况,我们去绘制一条国家在历届奥运会中的奖牌发展曲线,这里以中国为例

 

def  DrawAndCountCountry():

         athlete_winners = athlete[athlete.Medal.notnull()]

         winner_team = athlete_winners.groupby(['Team','Year']).size().to_frame('medal_count').reset_index().sort_values('Year',ascending=False)

         winner_team = winner_team[winner_team.Team == "China"]

 

         ax = winner_team.plot(x='Year',y='medal_count')

         ax.set_title( "China")

         ax.set_xlabel('Year')

         ax.set_ylabel('Counts')

         plt.show()

 

数据分析的可以看到在2008年我们达到了顶峰,当然也是主场作战,但从1986年开始总体是越来越好的

奥林匹克历史数据分析与金牌预测(上)_第6张图片

 

问题4:找出举办奥运会最多Top 5城市

                   分析这个问题很简单主要是找到城市对应的分组即可。

奥林匹克历史数据分析与金牌预测(上)_第7张图片

 

问题5:每届奥运会男女运动员的比例走势图?

 

def DrawSexTrend():

         #分别统计每年男女运动员数量

         sexathlete = athlete.groupby(["Year","Sex"]).size()

         #将树形索引变为表格索引

         sexathlete = sexathlete.unstack()

         ax = sexathlete.plot()

         ax.set_title( "Sex")

         ax.set_xlabel('Year')

         ax.set_ylabel('Counts')

         plt.show()

 

从绘制的图表看到男性运动员的数量远远超过女性运动员,但这种情况正在好转,大有接近的趋势。

奥林匹克历史数据分析与金牌预测(上)_第8张图片

 

 

问题6:男性与女性运动员参与最多的运动项目

 

def StatSexEvents():

         sexevents = athlete.groupby(["Event","Sex"]).size().sort_values(ascending=False).reset_index()

         print (sexevents[sexevents.Sex=='M'].head(5))

         print (sexevents[sexevents.Sex=='F'].head(5))

 

 

可以看到男性运动员中足球参与的人数最多,女性中是女排,可惜呀,中国男足一直不争气。

奥林匹克历史数据分析与金牌预测(上)_第9张图片

 

问题5:近几年奥运会新增了哪些项目,又去除了哪些项目?

 

def LastNewEvents():

         #将所有的重复项目都去除,这样留下的就是每年新增的

         yeathlete = athlete[["Year","Event"]].sort_values('Year',ascending=True).drop_duplicates(subset=['Event'],keep='first')

         print ("Which were the last 5 events to be included in the Olympics?")

         print (yeathlete.sort_values(["Year"], ascending= False).head(5))

         #将所有项目按照时间降序排列

         yeathlete = athlete[["Year","Event"]].sort_values('Year',ascending=False).drop_duplicates(subset=['Event'],keep='first')

         print ("\nWhich were the last 5 events taken out from Olympic?")

         print (yeathlete[yeathlete.Year != 2016].head(5))

 

 

奥林匹克历史数据分析与金牌预测(上)_第10张图片

 

 

从上面数据可以看出为什么女性运动员越来越多了,因为2016新增的五项赛事有四项都是针对女性运动员的。

你可能感兴趣的:(大数据分析与机器学习)