和鲸社区数据分析每周挑战【第九十六期:汽车公司客户细分预测】

和鲸社区数据分析每周挑战【第九十六期:汽车公司客户细分预测】

一、前言

本周的挑战内容为:汽车公司客户细分预测

大家可以去我的和鲸鱼主页查看这个项目。

在这里插入图片描述

1、背景描述

本数据集包含一家汽车公司的潜在客户的数据。

该公司计划用他们现有的产品(P1、P2、P3、P4和P5)进入新市场。经过深入的市场调查,他们推断出新市场的行为与现有市场相似。

该公司的销售团队将所有客户分为四类(A、B、C、D)并且对不同的客户群进行了细分的宣传和沟通后发现转化效果非常好。因此他们计划在新的市场上使用同样的策略,并且已经确定了2627个新的潜在客户。

请尝试基于这些潜在客户的数据进行用户分群分析,帮助该公司预测出正确的新客户群画像。

2、什么是用户分群?

用户分群(User Segmentation)是一种数据挖掘和分析方法,通过对用户行为、消费习惯、兴趣爱好等多维度特征进行深入挖掘和分析,将大量用户按照相似性或差异性划分为若干个具有共同特征的群体。这些群体可以是基于地理位置、年龄、性别、收入水平、购买力等基本信息划分的常规用户群体,也可以是根据用户在产品或服务中的行为特点细分出的特定用户群体。

用户分群的主要目的是为了更好地理解不同群体的需求、偏好和行为模式,从而实现精准营销、优化产品设计和服务体验等目标。以下是用户分群的一些优势:

  1. 个性化推荐:通过了解不同用户群体的兴趣和需求,企业可以为每个群体提供更加精准的个性化推荐,提高用户满意度和忠诚度。
  2. 营销策略优化:通过分析不同用户群体的消费行为和偏好,企业可以制定更有针对性的营销策略,提高市场推广效果。
  3. 产品和服务优化:了解用户群体的需求和痛点,企业可以对产品和服务进行优化,提升用户体验和满意度。
  4. 风险评估与预警:通过对用户行为的分析,企业可以识别潜在的风险因素,提前采取措施防范损失。
  5. 提高客户生命周期价值:通过精细化的用户管理和维护,企业可以提高客户的生命周期价值,实现更高的收益。

在实际应用中,用户分群通常需要借助数据分析工具和技术手段,如聚类算法、关联规则挖掘、分类算法等。同时,为了获得更准确的用户分群结果,企业还需要结合业务场景和实际情况,不断调整和完善分群模型。

3、数据说明

字段 说明
ID 客户ID
Gender 性别
Ever_Married 客户的婚姻状况
Age 年龄
Graduated 客户是有拥有学位
Profession 职业
Work_Experience 参加工作的时间(单位:年)
Spending_Score 客户消费评分(分数越低意味着客户花的钱越少,越高以为着客户花的越多)
Family_Size 家庭规模(单位:人)
Var_1 对客户匿名分组的组别
Segmentation 客户分类(该客户被用户分群后的所属类别)

4、数据集预览

在这里插入图片描述

在这里插入图片描述

二、数据读取和数据初步观察

import pandas as pd

# 加载数据
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')

# 显示数据的前5行
train_data.head()

在这里插入图片描述

从上面的输出中,我们可以看到数据集包含以下字段:

  • ID:客户ID
  • Gender:性别
  • Ever_Married:客户的婚姻状况
  • Age:年龄
  • Graduated:客户是有拥有学位
  • Profession:职业
  • Work_Experience:参加工作的时间(单位:年)
  • Spending_Score:客户消费评分(分数越低意味着客户花的钱越少,越高以为着客户花的越多)
  • Family_Size:家庭规模(单位:人)
  • Var_1:对客户匿名分组的组别
  • Segmentation:客户分类(该客户被用户分群后的所属类别)

接下来,我们将进行更深入的数据分析。

