超市商场客户细分项目

news2024/10/6 20:19:41

注意:本文引用自专业人工智能社区Venus AI

更多AI知识请参考原站 ([www.aideeplearning.cn])

项目背景

在竞争激烈的商业环境中,了解和满足客户的需求是任何成功商场的关键要素。为了更好地理解我们的客户并制定有针对性的营销策略,我们拥有一家超市商场,并通过会员卡收集了客户的基本数据。其中,我们尤其关注了一项叫做”消费分数”的指标,这是根据我们定义的一些参数,如客户行为和购买数据,为每位客户分配的分数。

项目目标

本项目的主要目标包括:

  1. 通过K均值聚类算法对客户进行细分,以识别不同的客户群体。
  2. 确定目标客户,即哪些客户更容易受到吸引。
  3. 提供有关不同客户群体的详细信息,以便为市场团队制定有针对性的营销策略。

通过这个项目,我们希望能够更好地了解我们的客户,从而为我们的商场提供更智能、个性化和有效的市场战略。我们将通过数据分析和机器学习算法的应用来实现这一目标,并将在未来分享我们的研究结果和见解。

数据集描述

我们的数据集包含了以下关键属性:

  • 客户ID
  • 年龄
  • 性别
  • 年收入
  • 消费分数

我们可以通过对这些属性进行分析和建模,深入了解客户群体的特征,以及哪些客户更容易被吸引和满足。

模型选择与依赖库

算法: 我们的关键算法是K均值聚类(Kmeans Clustering),它可以将客户分成不同的群体,每个群体具有相似的特征。这将有助于我们理解不同群体的需求和购买行为,从而更好地满足他们的期望。

Libraries(依赖库): 为了完成这个项目,我们将利用以下Python库和机器学习算法:

  • Pandas:用于数据加载和处理,帮助我们清洗和准备数据。
  • Matplotlib和Seaborn:用于数据可视化,以便更好地理解客户数据的分布和关联关系。
  • Scikit-learn:这是一个强大的机器学习库,我们将使用其中的K均值聚类算法来对客户进行细分。

代码实现

导入模块

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

加载数据集

df = pd.read_csv('Mall_Customers.csv')
df.head()
CustomerIDGenderAgeAnnual Income (k$)Spending Score (1-100)
01Male191539
12Male211581
23Female20166
34Female231677
45Female311740
# 统计信息
df.describe()
CustomerIDAgeAnnual Income (k$)Spending Score (1-100)
count200.000000200.000000200.000000200.000000
mean100.50000038.85000060.56000050.200000
std57.87918513.96900726.26472125.823522
min1.00000018.00000015.0000001.000000
25%50.75000028.75000041.50000034.750000
50%100.50000036.00000061.50000050.000000
75%150.25000049.00000078.00000073.000000
max200.00000070.000000137.00000099.000000
# 数据类型信息
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200 entries, 0 to 199
Data columns (total 5 columns):
 #   Column                  Non-Null Count  Dtype 
---  ------                  --------------  ----- 
 0   CustomerID              200 non-null    int64 
 1   Gender                  200 non-null    object
 2   Age                     200 non-null    int64 
 3   Annual Income (k$)      200 non-null    int64 
 4   Spending Score (1-100)  200 non-null    int64 
dtypes: int64(4), object(1)
memory usage: 7.9+ KB

探索性数据分析

gender_counts = df['Gender'].value_counts()
sns.barplot(x=gender_counts.index, y=gender_counts.values)
plt.xlabel('Gender')
plt.ylabel('Count')
plt.title('Gender Distribution')
plt.show()

sns.displot(df['Age'], kde=True)  # kde=True添加核密度估计曲线
plt.xlabel('Age')
plt.ylabel('Density')
plt.title('Age Distribution')
plt.show()


sns.displot(df['Annual Income (k$)'], kde=True)  # kde=True添加核密度估计曲线
plt.xlabel('Annual Income (k$)')
plt.ylabel('Density')
plt.title('Annual Income (k$) Distribution')
plt.show()

sns.displot(df['Spending Score (1-100)'], kde=True)  # kde=True添加核密度估计曲线
plt.xlabel('Spending Score (1-100)')
plt.ylabel('Density')
plt.title('Spending Score (1-100) Distribution')
plt.show()

