目录

背景描述

数据说明

 一:准备工作

二:数据预处理

三:数据可视化

四:建立RFM模型

五:建立K-Means算法

背景描述

本数据集汇集了某个电商平台的用户基本信息、行为习惯和互动数据。它包括用户的年龄、性别、居住地区、收入水平等基本属性,以及他们的兴趣偏好、登录频率、购买行为和平台互动等动态指标。
数据集关注的焦点在于电商领域,旨在通过用户行为的深入分析,揭示其偏好和需求。通过这些数据,商家能够更好地理解消费者,制定有效的市场策略,满足用户期望,推动业务发展。

数据说明

字段说明
User_ID每个用户的唯一标识符,便于追踪和分析。
Age用户的年龄,提供对人口统计偏好的洞察。
Gender用户的性别,使能性别特定的推荐和定位。
Location用户所在地区:郊区、农村、城市,影响偏好和购物习惯。
Income用户的收入水平,表明购买力和支付能力。
Interests用户的兴趣,如运动、时尚、技术等,指导内容和产品推荐。
Last_Login_Days_Ago用户上次登录以来的天数,反映参与频率。
Purchase_Frequency用户进行购买的频率,表明购物习惯和忠诚度。
Average_Order_Value用户下单的平均价值,对定价和促销策略至关重要。
Total_Spending用户消费的总金额,表明终身价值和购买行为。
Product_Category_Preference用户偏好的特定产品类别。
Time_Spent_on_Site_Minutes用户在电子商务平台上花费的时间,表明参与程度。
Pages_Viewed用户在访问期间浏览的页面数量,反映浏览活动和兴趣。
Newsletter_Subscription用户是否订阅了营销活动通知。

 一:准备工作

导入需要用到的包,设置绘图时的字体,防止绘图时出现乱码。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

 如果你在后续运行kmeans算法是出现一些提示,那你可以忽略这些提示。只需要在这里加入两句话。

import warnings

warnings.filterwarnings('ignore')

将这种类型的警告忽视就可以了。

二:数据预处理

data = pd.read_csv("D:/每周挑战/user_personalized_features.csv")
data = data.iloc[:,1:]
data.head()

先导入数据,由于直接导入会将数据集中的序号这一列一并导入,我们又不需要序号这一列,因此我们直接将其删除。

data.info()

查看其信息。

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 14 columns):
 #   Column                       Non-Null Count  Dtype 
---  ------                       --------------  ----- 
 0   User_ID                      1000 non-null   object
 1   Age                          1000 non-null   int64 
 2   Gender                       1000 non-null   object
 3   Location                     1000 non-null   object
 4   Income                       1000 non-null   int64 
 5   Interests                    1000 non-null   object
 6   Last_Login_Days_Ago          1000 non-null   int64 
 7   Purchase_Frequency           1000 non-null   int64 
 8   Average_Order_Value          1000 non-null   int64 
 9   Total_Spending               1000 non-null   int64 
 10  Product_Category_Preference  1000 non-null   object
 11  Time_Spent_on_Site_Minutes   1000 non-null   int64 
 12  Pages_Viewed                 1000 non-null   int64 
 13  Newsletter_Subscription      1000 non-null   bool  
dtypes: bool(1), int64(8), object(5)
memory usage: 102.7+ KB

正常来说, User_ID 这个数据对我们来说没有用,因此我们将其删除,Newsletter_Subscription这一列是布尔类型,因此我们将其转换为数值类型。

data = data.drop("User_ID",axis=1)
data['Newsletter_Subscription'] = data['Newsletter_Subscription'].replace({True:1,False:0})
data_ = data.copy()    # 方便后续建模

接下里我们对数据进行数据可视化,由于Newsletter_Subscription这一列只包含0,1,因此我们将其归到分类变量里进行绘图。

三:数据可视化

Numberical_Features = []
Classification_Features = []
data['Newsletter_Subscription'] = data['Newsletter_Subscription'].astype(object)

for i in data.columns:
    if data[i].dtype == object:
        Classification_Features.append(i)
    else:
        Numberical_Features.append(i)
        
