一、数据加载与基本信息检查
#例9.5
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings#引入第三方库plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
warnings.filterwarnings('ignore') #防止弹出
df=pd.read_csv(r'D:**冠心病.csv') #读取文件
print(df.shape)
df.head(10)
df.describe().T# 统计学分析
# df.info()# 检查有多少缺失的数据
df.isnull().sum()
sns.distplot(df['age'])
plt.show()
sns.distplot(df['sex']) #绘制性别分布情况的频数分布表
plt.show()
sns.boxplot(x=df["TenYearCHD"],y=df["BMI"]) #绘制BMI与冠心病发病情况分布的箱图
plt.show()

1. 数据加载与基本信息检查
df = pd.read_csv(r'**冠心病.csv')
print(df.shape) # 输出数据维度(行数, 列数)
df.head(10) # 显示前10行数据
df.describe().T # 输出统计描述(均值、标准差、分位数等,转置后更易读)
# df.info() # 检查数据类型和缺失值(被注释)
df.isnull().sum() # 统计每列的缺失值数量
describe().T
转置后,统计量(如均值、最大值)按列显示,更清晰。isnull().sum()
直接输出缺失值数量,帮助判断是否需要数据清洗。
2. 数据可视化分析
(1) 年龄分布直方图
sns.distplot(df['age'])
plt.show()
- 功能:绘制年龄的分布曲线(直方图 + 核密度估计)。
- 用途:检查年龄是否服从正态分布或存在异常值(如年龄为负数)。
(2) 性别分布直方图
sns.distplot(df['sex'])
plt.show()
- 问题:性别通常是分类变量(0/1),使用
distplot
不直观。 - 建议:改用计数图(
sns.countplot
)更合适:
sns.countplot(x='sex', data=df)
plt.title('性别分布(0=女,1=男)')
plt.show()
(3) BMI与冠心病发病情况的箱线图
sns.boxplot(x=df["TenYearCHD"], y=df["BMI"])
plt.show()
- 功能:比较冠心病患者(
TenYearCHD=1
)与非患者(TenYearCHD=0
)的BMI分布差异。 - 解读:
- 箱线图显示中位数、四分位数和异常值。
- 若两组箱体位置明显不同,说明BMI可能与冠心病相关。
3. 代码优化建议
(1) 缺失值处理
- 如果
isnull().sum()
显示有缺失值,需补充处理逻辑,例如
df.fillna(df.median(), inplace=True) # 用中位数填充数值型缺失值
(2) 更直观的性别分布图
- 使用
countplot
替代 distplot
:
sns.countplot(x='sex', data=df, palette='Set2')
plt.title('性别分布(0=女,1=男)')
plt.show()
(3) 添加图表标签和标题
sns.boxplot(x="TenYearCHD", y="BMI", data=df)
plt.xlabel('是否患冠心病(0=否,1=是)')
plt.ylabel('BMI指数')
plt.title('冠心病患者的BMI分布对比')
plt.show()
(4) 多变量联合分析
- 探索更多特征与冠心病的关系,例如年龄与发病率的趋势:
sns.boxplot(x="TenYearCHD", y="age", data=df)
plt.xlabel('是否患冠心病')
plt.ylabel('年龄')
plt.show()
4. 关键输出说明
-
df.describe().T
:
- 输出每列数据的统计量,如:
age
的均值、最大值(判断是否存在不合理年龄)。BMI
的标准差(判断数据离散程度)。
-
df.isnull().sum()
:
age 0
sex 2
BMI 5
TenYearCHD 0