通信行业办理活动分析

项目背景

  • 某运营商为了回馈用户,发起了一个用户充值送视频会员的活动。

  • 活动详情:

    • 月租<=50元的用户充值30元话费就可以免费领取3个月的视频会员。
    • 月租>50元的用户充值60元就可以免费领取6个月的视频会员。
    • 该活动的持续时间为当年的9、10和11这三个月。
  • 在这3个月的活动中,渗透率却逐渐下跌。因此,本次分析主要围绕两个问题:

    • 1.为什么回馈用户活动的这3个月的完成情况越来越差?
    • 2.哪些因素对用户办理视频会员的影响较大?

加载数据

#./数据.xlsx
import pyecharts
import pandas as pd
import numpy as np
data = pd.read_excel('./数据.xlsx')
data.head()

在这里插入图片描述

data.info()

在这里插入图片描述

data.shape

(16498, 17)

data.duplicated().sum()

0

为什么这3个月的完成情况越来越差?

  • 重点字段解读:

    • 是否参与活动:NAN表示没有参与活动,非空则表示参与活动。
    • 外呼时间:在活动月份期间对用户的呼叫时间/月份(9、10、11)。
  • 外呼渗透率:办理用户数 / 外呼用户数。

    • 办理用户数:活动月中,每个月参与此项活动的用户数量。
      • 基于外呼时间进行分组然后对“是否参与活动”字段进行计数统计。
    • 外呼用户数:活动月中,每个月外呼用户的数量。
      • 基于外呼时间进行分组然后对“用户号码”字段进行计数统计。
ret = data.groupby(by='外呼时间')[['是否参与活动','用户号码']].count()
#count只会统计非空元素的个数
ret.columns = ['办理用户数','外呼用户数']
ret['外呼渗透率'] = (ret['办理用户数'] / ret['外呼用户数']).map(lambda x:format(x,'.2%'))
ret

在这里插入图片描述

可以看出,随着活动的进行,外呼渗透率情况越来越差。从外呼流程来看,从外呼员拨号到用户决定办理,要经过以下几个阶段:

  • 外呼 -> 用户应答 -> 活动宣传 -> 用户参与活动

以上其中的任意一个环节的转换都有可能带来渗透率的下降。比如:

  • 拨号无人应答
  • 用户接听但发现是活动推广急于挂断
  • 其它一些原因

外呼团队的工作质量一部分影响了活动的宣传效果,而另一方面,用户本身的特征也决定了他们对活动的热情。下面分别从这两个维度展开分析。

外呼质量方面分析

在接通电话的用户中,可以定义接通时间<20秒的为无效接通,因为在短短20秒的时间内,外呼员可能无法将活动信息明确传达。因此可以定义如下指标:

  • 外呼接通率:接通用户数/外呼用户数。

  • 接通渗透率:办理用户数/接通用户数。

  • 有效接通率:有效接通数/外呼用户数,>=20秒。

  • 有效接通渗透率:办理用户数/有效接通数。

  • 计算**外呼接通率:**接通用户数/外呼用户数。

    • 接通用户数:活动月中,每个月"外呼分钟数"不为0的用户数量。
      • 基于“外呼时间”进行分组然后对“外呼分钟数”不为0的用户进行计数统计。
    • 外呼用户数:活动月中,每个月外呼用户的数量。
      • 基于“外呼时间”进行分组然后对“用户号码”字段进行计数统计。
#接通用户数 np.count_nonzero:统计一组数据中非0元素的个数
df1 = data.pivot_table(index='外呼时间',values='外呼分钟数',aggfunc=np.count_nonzero)
df1.columns = ['接通用户数']
df1

在这里插入图片描述

#外呼用户数
df2 = data.pivot_table(index='外呼时间',values='用户号码',aggfunc='count')
df2.columns = ['外呼用户数']
df2

在这里插入图片描述

#计算外呼接通率:接通用户数/外呼用户数
s1 = (df1['接通用户数'] / df2['外呼用户数']).map(lambda x:format(x,'.2%'))
df3 = pd.DataFrame(data=s1,columns=['外呼接通率'])
df3

在这里插入图片描述

  • 计算**接通渗透率:**办理用户数/接通用户数。
    • 办理用户数:在活动月内,每月办理活动的用户数量。
    • 接通用户数:在活动月内,每月"外呼分钟数"不为0的用户数量。
#办理用户数
df4 = data.pivot_table(index='外呼时间',values='是否参与活动',aggfunc='count')
df4.columns = ['办理用户数']