print(Numberical_Features)
print(Classification_Features)
['Age', 'Income', 'Last_Login_Days_Ago', 'Purchase_Frequency', 'Average_Order_Value', 'Total_Spending', 'Time_Spent_on_Site_Minutes', 'Pages_Viewed']
['Gender', 'Location', 'Interests', 'Product_Category_Preference', 'Newsletter_Subscription']

接下来,我们对数值型特征绘制箱型图,对于分类特征我们对其的分布绘制条形图。

plt.figure(figsize=(20,15))
for colnum,col in enumerate(Numberical_Features):
    plt.subplot(2,4,colnum+1)
    sns.boxplot(data[col])
    plt.title(f"{col}特征箱型图")
    plt.tight_layout()
    
plt.show()

plt.figure(figsize=(15,8))

for colnum,col in enumerate(Classification_Features):
    gather = data[col].value_counts().reset_index()
    plt.subplot(2,3,colnum+1)
    sns.barplot(x=gather['index'],y=gather[col],palette=['#D9FFFD','#D7FFB9','#FAFFA3','#AEB1FF','#FFB0FB'])
    plt.title(f"{col}特征分布图")
    plt.tight_layout()
    
plt.show()

data.describe(include='all')

对数据可视化完后,我们可以从中得到什么信息 用户基本信息

年龄分布:

大多数用户的年龄集中在30岁到50岁之间,平均年龄为40.99岁。 性别分布:

男性用户占比52.6%,女性用户占比47.4%。 位置分布:

用户主要集中在郊区和城市,农村略少一些。 收入情况:

用户的收入水平分布较广,平均收入为81,304.73,标准差为37,363.97,收入范围为20,155到149,951。 兴趣分布:

用户的兴趣主要集中在体育和时尚,科技最少。 购物行为

购买频率:

用户的购买频率平均为4.63次,分布在0到9次之间。 平均订单价值分布:

用户下单的平均订单价值为104.04,分布在10到199之间。 总消费金额分布:

用户的总消费金额平均为2552.96,分布在112到4999之间。 产品类别偏好分布:

用户的产品类别偏好主要集中在服装、电子产品和书籍。 网站使用情况

上次登录以来天数:

用户上次登录以来的天数平均为15.59天,分布在1到29天之间。 在网站上花费时间:

用户在网站上花费的时间平均为297.36分钟,分布在2到599分钟之间。 浏览页面数量:

用户浏览的页面数量平均为24.40,分布在1到49页之间。 营销活动通知订阅情况:

约50.7%的用户订阅了营销活动通知,49.3%的用户未订阅。

最后我们对数据进行建模,这里我们用到了电商中常用的模型 在电子商务领域,对客户进行精准分类是实现个性化营销和提高客户满意度的关键步骤。以下是电商数据中对客户进行分类,经常用什么模型的详细分析:

RFM模型

最近购买时间:衡量客户最后一次购买距今的时间长度。这个指标可以反映客户的活跃程度,最近购买时间越短,表明客户越活跃。 购买频次:指客户在一定时间内购买的次数。购买频次越高,说明客户对品牌的忠诚度和依赖度可能越高。 消费金额:客户在一定时间内的总消费金额。通常,消费金额较高的客户对公司的贡献度也较大。 聚类分析算法

k-means算法:这是一种基于划分的聚类算法,通过计算数据点与中心点之间的距离来将数据分为不同的簇。k-means算法简单、高效,适合处理大规模的数据集。在电商领域,k-means可以用来识别具有相似购买行为的客户群体。 DBSCAN算法:这是一种基于密度的聚类算法,能够识别出任意形状的簇,并且可以发现噪声点。DBSCAN算法适用于那些簇的密度不均匀,或者簇的形状不规则的情况。

层次聚类算法:这种算法不需要预先指定簇的数量,它可以构建一个层次的树状结构来表示数据。层次聚类适合于需要探索数据内在层次结构的情况。

决策树算法

易于理解:决策树模型的结构清晰,便于业务人员理解和解释。 分类规则:决策树通过一系列的规则对数据进行分类,这些规则基于数据特征的不同取值。 适用性广泛:决策树既可以处理离散型数据,也可以处理连续型数据,适用于多种类型的数据集。

关联规则学习

市场篮子分析:通过分析顾客的购买模式,找到经常一起被购买的商品组合,从而为交叉销售或产品推荐提供依据。 支持度和置信度:关联规则学习依赖于支持度和置信度两个指标来评估规则的强度,帮助商家确定哪些商品组合更有可能被顾客一起购买。 神经网络模型

