Python分析CDNow的用户消费行为
数据:CDNow网站的用户购买明细
目的:根据CDNow网站的用户购买明细,分析用户的消费行为
分析思路:
原始数据并未提供分析目的要求的行为数据,需通过已知的数据构建指标。目的是为了分析用户的消费行为,故采用维度分析法,从特定的角度和层面分析数据
分析内容框架:见目录
一、数据加载与初探
# 导入相关库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
%matplotlib inline
user_id:用户ID
order_dt:购买日期
order_products:购买产品数
order_amount:购买金额
源数据为txt文件,通过read_csv读取数据,‘\s+'表示匹配任意空格符
# 导入数据
columns = ['user_id','order_dt','order_products','order_amount']
df = pd.read_table("CDNOW_master.txt",names=columns,sep='\s+')
# 数据初探
df.info()
数据质量描述:数据中无缺失值,无需对缺失值处理,但购买日期的数据类型是int,后续需使用to_datetime函数将其转化成datetime格式。
df.head(5)
从前五行数据,可以发现同一用户在一天内可能购买多次、同一用户在不同时间多次购买等现象。
# 数据描述性统计
df.describe()
从数据的描述性统计中,可以发现:1、用户平均每笔订单购买2.4件商品,中位数为2.0,数据呈现正偏态(右偏)特征;2、用户单笔订单最高购买99件商品,订单商品量较高,需要关注极值点;3、用户平均订单金额为35.89,中位数为25.98,数据同样呈现正偏态(右偏)特征,反映大部分订单的金额都集中小额范围内;4、用户单笔订单最高金额为1286,需要关注极值点。
二、消费情况分析
# 利用to_dateframe()函数将order_dt转化为datetime对象
df["order_dt"] = pd.to_datetime(df["order_dt"],format="%Y%m%d")
2.1 从用户维度分析消费情况
2.1.1 用户消费金额、订单商品量、消费次数的描述性统计分析
#tips:注意df['order_amount']与df[['order_amount']]的区别,一个返回series,另一个返回Dataframe
# 对数据按照user_id进行分类聚合
user_grouped = df.groupby('user_id').agg({
'user_id':'count',
'order_products':'sum',
'order_amount':'sum'})
user_grouped.describe()
通过对数据进行描述性统计分析发现:1、用户平均消费2.95次,中位数为1次,用户消费次数数据呈现右偏的特征,反映多数用户在该网站上只消费1次;2、订单商品量与订单金额数据均呈现右偏特征,且均值都与3/4分位数值接近,反映网站的订单商品量与订单金额主要由少部分头部用户贡献;3、需要关注极值点的影响。
# 用户消费次数、订单商品量、订单金额分布直方图
plt.figure(figsize=(20,4),dpi=80)
plt.subplot(1,3,1)
user_grouped['user_id'].plot.hist(bins=30)
plt.subplot(1,3,2)
user_grouped['order_products'].plot.hist(bins=30)
plt.subplot(1,3,3)
user_grouped['order_amount'].plot.hist(bins=30)
由于前文中提到的极值影响,数据的分布受到一定的干扰,需要对极值进行过滤处理再观察数据的分布特征。 根据切比雪夫定理,距离平均值有三个标准差的值均为异常值。根据描述性统计数据与实际业务情况,计算得到用户消费次数、订单商品量、订单金额分布的范围分别为0-17,0-58,0-829。分别使用query函数过滤极值再绘制分布直方图。
# 使用query函数过滤极值后,用户消费次数、订单商品量、订单金额分布直方图
plt.figure(figsize=(20,4),dpi=80)
plt.subplot(1,3,1)
user_grouped.query('user_id<17')['user_id'].plot.hist(bins=15)
plt.subplot(1,3,2)
user_grouped.query('order_products<58')['order_products'].plot.hist(bins=30)
plt.subplot(1,3,3)
user_grouped.query('order_amount<829')['order_amount'].plot.hist(bins=30)
从用户消费次数、订单商品量、订单金额分布直方图可以发现:数据大多集中在低值区,反映绝大部分用户的消费水平一般,贡献价值不高。这种分布也符合消费类数据的分布特征——长尾型分布。
2.1.2 用户消费金额和订单商品量之间相关性分析
# 绘制用户消费金额和订单商品量散点图
user_grouped.plot.scatter(x='order_products',y='order_amount')
# 使用query函数过滤极值点,绘制用户消费金额和订单商品量散点图
user_grouped.query('order_products<600' and 'order_amount<8000').plot.scatter(x='order_products',y='order_amount')
用户消费金额和订单商品量散点图呈现明显的线性相关关系,说明商品较为单一,价格稳定。
2.2 从时间维度分析消费情况
以月份为统计窗口
# 对数据按月进行降采样
df_dtindex = df.set_index(['order_dt']) # 设置order_dt作为索引TimeStamp
month_grouped = df_dtindex.resample('m').sum()[['order_products','order_amount']]
month_grouped['user_sum'] = df_dtindex.resample('m')['user_id'].nunique()
month_grouped.head(5)
2.2.1-3 每月消费人数情况、每月订单商品量、每月订单金额
month_grouped.plot(kind='line',subplots=True,figsize=(9,7))