最詳細的 Python 結合 RFM 模型實現用戶分層實操案例!

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作者:Cherich_sun","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"鏈接:","attrs":{}},{"type":"link","attrs":{"href":"https://www.jianshu.com/p/f020dfdce58d","title":"","type":null},"content":[{"type":"text","text":"https://www.jianshu.com/p/f020dfdce58d","attrs":{}}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"本文爲讀者投稿","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"公衆號「","attrs":{}},{"type":"codeinline","content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"傑哥的IT之旅","attrs":{}}],"attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"」,後臺回覆:「","attrs":{}},{"type":"codeinline","content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"RFM數據","attrs":{}}],"attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"」即可獲取本文完整數據。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"原文鏈接:","attrs":{}},{"type":"link","attrs":{"href":"https://mp.weixin.qq.com/s/YOIhJERCfs19xIFRA44cpQ","title":"","type":null},"content":[{"type":"text","text":"最詳細的 Python 結合 RFM 模型實現用戶分層實操案例!","attrs":{}}]}]}],"attrs":{}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"寫在最前:做數據分析的小夥伴可能多多少少都知道一些分析方法,但是談到分析思維卻沒有底氣或者遇到業務問題,不知道如何下手。如果你有上述困惑,那麼本篇文章可以作爲參考。下圖是整理的分析方法論及方法。如果能夠靈活運用,將能夠解決工作中 80% 以上問題。注意的是,方法論是思維層面,方法是執行層面。那麼,重點是我們如何將其應用到實際業務中。本文將以 RFM 模型 爲例,運用到實際案例中。(本文以 Python 實現,Excel 也可以。)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/12/12344c02e396dbe4a255334b343a2d0f.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"項目背景:某生鮮外賣APP於2018年1月1日成立,主營新鮮蔬菜瓜果,海鮮肉禽。APP上線後,市場推廣期爲一年。通過分析發現原來幾個重要的客戶被競爭對手挖走了,而這幾個用戶對平臺貢獻了80%的銷售額。之前對所有用戶採用一樣的運營策略,爲了解決這個問題,需要對用戶進行分類,瞭解當前用戶分層情況,進行精細化運營。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"一、整體分析流程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1、分析目的:用戶分類","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2、數據獲取:Excel 數據","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3、清洗加工:Excel、Python","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4、建立模型:RFM","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"5、數據可視化","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"6、結論與建議","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"二、RFM 模型的理解","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/a3/a34bcbf730ac1b158995c3ddfdc9ea27.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/8a/8a4711bac7b3fafd03f3f4fdf0ec26e0.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最終將 RFM 模型處理後的結果,作爲用戶標籤,幫助運營更精準地制定活動規則以提升用戶使用黏性,強化用戶感知。最終實現的效果圖如下:","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/f5/f507cd6b9d9f28fb4c436b1266cb78f6.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"三、利用 Python 實現 RFM 用戶分層","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1、獲取數據","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"import pandas as pd\ndata = pd.read_excel('C:/Users/cherich/Desktop/用戶信息.xlsx')\ndata.head()","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/97/97f8b1560d0e643b6ed1376f8b760879.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"data.info()","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/69/698a4f96b4572c7c354a5f6967641134.png","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"說明:當前數據集是5000條用戶數據,存在缺失值對本次分析不會造成影響。數據清洗,通常包括處理缺失值、重複值、轉換數據類型三種。所以僅考慮數據類型即可。這裏有個前提條件,R、F、M 應該有一個參照時間,如果活動持續到現在,可以截止到現在。但是我們的數據是歷史數據,所以需要查找活動結束時間。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"data.sort_values(by='最後一次成交', ascending=False)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/a0/a041eb0b3da5dc086178120ab4a5333b.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"2、數據處理","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"# 活動結束時間 2019-06-30\ndata['最後一次成交']=data['最後一次成交'].astype('str')\nstop_date = pd.to_datetime('2019-06-30')\ndatas = data.drop(columns=['註冊時間','會員開通時間','會員類型','城市','區域','最後一次登陸'])\ndatas['最後一次成交時間'] = datas['最後一次成交'].apply(lambda x:x.split()[0])\n\ndatas['最後一次成交時間'] = pd.to_datetime(datas['最後一次成交時間'])\n\ndatas['R1'] = datas['最後一次成交時間'].apply(lambda x:stop_date-x)\n\ndatas['F1'] = datas['非會員累計購買次數']+datas['會員累計購買次數']\n\ndatas['M1'] = datas['非會員累計消費'] + datas['會員累計消費']\ndatas['R1']= datas['R1'].astype(str)\ndatas['R1']= datas['R1'].apply(lambda x:x.split()[0])\ndatas","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/df/dfef85975b14c1903e282bf3db694e97.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"說明:以上操作目的是將R指標由時間類型轉換成可計算格式,爲接下來建立模型,計算時間間隔做準備。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"3、建立模型","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"建立模型,需要分別對F、R、M 分別計算各自的平均值。但是要注意三個指標數據存在極大值、極小值的情況,這對結果會產生一定的誤差,所以解決方案是將其標準化,設置分段區間,5分制,5分爲最高。(數值區間可根據具體業務靈活調整或者用四分位數)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/55/556dba1c44a9549da031bbbee06bc504.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"def R_score(n):\n n = int(n)\n if 0 R_mean else 0)\n\ndatas['F'] = datas['F1_score'].apply(lambda x: 1 if x> F_mean else 0)\n\ndatas['M'] = datas['M1_score'].apply(lambda x: 1 if x> M_mean else 0)\ndatas","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/14/14da39e2b82a262641479d33de04b2a7.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"datas['RFM'] = datas['R'].apply(str)+datas['F'].apply(str)+datas['M'].apply(str)\ndatas\n\ndef user_tag(rfm):\n if rfm=='000':\n res = '流失用戶'\n elif rfm=='010':\n res = '一般維持用戶'\n elif rfm=='100':\n res = '新客戶'\n elif rfm=='110':\n res = '潛力客戶'\n elif rfm=='001':\n res = '重要挽留客戶'\n elif rfm=='101':\n res = '重要深耕客戶'\n elif rfm=='011':\n res = '重要喚回客戶'\n else:\n res = '重要價值客戶'\n return res\ndatas['user_tag']=datas['RFM'].apply(user_tag)\ndatas","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/c0/c0a130beb61eda5283edcdbe981df1b1.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"4、數據可視化","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"import matplotlib.pyplot as plt\nimport seaborn as sns\nimport matplotlib as mpl\nsns.set(font='SimHei',style='darkgrid')\n\nuser_tag = datas.groupby(datas['user_tag']).size()\n\nplt.figure(figsize = (10,4),dpi=80)\n\nuser_tag.sort_values(ascending=True,inplace=True)\n\nplt.title(label='生鮮平臺用戶分層對比',\n fontsize=22, color='white',\n backgroundcolor='#334f65', pad=20)\n\ns = plt.barh(user_tag.index,user_tag.values , height=0.8, color=plt.cm.coolwarm_r(np.linspace(0,1,len(user_tag))))\nfor rect in s:\n width = rect.get_width()\n plt.text(width+40,rect.get_y() + rect.get_height()/2, str(width),ha= 'center')\n\nplt.grid(axis='y')\nplt.show()","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/3c/3c5338e3a216621bf2a3f718e1eff972.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"codeblock","attrs":{"lang":"python"},"content":[{"type":"text","text":"groups_b = datas.groupby(by='user_tag').size()\n\nplt.figure(figsize = (10,6),dpi=80)\nplt.title(label='生鮮平臺用戶分層佔比',\n fontsize=22, color='white',\n backgroundcolor='#334f65', pad=20)\n\nexplodes = [0.6, 0, 0, 0, 0,0,0.4,0.8]\n\npatches, l_text, p_text = plt.pie(groups_b.values,labels = groups_b.index, shadow=True,colors=plt.cm.coolwarm_r(np.linspace(0,1,len(groups_b))), autopct='%.2f%%', explode=explodes,startangle=370)\nplt.legend(ins,bbox_to_anchor=(2, 1.0))\nplt.show()","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/91/91942d7b715369bc6075355126069596.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"5、結論與建議","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"以上基本完成了RFM模型實現用戶分層,可以看出新客戶佔比30%左右,重要價值客戶佔比30%左右。兩者是平臺的最主要用戶類型。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"接下來就需要結合具體業務來制定運營策略。最後分享的是,現在我們看到最多的招聘需求是具備分析思維。那什麼是分析思維。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我的理解是,首先要理解業務,其次要掌握分析方法,要明確分析方法存在的意義是幫助我們將零散業務問題歸類,歸類的過程形成分析思路,有了分析思路,那你就具備了分析思維。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"原創不易,碼字不易。 覺得這篇文章對你有點用的話,麻煩你爲本文點個贊,留言或轉發一下,因爲這將是我輸出更多優質文章的動力,感謝!","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/01/019b65e5ec6661e8bbcaec704494797d.jpeg","alt":null,"title":"","style":[{"key":"width","value":"100%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章