大数据分析案例-基于KMeans和DBSCAN算法对汽车行业客户进行聚类分群

news2024/11/26 6:11:58

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章

大数据分析案例合集
大数据分析案例-基于随机森林算法预测人类预期寿命
大数据分析案例-基于随机森林算法的商品评价情感分析
大数据分析案例-用RFM模型对客户价值分析(聚类)
大数据分析案例-对电信客户流失分析预警预测
大数据分析案例-基于随机森林模型对北京房价进行预测
大数据分析案例-基于RFM模型对电商客户价值分析
大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型
大数据分析案例-基于决策树算法构建员工离职预测模型

大数据分析案例-基于KNN算法对茅台股票进行预测

大数据分析案例-基于多元线性回归算法构建广告投放收益模型
大数据分析案例-基于随机森林算法构建返乡人群预测模型
大数据分析案例-基于决策树算法构建金融反欺诈分类模型

目录

1.项目背景

2.项目简介

2.1项目说明

2.2数据说明

2.3技术工具

3.算法原理

4.项目实施步骤

4.1理解数据

4.2数据预处理

4.3探索性数据分析

 4.3.1不同组别的性别分布

4.3.2不同组别的年龄分布

4.3.3不同组别的工作经验vs消费得分

4.3.4不同组别的客户分布

4.3.5不同组别的家庭规模

4.3.6客户年龄分布

4.3.7工作经验分布

4.3.8家庭规模分布

4.4特征工程

4.5模型构建

4.5.1KMeans

4.5.2DBSCAN

5.实验总结

源代码


1.项目背景

        随着汽车行业的快速发展和竞争日益激烈,汽车制造商和销售商需要更好地了解其客户群体,以提供个性化的产品和服务,提高客户满意度,并在市场中取得竞争优势。对于汽车行业来说,客户群体是非常多样化的,包括不同地区、不同年龄、不同收入水平、不同购车动机等的消费者。

        在这种背景下,使用聚类分析算法,如KMeans和DBSCAN,可以帮助汽车行业进行客户细分,即将客户划分为具有相似特征的群体。通过这样的细分,汽车企业可以更好地了解不同客户群体的需求和行为,根据客户的特点量身定制产品和服务,提高客户满意度和忠诚度。

        KMeans算法是一种常用的聚类分析方法,它将数据点分为预先定义的K个簇,使得每个数据点与所属簇的质心之间的距离最小化。通过KMeans算法,汽车企业可以将客户群体划分为K个不同的类别,每个类别具有相似的购车特征和行为习惯,从而为市场营销和产品推广提供有针对性的策略。

        DBSCAN算法是另一种常用的聚类算法,它基于数据点的密度来发现不同形状和大小的簇。DBSCAN算法适用于发现具有不同密度和形状的簇,这对于汽车行业来说尤为重要,因为不同地区的客户群体可能具有不同的密度和规模。

        综上所述,基于KMeans和DBSCAN算法对汽车行业客户进行聚类分群的实验具有重要意义,它可以帮助汽车企业深入了解不同客户群体的特征,制定精准的营销策略,提高客户满意度,增加销售额,并在激烈的市场竞争中取得优势。

2.项目简介

2.1项目说明

        本实验旨在通过对汽车行业客户数据进行分析,找出不同客户类型的属性和行为特征,最后使用KMeans聚类算法进行聚类分群,根据客户的特点量身定制产品和服务,提高客户满意度和忠诚度,增加销售额,并在激烈的市场竞争中取得优势。

2.2数据说明

本数据集来源于kaggle,原始数据集共有8068条,11个特征变量,各变量含义解释如下:

ID:客户ID
Gender:客户性别
Ever_Married:客户婚姻状况
Age:客户年龄
Graduated:客户是毕业生吗?
Profession:客户的职业
Work_Experience:多年工作经验
Spending_Score:客户的消费评分
Family_Size:客户家庭成员人数(含客户)
Var_1:客户的匿名类别
Segmentation:(目标)客户的客户群

2.3技术工具

Python版本:3.9

