背景
网易云音乐大家都被大家所熟知 , 数据脱敏之后,形成了文本数据。
本节主要通过分析网易云音乐的用户购买明细来分析该网站的用户消费行为,使运营业务部门在营销时更加具有针对性,从而节省成本,提升效率。
提出问题
对用户进行消费特征分析。分析框架如下:
数据处理
导入数据
#导入常用的库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.style.use(‘ggplot’) #更改设计风格,使用自带的形式进行美化
plt.rcParams[“font.sans-serif”] = [“SimHei”] # 用来显示中文
plt.rcParams[“axes.unicode_minus”] = False # 用来显示负号
seq标识分隔符,分隔符为\t ,即制表符,表示列与列之间用\t分开
df = pd.read_table(“./wangyiyun.txt”, sep = ‘\s+’)
df
columns = [‘用户ID’,‘购买日期’,‘订单数’,‘订单金额’]
df = pd.read_table(“./wangyiyun.txt”,names= columns, sep = ‘\s+’)
\f -> 匹配一个换页
\n -> 匹配一个换行符
\r -> 匹配一个回车符
\t -> 匹配一个制表符
而"\s+"则表示匹配任意多个上面的字符
df
总结
- 加载包和数据,文件是txt,用read_table方法打开,因为原始数据不包含表头,所以有names参数 。字符串是空格分割,用\s+表示匹配任意空白符。
- 一般csv的数据分隔是以逗号的形式,但是这份数据它是通过多个空格来进行分隔
- 消费行业或者是电商行业一般是通过订单数,订单额,购买日期,用户ID这四个字段来分析的。基本上这四个字段就可以进行很丰富的分析。
#看看详细信息
df.info()
<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 69659 entries, 0 to 69658
Data columns (total 4 columns):
#Column Non-Null Count Dtype
0 用户ID 69659 non-null int64
1 购买日期 69659 non-null int64
2 订单数 69659 non-null int64
3 订单金额 69659 non-null float64
dtypes: float64(1), int64(3)
memory usage: 2.1 MB
#默认输出前五行
df.head()
- 观察数据,购买日期列表示时间,是int类型,数据不是时间类型,需要转换。购买金额是float类型
- 没有缺失值,这个比较不错
- 数据中存在一个用户在同一天或不同天下多次订单的情况,如用户ID为2的用户就在1月12日买了两次。
描述性统计
#数值列的汇总统计信息
df.describe()
describe是描述统计,对用户数据特征进行整体性判断:
- 从数据的统计描述信息中可以看出,用户每个订单平均购买2.41个商品,每个订单平均消费35.89元。
- 购买商品数量的标准差为2.33,平均数是 2.4 std/mean 小于0.5(统计学经验来看) 说明 mean更有代表性
- 中位数为2个商品,75%分位数为3个商品,说明大部分订单的购买数量都不多。最大值在99个,数字比较高。订单金额的情况差不多,大部分订单都集中在小额。
- 一般而言,消费类的数据分布,都是长尾形态。大部分用户都是小额,然而小部分用户贡献了收入的大头,俗称二八。
数据处理
#索引,数据类型和内存信息
df.info()
<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 69659 entries, 0 to 69658
Data columns (total 4 columns):
#Column Non-Null Count Dtype
0 用户ID 69659 non-null int64
1 购买日期 69659 non-null int64
2 订单数 69659 non-null int64
3 订单金额 69659 non-null float64
dtypes: float64(1), int64(3)
memory usage: 2.1 MB
- 没有缺失值 , 接下来我们要将时间的数据类型转化。
pd.to_datetime(df[‘购买日期’])
#将购买日期列进行数据类型转换
df[‘购买日期’] = pd.to_datetime(df[‘购买日期’],format = ‘%Y%m%d’)
df[‘购买日期’] # 发现excel导入的时间格式均为datetime64[ns],毫秒格式。
#把日期转化为月为单位
df[‘购买日期’].astype(‘datetime64[M]’)
#df[‘月份’] = df[‘购买日期’].values.astype(‘datetime64[M]’)
df[‘月份’] = df[‘购买日期’].astype(‘datetime64[M]’)
#df[‘购买日期’].dt.month # 可以类比 str访问器
df.head(30)
总结
- pd.to_datetime可以将特定的字符串或者数字转换成时间格式,其中的format参数用于匹配。例如19970101,%Y匹配前四位数字1997
- 另外,小时是%h,分钟是%M,注意和月的大小写不一致,秒是%s。若是1997-01-01这形式,则是%Y-%m-%d
- astype也可以将时间格式进行转换,比如[M]转化成月份。我们将月份作为消费行为时间窗口,选择哪种时间窗口取决于消费频率。
用户总体消费趋势分析
df.groupby(‘月份’)[‘订单金额’].sum()
#设置图的大小,添加子图
plt.figure(figsize=(20,15))
#每月的总销售额
plt.subplot(221)
df.groupby(‘月份’)[‘订单金额’].sum().plot(fontsize=24)
plt.title(‘总销售额’,fontsize=24)
#每月的消费次数
plt.subplot(222)
df.groupby(‘月份’)[‘购买日期’].count().plot(fontsize=24)
plt.title(‘消费次数’,fontsize=24)
#每月的销量
plt.subplot(223)
df.groupby(‘月份’)[‘订单数’].sum().plot(fontsize=24)
plt.title(‘总销量’,fontsize=24)
#每月的消费人数
plt.subplot