一、项目背景
在本项目中,我们基于用户购买数据(Transaction Data)做用户的分群,使用的方法一次是RFM模型和K-means算法。
数据来源:http://archive.ics.uci.edu/ml/datasets/online+retail
二、数据的读取
import pandas as pd
import numpy as np
import datetime as dt
# 读取transaction数据, 数据有些大,读取会需要点时间
df = pd.read_excel('OnlineClean.xlsx')
df.head()
df.shape
(397884, 8)
对于上面的数据稍作解释一下:
- InvoiceNo: 每一次的Transaction的unique number. 比如你去了超市,买了5件东西,那这些东西就构成一个InvoiceNo
- StockCode: 表示的是每一件商品的unique number.
- Description: 商品的描述
- Quantity: 购买的数量
- InvoiceDate: Transaction的时间
- UnitPrice: 每一件商品的价格
- CustomerID: 用户ID
- Country: 国家
df.dtypes
InvoiceNo int64
StockCode object
Description object
Quantity int64
InvoiceDate datetime64[ns]
UnitPrice float64
CustomerID int64
Country object
二、数据清洗
# 对于时间属性做个转换,只保留年月日
df['InvoiceDate'] = df['InvoiceDate'].dt.date
df.dtypes
InvoiceNo int64
StockCode object
Description object
Quantity int64
InvoiceDate object
UnitPrice float64
CustomerID int64
Country object
dtype: object
df.head()
# 一般情况下,在使用RFM模型的时候,一般需要过去一年的Transaction数据。为了提取过去一年的数据,我们首先对时间做一下处理。
print('Min date = {}, Max date = {}'.format(min(df.InvoiceDate), max(df.InvoiceDate)))
Min date = 2010-12-01, Max date = 2011-12-09
从以上的输出可以看到,时间比一年稍微多点。所以我们就把2010-12-01到 2010-12-09忽略不计,从 2010-12-10开始算到2011-12-09, 这样就刚好一年的时间。
# 只考虑大于2010-12-09
df = df[df['InvoiceDate']>dt.date(2010,12,9)]
df.head()
# 创建一个新的变量,叫做snapshot_date。 举个例子,我们已经有了过去一年的历史数据,然后基于历史数据要计算出R, F, M。
# 如果历史数据是昨天为止的,那当我们计算R(recency)的时候, 就需要今天 - 历史。 这样一来,今天其实就是昨天日期+1就可以了,这个
# 我们把它叫作snapshot_date
snapshot_date = max(df.InvoiceDate) + dt.timedelta(days=1)
snapshot_date
datetime.date(2011, 12, 10)
# 我们再创建一个column叫作TotalSum, 来表示购买某一种商品的总额
df['TotalSum'] = df['Quantity'] * df['UnitPrice']
df.head()
到目前为止数据方面的整理工作已经就绪。接下来呢,需要来计算R,F,M的值了。 为了计算R,F,M需要对每一位Customer做Aggregation操作,这部分可以通过df.