相关矩阵

corr = df.corr(numeric_only=True)
sns.heatmap(corr, annot=True, cmap='coolwarm')
<Axes: >

聚类

df.head()
CustomerIDGenderAgeAnnual Income (k$)Spending Score (1-100)
01Male191539
12Male211581
23Female20166
34Female231677
45Female311740
# 基于 2 个特征的聚类
df1 = df[['Annual Income (k$)', 'Spending Score (1-100)']]
df1.head()
Annual Income (k$)Spending Score (1-100)
01539
11581
2166
31677
41740
# 散点图
sns.scatterplot(x='Annual Income (k$)', y='Spending Score (1-100)', data=df1)
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.title('Scatter Plot of Annual Income vs. Spending Score')
plt.show()

import warnings 
warnings.filterwarnings("ignore", category=UserWarning) 
from sklearn.cluster import KMeans

errors = []
for i in range(1, 11): 
    kmeans = KMeans(n_clusters=i, random_state=0,n_init=10, max_iter=300 )
    kmeans.fit(df1)
    errors.append(kmeans.inertia_) 
# 绘制肘部法的结果
plt.figure(figsize=(13,6))
plt.plot(range(1,11), errors)
plt.plot(range(1,11), errors, linewidth=3, color='red', marker='8')
plt.xlabel('No. of clusters')
plt.ylabel('WCSS')
plt.xticks(np.arange(1,11,1))
plt.show()

km = KMeans(n_clusters=5, n_init=10)
km.fit(df1)

y = km.predict(df1)
df1.loc[:, 'Label'] = y

df1.head()
C:\Users\1\AppData\Local\Temp\ipykernel_21088\2186447201.py:5: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df1.loc[:, 'Label'] = y

Annual Income (k$)Spending Score (1-100)Label
015390
115813
21660
316773
417400
sns.scatterplot(x='Annual Income (k$)', y='Spending Score (1-100)', data=df1, hue='Label', s=50, palette=['red', 'green', 'brown', 'blue', 'orange'])
<Axes: xlabel='Annual Income (k$)', ylabel='Spending Score (1-100)'>

# 基于 3 个特征的聚类
df2 = df[['Annual Income (k$)', 'Spending Score (1-100)', 'Age']]
df2.head()
Annual Income (k$)Spending Score (1-100)Age
0153919
1158121
216620
3167723
4174031
import warnings 
warnings.filterwarnings("ignore", category=UserWarning) 
from sklearn.cluster import KMeans

errors = []
for i in range(1, 11): 
    kmeans = KMeans(n_clusters=i, random_state=0,n_init=10, max_iter=300 )
    kmeans.fit(df2)
    errors.append(kmeans.inertia_) 
# 绘制肘部法的结果
plt.figure(figsize=(13,6))
plt.plot(range(1,11), errors)
plt.plot(range(1,11), errors, linewidth=3, color='red', marker='8')
plt.xlabel('No. of clusters')
plt.ylabel('WCSS')
plt.xticks(np.arange(1,11,1))
plt.show()

km = KMeans(n_clusters=5, n_init=10)
km.fit(df2)

y = km.predict(df2)
df2.loc[:, 'Label'] = y

df2.head()
C:\Users\1\AppData\Local\Temp\ipykernel_21088\4218386864.py:5: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  df2.loc[:, 'Label'] = y

Annual Income (k$)Spending Score (1-100)AgeLabel
01539194
11581210
2166204
31677230
41740314
# 3d 散点图
fig = plt.figure(figsize=(20,15))
ax = fig.add_subplot(111, projection='3d')

ax.scatter(df2['Age'][df2['Label']==0], df2['Annual Income (k$)'][df2['Label']==0], df2['Spending Score (1-100)'][df2['Label']==0], c='red', s=50)
ax.scatter(df2['Age'][df2['Label']==1], df2['Annual Income (k$)'][df2['Label']==1], df2['Spending Score (1-100)'][df2['Label']==1], c='green', s=50)
ax.scatter(df2['Age'][df2['Label']==2], df2['Annual Income (k$)'][df2['Label']==2], df2['Spending Score (1-100)'][df2['Label']==2], c='blue', s=50)
ax.scatter(df2['Age'][df2['Label']==3], df2['Annual Income (k$)'][df2['Label']==3], df2['Spending Score (1-100)'][df2['Label']==3], c='brown', s=50)
ax.scatter(df2['Age'][df2['Label']==4], df2['Annual Income (k$)'][df2['Label']==4], df2['Spending Score (1-100)'][df2['Label']==4], c='orange', s=50)
ax.view_init(30, 190)
ax.set_xlabel('Age')
ax.set_ylabel('Annual Income')
ax.set_zlabel('Spending Score')
plt.show()