# 查看数据的基本信息
train_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 8068 entries, 0 to 8067
Data columns (total 11 columns):
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   ID               8068 non-null   int64  
 1   Gender           8068 non-null   object 
 2   Ever_Married     7928 non-null   object 
 3   Age              8068 non-null   int64  
 4   Graduated        7990 non-null   object 
 5   Profession       7944 non-null   object 
 6   Work_Experience  7239 non-null   float64
 7   Spending_Score   8068 non-null   object 
 8   Family_Size      7733 non-null   float64
 9   Var_1            7992 non-null   object 
 10  Segmentation     8068 non-null   object 
dtypes: float64(2), int64(2), object(7)
memory usage: 693.5+ KB

从上面的输出中,我们可以看到数据集包含8068条记录,11个字段。其中,有些字段存在缺失值,如Ever_MarriedGraduatedProfessionWork_ExperienceFamily_SizeVar_1

# 查看数据的描述性统计信息
train_data.describe(include='all')

在这里插入图片描述

三、潜在客户画像EDA

1、性别分别

import matplotlib.pyplot as plt
import seaborn as sns
#隐藏警告
import warnings
warnings.filterwarnings("ignore")               #忽略警告信息
plt.rcParams['font.sans-serif']  = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False      # 用来正常显示负号
plt.rcParams['figure.dpi']  = 100        #分辨率


# 设置风格
sns.set(style='whitegrid')

plt.figure(figsize=(8, 6))
sns.countplot(x='Gender', data=train_data)
plt.title('性别分布')
plt.show()

在这里插入图片描述

从上图中我们可以看到在这个数据集中,男性客户的数量略多于女性客户。

2、婚姻状态分布

plt.figure(figsize=(8, 6))
sns.countplot(x='Ever_Married', data=train_data)
plt.title('婚姻状况分布')
plt.show()

在这里插入图片描述

从上图中我们可以看到在这个数据集中,已婚的客户数量多于未婚的客户。

3、是否拥有学位分布

plt.figure(figsize=(8, 6))
sns.countplot(x='Graduated', data=train_data)
plt.title('是否拥有学位分布')
plt.show()

在这里插入图片描述

从上图中我们可以看到在这个数据集中,拥有学位的客户数量多于没有学位的客户。

4、职业分布

plt.figure(figsize=(12, 8))
sns.countplot(y='Profession', data=train_data)
plt.title('职业分布')
plt.show()

在这里插入图片描述

从上图中我们可以看到在这个数据集中,客户的职业主要集中在ArtistHealthcareEntertainment等几个类别。

5、工作经验分布

plt.figure(figsize=(12, 8))
sns.histplot(train_data['Work_Experience'].dropna(), kde=False, bins=30)
plt.title('工作经验分布')
plt.show()

在这里插入图片描述

从上图中我们可以看到在这个数据集中,大部分客户的工作经验在10年以下,特别是在1年以下的客户最多。

6、消费评分分布

plt.figure(figsize=(8, 6))
sns.countplot(x='Spending_Score', data=train_data)
plt.title('消费评分分布')
plt.show()

在这里插入图片描述

从上图中我们可以看到在这个数据集中,消费评分主要集中在LowAverage两个类别。

7、家庭规模分布

plt.figure(figsize=(12, 8))
sns.histplot(train_data['Family_Size'].dropna(), kde=False, bins=30)
plt.title('家庭规模分布')
plt.show()

在这里插入图片描述

从上图中我们可以看到在这个数据集中,大部分客户的家庭规模在2-4人之间。

8、匿名分组分布

plt.figure(figsize=(8, 6))
sns.countplot(x='Var_1', data=train_data)
plt.title('匿名分组分布')
plt.show()

在这里插入图片描述

从上图中我们可以看到在这个数据集中,匿名分组主要集中在Cat_6类别。

9、客户分类分布

plt.figure(figsize=(8, 6))
sns.countplot(x='Segmentation', data=train_data)
plt.title('客户分类分布')
plt.show()

