在线交易行为的统计分析实践
数据的读入
数据文件t_alibaba_data3.txt 来源于2014阿里天池数据竞赛。为天猫14年某月用户消费行为记录抽样。第一列为用户号,第二列为品牌号,第三列为记录类型(浏览:0 购买:1 收藏:2 购物车:3),四列为时间
下载地址: https://pan.baidu.com/s/1snkMc9HkhcpPZ5vnGNcJ2w
#import pylab from matplotlib import pylab from collections import Counter import numpy as np op=open(r"E:\t_alibaba_data3.txt","r") a=op.readlines() for i in a[0:5]: print(i.split("\t")) op.close()
['10944750', '13451', '0', '06/04\n']
['10944750', '13451', '2', '06/04\n']
['10944750', '13451', '2', '06/04\n']
['10944750', '13451', '0', '06/04\n']
['10944750', '13451', '0', '06/04\n']
继续探索,把每一行各项分割,然后存到列表里:
a1=[] for i in a: a1.append(i.split("\t")) print(a1[0:3])
[['10944750', '13451', '0', '06/04\n'], ['10944750', '13451', '2', '06/04\n'], ['10944750', '13451', '2', '06/04\n']]
请统计出各个品牌的浏览量分布
fb={} for i in a1: if i[2]=="0":#浏览量统计就是类型为0时,品牌id出现的次数 fb[i[1]]=fb.get(i[1],0)+1 #print(fb)
r2=Counter(fb.values()) x=r2.keys() y=r2.values() #pylab.loglog(x,y,"o") #pylab.show()
可以看到幂指数分布很普遍,实际上这个分布也不纯粹,当然可能是因为时间截取有关
每天的购买总量的时序图
请画出每天的购买总量的时序图
gm={} for i in a1: if i[2]=="1":#购买统计就是类型为1时,日期出现的次数 gm[i[3]]=gm.get(i[3],0)+1 #print(gm) r2=list(gm.keys()) r2.sort() gm1=[] for i in r2: gm1.append(gm[i])#按照日期对值进行重新排序 pylab.plot(range(0,len(gm1)),gm1,"-o")#横轴为了简单直接用了顺序号而没有用日期 pylab.show()
购买行为星期的周期明显
购买量和浏览次数的关系
以所有购买量大于二十的品牌做统计,浏览次数为横轴,购买量为纵轴,收藏为表示点的大小,并用随机列表选择颜色,做散点图
#构建四个字典,分别以品牌id为键,品牌的行为类型的数量为值(比如d0,d1,d2,d3四个字典,d0放入品牌以及品牌的浏览量,d1放入品牌和它的购买量) d0={} d1={} d2={} d3={} for i in a1: j=i[1] if i[2]=="0": d0[j]=d0.get(j,0)+1 elif i[2]=="1": d1[j]=d1.get(j,0)+1 elif i[2]=="2": d2[j]=d2.get(j,0)+1 elif i[2]=="3": d3[j]=d3.get(j,0)+1 #print(d1) # 输出总购买量大于20的所有品牌 btop=[] for i in d1.items(): if i[1]>=20: btop.append(i[0]) print(btop)
['8689', '7868', '27791', '2683', '15584', '14261', '23928', '11176', '8637', '554', '3627', '26288', '4949', '4571', '3228', '11679', '29099', '2367', '11196', '18024', '11080', '18075', '12285', '7105', '14020', '18805', '23779', '12168', '2257', '26722', '911', '12977', '27117', '905', '15019', '504']
把上题的所有品牌的浏览,购买,收藏,购物车四种行为分别放入四个列表
注意有些商品有购买没有收藏和购物车记录,因此在调取对应值得时候用get(i,0),是的对应列表没有此键可以用0替代
x=[] y=[] s=[] z=[] for i in btop: z.append(d2.get(i,0)) s.append(d3.get(i,0)) x.append(d0.get(i,0)) y.append(d1.get(i,0)) #print(x,y,s,z)
以浏览次数为横轴,购买量为纵轴,收藏为表示点的大小,并用随机列表选择颜色,做散点图
N=len(x) colors = np.random.rand(N)#颜色用随机数定义 r1=np.array(z) r1=r1*10+10 #直接用收藏量定义大小会在尺度上太小了,因此放大了些倍数 pylab.scatter(x, y, s=r1, c=colors, alpha=0.5) pylab.show()
- 这幅图的结论:浏览与购买基本在一条直线附近,收藏量大转化率会小
计算用户对“12154500”用户对所有品牌的平均浏览量,以及购买过的品牌和没购买过的平均浏览量
u1={} u2={} for i in a1:
if i[0]=="12154500": if i[2]=="0": u1[i[1]]=u1.get(i[1],0)+1 elif i[2]=="1": u2[i[1]]=u2.get(i[1],0)+1
print(u2)
{'8689': 2, '15086': 1, '13226': 1, '9471': 2, '17640': 9, '17214': 1, '2568': 4, '7611': 1, '7868': 12, '9549': 4, '27791': 1}
所有品牌的平均浏览量:
sum(u1.values())*1./len(u1.values())
4.12
购买过的商品的平均浏览量:
r3=[] for i in u2.keys(): r3.append(u1[i]) sum(r3)*1./len(r3)
25.09090909090909
没购买过的商品的平均浏览量:
u3=set(u1.keys())-set(u2.keys())#求出没购买过的商品 r3=[] for i in u3: r3.append(u1[i]) sum(r3)*1./len(r3)
3.042056074766355