1.日pv、日人均pv和日uv
import numpy as np
from pyecharts import Line, Overlap
pv_day = df[df.行為類型 == 'pv'].groupby('日期')['行為類型'].count()
uv_day = df[df.行為類型 == 'pv'].drop_duplicates(['用戶ID','日期']).groupby('日期')['用戶ID'].count()
attr = pv_day.index
v1 = pv_day.values
v2 = uv_day.values
line1 = Line('日pv、日人均pv和日uv對比圖')
line1.add('日pv(單位:萬次)', attr, np.around(v1/10000,decimals=2), mark_point=["max", "min"],
mark_line=['average'], legend_pos='right')
line1.add('日人均pv(單位:次)', attr, np.around(v1/v2, decimals=2), mark_point=['max','min'],
mark_line=['average'], yaxis_max=100, yaxis_name='pv', yaxis_name_pos='end',
yaxis_name_gap=15, legend_pos='right', legend_top='3%')
line2 = Line()
line2.add('日uv(單位:萬人)', attr, np.around(v2/10000, decimals=2), mark_point=["max",'min'],
mark_line=['average'], yaxis_name='uv', yaxis_name_pos='end', yaxis_name_gap=15)
overlap = Overlap()
overlap.add(line1)
overlap.add(line2, is_add_yaxis=True, yaxis_index=1)
overlap.render()
--日pv和日uv兩者走勢相類似,也進一步說明日人均pv波動較平緩,其平均水平為13.34;
--日pv和日uv均呈現上升趨勢,且均在12月2日突然升高至九日內最高水平,而12月2日是周六,但11月25日也是周六,因此可能不是周末的原因,又由於12月2日距離雙十一較近且多數人會在雙十一購買近期所需物品,因此初步推測12月2日~3日的突然升高是因為商家進行促銷、宣傳推廣等活動。
2.日新增uv和日新增uv的pv
from pyecharts import Bar, Line, Overlap
from copy import deepcopy
import datetime
df_pv = df[df.行為類型 == 'pv']
s = set()
days = []
nums = []
add_pv = []
for date in df_pv['日期'].unique():
num1 = len(s)
s1 = deepcopy(s)
ids = df_pv[df_pv.日期 == date]['用戶ID'].values.tolist()
for i in ids:
s.add(i)
add_users = s - s1
add_users_pvs = df[(df.用戶ID.isin(add_users)) & (df.行為類型 == 'pv')].groupby('日期', as_index=False)['行為類型'].count()
add_users_pv = int(add_users_pvs[add_users_pvs.日期 == date]['行為類型'].values)
num2 = len(s)
add_pv.append(add_users_pv)
days.append(date)
nums.append(num2-num1)
df_new_uv = pd.DataFrame({'日期': days, '新增訪客數': nums, '新增訪客的瀏覽量': add_pv})
attr = df_new_uv.日期
v = df_new_uv.新增訪客數
w = df_new_uv.新增訪客的瀏覽量
bar = Bar('日新增uv和日新增uv的pv對比圖')
bar.add('日新增uv', attr, v, is_label_show=True, yaxis_formatter=" 人", legend_pos='right', legend_top='3%', label_pos='outside')
line = Line()
line.add('日新增uv的pv', attr, w, yaxis_formatter=" 次",is_label_show=True, yaxis_max=700000, label_pos='inside')
overlap = Overlap()
overlap.add(bar)
overlap.add(line, is_add_yaxis=True, yaxis_index=1)
overlap.render()
日新增uv和日新增uv的pv均呈現明顯下降趨勢,且在12月2日新增uv的人均pv為627/62=10.11(低於日人均pv的平均水平),說明日pv的突然升高不是由12月2日當日新增的uv帶來的,而是由老uv帶來的,另外,12月2日新增uv為62人,環比增長-0.44,從側面反映了此次活動的目的可能不是拉新。
5.2 提高活躍度
1.時活躍用戶數
hour_active = df.drop_duplicates(['用戶ID', '小時']).groupby('小時')['用戶ID'].count()
line = Line('時活躍用戶折線圖')
line.add('', hour_active.index, hour_active.values, mark_point=['max', 'min'],
mark_line=['average'], yaxis_formatter=' 人')
line.render()
19時~22時為用戶活躍高峰期, 而2時~5時則為用戶活躍低峰期,可在用戶活躍高峰期加大活動宣傳力度。
2.日活躍用戶數
day_active = df.drop_duplicates(['用戶ID', '日期']).groupby('日期')['用戶ID'].count()
day_active
line = Line('日活躍用戶折線圖')
line.add('', day_active.index, day_active.values, is_label_show=True, yaxis_formatter=' 人')
line.render()
日活躍用戶數呈現明顯的增長趨勢,且在12月2日取得最大值,說明此次活動的目的可能是促活。
5.3 提高留存率
from datetime import timedelta
def get_nday_retention_rate(df, n):
users2 = set()
days = []
nday_retentions = []
dates = df.日期.unique()[:-n]
for date in dates:
users1 = deepcopy(users2)
ids = df[df.日期 == date].用戶ID.values.tolist()
for i in ids:
users2.add(i)
users = users2 - users1
nday_users = df[df.日期 == date + timedelta(days=n)].用戶ID.unique()
counts = 0
for nday_user in nday_users:
if nday_user in users:
counts += 1
nday_retention_rate = counts / len(users)
nday_retentions.append(nday_retention_rate)
days.append(date)
df_retention_rate = pd.DataFrame({'日期': days, 'n日留存率': nday_retentions})
return df_retention_rate
retention_rate1 = get_nday_retention_rate(df, 1)
retention_rate2 = get_nday_retention_rate(df, 2)
retention_rate3 = get_nday_retention_rate(df, 3)
retention_rate4 = get_nday_retention_rate(df, 4)
retention_rate5 = get_nday_retention_rate(df, 5)
retention_rate6 = get_nday_retention_rate(df, 6)
retention_rate7 = get_nday_retention_rate(df, 7)
line = Line('留存率對比分析圖')
line.add('7日留存', retention_rate7.日期, retention_rate7.n日留存率)
line.add('6日留存', retention_rate6.日期, retention_rate6.n日留存率)
line.add('5日留存', retention_rate5.日期, retention_rate5.n日留存率)
line.add('4日留存', retention_rate4.日期, retention_rate4.n日留存率)
line.add('3日留存', retention_rate3.日期, retention_rate3.n日留存率)
line.add('2日留存', retention_rate2.日期, retention_rate2.n日留存率)
line.add('次日留存', retention_rate1.日期, retention_rate1.n日留存率, legend_pos='right')
line.render()
--就時間窗口來說,次日留存和3日留存均表現出先減后增的趨勢,而7日留存則相比之前略有減少;
--就某一天來說,11月25日新增的活躍用戶3日留存<次日留存<7日留存,11月26日新增的活躍用戶次日留存<3日留存<7日留存,且其他日期3日留存均大於次日留存。
總體來說,留存呈現增長的趨勢,反映出用戶粘性在上升。
5.4 獲取營收
1.時購買行為
hour_buy_user_num = df[df.行為類型 == 'buy'].drop_duplicates(['用戶ID', '小時']).groupby('小時')['用戶ID'].count()
hour_active_user_num = df.drop_duplicates(['用戶ID', '小時']).groupby('小時')['用戶ID'].count()
hour_buy_rate = hour_buy_user_num / hour_active_user_num
attr = hour_buy_user_num.index
v1 = hour_buy_user_num.values
v2 = hour_buy_rate.values
line1 = Line('時購買行為分析')
line1.add('購買人數', attr, v1, mark_point=['max', 'min'], yaxis_formatter=' 人')
line2 = Line()
line2.add('購買率', attr, np.around(v2, 3), mark_point=['max', 'min'])
overlap = Overlap()
overlap.add(line1)
overlap.add(line2, is_add_yaxis=True, yaxis_index=1)
overlap.render()
購買人數和購買率的走勢大致相似,且均呈現明顯的雙峰走勢,其中21時購買人數最多,而10時購買率最高,應當繼續保持10時的活動,加大21時的活動力度。
2.日購買行為
day_buy_user_num = df[df.行為類型 == 'buy'].drop_duplicates(['用戶ID', '日期']).groupby('日期')['用戶ID'].count()
day_active_user_num = df.drop_duplicates(['用戶ID', '日期']).groupby('日期')['用戶ID'].count()
day_buy_rate = day_buy_user_num / day_active_user_num
attr = day_buy_user_num.index
v1 = day_buy_user_num.values
v2 = day_buy_rate.values
line1 = Line('日購買行為分析')
line1.add('購買人數', attr, v1, mark_point=['max', 'min'], yaxis_formatter=' 人')
line2 = Line()
line2.add('購買率', attr, np.around(v2, 3), mark_point=['max', 'min'])
overlap = Overlap()
overlap.add(line1)
overlap.add(line2, is_add_yaxis=True, yaxis_index=1)
overlap.render()
在12月1日之前,購買人數和購買率走勢相類似,而在12月1日之后購買人數有所增加,但與之前相比購買率卻在減少,商家應當優化產品本身並加大宣傳推廣。
3.九日復購率
df_rebuy = df[df.行為類型 == 'buy'].drop_duplicates(['用戶ID', '時間戳']).groupby('用戶ID')['時間戳'].count()
df_rebuy[df_rebuy >= 2].count() / df_rebuy.count()
0.6323078771856036
如果以0.6作為合格標准的話,說明用戶忠誠度表現一般,有大幅增長空間。
4.三日復購率和回購率
#計算復購率
for m, n in zip(range(1, 10), df.日期.unique()):
if m % 3 == 0:
df.loc[(df.日期 + timedelta(days=0) <= n) & (df.日期 + timedelta(days=2) >= n), '日期1'] = n
df.日期1.unique()
df_rebuy = df[df.行為類型 == 'buy'].drop_duplicates(['用戶ID', '時間戳']).groupby(['日期1', '用戶ID'], as_index=False)['行為類型'].count()
df_rebuy_rate = df_rebuy[df_rebuy.行為類型 >= 2].groupby('日期1')['用戶ID'].count() / df_rebuy.groupby('日期1')['用戶ID'].count()
#計算回購率
days = []
back_buy_rates = []
for i in range(0, 2):
df_buy_users = df[df.行為類型 == 'buy'].drop_duplicates(['用戶ID', '時間戳']).groupby(['日期1'])['用戶ID'].unique()
users_id = df_buy_users[i]
counts = 0
for user in users_id:
if user in df_buy_users[i+1]:
counts += 1
df_back_buy_rate = counts / len(df_buy_users[i])
back_buy_rates.append(df_back_buy_rate)
days.append(df_buy_users.index[i])
df_back_buy = pd.DataFrame({'日期': days, '回購率': back_buy_rates})
#繪制折線圖
line = Line('用戶每三日復購和回購行為分析')
line.add('回購率', df_back_buy.日期, np.around(df_back_buy.回購率, 3), is_label_show=True)
line.add('復購率', df_rebuy_rate.index, np.around(df_rebuy_rate.values, 3), is_label_show=True)
line.render()
--用戶回購率整體高於復購率,其波動性也明顯強於復購率;
--用戶復購率呈現先減后增的趨勢,而用戶回購率則是增加趨勢 , 即第二周期購買用戶的忠誠度較第一期高,整體說明用戶忠誠度在增加。
6. 轉化漏斗模型分析
from pyecharts import Funnel
pv_users = df[df.行為類型 == 'pv']['用戶ID'].count()
fav_users = df[df.行為類型 == 'fav']['用戶ID'].count()
cart_users = df[df.行為類型 == 'cart']['用戶ID'].count()
buy_users = df[df.行為類型 == 'buy']['用戶ID'].count()
attr = ['點擊', '加入購物車', '收藏', '購買']
values = [np.around((pv_users / pv_users * 100), 2),
np.around((cart_users / pv_users * 100), 2),
np.around((fav_users / pv_users * 100), 2),
np.around((buy_users / pv_users * 100), 2)]
funnel = Funnel("用戶行為轉化漏斗", title_pos='center')#width=600, height=400,
funnel.add(
"",
attr,
values,
is_label_show=True,
label_formatter = '{b} {c}%',
label_pos="outside",
is_legend_show = False,
)
funnel.render()
--總的點擊量中,有6.25%加入購物車,有3.24%收藏,而到最后只有2.24%購買,整體來看,購買的轉化率最低,有很大的增長空間;
--就顏色來看,紅色部分的變化最大,即“點擊-加入購物車“這一環節的轉化率最低,按照“點擊-加入購物車-收藏-購買”這一用戶行為路徑,我們可通過優化“點擊-加入購物車”這一環節進而提升購買的轉化率。
7. RF模型分析
R:Recency(最近一次消費),F:Frequency(消費頻次),M:Monetary(消費金額)
由於我們的數據集中沒有消費金額相關數據,因此這里就R和F對客戶價值進行分析
from datetime import date
nowdate = date(2017, 12, 5)
recent_buy_date = df[df.行為類型 == 'buy'].groupby('用戶ID')['日期'].apply(lambda x: x.sort_values().iloc[-1])
recent_buy_time = (nowdate - recent_buy_date).map(lambda x: x.days)
fre_buy = df[df.行為類型 == 'buy'].drop_duplicates(['用戶ID', '時間戳']).groupby('用戶ID')['日期'].count()
rf_module = pd.DataFrame({'用戶ID': recent_buy_time.index,
'recency': recent_buy_time.values,
'frequency': fre_buy.values})
rf_module['recency_avg'] = rf_module.recency.mean()
rf_module['frequency_avg'] = rf_module.frequency.mean()
rf_module.to_excel(r'E:\Data\data2.xlsx')
保存至Excel文件,然后通過Tableau繪制波士頓矩陣如下所示:
--第一象限(重要價值用戶):該象限用戶消費頻次高、最近一次消費近,應當繼續保持並給予支持;
--第二象限(重點保持用戶):該象限用戶消費頻次高、最近一次消費遠,可通過電話、短信等方式主動聯系促進最近消費;
--第三象限(重點挽留用戶):該象限用戶消費頻次低、最近一次消費遠,可通過贈送禮品、加大折扣等方式進行挽回;
--第四象限(重點發展用戶):該象限用戶消費頻次低、最近一次消費近,可通過發放優惠券、捆綁銷售等方式增加用戶購買頻次。
總結
-
對比12月2日~12月3日與上一個周末的日pv、日uv和日活躍用戶數,均發現有明顯的上升趨勢,且上升均是由老用戶帶來的,反映出老用戶忠誠度表現不錯,同時也說明了這兩天的促活活動產生了效果;
-
在每天的19時~22時為用戶活躍高峰期,購買人數也最多,購買率略低;而在10時用戶活躍度較低,購買人數也略低,但用戶購買率卻最高,因此就購買率來說,10時活躍用戶產生的價值較高,應當對10時活躍用戶的活動力度繼續保持並給予支持,重點發展19~22時的活躍用戶。
-
在“點擊-加入購物車-收藏-購買”轉化漏斗中:就整體來說,購買轉化率為2.24%表現最差,有很大的增長空間;就各環節來說,“點擊-加入購物車”環節的轉化率為6.25%表現最低,可以通過優化這一環節的轉化率,來提升整體的購買轉化率。
-
商家可根據RF模型的分析結果,對不同群體的用戶進行精准營銷,達到利益最大化。
聲明:本文僅用於學習交流,未經允許禁止轉載!