項目介紹
為了拓展高階課的用戶銷量,目前通過BD與周邊學校合作,開展四節體驗課促銷活動,并且會在第三節體驗課后開展“高階課程講座”并開啟高階課的報名通道,目前項目已經完結,請根據已有的數據源分析并提出優化方案。
項目流程
- 用戶行為路徑軌跡
- 1.1 分析一般在線產品用戶行為路徑,并結合真實體驗過程,繪制流程圖
- 1.2 對數據源進行特征轉換(將“是”,“否”轉換為“1”,“0”),方便統計繪制漏斗圖
- 1.3 漏斗圖繪制
- 案例復盤
- 2.1 數據觀察(去重、查看缺失值、查看數據大小及類型)
- 2.2 清洗數據(清洗雜亂學校名稱字段、拆分課程報名情況)
- 2.3 數據合并(合并報名信息和上課情況表)
- 2.4 數據分析(從用戶路徑、學校、年級、推廣渠道等維度展開分析)
1.用戶行為路徑軌跡
1.1 用戶路徑
用戶體驗產品路徑一般為:渠道曝光->產生興趣->信息采集->體驗->完成
1.2 特征轉換
為了方便讀取數據以及統計各階段人數,將數據第三列之后根據是、否進行特征轉換為1,0
讀取原始數據
# 讀取excel文件
# 查看excel文件表格
wb = openpyxl.load_workbook("數據.xlsx")
wb.sheetnames
# 讀取數據
df2 = pd.read_excel("數據.xlsx",sheet_name="上課數據")
特征轉換:
dic = {"是":1,"否":0}
i = 0
for index in df2.columns:
i += 1
if i > 3:
df2[index] = df2[index].map(dic)
處理結果:- 文章一共有973條數據
1.3 繪制漏斗圖
導入pyecharts繪制互動性可視化漏斗圖
from pyecharts import options as opts
from pyecharts.charts import Funnel
c = ["總人數",'綁定微信','綁定手機號','添加老師','登錄APP','第一節課完課',
'第一節課作業完成','第二節課完課','第二節課作業完成', '第三節課完課','第三節課作業完成',
'高階課程點擊數','高階課程報名數','第四節課完課','第四節課作業完成']
c1 = [df2.ID.count(),df2["綁定微信"].sum(),df2["綁定手機"].sum(),df2["添加老師"].sum(),df2["登錄APP"].sum(),
df2["第一節課是否完課"].sum() , df2["第一節課是否完成作業"].sum(),df2["第二節課是否完課"].sum() , df2["第二節課是否完成作業"].sum(),
df2["第三節課是否完課"].sum() , df2["第三節課是否完成作業"].sum(),df2["高階課報名情況"].value_counts()["點擊未報名"],df2["高階課報名情況"].value_counts()["點擊已報名"],
df2["第四節課是否完課"].sum() , df2["第四節課是否完成作業"].sum()]
c1 = [round(int(i)/973*100,2) for i in c1]
c = (
Funnel()
.add(
"轉換率",
[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/>{b} : {c}%"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="流程轉化",subtitle="計算方式:人數/總人數"),
legend_opts=opts.LegendOpts(pos_left='right',pos_top="90%"))
)
c.render_notebook()
2. 案例復盤
2.1 觀察數據
檢驗缺失值:df1.info()
去重:df1.drop_duplicates()
# 檢查是否缺失
df1.info()
# 判斷是否有重復值
df1 = df1.drop_duplicates("id")
結果:刪除2條重復字段后,共有968條數據,無缺失值
2.2 字段清洗
由于表單為自主填寫,存在許多雜亂數據,需要進行清洗區分
2.2.1 學校字段:
df1.學校.unique()
經由業務部門溝通,先將學校分為以下7所:
- 邳州春田花花實驗小學
- 十堰東風八零學校
- 北大附屬西瓜小學
- 簡陽春田花花小學
- 三亞第九小學
- 鄭州第九十八中小學
- 肇慶第九小學
以下字段出現混淆: - 【江蘇邳州市春田花花、】【簡陽市春田花花小學】以及【春田花花小學】
- 【三亞第九小學】、【肇慶第九小學】以及【第九小學】
在數據清洗中,由于數據維度不夠,將春田花花實驗小學劃為江蘇邳州春田花花實驗小學 ,不包含實驗小學字樣的劃成簡陽市春田花花小學。
將包含三亞的統一劃為三亞第九小學 , 不包含三亞但是包含九小的劃為肇慶市第九小學
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 = '湖北省十堰市東風八零學校'
elif matchObj_xigua:
b = '北大西瓜小學'
elif matchObj_jiushiba:
b = '鄭州市第九十八中小學部'
elif matchObj_sanya:
b = '三亞市第九小學'
elif matchObj_shiyan:
b = '邳州市春田花花實驗小學'
elif matchObj_shiyan == None and matchObj_chuntian: # 如果“邳州市春田花花實驗小學”匹配失敗,則進行簡陽春天花花匹配
b = '簡陽市春田花花小學'
elif matchObj_sanya == None and matchObj_jiuxiao:
b = '肇慶市第九小學'
return b
# 清洗
df1["學校"] = df1['學校'].map(clean_school)
2.2.2 其他字段
df1["年級"].unique()
df1["班級"].unique()
df1["三級渠道"].unique()
df2.高階課報名情況.value_counts()
- 根據顯示結果,發現均無異常字段,無需清洗
2.2.3 字段拆分
高階課報名情況中,存在三種數據,“未點擊進入”,“點擊未報名”,“點擊已報名”,為方便區分,利用pd.get_dummies將三種數據進行特征提取。
df2 = pd.concat([df2,pd.get_dummies(df2["高階課報名情況"])],axis=1)
df2.drop("高階課報名情況",axis = 1,inplace = True)
2.3 數據合并
將用戶來源及信息表與用戶上課信息表通過"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 數據分析
2.4.1 漏斗圖繪制
參照開始流程,使用pyecharts進行漏斗圖繪制
from pyecharts import options as opts
from pyecharts.charts import Funnel
c = ["總人數",'綁定微信','綁定手機號','添加老師','登錄APP','第一節課完課',
'第一節課作業完成','第二節課完課','第二節課作業完成', '第三節課完課','第三節課作業完成',
'高階課程點擊數','高階課程報名數','第四節課完課','第四節課作業完成']
c1 = [df2.ID.count(),df2["綁定微信"].sum(),df2["綁定手機"].sum(),df2["添加老師"].sum(),df2["登錄APP"].sum(),
df2["第一節課是否完課"].sum() , df2["第一節課是否完成作業"].sum(),df2["第二節課是否完課"].sum() , df2["第二節課是否完成作業"].sum(),
df2["第三節課是否完課"].sum() , df2["第三節課是否完成作業"].sum(),df2["點擊未報名"].sum(),df2["點擊已報名"].sum(),
df2["第四節課是否完課"].sum() , df2["第四節課是否完成作業"].sum()]
c1 = [round(int(i)/973*100,2) for i in c1]
c = (
Funnel()
.add(
"轉換率",
[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/>{b} : {c}%"),
)
.set_global_opts(title_opts=opts.TitleOpts(title="流程轉化",subtitle="計算方式:人數/總人數"),
legend_opts=opts.LegendOpts(pos_left='right',pos_top="90%"))
)
c.render_notebook()
結果:
- 從漏斗圖得知,整體符合流程轉換規則,不過登錄APP到第一節課完課轉換率較低
- 但在第四節課完課處開始出現異常,第四節課完課率比高階課程報名數還要高,根據用戶鏈路,沒有報名的用戶是不能開始第四節課的,這里可能出現數據錯誤,需要相關部門進行檢查重新埋點
- 第二節課、第三節課作業完成率均比相應完課率較高,一部分同學沒有聽課直接做作業,推測可能是難度較低,可以適當提升難度
- 轉換率在報名處最低,符合規則,但同樣,需要調研用戶原因,查看是什么原因導致報名數較低,價格原因還是其他原因
2.4.2 多維度統計分析
(1)整體:
(2)學校
grouped_school = data.groupby("學校").count()["id"].reset_index()
# 繪圖
bar = (Bar()
.add_xaxis(list(grouped_school.學校))
.add_yaxis("參與人數",[int(i) for i in grouped_school.id.values])
.set_global_opts(title_opts=opts.TitleOpts(title = "各學校參與人數"),
xaxis_opts=opts.AxisOpts(name = "學校",axislabel_opts=opts.LabelOpts(rotate = 20)))
)
bar.render_notebook()
- 春田花花實驗小學人數最多,東風八零次之
(3)三級渠道
grouped_bd_sc = data.groupby(["三級渠道","學校"]).count()["id"].reset_index()
數據導入PowerBI繪制桑基圖- 主要渠道來源為周氏集團、武漢力公司、每日優鮮效果最好,河南公司和科技公司最次;
- 其中周氏集團和每日優鮮能夠覆蓋兩所學校;
- 東風八零學校、春田花花實驗學校的生源最多。
(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("小學一年級", grouped_nianji.loc['小學一年級'].tolist(), stack="stack1")
.add_yaxis("小學二年級", grouped_nianji.loc['小學二年級'].tolist(), stack="stack1")
.add_yaxis("小學三年級", grouped_nianji.loc['小學三年級'].tolist(), stack="stack1")
.add_yaxis("小學四年級", grouped_nianji.loc['小學四年級'].tolist(), stack="stack1")
.add_yaxis("小學五年級", grouped_nianji.loc['小學五年級'].tolist(), stack="stack1")
.add_yaxis("小學六年級", grouped_nianji.loc['小學六年級'].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業\n學\n員\n年\n級\n分\n布"
,padding = [150,100,5,10]),
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
)
)
bar.render_notebook()
- 每節課均是小學五年級占比最多,其次是小學三年級、小學四年級
- 幼兒園以及小學五年級以上,幾乎沒有人參與活動以及報名,推測可能是沒有向這些年級的學生推廣(幼兒園太小、六年級學生太忙等等)
2.4.3 特征工程處理
使用sklearn對于學校、年級、三級渠道字段進行特征處理,將至轉換為數值型
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data['學校'] = le.fit_transform(data['學校'])
data['年級'] = le.fit_transform(data['年級'])
data['三級渠道'] = le.fit_transform(data['三級渠道'])
正相關部分:第三節課是否完成作業與第四節課是否完成作業表現出強相關 ,高達0.87。第一次課程到第四次課程,可以看出他們關聯性較大,可謂是環環相扣,呈現出了方塊形狀。
負相關部分:學校與三級渠道達到-0.35。
結論:
從登錄APP到第一節課完課 ,用戶流失較嚴重,需要對該部分用戶進行調研 ,看是難度太大還是課程不能引起他們的興趣。
第三節課作業完成到高階課程報名這一過程 , 也出現數據異常,占比從60.8%下降到8%,但是第四節課的作業完成率與第四節課作業完成率都達到了百分之五十,甚至作業完成率高于完課率,這里要和產品部門溝通,對這里的用戶瀏覽軌跡進行專項復盤,是不是數據埋點需要重新進行設計。
完成作業及課程的學員大多分布在小學三、四、五年級,幼兒園及小學六年級、初中一年級幾乎沒有,根據二八法則,建議花更多時間在小學三四五年級身上,進行高階課程拓展。
逆轉集團、河南公司、科技公司的投放效果有限,周氏集團與每日優鮮的覆蓋效果較好,可以覆蓋兩個學校。建議后期選擇周氏集團與每日優鮮。
根據真實體驗情況,建議相關助教部門將發出的大量網址鏈接及視頻教程,以小程序或者H5表單形式呈現,以及視頻添加相關視頻說明。減少一般用戶對網址鏈接的抗拒感,增加品牌認知度。