代码与数据集下载

详情请见超市商场客户细分项目-VenusAI (aideeplearning.cn)

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

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

相关文章

网页布局再次复现

华子目录 普通文档流布局table布局table布局的不足之处 浮动布局浮动优点浮动用途 定位布局相对定位特点&#xff1a; 绝对定位特点&#xff1a; 固定定位 divcss布局div盒子模型标准盒子模型div盒子组成注意 CSS弹性盒子CSS3 弹性盒子常用属性flex使用三要素flex-direction设置…

5.9 mybatis之callSettersOnNulls作用

文章目录 1. 当callSettersOnNullstrue时2. 当callSettersOnNullsfalse时 在mybatis的settings配置参数中有个callSettersOnNulls参数&#xff0c;官方解释为&#xff1a;指定当结果集中值为 null 的时候是否调用映射对象的 setter&#xff08;map 对象时为 put&#xff09;方法…

SecureCRT日志记录的7个经典配置记录与14个环境变量(%Y-%M-%D_%H_%S_session.log %t )

每次更换电脑、主机或者环境都需要配置一遍SecureCRT的参数。感觉就最近十年都已经设置过上百次了。其实设置没什么特别的&#xff0c;只是经过不断地打磨&#xff0c;主打的就是一个经济实用。经常忘记&#xff0c;特此记录。 配置方式 建议直接配置默认session&#xff1a;…

error:0308010C:digital envelope routines::unsupported(问题分析)

error:0308010C:digital envelope routines::unsupported 情况一&#xff1a;就是网上大部分人说的node 17版本的问题 出现这个错误是因为 node.js V17版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制&#xff0c;可能会对生态系统造成一些影响…

宝妈如何在家创造收入?五种兼职工作让你轻松赚钱!

许多宝妈为了陪伴孩子成长&#xff0c;毅然选择了全职妈妈的角色&#xff0c;然而&#xff0c;她们内心仍希望能有一份收入&#xff0c;实现经济独立。于是&#xff0c;寻找既能照顾家庭又能赚钱的工作成了她们的迫切需求。 然而&#xff0c;这样的需求也往往让宝妈们成为一些…

策略为王股票软件源代码\StkUI\View\BaseView.cpp-------显示股票基本资料的视图-------程序代码都在里面了

CString strHeader info.GetStockCode(); strHeader " "; /修改 strHeader info.GetStockName(); strHeader "\r\n\r\n "; GetEditCtrl().SetWindowText( strHeader ); GetEditCtrl().SetSel…

寻找心灵慰藉:这些平台上有最好的解压视频

在这个快节奏的社会中&#xff0c;解压视频成为了我们放松心情的小帮手。这些视频通常具有令人着迷的视觉效果和舒缓的背景音乐&#xff0c;能够帮助我们暂时脱离紧张的工作或生活状态。如果你正在寻找这样的视频&#xff0c;以下几个平台可以满足你的需求&#xff1a; 蛙学网…

AI在运维实践中的价值提升

在2024年的AI赛道上&#xff0c;利用大数据 、机器学习算法、人工智能来改善运维效率已成为软件运营商发展的新主张&#xff0c;通过AI在运维流程的洞察、决策和执行&#xff0c;从而提升效率、减少故障时间&#xff0c;优化用户体验。通过分析大量数据来识别趋势和模式&#x…

免费VPS云服务器汇总,最长永久免费使用

目前云服务器市场竞争很激烈&#xff0c;为了方便吸引上云&#xff0c;很多云计算服务商提供免费试用云服务器&#xff0c;下面给大家整理汇总一下免费VPS云服务器&#xff0c;最长永久免费使用&#xff01; 一、雨云&#xff08;优惠码:ABC&#xff09; 活动地址&#xff1a;…

