Python数据分析案例27——PCA-K均值-轮廓系数客户聚类

news2024/11/20 14:20:48

本案例适合应用统计,数据科学,电商专业


K均值对客户进行分类的案例都做烂了......但我认为这个案例还是有一定的价值的,使用了pca,还有轮廓系数寻找最优的聚类个数。

下面来看看


代码准备

导入包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns

pd.set_option('display.max_columns', None) 

读取客户的特征数据,就是每个客户买不同种类的商品的消费金融

category_spends = pd.read_csv("category_spends_sample.csv")
category_spends.fillna(0, inplace=True)
print(category_spends.shape)
category_spends.head()

可以看到总共有3000个客户,

下面把这3000客户的消费记录都读取进来

baskets_sample = pd.read_csv("baskets_sample.csv")
baskets_sample.fillna(0, inplace=True)
print(baskets_sample.shape)
baskets_sample.head()

 

可以看到这3000个客户有19w的消费记录。

查看一下是不是3000个客户

baskets_sample['customer_number'].unique().shape

 

没问题。

然后我们需要构建一个特征,表示客户的最近一次消费的时间,就是FRM模型里面的R,

recent =baskets_sample.groupby('customer_number').agg({'purchase_time': 'max'})
recent['purchase_time']= pd.to_datetime(recent['purchase_time'])
recent.head()

 

然后处理一下

recent=recent.assign(recency=pd.to_datetime('2007-08-31 21:55:00')-recent['purchase_time'])
recent = recent.reset_index()[['customer_number','recency']]
recent['recency']=recent['recency']/pd.Timedelta(days=1)    #变成天
recent = recent.drop_duplicates()
recent.head()

 

这样客户就多了Recency这个特征,然后再读取一个顾客消费金融的数据集

customers_sample = pd.read_csv('customers_sample.csv')
customers_sample.fillna(0, inplace=True)
print(customers_sample.shape)
customers_sample.head()

就是每个客户的一些特征。

总之上面的事情都是在提取客户的特征。把这些特征进行合并

data =pd.merge(category_spends, customers_sample, on='customer_number')
data=pd.merge(data, recent, on='customer_number')
customer_ID=data['customer_number']
data.drop(['customer_number'], axis = 1, inplace = True)
data.head()

然后下面对这些特征进行可视化


可视化图 

data.hist(grid=False,figsize =(16,10))
plt.tight_layout()
plt.show()

相关性热力图

plt.figure(figsize=(18,18),dpi=128)
sns.heatmap(data.corr(), cmap="Oranges",annot=True)
plt.xticks(range(len(data.columns)), data.columns);
plt.yticks(range(len(data.columns)), data.columns);
plt.show()

 

删除一些不用的特征

data.drop(['average_spend','average_quantity','total_quantity'], axis = 1, inplace = True)

 直方图

logged_data = np.log(data+1)
logged_data.columns = data.columns
logged_data.hist(grid=False, figsize=(15,13))  
plt.show()


PCA主成分

进行pca降维

from sklearn.decomposition import PCA
pca = PCA()
pca.fit(logged_data)
print(data.columns)
print(len(data.columns))
print(pca.explained_variance_ratio_)

plt.plot(pca.explained_variance_ratio_.cumsum(), 'o-')
plt.xlabel('Principal Component')
plt.ylabel('Cumulative Proportion of Variance Explained')
plt.axvline(8, color='k', linestyle='--', linewidth=1)
plt.title('Cumulative PVE')

 

可以看到大概9个主成分就到了进80%的解释能力

拟合9个主成分,画图,表示每个主成分和原来的x的关系

#-- Generate a PCA factorization of your data
pca = PCA(n_components= 9)
pca.fit(logged_data)
#-- import a helpful set of functions to ease displaying results..
import renders as rs
#-- Generate a PCA results plot 
pca_results = rs.pca_results(data, pca)

 

这个图可以清楚的看到每个主成分是员原来的X的如何的线性组合。

拟合

from sklearn.decomposition import PCA

pca = PCA(n_components=9)
pca.fit(logged_data)
print(data.columns)
print(pca.components_)

计算轮廓系数,寻找最佳的聚类个数

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# Create range of clusters 
range_n_clusters = list(range(5,8))
print(range_n_clusters)
range_score = []
# Loop through clusters
for n_clusters in range_n_clusters:
    # TODO: Apply your clustering algorithm of choice to the reduced data 
    clusterer = KMeans(n_clusters=n_clusters).fit(reduced_data)

    # TODO: Predict the cluster for each data point
    preds = clusterer.predict(reduced_data)

    # TODO: Find the cluster centers
    centers = clusterer.cluster_centers_

    # TODO: Calculate the mean silhouette coefficient for the number of clusters chosen
    score = silhouette_score(reduced_data, preds, metric='euclidean')
    range_score.append(score)
    print("For n_clusters = {}. The average silhouette_score is : {})".format(n_clusters, score))

