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

这篇具有很好参考价值的文章主要介绍了Python案例|使用Scikit-learn实现客户聚类模型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python案例|使用Scikit-learn实现客户聚类模型,Python,python,scikit-learn,开发语言,原力计划

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

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

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。

Python案例|使用Scikit-learn实现客户聚类模型,Python,python,scikit-learn,开发语言,原力计划

■图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)    # 调用函数

Python案例|使用Scikit-learn实现客户聚类模型,Python,python,scikit-learn,开发语言,原力计划

■图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

Python案例|使用Scikit-learn实现客户聚类模型,Python,python,scikit-learn,开发语言,原力计划

■ 图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)

输出结果为:

Python案例|使用Scikit-learn实现客户聚类模型,Python,python,scikit-learn,开发语言,原力计划

 (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)   #输出聚类中心

输出结果为:

Python案例|使用Scikit-learn实现客户聚类模型,Python,python,scikit-learn,开发语言,原力计划

通过聚类,将客户分为两类: 客户群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()

Python案例|使用Scikit-learn实现客户聚类模型,Python,python,scikit-learn,开发语言,原力计划

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

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

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

 输出结果为:

Python案例|使用Scikit-learn实现客户聚类模型,Python,python,scikit-learn,开发语言,原力计划

下面分析两类客户的购买渠道(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][区域))

 输出结果为:

Python案例|使用Scikit-learn实现客户聚类模型,Python,python,scikit-learn,开发语言,原力计划

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

 文章来源地址https://www.toymoban.com/news/detail-613019.html

到了这里,关于Python案例|使用Scikit-learn实现客户聚类模型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • AI机器学习实战 | 使用 Python 和 scikit-learn 库进行情感分析

    专栏集锦,大佬们可以收藏以备不时之需 Spring Cloud实战专栏:https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏:https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏:https://blog.csdn.net/superdangbo/category_9271502.html tensorflow专栏:https://blog.csdn.net/superdangbo/category_869

    2024年02月05日
    浏览(40)
  • 如何在spark中使用scikit-learn和tensorflow等第三方python包

    首先我们用conda包管理工具对我们需要的python包进行虚拟环境创建: 下面是对每个参数的解释(😁这里让chatgpt给出的解释,自己就不手打了😊) conda create: 这是创建Conda环境的命令。 -n python37: -n参数后跟着你想要创建的环境的名称,这里是python37。你可以将环境名称替换为你

    2024年02月08日
    浏览(42)
  • python数据分析与应用:使用scikit-learn构建模型分析 第六章实训(1,2)

    有问题可以加我微信交流学习,bmt1014 (gcc的同学不要抄袭呀!) 一、实验目的 1、掌握skleam转换器的用法。 2、掌握训练集、测试集划分的方法。 3、掌握使用sklearm进行PCA降维的方法。 4、掌握 sklearn 估计器的用法。 5、掌握聚类模型的构建与评价方法。 6、掌握分类模型的构

    2024年02月09日
    浏览(51)
  • scikit-learn实现线性回归

    要学习scikit-learn,我们必须要到scikit-clearn的官网中去查看公式和原理 scikit-learn 官网 scikit-learn 中文社区 进入官网一以后我们找到回归,然后再有监督学习中找到线性模型 公式: L2范数是指向量中每个元素的平方和的平方根。在数学中,L2范数也称为欧几里得范数,通常用 ∣

    2024年02月04日
    浏览(44)
  • 【python】scikit-learn包:机器学习

    只支持python语言 Win+R ,输入指令: pip install -U scikit-learn 借助pandas和numpy 进行数据导入与处理 机器学习的函数大部分只能对数字信息进行处理,无法对string类数据进行分析,因此需要将string类信息进行编码数字化 参考blog链接,可进行补码 给定数据集 [x1,x2,x3,…,y],拟合y与各

    2024年02月01日
    浏览(41)
  • 交叉验证以及scikit-learn实现

    交叉验证既可以解决数据集的数据量不够大问题,也可以解决参数调优的问题。 主要有三种方式: 简单交叉验证(HoldOut检验)、 k折交叉验证(k-fold交叉验证)、 自助法。 本文仅针对k折交叉验证做详细解释。 方法 :将原始数据集随机划分成训练集和验证集两部分。比如说

    2024年02月04日
    浏览(48)
  • Python数据科学:Scikit-Learn机器学习

    Scikit-Learn使用的数据表示:二维网格数据表 鸢尾花数据集说明: sepal_length:萼片长度 sepal_width:萼片宽度 petal_length:花瓣长度 petal_width:花瓣宽度 species:鸢尾花类型,Iris-setosa(山鸢尾),Iris-versicolor(变色鸢尾),Iris-virginica(维吉尼亚鸢尾) df_iris.head() 样本:鸢尾花数据集矩阵,矩阵

    2024年02月21日
    浏览(56)
  • 【python】scikit-learn包:模型评估与优化

    首先明确,模型拟合的目的: 不是对训练数据进行准确预测,而是对新数据进行准确预测 欠拟合:可以通过训练数据及时发现,且可通过优化模型结果解决 过拟合:难以发觉; 过拟合原因 本质原因: 对训练数据的拟合过于准确,忽略了训练数据也可能存在的 误差 模型上

    2024年02月01日
    浏览(38)
  • 探索 Scikit-learn:Python 机器学习初级篇

    Scikit-learn 是 Python 中最著名的机器学习库之一,它提供了大量实用的机器学习算法以及相关的工具,可以方便我们进行数据挖掘和数据分析。在这篇文章中,我们将介绍 Scikit-learn 的基本使用,包括如何导入数据、预处理数据、选择和训练模型,以及评估模型的性能。 在使用

    2024年02月17日
    浏览(43)
  • Python机器学习:Scikit-learn库与应用

    当涉及到Python机器学习时,Scikit-learn是一个非常流行且功能强大的库。它提供了广泛的算法和工具,使得机器学习变得简单而高效。下面是一个简单的Scikit-learn库与应用示例,其中包括代码。 首先,确保你已经安装了Scikit-learn库。你可以使用pip命令来安装它: bash复制代码

    2024年02月19日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包