Kaggle: UK E-Commerce 用户行为分析
项目概览
-
数据背景:
此次项目数据来自Kaggle,是英国零售商的实际交易数据,包含了2010年12月1日至2011年12月9日在英国注册的非实体网上零售发生的所有交易。公司主要销售独特的全天候礼品。该公司的许多客户都是批发商。 -
分析目的:
采用RFM模型,从用户、地区和时间等维度分析用户行为并提出优化建议。
理解数据
将下载好的数据导入数据库中,得到一个542K x 8 的数据集,列属性分别为:
- InvoiceNo --> 订单号码: 6位字符串
- StockCode --> 产品代码: 6位字符串
- Description --> 产品描述
- Quantity --> 产品数量:交易产品数量
- InvoiceDate --> 订单日期:订单发生的日期和时间
- UnitPrice --> 单价:浮点数值
- CustomerID --> 顾客ID:5位字符串
- Country --> 国家:客户所在地
数据预处理
观察数据集
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 541909 entries, 0 to 541908
Data columns (total 8 columns):
InvoiceNo 541909 non-null object
StockCode 541909 non-null object
Description 540455 non-null object
Quantity 541909 non-null int64
InvoiceDate 541909 non-null object
UnitPrice 541909 non-null float64
CustomerID 406829 non-null float64
Country 541909 non-null object
dtypes: float64(2), int64(1), object(5)
memory usage: 33.1+ MB
df.head()
df.describe()
修改一下 InvoiceDate 的日期显示类型,然后先增加一列日期
df['InvoiceDate']=pd.to_datetime(df.InvoiceDate,format='%m/%d/%Y %H:%M')
df['Date']=df['InvoiceDate'].dt.date
检查,处理空值
检查空值
df.isnull().sum()
显示空值行
df[df.isnull().T.any()]
统计不同列的缺失率
描述和客户ID有缺失,而且确实的比例比较高。
df.apply(lambda x :sum(x.isnull())/len(x),axis=0)
删除不用的数据
df.drop(['Description'],axis=1,inplace=True)
df.head()
标记缺失值
df['CustomerID'] = df['CustomerID'].fillna('U')
新增加一列用以表示每笔订单的金额
df['amount'] = df['Quantity']*df['UnitPrice']
df.head()
去重
df = df.drop_duplicates()
再看一下UnitPrice小于0的情况,即退款的订单
df2=df[df['UnitPrice']<=0]
df2.shape[0]/df.shape[0]
再看一下有效订单,这里排除了金额小于等于0的订单,即退货情况和赠品(我认为单价为0应该是赠品吧)
df1=df[(df['Quantity']>0) & (df['UnitPrice']>0)]
df1
RFM模型分析
DATE一列已经被创造出来,且我们保存了原来的InvoiceDate 方便之后进行对照,RFM的定义不再赘述,下面是针对该实验的每个参数的实现方法:
R:最近的一次的消费。我们采用最后一天(max)作为“今天”减去每位顾客最后一次消费的时间
F: 每位顾客购买的频次
M:每位顾客购买的销量总额: unitprice*quantity
R_value=df1.groupby('CustomerID')['Date'].max()
R_value
R_value = (df1['Date'].max() - R_value).dt.days
R_value