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

╭(●｀∀´●)╯╰(●’◡’●)╮

##### 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 先总体看下大家的身高分布

``````# 读取数据
import os
os.chdir(r'..\Desktop\python_project6')

# ①制作分布密度图
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) 年龄

BMI快速查询表

BMI等各种指标

``````# 整理数据：删除缺失值及不合理的数据
data02 = data[['name','birthday','height','weight','arm','leg']]
data02.dropna(inplace=True)  # 删除缺失值
data02.drop([202],axis=0,inplace=True) # 原表中“曹缘”出现两次，除年龄列外无任何不同，故删掉一行

# 通过出生日期计算年龄
#（原表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):
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综合热度，通过python处理数据并导出，在Gephi中绘制图表

# 数据预处理
import os
os.chdir(r'..\Desktop\python_project6')

# 整理数据：缺失值替换为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[▓▓] 溜了溜了。

### 推荐阅读更多精彩内容

• 硬派健身 摘要 自序 与更好的自己，在未来重逢。 2016-10-11 13:34:10 是谁说运动一定要持续40...
夜上海滩阅读 9,443评论 0 49
• 一不留神女儿九岁了。过了这个暑假上四年级，可我怎么看她还是个幼儿园的宝宝，长得有点慢。难道是我天天说“孩子慢点长大...
豫江阅读 966评论 3 9
• 午饭过后，沏上一杯热茶心思随着春天的风飘走啦.我开始放空自己想象爱情的样子，是冰箱里多出的酸奶，被窝里触到的双脚，...
读不出先生阅读 177评论 0 2
• 谈到修行，在中国除佛道宗教之外，儒家最注重个人修身，他们终极人生理想就是修身、齐家、治国、平天下，把修身放...
老愚_f704阅读 937评论 4 5
• 亲爱的端端宝贝: 我是妈妈，你还在妈妈的肚子里，不知道你是男孩还是女孩。有时觉得你是男孩，因为你把妈妈折腾的要...
小葱1阅读 199评论 0 1