在这里插入图片描述

从上图中我们可以看到在这个数据集中,客户分类较为均匀,每个类别的客户数量差异不大。

四、潜在客户的分类预测

1、数据预处理

# 填充缺失值
train_data['Ever_Married'].fillna(train_data['Ever_Married'].mode()[0], inplace=True)
train_data['Graduated'].fillna(train_data['Graduated'].mode()[0], inplace=True)
train_data['Profession'].fillna(train_data['Profession'].mode()[0], inplace=True)
train_data['Work_Experience'].fillna(train_data['Work_Experience'].median(), inplace=True)
train_data['Family_Size'].fillna(train_data['Family_Size'].median(), inplace=True)
train_data['Var_1'].fillna(train_data['Var_1'].mode()[0], inplace=True)

# 将分类变量转换为数值
train_data['Gender'] = train_data['Gender'].map({
    
    'Male': 0, 'Female': 1})
train_data['Ever_Married'] = train_data['Ever_Married'].map({
    
    'No': 0, 'Yes': 1})
train_data['Graduated'] = train_data['Graduated'].map({
    
    'No': 0, 'Yes': 1})
train_data['Spending_Score'] = train_data['Spending_Score'].map({
    
    'Low': 0, 'Average': 1, 'High': 2})
train_data['Segmentation'] = train_data['Segmentation'].map({
    
    'A': 0, 'B': 1, 'C': 2, 'D': 3})

# 对Profession和Var_1进行独热编码
train_data = pd.get_dummies(train_data, columns=['Profession', 'Var_1'])

# 显示处理后的数据
train_data.head()

在这里插入图片描述

在上面的步骤中,我们对数据进行了以下预处理:

  1. 填充了缺失值:对于分类变量,我们使用了最常见的类别进行填充;对于数值变量,我们使用了中位数进行填充。

  2. 将分类变量转换为数值:对于二元分类变量,我们使用了0和1进行编码;对于多元分类变量,我们使用了独热编码。

接下来,我们将进行模型训练和预测。

2、使用随机森林进行预测

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

# 定义特征和目标变量
X = train_data.drop(['ID', 'Segmentation'], axis=1)
y = train_data['Segmentation']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建随机森林分类器
clf = RandomForestClassifier(n_estimators=100, random_state=42)

# 训练模型
clf.fit(X_train, y_train)

# 预测测试集
y_pred = clf.predict(X_test)

print(classification_report(y_test, y_pred))
              precision    recall  f1-score   support

           0       0.38      0.37      0.37       391
           1       0.36      0.34      0.35       369
           2       0.49      0.51      0.50       380
           3       0.63      0.65      0.64       474

    accuracy                           0.48      1614
   macro avg       0.46      0.47      0.47      1614
weighted avg       0.47      0.48      0.48      1614

从分类报告中,我们可以看到模型的整体准确率为48%,其中对于类别3的预测效果最好,准确率为63%,而对于其他类别的预测效果较差。

from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

# 计算混淆矩阵
cm = confusion_matrix(y_test, y_pred)

# 绘制混淆矩阵
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix for Random Forest Classifier')
plt.xlabel('Predicted Class')
plt.ylabel('True Class')
plt.show()

在这里插入图片描述

混淆矩阵是一种常用的模型评估工具,它可以帮助我们了解模型在各个类别上的预测效果。

从上图中,我们可以看到随机森林分类器在各个类别上的预测效果。对角线上的数字表示模型正确预测的数量,而非对角线上的数字表示模型预测错误的数量。

3、使用极端随机树进行预测

from sklearn.ensemble import ExtraTreesClassifier

# 创建极端随机树分类器
clf_ext = ExtraTreesClassifier(n_estimators=100, random_state=42)

# 训练模型
clf_ext.fit(X_train, y_train)

# 预测测试集
y_pred_ext = clf_ext.predict(X_test)

