机器学习入门 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())

posted @ 2022-04-11 21:27  咸鱼QwQ  阅读(200)  评论(0)    收藏  举报