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

    文章

    132

    浏览量

    33156
  • 模式
    +关注

    关注

    0

    文章

    63

    浏览量

    13287
  • 信息资源
    +关注

    关注

    0

    文章

    3

    浏览量

    5907
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    下拉列表或者枚举如何实现用户自己增加选项

    下拉列表或者枚举如何实现用户自己增加选项,比方说我加工的时候有很多种产品,每种产品的参数不一样,当要增加新产品的时候,就要在下拉列表或枚举中增加新的项目。高手指点
    发表于 08-17 08:36

    利用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

    如何利用实时时钟IC RV5C338A实现用软件校正时间?

    如何利用实时时钟IC RV5C338A实现用软件校正时间?
    发表于 04-27 06:12

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

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

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

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

    分类算法分类及比较

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

    Kmeans聚类-K值以及簇中心点的选取

    KMeans算法是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇中心点的情况下,把每个点(亦即数据记录)分到离其最近的类簇中心点所代表的类簇中,所有点分配完毕之后,根据一个类簇内的所有点重新
    发表于 12-01 13:45 1.3w次阅读
    <b class='flag-5'>Kmeans</b>聚类-K值以及簇中心点的选取

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

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

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

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