Python案例|使用Scikit-learn实现客户聚类模型

news2024/11/13 15:07:58

图片

聚类是一种经典的无监督学习方法,无监督学习的目标是通过对无标记训练样本的学习,发掘和揭示数据集本身潜在的结构与规律,即不依赖于训练数据集的类标记信息。聚类试图将数据集划分为若干个互不相交的类簇,从而每个簇对应一个潜在的类别。

聚类算法体现了“物以类聚,人以群分”的思想。“物以类聚,人以群分”出自《战国策·齐策三》,用于比喻同类的东西常聚在一起,志同道合的人相聚成群。俗话说“近朱者赤,近墨者黑”,每一个人都或多或少地受周围的人的影响,所以我们要“见贤思齐,择善而从”,向优秀的人学习,树立积极进取、乐观向上的人生态度,从而形成正确的人生价值评判标准。

01、案例导入——客户聚类

通过对客户的消费行为进行聚类分析,将客户细分,从而企业可以针对不同客户提供不同的产品内容,采取不同的促销手段等。

本案例数据集来自UCI机器学习数据集Wholesale customers,该数据集记录了某批发经销商不同商品的年度销售情况。数据集包括440行记录和8个属性列,这些属性分别为客户渠道(channel)、客户所在区域(region)以及新鲜商品(fresh)、奶制品(milk)、零食(grocery)、冷冻商品(frozen)、洗涤剂和纸品(detergents_paper)、熟食(delicatessen)6种商品的年度销售。该数据集的部分数据如图1所示,详细介绍可以查看UCI机器学习数据集http://archive.ics.uci.edu/ml/datasets/Wholesale+customers。

图片

■图1 Wholesale customers数据集的部分数据展示

 本案例通过6种商品的销售数据对客户进行聚类,分析客户的消费行为,从而帮助经销商针对不同客户制订营销计划。

02、案例实现

使用某批发经销商的6种商品的年度销售数据集Wholesale customers,采用K-means聚类算法对其客户进行聚类,分析客户的消费行为。

 (1) 导入库。代码如下。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing 
import Normalizerfrom sklearn.cluster
import KMeans
from sklearn.metrics import silhouette score
from collections import Counter

(2) 导入数据,并对数据做预处理。为了方便展示字段名称,从数据表中读取数据时,将列名指定为中文。因为本案例主要通过6种商品的年度销售量分析客户行为,所以只使用数据表中的6列商品数据,即列号从2至7。代码如下。

dfO=pd.read csv("Wholesale customers data.csv",header=0,names=渠道区域’,'新鲜商品’,'奶制品’,'零食’,'冷冻商品 ,"洗涤剂和纸品’,"熟食门)df=df0.iloc[:,2:8]
print(df.info())#输出数据表的基本信息(维度、列名称、数据格式、所占空间等)

 输出结果为:

<class 'pandas .core .frame .DataFrame'>
RangeIndex: 440 entries,0 to 439
Data columns (total 6 columns):
新鲜商品       440 non-null int64
奶制品         440 non-null int64
零食           440 non-null int64
冷冻商品       440 non-null int64
洗涤剂和纸品   440 non-null int64
熟食           440 non-null int64



从数据表的基本信息可以看出,数据表没有缺失值。下面对数据表的异常值进行处理,然后对数据进行标准化。

① 异常值处理。首先绘制散点图,查看数据是否存在异常值。代码如下。函数plot_scatter()的功能是绘制数据表中6种商品的散点图,初始数据集各列数据的散点图如图2所示。

