电商数据分析---RFM用户画像

2023-11-18

电商数据分析

一.数据描述

数据下载

订单顺序编号 订单号 用户名 商品编号 订单金额 付款金额

二.分析角度

1.整体角度----探索每个月有效的订单,以及销售额

2.个人角度----统计第一次购买的数量,以及最新时间购买的人数

3.用户画像----使用RFM模型对用户进行分类

三.数据清洗

pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
plt.rcParams['font.family'] = 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False

首先设置如上,前两行是让字段整体输出,后两行是使画图显示中文

1.处理缺失值

# 01 空值处理
print(data.isnull().sum())
data['渠道编号'].fillna(data['渠道编号'].mode(), inplace=True)
print("----------------------")

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4JM0PXUS-1686745656368)(C:\Users\86170\AppData\Roaming\Typora\typora-user-images\image-20230614175754731.png)]

空值字段只有渠道的编号,数量较少,可以采用删除,本次采用使用众数填充的方法处理空值。

2.重复值

# 02 重复值处理
print("数据的重复值个数为", data.duplicated().sum())

无重复值。

3.异常值

本次数据主要是2021年的数据,对于其他时间段的数据进行删除,并且检查付款金额字段数据

print("数据异常值数据\n", data[data['付款金额'] < 0]['付款金额'])
data.drop(data[data['付款金额'] < 0]['付款金额'].index, inplace=True)
# 增加下日期列与月份
data['订单日期'] = pd.to_datetime(data['付款时间'], format='%Y-%m-%d').dt.date
data['月份'] = pd.to_datetime(data['订单日期']).dt.strftime('%m')
# 筛选2021年其他的数据
df = data[pd.to_datetime(data['订单日期']).dt.year == 2021]

增加订单日期列以及月份列,便于后续分析

四.整体分析

1.退款率

data_counts = data.groupby('是否退款').count()['订单号']
plt.pie(data_counts, labels=data_counts.index, autopct='%1.1f%%')
plt.title('退款订单占比')

整体的退款率在13%左右,高于平均水平的退款率可能表明产品质量、履行流程或客户服务存在某些问题。低于平均水平的退款率可能表明该企业提供了优质且令人满意的产品和服务,但也可能意味着该企业未正确处理退款并可能导致客户不满。

2.月份销售额分析

# 每个月的产品销量
data_s.groupby('月份')['订单号'].count().plot()
plt.xlabel('月份')
plt.ylabel('销量')
plt.title("每个月的产品销量")
plt.show()
# 每个月的销售额
data_s.groupby('月份')['付款金额'].sum().plot()
plt.xlabel('月份')
plt.ylabel('销售额')
plt.title("每个月的销售额")
plt.show()
# 每个月的消费人数
data_s.groupby(by='月份')['用户名'].apply(lambda x: len(x.drop_duplicates())).plot()
plt.xlabel('月份')
plt.ylabel('客户数量')
plt.title('每个月的客户数量')
plt.show()

在这里插入图片描述

在2021年2月的销量最低,2月降到最低开始增加,其中5月到6月期间增长最快。

在这里插入图片描述

与销量成正比,趋势与销量一致

在这里插入图片描述

# 用直方图和核密度看下‘订单金额’的数据分布
plt.figure(figsize=(8, 4), dpi=200)
plt.hist(data_s['订单金额'], bins=50,
         color='g', label='订单金额',
         histtype='bar', density=True,
         edgecolor='white', alpha=0.4)
plt.title('订单金额分布', fontdict={'fontsize': 6, 'color': 'r'})
plt.xlabel('订单金额')
plt.ylabel('密度')
plt.show()
print(f"订单金额的数据偏度为{data_s['订单金额'].skew()}")
print(f"订单金额的数据偏度为{data_s['订单金额'].kurtosis()}")

订单金额的整体分布

在这里插入图片描述

在这里插入图片描述

订单金额数据属于右偏分布。

3.渠道平台分析

data_counts=data_s.groupby('渠道编号')['订单金额'].sum()
plt.pie(data_counts, labels=data_counts.index, autopct='%1.1f%%')
plt.title('渠道金额占比')
plt.show()
data_counts=data_s.groupby('平台类型')['订单金额'].sum()
plt.pie(data_counts, labels=data_counts.index, autopct='%1.1f%%')
plt.title('平台金额占比')
plt.show()

在这里插入图片描述

从图中看出,大部分的销售金额来自于APP以及微信公众号,以后可以在这两个方面悬窗加大投入。

五.个人角度

1.人数分析

data_s.groupby('用户名')['订单日期'].min().value_counts().plot()
plt.xlabel("订单日期")
plt.ylabel("人数")
plt.title('第一次购买用户分析')
plt.show()

