0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么利用Kmeans算法实现用户分类

汽车电子技术 ? 来源:Python数据分析之旅 ? 作者:cauwfq ? 2023-02-24 16:19 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

poYBAGP4cmWAQ1FRAAC8QTMl7iY806.png

一.项目背景

为了建立客户信息资源管理及运营模式,某公司希望通过客户的基本消费信息进行分析,
衡量客户价值和客户创利能力,优化客户资源,提高营销效率,避免不必要的资源

二.实现步骤

1.导包读入数据,筛选所需数据

# 导入所需库
import numpy as np
import pandas as pd
import datetime
import matplotlib.pyplot as plt
import time
import matplotlib.gridspec as gridspec
#import pyecharts

# 解决 matplotlib 显示中文、负号问题
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False 

#获取数据
def get_data(file_path):
    #读取数据
    df1= pd.read_excel(file_path)
    # 提取 RFM 模型所需特征列:'订单编号','买家会员名','买家实际支付货款','订单付款时间','宝贝总数量'
    df2 = df1[['订单编号','买家会员名','买家实际支付金额','订单付款时间','宝贝总数量']]
    #返回数据
    return df2
2.数据重复值缺失值处理

#处理数据
def process_data(df):
    #判断有没有重复值
    if df.duplicated().sum()==0:
        print('无重复数据')
    else:
        #删除重复值
        df=df.drop_duplicates(inplace=True)
    #判断有没有缺失值
    if df.isnull().any().sum()==0:
        print('无缺失值')
    else:
        #删除缺失值
        df=df.dropna(inplace=True)
    #返回数据
    return df
3.获取RFMP各项值

#获取R值
def get_R(df):
    # 计算时间差
    time_minus =  datetime.datetime.now()- df['订单付款时间'] 
    # 将时间差转换成数字格式
    df['prior_R'] = time_minus.astype(str).str.findall('d+.*d*').map(lambda x: int(x[0]) + (int(x[1]) / 24) + 
                                                   (int(x[2]) / (24 * 60)) + (float(x[3]) / (24 * 3600)))
    # 按会员进行分组,确定每个会员最近一次购买离现在的时间间隔
    R = df.groupby('买家会员名')['prior_R'].min()
    return R


#获取FMP值,P值表示买家购买数量
def get_F_M_P(df):
    # 按会员进行分组,确定每个会员的订单数量
    F = df.groupby('买家会员名')['订单编号'].count()
    # 按会员进行分组,确定每个会员的实际支付金额
    M = df.groupby('买家会员名')['买家实际支付金额'].sum() 
    # 按会员进行分组,确定每个会员的宝贝总数量
    P = df.groupby('买家会员名')['宝贝总数量'].sum() 
    return (F,M,P)


#将RFMP数据合成DataFrame
def get_data(R,F,M,P):
    #列名称
    col_list = list('RFMP') 
    #创建DataFrame
    model_data = pd.DataFrame([], index=R.index) 
    #添加数据
    for col_names, values in zip(col_list, [R, F, M, P]):
          model_data[col_names] = values
    #类型转换
    model_data = model_data.astype(float)
    #返回数据
    return model_data
4.利用Kmeans算法进行分类

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
from sklearn.preprocessing import StandardScaler, MinMaxScaler

#获取数据
df0 = model_data.iloc[:, 0:4]
#标准化数据
res_std = StandardScaler().fit_transform(df0)

#分类簇数
n_clusters = range(2, 7)
#评分标准
scores = []
#遍历每种分类
for i in range(len(n_clusters)):
    #训练模型
    clf = KMeans(n_clusters = n_clusters[i], random_state = 20).fit(res_std)
    #获取评分
    scores.append(silhouette_score(res_std, clf.labels_))
#获取最大评分索引
maxindex = scores.index(max(scores))
#初始画布
plt.figure(figsize = (8, 6), dpi = 100) 
#绘制图形
plt.plot(n_clusters, scores, linestyle = '-.', c = 'b', alpha = 0.6, marker = 'o')
#编辑最佳簇数
plt.axvline(x = n_clusters[maxindex], linestyle = '--', c = 'r', alpha = 0.5)
#设置标题
plt.title('RFMP的聚类轮廓系数图')
#设置y轴标签
plt.ylabel('silhouette_score')
#设置x轴标签
plt.xlabel('n_clusters')
#存储图形
plt.savefig('./RFMP聚类轮廓系数图.png')

pYYBAGP4crSAePATAAB6CkBuGAs467.png
#获取最佳分簇数模型
clf = KMeans(n_clusters = 2, random_state = 20).fit(res_std)
#添加label
df0['labels'] = clf.labels_
df0

poYBAGP4csqADAxuAADA4L2iLV4219.png
# 统计一下两类用户之间的差异,发现两类客户之间数量相差过大
print(f"类别0所占比例为:{df0['labels'].value_counts().values[0] / df0.shape[0]} t 类别1所占的比例为:{df0['labels'].value_counts().values[1] / df0.shape[0]}")
df0['labels'].value_counts()

poYBAGP4cuGAACohAABhAWmWrPU968.png
#用均值来评估两类样本之间的LRFMP
R_avg = df0.groupby('labels').agg({'R': np.mean}).reset_index()
F_avg = df0.groupby('labels').agg({'F': np.mean}).reset_index()
M_avg = df0.groupby('labels').agg({'M': np.mean}).reset_index()
P_avg = df0.groupby('labels').agg({'P': np.mean}).reset_index()

