Python综合数据分析_RFM用户分组模型

文章目录

  • 1.导入数据
  • 2.月度订单数据可视化
  • 3.数据清洗
  • 4.特征工程
  • 5.构建User用户表
  • 6.求R值
  • 7.求F值
  • 8.求M值
  • 9.显示R、F、M值的分布情况
  • 10.显示手肘图辅助确定K值
  • 11.创建和训练模型
  • 12.给R值聚类
  • 13.给聚类后的层级排序
  • 14.继续给F、M值聚类,并排序
  • 15.为用户整体分组画像


1.导入数据

import pandas as pd #导入Pandas
df_sales = pd.read_csv('data.csv') #载入数据
df_sales.head() #显示头几行数据 

在这里插入图片描述

2.月度订单数据可视化

import matplotlib.pyplot as plt #导入Matplotlib的pyplot模块
#构建月度的订单数的DataFrame
df_sales['消费日期'] = pd.to_datetime(df_sales['消费日期']) #转化日期格式
df_orders_monthly = df_sales.set_index('消费日期')['订单号'].resample('M').nunique()
#设定绘图的画布
ax = pd.DataFrame(df_orders_monthly.values).plot(grid=True,figsize=(12,6),legend=False)
ax.set_xlabel('月份') # X轴label
ax.set_ylabel('订单数') # Y轴Label
ax.set_title('月度订单数') # 图题
#设定X轴月份显示格式
plt.xticks(range(len(df_orders_monthly.index)), [x.strftime('%m.%Y') for x in df_orders_monthly.index], rotation=45)
plt.show() # 绘图

在这里插入图片描述

3.数据清洗

df_sales = df_sales.drop_duplicates() #删除重复的数据行
df_sales.isna().sum() # NaN出现的次数

在这里插入图片描述

df_sales.describe() #df_sales的统计信息

在这里插入图片描述

df_sales = df_sales.loc[df_sales['数量'] > 0] #清洗掉数量小于等于0的数据
df_sales.describe() #df_sales的统计信息

在这里插入图片描述

4.特征工程

df_sales['总价'] = df_sales['数量'] * df_sales['单价'] #计算每单的总价
df_sales.head() #显示头几行数据  

在这里插入图片描述

5.构建User用户表

df_user = pd.DataFrame(df_sales['用户码'].unique()) #生成以用户码为主键的结构df_user
df_user.columns = ['用户码'] #设定字段名
df_user = df_user.sort_values(by='用户码',ascending=True).reset_index(drop=True) #按用户码排序
df_user #显示df_user

在这里插入图片描述

6.求R值

df_sales['消费日期'] = pd.to_datetime(df_sales['消费日期']) #转化日期格式
df_recent_buy = df_sales.groupby('用户码').消费日期.max().reset_index() #构建消费日期信息
df_recent_buy.columns = ['用户码','最近日期'] #设定字段名
df_recent_buy['R值'] = (df_recent_buy['最近日期'].max() - df_recent_buy['最近日期']).dt.days #计算最新日期与上次消费日期的天数
df_user = pd.merge(df_user, df_recent_buy[['用户码','R值']], on='用户码') #把上次消费距最新日期的天数(R值)合并至df_user结构
df_user.head() #显示df_user头几行数据

在这里插入图片描述

7.求F值

df_frequency = df_sales.groupby('用户码').消费日期.count().reset_index() #计算每个用户消费次数,构建df_frequency对象
df_frequency.columns = ['用户码','F值'] #设定字段名称
df_user = pd.merge(df_user, df_frequency, on='用户码') #把消费频率整合至df_user结构
df_user.head() #显示头几行数据

在这里插入图片描述

8.求M值

df_revenue = df_sales.groupby('用户码').总价.sum().reset_index() #根据消费总额,构建df_revenue对象
df_revenue.columns = ['用户码','M值'] #设定字段名称
df_user = pd.merge(df_user, df_revenue, on='用户码') #把消费金额整合至df_user结构
df_user.head() #显示头几行数据

在这里插入图片描述

9.显示R、F、M值的分布情况

df_user['R值'].plot(kind='hist', bins=20, title = '新进度分布直方图') #R值直方图

在这里插入图片描述

df_user.query('F值 < 800')['F值'].plot(kind='hist', bins=50, title = '消费频率分布直方图') #F值直方图