#接通用户数
df1

在这里插入图片描述

#接通渗透率:办理用户数/接通用户数
s2 = (df4['办理用户数'] / df1['接通用户数']).map(lambda x:format(x,'.2%'))
df5 = pd.DataFrame(data=s2,columns=['接通渗透率'])
df5

在这里插入图片描述

  • 计算**有效接通率:**有效接通数/外呼用户数,>=20秒。
    • 有效接通数:在活动月中,每月接通时间>=20秒的用户数量。
    • 外呼用户数:在活动月中,每月外呼用户的数量。
#有效接通数
ret = data.loc[data['外呼分钟数'] >= 20]

df6 = ret.pivot_table(index='外呼时间',values='用户号码',aggfunc='count')
df6.columns = ['有效接通数']

#外呼用户数
df2

在这里插入图片描述

#有效接通率:有效接通数/外呼用户数
s3 = (df6['有效接通数'] / df2['外呼用户数']).map(lambda x:format(x,'.2%'))
df7 = pd.DataFrame(data=s3,columns=['有效接通率'])
df7

在这里插入图片描述

  • 计算有效接通渗透率:办理用户数/有效接通用户数。
    • 办理用户数:在活动月内,每月办理活动的用户数量。
    • 有效接通数:在活动月中,每月接通时间>=20秒的用户数量。
#办理用户数
df4

在这里插入图片描述

#有效接通数
df6

在这里插入图片描述

#有效接通渗透率
s4 = (df4['办理用户数'] / df6['有效接通数']).map(lambda x:format(x,'.2%'))
df8 = pd.DataFrame(data=s4,columns=['有效接通渗透率'])
df8

在这里插入图片描述

  • 汇总相关计算的指标数据
all_ret_df = pd.concat([df1,df2,df3,df4,df5,df6,df7,df8],axis=1)
all_ret_df

在这里插入图片描述

  • 基于漏斗图展示活动月期间每月的外呼用户数、接通用户数、有效接通数和活动办理数之间的转换/渗透率
from pyecharts.charts import Funnel
from pyecharts import options as opts

#9月份
funnel1 = (Funnel()
        .add("",[['外呼用户数', 1937], ['接通用户数', 1936], ['有效接通数', 1750], ['活动办理数', 1050]])
        .set_global_opts(title_opts=opts.TitleOpts(title="9月漏斗图",pos_left="center"),
        legend_opts=opts.LegendOpts(pos_top="5%")))
#10月份
funnel2 = (Funnel()
        .add("",[['外呼用户数', 7399], ['接通用户数', 7384], ['有效接通数', 5932], ['活动办理数', 1864]])
        .set_global_opts(title_opts=opts.TitleOpts(title="10月漏斗图",pos_left="center"),
        legend_opts=opts.LegendOpts(pos_top="5%")))
#11月份
funnel3 = (Funnel()
        .add("",[['外呼用户数', 7162], ['接通用户数', 3023], ['有效接通数', 2523], ['活动办理数', 1009]])
        .set_global_opts(title_opts=opts.TitleOpts(title="11月漏斗图",pos_left="center"),
        legend_opts=opts.LegendOpts(pos_top="5%")))
funnel1.render_notebook()

在这里插入图片描述

funnel2.render_notebook()

在这里插入图片描述

funnel3.render_notebook()

在这里插入图片描述

从漏斗图中可以大致看出9月这四个环节的转换/渗透率趋于正常,10月、11月渗透率下降的原因不尽相同:10月渗透率下降主要在有效接通环节,而11月渗透率下降主要在用户接通环节。

  • 基于柱状图展示下带率指标的情况
from pyecharts.charts import Line
from pyecharts.charts import Bar
bar = Bar()
bar.add_xaxis(['2019年9月','2019年10月','2019年11月'])
bar.add_yaxis('外呼接通率', df3['外呼接通率'].map(lambda x: float(x.strip('%'))).tolist(),gap="0%")
bar.add_yaxis('有效接通率', df7['有效接通率'].map(lambda x: float(x.strip('%'))).tolist(),gap="0%")
bar.add_yaxis('有效接通渗透率', df8['有效接通渗透率'].map(lambda x: float(x.strip('%'))).tolist(),gap="0%")
bar.set_global_opts(
                    title_opts=opts.TitleOpts(title="外呼接通及渗透情况",pos_left="center"),
                    legend_opts=opts.LegendOpts(pos_top="5%"),
                    yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(formatter="{value} %"),max_=100),
                    tooltip_opts=opts.TooltipOpts(formatter="{a}: {c}")
                    )
