数据分析 | 奥运小哥哥小姐姐们的身材了解一下

作者: 娜某人 | 来源:发表于2018-07-17 00:47 被阅读21次

    彭于晏这种就是虚肌肉,就是吃各种蛋白质增肌。看上去很结实,其实没卵用。打个比方就是我和他单挑,过不了五秒,他就会跪在我面前掐着我的人中求我不要死。
    ╭(●`∀´●)╯╰(●’◡’●)╮

    皮一下很开心!言归正传,你觉得运动员里谁的身材最好呢?是帝国猛虎张继科?还是洪荒少女傅园慧?还是花剑王子施嘉洛?(大脑一下子被各种帅气的小哥哥小姐姐塞满了无法思考……)那就看小爷我今天用数据说话,花式分析一波小哥哥小姐姐们的身材吧! 嘿嘿嘿
    0 第一步先把冰箱门打开:

    很急,不解释了,快上车!

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    % matplotlib inline
    
    from pylab import mpl
    mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
    mpl.rcParams['axes.unicode_minus'] # 正常显示负号
    
    import warnings
    warnings.filterwarnings('ignore')
    
    1 先总体看下大家的身高分布
    运动员身高分布

    图中两条辅助线说明女性运动员的平均身高170.0,男性平均身高180.8(//▽//),下面像梳子一样的短细线代表了数据分布频率。这张图用到了seaborn绘制密度图,方法是sns.distplot()。辅助线和注释用来展示平均水平(plt.axvline,plt.annotate)。分享一下实现这张运动员身高分布图的代码:

    # 读取数据
    import os
    os.chdir(r'..\Desktop\python_project6')
    data01 = pd.read_excel('奥运运动员数据.xlsx',sheetname='运动员信息',header = 0)
    #print(data01.head())
    
    # ①制作分布密度图
    data_female = data01[data01['gender'] == '女']
    data_male = data01[data01['gender'] == '男']
    
    # 设置风格及大小
    sns.set_style("ticks")
    plt.figure(figsize = (10,6)) 
    # 女性运动员
    sns.distplot(data_female['height'],
                 rug = True, rug_kws = {'color':'yellowgreen'},
                 kde_kws={'color': 'yellowgreen', 'lw': 2, 'label': 'female_height','linestyle':'--'},
                 hist_kws={'alpha': 0},
                 vertical = False  
                 )
    #男性运动员
    sns.distplot(data_male['height'],
                 rug = True, rug_kws = {'color':'gold','height':0.1},
                 kde_kws={'color': 'gold', 'lw': 2, 'label': 'female_height','linestyle':'--'},
                 hist_kws={'alpha': 0},
                 vertical = False  
                 )
    
    # ②计算出男女平均身高,并绘制辅助线表示
    data_Mean_byGender = data01.groupby('gender').mean()
    #print(data_Mean_byGender)
    
    female_height_mean = data_Mean_byGender.loc['女']['height']
    male_height_mean = data_Mean_byGender.loc['男']['height']
    
    # 绘制辅助线
    plt.axvline(female_height_mean,linestyle = ':',color = 'yellowgreen',alpha = 0.9)
    plt.axvline(male_height_mean,linestyle = ':',color = 'gold',alpha = 0.9)
    # 添加注释
    plt.annotate('female_height_mean: %.1f cm'%female_height_mean,xy=(female_height_mean+1,0.01),color='yellowgreen')
    plt.annotate('male_height_mean: %.1f cm'%male_height_mean,xy=(male_height_mean+1,0.005),color='gold')
    # 其他设置
    plt.xlim([120,260])  # x轴边界
    plt.ylim([0,0.03])   # y轴边界
    plt.grid(True, linestyle = '--',color = 'gray', linewidth = '1',alpha = 0.2) # 添加网格
    plt.title( "Athlete's height") # 添加标题,标题本身含有单引号,故此处字符串用双引号
    
    2 身材可不止身高这一个维度啊

    身材好不好,光看照片还真比不出来,要用数据说话~
    我们今天用这几个指标比身材:

    (1) 体质指数 BMI (Body Mass Index)
    (2) 腿身比 LBR (Leg-to-Body Ratio)
    (3) 臂长/身长
    (4) 年龄

    关键词1:身高体重指数 BMI

    BMI快速查询表
    “身高体重指数”这个概念,是由19世纪中期的比利时统计学家数学家凯特勒(Lambert Adolphe Jacques Quetelet)最先提出。它的定义如下:
    对于亚洲成年人,体重标准是少于27.5,理想指数是18.5至23.9。

    关键词2:腿身比 LBR
    腿身比是腿长与身高的比值。这里我们只选取小于0.7的数据,在这个范围内越大越好。

    关键词3:臂长比身长
    高于平均水平的臂长在篮球,拳击,击剑和游泳等运动中是有利的。所以臂长与身长的比值也将作为一项重要指标,这里我们只选取大于0.7的数据,比值越接近1越好。

    关键词4:年龄
    这 有 什 么 好 解 释 的!!年龄越小越好!! ╥﹏╥

    快来看看结果:

    BMI等各种指标 身材Top8的运动员

    蹬蹬蹬蹬!想不到吧!!上面这几个人才是数据选出来的好身材~
    第一名不仅身材好,还是击剑冠军,还会唱歌!我要pick这位小哥了!(..•˘_˘•..)

    施嘉洛

    算了还是先分享下代码:

    # 整理数据:删除缺失值及不合理的数据
    data02 = data[['name','birthday','height','weight','arm','leg']]
    data02.dropna(inplace=True)  # 删除缺失值
    data02.drop([202],axis=0,inplace=True) # 原表中“曹缘”出现两次,除年龄列外无任何不同,故删掉一行
    #print(data02.head())
    
    # 通过出生日期计算年龄
    #(原表age列存在空值,同时也有可能不是今年统计的年龄数据,故采用birthday列先求年龄)
    import datetime
    days = datetime.datetime.today() - data02['birthday']
    age = []
    for i in days:
        age.append(round(i.days/365)) # round()四舍五入
    data02['age'] = age
    data02['BMI'] = data02['weight'] / ((data02['height']/100)**2)
    data02['leg/height'] = data02['leg'] / data02['height']
    data02['arm/height'] = data02['arm'] / data02['height']
    data02 = data02[data02['leg/height'] <0.7] # leg/height只选取小于0.7的数据
    data02 = data02[data02['arm/height'] >0.7] # arm/height只选取大于0.7的数据
    
    # 计算标准化得分
    # 年龄越小得分越高
    data02['age_n'] = (data02['age'].max() - data02['age']) / (data02['age'].max() - data02['age'].min())
    
    # BMI值越接近22得分越高
    data02['BMI_score'] = np.abs(data02['BMI']-22)
    data02['BMI_n'] = (data02['BMI_score'].max() - data02['BMI_score']) / (data02['BMI_score'].max() - data02['BMI_score'].min())
    
    # leg/height比值只选取小于0.7的数据,越大分数越高
    data02['leg/height_n'] = (data02['leg/height'] - data02['leg/height'].min()) / (data02['leg/height'].max() - data02['leg/height'].min())
    
    # arm/height比值只选取大于0.7的数据,比值越接近1分数越高
    data02['arm/height_score'] = np.abs(data02['arm/height']-1)
    data02['arm/height_n'] = (data02['arm/height_score'].max() - data02['arm/height_score']) / (data02['arm/height_score'].max() - data02['arm/height_score'].min())
    
    # 计算最终得分,并按照最终得分排序
    data02['final_score'] = (data02['age_n']+data02['BMI_n']+data02['leg/height_n']+data02['arm/height_n']) / 4
    data02.sort_values('final_score',ascending = False,inplace = True)
    data02.reset_index(inplace=True)
    
    # ①针对不同指标,绘制面积堆叠图
    
    # 面积图
    data02[['age_n','BMI_n','leg/height_n','arm/height_n']].plot.area(colormap = 'PuRd',alpha = 0.6,figsize=(16,8))
    plt.xlim([0,len(data02)])  # x轴边界
    plt.ylim([0,4])   # y轴边界
    plt.grid(True, linestyle = '--',color = 'gray', linewidth = '1',alpha = 0.5) # 添加网格
    plt.legend(loc='upper right')
    plt.title( "Athlete's Infomation")
    
    # ②TOP8的运动员,绘制雷达图表示
    data02_top = data02[['name','index','age_n','BMI_n','leg/height_n','arm/height_n','final_score']][:8]
    data_ranking = data02_top.T
    
    fig = plt.figure(figsize=(16,10))
    dataLenth = 4 # 4个方面
    labels = ['BMI','腿长/身高','臂长/身高','年龄'] # 4个方面对应的标签
    
    for i in range(1,9):
        axi = fig.add_subplot(2,4,i,polar=True)
        datai = list(data_ranking[i-1].loc[['BMI_n','leg/height_n','arm/height_n','age_n']])
        angles = np.linspace(0, 2*np.pi, dataLenth, endpoint=False) # 设置雷达图的角度,用于平分切开一个圆面
        datai = np.concatenate((datai, [datai[0]])) # 为了使雷达图一圈封闭起来
        angles = np.concatenate((angles, [angles[0]])) # 为了使雷达图一圈封闭起来
    
        plt.polar(angles,datai,'o-',linewidth=1,c ='purple',alpha=i*0.1) # 绘制极坐标系子图
        plt.fill(angles,datai,c ='mediumvioletred',alpha =(9-i)*0.1)# 填充
        plt.thetagrids(angles * 180/np.pi, labels) # 设置网格、标签
        plt.title('Top%i %s:%.3f\n'%(i,data02_top.loc[i-1]['name'],data02_top.loc[i-1]['final_score'])) # 设置标题
        plt.ylim(0,1.2)  # 设置坐标轴范围
    
    3 后面害有一丢丢瓜可以吃

    整天看各大博主扒运动员和明星们之间各种CP大戏,娜娜酱也忍不住想用数据研究下他们各种CP热度~(源数据是微博数量、微博CP话题阅读量、B站CP视频播放量。需要用python预处理一下,再导入Gephi中查看他们之间的关系网络。)

    CP关系网络

    等等,我好像看到了什么了不得的东西…


    谢霆锋和林丹组CP了?!
    嗯?这是什么瓜,我怎么没见过
    疯狂撒狗粮的一组

    最后悄悄分享一下预处理的代码:

    #分析CP综合热度,通过python处理数据并导出,在Gephi中绘制图表
    
    # 数据预处理
    import os
    os.chdir(r'..\Desktop\python_project6')
    data03 = pd.read_excel('奥运运动员数据.xlsx',sheetname='运动员CP热度',header = 0)
    #print(data03.head())
    
    # 整理数据:缺失值替换为0,同一组CP数据相加
    data03.replace(np.nan,'无数据',inplace = True)
    data03.replace('无数据',0,inplace = True)
            
    # 计算标准化得分
    data03['weibo_n'] = (data03['cp微博数量']-data03['cp微博数量'].min()) / (data03['cp微博数量'].max()-data03['cp微博数量'].min())
    data03['weiboTopic_n'] = (data03['cp微博话题阅读量']-data03['cp微博话题阅读量'].min()) / (data03['cp微博话题阅读量'].max()-data03['cp微博话题阅读量'].min())
    data03['BiliBili_n'] = (data03['B站cp视频播放量']-data03['B站cp视频播放量'].min()) / (data03['B站cp视频播放量'].max()-data03['B站cp视频播放量'].min())
    
    # 计算最终得分,并按照最终得分排序
    data03['final_score'] = data03['weibo_n']*0.5 + data03['weiboTopic_n']*0.3 + data03['BiliBili_n']*0.2
    data03.sort_values('final_score',ascending = False,inplace = True)
    data03.reset_index(inplace=True)
    
    # 导出excel
    result = data03[['p1','p2','final_score']]
    writer = pd.ExcelWriter('运动员CP热度.xlsx')
    result.to_excel(writer,'sheet1')
    writer.save()
    

    今天也是八卦满满的一天!!
    也许你还想看看:数据分析,从入门到放弃

    (:3[▓▓] 溜了溜了。
    谢谢您阅读,请勿转载。

    相关文章

      网友评论

      本文标题:数据分析 | 奥运小哥哥小姐姐们的身材了解一下

      本文链接:https://www.haomeiwen.com/subject/sluipftx.html