data_s.groupby('用户名')['订单日期'].max().value_counts().plot()
plt.xlabel("订单日期")
plt.ylabel("人数")
plt.title('最新次购买用户分析')
plt.show()

在这里插入图片描述
在这里插入图片描述

从图中看出1月到6月新用户数量在不断的增长,后半年趋于稳定,在复购率上面,全年在不断的增加。

六.用户画像

RFM是一种营销分析工具,它的全称是“Recency(最近购买时间)、Frequency(购买频率)、Monetary(单次购买金额)”,即最近购买时间、购买频率和单次购买金额。这三个指标被广泛用于客户价值分析和客户细分,可以帮助企业更好地了解自己的客户和他们的需求,以便更好地制定营销策略和提高客户满意度。通过RFM分析,企业可以识别出自己的高价值客户、潜在客户和低价值客户,并针对不同客户制定不同的营销策略。

data_end_date = pd.Timestamp('2022-01-01').date()

rfm = data_s.groupby('用户名').agg({
    '订单日期': lambda x: (data_end_date - x.max()).days,
    '订单号': 'count',
    '付款金额': 'sum'
})
rfm.rename(columns={'订单号': 'F', '订单日期': 'R', '付款金额': 'M'}, inplace=True)
# 定义RFM指标 使用平均值
R_score = round(rfm['R'].mean(), 2)
F_sore = round(rfm['F'].mean(), 2)
M_sore = round(rfm['M'].mean(), 2)

rule_dict = {
    (True, True, True): '重要价值客户',
    (True, False, True): '重要发展客户',
    (True, True, False): '重要保持客户',
    (True, False, False): '重要挽留客户',
    (False, True, True): '一般价值客户',
    (False, False, True): '一般发展客户',
    (False, True, False): '一般保持客户',
    (False, False, False): '一般挽留客户'
}

rfm['客户分类'] = [rule_dict[(r > R_score, f > F_sore, m > M_sore)] for r, f, m in
                   zip(rfm['R'], rfm['F'], rfm['M'])]

return rfm

计算RFM三个指标的值,我们定义data_end_date,计算数据集中的订单日期到data_end_date的时间差作为R指标
F为频数,M为消费金额,部份数据如下:
在这里插入图片描述
在这里插入图片描述

可以看出对于该店铺的重要价值客户相对较少,应该制定相应的策略提高客户忠诚度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