bar.extend_axis(yaxis=opts.AxisOpts(type_="value", position="right",))
bar.render_notebook()

在这里插入图片描述

从图中可以看到,10月、11月相对于9月份的有效接通渗透率下滑明显,而11月的外呼接通率、有效接通率更是下滑严重。由此可见:

  • 10月、11月的外呼通话质量有所下降,可能是由于外呼用户数量大幅增长导致的质量有所松懈。
  • 11月外呼团队的外呼策略可能出现了问题,例如选取了不合适的时间段进行外呼等。

除了以上因素之外,通话时长也是衡量外呼质量的一个重要因素。计算3个月接通外呼的平均通话时长如下:

#获取外呼分钟数不为0的行数据
df = data.loc[data['外呼分钟数'] != 0 ]

#计算每个月的平均外呼时长
df.groupby(by='外呼时间')['外呼分钟数'].mean()

在这里插入图片描述

可以看到,10月、11月的平均通话时长均较9月下滑。

  • 继续对通话时长细分,统计每个月各通话时长的分布情况,并计算相应的渗透率:
    • 渗透率:活动月中,每月不同区间的外呼分钟数对应的参与活动的用户数量 / 每月的总用户数
#对外呼分钟数进行阶段划分 0 20 40 60 1000
data['bin'] = pd.cut(data['外呼分钟数'],bins=[-1,0,20,40,60,1000])
data

在这里插入图片描述

bin_p = data.pivot_table(index=['外呼时间','bin'],values=['用户号码','是否参与活动'],aggfunc='count')
bin_p.columns = ['参与活动数','总用户数']
bin_p['渗透率'] = (bin_p['参与活动数'] / bin_p['总用户数']).map(lambda x:format(x,'.2%'))
bin_p

在这里插入图片描述

在用户接听电话的情况下(外呼分钟数>0),外呼渗透率随着外呼时间的延长而有所提高。从各个时段的外呼渗透情况来看,在有效接通(接通时长>20秒)的情况下,10月各个时段的外呼渗透率均小于9月与11月。

用户特征方面分析

用户性别

观察用户性别是否对其参与活动的热情产生影响。注意送的是视频会员,这和性别可能真的有关系。

  • 计算针对不同性别的如下指标:
    • 外呼接通率:接通用户数/外呼用户数。
    • 接通渗透率:活动办理数/接通用户数。
    • 有效接通率:有效接通数/外呼用户数,>=20秒。
    • 有效接通渗透率:活动办理数/有效接通数。
    • 渗透率:活动办理数/外呼用户数。
      • 外呼用户数:
        • 不同性别对应的用户数量。
      • 接通用户数:
        • 不同性别对应外呼分钟数不为0的用户数量。
      • 有效接通数:
        • 不同性别的外呼分钟数>=20s的用户数量。
      • 活动办理数:
        • 不同性别中,参与活动的用户数量。
        • 在“是否参与活动”列中,NAN表示没有参与活动,非空表示参与活动。
#外呼用户数:不同性别对应的用户数量
s1 = data.groupby(by='用户性别')['用户号码'].count()
s1

用户性别
女 5800
男 10698
Name: 用户号码, dtype: int64

#接通用户数:不同性别对应外呼分钟数不为0的用户数量
def func(x):
    return np.count_nonzero(x)
s2 = data.groupby(by='用户性别')['外呼分钟数'].apply(func)
s2

用户性别
女 3955
男 8388
Name: 外呼分钟数, dtype: int64

#有效接通数:不同性别的外呼分钟数>=20s的用户数量
s3 = data.loc[data['外呼分钟数']>=20].groupby(data['用户性别'])['用户号码'].count()
s3

用户性别
女 3221
男 6984
Name: 用户号码, dtype: int64

#活动办理数
s4 = data.groupby(by='用户性别')['是否参与活动'].count()
s4

用户性别
女 1223
男 2700
Name: 是否参与活动, dtype: int64

df = pd.DataFrame([s1,s2,s3,s4],index=['外呼用户数','接通用户数','有效接通数','活动办理数']).T
df

在这里插入图片描述

