Python使用RMF聚類分析客戶價值

投資機構或電商企業等積累的客戶交易數據繁雜。須要根據用戶的以往消費記錄分析出不一樣用戶羣體的特徵與價值,再針對不一樣羣體提供不一樣的營銷策略。python

用戶分析指標數據庫

根據美國數據庫營銷研究所Arthur Hughes的研究,客戶數據庫中有三個神奇的要素,這三個要素構成了數據分析最好的指標app

    R-最近一次消費(Recency)dom

    F-消費頻率(Frequency)函數

    M-消費金額(Monetary)spa


經過該圖將用戶進行分類:blog

    R、F、M都很高,重要價值客戶(VIP客戶)資源

    F、M很高,R不高,重要保持客戶數據分析

    R、F、M都很低,流失客戶it

    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沒有直接獲取月數差的函數
    一、獲取用戶在投天數
    二、月=在投天數/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很高,也屬於重要價值客戶

'''

經過模型對新用戶標註

一、獲取新用戶數據

二、經過和原數據處理獲取RFM

三、經過訓練模型得出用戶類型

def user_classes(cdata, user_info):
    '''
    # 模擬一條用戶數據
    一、獲取當前時間表示爲截止時間
    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]

 

相關文章
相關標籤/搜索