Python数据分析项目:用户购买行为深度解析与个性化推荐预测研究

一.项目简介

        本项目采用Python+机器学习对数据集进行分析,最后通过Tableau对处理后的数据进行可视化

二.数据来源与说明

数据集来自kaggle平台,链接:某电商平台用户数据

本数据集汇集了某个电商平台的用户基本信息、行为习惯和互动数据。它包括用户的年龄、性别、居住地区、收入水平等基本属性,以及他们的兴趣偏好、登录频率、购买行为和平台互动等动态指标。数据说明如下:

排序 字段 备注
1 User lD 每个用户的唯一标识符,便于追踪和分析
2 Age 用户的年龄,提供对人口统计偏好的洞察,
3 Gender 用户的性别,使能性别特定的推荐和定位。
4 Location 用户所在地区:郊区、农村、城市,影响偏好和购物习惯。
5 income 用户的收入水平,表明购买力和支付能力。
6 Interests 用户的兴趣,如运动、时尚、技术等,指导内容和产品推荐
7 Last Login_Days_Ago 用户上次登录以来的天数,反映参与频率
8 Purchase Frequency 用户进行购买的频率,表明购物习惯和忠诚度
9 Average Order Value 用户下单的平均价值,对定价和促销策略至关重要。
10 Total Spending 用户消费的总金额,表明终身价值和购买行为。
11 Product_Category_Preference 用户偏好的特定产品类别。
12 Time_Spent on Site Minutes 用户在电子商务平台上花费的时间,表明参与程度
13 Pages_Viewed 用户在访问期间浏览的页面数量,反映浏览活动和兴趣。
14 Newsletter Subscription 用户是否订阅了营销活动通知。

三.研究问题

        对用户进行购买行为分析

        进行RFM分析

        对用户活跃度进行分析

        进行个性化推荐预测

四.数据预处理

1.数据导入

import pandas as pd
import numpy as np
location=r'C:\Users\ZMQ\Desktop\user_personalized_features.csv'
data=pd.read_csv(location)
print(data.head)
#查看数据的前五行

2.查看字段类型

# 查看各字段信息,并输出字段,字段类型等,最后输出各种类型的数量
print(data.info())

3.数据清洗

1)删除多余列

#删除多余列
data.drop('Unnamed: 0',axis=1,inplace=True)
#注释:Unnamed和0之间有空格,axis=1即为列删除
print(data.head())

2)数据去重

#对数据去重
data.drop_duplicates(subset=None,inplace=True)

3)过滤无效的值

data=data[data['Income']>0]

4)删除缺失值

#删除缺失值
data.dropna(subset=None,how='any',axis=0,inplace=True)
#注释:对所有列处理,只要一行有缺失值就删除这行

五.数据分析