#外呼接通率:接通用户数/外呼用户数
df['外呼接通率'] = (df['接通用户数'] / df['外呼用户数']).map(lambda x:format(x,'.2%'))
#接通渗透率:活动办理数/接通用户数;
df['接通渗透率'] = (df['活动办理数'] / df['接通用户数']).map(lambda x:format(x,'.2%'))
#有效接通率:有效接通数/外呼用户数;
df['有效接通率'] = (df['有效接通数'] / df['外呼用户数']).map(lambda x:format(x,'.2%'))
#有效接通渗透率:活动办理数/有效接通数
df['有效接通渗透率'] = (df['活动办理数'] / df['有效接通数']).map(lambda x:format(x,'.2%'))
#渗透率:活动办理数/外呼用户数
df['渗透率'] = (df['活动办理数'] / df['外呼用户数']).map(lambda x:format(x,'.2%'))
df

在这里插入图片描述

可以看到整体的数据,是男性的渗透率、接通率、有效接通率以及接通渗透率等指标均高于女性,为啥呢?

下面观察这活动的3个月内不同性别外呼用户数的比例(针对不同月份不同性别的查看)

#不同性别在外呼时间(月份)的用户数量
ret = data.groupby(['用户性别','外呼时间'])['用户号码'].count()
df1 = pd.DataFrame(ret)
df1.columns = ['用户数']
df1

在这里插入图片描述

#不同月份的总用户数
df2 = pd.DataFrame(data.groupby(['外呼时间'])['用户号码'].count())
df2.columns = ['用户总数']
df2

在这里插入图片描述

#数据合并
df = df1.join(df2,on='外呼时间')
df

在这里插入图片描述

#计算占比
df['占比'] = (df['用户数'] / df['用户总数']).map(lambda x:format(x,'.2%'))
df

在这里插入图片描述

可以看到,从9月到11月,外呼的女性占比显著提高,这也导致了外呼接通率、渗透率等指标的下降。

用户年龄

查看在活动月中,不同年龄层次之间的渗透率情况如何?

#查看用户年龄的大致分布情况
data['用户年龄'].describe()

在这里插入图片描述

#将用户年龄划分中几个区间进行分析
data['bin'] = pd.cut(data['用户年龄'],bins=[14,18,25,35,50,80,101])
data

在这里插入图片描述

#统计活动月中,每个月中不同用户年龄的参与活动数和用户总数
bin_penetration = data.pivot_table(index=['外呼时间','bin'],values=['用户号码','是否参与活动'],aggfunc='count')
bin_penetration.columns = ['参与活动数','用户数']
bin_penetration

在这里插入图片描述

#计算其渗透率:参与活动数/用户数
bin_penetration['渗透率'] = (bin_penetration['参与活动数']/bin_penetration['用户数']).map(lambda x:format(x,'.2%'))
bin_penetration

在这里插入图片描述

35岁以下的较年轻用户渗透率明显较高。与9月对比,10月、11月外呼用户侧重点明显偏移到了高龄用户,进而导致了渗透率的下跌。

用户套餐月租

从用户套餐月租的分布情况来看不同月租段的用户渗透率变化情况。

#用户套餐分布区间制定
data['bin'] = pd.cut(data['用户套餐月租'],bins=[-1,20,50,100,200,400])
#计算不同套餐不同区间的参与活动数和总用户数
bin_penetration = pd.pivot_table(data,index=['外呼时间','bin'],
                                 values=['用户号码','是否参与活动'],
                                 aggfunc=['count'])
bin_penetration = bin_penetration['count']
bin_penetration.columns = ['参与活动数','用户数']
#计算渗透率
bin_penetration['渗透率'] = (bin_penetration['参与活动数']/
                          bin_penetration['用户数']).map(lambda x:format(x,'.2%'))

bin_penetration

在这里插入图片描述

可以看到,用户的套餐月租与渗透率大致呈正相关关系:总体来说,用户套餐月租越高,用户参与活动的意向越高。整体来看9月的渗透率好于10月和11月。10月和11月外呼的月租套餐低于30元的用户显著高于9月,而恰恰是这一部分用户带来了极低的渗透率,导致了整体渗透率的下降。

入网时间

从用户的入网时间分布情况来看不同入网时间段的用户渗透率变化情况。

#提取入网时间的年份
def func(d):
    return int(str(d)[0:4])
data['years'] = data['入网时间'].map(func)

#制定入网时间的区间分布
data['bin'] = pd.cut(data['years'],bins=5)

bin_penetration = pd.pivot_table(data,index=['外呼时间','bin'],values=['用户号码','是否参与活动'],aggfunc=['count'])
bin_penetration = bin_penetration['count']
bin_penetration.columns = ['参与活动数','用户数']
bin_penetration['渗透率'] = (bin_penetration['参与活动数']/bin_penetration['用户数']).map(lambda x:format(x,'.2f'))
bin_penetration