plt.plot(range_n_clusters, range_score)
plt.show()

 

聚类个数为6的时候最大,我们选择聚类6个。

把聚类结果画图上

clusterer = KMeans(n_clusters=6).fit(reduced_data)
preds = clusterer.predict(reduced_data)
centres = clusterer.cluster_centers_

#-- Put the predictions into a pandas dataframe format
assignments = pd.DataFrame(preds, columns = ['Cluster'])

#-- Put the predictions into a pandas dataframe format
plot_data = pd.concat([assignments, reduced_data], axis = 1)

#-- Color the points based on assigned cluster (n.b scatter will do this for us automatically)
plt.rcParams['figure.figsize'] = (14.0, 8.0)

for i, c in plot_data.groupby('Cluster'):  
    plt.scatter(c[0], c[1])
    
#-- Plot where the cluster centers are
for i, c in enumerate(centres):
    plt.scatter(x = c[0], y = c[1], color = 'white', edgecolors = 'black', marker = 'o', s=300);
    plt.scatter(x = c[0], y = c[1], marker='${}$'.format(i), alpha = 1, s=50);

 

 查看聚类中心

# TODO: Inverse transform the centres
log_centres = pca.inverse_transform(centres)

# TODO: Exponentiate the centres
true_centres = np.exp(log_centres)

#-- Display the true centres
segments = ['Segment {}'.format(i) for i in range(0, len(centres))]
true_centres = pd.DataFrame(np.round(true_centres), columns = data.columns)
true_centres.index = segments
true_centres

  合并聚类的结果

final_assigments = pd.concat([customer_ID,assignments, data], axis = 1)
#final_assigments['customer_number']=customer_ID
final_assigments

 储存:

final_assigments.to_csv('result.csv',index=False)

这样每个客户属于哪一类都打上了标签,他们的特征也都跟在后面了

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

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

相关文章

网上学影视后期靠谱吗 影视后期剪辑需要学什么

影视后期如果有人手把手当面教的话,当然是最好的。但很多人都没有这么好的条件,实际上,网上也有很多教程可以学习利用。不过,小伙伴们可能会有疑问,网上学影视后期靠谱吗,影视后期剪辑需要学什么&#xff1…

从创意造型到高品质曲面的卓越体验|CATIA ICEM Design Experience

目录 IDX为设计师提供了强大直观的建模工具 IDX为曲面工程师提供高品质数字模型处理能力 IDX与其他工具配合形成完整的数字化解决方案 建模是设计工作的重要环节,合适的数字模型能够在各个环节对整个设计流程产生正面的推动作用。 设计的不同阶段对模型有各自的…

Azkaban从入门到精通以及案例实操系列

1、Azkaban概论 1.1、Azkaban简介 Azkaban 是一个开源的基于 Web 的工作流调度系统,由 LinkedIn 公司开发并维护。它可以帮助用户在大规模数据处理中来管理和调度作业,提供了简单易用、高效可靠的工作流设计和调度功能。 Azkaban 的主要特点包括&…

亿发ERP系统,全链条采购协同管理数智化平台,中小企业采购业务全流程管理

在数字时代,中小型企业在采购管理方面面临多项挑战。 集采管理难:由于资源和专业知识有限,中小企业通常难以建立集中采购职能,无法有效简化整个组织的采购活动。这一挑战包括定义采购政策、标准化程序和实施高效的采购系统。 信…

『赠书活动 | 第六期』《“Java四大名著“,你集齐了吗?》

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! 『赠书活动 | 第六期』 本期书籍:《“Java四大名著”,你集齐了吗?》 赠书规则:评论区:点赞&…

供水管网监测系统,供水管网压力监测系统

水是城市赖以生存的血脉,直接关系到居民、企业和公共设施的正常生活和生产。然而,城市供水管网的高效运行面临着一系列挑战,如管道老化、泄漏和不均衡的供水压力等。 目前城市供水管网泄漏检测排查采用人工巡检、人工听漏的方式,巡…

Flutter3.10版本发布,编程语言的重大更新

Flutter是一款强大的跨端开发框架,可以帮助开发者构建高性能、美观、灵活的应用程序,从而实现跨平台开发和部署。小程序容器技术与跨端框架结合使用,为开发者提供一站式的小程序开发和发布服务,帮助他们更加轻松和高效地构建和部署…

CPU和GPU前端的应用

