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