目录
应用线性回归模型预测医疗费用
实验目的
本次实验旨验证和实践。
1、在通过ppt所示案例进行数据分析,真正目的在于让学生上手R语言,学会使用R studio,以及了解R语言数据分析相关命令和方法。
2、根据所给数据,进行线性回归模型的建立与分析结果。
实验要求
利用已发生的患者的历史数据1000多条样本,包括年龄、性别、BMI(身高/体重的平方,18-24)、孩子数、吸烟者、区域、花费的医疗费用。建立线性回归模型;
对于新样本,根据准备投保的人的特征,预测输出保费的基础定价。
实验原理
基于R语言进行数据预处理、构建回归模型、评估模型以及优化模型。学得一个线性模型以尽可能准确地预测实值输出标记,最后,可以通过实验估计学习算法的泛化性能。
实验仪器、设备、材料或软件等
1、Windows环境
2、R 3.6.3 及以上版本安装
3、Rstudio 2022.07.0-548及以上版本安装
实验内容及步骤
数据预处理
a、查看数据表字段定义
使用insurance <- read.csv("insurance.csv",stringsAsFactors = TRUE)命令载入数据,可见insurance.csv文件中包含1338条数据以及7个相关字段。
b、查看样本结论标签的分布
使用summary进行数据分析,可见insurance.csv文件中charges字段相关数据的计算结果,其中可见最小值为1122,最大值为63770,中位数为9382,平均数为13270。
因为平均数 > 中位数,所以可知数据右偏。
c、查看样本结论标签直方图分布
运行代码hist(insurance$charges)可见insurance表中的医疗费用结果直方图如上。可以看到其中开销主要集中在10000以下,也有少数突破60000。因直方图并不能直观地表现出数据区间的频次,因此再绘制区间的频次饼图。
基于原数据insurance,创建新的字段,将charges划分为7个区间:
insurance$charge_interval <- cut(insurance$charges,
breaks = c(0, 10000, 20000, 30000, 40000, 50000, 60000, Inf),
labels = c("0-10000", "10001-20000", "20001-30000", "30001-40000", "40001-50000", "50001-60000", "60000+"),
include.lowest = TRUE)
进而统计每个区间的数量:
charge_counts <- table(insurance$charge_interval)
创建数据框,用于制作饼图:
charge_data <- data.frame(charge_interval = names(charge_counts),
count = as.numeric(charge_counts))
|
可见数据框中有费用区间以及出现频次。
通过pie绘制饼图。
|
pie(charge_data$count, labels = charge_data$charge_interval, main = "Charges Distribution")
通过饼图可以观测到根据医疗费用区间划分的频次。可见大部分医疗费用开销处在“0-10000”,依次是“10001-20000”,“20001-30000”、“30001-40000”、“40001-50000”这三个区间频次较近,而处于“50001-60000”及“60000+”两个区间的频次较小。
d、查看区域分布
使用teble标签统计区域分布个数,可见图如上,数据分布均匀。
e、查看特征的相关性及相关性图表示
首先使用cor标签查看数据间的相关性:
> cor(insurance[c("age","bmi","children","charges")])
可见除与自身相关性最强外,与之相对的就是孩子数与年龄的相关性居其后,但是总的分析其中所存在的相关性是及其小的,可见指标之间的相关性并不强。
f、更详细的相关图
利用pairs函数绘制矩阵散点图像。首先确保有两个packages:tmvnsim、psych;
依次使用> install.packages("tmvnsim"); > install.packages("psych")下载包;
再使用> library(psych) 加载包“psych”;
绘制矩阵散点图象:> pairs.panels(insurance[c("age","bmi","children","charges")])
得到图像如下。
可以从图中看出指标之间的相关性,例如age与bmi的散点图(第二排第一个图),从中可以看出指标间的相关性系数,例如在数据集insurance中,指标的age与charges的相关系数为0.30.
实验原始数据
此次实验包含两个csv文件:
- ins_test.csv:用于测试模型
age | sex | bmi | children | smoker | region | age2 | bmi30 |
30 | male | 31 | 1 | yes | southwest | 900 | 1 |
20 | female | 25 | 0 | no | northeast | 400 | 0 |
- insurance.csv:已发生的患者的历史数据1338条数据;其中包含年龄、性别、BMI、孩子数、是否抽烟、地区和医疗费用七个字段。
age | sex | bmi | children | smoker | region | charges |
19 | female | 27.9 | 0 | yes | southwest | 16884.92 |
18 | male | 33.77 | 1 | no | southeast | 1725.552 |
… | … | … | … | … | … | … |
21 | female | 25.8 | 0 | no | southwest | 2007.945 |
61 | female | 29.07 | 0 | yes | northwest | 29141.36 |
实验数据处理和结果分析
构建回归模型
a、构建模型
> ins_model <- lm(charges ~ age + children + bmi + sex + smoker + region, data = insurance)
b、查看模型
> ins_model
由图可知线性回归模型用来预测医疗费用charges。模型中包括age(年龄)、children(子女数)、bmi(体质指数)、sex(性别)、smoker(是否吸烟)和region(地区)这些变量作为解释变量。模型的系数表示每个解释变量的影响程度。Intercept是模型的截距,表示当其他变量为0时的保险费用的基准值。age、children、bmi、sexmale(性别为男性)、smokeryes(吸烟者)和reginonwest(地区为西北部)、regionsoutheast(地区为东南部)、regionsouthwest(地区为西南部)分别表示对保险费用的影响。
例如,age的系数为256.9,意味着每增加一岁,保险费用将增加256.9美元。sexmale的系数为-131.3,意味着男性比女性平均要少支付131.3美元的保险费用。smokeryes的系数为23848.5,表示吸烟者相比非吸烟者平均要多支付23848.5美元的保险费用。地区变量的系数是相对于参考地区(regionnortheast)的影响。例如,regionnorthwest的系数为-353.0,表示相对于regionnortheast,西北部地区的保险费用平均要减少353美元。同理,regionsoutheast和regionsouthwest的系数分别为-1035.0和-960.1。
3、评估模型
> summary(ins_model)
用summary标签进行评估模型,得到以上图,图中解释了保险费用(charges)与年龄、子女数、体质指数(bmi)、性别、吸烟与地区等变量之间的关系。模型的拟合度很高(多重 R 平方为0.7509),并且各个变量的系数估计都显著,除了 "sexmale" 这个变量。
4、优化模型
- 优化年龄特征为非线性关系
> insurance$age2 <- insurance$age ^ 2
排除模型中呈现出的“随年级变大会加速生病”的趋势。
- 加强肥胖的特征显著性
> insurance$bmi30 <- ifelse(insurance$bmi >= 30 , 1 , 0)
- 加强肥胖和吸烟的相关性
组合表示为:bmi30*smoker
- 构建优化模型
> ins_model_pro <- lm(charges ~ age + age2 + children + bmi + sex + bmi30*smoker + region, data = insurance)
- 评估对比新模型
> summary(ins_model_pro)
扩展模型拟合度也很高(多重 R 平方为0.8664),并且各个变量的系数估计都显著。与原始模型相比,这个模型考虑了更多的因素,如年龄的平方、体质指数是否大于等于30、吸烟与体质指数的交互项等,以更好地解释保险费用的变化。另外,因为有更多的自变量被考虑,模型中的自由度也有所增加。
预测应用
- 加载测试数据
> ins_test <- read.csv("ins_test.csv")
- 查看测试数据
> ins_test
- 预测结果
> ins_pred <- predict(ins_model_pro,ins_test)
- 查看结果数据
> ins_pred
- 存储结果数据
> write.csv(ins_pred,"ins_pred.csv")
总结:
根据给出的数据,使用线性回归模型对保险费用进行预测。模型的拟合度很高(多重 R 平方为0.7509),并且各个变量的系数估计都显著,除了 "sexmale" 这个变量。这意味着年龄、子女数、体质指数(bmi)、性别、吸烟与地区等变量与保险费用之间存在一定的关系。
除了原始模型之外,还构建了一个优化模型,考虑了更多的因素,如年龄的平方、体质指数是否大于等于30、吸烟与体质指数的交互项等。这个模型的拟合度也很高(多重 R 平方为0.8664),并且各个变量的系数估计都显著。
通过对模型的分析,可以得出预测保险费用的结果(结果如上图)。可以利用模型的系数来衡量不同变量对保险费用的影响程度。例如,年龄、子女数、体质指数、性别、吸烟与地区等变量都会对保险费用产生影响。
只是为了记录一点点学习碎片,勿喷,欢迎讨论学习。
本次实验所用数据:
链接:https://pan.baidu.com/s/11-IsAOczI7w2EoJb7rtd-w?pwd=t5z9
提取码:t5z9