python用户价值分析

数据获取:

表格数据
数据清洗后数据:链接:https://pan.baidu.com/s/1D7qOZqKmF3YR3meQPsp3sQ 
提取码:1234 

数据下载下来后,先进行数据清洗。数据清洗在进行用户价值分析,也可以直接下载我清洗后的数据。

RFM模型:

RFM的含义:

R (Recency)︰客户最近一次交易时间的间隔。R值越大,表示客户交易发生的日期越久,反之则表示客户交易发生的日期越近。

F (Frequency)︰客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则表示客户交易不够活跃。

M(Monetary)︰客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则表示客户价值越低。


数据透视表:

如果我们对上面的数据做一个这样的数据透视表,在excel表个是这样的,因为这个表格中用户ID是很多重复的,所以我们要分析用户的话需要将用户提取出来,根据RFM模型,我们需要获得每个用户的 最后一次交易时间,交易次数,和最近一段时间内交易的金额。以上数据透视表已经将其体现出来了,那我们就将使用代码将以上功能体现出来。

# 透视表
df = data.pivot_table(index=['CustomerID'],
                      values=['InvoiceDate', 'InvoiceNo', 'total'],
                      aggfunc={'InvoiceDate': 'max', 'InvoiceNo': 'count', 'total': 'sum'}

                      )
print(df)
CustomerID在excel 中放在行的位置,其实是列名;
values:需要处理的数据
aggfunc:是需要处理的列计算方法

计算最后一次下单的时间就是InvoiceDate的最大值,InvoiceNo 计算交易了几次,total 交易了多少钱。

客户最近一次交易时间的间隔 = 分析的数据时间段内最晚的时间 - 最后一次交易时间,这里我们用InvoiceDate列所有数据最后一次交易时间为基准。减去每个用户最后一次交易时间,得到一个时间差,然后转换为天数。
df['R'] = (df['InvoiceDate'].max() - df['InvoiceDate']).dt.days   # 求得天数
print(df)

这样就添加了一列R

 

InvoiceNo对应的是F, total对应的是M。所以我们直接改列名就好

df.rename(columns = {'InvoiceNo':'F','total':'M'},inplace= True)

rfmdf = df[['R','F','M']]
print(rfmdf)

这样我们就将RFM数据提取处理了,具体要这么分析呢?

模型分类:

 我们将数据转换为0和1。进行二分法 ,大于平均值的为1, 小于平均值的为 0

rfmdf = rfmdf.apply(lambda x : x- x.mean())
# 如果>平均值,则为'1',否则为'0'
rfmdf = rfmdf.applymap(lambda x : '1' if x>0 else '0')

再去定义一个函数将进行定义什么类型的客户。

def func(x):
    label = {
        '111': '重要价值客户',
        '101': '重要发展客户',
        '011': '重要保持客户',
        '001': '重要挽留客户',
        '110': '一般价值客户',
        '100': '一般发展客户',
        '010': '一般保持客户',
        '000': '一般挽留客户'
    }
    return label[x['R']+x['F']+x['M']]
rfmdf['label'] = rfmdf.apply(func,axis=1)
rfmdf['label'].value_counts()
print(rfmdf)

这里我们已经对客户进行了定义。但是表格不适合我们一眼看得到数据  ,接下来我们需要进行绘图。这里用到的函数是matplotlib。

对数据进行绘图:

首先我们得先下载matplotlib 函数包,命令行:pip install matplotlib

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.size'] = 20

rfmdf['label'].value_counts().plot.bar(figsize=(20,9),color='red',alpha=0.6)
plt.xticks(rotation =0)
for i ,j in enumerate(rfmdf['label'].value_counts()):
    plt.text(i-0.1,j+50,j,va='center')

plt.show()

 我这边用的是柱状图,你们可以用饼图或者其他图都可以。

以下是完整的代码

import pandas as pd
# import numpy as np
import matplotlib.pyplot as plt

data = pd.read_csv(r'E:\数据分析\用户价值分析 RFM模型\data.csv')
pd.set_option('display.max_columns', 888)  # 大于总列数
pd.set_option('display.width', 1000)
# print(data.head())
# print(data.info())

# .空值处理
# print(data.isnull().sum())  # 空值中和,查看每一列的空值

# 空值删除
data.drop(columns=['Description'], inplace=True)


