2升4用户目标群体分析

# coding: utf-8

# # 2升4数据分析

# # 数据来源于信息化和客户服务部门5月的2G用户在网数据,目前2升4已经进行了半年之久,对于5月之初的8W+数据中有近1W用户成功转网,标签为1,在此我们定义半年没有转网的用户为没有成功2升4的用户,标签为0,采集数据中用户终端均是只是支持联通2G网络的2G终端,故不作终端分析。

# In[2]:

"""
导入数据
"""
import pandas as pd
import numpy as np
import os
import seaborn as sns
import matplotlib.pyplot as plt
os.chdir('K:\\项目\\2升4\\')

data = pd.read_excel('5月拍照持2G终端用户.xlsx')


# In[2]:

sns.set_style("darkgrid",{"font.sans-serif":['KaiTi', 'Arial']})
from pylab import mpl



# In[3]:

data.info()
print('一共{0}条数据。'.format(str(data.shape[0])))
print(pd.isnull(data).sum())


# In[4]:

data.columns=['numbers','Network Time','Disbursements','start','cost name','names','ID','age','adress','nodeb','3/4G net','2 to 4']


# 证件地址有56个缺失值

# In[5]:

data[data['adress'].isnull()]


# 查看证件地址的缺失值所对应的用户姓名明显是错误的,且对应的是否成功2升4都是0,鉴于负样本体量大,可以直接删除

# In[6]:

data=data[data['adress'].notnull()]


# In[7]:

data.describe()


# In[23]:

data[data['Disbursements']>500]


# 4个数值性标签,出账的统计是有意义的,中位数是19.4元,平均数是23.1元,说明该特征分布是严重的右偏,又看到最大值524,所以524很可能是隐患的异常值。

# In[8]:

import matplotlib.pyplot as plt
import seaborn as sns
get_ipython().magic('matplotlib inline')

plt.style.use("bmh")
plt.rc('font', family='SimHei', size=13)
cat_list = ['numbers','Network Time','Disbursements','start','cost name','names','ID','age','adress','nodeb','3/4G net','2 to 4']
for n,i in enumerate(cat_list):  
    Cabin_cat_num = data[i].value_counts().index.shape[0]
    print('{0}. {1}特征的类型数量是: {2}'.format(n+1,i,Cabin_cat_num))


# 从上面各特征值的类型数量来看:
# 
# 一些比较少数量的特征如星级特征,基站归属特征,是否3/4G同覆盖特征,是否成功2升4特征等可进行可视化分析。
# 
# 剩下特征如入网时间特征由于分类太多对于可视化不是太方便,后续对这些特征单独分析。

# In[9]:

f, [ax1,ax2,ax3] = plt.subplots(1,3,figsize=(20,5))
sns.countplot(x='start', hue='2 to 4', data=data, ax=ax1)
sns.countplot(x='nodeb', hue='2 to 4', data=data, ax=ax2)
sns.countplot(x='3/4G net', hue='2 to 4', data=data, ax=ax3)
ax1.legend(ncol=1, loc="upper right")
ax1.yticks = list(range(0,70000,100))
ax2.legend(ncol=1, loc="upper right")
ax3.legend(ncol=1, loc="upper right")

ax1.set_title('星级特征分析')
ax2.set_title('基站归属特征分析')
ax3.set_title('是否3/4G同覆盖')
f.suptitle('定类/定序数据类型特征分析',size=20,y=1.1)

plt.show()


# 对于上面的定类和定序数据类型,我们分别可以观察到各特征值的分布情况,以及与目标变量之间的联系。
# 星级特征中,非高价值的用户数占比大,存在越高级用户数越少的特征,对于哪个星级转化率高需要进一步处理成各个星级所占百分比,然后比较才能得出星级对于转化率的影响;
# 基站归属特征中,存在2.5W左右的未归属基站,这个是系统在采集时存在的未定位成功,需要进一步处理,除此之外,2G用户数寿县人数最多,其次是田家庵,凤台。三者的体量较大;
# 是否3/4G同覆盖的特征中,明显有3、4G覆盖的区域的转化率高点,这也是符合常理的。