代码编辑器:jupyter notebook

3.算法原理

4.项目实施步骤

4.1理解数据

 首先导入本次实验用到的第三方库,然后加载数据集

 查看数据大小

查看数据基本信息

数值型变量描述性统计

非数值型变量描述性统计

4.2数据预处理

 统计缺失值情况

 删除缺失值

检测数据集是否存在重复值,结果为False说明没有 

4.3探索性数据分析

 4.3.1不同组别的性别分布

4.3.2不同组别的年龄分布

4.3.3不同组别的工作经验vs消费得分

4.3.4不同组别的客户分布

4.3.5不同组别的家庭规模

4.3.6客户年龄分布

4.3.7工作经验分布

4.3.8家庭规模分布

4.4特征工程

先删除无关变量ID和目标变量

 对非数值变量进行编码

做出相关性热力图 

 

数据标准化处理 

 

4.5模型构建

4.5.1KMeans

 肘部法可视化

 训练模型

获取聚类标签

 模型结果评估

4.5.2DBSCAN

训练模型

 模型评估

5.实验总结

        针对以上四个细分类别的汽车行业客户,可以制定相应的精准营销策略,以满足不同客户群体的需求和偏好,提高市场营销效果。

1. 细分D:年龄在35岁以下的未婚人士,消费得分低,主要在医疗保健行业工作。
   - 营销策略:针对这一群体的客户,可以推出经济实惠的汽车型号,注重车辆的安全性和燃油经济性。强调汽车的安全性和便捷性,例如配备先进的安全技术和智能连接功能,以吸引年轻消费者。同时,可利用社交媒体和互联网广告来宣传,以吸引这一年龄段的年轻人。

2. 细分A:年龄在25岁到53岁之间,结婚率约为55%,消费得分低。职业包括市场营销、娱乐、工程等。主要的家庭规模是1人和2人。
   - 营销策略:针对这一群体,可以推出多样化的车型,注重个性化定制服务。考虑到主要是小家庭,可以强调车辆的空间利用和舒适性,以满足家庭出行的需求。另外,可以提供更多的金融方案和促销活动,吸引这一群体的购车兴趣。

3. 细分B:约75%的结婚率,通常在33岁到55岁之间。混合支出得分分布(低:平均:高的比例为4:3:2)。通常在市场营销部门工作。这部分的家庭通常由2个成员组成。
   - 营销策略:针对这一群体,可以推出豪华、高品质的汽车型号,注重车辆的品牌价值和科技配置。强调汽车的豪华感和驾驶体验,吸引这一群体对高品质车型的购买。同时,可提供个性化的购车方案和定制服务,满足这一群体的个性化需求。

4. 细分C:80%左右的结婚率,年龄在32 - 70岁之间。各个细分市场的消费得分各不相同(低:平均:高的比例为3:4:2)。主要从事市场营销工作。这部分的家庭规模通常在2到4人之间。
   - 营销策略:针对这一群体,可以推出具有较高性价比的汽车型号,注重车辆的耐用性和性能表现。强调汽车的经济实惠和可靠性,满足这一群体对性价比的追求。此外,可以开展与企业合作的促销活动,吸引这一群体的购车兴趣。

心得与体会:

通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。

在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等

在此次实战中,我还学会了下面几点工作学习心态:

1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。

2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。

3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。

这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。

源代码

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import seaborn as sns
from sklearn.cluster import DBSCAN

