目录
1.常用的数据获取网站
2.分析电信用户流失率
字段说明
1.读取数据
2.数据分析describe
3.数据验证
4.分析目的
1.整体流失情况:人数、比例、流失率
2.性别:人数、比例、流失率
3.老人:人数、比例、流失率
4.是否有配偶:人数、比例、流失率
5.是否经济独立(Yes or No):人数、比例、流失率
6.数据洞察:现象、溯源、建议
7.优化编写通用方法
1.常用的数据获取网站
2.和鲸:和鲸社区 - Heywhale.com
2.分析电信用户流失率
数据地址:https://www.heywhale.com/mw/project/646f0246bf6378dc90a5233f/dataset
字段说明
字段 | 解释 |
---|---|
customerID | 用户ID |
gender | 性别 |
SeniorCitizen | 是否是老年人(1代表是) |
Partner | 是否有配偶(Yes or No) |
Dependents | 是否经济独立(Yes or No) |
tenure | 用户入网时间 |
PhoneService | 是否开通电话业务(Yes or No) |
MultipleLines | 是否开通多条电话业务(Yes 、 No or No phoneservice) |
InternetService | 是否开通互联网服务(No、DSL数字网络或filber potic光线网络) |
OnlineSecurity | 是否开通网络安全服务(Yes、No or No internetservice) |
OnlineBackup | 是否开通在线备份服务(Yes、No or No internetservice) |
DeviceProtection | 是否开通设备保护服务(Yes、No or No internetservice) |
TechSupport | 是否开通技术支持业务(Yes、No or No internetservice) |
StreamingTV | 是否开通网络电视(Yes、No or No internetservice) |
StreamingMovies | 是否开通网络电影(Yes、No or No internetservice) |
Contract | 合同签订方式(按月、按年或者两年) |
PaperlessBilling | 是否开通电子账单(Yes or No) |
PaymentMethod | 付款方式(bank transfer、credit card、electronic check、mailed check) |
MonthlyCharges | 月度费用 |
TotalCharges | 总费用 |
Churn | 是否流失(Yes or No) |
1.读取数据
#数据地址:https://www.heywhale.com/mw/project/646f0246bf6378dc90a5233f/dataset file_name = "WA_Fn-UseC_-Telco-Customer-Churn.csv" # 读取数据 df = pd.read_csv(file_name) # 更改列名为中文 df=df.rename(columns={'customerID': '用户ID',"gender":"性别","SeniorCitizen":"是否是老年人(1代表是)","Partner":"是否有配偶(Yes or No)","Dependents":"是否经济独立(Yes or No)","tenure":"用户入网时间","PhoneService":"是否开通电话业务(Yes or No)","MultipleLines":"是否开通多条电话业务(Yes 、 No or No phoneservice)","InternetService":"是否开通互联网服务(No、DSL数字网络或filber potic光线网络)","OnlineSecurity":"是否开通网络安全服务(Yes、No or No internetservice)","OnlineBackup":"是否开通在线备份服务(Yes、No or No internetservice)","DeviceProtection":"是否开通设备保护服务(Yes、No or No internetservice)","TechSupport":"是否开通技术支持业务(Yes、No or No internetservice)","StreamingTV":"是否开通网络电视(Yes、No or No internetservice)","StreamingMovies":"是否开通网络电影(Yes、No or No internetservice)","Contract":"合同签订方式(按月、按年或者两年)","PaperlessBilling":"是否开通电子账单(Yes or No)","PaymentMethod":"付款方式(bank transfer、credit card、electronic check、mailed check)","MonthlyCharges":"月度费用","TotalCharges":"总费用","Churn":"是否流失(Yes or No)"}) print("df.head:", df.head())
out:
df.head: 用户ID 性别 是否是老年人(1代表是) ... 月度费用 总费用 是否流失(Yes or No)
0 7590-VHVEG Female 0 ... 29.85 29.85 No
1 5575-GNVDE Male 0 ... 56.95 1889.5 No
2 3668-QPYBK Male 0 ... 53.85 108.15 Yes
3 7795-CFOCW Male 0 ... 42.30 1840.75 No
4 9237-HQITU Female 0 ... 70.70 151.65 Yes
[5 rows x 21 columns]
2.数据分析describe
describe,默认只识别int,float数值类型的,只会打印出3列数据
print("列类型",df.dtypes) print("df.describe:", df.describe())
out
列类型 用户ID object
性别 object
是否是老年人(1代表是) int64
是否有配偶(Yes or No) object
是否经济独立(Yes or No) object
用户入网时间 int64
是否开通电话业务(Yes or No) object
是否开通多条电话业务(Yes 、 No or No phoneservice) object
是否开通互联网服务(No、DSL数字网络或filber potic光线网络) object
是否开通网络安全服务(Yes、No or No internetservice) object
是否开通在线备份服务(Yes、No or No internetservice) object
是否开通设备保护服务(Yes、No or No internetservice) object
是否开通技术支持业务(Yes、No or No internetservice) object
是否开通网络电视(Yes、No or No internetservice) object
是否开通网络电影(Yes、No or No internetservice) object
合同签订方式(按月、按年或者两年) object
是否开通电子账单(Yes or No) object
付款方式(bank transfer、credit card、electronic check、mailed check) object
月度费用 float64
总费用 object
是否流失(Yes or No) object
dtype: objectdf.describe: 是否是老年人(1代表是) 用户入网时间 月度费用
count 7043.000000 7043.000000 7043.000000
mean 0.162147 32.371149 64.761692
std 0.368612 24.559481 30.090047
min 0.000000 0.000000 18.250000
25% 0.000000 9.000000 35.500000
50% 0.000000 29.000000 70.350000
75% 0.000000 55.000000 89.850000
max 1.000000 72.000000 118.750000
查询所有的
print("df.describe:", df.describe(include="all"))
out:
df.describe: 用户ID 性别 是否是老年人(1代表是) ... 月度费用 总费用 是否流失(Yes or No)
count 7043 7043 7043.000000 ... 7043.000000 7043 7043
unique 7043 2 NaN ... NaN 6531 2
top 7590-VHVEG Male NaN ... NaN No
freq 1 3555 NaN ... NaN 11 5174
mean NaN NaN 0.162147 ... 64.761692 NaN NaN
std NaN NaN 0.368612 ... 30.090047 NaN NaN
min NaN NaN 0.000000 ... 18.250000 NaN NaN
25% NaN NaN 0.000000 ... 35.500000 NaN NaN
50% NaN NaN 0.000000 ... 70.350000 NaN NaN
75% NaN NaN 0.000000 ... 89.850000 NaN NaN
max NaN NaN 1.000000 ... 118.750000 NaN NaN
3.数据验证
1.验证缺失值
print("验证数据是否有确实值",df.isnull()) #验证数据是否有确实值的个数 print("验证数据是否有确实值",df.isnull().sum())
out
验证数据是否有确实值 用户ID 性别 是否是老年人(1代表是) ... 月度费用 总费用 是否流失(Yes or No)
0 False False False ... False False False
1 False False False ... False False False
2 False False False ... False False False
3 False False False ... False False False
4 False False False ... False False False
... ... ... ... ... ... ... ...
7038 False False False ... False False False
7039 False False False ... False False False
7040 False False False ... False False False
7041 False False False ... False False False
7042 False False False ... False False False[7043 rows x 21 columns]
验证数据是否有确实值 用户ID 0
性别 0
是否是老年人(1代表是) 0
是否有配偶(Yes or No) 0
是否经济独立(Yes or No) 0
用户入网时间 0
是否开通电话业务(Yes or No) 0
是否开通多条电话业务(Yes 、 No or No phoneservice) 0
是否开通互联网服务(No、DSL数字网络或filber potic光线网络) 0
是否开通网络安全服务(Yes、No or No internetservice) 0
是否开通在线备份服务(Yes、No or No internetservice) 0
是否开通设备保护服务(Yes、No or No internetservice) 0
是否开通技术支持业务(Yes、No or No internetservice) 0
是否开通网络电视(Yes、No or No internetservice) 0
是否开通网络电影(Yes、No or No internetservice) 0
合同签订方式(按月、按年或者两年) 0
是否开通电子账单(Yes or No) 0
付款方式(bank transfer、credit card、electronic check、mailed check) 0
月度费用 0
总费用 0
是否流失(Yes or No) 0
dtype: int64
2. 验证是否有重复值
print("验证是否有重复值",df.duplicated()) print("验证是否有重复值,指定列",df["是否是老年人(1代表是)"].duplicated())
out:
验证是否有重复值 0 False
1 False
2 False
3 False
4 False
...
7038 False
7039 False
7040 False
7041 False
7042 False
Length: 7043, dtype: bool
验证是否有重复值,指定列 0 False
1 True
2 True
3 True
4 True
...
7038 True
7039 True
7040 True
7041 True
7042 True
Name: 是否是老年人(1代表是), Length: 7043, dtype: bool
4.分析目的
1.整体流失情况:人数、比例、流失率
print(df["是否流失(Yes or No)"].drop_duplicates()) liushi1=df[df["是否流失(Yes or No)"]=="Yes"]["是否流失(Yes or No)"].count() liushi0=df[df["是否流失(Yes or No)"]=="No"]["是否流失(Yes or No)"].count()
out:
流失人数: 1869
未流失人数: 5174
流失率: 0.2653698707936959
2.性别:人数、比例、流失率
#只过滤流失率的数据 liushi1_data=df[df["是否流失(Yes or No)"]=="Yes"]#性别:人数、比例、流失率 print(df["性别"].drop_duplicates()) xingbNan=df[df["性别"]=="Male"]["性别"].count() xingbNv=df[df["性别"]=="Female"]["性别"].count()#男性流失率: 男性流失人数/男性人数 liushiNan=len(liushi1_data[liushi1_data["性别"]=="Male"])/xingbNan print("男性流失人数:",liushiNan) liushiNv=len(liushi1_data[liushi1_data["性别"]=="Female"])/xingbNv print("女性流失人数:",liushiNv)
out:
0 Female
1 Male
Name: 性别, dtype: object
男性流失人数: 0.2616033755274262
女性流失人数: 0.26920871559633025
3.老人:人数、比例、流失率
#老人:人数、比例、流失率 print(df["是否是老年人(1代表是)"].drop_duplicates()) laonr0=len(df[df["是否是老年人(1代表是)"]==0]) laonr1=len(df[df["是否是老年人(1代表是)"]==1]) print("非老年人人数:",laonr0) print("老年人人数:",laonr1) #计算流失率:老年人流失人数/ 老年人人数liushiLaonr0=len(liushi1_data[liushi1_data["是否是老年人(1代表是)"]==0])/laonr0 print("非老年流失人数:",liushiLaonr0) liushiLaonr1=len(liushi1_data[liushi1_data["是否是老年人(1代表是)"]==1])/laonr1 print("老年人流失人数:",liushiLaonr1)
out:
0 0
20 1
Name: 是否是老年人(1代表是), dtype: int64
非老年人人数: 5901
老年人人数: 1142
非老年流失人数: 0.23606168446026096
老年人流失人数: 0.4168126094570928
4.是否有配偶:人数、比例、流失率
# 是否有配偶:人数、比例、流失率 print(df["是否有配偶(Yes or No)"].drop_duplicates()) peio0 = len(df[df["是否有配偶(Yes or No)"] == "No"]) peio1 = len(df[df["是否有配偶(Yes or No)"] == "Yes"]) print("无配偶人数:", peio0) print("有配偶人数:", peio1)# 计算流失率:无配偶流失人数/ 无配偶人数 liushiPeio0 = len(liushi1_data[liushi1_data["是否有配偶(Yes or No)"] == "No"]) / peio0 print("无配偶流失率:", liushiPeio0) liushiPeio1 = len(liushi1_data[liushi1_data["是否有配偶(Yes or No)"] == "Yes"]) / peio1 print("有配偶流失率:", liushiPeio1)
out:
0 Yes
1 No
Name: 是否有配偶(Yes or No), dtype: object
无配偶人数: 3641
有配偶人数: 3402
无配偶流失率: 0.32957978577313923
有配偶流失率: 0.1966490299823633
5.是否经济独立(Yes or No):人数、比例、流失率
#是否经济独立(Yes or No):人数、比例、流失率 print(df["是否经济独立(Yes or No)"].drop_duplicates()) jingjdl0 = len(df[df["是否经济独立(Yes or No)"] == "No"]) jingjdl1 = len(df[df["是否经济独立(Yes or No)"] == "Yes"]) print("非经济独立人数:", jingjdl0) print("经济独立人数:", jingjdl1)# 计算流失率:非经济独立流失人数 / 非经济独立人数 liushiJingjdl0 = len(liushi1_data[liushi1_data["是否经济独立(Yes or No)"] == "No"]) / jingjdl0 print("非经济独立流失率:", liushiJingjdl0) liushiJingjdl1 = len(liushi1_data[liushi1_data["是否经济独立(Yes or No)"] == "Yes"]) / jingjdl1 print("经济独立流失率:", liushiJingjdl1)
out:
0 No
6 Yes
Name: 是否经济独立(Yes or No), dtype: object
非经济独立人数: 4933
经济独立人数: 2110
非经济独立流失率: 0.3127914048246503
经济独立流失率: 0.15450236966824646
6.数据洞察:现象、溯源、建议
1.性别:
男性流失人数: 0.2616033755274262
女性流失人数: 0.26920871559633025
无特殊性
2.是否老年人
非老年流失人数: 0.23606168446026096
老年人流失人数: 0.4168126094570928
老年人相对于非老年人,更容易流失
3.是否有配偶
无配偶流失率: 0.32957978577313923
有配偶流失率: 0.1966490299823633
单身用户更容易流失
4.经济独立
非经济独立流失率: 0.3127914048246503
经济独立流失率: 0.15450236966824646
非经济独立用户更容易流失
7.优化编写通用方法
1. 编写通用方法,用于计算列类型为分类的
2.下面计算用户产品属性的分析
def calc_cate(col, types):"""计算列类型,为多个分类的数据,计算:人数、比例、流失率:param col: 列名:param types: 分类,数组类型:return:"""print("***********************计算开始{}*******************************".format(col))print("计算列:{},分类:{}".format(col, types.values))for type in types:# 计算分类下的总人数zongrs = len(df[df[col] == type])print("【{}】的下【{}】,总人数为:{}".format( col, type, zongrs))#计算流失人数 分类下流失人数/ 该分类下人数liusrs= len(liushi1_data[liushi1_data[col] ==type])liuslv=liusrs/zongrsprint("【{}】的下【{}】,总人数为:{},流失率{}".format(col, type, liusrs,liuslv))print("***********************计算结束{}*******************************".format(col))# 计算用户属性 # "MultipleLines": "是否开通多条电话业务(Yes 、 No or No phoneservice)", # "InternetService": "是否开通互联网服务(No、DSL数字网络或filber potic光线网络)", # "OnlineSecurity": "是否开通网络安全服务(Yes、No or No internetservice)", # "OnlineBackup": "是否开通在线备份服务(Yes、No or No internetservice)", # "DeviceProtection": "是否开通设备保护服务(Yes、No or No internetservice)", # "TechSupport": "是否开通技术支持业务(Yes、No or No internetservice)", # "StreamingTV": "是否开通网络电视(Yes、No or No internetservice)", # "StreamingMovies": "是否开通网络电影(Yes、No or No internetservice)", yonghusxCol = ["是否开通电话业务(Yes or No)","是否开通多条电话业务(Yes 、 No or No phoneservice)","是否开通互联网服务(No、DSL数字网络或filber potic光线网络)","是否开通在线备份服务(Yes、No or No internetservice)","是否开通设备保护服务(Yes、No or No internetservice)","是否开通技术支持业务(Yes、No or No internetservice)","是否开通网络电视(Yes、No or No internetservice)","是否开通网络电影(Yes、No or No internetservice)"]for col in yonghusxCol:calc_cate(col, df[col].drop_duplicates())
out
***********************计算开始是否开通电话业务(Yes or No)*******************************
计算列:是否开通电话业务(Yes or No),分类:['No' 'Yes']
【是否开通电话业务(Yes or No)】的下【No】,总人数为:682
【是否开通电话业务(Yes or No)】的下【No】,总人数为:170,流失率0.24926686217008798
【是否开通电话业务(Yes or No)】的下【Yes】,总人数为:6361
【是否开通电话业务(Yes or No)】的下【Yes】,总人数为:1699,流失率0.2670963684955196
***********************计算结束是否开通电话业务(Yes or No)*******************************
***********************计算开始是否开通多条电话业务(Yes 、 No or No phoneservice)*******************************
计算列:是否开通多条电话业务(Yes 、 No or No phoneservice),分类:['No phone service' 'No' 'Yes']
【是否开通多条电话业务(Yes 、 No or No phoneservice)】的下【No phone service】,总人数为:682
【是否开通多条电话业务(Yes 、 No or No phoneservice)】的下【No phone service】,总人数为:170,流失率0.24926686217008798
【是否开通多条电话业务(Yes 、 No or No phoneservice)】的下【No】,总人数为:3390
【是否开通多条电话业务(Yes 、 No or No phoneservice)】的下【No】,总人数为:849,流失率0.2504424778761062
【是否开通多条电话业务(Yes 、 No or No phoneservice)】的下【Yes】,总人数为:2971
【是否开通多条电话业务(Yes 、 No or No phoneservice)】的下【Yes】,总人数为:850,流失率0.286098956580276
***********************计算结束是否开通多条电话业务(Yes 、 No or No phoneservice)*******************************
***********************计算开始是否开通互联网服务(No、DSL数字网络或filber potic光线网络)*******************************
计算列:是否开通互联网服务(No、DSL数字网络或filber potic光线网络),分类:['DSL' 'Fiber optic' 'No']
【是否开通互联网服务(No、DSL数字网络或filber potic光线网络)】的下【DSL】,总人数为:2421
【是否开通互联网服务(No、DSL数字网络或filber potic光线网络)】的下【DSL】,总人数为:459,流失率0.1895910780669145
【是否开通互联网服务(No、DSL数字网络或filber potic光线网络)】的下【Fiber optic】,总人数为:3096
【是否开通互联网服务(No、DSL数字网络或filber potic光线网络)】的下【Fiber optic】,总人数为:1297,流失率0.4189276485788114
【是否开通互联网服务(No、DSL数字网络或filber potic光线网络)】的下【No】,总人数为:1526
【是否开通互联网服务(No、DSL数字网络或filber potic光线网络)】的下【No】,总人数为:113,流失率0.07404980340760157
***********************计算结束是否开通互联网服务(No、DSL数字网络或filber potic光线网络)*******************************
***********************计算开始是否开通在线备份服务(Yes、No or No internetservice)*******************************
计算列:是否开通在线备份服务(Yes、No or No internetservice),分类:['Yes' 'No' 'No internet service']
【是否开通在线备份服务(Yes、No or No internetservice)】的下【Yes】,总人数为:2429
【是否开通在线备份服务(Yes、No or No internetservice)】的下【Yes】,总人数为:523,流失率0.21531494442157267
【是否开通在线备份服务(Yes、No or No internetservice)】的下【No】,总人数为:3088
【是否开通在线备份服务(Yes、No or No internetservice)】的下【No】,总人数为:1233,流失率0.39928756476683935
【是否开通在线备份服务(Yes、No or No internetservice)】的下【No internet service】,总人数为:1526
【是否开通在线备份服务(Yes、No or No internetservice)】的下【No internet service】,总人数为:113,流失率0.07404980340760157
***********************计算结束是否开通在线备份服务(Yes、No or No internetservice)*******************************
***********************计算开始是否开通设备保护服务(Yes、No or No internetservice)*******************************
计算列:是否开通设备保护服务(Yes、No or No internetservice),分类:['No' 'Yes' 'No internet service']
【是否开通设备保护服务(Yes、No or No internetservice)】的下【No】,总人数为:3095
【是否开通设备保护服务(Yes、No or No internetservice)】的下【No】,总人数为:1211,流失率0.3912762520193861
【是否开通设备保护服务(Yes、No or No internetservice)】的下【Yes】,总人数为:2422
【是否开通设备保护服务(Yes、No or No internetservice)】的下【Yes】,总人数为:545,流失率0.2250206440957886
【是否开通设备保护服务(Yes、No or No internetservice)】的下【No internet service】,总人数为:1526
【是否开通设备保护服务(Yes、No or No internetservice)】的下【No internet service】,总人数为:113,流失率0.07404980340760157
***********************计算结束是否开通设备保护服务(Yes、No or No internetservice)*******************************
***********************计算开始是否开通技术支持业务(Yes、No or No internetservice)*******************************
计算列:是否开通技术支持业务(Yes、No or No internetservice),分类:['No' 'Yes' 'No internet service']
【是否开通技术支持业务(Yes、No or No internetservice)】的下【No】,总人数为:3473
【是否开通技术支持业务(Yes、No or No internetservice)】的下【No】,总人数为:1446,流失率0.4163547365390153
【是否开通技术支持业务(Yes、No or No internetservice)】的下【Yes】,总人数为:2044
【是否开通技术支持业务(Yes、No or No internetservice)】的下【Yes】,总人数为:310,流失率0.15166340508806261
【是否开通技术支持业务(Yes、No or No internetservice)】的下【No internet service】,总人数为:1526
【是否开通技术支持业务(Yes、No or No internetservice)】的下【No internet service】,总人数为:113,流失率0.07404980340760157
***********************计算结束是否开通技术支持业务(Yes、No or No internetservice)*******************************
***********************计算开始是否开通网络电视(Yes、No or No internetservice)*******************************
计算列:是否开通网络电视(Yes、No or No internetservice),分类:['No' 'Yes' 'No internet service']
【是否开通网络电视(Yes、No or No internetservice)】的下【No】,总人数为:2810
【是否开通网络电视(Yes、No or No internetservice)】的下【No】,总人数为:942,流失率0.33523131672597867
【是否开通网络电视(Yes、No or No internetservice)】的下【Yes】,总人数为:2707
【是否开通网络电视(Yes、No or No internetservice)】的下【Yes】,总人数为:814,流失率0.30070188400443293
【是否开通网络电视(Yes、No or No internetservice)】的下【No internet service】,总人数为:1526
【是否开通网络电视(Yes、No or No internetservice)】的下【No internet service】,总人数为:113,流失率0.07404980340760157
***********************计算结束是否开通网络电视(Yes、No or No internetservice)*******************************
***********************计算开始是否开通网络电影(Yes、No or No internetservice)*******************************
计算列:是否开通网络电影(Yes、No or No internetservice),分类:['No' 'Yes' 'No internet service']
【是否开通网络电影(Yes、No or No internetservice)】的下【No】,总人数为:2785
【是否开通网络电影(Yes、No or No internetservice)】的下【No】,总人数为:938,流失率0.33680430879712747
【是否开通网络电影(Yes、No or No internetservice)】的下【Yes】,总人数为:2732
【是否开通网络电影(Yes、No or No internetservice)】的下【Yes】,总人数为:818,流失率0.29941434846266474
【是否开通网络电影(Yes、No or No internetservice)】的下【No internet service】,总人数为:1526
【是否开通网络电影(Yes、No or No internetservice)】的下【No internet service】,总人数为:113,流失率0.07404980340760157
***********************计算结束是否开通网络电影(Yes、No or No internetservice)*******************************