首页 » Python » 作业4:python实现RFM模型

作业4:python实现RFM模型

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# coding=utf-8
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import matplotlib
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
# 设置中文显示
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
pd.set_option('display.max_rows', None)      # 显示完整的行
pd.set_option('display.max_columns', None)   # 显示完整的行
# 加载数据
dateparse = lambda dates: pd.datetime.strptime(dates, '%m/%d/%Y %H:%M')
data1 = pd.read_csv('data.csv',encoding='ISO-8859-1',parse_dates=['InvoiceDate'],date_parser=dateparse)
# print(data1.head())
# print(data1.info())


'''
1、    进行数据预处理
去除取消的订单;
去除完全重复(各个属性完全一样)的行;
去除客户ID为空的行;
去除总金额(单价*数量)<=0的行
'''
# 去除取消的订单
# data_del1 = data1[data1['InvoiceNo'].str.startswith('C')]
# print(data_del1.head())
# print(data_del1.info())
data2 = data1[~data1['InvoiceNo'].str.startswith('C')]
# print(data2.head())
# print(data2.info())

# 去除完全重复(各个属性完全一样)的行;
data3 = data2.drop_duplicates()
# print(data3.head())
# print(data3.info())

# 去除客户ID为空的行;
data4 = data3[data3['CustomerID'].notnull()]
# print(data4.head())
# print(data4.info())

# 去除总金额(单价*数量)<=0的行
data5 = data4[(data4['Quantity']*data4['UnitPrice']) > 0]
# print(data5.head())
# print(data5.info())
'''
2、对用户进行RFM划分,比较日期统一取2011年12月9日,最近消费时间的单位取天。计算用户标签,并用柱状图表示其分布。
'''
data5['R'] = (pd.to_datetime('2011-12-9') - data5['InvoiceDate'].dt.floor('D')).dt.days + 1
data5['M'] = data5['Quantity'] * data5['UnitPrice']
rfm_model = data5.groupby('CustomerID').agg({'R': 'min', 'InvoiceNo': 'nunique', 'M': 'sum'}).reset_index()
rfm_model.columns = ['CustomerID', 'R', 'F', 'M']
print(rfm_model.head())
print(rfm_model.info())

# 按平均值分类
rfm_model['TypeR'] = rfm_model['R'] > rfm_model['R'].mean()
rfm_model['TypeF'] = rfm_model['F'] > rfm_model['F'].mean()
rfm_model['TypeM'] = rfm_model['M'] > rfm_model['M'].mean()


def fenlei(model):
    if model['TypeR']:
        if model['TypeF']:
            if model['TypeM']:
                return '重要价值客户'
            else:
                return '一般价值客户'
        else:
            if model['TypeM']:
                return '重要发展客户'
            else:
                return '一般发展客户'
    else:
        if model['TypeF']:
            if model['TypeM']:
                return '重要保持客户'
            else:
                return '一般保持客户'
        else:
            if model['TypeM']:
                return '重要挽留客户'
            else:
                return '一般挽留客户'


rfm_model['CustomerCategory'] = rfm_model.apply(fenlei, axis=1)
rfm_jieguo = rfm_model.groupby('CustomerCategory')['CustomerID'].count()

matplotlib.style.use('ggplot')  # 设置图表风格 这个是R语言常用的风格
plt.figure(figsize=(10,8),dpi=100)  # 设置画布大小
plt.bar(x=rfm_jieguo.index, height=rfm_jieguo.values, alpha=1)
for x1, y1 in zip(rfm_jieguo.index, rfm_jieguo.values):
    plt.text(x1, y1-y1/2, str(y1), ha='center', va='top', fontsize=10)
plt.title("RFM模型客户分布")
plt.xlabel("客户标签")
plt.ylabel("人数")
plt.show()

原文链接:作业4:python实现RFM模型,转载请注明来源!

0