大鹏教你数据分析系列--运动员身材都是完美的吗

本博客记录学习数据分析的思考和心得

本博客会分享数据源码,以及在学习数据分析过程中,学习到的内容和本人不熟悉的地方

本节主要研究运动员身材都是完美型吗?

对于平时有健身的朋友们应该知道,衡量一个人身材是否完美有一个公式,即是BMI值

那么如何判断自己的身材是否完美尼,来一起计算一下自己的BMI值把!向完美身材看齐!

BMI = 体重/身高的平方(体重单位是KG,身高单位是米)

 本次主要绘制的目标如下图,每个项目的运动员的BMI值分布

那么绘制上图,也需要经过以下几步

  • 加载数据
  • 数据预处理与清洗 (如何处理缺失值,数据填充等数据处理常见的处理方式)
  • 绘制小提琴图形
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 12 09:36:35 2019
绘制小提琴图
运动员身体都是完美的吗?BMI = weight/height(mi)**2
@author: zss0330816
"""

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_excel(r"D:\数据分析\数据分析师\classdata\奥运运动员数据.xlsx", 
                   sheetname=1)
#print(df)
#df_length = len(df)
#df_columns = df.columns.tolist()
data = df[['event', 'name', 'height', 'weight']]#选择数据项

#去除数据个数小于15的项目, 去除缺失值,数据清洗
# data2['event'].value_counts()#可以看见每个项目的个数,去除项目较少的
data2 = data[data['event']!='swim']#发现只有swim小于15,删除该项目
data2.dropna(inplace=True)#处理空数据,使用dropna方法,处理
data2['BMI'] = data2['weight']/(data2['height']/100)**2#新增BMI列,计算每个运动员的BMI值
data2['BMI_range'] = pd.cut(data2['BMI'],[0, 18.5, 24, 28, 50], 
     labels=['thin', 'normal', 'strong', 'very strong'])


plt.figure(figsize=(12, 6))#绘图大小
#小提琴图
sns.violinplot(x='event', y='BMI', data = data2,
               scale = 'count', palette='hls',
               inner='quartile')  #palette 颜色盘 Reds Blues

#图中的白点, 散点,
sns.swarmplot(x='event', y='BMI',data=data2, color='white', alpha=0.8,s=3)#透明度,s圆点的宽度

plt.grid(linestyle='--', alpha=0.5)#辅助线和透明度
plt.title("athlete's BMI")
plt.savefig("athlete's BMI", dpi=300)#dpi像素

 上述代码,有几个常用的知识点,在此mark一下

data2.dropna(inplace=True)

 上述代码是为了处理空值数据,使用的方法是直接删除,也可以进行填充,后续会有介绍的

data2['BMI_range'] = pd.cut(data2['BMI'],[0, 18.5, 24, 28, 50], 
     labels=['thin', 'normal', 'strong', 'very strong'])

这里使用的是pandas库中的cut方法,将BMI值按照区间划分,并在相应区间给予标签值,比如数据落入0-18.5区间,该运动员BMI则属于‘thin’,属于比较瘦

 在此以简单的小例子,看一下实验效果

pandas.cut(x,bins,right=True,labels=None,retbins=False,precision=3,include_lowest=False)


pd.cut([1,10, 11,23,30], [0, 10, 20,32], labels=['<10', '<20', '<30'], right=True, include_lowest=True)
Out[31]: 
[<10, <10, <20, <30, <30]
Categories (3, object): [<10 < <20 < <30]

pd.cut([0, 1,10, 11,23,30], [0, 10, 20,32], labels=['<10', '<20', '<30'], right=True)
Out[33]: 
[NaN, <10, <10, <20, <30, <30]
Categories (3, object): [<10 < <20 < <30]
  1. bins=[0, 10, 20,  32],right=True,包含右端点, include_lowest=True,包含左端点,则区间为[0,10],(10,20], (20,32];right=False,则区间为(1,10),(10,20)。
  2.  include_lowest=False,不包含左端点,是默认值,则区间不包含左端点,即第一个取值为NaN,那么上述区间划分为为(0,10],(10,20], (20,32];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值