训练数据集中共有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
数值型特征,范围是
3 月总出账金额
3.1 当月
数值型特征,范围值
3.2 当月前一月
数值型特征,范围是
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 当月前三月
数值型特征,范围值
4 当月累计流量 month_traffic
数值型特征,范围是