Seaborn案例:探索马拉松比赛成绩数据

Seaborn案例:探索马拉松比赛成绩数据

#使用Seaborn探索马拉松比赛成绩数据
import numpy as np
import pandas as pd
%matplotlib inline
import seaborn as sns
import datetime

#把字符串转换成时间类型
def convert_time(s):
    h, m, s = map(int, s.split(':'))
    return datetime.timedelta(hours=h, minutes=m, seconds=s)

data = pd.read_csv('marathon-data.csv', 
                   converters={'split':convert_time, 'final':convert_time})

#增加一列,将时间换算成秒
data['split_sec'] = data['split'].astype(int) / 1E9
data['final_sec'] = data['final'].astype(int) / 1E9
#通过jointplot函数画图,对数据有个认识
with sns.axes_style('white'):
    g = sns.jointplot('split_sec', 'final_sec', data, kind='hex')
    g.ax_joint.plot(np.linspace(4000, 16000), np.linspace(8000, 32000), '--k')

这里写图片描述

图中的实点线表示一个人全程保持一个速度跑完马拉松,即上半程和下半程耗时相同。然而实际的成绩分布表明,绝大多数人都是越往后跑的越慢(也符合常理)

#创建一列(split_frac)来表示前后半程的差异,衡量比赛选手后半程加速或前半程的程度
data['split_frac'] = 1- 2 * data['split_sec'] / data['final_sec']

#如果前后半程差异系数小于0,就表示这个人是后半程加速型选手。下面画出差异系数的分布图
sns.distplot(data['split_frac'], kde=False)
plt.axvline(0, color='k', linestyle='--')

这里写图片描述

#看看前后半程差异系数与其他变量没有没相关性,用矩阵图pairgrid绘制
g = sns.PairGrid(data, vars=['age', 'split_sec', 'final_sec', 'split_frac'],
                 hue='gender', palette='RdBu_r')
g.map(plt.scatter, alpha=0.8)
g.add_legend();

这里写图片描述

从图中可以看出,虽然前后半程差异系数与年龄没有显著的相关性,但是与比赛的最终成绩显著的相关性:全程耗时最短的选手,往往都是前后半程尽量保持节奏一致、耗时非常接近的人。

#对比男女选手的差异,绘制两组选手前后半程差异系数的频次直方图
sns.kdeplot(data.split_frac[data.gender=='M'], label='men', shade=True)
sns.kdeplot(data.split_frac[data.gender=='W'], label='women', shade=True)
plt.xlabel('split_frac')

这里写图片描述

在前后半程耗时接近的选手中,男选手比女选手多很多。男女选手的分布看起来几乎都是双峰分布

#对比两个年龄构成函数的小提琴图
#创建一个新的列,表示每名选手的年龄段
data['age_dec'] = data.age.map(lambda age : 10*(age //10))
men = (data.gender=='M')
women = (data.gender == 'W')
with sns.axes_style(style=None):
    sns.violinplot('age_dec', 'split_frac', hue='gender', data=data,
                   split=True, inner='quartile', palette=['lightblue', 'lightpink'])

这里写图片描述

20多岁到50多岁各年龄段的男选手的前后半程差异系数密度要比同年龄段女选手低一些

#看看前后半程差异系数和比赛成绩的关系
g = sns.lmplot('final_sec', 'split_frac', col='gender', data=data,
                markers='.', scatter_kws=dict(color='c'))
g.map(plt.axhline, y=0.1, color='k', ls=':');

这里写图片描述

似乎后半程加速的选手都是比赛成绩低于15000秒,即4小时以内的种子选手。低于这个成绩的选手很少有显著的后半程加速。

猜你喜欢

转载自blog.csdn.net/jasonzhoujx/article/details/81783354
今日推荐