投資機構或電商企業等積累的客戶交易數據繁雜。需要根據用戶的以往消費記錄分析出不同用戶群體的特征與價值,再針對不同群體提供不同的營銷策略。 用戶分析指標 根據美國資料庫營銷研究所Arthur Hughes的研究,客戶資料庫中有三個神奇的要素,這三個要素構成了數據分析最好的指標 R-最近一次消費(Rec ...
投資機構或電商企業等積累的客戶交易數據繁雜。需要根據用戶的以往消費記錄分析出不同用戶群體的特征與價值,再針對不同群體提供不同的營銷策略。
用戶分析指標
根據美國資料庫營銷研究所Arthur Hughes的研究,客戶資料庫中有三個神奇的要素,這三個要素構成了數據分析最好的指標
R-最近一次消費(Recency)
F-消費頻率(Frequency)
M-消費金額(Monetary)
通過該圖將用戶進行分類:
R、F、M都很高,重要價值客戶(VIP客戶)
F、M很高,R不高,重要保持客戶
R、F、M都很低,流失客戶
M很高,R、F不高,重要輓留客戶
根據這8個類別的R、F、M指標,對用戶進行標註,哪些是重要價值客戶,哪些是重要保持客戶,哪些是重要發展客戶,哪些是流失客戶等
流程介紹
以R、F、M這三個核心指標為維度進行聚類分析
利用K-means聚類分析將用戶分類
根據R、F、M指標,對用戶進行標註
準備工作:
數據:
某電商企業客戶近期購買的數據。包含客戶註冊日期,最後購買日期以及購買消費總金額
參數:
R-求出最近一次投資時間距提數日天數
F-月均投資次數
M-月均投資金額
目標:分析客戶交易數據,用戶群體的特征與價值,進行精準營銷,降低營銷成本,提高銷售業績。
1 分析數據獲取RFM
R-求出最近一次投資時間距提數日天數
確定一個提現日,減去用戶的最新投資日期
F-月均投資次數
總投資次數/總月數
M-月均投資金額
投資總金額/總月數
處理數據獲取R-F-M
def dataChange(data): deadline_time = datetime(2016,7,20) print(deadline_time) # 時間相減 得到天數查 timedelta64類型 diff_R = deadline_time - data["最近一次投資時間"] # 渠道具體天數 # days = diff_R[0].days R = [] for i in diff_R: days = i.days R.append(days) print(R) ''' 用戶在投時長(月 Python沒有直接獲取月數差的函數 1、獲取用戶在投天數 2、月=在投天數/30,向上取整 ''' diff = deadline_time - data["首次投資時間"] print(diff) # 利用向上取整函數 months = [] for i in diff: month = ceil(i.days/30) months.append(month) print(months) # 月均投資次數 month_ave = data["總計投標總次數"]/months F = month_ave.values print(F) # 月均投資金額 M = (data["總計投資總金額"]/months).values print(M) return R, M, F
2 訓練KMeans模型
先對數據進行轉換,然後通過K—Means模型訓練,生產模型
def analy_data(data, R, M, F): cdata = DataFrame([R, list(F), list(M)]).T # 指定cdata的index和colums cdata.index = data.index cdata.columns = ["R-最近一次投資時間距提數日的天數", "F-月均投資次數", "月均投資金額"] print("cdata_info:\n", cdata) print("cdata:\n", cdata.describe()) # K-Means聚類分析 # 01 數據標準化 均值:cdata.mean() 標準差:cdata.std() # 對應位置分別先相減 再相除 zcdata = (cdata-cdata.mean())/cdata.std() print("zcdata:\n", zcdata) # n_clusters:分類種數 n_jobs:計算的分配資源 max_iter:最大迭代次數 random_state:隨機數種子,種子相同,參數固定 kModel = KMeans(n_clusters=4, n_jobs=4, max_iter=100, random_state=0) kModel.fit(zcdata) print(kModel.labels_)
3 通過模型對用戶標註
# 統計每個類別的頻率 value_counts = Series(kModel.labels_).value_counts() print(value_counts) # 將類別標簽賦回原來的數據 cdata_rst = pd.concat([cdata, Series(kModel.labels_, index=cdata.index)], axis=1) print(cdata_rst) # 命名最後一列為類別 cdata_rst.columns = list(cdata.columns) + ["類別"] print(cdata_rst) # 按照類別分組統計R, F, M的指標均值 user_ret = cdata_rst.groupby(cdata_rst["類別"]).mean() print(user_ret)
'''
R-最近一次投資時間距提數日的天數 F-月均投資次數 月均投資金額
類別
0 27.859375 2.820312 21906.754297
1 20.684211 4.552632 115842.105263
2 10.568182 5.579545 26984.313636
3 12.111111 17.277778 107986.000000
結論:
類別3:R、F、M都比較高,屬於重要價值客戶 或 超級用戶
類別0:R、F、M都比較低,屬於低價值客戶
類別1:R一般、F一般、M很高,也屬於重要價值客戶
'''
通過模型對新用戶標註
1、獲取新用戶數據
2、通過和原數據處理獲取RFM
3、通過訓練模型得出用戶類型
def user_classes(cdata, user_info): ''' # 模擬一條用戶數據 1、獲取當前時間表示為截止時間 2.計算出: R F M ''' R, M, F = user_info_change(user_info) user_data_info = DataFrame([[R], [F], [M]]).T print(user_data_info) # user_data_info = DataFrame([[12.5], [18.0], [20000.0]]).T user_data_info.index = ["lily"] user_data_info.columns = cdata.columns print("cdata_info:\n", user_data_info) new_zcdata = (user_data_info-cdata.mean())/cdata.std() print("new_zcdata", new_zcdata) kModel = load_model("user_classes.pkl") ret = kModel.predict(new_zcdata) print("new_zcdata_ret:", ret) # new_zcdata_ret: [3]