#这份数据 分别是 用户的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")