数据分析之——用户消费行为分析
内容摘要
- 项目背景
- 项目目的
- 分析思路
- python数据分析实现
- PowerBI可视化看板设置
一、项目背景
- 这是一份用户消费行为的分析报告;
数据来源于网上,是用户在一家单车网站上的消费记录,其时间跨度为1997年1月至1998年4月。 - 数据格式:txt文档,具体信息见图
- 第一列——user_id:用户ID
第二列——order_dt:购买日期
第三列——order_prodects:购买产品数
第四列——order_amount:购买金额
二、项目目的
通过数据分析:
1、了解本网站的基本营业情况;
2、对用户行为进行分析,掌握用户的分布情况,便于之后的策略制定;
三、分析思路
1、基础数据整理清洗
2、针对月份进行用户消费趋势的分析——便于掌握公司的营收发展趋势
3、针对用户个体消费进行分析
4、针对用户消费行为进行分析
5、针对用户购买周期进行分析
6、针对用户复购回购进行分析
四、python数据分析实现
-
一、基础数据整理清洗
数据清洗的目的在于对数据进行审查和校验,其主要操作有:
(1)解析原始数据列名,理解其意义并做通俗化替换;
(2)查看数据源每一条信息的数据类型是否正确;
(3)查看数据有无缺失值情况;
(4)查看数据有无异常值情况;
(5)数据一致化处理(多用于针对时间数据)- 首先导入数据,解析原始数据信息,做通俗化替换。
#导入必要的包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#导入数据并设置列名
#解析原始数据列名,理解其意义并做通俗化替换
columns=['user_id','order_dt','order_products','order_amount']
df=pd.read_table(r':\bicycle_master.txt',sep='\s+',names=columns)
#查看数据
df.head(2)
- 查看数据源每一列信息的数据类型是否正确,尤其需要注意可能会计算的数据和时间格式。
#查数据源每一条信息的数据类型是否正确
df.info()
#发现其中order_dt 购买日期应该为时间格式类型,并非整型数据,需要进行数据处理
-数据源中时间数据的类型为整型,需要修改成datetime格式,并且为接下来时间序列分析做准备需要将年和月提取出来。
#pd.to_datetime函数进行转换
df['order_dt']=pd.to_datetime(df['order_dt'],format='%Y%m%d')
#同时考虑到后续对数据分分析,将其按照年、月将时间提取出来
#生成年、月
df['Year']=df['order_dt'].astype('datetime64[Y]')
df['Month']=df['order_dt'].astype('datetime64[M]')
#查看数据
df.head(2)
#查看数据描述
df.describe()
-
发现大部分订单只消费了少量商品,75%用户的产品购买量仅3个;
用户的消费金额比较稳定,平均消费35元,中位数在25元,存在一定极值的干扰。 -
基础数据整理结束
-
二、针对月份进行用户消费趋势的分析
如果以天为尺度进行分析,具有较大的波动性和随机性,并且数据量较大;以月为尺度进行分析,能够避免一定的随机性,并且还可以看出一定的分布趋势,故选择以月为尺度进行数据分析。
以月为尺度进行分析,较为重要的是消费金额,消费频率,购买产品量和消费人数
消费人数的变化可以看出该平台对用户粘性的变化程度;消费水平一方面与消费人数有关,另一方面可能与当月的产品及活动有关。- 每月的消费总金额
- 每月的消费次数
- 每月的产品购买量
- 每月的消费人数
#需要对Month进行一个groupby,并对购买金额和购买产品数量进行求和,对购买次数(用户id)进行计数
grouped=df.groupby(df['Month']).agg({
"order_amount":'sum','user_id':'count','order_products':'sum'})
grouped.head()
#统计每月的消费人数,即统计用户id唯一值的个数
order_month_person=grouped_month.user_id.nunique()
order_m_p=order_month_person.to_frame()
order_m_p.head()
-
对用户人数统计可以看出,4月后出现明显的下跌趋势,将数据进行保存,用于后期powerbi绘图
-
三、针对用户个体消费进行分析
- 用户消费金额,消费个数描述性统计
- 用户消费金额和消费次数的散点图
- 用户消费金额的分布图
- 用户消费次数的分布图
- 用户累计消费金额占比
#新建一个按照用户分类的数据
user_info=df.groupby('user_id')
#用户消费金额,消费个数描述性统计
user_info.sum().describe()
(1)用户消费金额,消费个数描述性统计
- 用户平均购买为7,但是中位值只有3,说明购买量大的用户占少数
- 用户平均消费106元,中位值有43,判断同上,有极值干扰
(2)用户消费金额和产品个数的散点图
#用户消费金额和消费次数的散点图
user_info.sum().plot.scatter(x='order_amount',y='order_products')
#绘制消费金额和消费个数的散点图
user_cost_number=df.groupby('user_id').agg({
'order_amount':'sum','order_products'