
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
data = pd.read_csv("heart.csv")
print(data.head(10))
# age:年龄
# sex:性别
# cp:胸痛类型
# trestbps:静息血压
# chol:胆固醇
# fbs:空腹血糖
# restecg:静息心电图
# thalach:最大心率
# exang:运动诱发心绞痛
# oldpeak:旧峰值(医学上常指运动后 ST 段压低)
# slope:斜率
# ca:冠状动脉(钙化情况)
# thal:地中海贫血(或心肌灌注等医学相关指标)
# target:目标
print(data.isnull().sum())
# 设定唯一值数量的阈值
threshold = 10
# 创建一个空列表,用于存储离散变量的列名
discrete_vars = []
# 遍历 data 中的所有列
for col in data.columns:
# 计算当前列的唯一值数量
unique_values = data[col].nunique()
# 判断唯一值数量是否小于等于阈值
if unique_values <= threshold:
# 如果满足条件,将该列的列名添加到离散变量列表中
discrete_vars.append(col)
# 打印出识别出的离散变量的列名
print("离散变量有:", discrete_vars)
# 识别连续变量,从数值型变量中排除离散变量
all_numeric_vars = data.select_dtypes(include=['number']).columns
continuous_vars = [var for var in all_numeric_vars if var not in discrete_vars]
# continuous_vars = pd.Index(continuous_vars) # 转换回 pandas.Index 类型
# 打印整理出的连续变量
print("连续变量有:", (continuous_vars))
# 定义映射字典
mapping = {
'cp': {0: 0, 1: 1, 2: 2, 3: 3},
'restecg': {0: 0, 1: 1, 2: 2},
'slope': {0: 0, 1: 1, 2: 2},
'ca': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4},
'thal': {0: 0, 1: 1, 2: 2, 3: 3}
}
for feature, mapping in mapping.items():
data[feature] = data[feature].map(mapping)
print(data.head(10))
# 设置全局字体为支持中文的字体 (例如 SimHei)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 解决负号'-'显示为方块的问题
plt.rcParams['axes.unicode_minus'] = False
# 计算相关系数矩阵
correlation_matrix = data[continuous_vars].corr()
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 绘制热力图
plt.figure(figsize=(6, 5))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
plt.title('连续变量相关性热力图')
plt.show()
# 绘制子图
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 创建一个包含 2 行 2 列的子图布局
fig, axes = plt.subplots(3, 2, figsize=(22, 4))
# 使用 for 循环遍历特征
for i in range(len(continuous_vars)):
row = i // 2 # 计算当前特征在子图中的行索引,// 是整除,即取整 ,之所以用整除是因为我们要的是行数
# 例如 0//2=0, 1//2=0, 2//2=1, 3//2=1
col = i % 2 # 计算当前特征在子图中的列索引,% 是取余,即取模
# 例如 0%2=0, 1%2=1, 2%2=0, 3%2=1
# 绘制箱线图
feature = continuous_vars[i]
axes[row, col].boxplot(data[feature].dropna())
axes[row, col].set_title(f'Boxplot of {feature}')
axes[row, col].set_ylabel(feature)
# 调整子图之间的间距
plt.tight_layout()
# 显示图形
plt.show()
# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
# 创建一个包含 2 行 2 列的子图布局,其中
fig, axes = plt.subplots(3, 2, figsize=(22, 4))#返回一个Figure对象和Axes对象
# 这里的axes是一个二维数组,包含2行2列的子图
# 这里的fig是一个Figure对象,表示整个图形窗口
# 你可以把fig想象成一个画布,axes就是在这个画布上画的图形
# 遍历特征并绘制箱线图
for i, feature in enumerate(continuous_vars):
row = i // 2
col = i % 2
axes[row, col].boxplot(data[feature].dropna())
axes[row, col].set_title(f'Boxplot of {feature}')
axes[row, col].set_ylabel(feature)
# 调整子图之间的间距
plt.tight_layout()
# 显示图形
plt.show()



@浙大疏锦行