# In[10]:

fig1 = plt.figure(num=1,figsize=(10,10))
data_start0=data[data['2 to 4']==0]
data_start1=data[data['2 to 4']==1]
data_start0=data_start0.groupby('start')['cost name','names'].count()
data_start0['start0%']=data_start0['names']/data_start0['names'].sum()
data_start1=data_start1.groupby('start')['cost name','names'].count()
data_start1['start1%']=data_start1['names']/data_start1['names'].sum()
data_start=pd.merge(data_start0,data_start1,left_index=True,right_index=True,how='left')
data_start['start_sum']=data_start['cost name_x']+data_start['cost name_y']
data_start['start_sum%']=data_start['start_sum']/data_start['start_sum'].sum()
data_start=data_start[['start0%','start1%','start_sum%']]
data_start.columns=['未成功2升4星级占比','成功2升4星级占比','星级占比']
data_start.plot(kind='bar',grid = True,colormap='Blues',title='2升4与星级关系',rot=0)
my_y_ticks = np.arange(0, 1, 0.05)
plt.yticks(my_y_ticks)
plt.text(0.8,0.01,'0.25%')
plt.text(1,0.06,'0.48%')
plt.text(1.2,0.01,'0.27%')

#plt.savefig('C:/Users/Hjx/Desktop/pic.png',
  #          dpi=400,
    #        bbox_inches = 'tight',
      #      facecolor = 'g',     edgecolor = 'b')


# 对于上面的2升4与星级的关系,三星级以上的2升4转化率都是高于非高价值用户,且星级越高,转化率越高的特点,高价值与非高价值对于2升4的结果影响还是十分大了。

# In[29]:

data_start


# In[12]:

data_nodeb0=data[data['2 to 4']==0]
data_nodeb1=data[data['2 to 4']==1]
data_nodeb0=data_nodeb0.groupby('nodeb')['cost name','names'].count()
data_nodeb0['nodeb0%']=data_nodeb0['names']/data_nodeb0['names'].sum()
data_nodeb1=data_nodeb1.groupby('nodeb')['cost name','names'].count()
data_nodeb1['nodeb1%']=data_nodeb1['names']/data_nodeb1['names'].sum()
data_nodeb=pd.merge(data_nodeb0,data_nodeb1,left_index=True,right_index=True,how='left')
data_nodeb['nodeb_sum']=data_nodeb['cost name_x']+data_nodeb['cost name_y']
data_nodeb['nodeb_sum%']=data_nodeb['nodeb_sum']/data_nodeb['nodeb_sum'].sum()
data_nodeb=data_nodeb[['nodeb0%','nodeb1%','nodeb_sum%']]
data_nodeb.columns=['未成功2升4区域占比','成功2升4区域占比','区域占比']
data_nodeb.plot(kind='bar',grid = True,colormap='Blues_r',title='2升4与区域关系',figsize = (8,5),rot=0)
my_y_ticks = np.arange(0, 0.5, 0.05)
plt.yticks(my_y_ticks)


# 对于上面的2升4与区域的关系,我门可以发现各个区域的成功2升4占比都比未成功2升4的占比高,主要是因为未知区域都在未成功2升4数据里面,鉴于未成功2升4的负采样样本体量大,可以删除未知区域查看区域对2升4影响

# In[13]:

data[data['nodeb']=='未知'].shape[0]


# In[15]:

#删除nodeb为未知
data_swz=data[data['nodeb']!='未知']


# In[16]:

data_nodeb0=data_swz[data_swz['2 to 4']==0]
data_nodeb1=data_swz[data_swz['2 to 4']==1]
data_nodeb0=data_nodeb0.groupby('nodeb')['cost name','names'].count()
data_nodeb0['nodeb0%']=data_nodeb0['names']/data_nodeb0['names'].sum()
data_nodeb1=data_nodeb1.groupby('nodeb')['cost name','names'].count()
data_nodeb1['nodeb1%']=data_nodeb1['names']/data_nodeb1['names'].sum()
data_nodeb=pd.merge(data_nodeb0,data_nodeb1,left_index=True,right_index=True,how='left')
data_nodeb['nodeb_sum']=data_nodeb['cost name_x']+data_nodeb['cost name_y']
data_nodeb['nodeb_sum%']=data_nodeb['nodeb_sum']/data_nodeb['nodeb_sum'].sum()
data_nodeb=data_nodeb[['nodeb0%','nodeb1%','nodeb_sum%']]
data_nodeb.columns=['未成功2升4区域占比','成功2升4区域占比','区域占比']
data_nodeb.plot(kind='bar',grid = True,colormap='Blues_r',title='2升4与区域关系',figsize = (8,4),rot=0)
my_y_ticks = np.arange(0, 0.5, 0.05)
plt.yticks(my_y_ticks)


# 对于上面的2升4与区域的关系,东区成功2升4的占比相比未成功2升4占比较高,其次凤台、潘集基本持平,西区与寿县的2升4的转化率偏低。

# In[17]:

data_net0=data[data['2 to 4']==0]
data_net1=data[data['2 to 4']==1]
data_net0=data_net0.groupby('3/4G net')['cost name','names'].count()
data_net0['net0%']=data_net0['names']/data_net0['names'].sum()
data_net1=data_net1.groupby('3/4G net')['cost name','names'].count()
data_net1['net1%']=data_net1['names']/data_net1['names'].sum()
data_net=pd.merge(data_net0,data_net1,left_index=True,right_index=True,how='left')
data_net['net_sum']=data_net['cost name_x']+data_net['cost name_y']
data_net['nodeb_sum%']=data_net['net_sum']/data_net['net_sum'].sum()
data_net=data_net[['net0%','net1%','nodeb_sum%']]
data_net.columns=['未成功2升4网络占比','成功2升4网络占比','网络占比']
data_net.plot(kind='bar',grid = True,colormap='Blues_r',title='2升4与网络关系',figsize = (8,5),rot=0)
my_y_ticks = np.arange(0, 1, 0.2)
plt.yticks(my_y_ticks)


# 对于上面的2升4与网络的关系,有没有3、4G同址覆盖对于用户2升4影响大于星级、区域因素;用户都是2G终端,换成支持3、4G的终端,需要3G语音打好底,4G做好覆盖才能更好的2升4.

# Network Time特征

# In[18]:

f, [ax1,ax2] = plt.subplots(1, 2, figsize=(15, 5))
# 入网时间的分布情况
sns.distplot(data['Network Time'], bins=8, ax=ax1, color='r',kde=True)
# 入网时间和月消费的关系
sns.regplot(x='Network Time', y='Disbursements', x_jitter=.05,data=data, ax=ax2)
plt.show()
#egplot()和lmplot()都可以绘制回归方程,但是初学者推荐用regplot() 


# In[19]:

data1=data[data['nodeb']!='未知']


# In[20]:

data1=data1[data1['age']!='未知']


# In[21]:

grid = sns.FacetGrid(data1, row='nodeb',col='start' ,hue='2 to 4', palette='seismic', size=6)
grid.map(plt.scatter, 'age', 'Disbursements', alpha=0.8)
grid.add_legend()


# In[22]:

grid = sns.FacetGrid(data1, row='nodeb',col='start' ,hue='2 to 4', palette='seismic', size=6)
grid.map(plt.scatter, 'Network Time', 'Disbursements', alpha=0.8)
grid.add_legend()


# In[153]:

f,ax = plt.subplots(figsize=(10,5))
sns.kdeplot(data.loc[(data['2 to 4']==0),'Network Time'] , color='b',shade=True,label='Fail Network TimeNetwork Time share')
sns.kdeplot(data.loc[(data['2 to 4']==1),'Network Time'] , color='g',shade=True, label='Success Network Time share')
sns.kdeplot(data['Network Time'] , color='r',shade=True, label='Network Time share')
plt.title('Network Time特征分布 - FailV.S. Success', fontsize = 15)
plt.xlabel("Network Time", fontsize = 15)
plt.ylabel('Frequency', fontsize = 15)