1、CPU(英文Central Processing Unit 中央处理器) CPU(中央处理器)是一种通用的处理器,其主要任务是执行计算机程序中的指令和序列。它能够处理复杂的逻辑判断、分支、跳转、内存访问等操作,因此在执行大多…

虚幻引擎4利用粒子系统实现物体轨迹描绘2- 消除轨迹

目录 前言粒子频繁产生对系统运行的影响轨迹的清除小结 前言 之前已经实现了UE4中跟随物体利用粒子系统产生轨迹的效果,文章链接如下: 虚幻引擎4利用粒子系统实现物体轨迹描绘_ADi_hhh的博客-CSDN博客 但是上篇文章还留下了两个问题 轨迹如何清除&am…

Spring探索——既生@Resource,何生@Autowired?

提到Spring依赖注入,大家最先想到应该是Resource和Autowired,很多文章只是讲解了功能上的区别,对于Spring为什么要支持两个这么类似的注解却未提到,属于知其然而不知其所以然。不知大家在使用这两个注解的时候有没有想过&#xff…

mysql8.0主从复制搭建

mysql8.0主从复制搭建 1.安装两个相同版本8.0的mysql数据库 主从IP端口主库192.168.139.1283306从库192.168.139.1303306 2.主从复制配置 2.1 修改mysql配置文件my.conf 主机mysql配置完整 [mysql] # 设置mysql客户端默认字符集 default-character-setutf8mb4 [client] # …

二十三种设计模式第十篇--外观模式

在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门(政务窗口 )能解决一切手续问题就好了。 软件设计也是这样,当一个系统的功能越来越强&…

2023年小型水库安全监测能力提升解决方案

一、方案背景 2023年小型水库安全监测能力提升试点项目建设将按照“统一规划、统一标准、统一实施、统一管理、统一支撑”的工作要求,对全区小型水库雨水情测报和监测设施建设项目按高水平、高标准、高质量要求开展安全监测能力提升建设,同步开展水工程安…

ZeLinAI是什么?国产ChatGPT快速搭建自己的AI应用

ChatGPT使用门槛高,需要科学上网短信接码等,不如直接选择国产ZelinAI,使用超简单轻轻松松从0到1零代码创建自己的AI应用。目前模型仅支持GPT-3.5-turbo,后续应该会接入文心一言、GPT-4、GPT-4.5和Bard,新手站长分享国产…

DL.to 最新研究(论文)推荐——分割、CVPR、扩散模型、感受野注意力模块

目录 一、CVPR 1.CrowdCLIP:基于视觉-语言模型的无监督人群计数 CrowdCLIP: Unsupervised Crowd Counting via Vision-Language Model 2.Beyond mAP:更好地评估实例分割 Beyond mAP: Re-evaluating and Improving Performance in Instance Segmentation with Se…

基于低代码平台的多租户解决方案

在云计算时代,“多租户”是一个非常重要的概念。根据百度百科中的定义,多租户技术是一种软件架构技术,简单来说是指以单一系统架构与服务提供多数客户端相同甚至可定制化的服务,并且仍然可以保障客户的数据在多租户环境中&#xf…

Redis之bitmap/hyperloglog/GEO

Redis之bitmap/hyperlog/GEO 一 面试题引入二 统计的类型三 hyperloglog3.1 行业术语3.2 hyperloglog基础3.2.1 基数3.2.2 定义3.2.3 基数统计3.2.4 基本命令 3.3 HyperLogLog原理3.3.1 去重复统计的方式3.3.2 原理 3.4 HyperLogLog案例实战3.4.1 需求3.4.2 方案讨论3.4.3 Hype…

五、SpringMVC从入门到入坟

一、SpringMVC概念 SpringMVC 是 Spring 框架中的一个模块,它是一个基于 MVC设计模式的 Web 框架,用于构建基于 Java 技术的 Web 应用程序。Spring的web框架围绕DispatcherServlet [ 调度Servlet ] 设计。 它的主要原理是将 Web 应用程序分成模型&…

实时频谱-2.4窗口函数

窗口函数 在离散傅立叶变换(DFT)分析运算中,一个固有的假设是要处理的数据是单个周期定期重复的信号。例如,在图2-8中的帧2上应用DFT处理时,信号上会进行周期性扩展。 在连续的帧之间一般会发生不连续点,如图 2-9 所示。 这些人…

平板电脑哪种电容笔更好用?平价好用的iPad电容笔推荐

我是一个非常喜欢数码产品的发烧者,多少了解一些关于电容笔的知识。我想,苹果原装的电容笔与普通的电容笔的不同之处就是他们所能产生的压力感觉不同。由于苹果的电容笔拥有独一无二的“重力压感”,使得它可以让我们在一幅画面中快速填充色彩…