Python爬虫-京东商品评论数据

前言 本文是该专栏的第68篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者有详细介绍京东滑块验证码的解决方法,感兴趣的同学,可以直接翻阅文章《Python如何解决“京东滑块验证码”(5)》进行查看。 而本文,笔者以京东商品详情页的评论数据为例,通过…

直播弹幕系统设计

本文仅提供思路参考&#xff0c;并非完备的详细设计。 特点 其实很类似IM即时通讯系统&#xff0c;是个变种&#xff0c;本质也是在一个空间内收发消息 消息及时性强&#xff0c;过期消息意义不大用户松散&#xff0c;随时来随时走可能有瞬时大批量弹幕&#xff08;比如比赛精…

整数在内存中的存储和内存操作函数

目录 整数在内存中的存储1. 整数在内存中的存储2. 大小端字节序和字节序判断2.1 什么是大小端?2.2 为什么有大小端 3. 练习3.1 请简述大端字节序和小端字节序的概念&#xff0c;设计⼀个小程序来判断当前机器的字节序。&#xff08;10分&#xff09;-百度笔试题3.2 练习23.3 练…

Linux三剑客-sed、awk、egrep(上)

一、知识梗概 二、正则表达式 定义&#xff1a;正则表达式是一种强大的文本处理工具&#xff0c;用于在文本中搜索符合特定模式的字符串。它由一系列特殊字符和普通字符组成&#xff0c;可以定义复杂的搜索模式。正则表达式被广泛应用于各种编程语言和文本处理工具中。 简单来…

【DNS】

文章目录 DNS域名解析系统&#xff08;Domain Name System&#xff09;DNS系统需要解决的问题DNS域名解析系统&#xff08;Domain Name System&#xff09;问题1&#xff1a;DNS名字空间(The DNS Name Space&#xff09;DNS名字空间(The DNS Name Space)DNS名字空间(The DNS Na…

解锁生成式 AI 的力量:a16z 提供的 16 个企业指南

企业构建和采购生成式AI方面的16项改变 生成式 AI 领域趋势洞察&#xff1a;企业构建和采购生成式 AI 的方式正在发生重大转变&#xff0c;具体表现在&#xff1a;* 专注于可信度和安全性&#xff1a;75% 的企业将信任和安全性视为关键因素。* 优先考虑可扩展性和灵活性&#x…

Go语言入门|包、关键字和标识符

目录 Go语言 包文件 规则 关键字 规则 标识符 规则 预定义标识符 Go语言 Go语言是一种静态类型、编译型和并发型的编程语言&#xff0c;由Google开发。Go的源代码文件以.go为扩展名&#xff0c;文件名通常与包名保持一致。一个Go文件可以包含多个顶级声明&#xff0c;…

WXML模板语法-条件与列表渲染

wx:if 在小程序中&#xff0c;使用wx:if"{{condition}}"来判断是否需要渲染该代码 也可以用wx:elif和wx:else来添加else判断 <!--pages/ifIndex/ifindex.wxml--> <view wx:if"{{type 1}}">男</view> <view wx:elif"{{type …

基于ICEEMDAN-SVD的信号去噪算法

一、代码原理 ICEEMDAN-SVD算法是一种结合了Improved Complete Ensemble Empirical Mode Decomposition with Adaptive Noise (ICEEMDAN) 和奇异值分解 (SVD) 的信号去噪方法。这种算法结合了两种先进的信号处理技术&#xff0c;旨在提高信号去噪的效果。以下是该算法的基本原…

深入理解信号上升沿与带宽的关系

信号的上升时间&#xff0c;对于理解信号完整性问题至关重要&#xff0c;高速pcb设计中的绝大多数问题都和它有关&#xff0c;很多信号完整性问题都是由信号上升时间短引起的&#xff0c;你必须对他足够重视。 信号上升时间并不是信号从低电平上升到高电平所经历的时间&#xf…

Ubuntu-22.04安装KVM虚拟机并安装Windows10

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、KVM是什么&#xff1f;二、安装步骤1.检查虚拟化2.查看KVM虚拟化3.安装KVM4.启用后台进程5.添加用户组6.重启电脑 三、使用步骤1.添加虚拟机2.配置虚拟机3.…