在这里插入图片描述

df_user.query('M值 < 20000')['M值'].plot(kind='hist', bins=50, title = '消费金额分布直方图') #M值直方图

在这里插入图片描述

10.显示手肘图辅助确定K值

from sklearn.cluster import KMeans #导入KMeans模块
def show_elbow(df): #定义手肘函数distance_list = [] #聚质心的距离(损失)K = range(1,9) #K值范围for k in K:kmeans = KMeans(n_clusters=k, max_iter=100) #创建KMeans模型kmeans = kmeans.fit(df) #拟合模型distance_list.append(kmeans.inertia_) #创建每个K值的损失plt.plot(K, distance_list, 'bx-') #绘图plt.xlabel('k') #X轴plt.ylabel('距离均方误差') #Y轴plt.title('k值手肘图') #标题
show_elbow(df_user[['R值']]) #显示R值聚类K值手肘图

在这里插入图片描述

show_elbow(df_user[['F值']]) #显示F值聚类K值手肘图

在这里插入图片描述

show_elbow(df_user[['M值']]) #显示M值聚类K值手肘图

在这里插入图片描述

11.创建和训练模型

from sklearn.cluster import KMeans #导入KMeans模块
kmeans_R = KMeans(n_clusters=3) #设定K=3
kmeans_F = KMeans(n_clusters=4) #设定K=4
kmeans_M = KMeans(n_clusters=4) #设定K=4
kmeans_R.fit(df_user[['R值']]) #拟合模型
kmeans_F.fit(df_user[['F值']]) #拟合模型
kmeans_M.fit(df_user[['M值']]) #拟合模型

在这里插入图片描述

12.给R值聚类

df_user['R值层级'] = kmeans_R.predict(df_user[['R值']]) #通过聚类模型求出R值的层级
df_user.head() #显示头几行数据

在这里插入图片描述

df_user.groupby('R值层级')['R值'].describe() #R值层级分组统计信息

在这里插入图片描述

13.给聚类后的层级排序

#定义一个order_cluster函数为聚类排序
def order_cluster(cluster_name, target_name,df,ascending=False):new_cluster_name = 'new_' + cluster_name #新的聚类名称df_new = df.groupby(cluster_name)[target_name].mean().reset_index() #按聚类结果分组,创建df_new对象df_new = df_new.sort_values(by=target_name,ascending=ascending).reset_index(drop=True) #排序df_new['index'] = df_new.index #创建索引字段df_new = pd.merge(df,df_new[[cluster_name,'index']], on=cluster_name) #基于聚类名称把df_new还原为df对象,并添加索引字段df_new = df_new.drop([cluster_name],axis=1) #删除聚类名称df_new = df_new.rename(columns={"index":cluster_name}) #将索引字段重命名为聚类名称字段return df_new #返回排序后的df_new对象
df_user = order_cluster('R值层级', 'R值', df_user, False) #调用簇排序函数
df_user = df_user.sort_values(by='用户码',ascending=True).reset_index(drop=True) #根据用户码排序
df_user.head() #显示头几行数据

在这里插入图片描述

df_user.groupby('R值层级')['R值'].describe() #R值层级分组统计信息

在这里插入图片描述

14.继续给F、M值聚类,并排序

df_user['F值层级'] = kmeans_F.predict(df_user[['F值']]) #通过聚类模型求出F值的层级
df_user = order_cluster('F值层级', 'F值',df_user,True) #调用簇排序函数
df_user.groupby('F值层级')['F值'].describe() #F值层级分组统计信息

在这里插入图片描述

df_user = df_user.sort_values(by='用户码',ascending=True).reset_index(drop=True) #根据用户码排序
df_user.head()

在这里插入图片描述

df_user['M值层级'] = kmeans_M.predict(df_user[['M值']]) #通过聚类模型求出M值的层级
df_user = order_cluster('M值层级', 'M值',df_user,True) #调用簇排序函数
df_user.groupby('M值层级')['M值'].describe() #M值层级分组统计信息
df_user = df_user.sort_values(by='用户码',ascending=True).reset_index(drop=True) #根据用户码排序
df_user.head() #显示头几行数据

在这里插入图片描述

15.为用户整体分组画像

