1. 程式人生 > 其它 >機器學習入門 05 RFM模型聚類分析客戶價值

機器學習入門 05 RFM模型聚類分析客戶價值

資料在這裡RFM聚類分析_demo.xlsx
程式碼如下

'''
    RFM模型聚類分析客戶價值

    業務週期:1個月 s
    R = dt - 最近一次投資時間【時差】
    F = 投資總次數 / 使用者投資時長(月)   【每個月頻率】
    M = 投資總金額 / 使用者投資時長(月)
'''
from math import ceil

import pandas as pd

if __name__ == '__main__':
    df = pd.read_excel(r"D:\ \python-sk\0411study\RFM聚類分析_demo.xlsx",index_col="使用者編碼")

    pd.set_option("display.max_columns",None)

    # print(df)

    # 1.計算 R 【時差】
    from datetime import datetime
    dt = datetime(2021,7,20)
    df['R'] = df['最近一次投資時間'].map(lambda x:(dt-x).days)
    print(df.head())

    # 2.計算 F【月均投資次數】ceil上取整
    df['evert_mounth'] = df['R'].map(lambda x:ceil(x/30))
    print(df.head())

    # dataframe.apply(function,axis)對一行或一列做出一些操作(axis=1遍歷行,axis=0遍歷列)
    df['F'] = df.apply(lambda x:x['總計投標總次數']/x['evert_mounth'],axis=1)
    print(df.head())

    # 3.計算 M 【月均投資金額】
    df['M'] = df.apply(lambda x:x['總計投資總金額']/x['evert_mounth'],axis=1)
    print(df.head())

    # 拿到想要的欄位
    df_filiter = df.filter(items=['使用者編碼','R','F','M'])
    print(df_filiter.head())

    #4.k-means 聚類分析 =》 類別
        #資料標準化 : (數值 - 數值的平均值) / 資料的標準差
    data = (df_filiter - df_filiter.mean()) / df_filiter.std()
    print(data.head())

    # 呼叫api
    from sklearn.cluster import KMeans
    # n_clusters 是 KMeans 中的 k,表示著我們告訴模型我們要分幾類

    # n_jobs設定工作的core數量 等於-1的時候,表示cpu裡的所有core進行工作
    # 用幾個核並行的意思,設定成 2 就是兩個核並行訓練,你可以看一下你的 CPU 佔用率

    # max_iter 最大迭代次數,預設值=300 如果資料集不是凸集,可能很難收斂
    # 此時可以通過指定最大的迭代次數讓演算法可以及時退出迴圈

    # random_state:整型或 numpy.RandomState 型別,可選
    kmodel = KMeans(n_clusters=4, n_jobs=4, max_iter=100, random_state=0)
    # fit 計算KMeans聚類
    kmodel.fit(data)

    # 獲取分類結果
    print(kmodel.labels_)

    data_res = pd.concat([df_filiter,pd.Series(kmodel.labels_,index=df_filiter.index)],axis=1)
    print(data_res.head())

    #修改 拼接後的列名
    data_res.columns = list(df_filiter.columns)+["類別"]
    print(data_res.head())


    #按照類別進行結果統計
    agg_res = data_res.groupby(by="類別").agg("mean")
    print(agg_res.head())