数据处理呆鸟的Python数据分析python机器学习爬虫

①数据分析项目实战:用户消费行为分析

2019-06-28  本文已影响239人  Dylan丶海

正所谓“纸上得来终觉浅,绝知此事要躬行”,通过对Python进行数据分析的学习掌握,现在需要通过实操总结来检验自己的学习成果。
本篇文章主要是利用Python进行数据处理,分析用户消费行为。数据来源CD网站的消费记录,有用户ID、购买日期、购买数量、购买金额四个字段科目。(模仿操作)
【分析步骤】


CD网站销售数据.png
# 导入常用的库:
import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
%matplotlib inline    #‘%’内置的命令,jupyter专有的定义,比如在pycharm不常用到,inline意思是我做好图之后可以在html页面的单元格进行显示
plt.style.use('ggplot')  #更改设计风格,使用自带的形式进行美化,这是一个r语言的风格
df.head()  #展示前5行数据
df.info()  #查看数据类型
df.describe()   #对数据进行描述统计
# 数据类型的转化
df['order_dt'] = pd.to_datetime(df.order_dt,format = "%Y%m%d")  #其中Y表示四位数的年份,y表示两位数的年份
df['month'] = df.order_dt.values.astype('datetime64[M]')

第一部分的数据清理已经完成,可以开始后续的分析了

第二部分按月进行数据分析

我将从四个方面来展示数据波动情况,进而分析用户的消费趋势

#1.每月消费总金额
grouped_month = df.groupby('month')
order_month_amount = grouped_month.order_amount.sum()
order_month_amount.head()
# 2.每月消费次数
grouped_month.user_id.count().plot()  #plot是折线图,用于展示数据趋势
# 3.每月的产品购买量
grouped_month.order_products.sum().plot()
# 4.每月的消费人数
df.groupby('month').user_id.apply(lambda x: len(x.drop_duplicates())).plot() 
#这里需要注意到因为一个人在一个月内可能存在多笔消费,所以使用匿名函数lambda进行去重
df.pivot_table(index = 'month',
              values = ['order_products', 'order_amount', 'user_id'],
              aggfunc = {'order_products': 'sum',
                        'order_amount': 'sum',
                        'user_id': 'count'}).head()

通过聚合函数groupby了解分析了用户的消费趋势

第三部分:用户个体消费数据分析

前面是以时间(月)的维度来分析用户消费趋势,这一节以个体消费特点来分析用户消费行为,为此划分了五个方面来分析:

# 1.用户消费金额和消费次数的描述统计
grouped_user = df.groupby('user_id')
grouped_user.sum().describe()
# 2.用户消费金额和消费次数的散点图
grouped_user.sum().query('order_amount < 4000').plot.scatter(x = 'order_amount', y = 'order_products')
# 注:query后面只支持string形式的值
# 3.用户消费金额的分布图(二八法则)
grouped_user.sum().order_amount.plot.hist(bins = 20)
# bins = 20是指直方图中的个数,是将order_amount的值分成20份
# 4.用户消费次数的分布图
grouped_user.sum().query('order_products < 100').order_products.hist(bins = 20)
# 5.用户累计消费金额的占比
user_cumsum = grouped_user.sum().sort_values('order_amount').apply(lambda x:x.cumsum() / x.sum())
user_cumsum.reset_index().order_amount.plot()
# 注:sort_values是对值进行排序,升序,cumsum是滚动累加求和

用户个体消费情况基本上符合行业规律,符合二八法则的特点;而在处理数据过程中,需要注意异常值对判断的干扰,应该对异常值进行过滤,由此也能提升图形美观。

第四部分:用户消费行为分析

# 1.用户第一次消费(首购)
grouped_user.min().order_dt.value_counts().plot()
# 2.用户最后一次消费
grouped_user.max().order_dt.value_counts().plot()
# 3.新老客消费比
user_life = grouped_user.order_dt.agg(['min','max'])
user_life.head()
# 用户购买周期
(user_life['min'] == user_life['max']).value_counts()
# 4.用户分层
rfm = df.pivot_table(index = 'user_id',
                    values = ['order_products', 'order_amount', 'order_dt'],
                    aggfunc = {'order_dt':'max',
                               'order_amount': 'sum',
                               'order_products': 'sum'})
