背景
不同年龄性别的人医疗费用数据集,患者的治疗费用由诸多因素决定。如诊断、居住城市、年龄等。该文章采用线性回归、多项式回归、随机森林三种模型进行患者医疗花费的预测

数据来源
数据来源于kaggle

数据说明
age:主要受益人的年龄
sex:保险承包商性别,女性,男性
bmi:体重指数,提供对身体的理解,相对于身高相对较高或较低的重量,使用身高与体重之比的体重客观指数(kg /平方公尺),理想情况下为18.5至24.9
children:健康保险覆盖的儿童人数/家属人数
smoker:吸烟
region:受益人的住宅区位于美国,东北,东南,西南,西北。
charges:由健康保险计费的个人医疗费用

数据分析及代码
1、查看数据

import pandas as pd
import os
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
import bokeh
import numpy as npwarnings.filterwarnings('ignore')
data = pd.read_csv(r'D:\data\insuance.csv')

导入所需要的第三库和读取数据

data.head()


查看数据集前面部分数据

data.tail()


查看数据集后面部分数据

data.isnull().sum()


查看整个数据集每个特征值内是否存在空值,并进行讨论

2、数据之间的关联性

from sklearn.preprocessing import LabelEncoderzz=LabelEncoder()
zz.fit(data.sex.drop_duplicates())
data.sex=zz.transform(data.sex)zz.fit(data.smoker.drop_duplicates())
data.smoker=zz.transform(data.smoker)zz.fit(data.region.drop_duplicates())
data.region=zz.transform(data.region)data.corr()['charges'].sort_values()

f,ax=plt.subplots(figsize=(10,8))
corr=data.corr()
sns.heatmap(corr,mask=np.zeros_like(corr,dtype=np.bool),cmap=sns.diverging_palette(240,10,as_cmap=True),square=True,ax=ax)


通过上图发现医疗费用与患者是否为吸烟者有高度相关

3、charges的分布
3.1费用的总分布

import numpy as np
from bokeh.io import output_notebook,show
from bokeh.plotting import figure
output_notebook()
import scipy.special
from bokeh.layouts import gridplot
from bokeh.plotting import figure,show,output_filep=figure(title="charges分布",tools="save",background_fill_color="#E8DDCB")
hist,edges=np.histogram(data.charges)
p.quad(top=hist,bottom=0,left=edges[:-1],right=edges[1:],fill_color="#036564",line_color="#033649")
p.xaxis.axis_label='x'
p.yaxis.axis_label='Pr(x)'
show(p)


有助于帮助了解患者平均在治疗上花费了多少

3.2吸烟者与非吸烟者费用分布

f=plt.figure(figsize=(12,5))
ax=f.add_subplot(121)
sns.distplot(data[(data.smoker==1)]["charges"],color='c',ax=ax)
ax.set_title("Distribution of medical costs for smokers")ax=f.add_subplot(122)
sns.distplot(data[(data.smoker==0)]["charges"],color='b',ax=ax)
ax.set_title("Distribution of medical costs for non-smokers")


从上图看出吸烟者在治疗上花费更多,但是查看非吸烟者的治疗花费,感觉非吸烟者的数量更多,应该好好检查一下。

3.3、性别对费用的影响分布

sns.catplot(x="smoker",kind="count",hue="sex",palette="pink_r",data=data)


男性编码为“0”,女性编码为“1”,男性吸烟者比女性吸烟者多。假定男性的治疗费用高于女性,我们进一步进行数据可视化。

sns.catplot(x="sex",y="charges",hue="smoker",kind="violin",data=data,palette="magma")

plt.figure(figsize=(12,5))
plt.title("The woman hospitallization costs of box")
sns.boxplot(x="charges",y="smoker",data=data[(data.sex==1)],orient="h",palette="magma")

plt.figure(figsize=(12,5))
plt.title("Man hospitalization costs of box")
sns.boxplot(x="charges",y="smoker",data=data[(data.sex==0)],orient="h",palette="rainbow")