df_train = pd.read_csv('Train.csv')
df_train.head()
df_train.shape
df_train.info()
df_train.describe()
df_train.describe(include='O')
df_train.isnull().sum() # 统计缺失值
df_train.dropna(inplace=True) # 删除缺失值
df_train.shape
any(df_train.duplicated()) # 检测数据集是否存在重复值
# 不同组别的性别分布
sns.countplot(x='Segmentation', hue='Gender', data=df_train)
plt.title("Segmentation based on Gender")
plt.show()
# 不同组别的年龄分布
sns.boxplot(x='Segmentation', y='Age', data=df_train)
plt.title("Age Distribution based on Segmentation")
plt.show()
# 不同组别的工作经验vs消费得分
sns.boxplot(x='Work_Experience', y='Spending_Score', hue='Segmentation', data=df_train)
plt.title("Work Experience vs Spending Score based on Segmentation")
plt.show()
sns.violinplot(x='Segmentation', y='ID', data=df_train)
plt.title("Profession Distribution based on Segmentation")
plt.show()
# 不同组别的家庭规模
plt.figure(figsize=(8,8))
df_train['Family_Size'].value_counts().plot.pie(autopct='%1.1f%%')
plt.title("Family Size Distribution based on Segmentation")
plt.show()
# 客户年龄分布
plt.figure(figsize=(10,5))
sns.histplot(df_train['Age'], kde=True)
plt.title("Distribution of 'Age'")
plt.xlabel("Age")
plt.ylabel("Frequency")
plt.show()
# 工作经验分布
plt.figure(figsize=(10,5))
sns.histplot(df_train['Work_Experience'], kde=True)
plt.title("Distribution of 'Work_Experience'")
plt.xlabel("Work_Experience")
plt.ylabel("Frequency")
plt.show()
# 家庭规模分布
plt.figure(figsize=(10,5))
sns.histplot(df_train['Family_Size'], kde=True)
plt.title("Distribution of 'Family_Size'")
plt.xlabel("Family_Size")
plt.ylabel("Frequency")
plt.show()
# 删除目标变量
df_train_kmeans = df_train.drop(['Segmentation', 'ID'], axis=1)
df_train_kmeans
# 将分类列转换为标签编码列
from sklearn.preprocessing import  LabelEncoder
encoder = LabelEncoder()
df_train_kmeans['Gender'] = encoder.fit_transform(df_train_kmeans['Gender'])
df_train_kmeans['Ever_Married'] = encoder.fit_transform(df_train_kmeans['Ever_Married'])
df_train_kmeans['Graduated'] = encoder.fit_transform(df_train_kmeans['Graduated'])
df_train_kmeans['Profession'] = encoder.fit_transform(df_train_kmeans['Profession'])
df_train_kmeans['Spending_Score'] = encoder.fit_transform(df_train_kmeans['Spending_Score'])
df_train_kmeans['Var_1'] = encoder.fit_transform(df_train_kmeans['Var_1'])
df_train_kmeans.head()
# 相关系数矩阵
corr = df_train_kmeans.corr()
# 绘制热力图
plt.figure(figsize=(10,10))
sns.heatmap(corr, annot=True)
plt.show()
# 数据标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
df_train_kmeans_scaler = scaler.fit_transform(df_train_kmeans)
df_train_kmeans_scaler
KMeans
# 肘部法寻找最佳簇数
Sum_of_squared_distances = []
K = range(2,15)
for k in K:
    km = KMeans(n_clusters=k)
    km = km.fit(df_train_kmeans_scaler)
    Sum_of_squared_distances.append(km.inertia_)
    print("For k =", k, ", the inertia is", km.inertia_)
# 肘部法可视化
import matplotlib.pyplot as plt
plt.plot(K, Sum_of_squared_distances, 'bx-')
plt.xlabel('k')
plt.ylabel('Sum_of_squared_distances')
plt.title('Elbow Method For Optimal k')
plt.show()
# 根据肘部法确定最佳聚类数
best_k = 4
# 训练KMeans模型
kmeans = KMeans(n_clusters=best_k)
kmeans.fit(df_train_kmeans_scaler)
# 预测聚类标签
labels = kmeans.predict(df_train_kmeans_scaler)
# 统计每个集群中的客户数量
from collections import Counter
counts = Counter(labels)
# 在“Segmentation”列中获得目标类别“A”、“B”、“C”和“D”
target_categories = df_train['Segmentation']
# 找出每个簇中出现频率最高的目标类别
cluster_categories = {}
for label, count in counts.items():
    cluster_data = target_categories[labels == label]
    most_frequent_category = cluster_data.value_counts().idxmax()
    cluster_categories[label] = most_frequent_category
