一份用户消费行为的分析报告

# 这是一份数据分析报告
# 围绕一下几个部分进行分析
# 1、描述统计
# 2、用户复购率的计算
# 3、复购率
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# %matplolib inline
# 列名单独取了一个列表的形式
columns = ['user_id','order_dt','order_products','order_amount']
# sep是分隔符,s+自动处理多个空格,因为字符大于1的话,则使用s+的方式
df = pd.read_table('CDNOW_master.txt',names = columns,sep = '\s+')
# print(df.head())
# df.info():字段的清洗
# print(df.describe()):描述统计
# 解析日期order_dt,转换日期的格式,order_dt的前四位数字变为Y年份,中间两位变为m月份,后两位变为d日
df['order_dt'] = pd.to_datetime(df.order_dt,format = "%Y%m%d")
#astype用来进行时间维度的转换,M的意思转换为月份,values转换为数组的形式不能省略
df['month'] = df.order_dt.values.astype('datetime64[M]')

# grouped_month为聚合好的对象,以月进行分组
grouped_month = df.groupby('month')
# sum每月消费的总金额
order_month_amout = grouped_month.order_amount.sum()
print(order_month_amout.head())
# print(df)
# 更改设计风格为ggplot
plt.style.use('ggplot')
# 每月消费的总金额的折线图
order_month_amout.plot()
plt.show()
# 每月的订单数
grouped_month.user_id.count().plot()
plt.show()
# 每月的订单产品
grouped_month.order_products.sum().plot()
# 利用apply去重,计算每个月的人数,并用drop_duplicates对相同的人进行去重
df.groupby('month').user_id.apply(lambda x:len(x.drop_duplicates())).plot()
# 利用groupby去重,先去重后再重置列
df.groupby(['month','user_id']).count().reset_index()
# print(df)
# pivot_table是pandas的透视表,按月为索引,values就是想计算的值,对所想求的内容用字典的形式列出来
print(df.pivot_table(index='month',
        values= ['order_products','order_amount','user_id'],
        aggfunc={'order_products':sum,
                 'order_amount':'sum',
                 'user_id':'count'}).head())

# 用户个体消费分析
# 针对user_id进行聚合分组
grouped_user=df.groupby('user_id')
# 对人数求和描述
print(grouped_user.sum().describe())
# 散点图的函数,分为x轴和y轴
grouped_user.sum().plot.scatter(x = 'order_amount',y = 'order_products')
plt.show()
# 用户金额用直方图分为20块
grouped_user.sum().order_amount.plot.hist(bins=20)
plt.show()
# query过滤,用户产品小于100的直方图,切比雪夫方式
grouped_user.sum().query('order_products<100').order_products.plot.hist(bins=40)
plt.show()
# 通过列计算进行累加和,用户占比
user_cumsum = grouped_user.sum().sort_values('order_amount').apply(lambda x:x.cumsum() / x.sum())
# reset_index是把索引去掉,方便作图
user_cumsum.reset_index().order_amount.plot()
plt.show()

# 用户消费行为
# 求用户第一次的消费时间人群数量的总和
grouped_user.min().order_dt.value_counts().plot()
plt.show()
# 求用户最后一次的消费时间人群数量的总和
grouped_user.max().order_dt.value_counts().plot()
plt.show()
# 用户的第一次消费和最后一次消费
user_life = grouped_user.order_dt.agg(['min','max'])
print(user_life.head())
# 用户只消费一次的人数和不止一次消费的人数
print((user_life['min'] == user_life['max']).value_counts())

rfm = df.pivot_table(index='user_id',
        values= ['order_products','order_amount','order_dt'],
        aggfunc={'order_products':sum,
                 'order_amount':'sum',
                 'order_dt':'max'})
print(rfm.head())
# 计算时间之间的天数,np.timedelta64为了去掉后面带的days
rfm['R'] = -(rfm.order_dt - rfm.order_dt.max())/np.timedelta64(1,'D')
# 重命名
rfm.rename(columns = {'order_products':'F','order_amount':'M'},inplace=True)
# print(rfm)

# 对每种客户类型的一种分类
def rfm_func(x):
    level = x.apply(lambda x:'1' if x>=0 else '0')
    label = level.R +level.F +  level.M
    d = {
        '111':'重要价值客户',
        '011': '重要保持客户',
        '101': '重要挽留客户',
        '001': '重要发展客户',
        '110': '一般价值客户',
        '010': '一般保持客户',
        '100': '一般挽留客户',
        '000': '一般发展客户',
    }
    result = d[label]
    return result
rfm['label'] = rfm[['R','F','M']].apply(lambda x:x - x.mean()).apply(rfm_func,axis=1)
print(rfm)
# 不同类型客户的总和
print(rfm.groupby('label').sum())
rfm.plot.scatter('F','R')
plt.show()

# 数据透视,user_id为索引,月为列
pivoted_counts = df.pivot_table(index = 'user_id',
                                columns =  'month',
                                values = 'order_dt',
                                aggfunc = 'count').fillna(0)
print(pivoted_counts.head())
# 消费次数大于0的为1,反之则为0
df_purchase = pivoted_counts.applymap(lambda x:1 if x>0 else 0)
print(df_purchase.tail())

# plot.area()面积图

#产生用户订单时间间隔,用户订单进行偏移相减,shift用来进行数值列向下偏移一个
order_diff = grouped_user.apply(lambda x:x.order_dt - x.order_dt.shift())
print(order_diff.head(10))
order_diff.describe()
(order_diff/np.timedelta64(1,'D')).hist(bins=20)
plt.show()

pivoted_counts.head()
purchase_r = pivoted_counts.applymap(lambda x:1 if x > 1 else np.NAN if x==0 else 0)
print(purchase_r.head())
(purchase_r.sum()/purchase_r.count()).plot(figsize=(10,4))
plt.show()
df_purchase.head()
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值