赵ya毕设

import numpy as np
import pandas as pd
import matplotlib as  mpl
from matplotlib import pyplot as plt
import seaborn as sns
import warnings
import matplotlib.dates as mdates
from datetime import timedelta
warnings.filterwarnings('ignore')
# 用来显示中文标签
mpl.rcParams["font.family"] = "SimHei"
# 用来显示负号
mpl.rcParams["axes.unicode_minus"] = False


# 写入数据
 
df = pd.read_csv(r"D:\Desktop\淘宝用户行为数据\UserBehavior_new.csv",header=None,names=['用户id','商品ID','商品类目ID','行为类型','时间戳'])
data=df.take(indices=np.random.permutation(df.shape[0]),axis=0)[0:1000000]
data.to_csv(r"D:\Desktop\淘宝用户行为数据\UserBehavior_new01.csv")

data['时间戳']=pd.to_datetime(data['时间戳'],unit='s')
data.时间戳=pd.to_datetime(data['时间戳'])
data['date']=data['时间戳'].dt.date
data['hour']=data['时间戳'].dt.time
data['week']=data['时间戳'].dt.weekday

d_pv=data.groupby('date').用户id.count()#groupby 里面不能用时间戳
d_uv=data.groupby('date').用户id.nunique()#date默认为字符串类型
 
plt.style.use('ggplot')
plt.figure(figsize=(20,18),dpi=80)
plt.subplot(611)
plt.plot(d_pv.index,d_pv.values,'bo-')
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.gcf().autofmt_xdate()#自动旋转日期标记
plt.xlabel('2014-xx-xx')
plt.title('一个月内pv的变化')
plt.show()

plt.figure(figsize=(20,18),dpi=80)
plt.subplot(611)
plt.plot(d_uv.index,d_uv.values,'ro-')
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.gcf().autofmt_xdate()#自动旋转日期标记
plt.xlabel('2014-xx-xx')
plt.title('一个月内uv的变化')
plt.show()

#日ARPPU每付费平均费用=总收入/活跃付费用户数(由于没有具体金额,所以使用消费总数代替总金额)
#每天每人消费总次数
one_user_buy1=data_new[data_new['行为类型']=='buy'].groupby(['date','用户id']).size().reset_index().rename(columns={0:'total'})
#one_user_buy1.head()
one_user_buy2=one_user_buy1.groupby('date')['total'].sum()/one_user_buy1.groupby('date')['total'].count()
plt.figure(figsize=(18,5), dpi=80)
plt.subplot(121)
one_user_buy2.plot()
plt.ylabel('平均次数')
plt.title('日ARPPU')
plt.show()

#日ARPU平均每活跃用户消费次数
data_new['operation']=1
#每天不同用户不同行为类型次数
data_new_user_active1=data_new.groupby(['date','用户id','行为类型'])['operation'].count().reset_index().rename(columns={'operation':'total'})
#data_user_active.head()
plt.figure(figsize=(18,5), dpi=80)
plt.subplot(122)
data_user_active2=data_new_user_active1.groupby('date').apply(lambda x: x[x.行为类型 =='buy'].total.sum()/len(x.用户id.unique()))
data_user_active2.plot()
plt.ylabel('平均次数')
plt.title('日ARPU')
plt.show()

#付费率
buy_rate=data_new_user_active1.groupby('date').apply(lambda x:x[x.行为类型=='buy'].total.count()/len(x.用户id.unique()))
buy_rate.plot()
plt.ylabel('付费率')
plt.title('付费率')
plt.show()

re_buy1=data_new[data_new.行为类型=='buy'].groupby('用户id')['date'].apply(lambda x:len(x.unique()))
re_buy2=re_buy1[re_buy1>=2].count()/re_buy1.count()


re_day_buy=data_new[data_new.行为类型=='buy'].groupby('用户id').date.apply(lambda x: x.sort_values()).diff(1).dropna()
re_day_buy=re_day_buy.map(lambda x: abs(x.days))
df1= re_day_buy.value_counts()
plt.figure(figsize=(15,5)) 
X=df1.index
Y=df1.values
plt.bar(range(len(X)),Y,tick_label=X,color='g',width=0.5)
font={'size':18,}
plt.ylabel('数量',font)
plt.xlabel('复购间隔时间(天)',font)
plt.xticks(fontsize=10)
plt.yticks(fontsize=15) 
plt.legend()
plt.title('复购时间间隔分布',fontsize=18)
plt.show()


samedt_user_buy=data_new[data_new['行为类型']=='buy'].groupby(['用户id','date','hour'])['operation'].sum()
df2= samedt_user_buy.value_counts()
 
plt.figure(figsize=(15,5)) 
X=df2.index
Y=df2.values
plt.bar(range(len(X)),Y,tick_label=X,color='g',width=0.5)
font={'size':18,}
plt.ylabel('数量',font)
plt.xlabel('复购次数',font)
plt.xticks(fontsize=10)
plt.yticks(fontsize=15) 
plt.legend()
plt.title('复购频率分布',fontsize=18)
plt.show()


from pyecharts import options as opts
from pyecharts.charts import Funnel
from pyecharts.faker import Faker
pv_users = data[data.行为类型 == 'pv']['用户id'].count()
fav_users = data[data.行为类型== 'cart']['用户id'].count()
cart_users = data[data.行为类型== 'fav']['用户id'].count()
buy_users = data[data.行为类型 == 'buy']['用户id'].count()
attr = ['pv', 'cart', 'fav', 'buy']
values = [np.around((pv_users / pv_users * 100), 2),
         np.around((cart_users / pv_users * 100), 2),
         np.around((fav_users / pv_users * 100), 2),
         np.around((buy_users / pv_users * 100), 2)]