1. 购买行为分析

  • 分析购买频率、平均订单价值、总消费金额的分布。
  • 探索不同用户群体(如不同性别、地区、年龄段)的购买行为差异。
  • 识别高价值用户和低价值用户。
  • #1.购买行为分析
    purchase_by_gender=data.groupby('Gender').agg(
        avg_purchase_freq=('Purchase_Frequency','mean'),
        total_spending=('Total_Spending','sum')
    ).reset_index()
    print(purchase_by_gender)
    
    #按地区统计总消费
    spend_by_location=data.groupby('Location')['Total_Spending'].sum().reset_index()
    print(spend_by_location)

     

    2.RFM分析

    1)RFM模型介绍

            RFM模型是衡量客户价值和客户创利能力的重要工具和手段,该模型通过一个客户的最近一次消费时间,消费频率,消费金额三项指标来描述该客户的价值情况,在电商领域,RFM模型可以帮助企业了解客户的购买行为和购买偏好,从而识别高价值顾客,潜在回头客或者低活跃用户,这有助于电商企业定制个性化的营销策略。

    RFM模型通过三个关键指标来描述客户的价值状况,这三个指标分别为:

  • R(Recency):最近一次消费时间。它表示用户最后一次下单时间距今天有多长时间。这个指标与用户流失和复购直接相关,如果客户最近消费过,那么他们更有可能再次消费。
  • F(Frequency):消费频率。它表示用户在固定的时间段内消费了多少次。这个指标反映了用户的消费活跃度,消费频率越高的客户,对商家的忠诚度通常也越高。
  • M(Monetary):消费金额。它表示用户在固定的周期内在平台上花费了多少钱。这个指标直接反映了用户对公司贡献的价值,消费金额越高的客户,通常被认为价值越大。
  • 这三个指标共同构成了RFM模型,帮助商家更好的理解额评估客户的价值,从而制定更加精准的营销策略,提高客户留存率,促进客户消费,最终实现业务的增长。同时,通过RFM模型,企业可以将客户进行细分,针对不同群体的客户采取不同的营销策略,实现精准营销

    2)RFM分析实现

  • RFM计算:最近一次登录、购买频率、总消费金额。
  • 用户分群:高价值客户、潜力客户、一般客户、流失风险客户。
  • 3)对数据进行分类

    替换列名
    #Recency:最近一次登录的天数(越小越好)
    #Frequency:购买频率(越大越好)
    #Monetary:总消费金额(越大越好)
    rfm = data[["User_ID", "Last_Login_Days_Ago", "Purchase_Frequency", "Total_Spending"]]
    rfm.columns = ["User_ID", "Recency", "Frequency", "Monetary"]
    #注释:这里是将原表的列名进行替换
    print(rfm.head())
    数据复制

    在pandas里,当你对一个DataFrame进行切片操作后得到的对象,可能是原DataFrame的视图(view),而非独立的副本(copy)。视图是对原数据的一种引用,对视图进行赋值等修改操作时,会出现一些难以预期的情况。

    rfm = rfm.copy()这行代码通过创建独立副本,确保后续对rfm的修改操作清晰明确,避免了在对DataFrame切片进行赋值等操作时出现的警告和潜在的数据不一致问题。

    rfm=rfm.copy()
    #注释:为避免A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
    
    a.对Recency分箱评分
    #a.对Recency进行分箱(越小分数越高)
    #定义分箱阈值(示例:根据业务需要调整)
    recency_bins=[0,7,14,21,28,float('inf')] #设置边界值
    recency_labels=[5,4,3,2,1] #对应的分数
    #分箱处理,1-5分,5分为最佳
    rfm['R_score']=0
    #注释:这里是新建'R_score'一列
    for i in range(len(recency_bins)-1):
        lower=recency_bins[i]
    #注释:将recency_bins[i]作为下限赋值为lower
        upper=recency_bins[i+1]
    # 注释:将recency_bins[i+1]作为上限赋值为upper
        rfm.loc[(rfm['Recency']>lower) & (rfm['Recency'] <= upper),'R_score']=recency_labels[i]
    #将原表中的Recency中在此区间的数据在R_score列赋值为recency_labels[i]
    print(rfm.head())

    b.对Frequency分箱评分
    #b.对Frequency进行分箱(越大得分越高)
    #定义分箱阈值(示例:根据业务需要调整)
    frequency_bins = [0, 2, 4, 6, 8, float('inf')]  # 边界值
    frequency_labels = [1, 2, 3, 4, 5]             # 对应分数
    rfm["F_Score"] = 0
    for i in range(len(frequency_bins) - 1):
        lower = frequency_bins[i]
        upper = frequency_bins[i+1]
        rfm.loc[(rfm["Frequency"] > lower) & (rfm["Frequency"] <= upper), "F_Score"] = frequency_labels[i]
    print(rfm.head())

    c.对Monetary分箱评分
    # c. Monetary 分箱评分(越大得分越高)
    monetary_bins = [0, 1000, 2000, 3000, 4000, float('inf')]  # 边界值
    monetary_labels = [1, 2, 3, 4, 5]                         # 对应分数
    
    rfm["M_Score"] = 0
    for i in range(len(monetary_bins) - 1):
        lower = monetary_bins[i]
        upper = monetary_bins[i+1]
        rfm.loc[(rfm["Monetary"] > lower) & (rfm["Monetary"] <= upper), "M_Score"] = monetary_labels[i]
    print(rfm.head())

    d.客户分类
    #d.用户分类
    rfm["RFM_Score"] = rfm["R_Score"] + rfm["F_Score"] + rfm["M_Score"]
    rfm["Segment"] = "客户类别"
    rfm.loc[rfm["RFM_Score"] >= 6, "Segment"] = "一般客户"
    rfm.loc[rfm["RFM_Score"] >= 9, "Segment"] = "潜力客户"
    rfm.loc[rfm["RFM_Score"] >= 12, "Segment"] = "高价值客户"
    rfm.loc[rfm["RFM_Score"] < 6, "Segment"] = "流失风险客户"
    print(rfm.head())

    3.用户活跃度分析

    要求:

    1.高活跃用户:最近七天内登录且网站停留时间>=300分钟

    2.低活跃用户:超过30天为登录且停留时间<100分钟

    3.普通用户:不满足以上条件的用户

    # 3. 用户活跃度分析
    data["Active_Status"] = "普通用户"
    data.loc[(data["Last_Login_Days_Ago"] <= 7) & (data["Time_Spent_on_Site_Minutes"] >= 300), "Active_Status"] = "高活跃用户"
    data.loc[(data["Last_Login_Days_Ago"] > 30) & (data["Time_Spent_on_Site_Minutes"] < 100), "Active_Status"] = "低活跃用户"
    print(data)
    

    4.个性化预测(K-相邻模型)

    个性化预测可采用机器学习模型,根据用户的兴趣和产品类型偏好,预测他们可能感兴趣的其他产品类别

    做法:将用户兴趣和产品偏好转换为数值特征

    #查找用户特征之间的最近邻
    from sklearn.neighbors import NearestNeighbors
    #注释:NearestNeighbors 是一个无监督学习算法,用于在特征空间中查找最近邻样本
    # 构建用户特征矩阵(兴趣 + 产品偏好)
    user_features = pd.get_dummies(data[["Interests", "Product_Category_Preference"]])
    #注释:用于将分类变量转换为哑变量(也称为独热编码)。
    #注释:独热编码会为每个分类变量的每个可能取值创建一个新的二进制列,其中 1 表示该样本具有该取值,0 表示不具有。
    #注释:通过这种方式,将分类数据转换为适合机器学习算法处理的数值数据。
    model = NearestNeighbors(n_neighbors=5)
    #注释:n_neighbors=5 是一个参数设置,表示在查找最近邻时,每个样本要找出 5 个最近的邻居。
    model.fit(user_features)
    #注释:使用 fit() 方法对模型进行训练,让模型学习 user_features 数据集中的样本分布。
    #为每个用户推荐相似兴趣的Top 5商品类别
    _, indices = model.kneighbors(user_features)
    #注释:model.kneighbors() 方法用于查找每个样本的最近邻。
    #注释:它返回两个数组:第一个数组是每个样本到其最近邻的距离,这里用下划线_表示不使用该数组;
    #注释:第二个数组 indices 是每个样本的最近邻在原始数据集中的索引。
    data["Recommended_Category"] = [data.iloc[i]["Product_Category_Preference"].mode()[0] for i in indices]
    #注释:这里通过一个循环遍历 indices 数组。
    #注释:对于每个样本的最近邻索引 i,使用 df.iloc[i] 选取这些最近邻对应的行,然后提取 Product_Category_Preference 列的数据。
    #注释:mode() 方法用于找出这些数据中的众数(出现次数最多的值)。
    #注释:如果众数存在,就将其添加到 recommended_categories 列表中;若不存在众数(即 mode_result 为空),则添加 None 到列表中。

    5.导出数据

    # 保存结果供Tableau可视化
    data.to_csv(r"C:\Users\ZMQ\Desktop\cleaned_user_data11.csv", index=False)
    rfm.to_csv(r"C:\Users\ZMQ\Desktop\rfm_segments.csv", index=False)
    #注释:index=False说明导出的数据中不包含DataFrame的索引列

    六.数据可视化

    1.数据集的导入和连接

    1.由于该数据为csv文件,因此导入时Tableau,要选择'文本文件'。

    2.要将两个表进行连接,其中桥梁就是User_ID

    2.图形可视化

    1.地区总消费金额图(水平条形图)

    分析:不同性别的不同客户的在不同的地区的总消费金额情况

    用到:'Gender','Segment','Location','Active Status','Total Spending'

    步骤:

    1.将'Total Spending'拖到列,'Location'拖到行

    2.将'Active Status'拖至颜色,对用户进行区分

    3.将'Gender','Segment'拖至筛选器,并右击后,点'运用于工作表'-点 '使用相关数据源的所有项'

    2.购买评论分析(性别)(水平条形图)

    分析:不同地区的不同性别的总消费金额情况

    用到:'Location','Total Spending','Gender'

    步骤:

    1.将'Total Spending'拖到列,'Location'拖到行

    2.将'Gender'拖至颜色,对性别进行区分

    3.兴趣组VS产品类别偏好(热力图)

    分析:不同兴趣下不同产品类别偏好下用户Id的计数

    用到:'Product Category Preference','Interests','User_ID'

    步骤:

    1.将'Product Category Preference'拖到列,'Interests'拖到行

    2.将'Interests'放入筛选器,对兴趣进行筛选

    3.将'User_ID'放到颜色上,后,右击'User_ID'-度量-计数(此处是将'User_ID'转变为度量进行计数),复制'User_ID'拖到标签里面,最后标记选方形

    4.用户分群占比图(环形图)

    分析:不同用户分类下的用户ID数占比
    用到:'Segment','User_ID'

    步骤:

    1.将'Segment'拖到颜色,标记选饼图,将'User_ID'拖到角度,右击'User_ID'-度量-计数(此处是将'User_ID'转变为度量进行计数)

    2.将按住Shift将标记中的'Segment','User_ID'分别拖到标签,右击标签的'User_ID'-快速表计算=合计百分比

    3.在行中双击输入两个0,生成两个图形,后点双轴,将下个图层设置都去掉并设置白色,将上个图层放大

    4.点0轴,取消显示显示标题,右击零值线,将零值线设为无

    5.活跃用户占比图(环形图)

    分析:不同活跃用户的的用户ID数占比

    用到:'User_ID','Active Status'

    步骤:

    1.将上个图进行拷贝
    2.将上个图中所有'Segment'都替换成'Active Status'

    6.不同收入用户情况分布(直方图)

    分析:不同收入下,不同活跃用户的计数情况

    用到:'Income','User_ID','Active Status'

    步骤:

    1.创建数据桶:选择Income,右击-创建-数据桶,数据桶大小为5000

    2.将'Income(数据桶)'拖到列,'Use_ID'拖到行,并转换为计数类型

    3.将'Active Status'拖到颜色

    7.兴趣-收入-消费关系图(面积图)

    分析:随着收入的增加,不同兴趣的总消费金额的变化
    用到:'Income(数据桶)','Total Spending','Interests'

    步骤:

    1.将'Income(数据桶)'拖入列,'Total Spending'拖入行

    2.'Interests'拖入颜色,进行区分,将'Interests'拖入颜色,标记变为区域

    8.推荐商品类别(词云图)

    分析:分析推荐商品类别的词云图(无轴图形)
    用到:'User_ID','Recommended Category' 

    步骤:

    1.创建字段:推荐频率=count([User_ID])

    2.将'Recommended Category' 拖到文本,将'推荐频率'拖到颜色卡,复制'推荐频率'拖到大小,标记中选择文本

    9.年龄-收入-平均消费图(面积图)

    分析:随着年龄的增长,根据商品类别偏好的不同,分析收入和平均消费的情况

    用到:'Age','Product Category Preference','Average Order Value','Income'

    步骤:

    1.将'Age'拖入行,并转为维度,'Income','Average Order Value'分别放入列,并点双轴

    2.在标记中选择全部,将'Product Category Preference'放入颜色卡,标记选择区域

    3.仪表盘的搭建

    对之前做的表进行拖拽,设置字体,颜色,这里就不操作了,可以自己操作

    七.总结与建议

    1.关键发现

  • 高价值客户集中在一线城市(Urban),偏好电子产品和服饰。
  • 女性用户平均购买频率比男性高15%,但男性总消费金额更高。
  • 流失风险客户中,60%超过30天未登录,且停留时间低于100分钟。
  • 2. 行动建议

  • 定向营销:向高价值客户推送高端电子产品限时折扣。
  • 召回策略:对流失风险客户发送“回归奖励”(如优惠券)。
  • 动态推荐:在首页根据用户兴趣展示推荐商品类别(如Sports用户推荐Apparel)。
  • 作者:不懂数据的小白

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python数据分析项目:用户购买行为深度解析与个性化推荐预测研究

    发表回复