R语言学习#1-应用线性回归模型预测医疗费用

目录

应用线性回归模型预测医疗费用

实验目的

实验要求

实验原理

实验仪器、设备、材料或软件等

实验内容及步骤

数据预处理

a、查看数据表字段定义

b、查看样本结论标签的分布

c、查看样本结论标签直方图分布

 实验原始数据

 实验数据处理和结果分析


应用线性回归模型预测医疗费用

实验目的

本次实验旨验证和实践。

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文件:

  1. 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

  1. 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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值