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

news2025/1/11 4:09:33

文章目录

  • 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.coloradmin.cn/o/1388422.html

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

相关文章

vue-quill-editor富文本插入图片改为上传服务器

1.安装vue-quill-editor npm install vue-quill-editor 2.安装依赖 npm install quill 3.代码引用 import { quillEditor } from vue-quill-editor; // 引入Qill插件 import Quill from quill; import quill/dist/quill.core.css; // import styles import quill/dist/quill.s…

Java热插拔技术之SPI

文章目录 背景SPI是什么SPI和API的区别Java SPI实践出真知总结 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 背景 最近&#xff0c;公司需要针对一个使用C#的系统以插件的形式进行二…

中仕公考:2024年度河南省公务员考试公告发布!共招录9900人!

河南省2024年度统一考试录用公务员公告于今日发布&#xff0c;共计划招录9900人。 报名时间&#xff1a;1月18日9&#xff1a;00-1月24日17&#xff1a;00 笔试时间&#xff1a;3月16日-3月17日 报名方式&#xff1a;登录“河南人事考试网”进行网上报名 2024年省考29.5%的…

CSS中的width与height

CSS中的width与height 1 display: inline-block2 width: auto2.1 外部尺寸与流体特性2.1.1 正常流宽度2.1.2 格式化宽度 2.2 内部尺寸与流体特性2.2.1 包裹性2.2.2 首选最小宽度2.2.3 最大宽度 3 height: 100%3.1 如何让元素支持height: 100%效果 1 display: inline-block 我们…

健康之钥:新生儿维生素K的呵护指南

引言&#xff1a; 维生素K&#xff0c;在新生儿的成长旅程中扮演着不可忽视的角色。它对于血液凝结和骨骼发育至关重要。本文将深入探讨维生素K的功能、补充时机&#xff0c;以及在给新生儿补充维生素K时应该注意的事项&#xff0c;为小天使们提供最贴心的呵护。 第一部分&…

动态内存面试的经典题目

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

大创项目推荐 深度学习疲劳驾驶检测 opencv python

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 &#x1f525; 优…

Resize:最近邻插值、双线性插值、双三次插值

Resize&#xff1a;最近邻插值、双线性插值、双三次插值 Opencv resize函数1. 最近邻插值&#xff08;INTER_NEAREST&#xff09;1.1 原理1.2 代码实例1.3 简单的代码复现1.4 特点 2. 双线性插值&#xff08;INTER_LINEAR&#xff09;&#xff08;默认值&#xff09;2.1 原理2.…

Rust-解引用

“解引用”(Deref)是“取引用”(Ref)的反操作。取引用&#xff0c;我们有&、&mut等操作符&#xff0c;对应的&#xff0c;解引用&#xff0c;我们有操作符&#xff0c;跟C语言是一样的。示例如下&#xff1a; 比如说&#xff0c;我们有引用类型p:&i32;,那么可以用符…

[笔记]深度学习入门 基于Python的理论与实现(三)

代码仓库 gitee 3. 神经网络 神经网络的出现就是为了解决设定权重的工作&#xff0c;即机器自动从数据中学习&#xff0c;确定合适的、能符合预期的输入与输出的权重。 3.1 从感知机到神经网络 神经网络和感知机有很多共同点&#xff0c;这里主要介绍差异 3.1.1 神经网络例子…

数据库|数据库范式(待完成)

文章目录 数据库的范式数据库的基本操作什么是数据库的范式产生的背景&#xff08;没有规范化的坏处/带来的问题&#xff09;规范化表格设计的要求五大范式的作用——树立标准打个比方——桥的承载能力1NF&#xff08;1范式&#xff09;如何转换成合适的一范式 2NF&#xff08;…

Flask 项目怎么配置并创建第一个小项目?附上完成第一个小案例截图

目录 1. 为什么要学习 flask&#xff1f; 2. flask 是什么&#xff1f; 3. flask 如何使用&#xff1f; 要安装 Flask&#xff0c;可以按照以下步骤进行&#xff1a; 4. 使用流程 4.1. 新建项目 4.1.1. 打开 pycharm&#xff0c;新建项目 4.1.2. 设置目录&#xff0c;并…

centos7 arm服务器编译安装PaddlePaddle

前言 随着国产服务器发展&#xff0c;部署项目需要用在国产服务器上&#xff0c;官方教程里面很多没有讲解到&#xff0c;安装过程中出现了各种各样的问题&#xff0c;以下是对官方教程的补充&#xff0c;有什么问题&#xff0c;欢迎指正&#xff01; 一、环境准备 gcc: 8.2版…

Python 网络编程之TCP详细讲解

【一】传输层 【1】概念 传输层是OSI五层模型中的第四层&#xff0c;负责在网络中的两个端系统之间提供数据传输服务主要协议包括**TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;** 【2】功能 **端到端通信&#xff1a;**传输层负责…

数学建模-预测人口数据

目录 中国09~18年人口数据 创建时间 绘制时间序列图 使用专家建模器 得到结果 预测结果 残差的白噪声检验 中国09~18年人口数据 创建时间 路径&#xff1a;数据-> 定义日期和时间 绘制时间序列图 使用专家建模器 看看spss最终判断是那个模型最佳的契合 得到结果 预…

什么是NTFS格式文件系统?Tuxera NTFS for Mac2024下载步骤

一般磁盘格式分为&#xff1a;FAT、FAT32、NTFS&#xff0c;这几种格式目前是我们最常遇到的文件系统格式&#xff0c;其中现在遇到最多的就是NTFS格式&#xff0c;为更好地了解这类文件系统格式&#xff0c;小编今天专门介绍一下什么是NTFS格式文件系统以及它的特点和局限性。…

网络安全ctf比赛/学习资源整理,【解题工具、比赛时间、解题思路、实战靶场、学习路线】推荐收藏!

对于想学习或者参加CTF比赛的朋友来说&#xff0c;CTF工具、练习靶场必不可少&#xff0c;今天给大家分享自己收藏的CTF资源&#xff0c;希望能对各位有所帮助。 CTF在线工具 首先给大家推荐我自己常用的3个CTF在线工具网站&#xff0c;内容齐全&#xff0c;收藏备用。 1、C…

Chapter 10 类的继承(上篇)

目的&#xff1a;了解三种继承方式&#xff0c;并清楚其中的差别 &#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;&#x1f383;…

【JVM】垃圾回收 GC

一、前言 垃圾回收&#xff08;Garbage Collection&#xff0c;GC&#xff09;是由 Java 虚拟机&#xff08;JVM&#xff09;垃圾回收器提供的一种对内存回收的一种机制&#xff0c;它一般会在内存空闲或者内存占用过高的时候对那些没有任何引用的对象不定时地进行回收。以避免…

imgaug库指南(26):从入门到精通的【图像增强】之旅(万字长文!)

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…