电信客户流失分析

逻辑斯蒂回归模型的数学公式,具体如下:
逻辑斯蒂模型
对于 i = 1, 2, …, n 个观测和 p 个输入变量等价于在这里插入图片描述
逻辑斯蒂回归通过使用逻辑函数(或称逻辑斯蒂函数)的反函数估计概率的方式来测量自
变量和二值型因变量之间的关系。这个函数可以将连续值转换为 0 和 1 之间的值,这是个
必要条件,因为预测值表示概率,而概率必须在 0 和 1 之间。

在这里插入图片描述
本身数据集是这样的,查看一下数据的基础信息。
在这里插入图片描述
数据完整度较好,就是列名有些奇怪,整理一下就好了。

kehu.columns = [k.lower() for k in kehu.columns.str.\
replace(' ', '_').str.replace("\'", "").str.strip('?')]

在这里插入图片描述
打印出来的模型参数图显示。
因为逻辑斯提的反函数是一条曲线,因此可以定义一个函数,将预测值转换为0,1之间的概率值。然后在计算当每个变量都取均值时的观测值。
在这里插入图片描述
计算出的均值为-2.07,反函数为0.112,所以当自变量都取均值的时候,客户的流失率为11.2%
在这里插入图片描述
这边将自变量1的值,在均值上增加一个单位,则最后的客户流失率提升6.7%。以此可以算出相关变量在均值附近变动对客户流失率的影响。

在这里插入图片描述
取测试数据的前10个数据做预测,由于数据集有限,我没有划分测试集和验证集,因此我直接在模型数据中取前十数据做预测。预测结果如上,分别对应每个客户可能流失的概率。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
kehu=pd.read_csv('C:/Users/luoyang/Desktop/kehu.csv')
kehu.columns = [k.lower() for k in kehu.columns.str.replace(' ', '_').str.replace("\'", "").str.strip('?')]
kehu['churn01'] = np.where(kehu['churn'] == 'True.', 1., 0.)
kehu['total_c'] = kehu['day_c'] + kehu['eve_c'] + kehu['night_c'] + kehu['intl_c']
y = kehu['churn01']
x = kehu[['acc_length', 'cus_calls', 'total_c']]#d读取数据及数据规整
k = sm.add_constant(x, prepend=True)
model = sm.Logit(y, k).fit()#建立模型
print(model.summary())#打印模型信息
#定义一个反函数
def inverse_model(value):
    from math import exp
    return (1.0 / (1.0 + exp(-value)))
at_means = float(model.params[0])+float(model.params[1])*float(kehu['account_length'].mean())+float(model.params[2])*\
float(kehu['custserv_calls'].mean())+float(model.params[3])*float(kehu['total_charges'].mean())
#计算自变量均值
at_means1 = float(logit_model.params[0])+\
(float(logit_model.params[1])*float(kehu['acc_length'].mean())-1)+float(model.params[2])*\
float(kehu['cus_calls'].mean())+float(model.params[3])*float(kehu['total_c'].mean())
#计算自变量1在均值上少一的值

inverse_model(at_means)-inverse_logit(at_means1)
#求二者的差,表示为自变量1在均值上少1时,客户流失率的变化

no=kehu.loc[kehu.index.isin(range(10)),x.columns]
nowc=sm.add_constant(no,prepend=True)
yp=model.predict(nowc)
round(yp,2)#简单预测一下,用于最后的模型评估,如果数据够大的话可以使用机器学习交叉分析。

猜你喜欢

转载自blog.csdn.net/lisenby/article/details/108027439