- 今日推薦
-
- 消費者對于生鮮的需求「興趣是促進學(xué)業(yè)發(fā)展的」
- 每日優(yōu)鮮的新零售模式「每日優(yōu)鮮社區(qū)團購」
- 為什么現(xiàn)在拼多多比淘寶火「淘寶會被拼多多打敗嗎」
- 擺地攤汽車哪款好「只需一輛轎車擺地攤」
- 外包公司考核指標(biāo)有哪些「電商客服的考核指標(biāo)」
- 賣家在亞馬遜北美站開店需要哪些資質(zhì)「亞馬遜北美站賣家注冊開店流程」
- 亞馬遜跨境電商開店需要什么資料「開亞馬遜店鋪需要什么條件」
- 抖音運營考核指標(biāo)「抖店注意點」
- 開車出去擺地攤都賣啥「適合開車擺地攤的商品」
- 勞斯萊斯發(fā)布了一款\\「勞斯萊斯1300萬什么車」
- 特別關(guān)注
- 熱門點擊
-
- 電商領(lǐng)域不斷掀起價格戰(zhàn)的風(fēng)暴「做電商沒有價格優(yōu)勢怎么辦」
- 寫文案有什么好處「如何寫好推廣文案」
- 小米獨特的商業(yè)模式是什么「中西方商業(yè)哲學(xué)」
- 拼多多:社交紅利時代的電商新模式「如何理解圈子營銷與社交紅利」
- 對于小米之家來說,新零售的概念是什么?「新零售產(chǎn)生的本質(zhì)」
- 促進高校畢業(yè)生就業(yè)創(chuàng)業(yè)「2020年下半年城鎮(zhèn)新增就業(yè)」
- 逸仙電商公司股東「二次創(chuàng)業(yè)跨越發(fā)展」
- 殘疾人電子商務(wù)培訓(xùn)實現(xiàn)創(chuàng)業(yè)「殘疾人業(yè)務(wù)培訓(xùn)就業(yè)」
- 小米新零售戰(zhàn)略激進「小米公司的新零售業(yè)態(tài)」
- 美妝行業(yè)創(chuàng)新「化妝品創(chuàng)新創(chuàng)業(yè)案例」
基于python的電商評論分析「python商業(yè)數(shù)據(jù)分析」
一. 項目背景
二. 數(shù)據(jù)集介紹
三. 數(shù)據(jù)清洗
四. 分析模型構(gòu)建
五. 總結(jié)
一. 項目背景項目對京東電商運營數(shù)據(jù)集進行指標(biāo)分析以了解用戶購物行為特征,為運營決策提供支持建議。 本文采用了MySQL和Python兩種代碼進行指標(biāo)計算以適應(yīng)不同的數(shù)據(jù)分析開發(fā)環(huán)境。
二. 數(shù)據(jù)集介紹本數(shù)據(jù)集為京東競賽數(shù)據(jù)集,詳細(xì)介紹請訪問鏈接: jdata.jd.com/html/detail… 。 數(shù)據(jù)集共有五個文件,包含了'2021-02-01'至'2021-04-15'之間的用戶數(shù)據(jù),數(shù)據(jù)已進行了脫敏處理,本文使用了其中的行為數(shù)據(jù)表,表中共有五個字段,各字段含義如下圖所示 行為數(shù)據(jù)表(jdata_action)字段說明
三. 數(shù)據(jù)清洗# 導(dǎo)入python相關(guān)模塊import numpy as npimport pandas as pdimport seaborn as snsimport matplotlib.pyplot as pltfrom datetime import datetimeplt.style.use('ggplot')%matplotlib inline# 設(shè)置中文編碼和負(fù)號的正常顯示plt.rcParams['font.sans-serif']=['SimHei']plt.rcParams['axes.unicode_minus']=False復(fù)制代碼# 讀取數(shù)據(jù),數(shù)據(jù)集較大,如果計算機讀取內(nèi)存不夠用,可以嘗試kaggle比賽# 中的reduce_mem_usage函數(shù),附在文末,主要原理是把int64/float64# 類型的數(shù)值用更小的int(float)32/16/8來搞定user_action = pd.read_csv('jdata_action.csv')復(fù)制代碼# 因數(shù)據(jù)集過大,本文截取'2018-03-30'至'2018-04-15'之間的數(shù)據(jù)完成本次分析# 注:僅4月份的數(shù)據(jù)包含加購物車行為,即type == 5user_data = user_action[(user_action['action_time'] > '2018-03-30') & (user_action['action_time'] < '2018-04-15')]復(fù)制代碼# 存至本地備用user_data.to_csv('user_data.csv',sep=',')復(fù)制代碼# 查看原始數(shù)據(jù)各字段類型behavior = pd.read_csv('user_data.csv', index_col=0)behavior[:10]復(fù)制代碼# OUTPUTuser_id sku_id action_time module_id type17 1455298 208441 2018-04-11 15:21:43 6190659 118 1455298 334318 2018-04-11 15:14:54 6190659 119 1455298 237755 2018-04-11 15:14:13 6190659 120 1455298 6422 2018-04-11 15:22:25 6190659 121 1455298 268566 2018-04-11 15:14:26 6190659 122 1455298 115915 2018-04-11 15:13:35 6190659 123 1455298 208254 2018-04-11 15:22:16 6190659 124 1455298 177209 2018-04-14 14:09:59 6628254 125 1455298 71793 2018-04-14 14:10:29 6628254 126 1455298 141950 2018-04-12 15:37:53 10207258 1復(fù)制代碼behavior.info()復(fù)制代碼# OUTPUT<class 'pandas.core.frame.DataFrame'>Int64Index: 7540394 entries, 17 to 37214234Data columns (total 5 columns):user_id int64sku_id int64action_time objectmodule_id int64type int64dtypes: int64(4), object(1)memory usage: 345.2 MB復(fù)制代碼# 查看缺失值 behavior.isnull().sum()復(fù)制代碼# OUTPUTuser_id 0sku_id 0action_time 0module_id 0type 0dtype: int64復(fù)制代碼數(shù)據(jù)各列無缺失值。
# 原始數(shù)據(jù)中時間列action_time,時間和日期是在一起的,不方便分析,對action_time列進行處理,拆分出日期和時間列,并添加星期字段求出每天對應(yīng)# 的星期,方便后續(xù)按時間緯度對數(shù)據(jù)進行分析behavior['date'] = pd.to_datetime(behavior['action_time']).dt.date # 日期behavior['hour'] = pd.to_datetime(behavior['action_time']).dt.hour # 時間behavior['weekday'] = pd.to_datetime(behavior['action_time']).dt.weekday_name # 周復(fù)制代碼# 去除與分析無關(guān)的列behavior = behavior.drop('module_id', axis=1)復(fù)制代碼# 將用戶行為標(biāo)簽由數(shù)字類型改為用字符表示behavior_type = {1:'pv',2:'pay',3:'fav',4:'comm',5:'cart'}behavior['type'] = behavior['type'].apply(lambda x: behavior_type[x])behavior.reset_index(drop=True,inplace=True)復(fù)制代碼# 查看處理好的數(shù)據(jù)behavior[:10]復(fù)制代碼# OUTPUTuser_id sku_id action_time type date hour weekday0 1455298 208441 2018-04-11 15:21:43 pv 2018-04-11 15 Wednesday1 1455298 334318 2018-04-11 15:14:54 pv 2018-04-11 15 Wednesday2 1455298 237755 2018-04-11 15:14:13 pv 2018-04-11 15 Wednesday3 1455298 6422 2018-04-11 15:22:25 pv 2018-04-11 15 Wednesday4 1455298 268566 2018-04-11 15:14:26 pv 2018-04-11 15 Wednesday5 1455298 115915 2018-04-11 15:13:35 pv 2018-04-11 15 Wednesday6 1455298 208254 2018-04-11 15:22:16 pv 2018-04-11 15 Wednesday7 1455298 177209 2018-04-14 14:09:59 pv 2018-04-14 14 Saturday8 1455298 71793 2018-04-14 14:10:29 pv 2018-04-14 14 Saturday9 1455298 141950 2018-04-12 15:37:53 pv 2018-04-12 15 Thursday復(fù)制代碼四. 分析模型構(gòu)建分析指標(biāo)流量指標(biāo)分析用戶消費頻次分析用戶行為在時間緯度的分布用戶行為轉(zhuǎn)化漏斗用戶留存率分析商品銷量分析RFM用戶價值分層1.流量指標(biāo)分析pv、uv、消費用戶數(shù)占比、消費用戶總訪問量占比、消費用戶人均訪問量、跳失率
PV UV# 總訪問量pv = behavior[behavior['type'] == 'pv']['user_id'].count()# 總訪客數(shù)uv = behavior['user_id'].nunique()# 消費用戶數(shù) user_pay = behavior[behavior['type'] == 'pay']['user_id'].unique()# 日均訪問量pv_per_day = pv / behavior['date'].nunique()# 人均訪問量pv_per_user = pv / uv# 消費用戶訪問量pv_pay = behavior[behavior['user_id'].isin(user_pay)]['type'].value_counts().pv# 消費用戶數(shù)占比user_pay_rate = len(user_pay) / uv# 消費用戶訪問量占比pv_pay_rate = pv_pay / pv# 消費用戶人均訪問量pv_per_buy_user = pv_pay / len(user_pay)復(fù)制代碼# SQLSELECT count(DISTINCT user_id) UV, (SELECT count(*) PV from behavior_sql WHERE type = 'pv') PVFROM behavior_sql;SELECT count(DISTINCT user_id)FROM behavior_sqlWHERE?WHERE type = 'pay';SELECT type, COUNT(*) FROM behavior_sqlWHERE user_id IN(SELECT DISTINCT user_idFROM behavior_sqlWHERE type = 'pay')AND type = 'pv'GROUP BY type;復(fù)制代碼print('總訪問量為 %i' %pv)print('總訪客數(shù)為 %i' %uv)print('消費用戶數(shù)為 %i' %len(user_pay))print('消費用戶訪問量為 %i' %pv_pay)print('日均訪問量為 %.3f' %pv_per_day)print('人均訪問量為 %.3f' %pv_per_user)print('消費用戶人均訪問量為 %.3f' %pv_per_buy_user)print('消費用戶數(shù)占比為 %.3f%%' %(user_pay_rate * 100))print('消費用戶訪問量占比為 %.3f%%' %(pv_pay_rate * 100))復(fù)制代碼# OUTPUT總訪問量為 6229177總訪客數(shù)為 728959消費用戶數(shù)為 395874消費用戶訪問量為 3918000日均訪問量為 389323.562人均訪問量為 8.545消費用戶人均訪問量為 9.897消費用戶數(shù)占比為 54.307%消費用戶訪問量占比為 62.898%復(fù)制代碼消費用戶人均訪問量和總訪問量占比都在平均值以上,有過消費記錄的用戶更愿意在網(wǎng)站上花費更多時間,說明網(wǎng)站的購物體驗尚可,老用戶對網(wǎng)站有一定依賴性,對沒有過消費記錄的用戶要讓快速了解產(chǎn)品的使用方法和價值,加強用戶和平臺的黏連。
跳失率# 跳失率:只進行了一次操作就離開的用戶數(shù)/總用戶數(shù)attrition_rates = sum(behavior.groupby('user_id')['type'].count() == 1) / (behavior['user_id'].nunique())復(fù)制代碼# SQLSELECT (SELECT COUNT(*)FROM (SELECT user_id FROM behavior_sql GROUP BY user_id HAVING COUNT(type)=1) A) /(SELECT COUNT(DISTINCT user_id) UV FROM behavior_sql) attrition_rates;復(fù)制代碼print('跳失率為 %.3f%%' %(attrition_rates * 100) )復(fù)制代碼# OUTPUT跳失率為 22.585%復(fù)制代碼整個計算周期內(nèi)跳失率為22.585%,還是有較多的用戶僅做了單次操作就離開了頁面,需要從首頁頁面布局以及產(chǎn)品用戶體驗等方面加以改善,提高產(chǎn)品吸引力。
2. 用戶消費頻次分析# 單個用戶消費總次數(shù)total_buy_count = (behavior[behavior['type']=='pay'].groupby(['user_id'])['type'].count() .to_frame().rename(columns={'type':'total'}))# 消費次數(shù)前10客戶topbuyer10 = total_buy_count.sort_values(by='total',ascending=False)[:10]# 復(fù)購率re_buy_rate = total_buy_count[total_buy_count>=2].count()/total_buy_count.count()復(fù)制代碼# SQL#消費次數(shù)前10客戶SELECT user_id, COUNT(type) total_buy_count FROM behavior_sql WHERE type = 'pay'GROUP BY user_idORDER BY COUNT(type) DESCLIMIT 10#復(fù)購率CREAT VIEW v_buy_count AS SELECT user_id, COUNT(type) total_buy_countFROM behavior_sqlWHERE type = 'pay'GROUP BY user_id;SELECT CONCAT(ROUND((SUM(CASE WHEN total_buy_count>=2 THEN 1 ELSE 0 END)/SUM(CASE WHEN total_buy_count>0 THEN 1 ELSE 0 END))*100,2),'%') AS re_buy_rate FROM v_buy_count;復(fù)制代碼topbuyer10.reset_index().style.bar(color='skyblue',subset=['total'])復(fù)制代碼# 單個用戶消費總次數(shù)可視化tbc_box = total_buy_count.reset_index()fig, ax = plt.subplots(figsize=[16,6])ax.set_yscale("log")sns.countplot(x=tbc_box['total'],data=tbc_box,palette='Set1')for p in ax.patches: ax.annotate('{:.2f}%'.format(100*p.get_height()/len(tbc_box['total'])), (p.get_x() - 0.1, p.get_height()))plt.title('用戶消費總次數(shù)')復(fù)制代碼整個計算周期內(nèi),最高購物次數(shù)為133次,最低為1次,大部分用戶的購物次數(shù)在6次以下,可適當(dāng)增加推廣,完善購物體驗,提高用戶消費次數(shù)。購物次數(shù)前10用戶為1187177、502169等,應(yīng)提高其滿意度,增大留存率。
print('復(fù)購率為 %.3f%%' %(re_buy_rate * 100) )復(fù)制代碼# OUTPUT復(fù)購率為 13.419%復(fù)制代碼復(fù)購率較低,應(yīng)加強老用戶召回機制,提升購物體驗,也可能因數(shù)據(jù)量較少,統(tǒng)計周期之內(nèi)的數(shù)據(jù) 無法解釋完整的購物周期,從而得出結(jié)論有誤。
3. 用戶行為在時間緯度的分布日消費次數(shù)、日活躍人數(shù)、日消費人數(shù)、日消費人數(shù)占比、消費用戶日人均消費次數(shù)# 日活躍人數(shù)(有一次操作即視為活躍) daily_active_user = behavior.groupby('date')['user_id'].nunique()# 日消費人數(shù)daily_buy_user = behavior[behavior['type'] == 'pay'].groupby('date')['user_id'].nunique()# 日消費人數(shù)占比proportion_of_buyer = daily_buy_user / daily_active_user# 日消費總次數(shù)daily_buy_count = behavior[behavior['type'] == 'pay'].groupby('date')['type'].count()# 消費用戶日人均消費次數(shù)consumption_per_buyer = daily_buy_count / daily_buy_user復(fù)制代碼# SQL# 日消費總次數(shù)SELECT date, COUNT(type) pay_daily FROM behavior_sql WHERE type = 'pay'GROUP BY date;# 日活躍人數(shù)SELECT date, COUNT(DISTINCT user_id) uv_daily FROM behavior_sql GROUP BY date;# 日消費人數(shù)SELECT date, COUNT(DISTINCT user_id) user_pay_daily FROM behavior_sql WHERE type = 'pay'GROUP BY date;# 日消費人數(shù)占比SELECT(SELECT date, COUNT(DISTINCT user_id) user_pay_daily FROM behavior_sql WHERE type = 'pay'GROUP BY date) /(SELECT date, COUNT(DISTINCT user_id) uv_daily FROM behavior_sql GROUP BY date) # 日人均消費次數(shù)SELECT(SELECT date, COUNT(type) pay_daily FROM behavior_sql WHERE type = 'pay'GROUP BY date) /(SELECT date, COUNT(DISTINCT user_id) uv_daily FROM behavior_sql GROUP BY date) 復(fù)制代碼# 日消費人數(shù)占比可視化# 柱狀圖數(shù)據(jù)pob_bar = (pd.merge(daily_active_user,daily_buy_user,on='date').reset_index() .rename(columns={'user_id_x':'日活躍人數(shù)','user_id_y':'日消費人數(shù)'}) .set_index('date').stack().reset_index().rename(columns={'level_1':'Variable',0: 'Value'}))# 線圖數(shù)據(jù)pob_line = proportion_of_buyer.reset_index().rename(columns={'user_id':'Rate'})fig1 = plt.figure(figsize=[16,6])ax1 = fig1.add_subplot(111)ax2 = ax1.twinx()sns.barplot(x='date', y='Value', hue='Variable', data=pob_bar, ax=ax1, alpha=0.8, palette='husl')ax1.legend().set_title('')ax1.legend().remove() sns.pointplot(pob_line['date'], pob_line['Rate'], ax=ax2,markers='D', linestyles='--',color='teal')x=list(range(0,16))for a,b in zip(x,pob_line['Rate']): plt.text(a 0.1, b 0.001, '%.2f%%' % (b*100), ha='center', va= 'bottom',fontsize=12)fig1.legend(loc='upper center',ncol=2)plt.title('日消費人數(shù)占比')復(fù)制代碼日活躍人數(shù)與日消費人數(shù)無明顯波動,日消費人數(shù)占比均在20%以上。
# 消費用戶日人均消費次數(shù)可視化# 柱狀圖數(shù)據(jù)cpb_bar = (daily_buy_count.reset_index().rename(columns={'type':'Num'}))# 線圖數(shù)據(jù)cpb_line = (consumption_per_buyer.reset_index().rename(columns={0:'Frequency'}))fig2 = plt.figure(figsize=[16,6])ax3 = fig2.add_subplot(111)ax4 = ax3.twinx()sns.barplot(x='date', y='Num', data=cpb_bar, ax=ax3, alpha=0.8, palette='pastel')sns.pointplot(cpb_line['date'], cpb_line['Frequency'], ax=ax4, markers='D', linestyles='--',color='teal')x=list(range(0,16))for a,b in zip(x,cpb_line['Frequency']): plt.text(a 0.1, b 0.001, '%.2f' % b, ha='center', va= 'bottom',fontsize=12)plt.title('消費用戶日人均消費次數(shù)')復(fù)制代碼日消費人數(shù)在25000以上,日人均消費次數(shù)大于1次。
dau3_df = behavior.groupby(['date','user_id'])['type'].count().reset_index()dau3_df = dau3_df[dau3_df['type'] >= 3]復(fù)制代碼# 每日高活躍用戶數(shù)(每日操作數(shù)大于3次)dau3_num = dau3_df.groupby('date')['user_id'].nunique()復(fù)制代碼# SQLSELECT date, COUNT(DISTINCT user_id) FROM(SELECT date, user_id, COUNT(type)FROM behavior_sqlGROUP BY date, user_idHAVING COUNT(type) >= 3) dau3GROUP BY date;復(fù)制代碼fig, ax = plt.subplots(figsize=[16,6])sns.pointplot(dau3_num.index, dau3_num.values, markers='D', linestyles='--',color='teal')x=list(range(0,16))for a,b in zip(x,dau3_num.values): plt.text(a 0.1, b 300 , '%i' % b, ha='center', va= 'bottom',fontsize=14)plt.title('每日高活躍用戶數(shù)')復(fù)制代碼每日高活躍用戶數(shù)在大部分4萬以上,2018-04-04之前數(shù)量比較平穩(wěn),之后數(shù)量一直攀升,8號9號達到最高,隨后下降,推測數(shù)據(jù)波動應(yīng)為營銷活動產(chǎn)生的。
# 高活躍用戶累計活躍天數(shù)分布dau3_cumsum = dau3_df.groupby('user_id')['date'].count()復(fù)制代碼# SQLSELECT user_id, COUNT(date) FROM(SELECT date, user_id, COUNT(type)FROM behavior_sqlGROUP BY date, user_idHAVING COUNT(type) >= 3) dau3GROUP BY user_id;復(fù)制代碼fig, ax = plt.subplots(figsize=[16,6])ax.set_yscale("log")sns.countplot(dau3_cumsum.values,palette='Set1')for p in ax.patches: ax.annotate('{:.2f}%'.format(100*p.get_height()/len(dau3_cumsum.values)), (p.get_x() 0.2, p.get_height() 100))plt.title('高活躍用戶累計活躍天數(shù)分布')復(fù)制代碼統(tǒng)計周期內(nèi),大部分高活躍用戶累計活躍天數(shù)在六天以下,但也存在高達十六天的超級活躍用戶數(shù)量,對累計天數(shù)較高的用戶要推出連續(xù)登錄獎勵等繼續(xù)維持其對平臺的黏性,對累計天數(shù)較低的用戶要適當(dāng)進行推送活動消息等對其進行召回。
#每日瀏覽量pv_daily = behavior[behavior['type'] == 'pv'].groupby('date')['user_id'].count()#每日訪客數(shù)uv_daily = behavior.groupby('date')['user_id'].nunique()復(fù)制代碼# SQL#每日瀏覽量SELECT date, COUNT(type) pv_daily FROM behavior_sql WHERE type = 'pv'GROUP BY date;#每日訪客數(shù)SELECT date, COUNT(DISTINCT user_id) uv_daily FROM behavior_sql GROUP BY date;復(fù)制代碼# 每日瀏覽量可視化fig, ax = plt.subplots(figsize=[16,6])sns.pointplot(pv_daily.index, pv_daily.values,markers='D', linestyles='--',color='dodgerblue')x=list(range(0,16))for a,b in zip(x,pv_daily.values): plt.text(a 0.1, b 2000 , '%i' % b, ha='center', va= 'bottom',fontsize=14)plt.title('每日瀏覽量')復(fù)制代碼# 每日訪客數(shù)可視化fig, ax = plt.subplots(figsize=[16,6])sns.pointplot(uv_daily.index, uv_daily.values, markers='H', linestyles='--',color='m')x=list(range(0,16))for a,b in zip(x,uv_daily.values): plt.text(a 0.1, b 500 , '%i' % b, ha='center', va= 'bottom',fontsize=14)plt.title('每日訪客數(shù)')復(fù)制代碼瀏覽量和訪客數(shù)每日變化趨勢大致相同,2018-04-04日前后用戶數(shù)量變化波動較大,4月4日為清明節(jié)假日前一天,各數(shù)據(jù)量在當(dāng)天均有明顯下降,但之后逐步回升,推測應(yīng)為節(jié)假日營銷活動或推廣拉新活動帶來的影響。
#每時瀏覽量pv_hourly = behavior[behavior['type'] == 'pv'].groupby('hour')['user_id'].count()#每時訪客數(shù)uv_hourly = behavior.groupby('hour')['user_id'].nunique()復(fù)制代碼# SQL # 每時瀏覽量SELECT date, COUNT(type) pv_daily FROM behavior_sql WHERE type = 'pv'GROUP BY hour;# 每時訪客數(shù)SELECT date, COUNT(DISTINCT user_id) uv_daily FROM behavior_sql GROUP BY hour;復(fù)制代碼# 瀏覽量隨小時變化可視化fig, ax = plt.subplots(figsize=[16,6])sns.pointplot(pv_hourly.index, pv_hourly.values, markers='H', linestyles='--',color='dodgerblue')for a,b in zip(pv_hourly.index,pv_hourly.values): plt.text(a, b 10000 , '%i' % b, ha='center', va= 'bottom',fontsize=12)plt.title('瀏覽量隨小時變化')復(fù)制代碼# 訪客數(shù)隨小時變化可視化fig, ax = plt.subplots(figsize=[16,6])sns.pointplot(uv_hourly.index, uv_hourly.values, markers='H', linestyles='--',color='m')for a,b in zip(uv_hourly.index,uv_hourly.values): plt.text(a, b 1000 , '%i' % b, ha='center', va= 'bottom',fontsize=12)plt.title('訪客數(shù)隨小時變化')復(fù)制代碼瀏覽量及訪客數(shù)隨小時變化趨勢一致,在凌晨1點到凌晨5點之間,大部分用戶正在休息,整體活躍度較低。凌晨5點到10點用戶開始起床工作,活躍度逐漸增加,之后趨于平穩(wěn),下午6點之后大部分人恢復(fù)空閑,瀏覽量及訪客數(shù)迎來了第二波攀升,在晚上8點中到達高峰,隨后逐漸下降。可以考慮在上午9點及晚上8點增大商品推廣力度,加大營銷活動投入,可取的較好的收益,1點到5點之間適合做系統(tǒng)維護。
# 用戶各操作隨小時變化type_detail_hour = pd.pivot_table(columns = 'type',index = 'hour', data = behavior,aggfunc=np.size,values = 'user_id')# 用戶各操作隨星期變化type_detail_weekday = pd.pivot_table(columns = 'type',index = 'weekday', data = behavior,aggfunc=np.size,values = 'user_id')type_detail_weekday = type_detail_weekday.reindex(['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'])復(fù)制代碼# SQL# 用戶各操作隨小時變化 SELECT hour,SUM(CASE WHEN behavior='pv' THEN 1 ELSE 0 END)AS 'pv',SUM(CASE WHEN behavior='fav' THEN 1 ELSE 0 END)AS 'fav',SUM(CASE WHEN behavior='cart' THEN 1 ELSE 0 END)AS 'cart',SUM(CASE WHEN behavior='pay' THEN 1 ELSE 0 END)AS 'pay'FROM behavior_sqlGROUP BY hourORDER BY hour# 用戶各操作隨星期變化 SELECT weekday,SUM(CASE WHEN behavior='pv' THEN 1 ELSE 0 END)AS 'pv',SUM(CASE WHEN behavior='fav' THEN 1 ELSE 0 END)AS 'fav',SUM(CASE WHEN behavior='cart' THEN 1 ELSE 0 END)AS 'cart',SUM(CASE WHEN behavior='pay' THEN 1 ELSE 0 END)AS 'pay'FROM behavior_sqlGROUP BY weekdayORDER BY weekday復(fù)制代碼tdh_line = type_detail_hour.stack().reset_index().rename(columns={0: 'Value'})tdw_line = type_detail_weekday.stack().reset_index().rename(columns={0: 'Value'})tdh_line= tdh_line[~(tdh_line['type'] == 'pv')]tdw_line= tdw_line[~(tdw_line['type'] == 'pv')]復(fù)制代碼# 用戶操作隨小時變化可視化fig, ax = plt.subplots(figsize=[16,6])sns.pointplot(x='hour', y='Value', hue='type', data=tdh_line, linestyles='--')plt.title('用戶操作隨小時變化')復(fù)制代碼用戶操作隨小時變化規(guī)律與PV、UV隨小時規(guī)律相似,與用戶作息規(guī)律相關(guān),加入購物車和付款兩條曲線貼合比比較緊密,說明大部分用戶習(xí)慣加入購物車后直接購買。關(guān)注數(shù)相對較少,可以根據(jù)用戶購物車內(nèi)商品進行精準(zhǔn)推送。評論數(shù)也相對較少,說明大部分用戶不是很熱衷對購物體驗進行反饋,可以設(shè)置一些獎勵制度提高用戶評論數(shù),增大用用戶粘性。
# 用戶操作隨星期變化可視化fig, ax = plt.subplots(figsize=[16,6])sns.pointplot(x='weekday', y='Value', hue='type', data=tdw_line[~(tdw_line['type'] == 'pv')], linestyles='--')plt.title('用戶操作隨星期變化')復(fù)制代碼周一到周四工作日期間,用戶操作隨星期變化比較平穩(wěn),周五至周六進入休息日,用戶操作明顯增多,周日又恢復(fù)正常。
4. 用戶行為轉(zhuǎn)化漏斗# 導(dǎo)入相關(guān)包from pyecharts import options as optsfrom pyecharts.charts import Funnelimport math復(fù)制代碼behavior['action_time'] = pd.to_datetime(behavior['action_time'],format ='%Y-%m-%d %H:%M:%S')復(fù)制代碼# 用戶整體行為分布type_dis = behavior['type'].value_counts().reset_index()type_dis['rate'] = round((type_dis['type'] / type_dis['type'].sum()),3)復(fù)制代碼type_dis.style.bar(color='skyblue',subset=['rate'])復(fù)制代碼用戶整體行為中,有82.6%行為為瀏覽,實際支付操作僅占6.4,除此之外,用戶評論及收藏的行為占比也較低,應(yīng)當(dāng)增強網(wǎng)站有用戶之間的互動,提高評論數(shù)量和收藏率。
df_con = behavior[['user_id', 'sku_id', 'action_time', 'type']]復(fù)制代碼df_pv = df_con[df_con['type'] == 'pv']df_fav = df_con[df_con['type'] == 'fav']df_cart = df_con[df_con['type'] == 'cart']df_pay = df_con[df_con['type'] == 'pay']df_pv_uid = df_con[df_con['type'] == 'pv']['user_id'].unique()df_fav_uid = df_con[df_con['type'] == 'fav']['user_id'].unique()df_cart_uid = df_con[df_con['type'] == 'cart']['user_id'].unique()df_pay_uid = df_con[df_con['type'] == 'pay']['user_id'].unique()復(fù)制代碼pv - buyfav_cart_list = set(df_fav_uid) | set(df_cart_uid)復(fù)制代碼pv_pay_df = pd.merge(left=df_pv, right=df_pay, how='inner', on=['user_id', 'sku_id'], suffixes=('_pv', '_pay'))復(fù)制代碼pv_pay_df = pv_pay_df[(~pv_pay_df['user_id'].isin(fav_cart_list)) & (pv_pay_df['action_time_pv'] < pv_pay_df['action_time_pay'])]復(fù)制代碼uv = behavior['user_id'].nunique()pv_pay_num = pv_pay_df['user_id'].nunique()pv_pay_data = pd.DataFrame({'type':['瀏覽','付款'],'num':[uv,pv_pay_num]})pv_pay_data['conversion_rates'] = (round((pv_pay_data['num'] / pv_pay_data['num'][0]),4) * 100)復(fù)制代碼attr1 = list(pv_pay_data.type)values1 = list(pv_pay_data.conversion_rates)data1 = [[attr1[i], values1[i]] for i in range(len(attr1))]復(fù)制代碼# 用戶行為轉(zhuǎn)化漏斗可視化pv_pay=(Funnel(opts.InitOpts(width="600px", height="300px")) .add( series_name="", data_pair=data1, gap=2, tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{b} : {c}%"), label_opts=opts.LabelOpts(is_show=True, position="inside"), itemstyle_opts=opts.ItemStyleOpts(border_color="#fff", border_width=1) ) .set_global_opts(title_opts=opts.TitleOpts(title="用戶行為轉(zhuǎn)化漏斗圖")) )pv_pay.render_notebook()復(fù)制代碼pv - cart - paypv_cart_df = pd.merge(left=df_pv, right=df_cart, how='inner', on=['user_id', 'sku_id'], suffixes=('_pv', '_cart'))復(fù)制代碼pv_cart_df = pv_cart_df[pv_cart_df['action_time_pv'] < pv_cart_df['action_time_cart']]pv_cart_df = pv_cart_df[~pv_cart_df['user_id'].isin(df_fav_uid)]復(fù)制代碼pv_cart_pay_df = pd.merge(left=pv_cart_df, right=df_pay, how='inner', on=['user_id', 'sku_id'])復(fù)制代碼pv_cart_pay_df = pv_cart_pay_df[pv_cart_pay_df['action_time_cart'] < pv_cart_pay_df['action_time']]復(fù)制代碼uv = behavior['user_id'].nunique()pv_cart_num = pv_cart_df['user_id'].nunique()pv_cart_pay_num = pv_cart_pay_df['user_id'].nunique()pv_cart_pay_data = pd.DataFrame({'type':['瀏覽','加購','付款'],'num':[uv,pv_cart_num,pv_cart_pay_num]})pv_cart_pay_data['conversion_rates'] = (round((pv_cart_pay_data['num'] / pv_cart_pay_data['num'][0]),4) * 100)復(fù)制代碼attr2 = list(pv_cart_pay_data.type)values2 = list(pv_cart_pay_data.conversion_rates)data2 = [[attr2[i], values2[i]] for i in range(len(attr2))]復(fù)制代碼# 用戶行為轉(zhuǎn)化漏斗可視化pv_cart_buy=(Funnel(opts.InitOpts(width="600px", height="300px")) .add( series_name="", data_pair=data2, gap=2, tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{b} : {c}%"), label_opts=opts.LabelOpts(is_show=True, position="inside"), itemstyle_opts=opts.ItemStyleOpts(border_color="#fff", border_width=1) ) .set_global_opts(title_opts=opts.TitleOpts(title="用戶行為轉(zhuǎn)化漏斗圖")) )pv_cart_buy.render_notebook()復(fù)制代碼pv - fav - paypv_fav_df = pd.merge(left=df_pv, right=df_fav, how='inner', on=['user_id', 'sku_id'], suffixes=('_pv', '_fav'))復(fù)制代碼pv_fav_df = pv_fav_df[pv_fav_df['action_time_pv'] < pv_fav_df['action_time_fav']]pv_fav_df = pv_fav_df[~pv_fav_df['user_id'].isin(df_cart_uid)]復(fù)制代碼pv_fav_pay_df = pd.merge(left=pv_fav_df, right=df_pay, how='inner', on=['user_id', 'sku_id'])復(fù)制代碼pv_fav_pay_df = pv_fav_pay_df[pv_fav_pay_df['action_time_fav'] < pv_fav_pay_df['action_time']]復(fù)制代碼uv = behavior['user_id'].nunique()pv_fav_num = pv_fav_df['user_id'].nunique()pv_fav_pay_num = pv_fav_pay_df['user_id'].nunique()pv_fav_pay_data = pd.DataFrame({'type':['瀏覽','收藏','付款'],'num':[uv,pv_fav_num,pv_fav_pay_num]})pv_fav_pay_data['conversion_rates'] = (round((pv_fav_pay_data['num'] / pv_fav_pay_data['num'][0]),4) * 100)復(fù)制代碼attr3 = list(pv_fav_pay_data.type)values3 = list(pv_fav_pay_data.conversion_rates)data3 = [[attr3[i], values3[i]] for i in range(len(attr3))]復(fù)制代碼# 用戶行為轉(zhuǎn)化漏斗可視化pv_fav_buy=(Funnel(opts.InitOpts(width="600px", height="300px")) .add( series_name="", data_pair=data3, gap=2, tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{b} : {c}%"), label_opts=opts.LabelOpts(is_show=True, position="inside"), itemstyle_opts=opts.ItemStyleOpts(border_color="#fff", border_width=1) ) .set_global_opts(title_opts=opts.TitleOpts(title="用戶行為轉(zhuǎn)化漏斗圖")) )pv_fav_buy.render_notebook()復(fù)制代碼pv - fav - cart - paypv_fav = pd.merge(left=df_pv, right=df_fav, how='inner', on=['user_id', 'sku_id'], suffixes=('_pv', '_fav'))復(fù)制代碼pv_fav = pv_fav[pv_fav['action_time_pv'] < pv_fav['action_time_fav']]復(fù)制代碼pv_fav_cart = pd.merge(left=pv_fav, right=df_cart, how='inner', on=['user_id', 'sku_id'])復(fù)制代碼pv_fav_cart = pv_fav_cart[pv_fav_cart['action_time_fav']<pv_fav_cart['action_time']]復(fù)制代碼pv_fav_cart_pay = pd.merge(left=pv_fav_cart, right=df_pay, how='inner', on=['user_id', 'sku_id'], suffixes=('_cart', '_pay'))復(fù)制代碼pv_fav_cart_pay = pv_fav_cart_pay[pv_fav_cart_pay['action_time_cart']<pv_fav_cart_pay['action_time_pay']]復(fù)制代碼uv = behavior['user_id'].nunique()pv_fav_n = pv_fav['user_id'].nunique()pv_fav_cart_n = pv_fav_cart['user_id'].nunique()pv_fav_cart_pay_n = pv_fav_cart_pay['user_id'].nunique()pv_fav_cart_pay_data = pd.DataFrame({'type':['瀏覽','收藏','加購','付款'],'num':[uv,pv_fav_n,pv_fav_cart_n,pv_fav_cart_pay_n]})pv_fav_cart_pay_data['conversion_rates'] = (round((pv_fav_cart_pay_data['num'] / pv_fav_cart_pay_data['num'][0]),4) * 100)復(fù)制代碼attr4 = list(pv_fav_cart_pay_data.type)values4 = list(pv_fav_cart_pay_data.conversion_rates)data4 = [[attr4[i], values4[i]] for i in range(len(attr4))]復(fù)制代碼# 用戶行為轉(zhuǎn)化漏斗可視化pv_fav_buy=(Funnel(opts.InitOpts(width="600px", height="300px")) .add( series_name="", data_pair=data4, gap=2, tooltip_opts=opts.TooltipOpts(trigger="item", formatter="{b} : {c}%"), label_opts=opts.LabelOpts(is_show=True, position="inside"), itemstyle_opts=opts.ItemStyleOpts(border_color="#fff", border_width=1) ) .set_global_opts(title_opts=opts.TitleOpts(title="用戶行為轉(zhuǎn)化漏斗圖")) )pv_fav_buy.render_notebook()復(fù)制代碼image.png
不同路徑用戶消費時間間隔分析
pv - cart - paypcp_interval = pv_cart_pay_df.groupby(['user_id', 'sku_id']).apply(lambda x: (x.action_time.min() - x.action_time_cart.min())).reset_index()復(fù)制代碼pcp_interval['interval'] = pcp_interval[0].apply(lambda x: x.seconds) / 3600pcp_interval['interval'] = pcp_interval['interval'].apply(lambda x: math.ceil(x))復(fù)制代碼fig, ax = plt.subplots(figsize=[16,6])sns.countplot(pcp_interval['interval'],palette='Set1')for p in ax.patches: ax.annotate('{:.2f}%'.format(100*p.get_height()/len(pcp_interval['interval'])), (p.get_x() 0.1, p.get_height() 100))ax.set_yscale("log")plt.title('pv-cart-pay路徑用戶消費時間間隔')復(fù)制代碼pv - fav - paypfp_interval = pv_fav_pay_df.groupby(['user_id', 'sku_id']).apply(lambda x: (x.action_time.min() - x.action_time_fav.min())).reset_index()復(fù)制代碼pfp_interval['interval'] = pfp_interval[0].apply(lambda x: x.seconds) / 3600pfp_interval['interval'] = pfp_interval['interval'].apply(lambda x: math.ceil(x))復(fù)制代碼fig, ax = plt.subplots(figsize=[16,6])sns.countplot(pfp_interval['interval'],palette='Set1')for p in ax.patches: ax.annotate('{:.2f}%'.format(100*p.get_height()/len(pfp_interval['interval'])), (p.get_x() 0.1, p.get_height() 10))ax.set_yscale("log")plt.title('pv-fav-pay路徑用戶消費時間間隔')復(fù)制代碼image.png
兩種路徑下大部分用戶均在4小時內(nèi)完成了支付,大部分用戶的購物意向很明確,也側(cè)面說明了網(wǎng)站的商品分類布局和購物結(jié)算方式比較合理。
# SQL# 漏斗圖SELECT type, COUNT(DISTINCT user_id) user_numFROM behavior_sqlGROUP BY typeORDER BY COUNT(DISTINCT user_id) DESCSELECT COUNT(DISTINCT b.user_id) AS pv_fav_num,COUNT(DISTINCT c.user_id) AS pv_fav_pay_numFROM((SELECT DISTINCT user_id, sku_id, action_time FROM users WHERE type='pv' ) AS aLEFT JOIN(SELECT DISTINCT user_id, sku_id, action_time FROM users WHERE type='fav'AND user_id NOT IN (SELECT DISTINCT user_idFROM behavior_sqlWHERE type = 'cart')) AS bON a.user_id = b.user_id AND a.sku_id = b.sku_id AND a.action_time <= b.action_timeLEFT JOIN(SELECT DISTINCT user_id,sku_id,item_category,times_new FROM users WHERE behavior_type='pay') AS cON b.user_id = c.user_id AND b.sku_id = c.sku_id AND AND b.action_time <= c.action_time);復(fù)制代碼比較四種不同的轉(zhuǎn)化方式,最有效的轉(zhuǎn)化路徑為瀏覽直接付款轉(zhuǎn)化率為21.46%,其次為瀏覽加購付款,轉(zhuǎn)化率為12.47%,可以發(fā)現(xiàn)隨著結(jié)算方式越來越復(fù)雜轉(zhuǎn)化率越來越低。加購的方式比收藏購買的方式轉(zhuǎn)化率要高,推其原因為購物車接口進入方便且可以做不同商家比價用,而收藏則需要更繁瑣的操作才可以查看到商品,因此轉(zhuǎn)化率較低。
可以優(yōu)化商品搜索功能,提高商品搜索準(zhǔn)確度、易用性,減少用戶搜索時間。根據(jù)用戶喜好在首頁進行商品推薦,優(yōu)化重排商品詳情展示頁,提高顧客下單欲望,提供一鍵購物等簡化購物步驟的功能,客服也可以留意加購及關(guān)注用戶,適時推出優(yōu)惠福利及時解答用戶問題,引導(dǎo)用戶購買以進一步提高轉(zhuǎn)化率。
對于用戶消費時間間隔,可以通過限時領(lǐng)券購買、限時特惠價格等進一步縮短用戶付款時間,提高訂單量。
5. 用戶留存率分析#留存率first_day = datetime.date(datetime.strptime('2018-03-30', '%Y-%m-%d'))fifth_day = datetime.date(datetime.strptime('2018-04-03', '%Y-%m-%d'))tenth_day = datetime.date(datetime.strptime('2018-04-08', '%Y-%m-%d'))fifteenth_day = datetime.date(datetime.strptime('2018-04-13', '%Y-%m-%d'))#第一天新用戶數(shù)user_num_first = behavior[behavior['date'] == first_day]['user_id'].to_frame()#第五天留存用戶數(shù)user_num_fifth = behavior[behavior['date'] == fifth_day ]['user_id'].to_frame()#第十留存用戶數(shù)user_num_tenth = behavior[behavior['date'] == tenth_day]['user_id'].to_frame()#第十五天留存用戶數(shù)user_num_fifteenth = behavior[behavior['date'] == fifteenth_day]['user_id'].to_frame()復(fù)制代碼#第五天留存率fifth_day_retention_rate = round((pd.merge(user_num_first, user_num_fifth).nunique()) / (user_num_first.nunique()),4).user_id#第十天留存率tenth_day_retention_rate = round((pd.merge(user_num_first, user_num_tenth ).nunique()) / (user_num_first.nunique()),4).user_id#第十五天留存率fifteenth_day_retention_rate = round((pd.merge(user_num_first, user_num_fifteenth).nunique()) / (user_num_first.nunique()),4).user_id復(fù)制代碼retention_rate = pd.DataFrame({'n日后留存率':['第五天留存率','第十天留存率','第十五天留存率'], 'Rate':[fifth_day_retention_rate,tenth_day_retention_rate,fifteenth_day_retention_rate]})復(fù)制代碼# 留存率可視化fig, ax = plt.subplots(figsize=[16,6])sns.barplot(x='n日后留存率', y='Rate', data=retention_rate, palette='Set1')x=list(range(0,3))for a,b in zip(x,retention_rate['Rate']): plt.text(a, b 0.001, '%.2f%%' % (b*100), ha='center', va= 'bottom',fontsize=12)plt.title('用戶留存率')復(fù)制代碼留存率反應(yīng)了產(chǎn)品質(zhì)量和保留用戶的能力,按照Facebook平臺流傳出留存率“40–20–10”規(guī)則(規(guī)則中的數(shù)字表示的是次日留存率、第7日留存率和第30日留存率),統(tǒng)計周期內(nèi)第五日留存率為22.81%,第15日留存率為17.44%,反映出平臺的用戶依賴性較高,也因平臺發(fā)展已經(jīng)到達穩(wěn)定階段,用戶保留率不會發(fā)生較大波動,數(shù)據(jù)量足夠的情況下可以以年為單位,計算按月的留存率。要合理安排消息推送,推出簽到有獎等機制提高用戶粘性,進一步提高留存率。
# SQL#n日后留存率=(注冊后的n日后還登錄的用戶數(shù))/第一天新增總用戶數(shù)create table retention_rate as select count(distinct user_id) as user_num_first from behavior_sqlwhere date = '2018-03-30';alter table retention_rate add column user_num_fifth INTEGER;update retention_rate set user_num_fifth=(select count(distinct user_id) from behavior_sqlwhere date = '2018-04-03' and user_id in (SELECT user_id FROM behavior_sqlWHERE date = '2018-03-30'));alter table retention_rate add column user_num_tenth INTEGER;update retention_rate set user_num_tenth=(select count(distinct user_id) from behavior_sqlwhere date = '2018-04-08' and user_id in (SELECT user_id FROM behavior_sqlWHERE date = '2018-03-30'));alter table retention_rate add column user_num_fifteenth INTEGER;update retention_rate set user_num_fifteenth=(select count(distinct user_id) from behavior_sqlwhere date = '2018-04-13' and user_id in (SELECT user_id FROM behavior_sqlWHERE date = '2018-03-30'));SELECT CONCAT(ROUND(100*user_num_fifth/user_num_first,2),'%')AS fifth_day_retention_rate,CONCAT(ROUND(100*user_num_tenth/user_num_first,2),'%')AS tenth_day_retention_rate,CONCAT(ROUND(100*user_num_fifteenth/user_num_first,2),'%')AS fifteenth_day_retention_ratefrom retention_rate;復(fù)制代碼6. 商品銷量分析# 商品總數(shù)behavior['sku_id'].nunique()復(fù)制代碼# OUTPUT 239007復(fù)制代碼# 商品被購前產(chǎn)生平均操作次數(shù)sku_df = behavior[behavior['sku_id'].isin(behavior[behavior['type'] == 'pay']['sku_id'].unique())].groupby('sku_id')['type'].value_counts().unstack(fill_value=0)sku_df['total'] = sku_df.sum(axis=1)sku_df['avg_beha'] = round((sku_df['total'] / sku_df['pay']), 2)復(fù)制代碼fig, ax = plt.subplots(figsize=[8,6])sns.scatterplot(x='avg_beha', y='pay', data=sku_df, palette='Set1')ax.set_xscale("log")ax.set_yscale("log")plt.xlabel('平均操作次數(shù)')plt.ylabel('銷量')復(fù)制代碼左下角操作少購買少,屬于冷門購買頻率較低的產(chǎn)品。
左上角操作少購買多,屬于快消類產(chǎn)品,可選擇品牌少,少數(shù)品牌壟斷的行業(yè)。
右下角操作多購買少,品牌多,但是購買頻率低,應(yīng)為貴重物品類。
右上角操作多購買多,大眾品牌,可選多,被購買頻次高。
# 商品銷量排行sku_num = (behavior[behavior['type'] == 'pay'].groupby('sku_id')['type'].count().to_frame() .rename(columns={'type':'total'}).reset_index())# 銷量大于1000的商品topsku = sku_num[sku_num['total'] > 1000].sort_values(by='total',ascending=False)# 單個用戶共購買商品種數(shù)sku_num_per_user = (behavior[behavior['type'] == 'pay']).groupby(['user_id'])['sku_id'].nunique()復(fù)制代碼topsku.set_index('sku_id').style.bar(color='skyblue',subset=['total'])復(fù)制代碼在計算周期內(nèi)訂單數(shù)均突破1000以上的共有13款產(chǎn)品,其中152092這款產(chǎn)品訂單數(shù)最高為1736. 推出商品組合有優(yōu)惠等,提高單個用戶購買產(chǎn)品種數(shù)。
# SQL# sku銷量排行SELECT sku_id, COUNT(type) sku_num FROM behavior_sql WHERE type = 'pay'GROUP BY sku_idHAVING sku_num > 1000ORDER BY sku_num DESC;復(fù)制代碼7. RFM用戶分層#RFM#由于缺少M(金額)列,僅通過R(最近一次購買時間)和F(消費頻率)對用戶進行價值分析buy_group = behavior[behavior['type']=='pay'].groupby('user_id')['date']復(fù)制代碼#將2018-04-13作為每個用戶最后一次購買時間來處理final_day = datetime.date(datetime.strptime('2018-04-14', '%Y-%m-%d'))復(fù)制代碼#最近一次購物時間recent_buy_time = buy_group.apply(lambda x:final_day-x.max())recent_buy_time = recent_buy_time.reset_index().rename(columns={'date':'recent'})recent_buy_time['recent'] = recent_buy_time['recent'].map(lambda x:x.days)復(fù)制代碼#近十五天內(nèi)購物頻率buy_freq = buy_group.count().reset_index().rename(columns={'date':'freq'})復(fù)制代碼RFM = pd.merge(recent_buy_time,buy_freq,on='user_id')復(fù)制代碼RFM['R'] = pd.qcut(RFM.recent,2,labels=['1','0'])#天數(shù)小標(biāo)簽為1天數(shù)大標(biāo)簽為0RFM['F'] = pd.qcut(RFM.freq.rank(method='first'),2,labels=['0','1'])#頻率大標(biāo)簽為1頻率小標(biāo)簽為0復(fù)制代碼RFM['RFM'] = RFM['R'].astype(int).map(str) RFM['F'].astype(int).map(str)復(fù)制代碼dict_n={'01':'重要保持客戶', '11':'重要價值客戶', '10':'重要挽留客戶', '00':'一般發(fā)展客戶'}復(fù)制代碼#用戶標(biāo)簽RFM['用戶等級'] = RFM['RFM'].map(dict_n)復(fù)制代碼RFM_pie = RFM['用戶等級'].value_counts().reset_index()RFM_pie['Rate'] = RFM_pie['用戶等級'] / RFM_pie['用戶等級'].sum()復(fù)制代碼fig, ax = plt.subplots(figsize=[16,6])plt.pie(RFM_pie['Rate'], labels = RFM_pie['index'], startangle = 90,autopct="%1.2f%%", counterclock = False,colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral'])plt.axis('square')plt.title('RFM用戶分層')復(fù)制代碼不同類型用戶占比差異較小,應(yīng)提升重要價值各戶的占比,減小一般發(fā)展客戶的占比。 通過RFM模型對用戶價值進行分類,對不同價值用戶應(yīng)采取不同的運營策略,對于重要價值客戶來說,要提高該部分用戶的滿意度,服務(wù)升級,發(fā)放特別福利,增大該部分用戶留存率,在做運營推廣時也要給與特別關(guān)注,避免引起用戶反感。 對于重要保持客戶,他們購物頻次較高,但最近一段時間沒有消費,可以推送相關(guān)其他商品,發(fā)放優(yōu)惠卷、贈品和促銷信息等,喚回該部分用戶。 對于重要挽留客戶,他們最近消費過,但購物頻次較低,可以通過問卷有禮的方式找出其對平臺的不滿,提升購物體驗,增大用戶粘性。 對于一般發(fā)展客戶,做到定期發(fā)送郵件或短信喚回,努力將其轉(zhuǎn)化為重要保持客戶或重要挽留客戶。
# SQL# RFMCREATE VIEW RF_table ASSELECT user_id, DATEDIFF('2018-04-14',MAX(date)) AS R_days,COUNT(*) AS F_countFROM behavior_sql WHERE type='pay' GROUP BY user_id;SELECT AVG(R_days), AVG(F_count)FROM RF_tablecreate view RF_ layer asSELECT user_id, (CASE WHEN R_days < 7.1697 THEN 1 ELSE 0 END) AS R,(CASE WHEN F_count < 1.2129 THEN 0 ELSE 1 END) AS FFROM RF_tableORDER BY user_id DESC;create view customer_value asselect user_id, R, F, (CASE WHEN R=1 and F=1 THEN "重要價值客戶" WHEN R=1 and F=0 THEN "重要挽留客戶" WHEN R=0 and F=1 THEN "重要保持客戶" WHEN R=0 and F=0 THEN "一般發(fā)展客戶" ELSE 0 END) as 用戶價值FROM RF_ layer;SELECT * FROM customer_value;復(fù)制代碼五. 總結(jié)1.可以增加渠道推廣投入,進行精準(zhǔn)人群推廣,推出新用戶福利,吸引新用戶,推出團購、分享有禮等活動促進老帶新,推出促銷活動刺激老用戶,提高訪客數(shù)和瀏覽量。提高產(chǎn)品質(zhì)量,提高商品詳情頁對用戶的吸引力,降低跳失率。
2.根據(jù)用戶操作隨時間變化規(guī)律來開展?fàn)I銷活動,使活動更容易觸達用戶,在用戶訪問高峰期多推送用戶感興趣商品。
3.復(fù)購率較低,說明用戶對平臺購物體驗不滿,需要找出用戶槽點,提高用戶購物滿意度,優(yōu)化商品推送機制,對老用戶給予特別福利,提高他們所享受權(quán)益。轉(zhuǎn)化率也偏低,需要改善平臺搜索機制降低提高搜索效率,優(yōu)化購物路徑降低購物復(fù)雜度,改善商品詳情信息展示方式便于信息的獲取。
4.留存率相對穩(wěn)定,為進一步提高留存率,可以定期推出秒殺活動,推出專享優(yōu)惠券,推出簽到有禮環(huán)節(jié),增加用戶瀏覽時長和深度,提高用戶粘性。分析用戶對產(chǎn)品的真實使用感受與評價,提高用戶忠誠度。
5.通過RFM對用戶進行分層,將用戶從一個整體拆分成特征明顯的群體,有針對性的采取不同的營銷方法進行精準(zhǔn)化營銷,用有限的公司資源優(yōu)先服務(wù)于公司最重要的客戶。
相關(guān)文章
- 歐洲12個主要電商市場分布「歐洲跳蚤市場」
- 一號店京東要做不一樣的會員嘛「京東會員權(quán)益」
- 京東極速版啥時候出來的「微視什么時候上線的」
- 共享農(nóng)場的運營方案「共享田園經(jīng)營模式」
- 義烏市陸港電商小鎮(zhèn)「義烏電商產(chǎn)業(yè)園」
- 廈門一畝鮮生倒閉「生鮮巨頭」
- 我國快遞業(yè)務(wù)量完成8.2億件「全國業(yè)務(wù)」
- 電商時代過去后,下一時代「浪潮席卷而來」
- 淘寶粉絲上千萬的服裝店「賣衣服的網(wǎng)紅有哪些」
- 共享農(nóng)場小程序系統(tǒng)有什么功能可以解決哪些問題「共享果園」
- 超市效益不好如何轉(zhuǎn)型「酒店營業(yè)額下滑」
- 購買農(nóng)產(chǎn)品的app「農(nóng)產(chǎn)品交易app排行」
- 電商沖擊下的傳統(tǒng)商超現(xiàn)狀「電商對超市的沖擊及影響」
- 抖音國際版無網(wǎng)絡(luò)連接怎么解決「抖音國際版無法連接網(wǎng)絡(luò)」
- 雙十一義烏快遞量「義烏快遞量全國第二」
- 巨量百應(yīng)Buyin平臺登陸「巨量引擎app無法登錄」
- 南方電網(wǎng)陽光電子商務(wù)平臺「南方電網(wǎng)公司陽光電子商務(wù)」
- 阿里巴巴怎么操作流程「阿里巴巴賣家流程圖」