# 将预测的标签映射到目标类别
mapped_labels = [cluster_categories[label] for label in labels]
# 将列'n_Clusters'添加到具有映射标签的数据框
df_train['n_Clusters'] = mapped_labels
df_train
# 计算正确预测的次数
correct_predictions = sum(df_train['Segmentation'] == df_train['n_Clusters'])
# 计算预测的总数
total_predictions = df_train.shape[0]
# 以百分比计算准确度
accuracy = (correct_predictions / total_predictions) * 100
print("-- Accuracy for KMeans: {:.2f}%".format(accuracy))
DBSCAN
# 训练DBSCAN模型
dbscan = DBSCAN(eps=0.6, min_samples=5)
dbscan.fit(df_train_kmeans_scaler)
# 预测聚类标签
labels = dbscan.labels_
# 统计每个集群中的客户数量
from collections import Counter
counts = Counter(labels)
# 在` Segmentation `列中获得目标类别` A `, ` B `, ` C `和` D `
target_categories = df_train['Segmentation']
# 找出每个簇中出现频率最高的目标类别
cluster_categories = {}
for label, count in counts.items():
    cluster_data = target_categories[labels == label]
    most_frequent_category = cluster_data.value_counts().idxmax()
    cluster_categories[label] = most_frequent_category
# 将预测的标签映射到目标类别
mapped_labels = [cluster_categories[label] if label in cluster_categories else 'Noise' for label in labels]
# 将列'n_Clusters'添加到具有映射标签的数据框
df_train['n_Clusters'] = mapped_labels
df_train
# 计算正确预测的次数
correct_predictions = sum(df_train['Segmentation'] == df_train['n_Clusters'])
# 计算预测的总数
total_predictions = df_train.shape[0]
# 以百分比计算准确度
accuracy = (correct_predictions / total_predictions) * 100
print("-- Accuracy for DBSCAN: {:.2f}%".format(accuracy))

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

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

相关文章

W6100-EVB-PICO 做UDP Server进行数据回环测试(七)

