当前位置:   article > 正文

python用户价值分析_python客户价值分析

python客户价值分析

数据获取:

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

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

RFM模型

RFM的含义:

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

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

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


数据透视表

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

  1. # 透视表
  2. df = data.pivot_table(index=['CustomerID'],
  3. values=['InvoiceDate', 'InvoiceNo', 'total'],
  4. aggfunc={'InvoiceDate': 'max', 'InvoiceNo': 'count', 'total': 'sum'}
  5. )
  6. print(df)
CustomerID在excel 中放在行的位置,其实是列名;
values:需要处理的数据
aggfunc:是需要处理的列计算方法

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

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

这样就添加了一列R

 

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

  1. df.rename(columns = {'InvoiceNo':'F','total':'M'},inplace= True)
  2. rfmdf = df[['R','F','M']]
  3. print(rfmdf)

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

模型分类:

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

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

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

  1. def func(x):
  2. label = {
  3. '111': '重要价值客户',
  4. '101': '重要发展客户',
  5. '011': '重要保持客户',
  6. '001': '重要挽留客户',
  7. '110': '一般价值客户',
  8. '100': '一般发展客户',
  9. '010': '一般保持客户',
  10. '000': '一般挽留客户'
  11. }
  12. return label[x['R']+x['F']+x['M']]
  13. rfmdf['label'] = rfmdf.apply(func,axis=1)
  14. rfmdf['label'].value_counts()
  15. print(rfmdf)

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

对数据进行绘图:

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

  1. import matplotlib.pyplot as plt
  2. plt.rcParams['font.sans-serif'] = ['SimHei']
  3. plt.rcParams['font.size'] = 20
  4. rfmdf['label'].value_counts().plot.bar(figsize=(20,9),color='red',alpha=0.6)
  5. plt.xticks(rotation =0)
  6. for i ,j in enumerate(rfmdf['label'].value_counts()):
  7. plt.text(i-0.1,j+50,j,va='center')
  8. plt.show()

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

以下是完整的代码

  1. import pandas as pd
  2. # import numpy as np
  3. import matplotlib.pyplot as plt
  4. data = pd.read_csv(r'E:\数据分析\用户价值分析 RFM模型\data.csv')
  5. pd.set_option('display.max_columns', 888) # 大于总列数
  6. pd.set_option('display.width', 1000)
  7. # print(data.head())
  8. # print(data.info())
  9. # .空值处理
  10. # print(data.isnull().sum()) # 空值中和,查看每一列的空值
  11. # 空值删除
  12. data.drop(columns=['Description'], inplace=True)
  13. # CustomerID有空值
  14. # 删除所有列的空值
  15. data.dropna(inplace=True)
  16. # print(data.isnull().sum()) # 由于CustomerID为必须字段,所以强制删除其他列,以CustomerID为准
  17. #
  18. # 转换为日期类型
  19. data['InvoiceDate'] = pd.to_datetime(data['InvoiceDate'])
  20. # CustomerID 转换为整型
  21. data['CustomerID'] = data['CustomerID'].astype('int')
  22. # print(data.describe())
  23. data = data[data['Quantity'] > 0]
  24. # print(data)
  25. #
  26. # 查看重复值
  27. # data[data.duplicated()]
  28. # print(data[data.duplicated()])
  29. # 删除重复值
  30. data.drop_duplicates(inplace=True)
  31. # 每张发票的总价
  32. data['total'] = data['Quantity'] * data['UnitPrice']
  33. # # 透视表
  34. df = data.pivot_table(index=['CustomerID'],
  35. values=['InvoiceDate', 'InvoiceNo', 'total'],
  36. aggfunc={'InvoiceDate': 'max', 'InvoiceNo': 'count', 'total': 'sum'}
  37. )
  38. # 1) 对用户进行分组,求得每个用户最后一次交易时间
  39. # 2) 分析的数据时间段内最晚的时间 - 最后一次交易时间
  40. df['R'] = (df['InvoiceDate'].max() - df['InvoiceDate']).dt.days # 求得天数
  41. # print(df)
  42. df.rename(columns = {'InvoiceNo':'F','total':'M'},inplace= True)
  43. rfmdf = df[['R','F','M']]
  44. print(rfmdf)
  45. # 先二分
  46. rfmdf = rfmdf.apply(lambda x : x- x.mean())
  47. # 如果>平均值,则为'1',否则为'0'
  48. rfmdf = rfmdf.applymap(lambda x : '1' if x>0 else '0')
  49. def func(x):
  50. label = {
  51. '111': '重要价值客户',
  52. '101': '重要发展客户',
  53. '011': '重要保持客户',
  54. '001': '重要挽留客户',
  55. '110': '一般价值客户',
  56. '100': '一般发展客户',
  57. '010': '一般保持客户',
  58. '000': '一般挽留客户'
  59. }
  60. return label[x['R']+x['F']+x['M']]
  61. rfmdf['label'] = rfmdf.apply(func,axis=1)
  62. # value_counts()
  63. rfmdf['label'].value_counts()
  64. print(rfmdf)
  65. plt.rcParams['font.sans-serif'] = ['SimHei']
  66. plt.rcParams['font.size'] = 20
  67. rfmdf['label'].value_counts().plot.bar(figsize=(20,9),color='red',alpha=0.6)
  68. plt.xticks(rotation =0)
  69. for i ,j in enumerate(rfmdf['label'].value_counts()):
  70. plt.text(i-0.1,j+50,j,va='center')
  71. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/780033
推荐阅读
相关标签
  

闽ICP备14008679号