数据蛙数据分析每周作业大数据大数据 爬虫Python AI Sql

CD用户消费行为分析:pandas、matplotlib库的运用

2019-02-10  本文已影响19人  夜希辰
CD用户消费行为分析:pandas、matplotlib库的运用

回成都了…开始工作了……
然而学习状态和工作状态还没调整过来,唯一值得庆幸的是这个年外婆没有把我养胖。

本文主要是利用pandas进行数据处理,分析用户消费行为
实战内容:CD用户消费行为分析
数据地址:实战数据下载地址,密码g6vv

前言:数据来源CDNow网站的用户购买明细。一共有用户ID,购买日期,购买数量,购买金额四个字段。
我们通过案例数据完成一份基础的数据分析报告。具体的分析思路可参考秦路老师七周七数据分析

《具体分析步骤》

第一部分:数据类型的处理—字段的清洗
缺失值的处理、数据类型的转化
第二部分:按月数据分析
每月的消费总金额、每月的消费次数、每月的产品购买量、每月的消费人数
第三部分:用户个体消费数据分析
用户消费金额和消费次数的描述统计、用户消费金额和消费次数的散点图、用户消费金额的分布图(二八法则)、用户消费次数的分布图
、用户累计消费金额的占比
第四部分:用户消费行为分析
用户第一次消费时间、用户最后一次消费时间、新老客消费比、用户分层、用户购买周期、用户生命周期。

第一部分:数据类型的处理—字段的清洗

导入常用的库:
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语言的风格
columns = ['user_id','order_dt','order_products','order_amount']
df = pd.read_table("CDNOW_master.txt",names = columns,sep = '\s+')

列字段的含义:
user_id:用户ID
order_dt:购买日期
order_products:购买产品数
order_amount:购买金额
df.head()
CD用户消费行为分析:pandas、matplotlib库的运用
df.info()
CD用户消费行为分析:pandas、matplotlib库的运用
df.describe()
CD用户消费行为分析:pandas、matplotlib库的运用
数据类型的转化
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、消费趋势的分析

01-每月消费总金额
grouped_month = df.groupby('month')
order_month_amount = grouped_month.order_amount.sum()
order_month_amount.head()
02-每月的消费次数(订单数)
grouped_month.user_id.count().plot()
CD用户消费行为分析:pandas、matplotlib库的运用
03-每月的产品购买量
grouped_month.order_products.sum().plot()
CD用户消费行为分析:pandas、matplotlib库的运用
04-每月的消费人数(去重)
方法一:
df.groupby('month').user_id.apply(lambda x:len(x.drop_duplicates())).plot()

方法二:
df.groupby('month').user_id.nunique().plot()  #nunique查看数据有多少不同的行
#这里会有一点区别,因为一个人在一个月内可能多笔消费,可能一号买了一点二号买了一点,所以要进行去重的操作
CD用户消费行为分析:pandas、matplotlib库的运用
** 附加:上面消费趋势的分析可以通过数据透视表分析 **
df.pivot_table(index = 'month',
              values = ['order_products','order_amount','user_id'],
              aggfunc = {'order_products':'sum','order_amount':'sum','user_id':'count'})
第二部分小结:

按月数据分析主要用group by简单了解了消费趋势

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

之前我们维度都是月,来看的是趋势。有时候我们也需要看个体来看这个人的消费能力如何,这里划分了五个方向如下:

01-用户消费金额和消费次数的描述统计
group_user = df.groupby('user_id')
group_user.sum().describe()

【图10】


CD用户消费行为分析:pandas、matplotlib库的运用
02-用户消费金额和消费次数的散点图
group_user.sum().query('order_amount < 4000'). plot.scatter(x = 'order_amount' , y = 'order_products')
#query后面只支持string形式的值

【图11】


CD用户消费行为分析:pandas、matplotlib库的运用
03-用户消费金额的分布图(二八法则)
group_user.sum().order_amount. plot.hist(bins = 20)
#bins = 20,就是分成20块,最高金额是14000,每个项就是700

【图12】


CD用户消费行为分析:pandas、matplotlib库的运用
04-用户消费次数的分布图(二八法则)
group_user.sum().query('order_products < 100').order_products.hist(bins = 40)

【图13】