# 绘制相关的条形图
def plot_bar(df_list, nrow, ncol):
    #初始画布
    fig, axs = plt.subplots(nrow, ncol, figsize = (2 * (ncol + 2), 2.5), dpi = 100)
    #遍历每个坐标系
    for i in range(len(axs)):
        #获取坐标系
        ax = axs[i]
        #获取数据
        df = df_list[i]
        #画柱状图
        ax.bar(df.iloc[:, 0], df.iloc[:, 1], color = 'm', alpha = 0.4, width = 0.5)
        #获取RFMP标签对应数值
        for x, y in enumerate(df.iloc[:, 1].tolist()):
            #标注数据
            ax.text(x, y / 2, '%.0f' % y, va = 'bottom', ha = 'center', fontsize = 12)
        #设置x轴刻度
        ax.set_xticks([0, 1])
        #设置y轴刻度
        ax.set_yticks(())
        #设置小标题
        ax.set_title(f'{df.columns[1]}')
    #设置大标题
    plt.suptitle('两类客户的RFMP均值差异', y = 1.1, fontsize = 14)
    #存储图片
    plt.savefig('./两类客户LRFMP均值差异.png')
#获取数据
df_list = [ R_avg, F_avg, M_avg, P_avg]
#绘制图形
plot_bar(df_list, 1, 4)

总结:分为两类用户效果确实很明显,但是分析还是有点一刀切,我们发现图中四类效果也
不是很差,后期感兴趣读者可以进行四类用户分类,在这里主要还是给大家一个思维拓展.

pYYBAGP4cwSAMhIiAABSH_4PLiQ061.png
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 分析
    +关注

    关注

    2

    文章

    134

    浏览量

    33706
  • 模式
    +关注

    关注

    0

    文章

    65

    浏览量

    13641
  • 信息资源
    +关注

    关注

    0

    文章

    3

    浏览量

    5997
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于多通道分类合成的SAR图像分类研究

    。目前,SAR图像分类多是基于单通道图像数据。多通道SAR数据极大地丰富了地物目标信息量,利用多通道数据进行分类,是SAR图像分类的重要发展方向。本文提出基于多通道
    发表于 04-23 11:52

    选项卡跳转,实现用户登录后跳转到计时选项卡

    选项卡跳转,实现用户登录后跳转到计时选项卡
    发表于 12-13 16:48

    利用labSQL做一个用户管理 如何实现

    和pc机连接是没问题的 我现在可以实现利用labSQL的添加删除查询等简单实现现在我想实现用户管理的功能,包括查找库里是否存在该用户删除选定
    发表于 09-28 15:44

    labview巧用配置文件实现用户登录系统

    ;gt;在利用labview虚拟仪器时,需要制作一个登陆系统。这里总结了3种方法:1、利用固定常量数组制作登录系统该方法实现简单,但用户名和密码不能修改。这里不做详细介绍。2、
    发表于 11-27 15:49

    自定义Kmeans函数对多个坐标点进行自动分类实现

    ML之Kmeans利用自定义Kmeans函数实现对多个坐标点(自定义四个点)进行自动(最多迭代10次)分类
    发表于 12-25 10:51

    三种聚类算法学习

    聚类KMeans理论与算法实现
    发表于 03-12 07:02

    KNN分类算法及python代码实现

    kNN分类算法的Python实现
    发表于 06-05 12:02

    请问一下怎么实现用户自定制LED驱动器的设计?

    请问一下怎么实现用户自定制LED驱动器的设计?
    发表于 06-08 06:32

    利用KNN算法实现基于系统调用的入侵检测技术

    算法来自一种文本分类算法-KNN 算法,文中给出了用该算法实现的入侵检测系统模型.
    发表于 06-13 11:01 ?18次下载

    分类算法分类及比较

    分类算法分类及比较 流分类算法可以根据不同的原则进行分类,本文根据对多个区域查找之间的关系
    发表于 03-04 11:26 ?2167次阅读

    基于用户身份特征的多标签分类算法

    目前对于智慧校园中的家校沟通,缺乏一种衡量和参考的方法。针对智慧校园中特有的聊天特点即存在明显的身份特征,提出了一种基于用户身份特征的多标签分类算法-Adaboost. ML。首先,新增加了启发式
    发表于 12-01 16:22 ?0次下载

    如何使用直方图条件熵实现水声数据分类算法

    ,对水声数据直方图进行分段,使用条件熵判别式分别计算出每一个分段直方图的最佳特征阈值,赋予其相应的不透明度传递函数,以实现对水声数据的分类。实验结果表明,该算法能够较好地实现水声数据的
    发表于 01-20 10:18 ?22次下载
    如何使用直方图条件熵<b class='flag-5'>实现</b>水声数据<b class='flag-5'>分类</b>的<b class='flag-5'>算法</b>

    爱立信性能优化器实现用户体验最优化

    作为爱立信认知软件产品组合的一部分,“爱立信性能优化器(Ericsson Performance Optimizers)”采用了数字孪生技术,以及深度强化学习等先进AI技术,充分利用网络优化技术的自动化、可扩展性、速度、精度和一致性,同时实现用户体验最优化与运营商效益最大
    的头像 发表于 05-10 11:36 ?1452次阅读

    在洗碗机中设计和实现用户界面的新方法

    在洗碗机中设计和实现用户界面的新方法
    发表于 10-31 08:23 ?3次下载
    在洗碗机中设计和<b class='flag-5'>实现用户</b>界面的新方法

    EtherCAT运动控制器PT/PVT实现用户自定义轨迹规划

    EtherCAT运动控制器PT/PVT实现用户自定义轨迹规划。
    的头像 发表于 08-15 11:49 ?1305次阅读
    EtherCAT运动控制器PT/PVT<b class='flag-5'>实现用户</b>自定义轨迹规划