基于线性回归对男性体脂率的预测
本项目包含:
1.数据探索性分析
2.线性回归预测体脂率
数据集和代码链接放在文末
一、数据说明
二、前置知识
三、数据导入
import pandas as pd
df = pd.read_csv('/home/mw/input/bodyfat8096/bodyfat.csv')
df.head()
df.isnull().sum()
Density 0
BodyFat 0
Age 0
Weight 0
Height 0
Neck 0
Chest 0
Abdomen 0
Hip 0
Thigh 0
Knee 0
Ankle 0
Biceps 0
Forearm 0
Wrist 0
dtype: int64
四、EDA
4.1 单位转换
体重单位是磅,身高单位是英寸,根据说明,其他字段单位都是cm,所以我们先做一个单位的转换
1磅 = 0.45359237kg
1英寸 = 2.54cm
df['Weight'] = df['Weight']*0.45359237
df['Height'] = df['Height']*2.54
df.head()
4.2 年龄分布
我们可以看出,本数据的最大年龄为81岁,最小年龄为22岁;根据年龄分布图来看,大部分被调查者处于60岁以下,根据下图的对照表来说,这个范围内男性标准的体脂率应该为11~22%,下面我们看一下实际的体脂率
print('最大年龄为:{}岁;最小年龄为:{}岁。'.format(max(df['Age']),min(df['Age'])))
最大年龄为:81岁;最小年龄为:22岁。
from matplotlib import pyplot as plt
%matplotlib inline
import seaborn as sns
fig,ax = plt.subplots(figsize=(6,3), dpi=120)
plt.hist(x = df.Age, # 指定绘图数据
bins = 15, # 指定直方图中条块的个数
color = 'skyblue', # 指定直方图的填充色
edgecolor = 'black' # 指定直方图的边框色
)
# 添加x轴和y轴标签
plt.xlabel('年龄')
plt.ylabel('频数')
# 添加标题
plt.title('年龄分布')
4.3 体脂率分布
可以看出,体脂率偏高的人多一些,但是数据存在异常,最小体脂率竟然为0?我们查出来是哪一行数据,后续将其剔除。
fig,ax = plt.subplots(figsize=(6,3), dpi=120)
plt.hist(x = df.BodyFat, # 指定绘图数据
bins = 15, # 指定直方图中条块的个数
color = 'skyblue', # 指定直方图的填充色
edgecolor = 'black' # 指定直方图的边框色
)
# 添加x轴和y轴标签
plt.xlabel('体脂率')
plt.ylabel('频数')
# 添加标题
plt.title('体脂率分布')
4.4 矩阵图分析体脂率和其他变量的关系
可以看出,除了密度和身高外,其他变量和体脂率的趋势关系都差不多
plt.figure(figsize=(10,8), dpi= 80)
for index in range(len(list(df))):
sns.pairplot(df, x_vars=list(df)[index],height = 4,
aspect=2,y_vars=['BodyFat'],kind="reg")
4.5各变量热力图
五、建模分析
5.1 相关性分析
#特征多了,不好挑,写个相关系数高于就选出来的函数
def corr_del(df,rate):
feature_names = list