本博客记录学习数据分析的思考和心得
本博客会分享数据源码,以及在学习数据分析过程中,学习到的内容和本人不熟悉的地方
本节主要研究运动员身材都是完美型吗?
对于平时有健身的朋友们应该知道,衡量一个人身材是否完美有一个公式,即是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]
- bins=[0, 10, 20, 32],right=True,包含右端点, include_lowest=True,包含左端点,则区间为[0,10],(10,20], (20,32];right=False,则区间为(1,10),(10,20)。
- include_lowest=False,不包含左端点,是默认值,则区间不包含左端点,即第一个取值为NaN,那么上述区间划分为为(0,10],(10,20], (20,32];