# CustomerID有空值
# 删除所有列的空值
data.dropna(inplace=True)
# print(data.isnull().sum())  # 由于CustomerID为必须字段,所以强制删除其他列,以CustomerID为准
#

# 转换为日期类型
data['InvoiceDate'] = pd.to_datetime(data['InvoiceDate'])

# CustomerID 转换为整型
data['CustomerID'] = data['CustomerID'].astype('int')


# print(data.describe())

data = data[data['Quantity'] > 0]
# print(data)

#
# 查看重复值
# data[data.duplicated()]
# print(data[data.duplicated()])
# 删除重复值
data.drop_duplicates(inplace=True)
# 每张发票的总价
data['total'] = data['Quantity'] * data['UnitPrice']

# # 透视表
df = data.pivot_table(index=['CustomerID'],
                      values=['InvoiceDate', 'InvoiceNo', 'total'],
                      aggfunc={'InvoiceDate': 'max', 'InvoiceNo': 'count', 'total': 'sum'}

                      )

# 1) 对用户进行分组,求得每个用户最后一次交易时间
# 2) 分析的数据时间段内最晚的时间 - 最后一次交易时间

df['R'] = (df['InvoiceDate'].max() - df['InvoiceDate']).dt.days   # 求得天数
# print(df)
df.rename(columns = {'InvoiceNo':'F','total':'M'},inplace= True)

rfmdf = df[['R','F','M']]
print(rfmdf)

# 先二分
rfmdf = rfmdf.apply(lambda x : x- x.mean())
# 如果>平均值,则为'1',否则为'0'
rfmdf = rfmdf.applymap(lambda x : '1' if x>0 else '0')


def func(x):
    label = {
        '111': '重要价值客户',
        '101': '重要发展客户',
        '011': '重要保持客户',
        '001': '重要挽留客户',
        '110': '一般价值客户',
        '100': '一般发展客户',
        '010': '一般保持客户',
        '000': '一般挽留客户'
    }
    return label[x['R']+x['F']+x['M']]
rfmdf['label'] = rfmdf.apply(func,axis=1)

# value_counts()
rfmdf['label'].value_counts()
print(rfmdf)


plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.size'] = 20

rfmdf['label'].value_counts().plot.bar(figsize=(20,9),color='red',alpha=0.6)
plt.xticks(rotation =0)
for i ,j in enumerate(rfmdf['label'].value_counts()):
    plt.text(i-0.1,j+50,j,va='center')

plt.show()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

springcloud微服务架构搭建过程

项目地址:源代码 仅作为学习用例使用,是我开发过程中的总结、实际的一部分使用方式 开发环境: jdk11 springboot2.7.6 springcloud2021.0.5 alibabacloud 2021.0.4.0 redis6.0 mysql8.0 一、项目搭建 wdz-api:存放远程服务调用相关…

如何选电脑

1、CPU(中央处理器) 怎么看CPU型号:CPU:系列-代数等级核心显卡型号电压后缀 例如CPU:i7-10750H : 1、系列:Intel的酷睿i3、i5、i7、i9这四个系列的CPU,数字越大就代表越高端。 2、代数:代表…

自主HttpServer实现(C++实战项目)

文章目录项目介绍CGI技术概念原理设计框架日志文件TCPServer任务类初始化与启动HttpServerHTTP请求结构HTTP响应结构线程回调EndPoint类EndPoint主体框架读取HTTP请求处理HTTP请求CGI处理非CGI处理构建HTTP响应发送HTTP响应接入线程池简单测试项目扩展项目介绍 该项目是一个基…

大厂光环下的功能测试,出去面试自动化一问三不知

在一家公司待久了技术能力反而变弱了,原来的许多知识都会慢慢遗忘,这种情况并不少见。 一个京东员工发帖吐槽:感觉在大厂快待废了,出去面试问自己接口环境搭建、pytest测试框架,自己做点工太久都忘记了。平时用的时候…

无公网IP,SSH远程连接Linux CentOS服务器【内网穿透】

文章目录视频教程1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的Linux CentOS服务器,无需公网IP,也不需要设置路…

地表最强,接口调试神器Postman ,写得太好了

postman是一款支持http协议的接口调试与测试工具,其主要特点就是功能强大,使用简单且易用性好 。 无论是开发人员进行接口调试,还是测试人员做接口测试,postman都是我们的首选工具之一 。 那么接下来就介绍下postman到底有哪些功…

