用户个体消费分析

#这份数据 分别是  用户的id  消费的日期 购买的产品数量,购买的金额

首先对数据进行预处理:

 首先我们对数据进行读取,并且做出相应数据的转换。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#这份数据 分别是  用户的id  消费的日期 购买的产品数量,购买的金额
colums = ['usr_id','order_dt','order_products','order_amount']
#因为是txt的数据所以我用read_table
#这里的分割符是 多个空格
df = pd.read_table("CDNOW_master.txt",names=colums,sep='\s+')
#当我们看数据类型发现日期是 int类型,后期需要进行转换
print(df.info())
#转换日期的操作
df['order_dt'] = pd.to_datetime(df.order_dt,format="%Y%m%d")
#时间维度的转换 按照月份 ,values不能忘记加
df['month'] = df.order_dt.values.astype('datetime64[M]')
print(df.head())
#因为数据是按月的所以现在按照月份分组(聚合)
grouped_month = df.groupby('month')

 一、用户消费金额、消费次数的描述统计:

# 一、用户消费金额、消费次数的描述统计
grouped_user = df.groupby('usr_id')
print(grouped_user.sum().describe())

 描述结果:

 结果分析:

    用户评价购买的数量为7,但是中位值只有3,说明小部分用户购买了大量的产品

    用户评价消费106元,中位值只有43,判断同上,有极值干扰

二、用户消费金额和消费的散点图:

现在我们通过数据可视化的散点图来观察:

#利用散点图来观察
#用户消费金额、消费次数的描述统计可视化
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')
plt.title("用户消费金额、消费次数的描述统计")
plt.ylabel("order_products")
plt.xlabel('order_amount')
#按照用户id进行每月的统计订单,都是一行
grouped_user.sum().plot.scatter(x='order_amount',y='order_products')
plt.savefig('user_amount.jpg')
plt.show()

可视化结果: 

 我们还可以对极值进行过滤处理:

#利用散点图来观察
#用户消费金额、消费次数的描述统计可视化
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')
plt.title("用户消费金额、消费次数的描述统计")
plt.ylabel("order_products")
plt.xlabel('order_amount')
#按照用户id进行每月的统计订单,都是一行
grouped_user.sum().query('order_amount < 4000').plot.scatter(x='order_amount',y='order_products')
plt.savefig('user_amount.jpg')
plt.show()

过滤的结果:

 上面两图可知用户的消费行为分析,并且做出了极值过滤

三、用户消费金额的分布图

 

#用户消费金额的直方图
grouped_user.sum().query("order_amount<100").order_amount.plot.hist(bins=20)
plt.savefig('custome_amount.jpg')
plt.show()

结果展示: 

 

四、用户消费次数的分布图

#使用分层的直方图来观看数据的趋势
#使用分层的直方图来观看数据的趋势
grouped_user.sum().order_products.plot.hist(bins=40)
plt.savefig('order_amount_fencheng.jpg')
plt.show()

结果展示:

 

从直方图可知:用户消费金额,绝大部分呈现集中趋势,小部分异常值干扰了判断,可以使用过滤操作排除异常

 现在对数据进行过滤后的直方图展示:

grouped_user.sum().query("order_products<100").order_products.plot.hist(bins=40)
plt.savefig('order_amount_fencheng.jpg')
plt.show()

 五、用户累计消费金额占比(百分之多少的用户占了百分之多少的消费额)

 先对数据进行排序然后累加求和处理

#cumsum() 累加求和的函数
user_cumsum = grouped_user.sum().sort_values('order_amount').cumsum()
print(user_cumsum)

 

所占比例:用户累计求和除总的和

user_cumsum = grouped_user.sum().sort_values('order_amount').apply(lambda x:x.cumsum()/x.sum())
print(user_cumsum)

#去除索引方便作图
user_cumsum.reset_index().order_amount.plot()
plt.savefig("用户消费累计比.jpg")

按用户消费金额进行升序排列,由图可知50%的用户仅贡献了15%的消费额度。而排名前5000的用户就贡献了40%的消费额

部分数据:

00001 19970101  1   11.77
00002 19970112  1   12.00
00002 19970112  5   77.00
00003 19970102  2   20.76
00003 19970330  2   20.76
00003 19970402  2   19.54
00003 19971115  5   57.45
00003 19971125  4   20.96
00003 19980528  1   16.99
00004 19970101  2   29.33
00004 19970118  2   29.73
00004 19970802  1   14.96
00004 19971212  2   26.48
00005 19970101  2   29.33
00005 19970114  1   13.97
00005 19970204  3   38.90
00005 19970411  3   45.55
00005 19970531  3   38.71
00005 19970616  2   26.14
00005 19970722  2   28.14
00005 19970915  3   40.47
00005 19971208  4   46.46
00005 19971212  3   40.47
00005 19980103  3   37.47
00006 19970101  1   20.99
00007 19970101  2   28.74
00007 19971011  7   97.43
00007 19980322  9  138.50
00008 19970101  1    9.77
00008 19970213  1   13.97
00008 19970617  3   45.29
00008 19970703  2   36.76
00008 19971116  1    2.99
00008 19971116  7   50.43
00008 19971225  1   13.99
00008 19980329  2   24.46
00009 19970101  2   23.54
00009 19970513  2   30.33
00009 19980608  2   41.98
00010 19970121  3   39.31
00011 19970101  1   13.49
00011 19970128  1   19.30
00011 19970317  1   12.77
00011 19980220  1   12.99
00012 19970101  4   57.06
00013 19970101  4   72.94
00014 19970101  2   29.92
00015 19970101  4   52.87
00016 19970101  1    9.77
00016 19970713  2   31.60
00016 19970726  4   28.51
00016 19970910  1    9.99
00017 19970101  5   73.22
00018 19970104  1   14.96
00019 19970101 10  163.35
00019 19970610  1   11.77
00020 19970101 27  363.60
00020 19970118 19  289.41
00021 19970101  3   63.34
00021 19970113  1   11.77
00022 19970101  1   14.37
00023 19970101  2   24.74
00024 19970101  3   47.28
00024 19980120  1   10.49
00025 19970101  2   24.96
00025 19970718  1   13.90
00025 19970817  1   12.25
00025 19971024  1   12.99
00025 19980417  1   12.99
00025 19980525  1   10.49
00025 19980603  3   24.97
00025 19980608  2   24.98
00026 19970101  3   42.72
00026 19970126  3   59.97
00027 19970107  6   83.41
00027 19970112  4   52.46
00028 19970101  3   39.51
00028 19970127  2   25.74
00028 19970308  2   25.74
00029 19970101  3   46.72
00029 19970206  3   67.31
00029 19970309  3   41.10
00029 19970405  3   44.52
00029 19970420  1   13.97
00029 19970504  2   26.14
00029 19970530  1   32.45
00029 19970713  2   37.65
00029 19970713  2   26.74
00029 19970906  1   14.79
00029 19971102  3   35.97
00029 19980426  4   48.45
00030 19970101  1   14.37
00030 19970214  1   13.97
00031 19970101  4   59.06
00031 19980407  4   42.89
00031 19980409  3   38.06
00031 19980525  3   37.04
00032 19970101  3   49.97
00032 19970124  1   16.36
00032 19980311  1   11.88

 整体代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#这份数据 分别是  用户的id  消费的日期 购买的产品数量,购买的金额
colums = ['usr_id','order_dt','order_products','order_amount']
#因为是txt的数据所以我用read_table
#这里的分割符是 多个空格
df = pd.read_table("CDNOW_master.txt",names=colums,sep='\s+')
#当我们看数据类型发现日期是 int类型,后期需要进行转换
print(df.info())
#转换日期的操作
df['order_dt'] = pd.to_datetime(df.order_dt,format="%Y%m%d")
#时间维度的转换 按照月份 ,values不能忘记加
df['month'] = df.order_dt.values.astype('datetime64[M]')
print(df.head())
#因为数据是按月的所以现在按照月份分组(聚合)
grouped_month = df.groupby('month')

# 一、用户消费金额、消费次数的描述统计
#按照用户进行分组,然后对用户id进行求和描述
grouped_user = df.groupby('usr_id')
print(grouped_user.sum().describe())
#利用散点图来观察
#用户消费金额、消费次数的描述统计可视化
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('ggplot')
plt.title("用户消费金额、消费次数的描述统计")
plt.ylabel("order_products")
plt.xlabel('order_amount')
#按照用户id进行每月的统计订单,都是一行
grouped_user.sum().query('order_amount < 4000').plot.scatter(x='order_amount',y='order_products')
plt.savefig('user_amount.jpg')
plt.show()
#使用分层的直方图来观看数据的趋势
grouped_user.sum().query("order_products<100").order_products.plot.hist(bins=40)
plt.savefig('order_amount_fencheng.jpg')
plt.show()

#用户消费金额的直方图
grouped_user.sum().query("order_amount<100").order_amount.plot.hist(bins=20)
plt.savefig('custome_amount.jpg')
plt.show()

#用户累计消费金额占比
#cumsum() 累加求和的函数
# user_cumsum = grouped_user.sum().sort_values('order_amount').cumsum()

user_cumsum = grouped_user.sum().sort_values('order_amount').apply(lambda x:x.cumsum()/x.sum())
print(user_cumsum)
#去除索引方便作图
user_cumsum.reset_index().order_amount.plot()
plt.savefig("用户消费累计比.jpg")

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值