df_user['总分'] = df_user['R值层级'] + df_user['F值层级'] + df_user['M值层级'] #求出每个用户RFM总分
#在df_user对象中添加总体价值这个字段
df_user.loc[(df_user['总分']<=2) & (df_user['总分']>=0), '总体价值'] = '低价值' 
df_user.loc[(df_user['总分']<=4) & (df_user['总分']>=3), '总体价值'] = '中价值' 
df_user.loc[(df_user['总分']<=8) & (df_user['总分']>=5), '总体价值'] = '高价值'
df_user #显示df_user

在这里插入图片描述

#显示高、中、低价值组分布散点图(F值与M值)
plt.scatter(df_user.query("总体价值 == '高价值'")['F值'],df_user.query("总体价值 == '高价值'")['M值'],c='g',marker='*')
plt.scatter(df_user.query("总体价值 == '中价值'")['F值'],df_user.query("总体价值 == '中价值'")['M值'],marker=8)
plt.scatter(df_user.query("总体价值 == '低价值'")['F值'],df_user.query("总体价值 == '低价值'")['M值'],c='r')

在这里插入图片描述


参考资料:极客时间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/609885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hero引擎:数字创意的奇迹

Hero引擎&#xff1a;数字创意的奇迹 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;让我们一同探索引擎领域的璀璨明星——Hero引擎。从游戏开发到…

安装配置Flink

安装配置Flink 1.上传安装包到Linux 2.解压到指定路径 tar -zxf ./flink-1.14.0-bin-scala_2.12.tgz /usr/local/src/3.修改环境变量 vi ~/.bashrc#往最后加入 export FLINK_HOME /usr/local/src/flink-1.14.0/ export PATH$PATH:$FLINK_HOME/bin#激活环境变量 source ~/.…

BOM简介

1.1 常用的键盘事件 1.1.1 键盘事件 键盘事件触发条件onkeydown按键被按下时触发onkeypress按键被按下时触发onkeyup按键被松开时触发 注意&#xff1a;addEventListener事件不需要加on <script>//1. keydown 按键按下的时候触发,按任意键都触发&#xff0c;也可以识…

【linux】 shell 之 字符串 -z, -n 判断

-n : 字符串长度不等于 0 为真 &#xff0c;助记符 no zero&#xff0c; example : VAR11;VAR2"" ;[ -n "$VAR1" ];echo $? 为 0 true VAR11;VAR2"" ;[ -n "$VAR2" ];echo $? 为 1 false .-z : 字符串长度等于 0 为真 &#xff0…

大创项目推荐 深度学习实现语义分割算法系统 - 机器视觉

文章目录 1 前言2 概念介绍2.1 什么是图像语义分割 3 条件随机场的深度学习模型3\. 1 多尺度特征融合 4 语义分割开发过程4.1 建立4.2 下载CamVid数据集4.3 加载CamVid图像4.4 加载CamVid像素标签图像 5 PyTorch 实现语义分割5.1 数据集准备5.2 训练基准模型5.3 损失函数5.4 归…

C语言程序设计期末例题复习

题目一&#xff1a; 题目 输入两个非负整数a和b&#xff0c;输出两个非负整数的和(ab)。数据规模 0<a,b< 10 99−1样例1 输入 1 1 ​ 输出 2 ​ ​ 样例2 输入 1844674407370955161 1 ​ 输出 1844674407370955162 代码实现&#xff1a; void reverse(char *s){//反转…

【Kubernetes】如何使用 kubectl 操作 cluster、node、namespace、pod

如何使用 kubectl 操作 cluster、node、namespace、pod 在列出、描述、修改或删除其他命名空间中的对象时&#xff0c;需要给 kubectl 命令传递 --namespace&#xff08;或 -n&#xff09;选项。如果不指定命名空间&#xff0c;kubectl 将在当前上下文中配置的默认命名空间中执…

整理的Binder、DMS、Handler、PMS、WMS等流程图

AMS&#xff1a; Binder&#xff1a; Handler&#xff1a; PMS&#xff1a; starActivity&#xff1a; WMS&#xff1a; 系统启动&#xff1a;

1884_emacs ivy minibuffer中上下行导航快捷键修改