电商数据分析---RFM用户画像 的相关文章

  • Python:在列表理解本身中引用列表理解?

    这个想法刚刚出现在我的脑海中 假设您出于某种原因想要通过 Python 中的列表理解来获取列表的唯一元素 i if i in created comprehension else 0 for i in 1 2 1 2 3 1 2 0 0 3
  • SQLAlchemy 通过关联对象声明式多对多自连接

    我有一个用户表和一个朋友表 它将用户映射到其他用户 因为每个用户可以有很多朋友 这个关系显然是对称的 如果用户A是用户B的朋友 那么用户B也是用户A的朋友 我只存储这个关系一次 除了两个用户 ID 之外 Friends 表还有其他字段 因此
  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • Python pickle:腌制对象不等于源对象

    我认为这是预期的行为 但想检查一下 也许找出原因 因为我所做的研究结果是空白 我有一个函数可以提取数据 创建自定义类的新实例 然后将其附加到列表中 该类仅包含变量 然后 我使用协议 2 作为二进制文件将该列表腌制到文件中 稍后我重新运行脚本
  • OpenCV 无法从 MacBook Pro iSight 捕获

    几天后 我无法再从 opencv 应用程序内部打开我的 iSight 相机 cap cv2 VideoCapture 0 返回 并且cap isOpened 回报true 然而 cap grab 刚刚返回false 有任何想法吗 示例代码
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • 如何在ipywidget按钮中显示全文?

    我正在创建一个ipywidget带有一些文本的按钮 但按钮中未显示全文 我使用的代码如下 import ipywidgets as widgets from IPython display import display button wid
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 有没有办法检测正在运行的代码是否正在上下文管理器内执行?

    正如标题所述 有没有办法做到这样的事情 def call back if called inside context print running in context else print called outside context 这将
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • Day4-1 反射、可变变量、线程池和Tomcat调优

    反射 Class的三种获取方式 方式一 通过Class forName获取 Class cla1 Class forName lt 类名 gt 方式二 通过类属性 lt 类名 gt class获取 Class cla2 lt 类名 gt c
  • uniapp本地插件列表为空的问题

    在开发中 我遇到本地插件列表为空的问题 问题来源 当我们在打包时不想选择本地的某个插件 但是 但是删除 再去选择 你会发现 来列表为空 也不会报错 解决方案 1 我们删除造成问题后的导入原生插件 然后重新导入 我就是这样解决的 可能你改原生
  • Android OkHttp4 RequestBody.create()过时解决办法 kotlin、java版本

    前段时间 OKhttp3已升级到Okhttp4 编写语言由java过渡到kotlin 而以前okhttp3经常用到的post提交数据的 RequestBody create 已过时 并且换成了kotlin的新特性写法 okhttp3 pos
  • Android WebView使用技巧

    1 不使用WebView缓存 使用场景 通过WebView输入用户名和密码进行登录 退出登陆后 再进行登录会默认是之前输入的用户名和密码登录 那么使用如下方式可以设置webview的缓存模式 WebSettings seting web v
  • 存储过程中的when others then 和 raise 何意义?

    EXCEPTION when others then rollback dbms output put line code sqlcode dbms output put line errm sqlerrm raise when other
  • MATLAB初学_分类方法_4.0

    一 K 近邻分类 K 近邻算法是一种基于实例的非参数的分类方法 其作用原理是计算每个训练样例到待分类样品间的距离 取和待分类样品距离最近的看k个训练样例 k个样品中那个类别的训练样例占多数 则待分类元组就属于该类 2 1 K NN算法具体步
  • linux文件重命名命令

    linux下重命名文件有两种方式 1 较简单的处理命令 mv mv 原文件名 新文件名 如 mv myFile newName 将MyFile重命名为newName 2 linux提供了一个重命名文件命令 rename rename fro
  • HDR技术

    转自 http digi tech qq com a 20150513 008211 htm http digi tech qq com a 20150119 009229 htm http tech sina com cn e 2015
  • Fix a Tree【Codeforces 699 D】【dfs + 树的性质】

    Codeforces Round 363 Div 2 D 题意 有N个点 每个点i都有一个父节点p i 如果 i p i 则是说明i结点是根结点 现在我们给出这样的1 N的p i 这可能是不合法的 问 我们应该最少改变多少个使它变成一棵合法
  • kubernetes各组件介绍

    文章目录 一 kubernetes 是什么 1 基础架构图 2 kubernetes 各组件介绍 2 1 master 组件 one Kubernetes API Server kube apiserver two Kubernetes C
  • 位的巧妙应用

    前言 前几天做了一个笔试题目 当时没多想 今天翻看博客才发现 原来每个笔试题都藏的很深啊 原文链接 http blog csdn net u010429424 article details 77856133 先说题目 面试题 8个试剂 其
  • 输入两个学生的学号,成绩,输出成绩较高的学生的学号姓名和成绩

    include
  • 贝叶斯判别分析器_用朴素的贝叶斯构建情感分析器

    贝叶斯判别分析器 Sentiment Analysis is contextual mining of text which identifies and extracts subjective information in the sou
  • 传感器超声波雷达

    转自 http www itsiwei com 21962 html 在上一次分享中 我介绍了毫米波雷达的原理 数据特性及优缺点 毫米波雷达的低环境敏感和低成本的特性使得其在ADAS和自动驾驶领域得到了广泛的应用 今天要介绍的是一款极其常见
  • 【Python】cnocr的使用

    1 介绍 cnocr于2019年7月25日开源 以下是使用介绍 2 安装 pip install cnocr 3 使用 from cnocr import CnOcr ocr CnOcr path r D server cnocr exam
  • 【AI前沿】chatgpt还有哪些不足?

    博客昵称 吴NDIR 个人座右铭 得之淡然 失之坦然 作者简介 喜欢轻音乐 象棋 爱好算法 刷题 其他推荐内容 计算机导论速记思维导图 其他内容推荐 五种排序算法 在这个愉快的周末让我们聊一下ChatGPT吧 ChatGPT 4时代来临 C
  • AD怎么调整PCB板子大小

    方法一 Design Board Shape Redefine Board Shape 快捷键D S R 对于方形 依次画好4个点 然后右键退出操作 没有画成想要的形状之前不要点击右键 方法二 1 在PCB页面用Keep Out Layer
  • C语言学习笔记(七)————分支语句相关

    1 单独一个分号是空语句 在一些情况下有重要作用 2 使用if else语句时 如果条件成立 要执行多条语句 这里要用一对 封装一个代码块 如果if else后面是单条语句则不用大括号括起 3 注意C语言中if else遵循就近原则 不看缩
  • 分析告警流量

    关键指标分析 事件量 原始告警量 主告警量 自动去重 规则压缩后告警量 压缩比 压缩比计算公式 1 主告警量 事件量 100 MTTA 告警平均响应or认领时长 MTTR 告警平均恢复or关闭时长 事件压缩分析 按天统计事件量 所有告警 主
  • 电商数据分析---RFM用户画像

    电商数据分析 一 数据描述 数据下载 订单顺序编号 订单号 用户名 商品编号 订单金额 付款金额 二 分析角度 1 整体角度 探索每个月有效的订单 以及销售额 2 个人角度 统计第一次购买的数量 以及最新时间购买的人数 3 用户画像 使用R