用数据科学技术,分析用户产品倾向

用数据科学技术,分析用户产品倾向

在所有商业营销策略中,公司的首要任务始终是为产品吸引正确的受众群体,从而提高销售额、降低营销费用。

本文的数据集用于分析公司理想客户,了解在财务方面对公司产品和服务采取何种行动:https://www.kaggle.com/imakash3011/customer-personality-analysis
如果你想了解更多数据分析相关内容,可以阅读以下这些文章:
数据分析师需要知道的10个Excel函数
新兴报表工具FineReport——商业分析师需要知道的三种报表
数字营销是怎样通过数据分析赚钱的?
三个必备高级分析方法,了解你的客户

为此,今天我将讨论分析数据组的方法,以实现我们的目标,即吸引正确的受众群体。

我们一步一步,实现深入了解

  • 1. 导入我们想要使用的库
  • 2. 数据设计
  • 3. 导入数据集
  • 4. 数据清洗

导入我们想要使用的库

from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

数据设计

我们的数据集由 29 列、 2240 行的属性组成。

数据属性可以分为以下几类:

在这篇文章中,我们将把重点放在这 5 个主要因素:

  • Education:客户的教育程度
  • Marital_Status:客户的婚姻状况
  • Income:客户的家庭年收入
  • Dt_Customer:客户在公司注册的日期
  • MntWines:过去两年在红酒上的消费金额

目标

主要目标是将集群应用至获取某些产品的客户行为。

导入数据集

all_data = pd.read_csv("../input/customer-personality-analysis/marketing_campaign.csv", sep="\t")

数据清洗

查看数据信息

all_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2240 entries, 0 to 2239
Data columns (total 29 columns):
 #   Column               Non-Null Count  Dtype  
---  ------               --------------  -----  
 0   ID                   2240 non-null   int64  
 1   Year_Birth           2240 non-null   int64  
 2   Education            2240 non-null   object 
 3   Marital_Status       2240 non-null   object 
 4   Income               2216 non-null   float64
 5   Kidhome              2240 non-null   int64  
 6   Teenhome             2240 non-null   int64  
 7   Dt_Customer          2240 non-null   object 
 8   Recency              2240 non-null   int64  
 9   MntWines             2240 non-null   int64  
 10  MntFruits            2240 non-null   int64  
 11  MntMeatProducts      2240 non-null   int64  
 12  MntFishProducts      2240 non-null   int64  
 13  MntSweetProducts     2240 non-null   int64  
 14  MntGoldProds         2240 non-null   int64  
 15  NumDealsPurchases    2240 non-null   int64  
 16  NumWebPurchases      2240 non-null   int64  
 17  NumCatalogPurchases  2240 non-null   int64  
 18  NumStorePurchases    2240 non-null   int64  
 19  NumWebVisitsMonth    2240 non-null   int64  
 20  AcceptedCmp3         2240 non-null   int64  
 21  AcceptedCmp4         2240 non-null   int64  
 22  AcceptedCmp5         2240 non-null   int64  
 23  AcceptedCmp1         2240 non-null   int64  
 24  AcceptedCmp2         2240 non-null   int64  
 25  Complain             2240 non-null   int64  
 26  Z_CostContact        2240 non-null   int64  
 27  Z_Revenue            2240 non-null   int64  
 28  Response             2240 non-null   int64  
dtypes: float64(1), int64(25), object(3)
memory usage: 507.6+ KB

检查 NuLL 值,并删除这些值

all_data = all_data.dropna()
all_data.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 2216 entries, 0 to 2239
Data columns (total 29 columns):
 #   Column               Non-Null Count  Dtype  
---  ------               --------------  -----  
 0   ID                   2216 non-null   int64  
 1   Year_Birth           2216 non-null   int64  
 2   Education            2216 non-null   object 
 3   Marital_Status       2216 non-null   object 
 4   Income               2216 non-null   float64
 5   Kidhome              2216 non-null   int64  
 6   Teenhome             2216 non-null   int64  
 7   Dt_Customer          2216 non-null   object 
 8   Recency              2216 non-null   int64  
 9   MntWines             2216 non-null   int64  
 10  MntFruits            2216 non-null   int64  
 11  MntMeatProducts      2216 non-null   int64  
 12  MntFishProducts      2216 non-null   int64  
 13  MntSweetProducts     2216 non-null   int64  
 14  MntGoldProds         2216 non-null   int64  
 15  NumDealsPurchases    2216 non-null   int64  
 16  NumWebPurchases      2216 non-null   int64  
 17  NumCatalogPurchases  2216 non-null   int64  
 18  NumStorePurchases    2216 non-null   int64  
 19  NumWebVisitsMonth    2216 non-null   int64  
 20  AcceptedCmp3         2216 non-null   int64  
 21  AcceptedCmp4         2216 non-null   int64  
 22  AcceptedCmp5         2216 non-null   int64  
 23  AcceptedCmp1         2216 non-null   int64  
 24  AcceptedCmp2         2216 non-null   int64  
 25  Complain             2216 non-null   int64  
 26  Z_CostContact        2216 non-null   int64  
 27  Z_Revenue            2216 non-null   int64  
 28  Response             2216 non-null   int64  