吉林省互联网医院资质申请条件|牌照申请

吉林省互联网医院资质申请条件|牌照申请|长春市|四平市|辽源市|通化市|白山市|松原市|白城市|延边朝鲜族自治州 吉林省互联网医院资质申请条件   一、《医疗机构管理条例》第十六条申请医疗机构执业登记,应具备下列条件:   1.有设置医疗机构批准书&a…

论文笔记 | 标准误聚类问题

关于标准误的选择,如是否选择稳健性标准误、是否采取聚类标准误。之前一直是困惑的,惯用的做法是类似主题的文献做法。所以这一次,借计量经济学课程之故,较深入学习了标准误的选择问题。 在开始之前推荐一个知乎博主。他阅读了很…

【vue2】axios请求与axios拦截器的使用详解

🥳博 主:初映CY的前说(前端领域) 🌞个人信条:想要变成得到,中间还有做到! 🤘本文核心:当我们在路由跳转前与后我们可实现触发的操作 【前言】ajax是一种在javaScript代码中发请…

使用对象存储库管理 UFT 中的对象

1. 记录一个新订单 在UFT 菜单栏中,选择 File] New|Test 创建一个新的测试。单击 Record,出现 Record and Run Settings。单击 Record and Run Settings 对话框的OK 按钮。单击 New Order 按钮,设置初始条件。输入以下航班信息。航班日期: 选…

台灯有必要买一百多的吗?2023专家建议孩子买台灯

问题:台灯有必要买一百多的吗? 回答:不建议买一百多的台灯,建议选择国AA级的台灯 现在许多学生出现视力问题,原因是在平时没有注意到不良好的用眼环境 孩子早早戴上小眼镜,家长不惜花心思去买各种视力保护…

flstudio怎么改主题,如何更改FL Studio21背景图片

fl studio作为一款功能强大且实用的音频处理和音乐制作软件,其精致的界面布局一直为众多音乐人所喜爱,但是fl studio编曲软件安装后初始内置的灰黑色工作区背景,难免成为美中不足的一点。 那么用户如何根据自己的喜好设置工作区背景呢&#x…

Java基础知识

Java基础知识 一、计算机开发语言发展 计算机语言总体可分为机器语言、汇编语言、高级语言三大类,这三类开发语言恰恰是计算与开发语言的三个阶段。 机器语言:机器语言是第一代计算机开发语言,是通过最原始的穿孔卡片(二进制有孔…

《疯狂Java讲义》读书笔记3

这两天总结了数据结构中栈的用法,对栈的初始化、出栈、入栈的总结: http://t.csdn.cn/7sKjQ 对双栈共享的初始化、入栈、出栈的总结: http://t.csdn.cn/4WXCO 调用父类构造器 子类不会获得父类的构造器,但是可以调用父类构造…

聊一聊前端的性能指标

一、前端性能指标有哪些? 根据 chrome Lighthouse 最新规则,前端性能指标考量主要有 FCP(First Contenful Paint)、SI(Speed Index)、LCP(Largest Contentful Paint)、TBT&#xff…

四个常见的Linux技术面问题

刚毕业要找工作了,只要是你找工作就会有面试这个环节,那么在面试环节中,有哪些注意事项值得我的关注呢?特别是专业技术岗位,这样的岗位询问一般都是在职的工程师,如何在面试环节更好地理解面试官的问题&…

IDEA的热部署【MyBatis XML热部署 】

本文适用修改JAVA代码热部署、MyBatis XML的热部署。 一、JAVA代码热部署. 新版IDEA中:开启允许在运行过程中修改文件 最后要在Debug模式启动,可以看到热部署的加载文件了,可以手动点左边那个图标立即加载生效. 二、MyBatis XML修改热部署. MybatisMap…

MFCC语音特征值提取算法

博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的&#xff0c…

银行数字化转型导师坚鹏:银行产品经理技能快速提升之道

银行产品经理技能快速提升之道 ——以推动银行战略目标实现为核心,实现知行果合一课程背景: 很多银行都在开展产品经理技能提升工作,目前存在以下问题急需解决: 不知道银行产品经理掌握哪些关键知识? 不清楚如何有效…

C++修炼之练气期第二层——缺省参数

目录 1.缺省参数的概念 2.缺省参数的分类 全缺省参数 半缺省参数 实用场景示例 1.缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。 在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。 #inclu…