通过比较箱型图的中位数,发现男性与女性的费用要低。

3.4、年龄对治疗费用是否有影响

plt.figure(figsize=(12,5))
plt.title("age distribution")
ax=sns.distplot(data["age"],color='cyan')


数据集中有20岁以下的病人,是这组病人中年纪最小的,最大的年纪是64岁

5、18岁吸烟者与非吸烟者费用情况

sns.catplot(x="smoker",hue="sex",kind="count",data=data[(data.age==18)],palette="magma")
plt.title("Number of smokers and non-smokers aged 18")


在18岁的病人中有吸烟者

plt.figure(figsize=(10,10))
plt.title("the number of smokers and non-smokers aged 18 costs of box")
sns.boxplot(x="smoker",y="charges",data=data[(data.age==18)],palette="summer",orient="v")


18岁的时候,吸烟者在治疗上的花费比不吸烟者要多的多,在非吸烟者中,有一些异常点,可以假设这是因为严重的疾病或者事故导致。

6、吸烟者与非吸烟者情况

g = sns.jointplot(x="age", y="charges", data = data[(data.smoker == 0)],kind="kde", color="c")
g.plot_joint(plt.scatter, c="black", s=30, linewidth=1, marker="+")
g.ax_joint.collections[0].set_alpha(0)
g.set_axis_labels("$X$", "$Y$")
ax.set_title('吸烟者的医疗花费和年龄分布')

g = sns.jointplot(x="age", y="charges", data = data[(data.smoker == 1)],kind="kde", color="green")
g.plot_joint(plt.scatter, c="b", s=30, linewidth=1, marker="*")
g.ax_joint.collections[0].set_alpha(0)
g.set_axis_labels("$X$", "$Y$")
ax.set_title('非吸烟者的医疗花费和年龄分布')

p=figure(plot_width=500,plot_height=450,title="非吸烟者")
p.circle(x=data[(data.smoker==0)].age,y=data[(data.smoker==0)].charges,size=10,line_color="navy",fill_color="red",fill_alpha=0.9)
show(p)

p=figure(plot_width=500,plot_height=450,title="吸烟者")
p.circle(x=data[(data.smoker==1)].age,y=data[(data.smoker==1)].charges,size=10,line_color="black",fill_color="blue",fill_alpha=0.9)
show(p)

sns.lmplot(x="age",y="charges",hue="smoker",data=data,palette="inferno_r",size=7)
ax.set_title("吸烟者和非吸烟者")


以上分析表明,在非吸烟者中,治疗费用随着年龄增长二而增还在增长。但从吸烟者的分析看,发现不了这种相关性,个人认为这是由于数据集的特殊性,吸烟对治疗费用的影响之大,应用一组大量的记录和迹象的数据进行判断。

7、BMI的影响

plt.figure(figsize=(12,5))
plt.title("BMI Distribution")
ax=sns.distplot(data["bmi"],color="m")


BMI大于30开始肥胖

g=sns.jointplot(x="bmi",y="charges",data=data,kind="kde",color="c")
g.plot_joint(plt.scatter,c="orchid",s=30,linewidth=1,marker="+")
g.ax_joint.collections[0].set_alpha(0)
g.set_axis_labels("$x$","$Y$")
ax.set_title("BMI和医疗花费的分布")

plt.figure(figsize=(10,6))
ax=sns.scatterplot(x="bmi",y="charges",data=data,palette='magma',hue="smoker")
ax.set_title("Scatter plot of medical costs and BMI")sns.lmplot(x="bmi",y="charges",hue="smoker",data=data,palette="magma",size=8)

plt.figure(figsize=(12,5))
plt.title("Distribution of charges for patients with a BMI greater than 30")
ax=sns.distplot(data[(data.bmi>=30)]['charges'],color='c')

plt.figure(figsize=(12,5))
plt.title("Distribution of charges for patients with a BMI lower than 30")
ax=sns.distplot(data[(data.bmi<30)]["charges"],color='orchid')