dtypes: float64(1), int64(25), object(3)
memory usage: 519.4+ KB

正如我们所见,在删除 NaN 后,我们得到了 2216 个条目,而不是最开始的 2240 个条目

但是,有些值和它的数据类型不兼容,例如:

  • 1. Education,即分类数据,其数据类型为对象。
  • 2. Dt_Customer 必须是 DateTime 字段。

重命名列为更直观的名称

all_data = all_data.rename(columns={
'MntWines': 'Amount_Wines', 
'MntFruits': 'Amount_Fruits',
'MntMeatProducts': 'Amount_Meat',
'MntFishProducts': 'Amount_Fish', 
'MntSweetProducts': 'Amount_Sweet', 
'MntGoldProds': 'Amount_Gold'
})

解析客户在公司注册的日期 (Dt_Customer)

all_data['Dt_Customer'] = pd.to_datetime(all_data['Dt_Customer'])

目前,Dt_Customer 的数据类型为 DateTime

7   Dt_Customer          2216 non-null   datetime64[ns]

将数据转换为更简单的类别

例如,如果我们查看 Education 字段值,我们将查看可以轻松将数据分为 3 大类的人员:

  • Basic 和 2n Cycle 被视为一类(本科生)
  • 毕业被视为一类(毕业生)
  • 硕士和博士被视为一类(研究生)
all_data['Education'].value_counts()
Graduation    1116
PhD            481
Master         365
2n Cycle       200
Basic           54
Name: Education, dtype: int64

更改之后,我们可以轻松将其应用其中:

all_data["Education"]=all_data["Education"].map({
"Basic" : "Undergraduate",
"2n Cycle" : "Undergraduate",
"Graduation" : "Graduate",
"Master" : "Postgraduate",
"PhD" : "Postgraduate"
})
all_data['Education'].value_counts()
Graduate         1116
Postgraduate      846
Undergraduate     254
Name: Education, dtype: int64

找到每个客户的注册天数

all_data['Enrolled_Time'] = '01-01-2015' #assuming we are starting counting from the new year
all_data['Enrolled_Time'] = pd.to_datetime(all_data.Enrolled_Time)
all_data['Enrolled_Days_Amount'] = (all_data['Enrolled_Time'] - all_data['Dt_Customer']).dt.days

我们可以做一些绘图

plt.figure(figsize=(20, 7)) #width:20, height:7
plt.bar(all_data['Year_Birth'], all_data['Enrolled_Days_Amount'], color ='purple',
        width = 0.8)
plt.xlabel("Year of Birth")
plt.ylabel("Number of Enrolled Days")
plt.show()

标准化数据

这一步将帮助我们消除对具有较高值的较高字段与较小字段的偏差,因此我会标准化数据,重新缩放数据的概念,使其均值为 0,标准差为 1(单位方差)

for i in all_data.select_dtypes(exclude='object').columns:
    all_data.loc[:, i] = StandardScaler().fit_transform(np.array(all_data[[i]]))

把数据建模成不同的集群

选择集群数量

#taking into consideration the (income) and (amount of wine)
X=all_data.iloc[:, np.array([4, 9])].values
wcss=[]
for i in range(1,11): 
     kmeans = KMeans(n_clusters=i, init ='k-means++', max_iter=300,  n_init=10,random_state=0 )  
     kmeans.fit(X)
     wcss.append(kmeans.inertia_)
plt.plot(range(1,11),wcss)
plt.title('The Elbow Method Graph')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()
#we will take 5 clusters

kmeans = KMeans(n_clusters=5, init =’k-means++’, max_iter=300, n_init=10, random_state=0 )
y_kmeans = kmeans.fit_predict(X)
plt.scatter(X[y_kmeans==0, 0], X[y_kmeans==0, 1], s=2, c='red', label ='Cluster 1')
plt.scatter(X[y_kmeans==1, 0], X[y_kmeans==1, 1], s=2, c='blue', label ='Cluster 2')
plt.scatter(X[y_kmeans==2, 0], X[y_kmeans==2, 1], s=2, c='green', label ='Cluster 3')
plt.scatter(X[y_kmeans==3, 0], X[y_kmeans==3, 1], s=2, c='cyan', label ='Cluster 4')
plt.scatter(X[y_kmeans==4, 0], X[y_kmeans==4, 1], s=2, c='magenta', label ='Cluster 5')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=100, c=’yellow’, label = ‘Centroids’)
plt.title(‘Clusters of Customers’)
plt.xlabel(‘Income’)
plt.ylabel(‘Amount of Wine’)
plt.show()

黄点是每个集群的质心

最后,我们可以从以上用例中得出一个结论,随着客户收入的增加,在红酒上的支出也会增加,除了有些异常值(例如收入为 666666 的人)。这部分人的收入更高,同时支出也更高。

感谢您的阅读,让我们一起进步!你还可以订阅我们的YouTube频道,观看大量数据科学相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/

原文作者:Amjad EI Baba
翻译作者:Lia
美工编辑:过儿
校对审稿:Jiawei Tong
原文链接:https://medium.com/@amjad.baba913/applying-data-analysis-regarding-customers-personality-53ffabd338eb