print(classification_report(y_test, y_pred_ext))
              precision    recall  f1-score   support

           0       0.37      0.38      0.37       391
           1       0.33      0.33      0.33       369
           2       0.48      0.47      0.47       380
           3       0.61      0.62      0.62       474

    accuracy                           0.46      1614
   macro avg       0.45      0.45      0.45      1614
weighted avg       0.46      0.46      0.46      1614
# 计算混淆矩阵
cm_ext = confusion_matrix(y_test, y_pred_ext)

# 绘制混淆矩阵
plt.figure(figsize=(8, 6))
sns.heatmap(cm_ext, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix for Extra Trees Classifier')
plt.xlabel('Predicted Class')
plt.ylabel('True Class')
plt.show()

在这里插入图片描述

从分类报告中,我们可以看到极端随机树分类器的整体准确率为46%,其中对于类别3的预测效果最好,准确率为61%,而对于其他类别的预测效果较差。

从混淆矩阵中,我们可以看到极端随机树分类器在各个类别上的预测效果,对角线上的数字表示模型正确预测的数量,而非对角线上的数字表示模型预测错误的数量。

4、使用支持向量机分类器进行预测

from sklearn.svm import SVC

# 创建支持向量机分类器
clf_svc = SVC(random_state=42)

# 训练模型
clf_svc.fit(X_train, y_train)

# 预测测试集
y_pred_svc = clf_svc.predict(X_test)

print(classification_report(y_test, y_pred_svc))
              precision    recall  f1-score   support

           0       0.39      0.47      0.43       391
           1       0.32      0.05      0.08       369
           2       0.41      0.64      0.50       380
           3       0.63      0.66      0.65       474

    accuracy                           0.47      1614
   macro avg       0.44      0.46      0.41      1614
weighted avg       0.45      0.47      0.43      1614
# 计算混淆矩阵
cm_svc = confusion_matrix(y_test, y_pred_svc)

# 绘制混淆矩阵
plt.figure(figsize=(8, 6))
sns.heatmap(cm_svc, annot=True, fmt='d', cmap='Blues')
plt.title('Confusion Matrix for Support Vector Machine Classifier')
plt.xlabel('Predicted Class')
plt.ylabel('True Class')
plt.show()

在这里插入图片描述

从分类报告中,我们可以看到支持向量机分类器的整体准确率为47%,其中对于类别3的预测效果最好,准确率为63%,而对于类别1的预测效果最差,准确率仅为32%。

从混淆矩阵中,我们可以看到支持向量机分类器在各个类别上的预测效果,对角线上的数字表示模型正确预测的数量,而非对角线上的数字表示模型预测错误的数量。

五、最后结论

根据上面的数据探索性分析结果以及后续采用三种不同的模型对潜在客户的分类预测的结果来看,我们不难得出以下的结论:

  1. 数据集包含了客户的多个特征,如性别、婚姻状况、年龄、是否拥有学位、职业、工作经验、消费评分、家庭规模和匿名分组等,这些特征可以帮助我们理解客户的行为和需求。
  2. 我们对数据进行了探索性数据分析,发现了一些有趣的模式和关系,例如,年龄和消费评分之间存在一定的关系,年龄较大的客户往往消费评分较高;拥有学位的客户的消费评分也往往较高。
  3. 我们使用了随机森林、极端随机树和支持向量机三种模型对客户进行分类预测,得到的整体准确率都在46%-47%之间。其中,随机森林和极端随机树在类别0和1上的预测效果较好,而支持向量机在类别2和3上的预测效果较好。
  4. 综合比较三种模型的预测结果,我们可以看到,虽然三种模型的整体准确率都在46%-47%之间,但是在各个类别上的预测效果却有所不同。这说明在实际应用中,我们可能需要根据不同的业务需求和目标,选择不同的模型进行预测。

猜你喜欢

转载自blog.csdn.net/qq_52417436/article/details/131517637
今日推荐