电信行业智能套餐个性化匹配_数据分析(一)

训练数据集中共有743990条数据,27个字段。其中有一维是uer_id,一维是待预测套餐类型current_service。

首先读取数据

import pandas as pd
import numpy as np
train_data = pd.read_csv('train_all.csv')

下面对每个字段进行逐一的分析。

一 标签特征

1 user_id

标识用户的唯一标识符。一共有743990条user_id,表示彼此之间是唯一的。

2 current_service套餐与service_type套餐类型

current_service  = train_data.current_service.values
set(current_service)

发现只有11个套餐,

service_type = train_data.service_type.values
set(service_type)

count = 0
for i in service_type:
    if i == 4:
        count+=1

sc_map = [[current_service[i],service_type[i]] for i in range(len(current_service))]
sc_map_n = [int(i[0]*10+i[1]) for i in sc_map]
set_scmap = set(sc_map_n)

训练集只有两种套餐类型
且套餐与套餐类型存在一一对应关系。

1 347352条
4 396638条
# 89950166, 4
# 89950167, 4
# 89950168, 4
# 90063345, 1
# 90109916, 1
# 90155946, 1
# 99999825, 4
# 99999826, 4
# 99999827, 4
# 99999828, 4
# 99999830, 4

这个service_type可以算一个超强特征了,在测试集上完全可以按照service_type将test data分开预测。

但是注意:测试集有三个套餐类型,多了个“3”,虽然“3”只有19条。

二 无序分类特征

1 is_mix_service 是否固移融合套餐

这是个二值分类特征,只有0和1两个值。

is_mix_service = train_data.is_mix_service.values

值为1的数据 31238条
值为0的数据 712752条
数据显示current_service套餐和is_mix_service并非一一对应关系。一种套餐可以融合可以不融合,大部分人选择不融合。

2 连续超套 many_over_bill

二值分类特征,只有是和否两个值。
0 393246条
1 350744条
连续超套的人还挺多的,不过我也是连续超套的那种。

sm_map = [[current_service[i],many_over_bill[i]] for i in range(len(current_service))]
sm_map_n = [int(i[0]*100+i[1]) for i in sm_map]
sms = set(sm_map_n)
sms
len(sms)

many_over_dic = {}
for i in service:
    many_over_dic[i] = {0:0,1:0}    
for item in sm_map:
    many_over_dic[item[0]][item[1]] += 1

按照套餐去统计这个特征,会发现一些不同的东西:
在这里插入图片描述

可以看到不同套餐,超套程度不同,也是个强特征。

3 合约类型 contract_type

train_data中合约类型有9种:

contract_type = train_data.contract_type.values
set(contract_type)
Out[99]: {0, 1, 2, 3, 6, 7, 8, 9, 12}

contract_type_dic = {}
for i in service:
    contract_type_dic[i] = {0:0,1:0,2:0,3:0,6:0,7:0,8:0,9:0,12:0}    
for item in sc_map:
    contract_type_dic[item[0]][item[1]] += 1

根据统计,发现套餐与合约类型非一一对应。

在这里插入图片描述
可以看到不同套餐,合约类型分布不同,也是个强特征。

test_data中contract_type有8种,少了8这个类型。

4 是否承诺低消用户 is_promise_low_consume

二分类特征,无脏数据。
0 692467条
1 51533条
明显不承认低消的用户多。

5 网络口径用户 net_service

多分类特征,共有四个类:
在这里插入图片描述

这里train_data和test_data一致,都是只有四个类。

gender 性别

三 有序分类特征

1 online_time 在网时长

在网时长单位是小时。

online_time = train_data.online_time.values
len(set(online_time))
set(online_time)

import matplotlib.pyplot as plt

#在train data上online_time的总体分布,偏正态分布
online_dic = {}   
for i in list(set(online_time)):
    online_dic[i] = 0    
for i in online_time:
    online_dic[i] += 1

online_li = [(key,online_dic[key]) for key in online_dic]
plt.scatter([i[0] for i in online_li],[i[1] for i in online_li])

#每个套餐上online-time的时长分布
so_map = [[current_service[i],online_time[i]] for i in range(len(current_service))]
len(set(so_map))
so_map_n = [int(i[0]*1000+i[1]) for i in so_map]
len(set(so_map_n))
service = list(set(current_service))
online_per_dic = {}
for i in service:
    online_per_dic[i] = {}
    for key in online_dic.keys():
        online_per_dic[i][key] = 0
        
for item in so_map:
    online_per_dic[item[0]][item[1]] += 1
    
for key in online_per_dic:
    temp = [(k,online_per_dic[key][k]) for k in online_per_dic[key]]
    plt.plot([i[0] for i in temp],[i[1] for i in temp])

在这里插入图片描述

整理数据发现在网时长的范围在1-274小时之间。上图横轴是在网时长,纵轴是人数,每种颜色的线代表一种套餐类型。

2 交费次数 pay_times

交费次数说是数值特征,但实际上在train_data中只有60种。
在test data中有48种。

test中有但train中没有的数据是
{42, 44, 64, 126, 219}

3 age 年龄

4 complaint_level 投诉重要性

四 数值特征

1 合约到期剩余时长 contract time

train_data中该特征一共有42个值;
test_data中该特征一共有37个值。
这里时长单位不明,不知赛方的分类依据。

contract_time = train_data.contract_time.values
len(set(contract_time))
test_data = pd.read_csv('republish_test.csv')
contract_timet = test_data.contract_time.values
len(set(contract_timet))

service = list(set(train_data.current_service.values))
contract_time_dic = {}
contract_class = list(set(contract_time))
for i in service:
    contract_time_dic[i] = {}
    for time in contract_class:
        contract_time_dic[i][time] = 0
        
current_service = train_data.current_service.values
sc_map = [[current_service[i],contract_time[i]] for i in range(len(current_service))]
for item in sc_map:
    contract_time_dic[item[0]][item[1]] += 1

使用和之前同样的代码处理,可以得到这个结果

在这里插入图片描述

横轴是合约时长,纵轴是人数。可以发现不同套餐走势、峰值差不多;但是…陡峭程度不一样。猜测,这应该和不同套餐的受欢迎程度有关。

2 交费金额 pay_num

数值型特征,范围是 [ 0.01 58800.300 ] [0.01 - 58800.300]

3 月总出账金额

3.1 当月

数值型特征,范围值 [ 0.0 5940.0 ] [0.0-5940.0]

3.2 当月前一月

数值型特征,范围是 [ 287.3 , 5825.57 ] [-287.3,5825.57]
PS:float类型str类型混合,需要先清理数据

3.3 当月前两月

数值型特征,
PS:float类型str类型混合,需要先清理数据

lll_total_fee = train_data['3_total_fee'].values
lll_total_fee_new = []
for i in lll_total_fee:
    if not type(i) is float:
        try:
            inew = float(i)
        except:
            inew = 0
    else:
        inew = i
    lll_total_fee_new.append(inew)

train_data[‘3_total_fee’] = lll_total_fee_new

3.4 当月前三月

数值型特征,范围值 [ 420 , 5141 ] [-420,5141]

4 当月累计流量 month_traffic

数值型特征,范围是 [ 0.0 , 159057.0 ] [0.0,159057.0]

猜你喜欢

转载自blog.csdn.net/sjz_hahalala479/article/details/82844743