更多商業數據分析案例(原理,完整代碼,數據集)、統計學、SQL、網絡爬蟲詳見公衆號 " 數據分析與商業實踐 "
引言
同期羣分析的目的在於透過現象找到結果,以時間維度建立同期羣,除按時間維度考慮,也可以對來源渠道等維度建立同期羣。是一個很不錯的數據分析思路與方法。
通過查看用戶的後續活躍、留存、訪問內容等相關數據,找出有效用戶的影響因素。
同期分析作用一覽
實際案例:9月份新增用戶10萬人,10月份新增用戶15萬人,但9月份新增用戶的30日留存用戶爲1萬人,10月份新增用戶的30日留存用戶也爲1萬人,哪個月的運營業績更好呢?我的這次促銷是否有提前透支口碑呢?同期分析結果需要結合業務實際,一些業務思維的培養放在了文末鏈接,本篇專注於用 Python 來實現同期分析,儘管目前有工具可專門實現,但用 Python 也來一次,可以訓練代碼手感和思路,往下看吧。
通過橫向對比,能夠對客戶留存和生命週期有初步的認識。基於縱向觀察,可以發現不同期客戶,留存情況的差異,以反推該期引入的客戶是否精準。
數據清洗
構建同期分析表
以單獨的一個時間爲例,爲後續構建大循環做準備
循環構建
看似很簡單,只是把剛纔的示例結合起來罷了,但中間也有值得注意的地方
輸出結果,有了等於號線和橫槓線配合換行的確會整潔不少
動態數據可視化&結果分析
-
橫向觀察,次月流失嚴重,表現最好的月份次月留存也只有12%,隨後平穩降低,穩定在6%左右。
-
縱向對比,2019年當月新增客戶最少,僅有2042位,但人羣相對精準,留存率表現優於其他月份。
關鍵代碼呈現
# 存儲每月新增的客戶數
monthly_increase = {} # 用字典存儲,格式輸出漂亮些,也有助於添加進 DataFrame 中
# 由上面的時間可知,範圍爲:2019-09 ~ 2020-02:最多也就加五個月
# 循環對每個月進行上述相同的求解操作,注意第一個月不需要進行操作
## 注:在進行大小循環的過程中,可以跟之前的樣本數據結果進行比對,簡單驗證一下
for i in range(len(month_list)):
print(f'正在對{month_list[i]}進行操作...')
print('-'*50)
# 求解該月的訂單數量和客戶數量
orders = df[df['付款時間'] == month_list[i]]
# 將客戶分組,即把多次下單的同一個客戶算爲一個客戶:根據暱稱來 groupby
customers = orders.groupby('客戶暱稱')['支付金額'].sum().reset_index()
print(f'{month_list[i]}的訂單數量爲:{len(orders)},客戶數量爲:{len(customers)}')
# --------------------- 計算每月新增客戶數 -------------------------------
# 如果是第一個月份,則跳過,畢竟不需要和歷史數據驗證是否爲新客戶
# 這也是 for 循環的 range() 中爲什麼不是month_list而是添加了長度的len(month_list)
if i == 0:
print('該月是數據集中的第一個月份,不需要和歷史數據驗證是否爲新客戶')
# 這裏的新增只是爲了格式上一致,畢竟第一個月算什麼新增
monthly_increase[month_list[i]] = len(customers)
else: # 如果不是,需要找到之前的歷史訂單
# print('該月不是數據集中的第一個月份,正在匹配歷史數據...')
print(f'該月({month_list[i]})的歷史年月爲:{", ".join(month_list[:i])}')
# 歷史訂單,從原始數據集中進行比對
history = df[df['付款時間'].isin(month_list[:i])]
# 新增客戶:未在歷史訂單中出現過的客戶
new_customers = customers[~customers['客戶暱稱'].isin(history['客戶暱稱'])]
print(f'本月新增客戶數爲:{len(new_customers)}')
monthly_increase[month_list[i]] = len(new_customers)
# --------------------- 計算每月留存客戶數 -------------------------------
print('正在計算', ", ".join(month_list[i+1:]), '中每個月份的客戶留存數...')
print('-'*50)
for j in range(i+1, len(month_list)):
# print(f'正在計算{month_list[j]}的留存客戶數...')
next_month = df[df['付款時間'] == month_list[j]]
retention_c=customers[customers['客戶暱稱'].isin(next_month['客戶暱稱'])]
print(f'{month_list[j]}的留存客戶數:{len(retention_c)}')
print('='*50 + '\n')
學會提問 | 個人爆發式成長 | 尋找零售密碼
一句話成爲心上人特別的存在
參考
大神極簡實現