全部学习汇总&#xff1a; GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. 我自己凑了一组emacs的配置使用了很长一段时间&#xff0c;很大程度上的功能在模仿spacemacs&#xff0c;但是我的配置更加轻量化&#xff0c;因此在使用的时候延…

数据库教程:从基础到进阶

数据库教程&#xff1a;从基础到进阶 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天&#xff0c;我们将一同探索一项对于每位程序猿都至关重要的技能——“数据…

梯度提升机(Gradient Boosting Machines,GBM)

什么是机器学习 梯度提升机&#xff08;Gradient Boosting Machines&#xff0c;GBM&#xff09;是一种集成学习方法&#xff0c;通过将多个弱学习器&#xff08;通常是决策树&#xff09;组合成一个强学习器来提高模型的性能。GBM的训练过程是通过迭代&#xff0c;每一步都根…

设备树在开发板的系统中的体现

一. 简介 设备树文件中的设备节点&#xff0c;可以在开发板系统中看到。 也就说&#xff0c;开发板加载设备树文件&#xff0c;Linux内核启动系统以后&#xff0c;可以在根文件系统里看到设备树的节点信息。在/proc/device-tree/目录下存放着设备树信息。 二. 设备树在开发板…

数据结构单链表定义及例题(上)

本文简要的介绍了单链表的定义,以及单链表的头插法和尾插法的实现 文章目录 一、单链表数据结构的定义 二、头插法建立单链表(带头节点) 三、尾插法建立单链表(带头节点) 四、打印单链表 五、测试及全部代码 总结 前言 单链表是学习,以及考研无论是408还是自命题都是很重…

序列模型(4)—— Scaling Laws

本文介绍 LLM 训练过程中重要的 Scaling Laws&#xff0c;这是一个经验规律&#xff0c;指出了固定训练成本&#xff08;总计算量FLOPs&#xff09; C C C 时&#xff0c;如何调配模型规模&#xff08;参数量&#xff09; N N N 和训练 Token 数据量 D D D&#xff0c;才能实现…

算法训练day9Leetcode232用栈实现队列225用队列实现栈

今天学习的文章和视频链接 https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 栈与队列理论基础 见我的博客 https://blog.csdn.net/qq_36372352/article/details/135470438?spm1001.2014.3001.5501 232用栈实现…

maven模块化开发部署

之前一直维护迭代的产品,因为有很多客户使用.有些用户有定制化需求,需要添加新的模块功能.因此需要平台主体功能迭代的同时,非主体功能和定制化功能插件化. 一.实现方案 分为开发和部署两个步骤: 1.开发 已经确定肯定是采用maven父子工程,单独的模块可独立开发及独立部署. 原…

Spring中Bean的生命周期

第一、Bean的生命周期 Spring中Bean的生命周期就是Bean在Spring中从创建到销毁的整个过程&#xff0c;主要分为以下5个部分&#xff1a; 1.实例化&#xff1a; 给Bean分配内存空间&#xff08;对应JVM中的“加载”&#xff0c;这里只是分配了内存&#xff09;&#xff1b; 2.设…

ffmpeg[学习(四)](代码实现) 实现音频数据解码并且用SDL播放

0、作者杂谈 CSDN大多数都是落后的&#xff0c;要么是到处复制粘贴的&#xff0c;对于初学者我来说困惑了很久&#xff0c;大多数CSDN文章都是使用旧的API &#xff0c;已经被否决了&#xff0c;于是我读一些官方文档&#xff0c;和一些开源项目音视频的输出过程&#xff0c;写…

开源的RNA-Seq分析软件Trinity的详细介绍和使用方法

介绍 GitHub - trinityrnaseq/trinityrnaseq: Trinity RNA-Seq de novo transcriptome assembly Trinity是一种开源的RNA-Seq分析软件&#xff0c;用于转录组的de novo组装。转录组de novo组装是通过将RNA-Seq数据中的短序列片段&#xff08;reads&#xff09;重新组装成完整的…

模型容器与AlexNet构建

一、模型容器——Containers nn.Sequential 是 nn.module的容器&#xff0c;用于按顺序包装一组网络层 Sequential 容器 nn.Sequential 是 nn.module的容器&#xff0c;用于按顺序包装一组网络层 • 顺序性&#xff1a;各网络层之间严格按照顺序构建 • 自带forward()&#xf…