c = (
    Funnel()
    .add(
        series_name="环节",
        data_pair=[list(z) for z in zip(attr,values)],
        sort_="descending", # 数据排序显示顺序,降序
        label_opts=opts.LabelOpts(font_size=13,position="right",formatter="{b}"),
    )
    .set_global_opts(title_opts=opts.TitleOpts(title="用户行为转化漏斗",subtitle="图中的比例表示该行为下的总行为次数占浏览行为总次数的比例"))
    .render("用户行为转化漏斗.html")
)

#RFM分析(假设现在是2014,12,20)
from datetime import datetime 
#最近一次购买距离现在的天数
data['date']=pd.to_datetime(data['date'])
recent_buy=data[data.行为类型=='buy'].groupby('用户id')['date'].apply(lambda x: datetime(2014,12,20)-x.sort_values().iloc[-1]).reset_index().rename(columns={'date':'recent'})
recent_buy.recent=recent_buy.recent.map(lambda x: x.days)
#购买频率(购买次数)
fred_buy=data[data.行为类型=='buy'].groupby('用户id').date.count().reset_index().rename(columns={'date':'fred'})
#rfm
 
recent_fred=pd.merge(recent_buy,fred_buy,on='用户id')
#为实现自动细分,将使用R和F变量的80%分位数
quantiles=recent_fred.quantile(q=[0.8])
 
recent_fred['R']=np.where(recent_fred['recent']<=int(quantiles.recent.values),2,1)#R(Recency,最近一次消费时间间隔):指用户上一次消费距今多长时间
recent_fred['F']=np.where(recent_fred['fred']<=int(quantiles.fred.values),1,2)#F(Frequency,消费频率):指用户在一段时间内消费的次数
recent_fred['rfm']=recent_fred.R.map(str)+recent_fred.F.map(str)              #M(Monetary,消费金额):指用户一段时间内的消费金额
 
#打标签,时间越近次数越多越重要
labels = {'12':'流失客户','22': '明星客户','11':'次要客户','21':'新客户'}
recent_fred['labels']= recent_fred['rfm'].apply(lambda x: labels[x])
rfm=pd.DataFrame(recent_fred['labels'].value_counts())
 
plt.figure(figsize=(10,7))
#print(rfm._values) 发现是个二维数组
#rfm._values=sum(rfm._values,[])
print(rfm.values)  #报错:can't set attribute
plt.pie([4488,1164,1000,37],autopct='%1.1f%%',labels=rfm.index,explode=[0.05,0,0,0],colors=['red','yellowgreen','gold','orange'])
plt.legend()
plt.axis('equal')
plt.title('客户类群占比',fontsize=18)

# 用户质量RFM聚类分析(基于消费行为特征聚类分析)
from sklearn.cluster import KMeans
from sklearn import metrics
import matplotlib.pyplot as plt
from sklearn import preprocessing
 
#准备数据
recent_fred.用户id = recent_fred.用户id.astype('str')
X = recent_fred.values[:,1:3]
 
# 数据标准化(z_score)
Model = preprocessing.StandardScaler()
X = Model.fit_transform(X)
 
ss_score = []
inertia = []
for k in range(2,10):
    clf = KMeans(n_clusters=k,max_iter=1000)
    pred = clf.fit_predict(X) 
    ss = metrics.silhouette_score(X,pred)
    ss_score.append(ss)
    inertia.append(clf.inertia_)
    
# 做图对比    
fig = plt.figure()
ax1 = fig.add_subplot(121)
plt.plot(list(range(2,10)),ss_score,c='b')
plt.title('轮廓系数')
 
 
ax1 = fig.add_subplot(122)
plt.plot(range(2,10),inertia,marker='o')
plt.xlabel('number of clusters')
plt.ylabel('distortions')
plt.title('inertia')
plt.show()

# 根据最佳的K值,聚类得到结果
model = KMeans(n_clusters=4,max_iter=1000)
model.fit_predict(X)
recent_fred['type']=model.labels_
rf_type=recent_fred.drop(['R','F','rfm','labels'],axis=1,inplace=False)
r=rf_type.groupby('type').mean()
r['样本个数']=rf_type['type'].value_counts()
r['样本个数占比']=r['样本个数']/rf_type['type'].count()
r['样本个数占比']=r['样本个数占比'].map(lambda x: '%.2f%%'%(x*100))
r.columns=[['R均值','F均值','样本个数','样本个数占比']]
#可视化聚类结果
plt.style.use('ggplot')
# 四个簇的簇中心
#centers = model.cluster_centers_
 
# 绘制聚类效果的散点图
sns.lmplot(x = 'recent', y = 'fred', hue = 'type', markers = ['^','s','o','v'],data =rf_type, fit_reg = False, scatter_kws = {'alpha':0.8}, legend_out = False)
#plt.scatter(centers[:,0],centers[:,1], marker = '*', color = 'black', s = 130)
plt.xlabel('消费时间间隔')
plt.ylabel('消费频率')
# 图形显示
plt.show()

#分析出每个用户对商品的不同行为
one_hot_df=pd.get_dummies(df['行为类型'])
user_item_behavior_df=pd.concat((df[['用户id','商品ID']],one_hot_df),axis=1)#对两张表进行横向拼接
pv_sum_item_10_s=user_item_behavior_data.groupby(by='商品ID')['pv'].sum().sort_values().tail(10)
pv_sum_ite


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值