一、數據加載與基本信息檢查
#例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