# 对于入网时间分布和与月消费关系可以看出,2G长期在网用户2015以后的占比大,用户在网时间少于4年时间,不同时间入网的用户,ARPU值有缓慢下降的趋势,在网时间越长转化率高,2012年为界,2012年年以上的用户更容易转化。

# In[190]:

#Disbursements
f,ax = plt.subplots(figsize=(10,5))
sns.kdeplot(data.loc[(data['2 to 4']==0),'Disbursements'] , color='b',shade=True,label='Fail Disbursements share')
sns.kdeplot(data.loc[(data['2 to 4']==1),'Disbursements'] , color='g',shade=True, label='Success Disbursements share')
sns.kdeplot(data['Disbursements'] , color='r',shade=True, label='age share')
plt.title('Disbursements特征分布 - FailV.S. Success', fontsize = 15)
my_x_ticks = np.arange(0, 500, 20)
plt.xticks(my_x_ticks)
plt.xlabel("Age", fontsize = 15)
plt.ylabel('Frequency', fontsize = 15)


# 月消费大于20的转网概率高。

# In[106]:

data_age=data[data['age']!='未知']
data_age['age']=data_age['age'].astype(int)
gcut = pd.cut(data_age['age'],8,right=False)
gcut_count = gcut.value_counts(sort=False)  # 不排序
data_age['%s分组区间' % 'age'] = gcut.values
f,ax = plt.subplots(figsize=(10,5))
sns.kdeplot(data_age.loc[(data_age['2 to 4']==0),'age'] , color='b',shade=True,label='Fail age share')
sns.kdeplot(data_age.loc[(data_age['2 to 4']==1),'age'] , color='g',shade=True, label='Success age share')
sns.kdeplot(data_age['age'] , color='r',shade=True, label='age share')
plt.title('Age特征分布 - FailV.S. Success', fontsize = 15)
my_x_ticks = np.arange(0, 120, 5)
plt.xticks(my_x_ticks)
plt.xlabel("Age", fontsize = 15)
plt.ylabel('Frequency', fontsize = 15)


# 2升4与年龄关系中可以看出,10-20,35-60岁的人群更容易转网,其中45-55岁的转网可能性相比其他年龄段积极性更高。总体来说,2升4的转网群体需要针对年轻群体,但是不能小于15岁。

# In[52]:

#套餐的分析


# In[22]:

f, ax1= plt.subplots(figsize=(20,65))
sns.countplot(y='cost name', data=data, ax=ax1)
ax1.set_title('用户套餐类型',fontsize=15)
ax1.set_xlabel('数量')
ax1.set_ylabel('套餐名称')
plt.show()

plt.savefig('K:\\项目\\2升4\\套餐.png', format='png', bbox_inches='tight', transparent=True, dpi=600) # bbox_inches='tight' 图片边界空白紧致, 背景透明


# 用户套餐有311种,分布不均衡,可以通过二八法则查看主要的套餐,分析主要套餐对应的用户属性

# In[171]:

data_tc=data.groupby('cost name')['numbers','start'].count()
data_tc.sort_values(by='numbers',ascending=False,inplace=True)
data_tc['cost name_sum']=data_tc['numbers']/data_tc['numbers'].sum()
data_tc['cost name_cumsum']=data_tc['numbers'].cumsum()/data_tc['numbers'].sum()
data_tc['cost name_cumsum'].plot(style = '--ko', figsize = (10,4))
plt.axhline(0.80,hold=None,color='r',linestyle="--",alpha=0.8)
plt.text(24,data_tc['cost name_cumsum'].iloc[24]-0.08,'第24个成分累计贡献率超过80%',color = 'r')


# 这样我们可以选取前24个套餐比较用户的2升4情况

# In[172]:

data_tc=data_tc.iloc[:24]


# In[173]:

data_tc=pd.merge(data_tc,data,left_index=True,right_on='cost name',how='left')


# In[174]:

data_tc_ct=data_tc[['cost name','2 to 4','cost name_sum']]


# In[175]:

f, ax1= plt.subplots(figsize=(20,10))
sns.countplot(y='cost name', hue='2 to 4', data=data_tc_ct)
plt.legend()


# In[176]:

data_tc0=data_tc[data_tc['2 to 4']==0]
data_tc1=data_tc[data_tc['2 to 4']==1]
data_tc0=data_tc0.groupby('cost name')['adress','names'].count()
data_tc0['tc0%']=data_tc0['names']/data_tc0['names'].sum()
data_tc1=data_tc1.groupby('cost name')['adress','names'].count()
data_tc1['tc1%']=data_tc1['names']/data_tc1['names'].sum()
data_tcok=pd.merge(data_tc0,data_tc1,left_index=True,right_index=True,how='left')
data_tcok['cost name_sum']=data_tcok['adress_x']+data_tcok['adress_y']
data_tcok['cost name_sum%']=data_tcok['cost name_sum']/data_tcok['cost name_sum'].sum()
data_tcok=data_tcok[['tc0%','tc1%','cost name_sum%']]
data_tcok.columns=['未成功2升4套餐占比','成功2升4套餐占比','套餐占比']


# In[178]:

data_tcok=data_tcok.reset_index()


# In[179]:

data_tcok


# In[184]:

f, ax = plt.subplots(figsize=(6, 15))
# 创建图表

sns.set_color_codes("pastel")
sns.barplot(x="未成功2升4套餐占比", y="cost name", data=data_tcok,orient='h',label="未成功2升4套餐占比",
             color="b",edgecolor = 'w')
# 设置第一个柱状图
sns.set_color_codes("deep")
sns.barplot(x="成功2升4套餐占比", y="cost name", data=data_tcok,orient='h',
            label="成功2升4套餐占比", color="b",edgecolor = 'w')
# 设置第二个柱状图

sns.set_color_codes("muted")
sns.barplot(x="套餐占比", y="cost name", data=data_tcok,orient='h',
            label="2升4套餐占比", color="b",edgecolor = 'w')
# 设置第三个柱状图




plt.xlabel('套餐占比', fontsize=15)
plt.ylabel('', fontsize=15) 
plt.title('2G用户套餐与2升4关系',fontsize=20)
ax.legend(ncol=1, loc="upper right")
sns.despine(left=True, bottom=True)

# 2G用户套餐与2升4关系图中可以看出,	4G主副卡业务-语音副卡基本套餐、4G全国套餐-16元套餐、4G全国套餐-26元套餐、4G本地个性化套餐-13元套餐(1元卡)、如意通顺心卡09版、如意通顺心卡09版事事如意、智慧沃家共享版-4G成员套内产品、沃能卡26(优化版)、腾讯大王卡、语音王升级版、语音王升级版-后付费转化率高。如意系列的套餐也是较早发行,这与用户的在网时间有关系,语音王升级版-后付费的转化率尤为突出,高于总体占比的2.5%。
# # 总结:由以上分析可知,用户所在地点是否由3、4G同覆盖对2升4的影响最大,其次是入网时间,年龄、套餐和星级,2升4在营销活动中,东区、凤台、潘集中三星级以上、有3、4G同覆盖、2012年以前入网,45-55岁,使用4G主副卡业务-语音副卡基本套餐、4G全国套餐-16元套餐、4G全国套餐-26元套餐、4G本地个性化套餐-13元套餐(1元卡)、如意通顺心卡09版、如意通顺心卡09版事事如意、智慧沃家共享版-4G成员套内产品、沃能卡26(优化版)、腾讯大王卡、语音王升级版、语音王升级版-后付费转化率高用户优先针对性的短信提醒和赠费等活动让用户知晓2升4的趋势、政策,提升2升4转化效率。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值