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)。
作者:不懂数据的小白