进行数据可视化的比较发现,BMI在30以上的患者在医疗上花费更多的Money。

8、患者中是否有孩子

sns.catplot(x="children",kind="count",palette="ch:.25",data=data,size=6)

sns.catplot(x="smoker",kind="count",palette="rainbow",hue="sex",data=data[(data.children>0)],size=6)
ax.set_title("吸烟者和非吸烟者是否有孩子")


从上面的图看出大多数病人没有孩子,有些病人中有5个孩子,但是不吸烟的父母更多一些

9、预测成本
9.1线性回归

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import r2_score,mean_squared_error
from sklearn.ensemble import RandomForestRegressorx = data.drop(['charges','sex','region'], axis = 1)
y = data.chargesx_train,x_test,y_train,y_test = train_test_split(x,y, random_state = 0)
lr = LinearRegression().fit(x_train,y_train)y_train_pred = lr.predict(x_train)
y_test_pred = lr.predict(x_test)print(lr.score(x_test,y_test))


9.2多项式回归

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import r2_score,mean_squared_error
from sklearn.ensemble import RandomForestRegressorX = data.drop(['charges','sex','region'], axis = 1)
Y = data.chargesquad = PolynomialFeatures (degree = 4)
x_quad = quad.fit_transform(X)X_train,X_test,Y_train,Y_test = train_test_split(x_quad,Y, random_state = 0)plr = LinearRegression().fit(X_train,Y_train)Y_train_pred = plr.predict(X_train)
Y_test_pred = plr.predict(X_test)print(plr.score(X_test,Y_test))


9.3随机森林

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import r2_score,mean_squared_error
from sklearn.ensemble import RandomForestRegressorforest = RandomForestRegressor(n_estimators = 100,criterion = 'mse',random_state = 1,n_jobs = -1)
forest.fit(x_train,y_train)
forest_train_pred = forest.predict(x_train)
forest_test_pred = forest.predict(x_test)print('MSE train data: %.3f, MSE test data: %.3f' % (
mean_squared_error(y_train,forest_train_pred),
mean_squared_error(y_test,forest_test_pred)))
print('R2 train data: %.3f, R2 test data: %.3f' % (
r2_score(y_train,forest_train_pred),
r2_score(y_test,forest_test_pred)))
plt.figure(figsize=(10,6))plt.scatter(forest_train_pred,forest_train_pred - y_train,c = 'black', marker = 'o', s = 35, alpha = 0.5,label = 'Train data')
plt.scatter(forest_test_pred,forest_test_pred - y_test,c = 'c', marker = 'o', s = 35, alpha = 0.7,label = 'Test data')
plt.xlabel('Predicted values')
plt.ylabel('Tailings')
plt.legend(loc = 'upper left')
plt.hlines(y = 0, xmin = 0, xmax = 60000, lw = 2, color = 'red')
plt.show()