前言 前面我们用W6100-EVB-PICO 开发板在TCP Client和TCP Server模式下,分别进行数据回环测试,本章我们将用开发板在UDP Server模式下进行数据回环测试。 UDP是什么?什么是UDP Server?能干什么? UDP (User Dataqram P…

安全问题「一锅端」,数据安全风险评估落地实践

数据安全风险评估是《数据安全法》明确的数据安全基础制度之一,也是重要数据处理者应尽的数据安全保护义务。今年5月,《网络安全标准实践指南—网络数据安全风险评估实施指引》发布,作为数据安全领域的一项重磅级指引,明确提出了网…

接口测试及接口抓包常用的测试工具

接口 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 接口测试的重要性 是节省时间前后端不…

11. Docker Swarm(二)

1、前言 上一篇中我们利用Docker Swarm搭建了基础的集群环境。那么今天我们就来验证以下该集群的可用性。上一篇的示例中,我创建了3个实例副本,并且通过访问http://192.168.74.132:8080得到我们的页面。 2、验证高可用 1)我们可以通过以下命…

arco-cli脚手架创建项目时,踩坑点及解决办法

项目场景: 提示:这里简述项目相关背景: arco-cli安装新建项目时,前期很顺利,参考官网示例,都没问题的! arco创建arco-pro项目示例:https://arco.design/vue/docs/pro/start 如果遇见问题管方…

2023年8月中国数据库排行榜:TiDB 重夺榜眼,PolarDB 再进一位

斗力频催鼓、争都更少筹。 2023年8月的 墨天轮中国数据库流行度排行 在炎炎夏日中火热出炉,本月共有286个数据库参与排名。本月排行榜前十中,头部变动加剧。TiDB 发奋图强重夺榜眼,阿里云PolarDB 排名连续上升,其余数据库稳居原位…

代理模式【Proxy Pattern】

什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被 代…

数据结构与算法-链表(含经典面试题)

一 面试经典: 1. 如何设计一个LRU缓存淘汰算法?基础 思想:新加的点来了, 首先去链表里面遍历,如果找到了。删掉 然后插入到头部。头部就是最新的吧如果不在原来的链表里:如果有空间就插入头部。LRU有内存限制的&#x…

理解 Go 中的切片:append 操作的深入分析(篇2)

理解 Go 语言中 slice 的性质对于编程非常有益。下面,我将通过代码示例来解释切片在不同函数之间传递并执行 append 操作时的具体表现。 本篇为第 2 篇,当切片的容量 cap 不够时 func main() {// slice1 当前长度为 3,容量大小也为 3slice1 :…

探索Python中的函数和类:构建模块化和面向对象的程序

文章目录 🍀引言🍀函数:模块化编程的基石🍀类:面向对象编程的基石🍀函数和类的结合:构建高效的程序🍀简单的文字冒险游戏 🍀引言 Python作为一种多范式的编程语言&#x…

web图书管理系统Servlet+JSP+javabean+MySQL图书商城图书馆 源代码

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 web图书管理系统ServletJSPjavabeanMySQL 系统有1权限…

用于100GB+、TB级大型数据集构建【2】--计算包Xarray-主要数据类型

引言: Xarray是一个性能出众的张量操作库,通常用于多通道的时间序列信号处理(比如传感器信号)。通常,在处理此类数据时,我认为您经常使用numpy的np.ndarray。但是,由于np.ndarray是一个简单的矩…

[保研/考研机试] KY103 2的幂次方 上海交通大学复试上机题 C++实现

题目链接: KY103 2的幂次方 https://www.nowcoder.com/share/jump/437195121691999575955 描述 Every positive number can be presented by the exponential form.For example, 137 2^7 2^3 2^0。 Lets present a^b by the form a(b).Then 137 is present…

Linux设备树详解

Linux 设备树详解 Linux 操作系统早期是针对个人电脑设备而开发的操作系统,而个人电脑处理器产商较为单一(例如只有 Intel,AMD)同时个人电脑产商均使用 Intel 或 AMD 制造的处理器,业界形成了统一的总线/硬件接口标准…

稀疏感知图像和体数据恢复的系统对象研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

SpringCloud微服务之间如何进行用户信息传递(涉及:Gateway、OpenFeign组件)

目录 1、想达到的效果2、用户信息在微服务之间传递的两种途径3、用RuoYi-Cloud为例进行演示说明(1)网关将用户信息写在请求头中(2)业务微服务之间通过OpenFeign进行调用,并且将用户信息写在OpenFeign准备的请求头中&am…

02:STM32--EXTI外部中断

目录 一:中断 1:简历 2:AFIO 3:EXTI ​编辑 4:NVIC基本结构 5:使用步骤 二:中断的应用 A:对外式红外传感计数器 1:连接图​编辑 2:函数介绍 3:硬件介绍 4:计数代码 B;旋转编码计数器 1:连接图 2:硬件介绍 3:旋转编码器代码: 一:中断 1:简历 中断:在主程…

硬件产品经理:从入门到精通(新书发布)

目录 简介 新书 框架内容 相关课程 简介 在完成多款硬件产品从设计到推向市场的过程后。 笔者于2020年开始在产品领域平台输出硬件相关的内容。 在这个过程中经常会收到很多读者的留言,希望能推荐一些硬件相关的书籍或资料。 其实,笔者刚开始做硬…

电力能源管理系统在生物制药行业的应用

安科瑞 华楠 摘要:根据生物制品类企业的电力能源使用特点,制定了符合公司实际情况的能源管理系统,介绍了该系统的架构及其在企业的应用情况,提升了公司能源数据的实时监控能力,优化了公司能源分配,降低了公…

React Native Expo项目,复制文本到剪切板

装包: npx expo install expo-clipboard import * as Clipboard from expo-clipboardconst handleCopy async (text) > {await Clipboard.setStringAsync(text)Toast.show(复制成功, {duration: 3000,position: Toast.positions.CENTER,})} 参考链接&#xff1a…