def plot scatter(df) :
""""""
绘制数据集中 6种商品销量的散点图
:param df:数据集,类型为 DataFrame
""""""
plt.rcparamsl'font.sams-serif =SimHeir7# 调查字体设置
plt.figure(figsize=(14,10))
for i in range(0,6):
plt.subplot(2,3,i+1)
field=df.columns i]
plt.scatter(df.index,df[field],s=5,c='b')
plt.title(field)
plt.xlabel('索引 )
plt.tight layout()
plt.show()
plot scatter(df)    # 调用函数

图片

■图2 初始数据集各列数据的散点图

从图8-20可以看出,6种商品都存在一些异常值。函数drop_outlier(df,n)的功能是删除数据集中6种商品的异常值,其中参数df表示原始数据集,参数n表示标准差的倍数,即使用均值和标准差进行异常值判定:异常值是指在[mean-n*std,mean+n*std]范围之外的数据。原数据集样本容量为440,调用drop_outlier()函数删除异常值后得到的新数据集容量为396,即删除了44个异常值。绘制新数据集中各列数据的散点图,如图2所示。代码如下。

def drop outlier(df,n):
""""""
删除数据集中 6 种商品的异常值
:param df:数据集,类型为 DataFrame
:param n:标准差的倍数,一般取值为 2或 3
:return:删除异常值后的数据集,类型为 DataFrame
""""""
for i in range(0,6):
field=df.columns i
mu=round(dfl field .mean())
sigma=round(df_field .std())
df=dfl(df field]>=mu-n*sigma) & (df field <=mu+n*siqma)
return df  
df new=drop outlier(df,3) # 调用函数删除 3 倍标准差之外的异常值
plot scatter(df new)       # 绘制新数据集中 6种商品销量的散点图
print("原有样本容量:{0],删除异常值后样本容量:1)".format (df.shape[0],df new.shape[07))

 输出结果为:

原有样本容量:440,删除异常值后样本容量:396

图片

■ 图2 删除异常值后各列数据的散点图

② 数据标准化。以下代码输出数据集中各列的统计信息,可以看出各列数据的数值差别比较大,所以在聚类前需要标准化。

print (df new.describe()) #输出数据的统计信息

 输出结果为:

         新鲜商品      奶制品        ...    洗涤剂和纸品      熟食

count   396.000000   396.000000     ...     396.000000    396.000000
mean   10867.648990  4529.628788    ...     1993.757576   1176.411616
std    9898.704567   4127.47209     ...     2520.657749   1082.264178
min    3.000000      55.000000      ...     3.000000      3.000000   





使用sklearn.preprocessing.Normalizer()方法对数据进行标准化,然后输出标准化后的数据。这里使用Normalizer()方法的默认参数,即对样本的所有值计算其2-范数,然后用该样本的每个元素除以该范数。代码如下。可以看出,标准化后,各列数据在同一个量级。

X=df new.values    # 读取 df 的数据
print(norm X)  
norm X=Normalizer() .fit transform(X)

输出结果为:

 (3) 使用K-means算法对标准化的数据进行聚类。如何选择合适的n_clusters值?本案例中使用轮廓系数作为肘部法则的目标函数,选择轮廓系数最大的n_clusters值。代码如下。大家可自行练习采用总簇内平方和作为目标函数的肘部法则算法。

#选择合适的 n clusters 值
range n clusters=[2,3,4]
for n clusters in range n clusters:
cluster=KMeans(n clusters=n clusters,random state=1)
cluster labels=cluster.fit predict(norm X)
# 计算所有样本的平均轮廓系数
silhouette=silhouette score(norm X,cluster labels)
print("For n clusters=,n clusters,
silhouette score is :", round(silhouette,2))

输出结果为:

For n clusters=2,silhouette score is : 0.5
For n clusters=3,silhouette score is : 0.41
For n clusters=4,silhouette score is : 0.36

n _ clusters=2 时,轮廓系数最大,所以选用 n _ clusters=2 对数据集进行聚类分析。代码如下。

cluster=KMeans(n clusters=2,random state=1)
cluster=cluster.fit(norm X)
y predict=cluster.labels
df new['类别']=y_predict
# 如果要保存聚类的类别,可以将 df new 保存为 csv 文件
df new.to csv('Wholesale customers data new.csv',encodig='gbk')

(4) 分析聚类结果。可以查看聚类后每一类的样本数,以及每一类的类中心等信息。代码如下。

print(Counter(y predict))  #输出聚类后每一类的样本数
centroid=cluster.cluster_centers
df_center=pd.DataFrame(centroid[:,0:6],columns=['新鲜商品奶制品’,'零食'冷冻商品,,"洗涤剂和纸品,,,熟食 )
print(df center)   #输出聚类中心

输出结果为:

图片

通过聚类,将客户分为两类: 客户群1(类标签为0) 和客户群2(类标签为1),客户群1的样本数为235,客户群2的样本为161。centroid变量保存了这两类客户群的类中心,即这两类客户群的平均购买情况,将类中心绘制为如图8-22所示的柱状图,代码如下所示。注意,在图3中,y轴是标准化后的销售额。可以看出客户群1主要购买新鲜品,客户群2主要购买零食和奶制品。

plt.rcParams['font.sans-serif门=['SimHei] #用来正常显示中文标签
plt.rcParams ['axes.unicode minus'] =False
colors_list=['snow','gainsboro','silver','darkgray','gray','black']
df_center.plot(kind='bar', color = colors list,ec='k')
plt.xticks(rotation=360)
plt.show()

图片

■ 图3 聚类中心的6种商品分布情况

下面分析客户群 1 和客户群 2 的购买总额情况,代码如下。可以看出客户群 1 的购买总额比客户群 2 的购买总额大,客户群 1 是重要的价值客户。公司可进行一些打折促销活动,刺激客户群 2 的购买行为。

df group = df new.groupby(by=['类别门)[新鲜商品 奶制品',零食,冷冻商品',洗涤剂和纸品 ,熟食].sum()
print(r--------两类客户的 6 种商品销售总额----)
print(df group)

 输出结果为:

图片

下面分析两类客户的购买渠道(channel)和所在区域(region),代码如下。因为渠道和区域这两列数据在初始数据表df0里,而在df_new数据表中没有这两列数据,所以,首先需要将聚类后的类别标签写入初始数据表df0里,然后再分析两类客户在渠道和区域的分布情况。

dfO new = df0.loc df new.index
dfO new['类别]= y_predict
print ("----两类客户在数据列,渠道,的统计----")
print('客户群 1:,Counter(dfO new[dfO new.类别==0][·渠道门))
print('客户群 2:,Counter(dfO new[dfO new.类别==1][·渠道]))
print("----两类客户在数据列,区域,的统计----")
print('客户群 1:,Counter(dfO new[dfO new.类别==0]['区域门))print 客户群 2:,Counter(dfO new[dfO new.类别==1][区域))

 输出结果为:

图片

可以看出,客户群1来源倾向于渠道1(channel=1),可加大在该渠道上的宣传力度。客户群1和客户群2都倾向于区域3(region=3),营销政策可以倾向于该区域。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/802411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

适合运动时戴的蓝牙耳机有哪些?精选五款表现还不错的耳机

音乐能有效地激发人体潜能&#xff0c;充分释放能量&#xff0c;达到更好的运动效果&#xff0c;因此对于运动爱好者来说&#xff0c;运动耳机至关重要。面对产品种类众多的运动耳机&#xff0c;很多人都会感到迷茫&#xff0c;经常有人问“有什么适合运动的时候佩戴的耳机”&a…

健身用什么耳机好?分享几款适合健身时使用的耳机!

随着全民健身的热潮到来&#xff0c;运动耳机的种类也更加丰富。在众多入耳式耳机、半入耳式耳机、头戴式耳机等传统市场之中&#xff0c;诞生了一种新晋关注度极高的耳机骨传导耳机。这种不依赖空气传递声波&#xff0c;并且无需堵住耳朵的新奇聆听方式&#xff0c;不仅健康而…

ChatGPT | 分割Word文字及表格,优化文本分析

知识库读取Word内容时&#xff0c;由于embedding切片操作&#xff0c;可能会出现表格被分割成多个切片的情况。这种切片方式可能导致“列名栏”和“内容栏”之间的Y轴关系链断裂&#xff0c;从而无法准确地确定每一列的数据对应关系&#xff0c;从而使得无法准确知道每一列的数…

PySpark基本操作:如何查看源码

方法一&#xff1a; from pyspark.mllib.tree import GradientBoostedTrees import inspectsource_code inspect.getsource(GradientBoostedTrees) print(source_code) 方法二&#xff1a; GradientBoostedTrees — PySpark 3.4.1 documentation (apache.org) 在官网中&…

【网络原理】 (1) (应用层 传输层 UDP协议 TCP协议 TCP协议段格式 TCP内部工作机制 确认应答 超时重传 连接管理)

文章目录 应用层传输层UDP协议TCP协议TCP协议段格式TCP内部工作机制确认应答超时重传 网络原理部分我们主要学习TCP/IP协议栈这里的关键协议(TCP 和 IP),按照四层分别介绍.(物理层,我们不涉及). 应用层 我们需要学会自定义一个应用层协议. 自定义协议的原因? 当前的软件(应用…

途乐证券:纺织服装板块走强,金发拉比、红蜻蜓涨停,嘉曼服饰等大涨

纺织服装板块28日盘中强势上扬&#xff0c;到发稿&#xff0c;嘉曼服饰涨约17%&#xff0c;金发拉比、红蜻蜓涨停&#xff0c;日播时尚、如意集团、云中马涨约7%&#xff0c;比音勒芬、聚杰微纤等涨超5%。 数据显现&#xff0c;4月美国服装及服装面料批发商库存额与服装及服装配…

K8s-资源管理(二)

文章目录 2. 资源管理2.1 资源管理介绍2.2 YAML语言介绍2.3 资源管理方式2.3.1 命令式对象管理2.3.2 命令式对象配置2.3.3 声明式对象配置 2.4. 模拟使用普通用户来操作2.5 kubectl 一些基本命令2.6 使用个人的 docker 仓库的镜像 2. 资源管理 2.1 资源管理介绍 在kubernetes…

分享VMware Workstation Pro ESXI7创建虚拟机和配置硬盘空间(分享自己的学习历程意在帮助有需要的小伙伴)

背景&#xff1a;因公司项目需求改用VMware Workstation Pro&#xff0c;已经使用1个月目前除了中途出现过一次问题被解决后一直稳定运行至今&#xff0c; 1:这里贴出拿出现的问题提示及解决方法的链接&#xff1a;解决vmWare ESXI 7.3报错; 2:如果你是第一次接触VMware Work…

剑指offer63.股票的最大利润

这道题比我想象的简单&#xff0c;通过示例1可以发现&#xff0c;这个股票只能买卖一次&#xff0c;我以前写过一道题股票可以买卖多次比如示例1就可以1买5卖再3买6卖这样利润就是7&#xff0c;而这道题其实就是找一个小的数和它后面的大的数的差值&#xff0c;找出这个最大差值…

面试手写实现Promise.all

目录 前言常见面试手写系列Promise.resolve 简要回顾源码实现Promise.reject 简要回顾源码实现Promise.all 简要回顾源码实现Promise.allSettled 简要回顾源码实现Promise.race 简单回顾源码实现结尾 前言 (?﹏?)曾经真实发生在一个朋友身上的真实事件&#xff0c;面试官让…

网络应用技术师技能考试试题

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

2023秋招面试题持续更新中。。。

目录 1.八股文渐进式MVVM三次握手&#xff0c;四次挥手viteajax组件化和模块化虚拟dom原理流程浏览器内核浏览器渲染过程回流和重绘nextTick 2.项目相关1.声明式导航和编程式导航重写push和replace方法&#xff1a;性能优化图片懒加载路由懒加载 http请求方式 1.八股文 渐进式…

怎样快速实现一个发送邮件的接口?flask_mail库30行代码,快速实现

需求 实现了一个根据部门批量获取自动化行覆盖率&#xff0c;并与指标做diff的脚本&#xff0c;怎么才能第一时间通知给对应的人呢&#xff1f; 最先想到的一定是邮件发送(后边我在自己项目中接入的是公司内部的一个类似钉钉的服务号) 因为原本项目是用的flask&#xff0c;所…

DRUPAL 8.x远程代码执行漏洞(CVE-2018-7600)

事件背景 框架漏洞收集 CVE-2018-7600有两个POC分别是7和8的&#xff0c;本文仅研究8版本的POC&#xff0c;与其它的文章不同的事&#xff0c;本文我将数据流向调试并记录下来了 漏洞说明 1. 漏洞原理&#xff1a;Drupal对表单请求内容未做严格过滤&#xff0c;因此&#x…

900就能上8000MHz的DDR5内存,光威神策做到了

这是一款定位于高端国产DDR5电竞游戏内存条的产品&#xff0c;而且是来自国产品牌&#xff0c;频率可以达到8000MHz&#xff0c;设计也是相当惊艳&#xff0c;重点在于它的价格是真的香&#xff0c;有需要的朋友可以冲了。 光威近期发布了一款神策系列DDR5内存条&#xff0c;相…

【腾讯云 Cloud Studio 实战训练营】基于Cloud Studio完成简易通讯录

目录 &#x1f506;Cloud Studio 简介 操作步骤 1.登录 2.创建工作空间 3.初始界面 4.开发空间 5.保存自定义模板 &#x1f506;简易通讯录 1.实验要求 2.操作环境 3.源代码介绍 3.1 定义通讯录类 3.2 定义通讯录列表 3.3 添加联系人功能 3.4 修改联系人 3.5 …

Echarts 柱状图显示百分比

以下是生成的 option option {yAxis: { name: 金额&#xff08;元&#xff09;, type: value },xAxis: { type: category },legend: {},series: [{stack: x,name: 早餐,label: {normal: {show: true,position: insideRight,// 格式化显示formatter: function (params) {let …

清楚知道谁在划水?伙伴云一招搞定任务交办

伙伴云任务交办让每个职场人都拥有专属的事务汇集地&#xff0c; 让老板一张图把控全局&#xff0c;运筹帷幄&#xff0c; 让员工每天的工作井然有序&#xff0c;让每件事的进展都有始有终、形成闭环。一起来看看吧&#xff01; 01企业内部任务管理的重要性 对于一家公司或一…

Java泛型的简单认识

泛型的认识 自定义泛型&#xff0c;定义了String类型&#xff0c;随后这个泛型就是String类型 于是他的方法都是字符串的类型 泛型接口 泛型方法 所有车可以进行比赛&#xff0c;定义了一个BMW和BENZ两个车类&#xff0c;都继承car&#xff0c;当使用泛型的 如果你顶一个狗对象…

Centos7 安装tomcat9

去官网下载 数据包 ps: wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.78/bin/apache-tomcat-9.0.78.tar.gz检查Java环境 [tomcatlocalhost bin]$ java -version java version "1.8.0_121" Java(TM) SE Runtime Environment (build 1.8.0_121-b13) Java H…