深度学习:

神经网络模型,尤其是深度学习模型,能够学习数据中的复杂非线性关系。 特征学习:神经网络可以自动学习数据的高级特征,这对于处理高维和未加工的原始数据特别有用。 集成学习方法

提升性能:集成学习方法通过结合多个模型的预测结果来提高整体的分类准确性。 减少偏差:集成学习方法可以减少单个模型的偏差,提高模型的泛化能力。

这里我们使用决策树,RFM模型,K-Means算法,这里暂且用不到关联规则,所以我们先不用,至于深度学习/神经网络等我们后面会讲。

四:建立RFM模型

# 计算RFM分数
data_['Recency_Score'] = pd.qcut(data_['Last_Login_Days_Ago'], 5, labels=False, duplicates='drop') + 1
data_['Frequency_Score'] = pd.qcut(data_['Purchase_Frequency'].rank(method='first'), 5, labels=False, duplicates='drop') + 1
data_['Monetary_Score'] = pd.qcut(data_['Total_Spending'], 5, labels=False, duplicates='drop') + 1


def RFM_Group(df):
    if df['Frequency_Score'] >= 4 and df['Monetary_Score'] >= 4 and df['Recency_Score'] >= 4:
        return '重要价值客户'
    elif df['Frequency_Score'] >= 4 and df['Monetary_Score'] < 4 and df['Recency_Score'] >= 4:
        return '重要保持客户'
    elif df['Frequency_Score'] < 4 and df['Monetary_Score'] >= 4 and df['Recency_Score'] >= 4:
        return '重要发展客户'
    elif df['Frequency_Score'] < 4 and df['Monetary_Score'] >= 4 and df['Recency_Score'] < 4:
        return '重要挽留客户'
    elif df['Frequency_Score'] >= 4 and df['Monetary_Score'] < 4 and df['Recency_Score'] < 4:
        return '一般价值客户'
    elif df['Frequency_Score'] >= 4 and df['Monetary_Score'] < 4 and df['Recency_Score'] < 4:
        return '一般保持客户'
    elif df['Frequency_Score'] < 4 and df['Monetary_Score'] < 4 and df['Recency_Score'] >= 4:
        return '一般发展客户'
    else:
        return '一般挽留客户'
data_['Customer_Segment'] = data_.apply(RFM_Group, axis=1)
data_['Customer_Segment'].value_counts()
一般挽留客户    322
重要挽留客户    140
一般价值客户    139
一般发展客户    135
重要保持客户     99
重要发展客户     98
重要价值客户     67
Name: Customer_Segment, dtype: int64

根据RFM分类的客户特征我们可以制定一些策略:

一般挽留客户: 这类客户占比较大的比例,他们的购买频率和总消费金额较低,且最近登录时间较久。这表明他们可能是不活跃用户或有流失的风险。

营销策略:

重新激活活动: 通过邮件或短信发送重新激活的特别优惠或礼品,以激发他们的兴趣。 问卷调查: 邀请他们参与问卷调查,了解他们的需求和偏好,进行有针对性的改善。 唤醒邮件: 发送唤醒邮件,提醒他们平台的优势和新活动,以吸引他们重新参与。 重要挽留客户: 这些客户的总消费金额较高,但最近登录时间较久,可能流失的风险较大。

营销策略:

唤醒活动: 通过邮件或短信提醒他们未登录的时间,并提供特别的回馈礼物或优惠。 优惠券: 发送高价值的优惠券,鼓励他们重新回到平台购买。 客户关怀: 进行电话回访或关怀问候,了解他们未登录的原因并提供帮助。 一般价值客户: 用户的购买频率较高,但总消费金额较低,最近登录时间较久。

营销策略:

捆绑销售: 提供捆绑销售或满减优惠,鼓励他们增加购买金额。 新品促销: 推广高价值新品,吸引他们尝试购买。 忠诚计划: 设计简单易行的忠诚计划,增加他们的粘性。 一般发展客户: 这些是最近登录但购买频率和总消费金额较低的新客户,需要进一步培育。

营销策略:

首次购买优惠: 提供首次购买优惠,鼓励他们下单。 新手指南: 提供详细的新手购物指南和平台介绍,帮助他们熟悉平台。 会员福利: 介绍会员福利,鼓励他们注册成为会员。 重要保持客户: 这些用户的购买频率较高,最近登录时间较短,但总消费金额较低,保持忠诚度较高。

营销策略:

频繁沟通: 通过邮件、短信等方式定期与他们沟通,提供最新的产品信息和优惠活动。 累积积分: 鼓励他们通过累积积分来获得奖励和优惠。 会员活动: 组织会员专属活动,增强客户的参与感。 重要发展客户: 这些用户的总消费金额较高,最近登录时间较短,但购买频率较低,有潜力成为忠实客户。

营销策略:

促销活动: 针对他们设计促销活动,鼓励他们更多地进行购买。 新品推荐: 及时通知他们新品上市的信息,并提供试用装或特别优惠。 个性化服务: 根据他们的偏好提供个性化的服务和推荐。 重要价值客户: 这些是最有价值的客户,他们的购买频率、总消费金额和最近登录时间都很高,是需要重点维护和优待的客户。

营销策略:

个性化推荐: 根据他们的兴趣和购买历史推荐高价值的产品。 VIP 优惠: 提供专属优惠、折扣和奖励计划。 优先客服: 为他们提供优先客服和售后服务。 忠诚计划: 设计特别的忠诚计划,增加他们的归属感。

五:建立K-Means算法

# 这个是使用标签化
le = LabelEncoder()
for i in data_.columns:
    data_[i] = le.fit_transform(data_[i])
    
#  这个是使用独热编码
# data_.drop(columns=['Last_Login_Days_Ago', 'Purchase_Frequency', 'Total_Spending','Customer_Segment'],inplace=True)
# data_['Gender'] = data_['Gender'].map({'Male': 0, 'Female': 1})
# data_ = pd.get_dummies(data_,columns=['Location','Interests','Product_Category_Preference']).astype('int')
# 两种方法大家都可以用,使用独热编码下面在绘制不同类型人时记得换特征名称 

sc = StandardScaler()
features = ['Age', 'Income','Average_Order_Value','Time_Spent_on_Site_Minutes','Pages_Viewed','Recency_Score','Frequency_Score','Monetary_Score',]
data_[features] = sc.fit_transform(data_[features])
data_

对数据处理后,我们来确定K-means的聚类点数,前面我的文章说过,K-means算法聚类点数,我们可以使用枚举法和手肘法。

sil = []
for k in range(2,20):
    kmeans = KMeans(n_clusters=k)
    kmeans.fit(data_)
    sil.append(silhouette_score(data_,kmeans.labels_))
    
sse = []
for k in range(2,20):
    kmeans = KMeans(n_clusters=k,n_init=10)
    kmeans.fit(data_)
    sse.append(kmeans.inertia_)

fig,ax = plt.subplots(1,2,figsize=(10,8))
ax[0].plot(range(2,20),sil)
ax[0].scatter(range(2,20),sil,color="red")
ax[0].set_title("枚举法图")

ax[1].plot(range(2,20),sse)
ax[1].scatter(range(2,20),sse,color="red")
ax[1].set_title("手肘法图")

plt.tight_layout()
plt.show()

从图中可以看出理想的k值应该是7或者8,这里我感觉8更好一点,我感觉12也可以,这里我选8.(独热编码) 标签化的话理想k值应该是6,7,这里我选7(标签化) 如果你不知道选什么,那你就看手肘法,不看枚举法,手肘发拐点就是最好的。

kmeans_ = KMeans(n_clusters=7)
kmeans_.fit_transform(data_)
# 获取聚类标签
customer_labels = kmeans_.labels_
data_['classify'] = customer_labels

最后我们分析一下这六类人在不同特征上有什么区别。

# 我使用了标签化,如果你使用的是独热编码,记得换绘图的名称,因为你前面将部分列删除了

plt.figure(figsize=(24,15))
for colnum,col in enumerate(Numberical_Features):
    plt.subplot(2,4,colnum+1)
    sns.boxplot(x=data_['classify'],y=data_[col])
    plt.title(f"关于{col}特征六类人的箱型图")
    plt.tight_layout()
    
plt.show()

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