数据分析--预测医疗费用相关推荐

  1. 医疗数据分析——过高费用的异常检测

    一.提取特征和处理 1.每个病记录的特征 总费用医疗费用 自费费用 报销金额 报销自费比 2.人的特征 年龄层次:儿童.年轻人.中年人.老年人 性别 3.特征处理 标准版 二.实验 三.评估

  2. 大数据分析在医疗行业的作用

    大数据每天都在增长,这让医生们有机会了解更多有关科学.客户服务.服务等方面的知识.下面就是医疗行业从大数据中受益的几种主要方式,也许能给你的业务或者实践带来一些帮助和启发. 1.提高治疗成功率 现代医 ...

  3. UA MATH571A R语言回归分析实践 多元回归2 医疗费用的决定

    UA MATH571A R语言回归分析实践 多元回归2 医疗费用的决定 系数的推断与模型预测 模型诊断 这一讲展示一下一元回归中的模型诊断的手段怎么用在多元回归中,同时介绍一下多元回归做推断和预测的方 ...

  4. 多元线性回归-Part1(以医疗费用为例)

    相较于一元线性回归,多元线性回归是用来确定2个或2个以上变量间的统计分析方法,其基本的分析方法和一元线性回归是类似的. 优点: 1.可适用于几乎所有的数据: 2.提供了特征与结果之间关系的强度和大小的 ...

  5. 多元线性回归-Part2(以医疗费用为例)

    在Part1中,我们已经根据保险受益者的数据拟合出线性回归模型,接下来要做的是评估和提高模型的性能. (四)评估模型的性能 > summary(ins_model) ### summary()给 ...

  6. UA MATH571A R语言回归分析实践 多元回归1 医疗费用的决定

    UA MATH571A R语言回归分析实践 多元回归1 医疗费用 基础回归分析 这一讲开始讨论多元回归,这里选择的例子是寻找家庭医疗费用的决定因素.家庭医疗费用由哪些因素决定是卫生经济学.保险精算等领 ...

  7. 互联网晚报 | 3月28日 星期一 | 上海医保局辟谣:新冠患者要自负医疗费用不属实 ;十荟团关停全国所有业务...

    上海医保局辟谣:新冠患者要自负医疗费用不属实  市医保局相关负责人指出,这一说法并非事实.按照相关规定,在疫情期间,确诊和疑似患者所发生的医疗费用,在基本医保.大病保险.医疗救助等按规定支付后,个人负 ...

  8. 数据分析预测的方法有哪些

    数据分析预测也有多种不同的方法,特别是对于刚参与数据分析预测的人来说,也需要了解应该掌握什么样的能力和数据的价值.数据分析和预测是一项重要的内容,其中也将使用四维分析.但是也一定要了解数据分析预测用哪 ...

  9. 使用 Python 对股票数据分析预测

    使用 Python 对股票数据分析预测 文章目录 使用 Python 对股票数据分析预测 目录索引 模块安装 股票数据获取 雅虎财经 Quandl 模块 Pandas Datareader 模块 数据 ...

最新文章

  1. Java 责任链模式
  2. 1-4-RHEL6.3-用户及组管理(Red Hat Enterprise Linux Server release 6.3)@树袋飘零
  3. 2020(广东)功能性农业大健康大会中国农民丰收节交易会
  4. 关于日志系统显示SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.
  5. Buck降压电路仿真与解析
  6. 笔记本选购:i5轻薄本和i7轻薄本该如何选择?
  7. LightOJ-1220 Mysterious Bacteria (素数打表+欧几里得算法+唯一分解定理)给出x,求x=a^p,最大的指数
  8. 优秀!90后博士做出世界级成果,发32篇SCI,四拿国奖,两获国际荣誉
  9. 速度提升2倍,超强悍CPU级骨干网络PP-LCNet出世!
  10. JavaScript中eval()和$.parseJSON()的区别和联系以及JSON.stringify()的区别
  11. 大学课程 | 《微机原理与接口技术》知识点总结
  12. IQOO手机便签有哪些实用的小功能?
  13. 人工智能期末考试复习
  14. Android常用的第三方支付(支付宝、微信、银联)
  15. Idea 控制台console中文乱码最终解决方法
  16. KindEditor 自定义插件
  17. mysql查询专业术语,英文术语MySQL查询
  18. 亚马逊Amazon数据集
  19. 解决 用vue+vant 写顶部tab栏 做排班表的bug
  20. C++ BYTE 和 int 互转

热门文章

  1. 朋友圈让人无言以对的神回复,笑完我竟想哭
  2. 深入了解AD,AD在PCB行业有何作用?
  3. 分词工具 java_IK分词工具的使用(java)
  4. 工作站HP电脑系统的重装
  5. 贝壳找房2021届校招算法卷3—牛牛打气球(二分查找)
  6. 水果店水果处理方案,水果店不新鲜怎么处理
  7. mysql从库slave停止_MYSQL从库数据冲突导致同步停止
  8. 超强的色彩和构图,丹麦插画家 Rune Fisker 作品
  9. mysql中日期时间戳timestamp使用小结
  10. WINCE IE浏览器定制(二)