在线交易行为的统计分析实践

来自CloudWiki
跳转至: 导航搜索

数据的读入

数据文件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()
  1. 这幅图的结论:浏览与购买基本在一条直线附近,收藏量大转化率会小

计算用户对“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