項目介紹
為了拓展高階課的用戶銷量溶诞,目前通過BD與周邊學(xué)校合作螺垢,開展四節(jié)體驗課促銷活動枉圃,并且會在第三節(jié)體驗課后開展“高階課程講座”并開啟高階課的報名通道,目前項目已經(jīng)完結(jié)返劲,請根據(jù)已有的數(shù)據(jù)源分析并提出優(yōu)化方案篮绿。
項目流程
- 用戶行為路徑軌跡
- 1.1 分析一般在線產(chǎn)品用戶行為路徑亲配,并結(jié)合真實體驗過程吼虎,繪制流程圖
- 1.2 對數(shù)據(jù)源進行特征轉(zhuǎn)換(將“是”鲸睛,“否”轉(zhuǎn)換為“1”官辈,“0”),方便統(tǒng)計繪制漏斗圖
- 1.3 漏斗圖繪制
- 案例復(fù)盤
- 2.1 數(shù)據(jù)觀察(去重晴股、查看缺失值电湘、查看數(shù)據(jù)大小及類型)
- 2.2 清洗數(shù)據(jù)(清洗雜亂學(xué)校名稱字段寂呛、拆分課程報名情況)
- 2.3 數(shù)據(jù)合并(合并報名信息和上課情況表)
- 2.4 數(shù)據(jù)分析(從用戶路徑贷痪、學(xué)校劫拢、年級强胰、推廣渠道等維度展開分析)
1.用戶行為路徑軌跡
1.1 用戶路徑
用戶體驗產(chǎn)品路徑一般為:渠道曝光->產(chǎn)生興趣->信息采集->體驗->完成
1.2 特征轉(zhuǎn)換
為了方便讀取數(shù)據(jù)以及統(tǒng)計各階段人數(shù)缸剪,將數(shù)據(jù)第三列之后根據(jù)是杏节、否進行特征轉(zhuǎn)換為1,0
讀取原始數(shù)據(jù)
# 讀取excel文件
# 查看excel文件表格
wb = openpyxl.load_workbook("數(shù)據(jù).xlsx")
wb.sheetnames
# 讀取數(shù)據(jù)
df2 = pd.read_excel("數(shù)據(jù).xlsx",sheet_name="上課數(shù)據(jù)")
特征轉(zhuǎn)換:
dic = {"是":1,"否":0}
i = 0
for index in df2.columns:
i += 1
if i > 3:
df2[index] = df2[index].map(dic)
處理結(jié)果:- 文章一共有973條數(shù)據(jù)
1.3 繪制漏斗圖
導(dǎo)入pyecharts繪制互動性可視化漏斗圖
from pyecharts import options as opts
from pyecharts.charts import Funnel
c = ["總?cè)藬?shù)",'綁定微信','綁定手機號','添加老師','登錄APP','第一節(jié)課完課',
'第一節(jié)課作業(yè)完成','第二節(jié)課完課','第二節(jié)課作業(yè)完成', '第三節(jié)課完課','第三節(jié)課作業(yè)完成',
'高階課程點擊數(shù)','高階課程報名數(shù)','第四節(jié)課完課','第四節(jié)課作業(yè)完成']
c1 = [df2.ID.count(),df2["綁定微信"].sum(),df2["綁定手機"].sum(),df2["添加老師"].sum(),df2["登錄APP"].sum(),
df2["第一節(jié)課是否完課"].sum() , df2["第一節(jié)課是否完成作業(yè)"].sum(),df2["第二節(jié)課是否完課"].sum() , df2["第二節(jié)課是否完成作業(yè)"].sum(),
df2["第三節(jié)課是否完課"].sum() , df2["第三節(jié)課是否完成作業(yè)"].sum(),df2["高階課報名情況"].value_counts()["點擊未報名"],df2["高階課報名情況"].value_counts()["點擊已報名"],
df2["第四節(jié)課是否完課"].sum() , df2["第四節(jié)課是否完成作業(yè)"].sum()]
c1 = [round(int(i)/973*100,2) for i in c1]
c = (
Funnel()
.add(
"轉(zhuǎn)換率",
[list(z) for z in zip(c,c1)],
sort_="none",
label_opts=opts.LabelOpts(is_show=True, position="inside"),
tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/> : {c}%"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="流程轉(zhuǎn)化",subtitle="計算方式:人數(shù)/總?cè)藬?shù)"),
legend_opts=opts.LegendOpts(pos_left='right',pos_top="90%"))
)
c.render_notebook()
2. 案例復(fù)盤
2.1 觀察數(shù)據(jù)
檢驗缺失值:df1.info()
去重:df1.drop_duplicates()
# 檢查是否缺失
df1.info()
# 判斷是否有重復(fù)值
df1 = df1.drop_duplicates("id")
結(jié)果:刪除2條重復(fù)字段后,共有968條數(shù)據(jù)座菠,無缺失值
2.2 字段清洗
由于表單為自主填寫浴滴,存在許多雜亂數(shù)據(jù)升略,需要進行清洗區(qū)分
2.2.1 學(xué)校字段:
df1.學(xué)校.unique()
經(jīng)由業(yè)務(wù)部門溝通品嚣,先將學(xué)校分為以下7所:
- 邳州春田花花實驗小學(xué)
- 十堰東風(fēng)八零學(xué)校
- 北大附屬西瓜小學(xué)
- 簡陽春田花花小學(xué)
- 三亞第九小學(xué)
- 鄭州第九十八中小學(xué)
- 肇慶第九小學(xué)
以下字段出現(xiàn)混淆: - 【江蘇邳州市春田花花腰根、】【簡陽市春田花花小學(xué)】以及【春田花花小學(xué)】
- 【三亞第九小學(xué)】、【肇慶第九小學(xué)】以及【第九小學(xué)】
在數(shù)據(jù)清洗中劣挫,由于數(shù)據(jù)維度不夠压固,將春田花花實驗小學(xué)劃為江蘇邳州春田花花實驗小學(xué) 靠闭,不包含實驗小學(xué)字樣的劃成簡陽市春田花花小學(xué)。
將包含三亞的統(tǒng)一劃為三亞第九小學(xué) 谣光, 不包含三亞但是包含九小的劃為肇慶市第九小學(xué)
def clean_school(b):
matchObj_baling = re.search( r'八零', b, re.M|re.I)
matchObj_xigua = re.search( r'西瓜', b, re.M|re.I)
matchObj_jiushiba = re.search( r'九十八', b, re.M|re.I)
matchObj_sanya = re.search( r'三亞', b, re.M|re.I)
matchObj_shiyan = re.search( r'實', b, re.M|re.I)
matchObj_chuntian = re.search( r'春田花花', b, re.M|re.I)
matchObj_jiuxiao = re.search( r'九小', b, re.M|re.I)
if matchObj_baling:
b = '湖北省十堰市東風(fēng)八零學(xué)校'
elif matchObj_xigua:
b = '北大西瓜小學(xué)'
elif matchObj_jiushiba:
b = '鄭州市第九十八中小學(xué)部'
elif matchObj_sanya:
b = '三亞市第九小學(xué)'
elif matchObj_shiyan:
b = '邳州市春田花花實驗小學(xué)'
elif matchObj_shiyan == None and matchObj_chuntian: # 如果“邳州市春田花花實驗小學(xué)”匹配失敗萄金,則進行簡陽春天花花匹配
b = '簡陽市春田花花小學(xué)'
elif matchObj_sanya == None and matchObj_jiuxiao:
b = '肇慶市第九小學(xué)'
return b
# 清洗
df1["學(xué)校"] = df1['學(xué)校'].map(clean_school)
2.2.2 其他字段
df1["年級"].unique()
df1["班級"].unique()
df1["三級渠道"].unique()
df2.高階課報名情況.value_counts()
- 根據(jù)顯示結(jié)果,發(fā)現(xiàn)均無異常字段孙乖,無需清洗
2.2.3 字段拆分
高階課報名情況中唯袄,存在三種數(shù)據(jù)越妈,“未點擊進入”梅掠,“點擊未報名”店归,“點擊已報名”消痛,為方便區(qū)分秩伞,利用pd.get_dummies將三種數(shù)據(jù)進行特征提取纱新。
df2 = pd.concat([df2,pd.get_dummies(df2["高階課報名情況"])],axis=1)
df2.drop("高階課報名情況",axis = 1,inplace = True)
2.3 數(shù)據(jù)合并
將用戶來源及信息表與用戶上課信息表通過"ID"合并
- 注意:用戶來源表中字段名稱為“id”脸爱,上課信息表中字段名稱為“ID”
data = pd.merge(df1,df2,left_on="id",right_on="ID")
# 空值檢查
data.isnull().sum().sum()
# 刪除多余字段
data.drop(["ID","電話號碼","序號"],axis = 1,inplace = True)
2.4 數(shù)據(jù)分析
2.4.1 漏斗圖繪制
參照開始流程,使用pyecharts進行漏斗圖繪制
from pyecharts import options as opts
from pyecharts.charts import Funnel
c = ["總?cè)藬?shù)",'綁定微信','綁定手機號','添加老師','登錄APP','第一節(jié)課完課',
'第一節(jié)課作業(yè)完成','第二節(jié)課完課','第二節(jié)課作業(yè)完成', '第三節(jié)課完課','第三節(jié)課作業(yè)完成',
'高階課程點擊數(shù)','高階課程報名數(shù)','第四節(jié)課完課','第四節(jié)課作業(yè)完成']
c1 = [df2.ID.count(),df2["綁定微信"].sum(),df2["綁定手機"].sum(),df2["添加老師"].sum(),df2["登錄APP"].sum(),
df2["第一節(jié)課是否完課"].sum() , df2["第一節(jié)課是否完成作業(yè)"].sum(),df2["第二節(jié)課是否完課"].sum() , df2["第二節(jié)課是否完成作業(yè)"].sum(),
df2["第三節(jié)課是否完課"].sum() , df2["第三節(jié)課是否完成作業(yè)"].sum(),df2["點擊未報名"].sum(),df2["點擊已報名"].sum(),
df2["第四節(jié)課是否完課"].sum() , df2["第四節(jié)課是否完成作業(yè)"].sum()]
c1 = [round(int(i)/973*100,2) for i in c1]
c = (
Funnel()
.add(
"轉(zhuǎn)換率",
[list(z) for z in zip(c,c1)],
sort_="none",
label_opts=opts.LabelOpts(is_show=True, position="inside"),
tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{a} <br/> : {c}%"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="流程轉(zhuǎn)化",subtitle="計算方式:人數(shù)/總?cè)藬?shù)"),
legend_opts=opts.LegendOpts(pos_left='right',pos_top="90%"))
)
c.render_notebook()
結(jié)果:
- 從漏斗圖得知,整體符合流程轉(zhuǎn)換規(guī)則迂烁,不過登錄APP到第一節(jié)課完課轉(zhuǎn)換率較低
- 但在第四節(jié)課完課處開始出現(xiàn)異常递鹉,第四節(jié)課完課率比高階課程報名數(shù)還要高躏结,根據(jù)用戶鏈路媳拴,沒有報名的用戶是不能開始第四節(jié)課的屈溉,這里可能出現(xiàn)數(shù)據(jù)錯誤,需要相關(guān)部門進行檢查重新埋點
- 第二節(jié)課帆赢、第三節(jié)課作業(yè)完成率均比相應(yīng)完課率較高椰于,一部分同學(xué)沒有聽課直接做作業(yè)瘾婿,推測可能是難度較低偏陪,可以適當(dāng)提升難度
- 轉(zhuǎn)換率在報名處最低煮嫌,符合規(guī)則立膛,但同樣宝泵,需要調(diào)研用戶原因儿奶,查看是什么原因?qū)е聢竺麛?shù)較低,價格原因還是其他原因
2.4.2 多維度統(tǒng)計分析
(1)整體:
(2)學(xué)校
grouped_school = data.groupby("學(xué)校").count()["id"].reset_index()
# 繪圖
bar = (Bar()
.add_xaxis(list(grouped_school.學(xué)校))
.add_yaxis("參與人數(shù)",[int(i) for i in grouped_school.id.values])
.set_global_opts(title_opts=opts.TitleOpts(title = "各學(xué)校參與人數(shù)"),
xaxis_opts=opts.AxisOpts(name = "學(xué)校",axislabel_opts=opts.LabelOpts(rotate = 20)))
)
bar.render_notebook()
- 春田花花實驗小學(xué)人數(shù)最多瓤鼻,東風(fēng)八零次之
(3)三級渠道
grouped_bd_sc = data.groupby(["三級渠道","學(xué)校"]).count()["id"].reset_index()
數(shù)據(jù)導(dǎo)入PowerBI繪制刹绲唬基圖- 主要渠道來源為周氏集團祭犯、武漢力公司沃粗、每日優(yōu)鮮效果最好,河南公司和科技公司最次突雪;
- 其中周氏集團和每日優(yōu)鮮能夠覆蓋兩所學(xué)校挂签;
- 東風(fēng)八零學(xué)校饵婆、春田花花實驗學(xué)校的生源最多侨核。
(4)年級與完課率
grouped_nianji = pd.concat([data.groupby("年級").sum().iloc[:,5:9],data.groupby("年級").sum()["點擊已報名"]],axis = 1)
# 繪圖
bar = (Bar()
.add_xaxis(grouped_nianji.columns.tolist())
.add_yaxis("幼兒園小班", grouped_nianji.loc['幼兒園小班'].tolist(), stack="stack1")
.add_yaxis("小學(xué)一年級", grouped_nianji.loc['小學(xué)一年級'].tolist(), stack="stack1")
.add_yaxis("小學(xué)二年級", grouped_nianji.loc['小學(xué)二年級'].tolist(), stack="stack1")
.add_yaxis("小學(xué)三年級", grouped_nianji.loc['小學(xué)三年級'].tolist(), stack="stack1")
.add_yaxis("小學(xué)四年級", grouped_nianji.loc['小學(xué)四年級'].tolist(), stack="stack1")
.add_yaxis("小學(xué)五年級", grouped_nianji.loc['小學(xué)五年級'].tolist(), stack="stack1")
.add_yaxis("小學(xué)六年級", grouped_nianji.loc['小學(xué)六年級'].tolist(), stack="stack1")
.add_yaxis("初中一年級",grouped_nianji.loc['初中一年級'].tolist(), stack="stack1")
.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
axis_opts = opts.AxisOpts(
interval = None,
),
)
.set_global_opts(title_opts=opts.TitleOpts(title="完\n成\n課\n程\n及\n作\n業(yè)\n學(xué)\n員\n年\n級\n分\n布"
,padding = [150,100,5,10]),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
)
)
bar.render_notebook()
- 每節(jié)課均是小學(xué)五年級占比最多,其次是小學(xué)三年級些己、小學(xué)四年級
- 幼兒園以及小學(xué)五年級以上段标,幾乎沒有人參與活動以及報名逼庞,推測可能是沒有向這些年級的學(xué)生推廣(幼兒園太小、六年級學(xué)生太忙等等)
2.4.3 特征工程處理
使用sklearn對于學(xué)校派任、年級掌逛、三級渠道字段進行特征處理颤诀,將至轉(zhuǎn)換為數(shù)值型
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data['學(xué)校'] = le.fit_transform(data['學(xué)校'])
data['年級'] = le.fit_transform(data['年級'])
data['三級渠道'] = le.fit_transform(data['三級渠道'])
正相關(guān)部分:第三節(jié)課是否完成作業(yè)與第四節(jié)課是否完成作業(yè)表現(xiàn)出強相關(guān) ,高達0.87心傀。第一次課程到第四次課程拆讯,可以看出他們關(guān)聯(lián)性較大种呐,可謂是環(huán)環(huán)相扣,呈現(xiàn)出了方塊形狀爽室。
負(fù)相關(guān)部分:學(xué)校與三級渠道達到-0.35汁讼。
結(jié)論:
從登錄APP到第一節(jié)課完課 ,用戶流失較嚴(yán)重阔墩,需要對該部分用戶進行調(diào)研 嘿架,看是難度太大還是課程不能引起他們的興趣。
第三節(jié)課作業(yè)完成到高階課程報名這一過程 啸箫, 也出現(xiàn)數(shù)據(jù)異常耸彪,占比從60.8%下降到8%,但是第四節(jié)課的作業(yè)完成率與第四節(jié)課作業(yè)完成率都達到了百分之五十忘苛,甚至作業(yè)完成率高于完課率唱较,這里要和產(chǎn)品部門溝通,對這里的用戶瀏覽軌跡進行專項復(fù)盤召川,是不是數(shù)據(jù)埋點需要重新進行設(shè)計绊汹。
完成作業(yè)及課程的學(xué)員大多分布在小學(xué)三、四扮宠、五年級,幼兒園及小學(xué)六年級狐榔、初中一年級幾乎沒有坛增,根據(jù)二八法則,建議花更多時間在小學(xué)三四五年級身上薄腻,進行高階課程拓展收捣。
逆轉(zhuǎn)集團、河南公司庵楷、科技公司的投放效果有限罢艾,周氏集團與每日優(yōu)鮮的覆蓋效果較好,可以覆蓋兩個學(xué)校尽纽。建議后期選擇周氏集團與每日優(yōu)鮮咐蚯。
根據(jù)真實體驗情況,建議相關(guān)助教部門將發(fā)出的大量網(wǎng)址鏈接及視頻教程弄贿,以小程序或者H5表單形式呈現(xiàn)春锋,以及視頻添加相關(guān)視頻說明。減少一般用戶對網(wǎng)址鏈接的抗拒感差凹,增加品牌認(rèn)知度期奔。