医疗花费预测——协方差矩阵和热力图
引言
在医疗数据分析中,预测个人的医疗花费是一个重要的课题。这不仅有助于个人健康管理,也为医疗资源的合理分配提供了数据支持。本篇博客,我们将探讨如何利用协方差矩阵和热力图来分析和预测个人的医疗花费。我们将以DataFountain提供的数据为基础,结合pandas库中的cov()
方法和seaborn库的heatmap()
函数,来实现这一目标。
一、协方差的定义
在统计学中,协方差(Covariance)是用来衡量两个随机变量之间的变动趋势是否一致的指标。协方差为正表示两个变量正向关系;协方差为负表示两个变量反向关系;协方差为0表示两个变量没有线性关系。
协方差可以通过以下公式计算:
其中,和
是两个随机变量,
和
是它们的观测值,
和
分别是
和
的均值,
是样本数量。
二、协方差矩阵的定义
协方差矩阵是一个的矩阵,其中
是变量的数量。协方差矩阵的第
个元素表示第
个变量和第
个变量之间的协方差。
假设我们有个一维随机变量
。如果我们将它们按列组成一个
的矩阵
(
是样本数量),则协方差矩阵CC的每个元素可以通过以下公式计算:
三、协方差矩阵的计算
协方差矩阵是描述数据集中各特征之间协方差关系的矩阵。在Python中,我们可以使用pandas库的cov()
方法来计算协方差矩阵。以下是计算协方差矩阵的代码示例:
import pandas as pd
from sklearn.preprocessing import OrdinalEncoder# 读取数据
train = pd.read_csv('E:/H1/shujvfenxiyukeshihua/资料/第6章 医疗花费预测/train.csv')# 进行编码
encoder = OrdinalEncoder(dtype=int)
train[['sex', 'smoker', 'region']] = encoder.fit_transform(train[['sex', 'smoker', 'region']])# 查看协方差矩阵
cov_matrix = train.cov()
print(cov_matrix)
协方差矩阵输出如下:
从协方差矩阵中,我们可以看到不同特征之间的协方差值。例如,年龄(age)与BMI(bmi)的协方差为10.080775,这表明两者之间存在正相关关系。而吸烟者(smoker)与医疗花费(charges)的协方差为3773.101975,这是一个非常高的值,表明吸烟与医疗花费之间有很强的正相关性。
四、热力图
1.热力图的定义
热力图是一种通过颜色来展示数据的二维矩阵可视化方法。它将数据矩阵中的每个元素的值映射到一个颜色尺度上,颜色的深浅或色调表示数据值的大小。在协方差矩阵或相关性矩阵的可视化中,热力图尤其有用,因为它可以帮助我们直观地查看数据集中各个特征之间的关系。
2.热力图的绘制
在Python中,我们可以使用Seaborn库来绘制热力图。Seaborn的heatmap
函数可以快速生成热力图,通过传入数据矩阵和颜色映射参数等,我们可以直观地展示协方差矩阵。
示例:
import pandas as pd
from sklearn.preprocessing import OrdinalEncoder
import numpy as np
import seaborn
train = pd.read_csv("D:/大三上/数据分析与可视化/实验文件/第6章 医疗花费预测/train.csv")
encoder = OrdinalEncoder(dtype=int)
train[['sex','smoker','region']]=\
encoder.fit_transform(train[['sex','smoker','region']])
seaborn.heatmap(train.corr())
代码解释:
导入必要的库,其中pandas 用于数据处理和分析;
OrdinalEncoder 用于将分类变量转换为整数编码;
numpy 用于数值计算;
seaborn 用于数据可视化。
对分类特征进行编码:
train[['sex','smoker','region']] = encoder.fit_transform(train[['sex','smoker','region']])
这行代码选择了sex(性别)、smoker(是否吸烟)和region(地区)这三个分类特征,使用OrdinalEncoder进行编码,并将编码后的结果替换原来的特征值。
seaborn.heatmap(train.corr())
这行代码计算了数据集中所有数值特征之间的相关性矩阵,使用seaborn库的heatmap函数绘制热力图。热图中的每个方块代表两个特征之间的相关性,颜色越接近1(或-1),表示两个特征之间的正(或负)相关性越强。
运行结果如下:
相关系数是对协方差的标准化,取值范围为 [-1, 1]。
• 1 表示完全正相关,-1 表示完全负相关,0 表示无线性关系。
• 相关系数的绝对值越接近 1,线性关系越强。此处 charges 和 bmi 的相关系数接近 0.3,说明有一定的正相关性,但不算强。
增强可读性:
在热图中,可以添加数值显示、调整颜色映射或设置标题等,使图表更直观。 annot=True:在每个单元格上显示相关系数的数值。 cmap='coolwarm':改变颜色映射,更容易区分正负相关。
fmt='.2f':指定小数点后两位显示。
import pandas as pd
from sklearn.preprocessing import OrdinalEncoder
import seaborn as sns
import matplotlib.pyplot as plt# 读取数据
train = pd.read_csv('E:/H1/shujvfenxiyukeshihua/资料/第6章 医疗花费预测/train.csv')# 进行编码
encoder = OrdinalEncoder(dtype=int)
train[['sex', 'smoker', 'region']] = encoder.fit_transform(train[['sex', 'smoker', 'region']])# 计算相关性矩阵
corr_matrix = train.corr()# 使用 seaborn 生成热力图,并指定不同的颜色映射
plt.figure(figsize=(10, 8)) # 可以调整图的大小cmap = 'viridis' # 黄绿色到深紫色sns.heatmap(corr_matrix, cmap=cmap, annot=True, fmt='.2f', square=True, cbar_kws={"shrink": .5})# 显示图形
plt.show()
运行结果:
seaborn 提供了多个内置的配色方案(cmap),常用的包括:coolwarm:适合表示正负相关,蓝色表示负相关,黄色表示正相关,过渡色为蓝色或绿色。由上图可以得出,吸烟与医疗消费的相关性最大。
3.分析
如果两个特征之间的相关系数接近 1 或 -1(如相关系数 > 0.9 或 < -0.9),这意味着这两个特征之间存在多重共线性。这种情况下,模型可能难以确定它们对目标变量的独立影响,因为它们包含了相似的信息。解决方法如下:去除冗余特征:热力图中高相关的特征对,可以考虑去除其中一个特征,或者用降维技术(如PCA)来处理。
使用相关性较低的特征:我们可以优先选择那些与其他特征相关性较低的特征,它们可以提供更多独立的信息,避免冗余和多重共线性。例如,region 与其他特征的相关系数较低,它可能是一个较为独立的特征,可以保留。