第二十三天-数据分析入门实战

目录

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: object

df.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/zongrs
        print("【{}】的下【{}】,总人数为:{},流失率{}".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)*******************************

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值