# 保险案例分析

导包

import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore')#忽视警告

读数据

df=pd.read_csv("D:\date\ma_resp_data_temp.csv")#选择数据所在的位置
pd.set_option("max_columns",100)#显示100列数据
df.head()#查看数据前五行

探索数据

df.shape#查看数据有多少行和多少列
df.info()#查看数据的详细信息

简单统计

df["KBM_INDV_ID"]=df["KBM_INDV_ID"].astype("object")#将ID转换为object类型
df.describe().T#描述df并且将行列进行转置
describe=df.describe().T#对结果进行捕捉即对结果进行命名
describe.to_excel("output/describe_var.xlsx")#建立一个文件夹,将结果导出到文件夹里

统计一下多少列有空值?

NA=df.isnull().sum()#统计每个列空值的数量
len(df.columns)-df.dropna(axis=1).shape[1]#有多少列有空值
NA=NA.reset_index()#重置索引
NA
#修改列名
NA.columns=["Var","NA_count"]
NA
#过滤出有缺失的数据/过滤出大于0的数据
NA=NA[NA.NA_count>0].reset_index(drop=True)#删掉原始索引
NA
#查看空值的比例
NA.NA_count/df.shape[0]

可视化数据分布

导包

import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use("seaborn")#设置画图的风格
# 支持中文,windows系统
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
#plt.rcParams['font.family']='Arial Unicode MS' # OS系统

目标变量情况

df.resp_flag.value_counts()#结果的含义是0,没有购买的有多少,1 购买的有多少,对值得结果进行计数
plt.figure(figsize=(10,3),dpi=300)#设置画布为10*3,分辨率为300
sns.countplot(y="resp_flag",data=df)#计数的图形
plt.show()
#计算购买占购买意向的比例关系
df.resp_flag.sum()/df.resp_flag.shape[0]#sum求所有的0加上所有的1,结果就是所有的1相加.
#那就是对所有的有购买意向的求和

绘制年龄的分布情况

#直方图+密度曲线
sns.distplot(df["age"],bins=20)
df["age"].min()#查看最小值
df["age"].max()#查看最大值

分别绘制两类样本的年龄分布

kdeplot:核密度估计

x=np.random.randn(100)#随机生成数据集
sns.kdeplot(x)#画图
sns.kdeplot(x,shade=True,color="g")#shade是填充阴影,color设置颜色
sns.kdeplot(df.age[df.resp_flag==0],label="0",shade=True)#df.age[df.resp_flag==0]索引数据
sns.kdeplot(df.age[df.resp_flag==1],label="1",shade=True)
plt.xlabel('Age')
plt.ylabel("Density")

查看性别分布

plt.figure(figsize=(10,3))
sns.countplot(y='GEND',data=df)
plt.show()

查看学历的分布

df.c210mys.value_counts#查看数据
plt.figure(figsize=(10,3))
sns.countplot(y="c210mys",data=df)#c210mys变量名
plt.show()

查看不同学历之间购买保险的数量

sns.countplot(x="c210mys",hue="resp_flag",data=df)#hue对哪一列进行分割计数

不同县的大小对应购买数量

sns.countplot(x="N2NCY",hue="resp_flag",data=df)#hue对哪一列进行分割计数

空值填充

将含有空值的列,每一列的数据类型统计出来,并加在NA的表中

df.age.dtypes
temp=[]
for i in NA.Var:
    temp.append(df[i].dtypes)
NA["数据类型"]=temp
NA

填充

分类变量:众数填充
数值型变量:有序连续性数值/无序数值

NA[NA.Var!="age"]//#找除了age这之外的
df.AASN.mode()[0]
//填充
for i in NA[NA.Var!="age"].Var:
    df[i].fillna(df[i].mode()[0],inplace=True)
//对年龄采用均值填充
df.age.fillna(df.age.mean(),inplace=True)
//#验证
df.isnull().sum()

变量编码

让所有数据都是数值型

df.info()//#数值型不用编码
del df["KBM_INDV_ID"]//#删除KBM_INDV_ID列
df_object=df.select_dtypes("object")//#筛选字符型变量,若这个代码运行不出来,运行下面的代码
OB = []
NUM = []
for i in df.columns:
   if df[i].dtype=='object':
        OB.append(i)
   else:
      NUM.append(i)
df_object.shape//#查看形状
#对特征进行编码,导包
from sklearn.preprocessing import OrdinalEncoder
df_object = OrdinalEncoder().fit_transform(df_object)//进行转换
df_object
df_copy=df.copy()
//如果误操作了
//执行这个代码df=df_copy.copy()
//字符转数值
for i in df.columns:
    if df[i].dtypes=="object":
        df[i]=OrdinalEncoder().fit_transform(df[[i]])

建模

建模之前一定要保证数据集里面没有字符

决策树

//导包
from sklearn import tree
from sklearn.model_selection import train_test_split
// 切分数据集
X=df.iloc[:,1:]
y=df['resp_flag']
Xtrain,Xtest,Ytrain,Ytest=train_test_split(X,y,test_size=0.3,
                                            random_state=420)//一般情况下都是3:7分割数据
//建模
clf=tree.DecisionTreeClassifier().fit(Xtrain,Ytrain)
clf.score(Xtest,Ytest)

模型优化

//导包
from sklearn.model_selection import GridSearchCV
//网格搜索
param_grid={"max_depth":range(3,8),//#决策树深度
           'min_samples_leaf':range(1000,3000,100)}//#样本量
GR=GridSearchCV(tree.DecisionTreeClassifier(),param_grid,n_jobs=-1,cv=5)
GR.fit(Xtrain,Ytrain)
GR.best_params_//查看最优节点
GR.best_score_//查看训练集的分数
clf=tree.DecisionTreeClassifier(max_depth=7,min_samples_leaf=1000).fit(Xtrain,Ytrain)
clf.score(Xtest,Ytest)//建立最优模型
features = list(df.columns[1:])//将字段名打包成列表
//导包
import graphviz
//画图
dot_data=tree.export_graphviz(clf,
                             feature_names=features,
                             class_names=['No Purchase','Purchase'],
                             filled=True,#颜色填充
                             rounded=True)#边框弧度
graph=graphviz.Source(dot_data)
graph//查看决策树
#输出图片
graph.render('model1')

最终结果图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值