♂️ 个人主页:@艾派森的个人主页
✍作者简介: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.实验总结
源代码
随着汽车行业的快速发展和竞争日益激烈,汽车制造商和销售商需要更好地了解其客户群体,以提供个性化的产品和服务,提高客户满意度,并在市场中取得竞争优势。对于汽车行业来说,客户群体是非常多样化的,包括不同地区、不同年龄、不同收入水平、不同购车动机等的消费者。
在这种背景下,使用聚类分析算法,如KMeans和DBSCAN,可以帮助汽车行业进行客户细分,即将客户划分为具有相似特征的群体。通过这样的细分,汽车企业可以更好地了解不同客户群体的需求和行为,根据客户的特点量身定制产品和服务,提高客户满意度和忠诚度。
KMeans算法是一种常用的聚类分析方法,它将数据点分为预先定义的K个簇,使得每个数据点与所属簇的质心之间的距离最小化。通过KMeans算法,汽车企业可以将客户群体划分为K个不同的类别,每个类别具有相似的购车特征和行为习惯,从而为市场营销和产品推广提供有针对性的策略。
DBSCAN算法是另一种常用的聚类算法,它基于数据点的密度来发现不同形状和大小的簇。DBSCAN算法适用于发现具有不同密度和形状的簇,这对于汽车行业来说尤为重要,因为不同地区的客户群体可能具有不同的密度和规模。
综上所述,基于KMeans和DBSCAN算法对汽车行业客户进行聚类分群的实验具有重要意义,它可以帮助汽车企业深入了解不同客户群体的特征,制定精准的营销策略,提高客户满意度,增加销售额,并在激烈的市场竞争中取得优势。
本实验旨在通过对汽车行业客户数据进行分析,找出不同客户类型的属性和行为特征,最后使用KMeans聚类算法进行聚类分群,根据客户的特点量身定制产品和服务,提高客户满意度和忠诚度,增加销售额,并在激烈的市场竞争中取得优势。
本数据集来源于kaggle,原始数据集共有8068条,11个特征变量,各变量含义解释如下:
ID:客户ID
Gender:客户性别
Ever_Married:客户婚姻状况
Age:客户年龄
Graduated:客户是毕业生吗?
Profession:客户的职业
Work_Experience:多年工作经验
Spending_Score:客户的消费评分
Family_Size:客户家庭成员人数(含客户)
Var_1:客户的匿名类别
Segmentation:(目标)客户的客户群
Python版本:3.9
代码编辑器:jupyter notebook
查看数据大小
查看数据基本信息
数值型变量描述性统计
非数值型变量描述性统计
统计缺失值情况
删除缺失值
检测数据集是否存在重复值,结果为False说明没有
先删除无关变量ID和目标变量
对非数值变量进行编码
做出相关性热力图
数据标准化处理
肘部法可视化
训练模型
获取聚类标签
训练模型
模型评估
针对以上四个细分类别的汽车行业客户,可以制定相应的精准营销策略,以满足不同客户群体的需求和偏好,提高市场营销效果。
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))