rfm.head()
# 4.1rfm距今天数
rfm['R'] = -(rfm.order_dt - rfm.order_dt.max()) / np.timedelta64(1, 'D')
rfm.rename(columns = {'order_products': 'F', 'order_amount': 'M'}, inplace = True)
rfm.head()
# 4.2用户分层: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)
rfm.head()
# 4.3用户分层:求和
rfm.groupby('label').sum()
# 4.4用户分层:计数
rfm.groupby('label').count()
# 4.5用户分层:RFM模型
rfm.loc[rfm.label == '重要价值客户','color'] = 'g'
rfm.loc[~(rfm.label == '重要价值客户'), 'color'] = 'r'
rfm.plot.scatter('F', 'R', c = rfm.color)
# pandas中增加颜色需要新增一列
# 4.6用户分层:用户生命周期
pivoted_counts = df.pivot_table(index = 'user_id',
                               columns = 'month',
                               values = 'order_dt',
                               aggfunc = 'count').fillna(0)
pivoted_counts.head()
# 4.7用户生命周期
df_purchase = pivoted_counts.applymap(lambda x: 1 if x > 0 else 0)
df_purchase.tail()
# 4.8用户分层:用户生命周期状态变化
def active_status(data):
    status = []  #创建一个空的列表
    for i in range(18):
        
        #若本月没有消费
        if data[i] == 0:
            if len(status) > 0:
                if status[i-1] == 'unreg':
                    status.append('unreg')
                else:
                    status.append('unactive')
            else:
                status.append('unreg')
                
        #若本月消费
        else:
            if len(status) == 0:
                status.append('new')
            else:
                if status[i - 1] == 'unactive':
                    status.append('return')
                elif status[i-1] == 'unreg':
                    status.append('new')
                else:
                    status.append('active')
    return status
purchase_stats = df_purchase.apply(active_status, axis = 1)
purchase_stats.head(5)
purchase_stats.tail(5)

这里要分两种情况分析:
若本月没有消费

若本月有消费

# 每月不同活跃用户的计算
purchase_stats_ct = purchase_stats.replace('unreg',np.NaN).apply(lambda x: pd.value_counts(x))
purchase_stats_ct
#purchase_stats_ct.fillna(0).T.head()
purchase_stats_ct.fillna(0).T.plot.area()

由上表可知,每月的用户消费状态变化(图表还不太美观)

由此我们可以得出一个结论:流失的用户增加,回流用户正在减少

# 5.用户购买周期(按订单)
order_diff = grouped_user.apply(lambda x:x.order_dt - x.order_dt.shift())  
order_diff.head(10)
# 这里运用匿名函数lambda,对分组后的用户根据订单购买时间进行错位相减
order_diff.describe()
# 5.1用户消费周期分布
(order_diff / np.timedelta64(1, 'D')).hist(bins = 20)
# 6.用户生命周期(第一笔订单时间和最后一笔订单时间)
(user_life['max'] - user_life['min']).describe()
# 6.1用户生命周期分布图
((user_life['max'] - user_life['min'])/ np.timedelta64(1, 'D')).hist(bins = 40)
# 6.2用户生命周期分布图(过滤掉0天)
u_l = (user_life['max'] - user_life['min'])/np.timedelta64(1,'D')
u_l[u_l > 0].hist(bins = 40)

7.复购率和回购率分析

pivoted_counts.head()
# 7.1复购率
purchase_r = pivoted_counts.applymap(lambda x: 1 if x > 1 else np.NaN if x == 0 else 0)
purchase_r.head()
# 7.2复购率折线图
(purchase_r.sum() / purchase_r.count()).plot(figsize = (10, 4))
df_purchase.head()
# 7.3回购率
def purchase_back(data):
    status = []  #创建一个空列表,用来保存用户回购的字段
    for i in range(17):
        if data[i] == 1:   #用户本月消费过下月也消费过记为1
            if data[i+1] == 1:
                status.append(1)
            if data[i+1] == 0:    #用户下月没有消费过记为0
                status.append(0)
        else:
            status.append(np.NaN)  #用户本月没消费,记为NaN
    status.append(np.NaN)
    return status
purchase_b = df_purchase.apply(purchase_back, axis = 1)
purchase_b.head(5)
(purchase_b.sum() / purchase_b.count()).plot(figsize = (10, 4))

通过用户消费行为的分析,可以看出各类知识点的运用需要结合实际业务情况,对数据进行过滤

上一篇 下一篇

猜你喜欢

热点阅读