CD用户消费行为分析:pandas、matplotlib库的运用
05-用户累计消费金额的占比(百分之多少的用户占了百分之多少的消费额)
方法一:
user_cumsum = (group_user.sum().sort_values('order_amount').cumsum)/ 2500315.63

方法二:
user_cumsum = group_user.sum().sort_values('order_amount').apply(lambda x: x.cumsum() / x.sum())
user_cumsum
#axis = 0按列计算
#cumsum滚动累加求和
#sort_values排序,升序

【图14】


CD用户消费行为分析:pandas、matplotlib库的运用

【图15】


CD用户消费行为分析:pandas、matplotlib库的运用

【图16】


CD用户消费行为分析:pandas、matplotlib库的运用

【图17】


CD用户消费行为分析:pandas、matplotlib库的运用
第三部分小结:
第四部分:用户消费行为分析
- 用户第一次消费(首购)。
#在很多行业里面首购是一个很重要的维度,它和渠道息息相关,尤其是针对客单价比较高客户留存率比价低的行业,第一次客户从哪里来可以拓展出很多运营方式。
- 用户最后一次消费
- 新老客消费比
    - 多少用户仅消费了一次
    - 每月新客占比
- 用户分层
    - RFM
    - 新、老、活跃、流失
- 用户购买周期(按订单)
    - 用户消费周期描述
    - 用户消费周期分布
- 用户生命周期(按第一次&最后一次消费)
    - 用户生命周期描述
    - 用户生命周期分布
01-用户第一次消费(首购)
up_user.month.min().value_counts()

【图18】


CD用户消费行为分析:pandas、matplotlib库的运用
02-用户最后一次消费
group_user.month.max().value_counts()

【图19】


CD用户消费行为分析:pandas、matplotlib库的运用

【图20】


CD用户消费行为分析:pandas、matplotlib库的运用
03-新老客的消费比
user_life = group_user.order_dt.agg(['min','max'])
user_life.head()

【图21】


CD用户消费行为分析:pandas、matplotlib库的运用
用户购买周期
(user_life['min'] == user_life['max']).value_counts()

【图22】


CD用户消费行为分析:pandas、matplotlib库的运用
04 - 用户分层
rfm = df.pivot_table(index = 'user_id',
                    values = ['order_products','order_amount','order_dt'],
                    aggfunc = {'order_products':'max','order_amount':'sum','order_products':'sum'})

rfm.head()
#order_amount消费总金额,order_products消费产品数,order_products最近一次消费时间

【图23】


CD用户消费行为分析:pandas、matplotlib库的运用
04-rfm距今天数
rfm['R'] =-(rfm.order_dt - rfm.order_dt.max()) / np.timedelta64(1,'D')
#-(rfm.order_dt - rfm.order_dt.max())结果为时间类型,将时间格式转化为整数或者浮点数的形式,可以除以单位‘D’,也可以用astype转化
rfm.rename(columns ={'order_products':'F', 'order_amount':'M'},inplace = True )
rfm.head()
#rename,重命名

【图24】

04-用户分层: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()

【图25】

04-用户分层:求和
rfm.groupby('label').sum()

【图26】

04-用户分层:计数
rfm.groupby('label').count()

【图27】

04-RFM用户分层
rfm.loc[rfm.label == '重要价值客户','color'] = 'g'
rfm.loc[~(rfm.label == '重要价值客户'),'color'] = 'r'
rfm.plot.scatter('F','R',c = rfm.color)
#pandas中增加颜色需要新增加一列

【图28】

04-用户分层:用户生命周期
pivoted_counts = df.pivot_table(index = 'user_id',
                               columns = 'month',
                               values = 'order_dt',
                               aggfunc = 'count').fillna(0)
pivoted_counts.head()

【图29】

04-用户生命周期
df_purchase = pivoted_counts.applymap(lambda x  : 1 if x > 0 else 0)
df_purchase.tail()

【图30】

04-用户分层:用户生命周期状态变化
#此处代码有些许问题
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

pivoted_status = df_purchase.apply( active_status,axis = 1)
pivoted_status.head()   

【图31】

每月不同活跃用户的计数
purchase_status_ct = pivoted_status.replace('unreg',np.NaN).apply(lambda x : pd.value_counts(x))
purchase_status_ct

【图32。此处代码有部分问题】
【图33】
【图34】

上一篇 下一篇

猜你喜欢

热点阅读