在这里插入图片描述

综合三个月情况来看,入网时间较晚的用户渗透率相对较高,处于中早期的用户渗透率相对较低。

近6个月的平均花费
data['bin'] = pd.cut(data['近6个月平均话费'],bins=[-1,20,50,100,150,200])
bin_penetration = pd.pivot_table(data,index=['外呼时间','bin'],values=['用户号码','是否参与活动'],aggfunc=['count'])
bin_penetration = bin_penetration['count']
bin_penetration.columns = ['参与活动数','用户数']
bin_penetration['渗透率'] = (bin_penetration['参与活动数']/bin_penetration['用户数']).map(lambda x:format(x,'.2f'))
bin_penetration

在这里插入图片描述

可以看到,月平均话费越高的用户,外呼渗透率越提高。10月和11月外呼用户集中在月平均话费<100元的话费段的用户,这也导致了渗透率的下降。

近6个月的平均使用流量
data['bin'] = pd.cut(data['近6个月平均使用流量'], bins=[-1, 100,200, 500, 1000, 3000, 5000, 10000, 40000])
bin_penetration = pd.pivot_table(data, index=['外呼时间', 'bin'], values=['用户号码', '是否参与活动'], aggfunc=['count'])
bin_penetration = bin_penetration['count']
bin_penetration.columns = ['参与活动数', '用户数']
bin_penetration['渗透率'] = (bin_penetration['参与活动数']/bin_penetration['用户数']).map(lambda x: format(x,'.2f'))
bin_penetration

在这里插入图片描述

总体来看,月平均使用流量越多的用户,渗透率越高。10月、11月外呼最多的在月平均使用流量<100元的用户,但是这一部分用户的渗透率相对较低。

近6个月平均使用语音
data['bin'] = pd.cut(data['近6个月平均使用语音'],bins=[-1,100,200,300,400,500])
bin_penetration = pd.pivot_table(data,index=['外呼时间','bin'],values=['用户号码','是否参与活动'],aggfunc=['count'])
bin_penetration = bin_penetration['count']
bin_penetration.columns = ['参与活动数','用户数']
bin_penetration['渗透率'] = (bin_penetration['参与活动数']/bin_penetration['用户数']).map(lambda x:format(x,'.2f'))
bin_penetration

在这里插入图片描述

不同月套餐使用语音段,用户的渗透率并无明显差异。也就是说, 通过语音时长和渗透率基本没关系。

号码品牌
bin_penetration = pd.pivot_table(data,index=['外呼时间','号码品牌'],values=['用户号码','是否参与活动'],aggfunc=['count'])
bin_penetration = bin_penetration['count']
bin_penetration.columns = ['参与活动数','用户数']
bin_penetration['渗透率'] = (bin_penetration['参与活动数']/bin_penetration['用户数']).map(lambda x:format(x,'.2%'))
bin_penetration

在这里插入图片描述

整体来看,随着号码品牌的提高,渗透率也逐渐提高。9月的渗透率稍高于10月和11月。而渗透率较高的4G用户数则大多来自10月、11月,因此选取了不同号码品牌的用户并不是渗透率下降的原因

总结与建议

本次活动渗透率逐月下降的关键问题及背后的原因可以归纳如下:

10月关键问题:有效接通率、接通渗透率都有所下滑。

  • 用户选取上 : 选取的高龄用户、月租套餐低、月平均使用流量、话费少的用户过多;
  • 在外呼用户数量大幅增大的同时,外呼通话质量有所下降,通话时间明显缩短。

11月关键问题:有效接通率、接通渗透率都有所下滑,但接通渗透率有所回升。

  • 用户选取上 : 选取的高龄用户、月租套餐低、月平均使用流量、话费少的用户过多;
  • 外呼策略上出了问题,可能选取了不合适的时间段进行外呼;
  • 与10月相比,接通数急剧减少,因此外呼通话质量有所提升,接通渗透率回升。

通过分析,可以提出以下几点建议:

  1. 要正确选择外呼时间段,确保接通率;因为通话时长是影响用户办理的最关键因素,但在此之前得确保用户接听电话;
  2. 最关键的是尽量延长通话时间(最好在50.5分钟以上);
  3. 加强对外呼团队的培训和考核,确保通话质量和通话时长。

内容来自大数据分析课程。

  • 36
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ak2111

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值