In [ ]:
import pandas as pd
data = pd.read_csv("WA_Fn-UseC_-Telco-Customer-Churn.csv")
data.columns = ['用户ID', '性别', '是否老人', '是否有伴侣', '是否有孩子',
'合同期限', '通话服务', '多线程', '网络服务',
'在线安全', '在线备份', '设备安全', '技术支持',
'流媒体电视', '流媒体电影', '合同类型', '电子账单',
'支付方式', '月消费', '总消费', '是否流失']
data.head()
Out[ ]:
用户ID | 性别 | 是否老人 | 是否有伴侣 | 是否有孩子 | 合同期限 | 通话服务 | 多线程 | 网络服务 | 在线安全 | ... | 设备安全 | 技术支持 | 流媒体电视 | 流媒体电影 | 合同类型 | 电子账单 | 支付方式 | 月消费 | 总消费 | 是否流失 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 7590-VHVEG | Female | 0 | Yes | No | 1 | No | No phone service | DSL | No | ... | No | No | No | No | Month-to-month | Yes | Electronic check | 29.85 | 29.85 | No |
1 | 5575-GNVDE | Male | 0 | No | No | 34 | Yes | No | DSL | Yes | ... | Yes | No | No | No | One year | No | Mailed check | 56.95 | 1889.5 | No |
2 | 3668-QPYBK | Male | 0 | No | No | 2 | Yes | No | DSL | Yes | ... | No | No | No | No | Month-to-month | Yes | Mailed check | 53.85 | 108.15 | Yes |
3 | 7795-CFOCW | Male | 0 | No | No | 45 | No | No phone service | DSL | Yes | ... | Yes | Yes | No | No | One year | No | Bank transfer (automatic) | 42.30 | 1840.75 | No |
4 | 9237-HQITU | Female | 0 | No | No | 2 | Yes | No | Fiber optic | No | ... | No | No | No | No | Month-to-month | Yes | Electronic check | 70.70 | 151.65 | Yes |
5 rows × 21 columns
In [ ]:df_churn = data[data['是否流失']=='Yes']
df_churn
Out[ ]:
用户ID | 性别 | 是否老人 | 是否有伴侣 | 是否有孩子 | 合同期限 | 通话服务 | 多线程 | 网络服务 | 在线安全 | ... | 设备安全 | 技术支持 | 流媒体电视 | 流媒体电影 | 合同类型 | 电子账单 | 支付方式 | 月消费 | 总消费 | 是否流失 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2 | 3668-QPYBK | Male | 0 | No | No | 2 | Yes | No | DSL | Yes | ... | No | No | No | No | Month-to-month | Yes | Mailed check | 53.85 | 108.15 | Yes |
4 | 9237-HQITU | Female | 0 | No | No | 2 | Yes | No | Fiber optic | No | ... | No | No | No | No | Month-to-month | Yes | Electronic check | 70.70 | 151.65 | Yes |
5 | 9305-CDSKC | Female | 0 | No | No | 8 | Yes | Yes | Fiber optic | No | ... | Yes | No | Yes | Yes | Month-to-month | Yes | Electronic check | 99.65 | 820.5 | Yes |
8 | 7892-POOKP | Female | 0 | Yes | No | 28 | Yes | Yes | Fiber optic | No | ... | Yes | Yes | Yes | Yes | Month-to-month | Yes | Electronic check | 104.80 | 3046.05 | Yes |
13 | 0280-XJGEX | Male | 0 | No | No | 49 | Yes | Yes | Fiber optic | No | ... | Yes | No | Yes | Yes | Month-to-month | Yes | Bank transfer (automatic) | 103.70 | 5036.3 | Yes |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
7021 | 1699-HPSBG | Male | 0 | No | No | 12 | Yes | No | DSL | No | ... | No | Yes | Yes | No | One year | Yes | Electronic check | 59.80 | 727.8 | Yes |
7026 | 8775-CEBBJ | Female | 0 | No | No | 9 | Yes | No | DSL | No | ... | No | No | No | No | Month-to-month | Yes | Bank transfer (automatic) | 44.20 | 403.35 | Yes |
7032 | 6894-LFHLY | Male | 1 | No | No | 1 | Yes | Yes | Fiber optic | No | ... | No | No | No | No | Month-to-month | Yes | Electronic check | 75.75 | 75.75 | Yes |
7034 | 0639-TSIQW | Female | 0 | No | No | 67 | Yes | Yes | Fiber optic | Yes | ... | Yes | No | Yes | No | Month-to-month | Yes | Credit card (automatic) | 102.95 | 6886.25 | Yes |
7041 | 8361-LTMKD | Male | 1 | Yes | No | 4 | Yes | Yes | Fiber optic | No | ... | No | No | No | No | Month-to-month | Yes | Mailed check | 74.40 | 306.6 | Yes |
1869 rows × 21 columns
In [ ]:# 4.5.1 创建通用函数:计算类别数据对应条数、占总数比例、对应流失率
def eda_calculate(column,types):
"""
计算类别数据对应条数、占总数比例、对应流失率
param @column: str,列表
param @types: list,类别数据
"""
# 1.计算类别数据对应的个数
res_list = []
rate_list = []
print('\n------------------------当前列标签:',column,types)
for t in types:
res = len(data[data[column]==t])
# 3.计算类别数据对应的流失率
rate = len(df_churn[df_churn[column]==t]) / res
res_list.append({t:res})
rate_list.append({t:rate})
# 2.展示各类别数据对应的个数、占总数比例
for r in res_list:
print("=================")
print(r,"占总数比例",list(r.values())[0]/len(data))
# 4.预览个别数据对应的流失率、前者和后者的倍数关系
print("类别数据对应流失率")
for rate in rate_list:
before = list(rate.values())[0]
index = rate_list.index(rate) + 1
print(rate)
if index < len(rate_list):
after = list(rate_list[index].values())[0]
print(rate,'前者和后者的倍数关系',before / after)
In [ ]:
eda_calculate(column='是否老人',types=[0,1])
------------------------当前列标签: 是否老人 [0, 1]
=================
{0: 5901} 占总数比例 0.8378531875621185
=================
{1: 1142} 占总数比例 0.1621468124378816
类别数据对应流失率
{0: 0.23606168446026096}
{0: 0.23606168446026096} 前者和后者的倍数关系 0.5663496715412143
{1: 0.4168126094570928}
In [ ]:
# 4.5.2 创建通用函数:提取列标签、提取对应类别数据
columns = ['通话服务', '多线程', '网络服务',
'在线安全', '在线备份', '设备安全', '技术支持',
'流媒体电视', '流媒体电影']
for c in columns:
types = data[c].drop_duplicates().tolist()
print(types)
['No', 'Yes']
['No phone service', 'No', 'Yes']
['DSL', 'Fiber optic', 'No']
['No', 'Yes', 'No internet service']
['Yes', 'No', 'No internet service']
['No', 'Yes', 'No internet service']
['No', 'Yes', 'No internet service']
['No', 'Yes', 'No internet service']
['No', 'Yes', 'No internet service']
In [ ]:
# 4.5.3 函数应用:快速计算特征指标
for c in columns:
types = data[c].drop_duplicates().tolist()
eda_calculate(c, types)
------------------------当前列标签: 通话服务 ['No', 'Yes']
=================
{'No': 682} 占总数比例 0.09683373562402385
=================
{'Yes': 6361} 占总数比例 0.9031662643759761
类别数据对应流失率
{'No': 0.24926686217008798}
{'No': 0.24926686217008798} 前者和后者的倍数关系 0.9332469159881869
{'Yes': 0.2670963684955196}
------------------------当前列标签: 多线程 ['No phone service', 'No', 'Yes']
=================
{'No phone service': 682} 占总数比例 0.09683373562402385
=================
{'No': 3390} 占总数比例 0.48132897912821243
=================
{'Yes': 2971} 占总数比例 0.42183728524776376
类别数据对应流失率
{'No phone service': 0.24926686217008798}
{'No phone service': 0.24926686217008798} 前者和后者的倍数关系 0.9953058454141323
{'No': 0.2504424778761062}
{'No': 0.2504424778761062} 前者和后者的倍数关系 0.8753701197293076
{'Yes': 0.286098956580276}
------------------------当前列标签: 网络服务 ['DSL', 'Fiber optic', 'No']
=================
{'DSL': 2421} 占总数比例 0.34374556297032516
=================
{'Fiber optic': 3096} 占总数比例 0.4395854039471816
=================
{'No': 1526} 占总数比例 0.21666903308249325
类别数据对应流失率
{'DSL': 0.1895910780669145}
{'DSL': 0.1895910780669145} 前者和后者的倍数关系 0.4525628201196355
{'Fiber optic': 0.4189276485788114}
{'Fiber optic': 0.4189276485788114} 前者和后者的倍数关系 5.657376917975807
{'No': 0.07404980340760157}
------------------------当前列标签: 在线安全 ['No', 'Yes', 'No internet service']
=================
{'No': 3498} 占总数比例 0.4966633536845094
=================
{'Yes': 2019} 占总数比例 0.2866676132329973
=================
{'No internet service': 1526} 占总数比例 0.21666903308249325
类别数据对应流失率
{'No': 0.4176672384219554}
{'No': 0.4176672384219554} 前者和后者的倍数关系 2.8585428961828065
{'Yes': 0.14611193660227836}
{'Yes': 0.14611193660227836} 前者和后者的倍数关系 1.9731576571245732
{'No internet service': 0.07404980340760157}
------------------------当前列标签: 在线备份 ['Yes', 'No', 'No internet service']
=================
{'Yes': 2429} 占总数比例 0.3448814425670879
=================
{'No': 3088} 占总数比例 0.43844952435041884
=================
{'No internet service': 1526} 占总数比例 0.21666903308249325
类别数据对应流失率
{'Yes': 0.21531494442157267}
{'Yes': 0.21531494442157267} 前者和后者的倍数关系 0.5392478089000945
{'No': 0.39928756476683935}
{'No': 0.39928756476683935} 前者和后者的倍数关系 5.392148883488468
{'No internet service': 0.07404980340760157}
------------------------当前列标签: 设备安全 ['No', 'Yes', 'No internet service']
=================
{'No': 3095} 占总数比例 0.43944341899758627
=================
{'Yes': 2422} 占总数比例 0.3438875479199205
=================
{'No internet service': 1526} 占总数比例 0.21666903308249325
类别数据对应流失率
{'No': 0.3912762520193861}
{'No': 0.3912762520193861} 前者和后者的倍数关系 1.7388460227356939
{'Yes': 0.2250206440957886}
{'Yes': 0.2250206440957886} 前者和后者的倍数关系 3.038774361859941
{'No internet service': 0.07404980340760157}
------------------------当前列标签: 技术支持 ['No', 'Yes', 'No internet service']
=================
{'No': 3473} 占总数比例 0.4931137299446259
=================
{'Yes': 2044} 占总数比例 0.2902172369728809
=================
{'No internet service': 1526} 占总数比例 0.21666903308249325
类别数据对应流失率
{'No': 0.4163547365390153}
{'No': 0.4163547365390153} 前者和后者的倍数关系 2.7452551015669266
{'Yes': 0.15166340508806261}
{'Yes': 0.15166340508806261} 前者和后者的倍数关系 2.0481270457025094
{'No internet service': 0.07404980340760157}
------------------------当前列标签: 流媒体电视 ['No', 'Yes', 'No internet service']
=================
{'No': 2810} 占总数比例 0.3989777083629135
=================
{'Yes': 2707} 占总数比例 0.38435325855459324
=================
{'No internet service': 1526} 占总数比例 0.21666903308249325
类别数据对应流失率
{'No': 0.33523131672597867}
{'No': 0.33523131672597867} 前者和后者的倍数关系 1.1148294525518727
{'Yes': 0.30070188400443293}
{'Yes': 0.30070188400443293} 前者和后者的倍数关系 4.0608059733695985
{'No internet service': 0.07404980340760157}
------------------------当前列标签: 流媒体电影 ['No', 'Yes', 'No internet service']
=================
{'No': 2785} 占总数比例 0.39542808462303
=================
{'Yes': 2732} 占总数比例 0.3879028822944768
=================
{'No internet service': 1526} 占总数比例 0.21666903308249325
类别数据对应流失率
{'No': 0.33680430879712747}
{'No': 0.33680430879712747} 前者和后者的倍数关系 1.12487698243735
{'Yes': 0.29941434846266474}
{'Yes': 0.29941434846266474} 前者和后者的倍数关系 4.043418546495809
{'No internet service': 0.07404980340760157}
In [ ]:
# 4.5.4 数据洞察
# 高流失率的产品属性特征 (服务开通情况)
# 1. 没有明显相关性的产品服务
# 通话服务、多线程: 流失率在25号左右
# 流媒体电视、流媒体电影: 流失率在30%左右
# 2. 有明显影响的产品服务: 就是和网络相关的增值服务
# 网络服务:光纤用户的流失率41号,是DSL的2倍多
# 在线安全:没有选择这项服务的流失率41%+,是选择的用户的2.85倍
# 在线备份:没有选择这项服务的用户,流失率比选择的高1.5倍+
# 设备安全:同上
# 技术支持:没有选择这项服务的流失率41%+,是选择的用户的2.74倍
标签:4.5,...,service,No,流失率,产品,internet,维度,Yes
From: https://www.cnblogs.com/mlzxdzl/p/17782429.html