用Python分析淘寶用戶行爲

數據來源:

阿里雲 天池數據集https://tianchi.aliyun.com/dataset/dataDetail?dataId=46

阿里巴巴提供的移動端淘寶用戶的行爲數據集,包含2014-11-18至2014-12-18共計一千多萬條數據。

數據集的每一列描述如下:

列名 說明
user_id 用戶身份(脫敏)
item_id 商品id(脫敏)
behavior_type

用戶行爲類型(點擊,收藏,加入購物車,購買)

對應數字1,2,3,4

user_geohash 地理位置
item_category

商品類別ID

time 用戶行爲發生時間

分析思路如下:

根據分析結果做出以下判斷:

  1. PV、UV和平均訪問深度都存在週期性的變化,在每週的週五會出現波谷,PV的波峯出現在每週六,UV無明顯波峯。
  2. 從10號開始PV和UV逐漸上升,在12日當天都達到頂峯,然後回落。在10-12日,用戶搜索、加購行爲較往日有所增加,而購買行爲在12日當天明顯增加,是平時購買量的三倍左右。
  3. 用戶工作日和週末的使用時間較爲相似,都集中在18:00-23:00,在21:00-22:00區間內達到最高值,但用戶在週末午間的用戶行爲略微少於工作日。
  4. 大部分用戶的日均消費次數在10次以內,約一半的用戶日均消費次數集中在0.66-2.67次,雙十二當天用戶日均消費次數明顯增加。
  5. 用戶付費率達到88.86%,用戶復購率爲91.45%,需要結合更多數據進一步分析未付費用戶的流失節點。
  6. 雙十二當天的ARPPU約爲日常的 2倍,活動結束後應做好活躍用戶的引流,保持用戶增長。
  7. PV—收藏行爲的轉化率爲4.46%,PV-加購行爲的轉化率4.46%,收藏加購—購買行爲的轉化率爲19.27%。由於用戶瀏覽-收藏加購這部分轉化率較低,需要更多的用戶行爲埋點數據進一步分析諮詢、收藏、加購、直接購買、下單和支付步驟的轉化率指標。
  8. 根據最近一次消費時間和消費頻率得到的RFM用戶模型,可以結合用戶畫像進行精細化運營。如重點關注RF評分都高的重要價值用戶,針對R高F低的重要發展用戶發放優惠券、舉辦活動等增加用戶粘性。
  9. 高點擊量的產品,如點擊量最高的產品209323160的加購和收藏量都很高,但銷量並不在前十。而銷量最高的產品,點擊、加購、收藏都不再前十榜單中。需要結合具體的商品類別和用戶行爲數據進一步分析,增加高曝光產品的購買轉化率,提高銷量高產品的宣傳。
  10. 在不同的時間點和不同的日期,商品銷量具有不同的表現,可進一步對時間和活動進行商品挖掘,更加精細化地投放商品廣告。
  11. 根據帕累託分析,45.04%的商品實現了80%的銷量。可以針對頭部商品和長尾效應進一步精細化商品運營。

運營建議和反饋:

  1. 確認是否有需求提高週五的數值,需要對週五PV、訪問深度降低的情況進一步探究變化原因。
  2. 11.28,11.29日的UV明顯偏低,確認是否有業務活動或競品的影響,需要結合前期更多的數據挖掘異常原因。
  3. 需要重點關注雙十二拉新用戶後續的留存和轉化,關注活動的長期效應。
  4. 根據用戶活動時間點,可以選擇PV較高的時間段(18:00~23:00)推送廣告或者活動,針對不同時間點核心購買人羣推送不同的商品。
  5. 用戶點擊、加購、收藏行爲在12.12活動前兩天呈明顯上升趨勢,建議前2-3天開始活動預熱刺激搜索加購,活動當天重點刺激購買行爲。
  6. 用戶行爲數據指標不足,考慮是否增加埋點,根據對標競品的各步驟的轉化率衡量產品個步驟轉化率的情況。
  7. 可以根據雙十二當天成交數據,挖掘平時銷量低但活動期間銷量高的商品種類,如3064、13230、5894等商品,在活動期間重點銷售。

數據預處理

#導入需要的包
import pandas as pd
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
import seaborn as sns

#讀取數據並粗略觀察
df=pd.read_csv(r'D:\數據分析\數據分析\tianchi\taobao.csv',engine='python')
#路徑有中文,選擇python engine
print(df.info())
print(df.head())

#按照時間保留一週的數據
df['time']=pd.to_datetime(df['time'],format='%Y-%m-%d')
t1=datetime.datetime(2014,12,8)
t2=datetime.datetime(2014,12,15)
mask=(df['time']>t1)&(df['time']<t2)
data=df[mask]
print(data.count())

#數據清洗
df.drop_duplicates(inplace=True)#刪除重複數據,無法判斷錄入重複還是時間多次點擊
df.drop('user_geohash',axis=1,inplace=True)#刪除地理位置,缺失值太多且無法分析(可能是加密了)
#標準化時間
df['time']=pd.to_datetime(df['time'],format='%Y-%m-%d')
df['hour']=df.time.dt.hour
df['time']=df.time.dt.normalize()
df=df.sort_values(by='time').reset_index(drop=True)

經過日期篩選和數據標準化,最終得到8164040條數據,各列的數據類型和數據格式如下:

用戶行爲分析

一、時間維度分析

1、流量指標

(1) PV、UV環比增長

PV:頁面瀏覽量,全部用戶在24小時內看了多少頁面,用戶每打開一個頁面就記做一次,多次打開同一頁面算作多次。這裏我們將用戶所有的操作(click, collect, add to cart,payment)次數進行求和,按照日期統計作爲當日的PV值。

UV:獨立訪客,24小時內訪問網站的用戶數,同一個人多次訪問也算一個,通過訪問的客戶端計算。我們通過用戶唯一標誌user_id進行計數求和,按照日期通知作爲當日的UV值。

條形圖反映了每天的PV值,折線圖爲環比昨日PV的值:(今日PV-昨日PV)/昨日PV,UV同理。

從週期性分析,PV和UV值都存在週期性的波動以周爲統計週期,PV在11.21,11.28,12.5這三個週五都呈現波谷,而11.23,11.30,12.7這三個週日都爲一週內的PV最高峯。但UV的情況有所不同,UV在11.22,11.28,11.29,12.5這四天,呈現週期內的波谷。結合訪問深度(PV/UV)的數據來看,11.21,11.28,12.5三個週五也都呈現週期性最低點。需要結合更長的時間線分析整體趨勢是否存在這樣的週期性變化,如果存在變化背後的原因是什麼,可具體分析週五活躍用戶和不活躍用戶之間的區別,並結合商品進行分析,看是否需要提高週五的活躍用戶數量。觀察異常情況,環比昨日,同比上週分析,11.28,11.29日的UV明顯偏低,需要結合當時的業務表現再具體探索。

在11.21日出現PV週期性減少,UV小幅波動,而訪問深度明顯降低的情況

 

(2)平均訪問深度(PV/UV)

 

(3)PV、UV及同比增長

以一週爲時間週期,比較雙十二活動前後5天的PV和UV環比變化。 由下圖可知,雙十二活動前後PV和UV的總體波動趨勢相似,從10號開始有明顯的增幅,在12日PV和UV都達到頂峯,然後回落,雙十二活動明顯促進UV、PV增長。

#UV
uv_daily=df.groupby('time')['user_id'].apply(lambda x:x.drop_duplicates().count())
uv_daily=uv_daily.reset_index().rename(columns={'user_id':'uv'})
uv_daily.set_index('time',inplace=True)
#同比
uv_daily['uv_lastday']=uv_daily.shift(1)
uv_daily['tb']=100*(uv_daily['uv']-uv_daily['uv_lastday'])/uv_daily['uv_lastday']
formater="{0:.02f}".format
uv_daily['tb']=uv_daily['tb'].map(formater).astype('float')
#環比
uv_daily['uv_7days']=uv_daily['uv'].shift(7)
uv_daily['hb']=100*(uv_daily['uv']-uv_daily['uv_7days'])/uv_daily['uv_7days']
formater="{0:.02f}".format
uv_daily['hb']=uv_daily['hb'].map(formater).astype('float')

#PV
pv_daily=df.groupby('time')['user_id'].count()
pv_daily=pv_daily.reset_index().rename(columns={'user_id':'pv'})
pv_daily.set_index('time',inplace=True)
pv_daily['pv_lastday']=pv_daily.shift(1)
pv_daily['tb']=100*(pv_daily['pv']-pv_daily['pv_lastday'])/pv_daily['pv_lastday']
formater="{0:.02f}".format
pv_daily['tb']=pv_daily['tb'].map(formater).astype('float')

pv_daily['pv_7days']=pv_daily.pv.shift(7)
pv_daily['hb']=100*(pv_daily['pv']-pv_daily['pv_7days'])/pv_daily['pv_7days']
formater="{0:.02f}".format
pv_daily['hb']=pv_daily['hb'].map(formater).astype('float')
pv_daily

(4)基於PV分析用戶行爲

由用戶行爲的日期折線圖可以看出,用戶行爲也具有周期性特點,在11.21,11.28,12.5這三個週五都是一週內的最低值,12月10日至12月12日,用戶點擊量、收藏量、加購量都明顯增長,在12月12日達到最大值,而購買量則在12月12日當日大幅度增加。

 

data=df

#按照日期和用戶行爲進行分組
pv_detail=data.groupby(['behavior_type','time'])['user_id'].count()
pv_detail=pv_detail.reset_index().rename(columns={'user_id':'total_pv'})
pv_detail['time']=pv_detail['time'].dt.strftime('%Y-%m-%d')
pv_detail['behavior_type']=pv_detail['behavior_type'].map({1:'click',2:'collect',3:'add_to_cart',4:'payment'})

#可視化
fig,axes=plt.subplots(2,1,sharex=True,figsize=(20,10))
sns.pointplot(x='time',y='total_pv',hue='behavior_type',data=pv_detail,ax=axes[0])
sns.pointplot(x='time',y='total_pv',hue='behavior_type',data=pv_detail[pv_detail.behavior_type!='click'],ax=axes[1])
axes[0].set_title('pv different behavior type')
axes[1].set_title('pv different behavior type except click')

(5)用戶使用時間分析

按照工作日與週末分別計算用戶行爲發生時段,並通過歸一化進行比較,由圖可知:

用戶行爲主要發生在19:00-23:00,在18:00-22:00存在上升期,在21:00-22:00左右達到峯值。工作日與週末用戶行爲發生時段基本一致,但與工作日相比,週末用戶在上午7:00-9:00的瀏覽相對高一些,在12:00-13:00區間瀏覽量相對較少,在18:00以後則基本保持一致。這可能是由於週末用戶可選擇網購的時間比較充沛,會在中午進行其他活動導致午間用戶行爲降低。

 

 按照一天的24小時劃分,可以發現用戶晚上的支付PV略微高於白天,但白天的點擊-支付的轉化率會高於夜間(需要排除白天的購買行爲是由白天的點擊轉化,而非晚間的),針對這種情況可以從商品角度提取不同時段高銷量高轉化的產品,測試是否分時段投放更有效。

 

#生成工作日時間序列
day=pd.bdate_range('20141118','20141218')
#週末用戶行爲~表示取非
data_time=data[~data['time'].isin(day)].groupby('hour').user_id.count()
data_time=data_time.reset_index().rename(columns={'user_id':'weekend'})
#工作日用戶行爲
data_time['weekday']=data[data['time'].isin(day)].groupby('hour').user_id.count()

#歸一化函數 可以調用sklearn裏面的
def data_norm(df,*cols):
    df_n=df.copy()
    for col in cols:
        h=df_n[col].max()
        l=df_n[col].min()
        df_n[col + '_n']=round((df_n[col]-l)/(h-l),2)
    return df_n
#歸一化
data_time_z = data_norm(data_time,'weekend','weekday')
data_time_z.loc[24]=data_time_z.loc[0]

#畫圖
data_time_z[['weekend_n','weekday_n']].plot(xlim=[0,24],xticks=list(range(0,24,1)),figsize=(20,5),title='用戶行爲發生時段')
plt.grid(False, linestyle = "--",color = "gray", linewidth = 0.5,axis = 'x',alpha=0.5)#網格線

2、轉化指標

(1)新增用戶留存分析

新增用戶留存率:首次使用後第N天內有使用行爲的用戶/首次登錄日的用戶

 

(2)活躍用戶留存分析

活躍用戶留存率:首次購買後第N天內重複購買行爲的用戶/首次購買日期的用戶

重點關注12.12拉新得到的用戶的次日留存和三日留存,發現次日留存和三日留存都低於平均值,需要再根據這一部分的用戶行爲和商品情況進行進一步的分析,關注活動拉新用戶的留存問題。

#n日轉化率函數
#定義爲第i天購買過的用戶 在第i-n天內產生過購買行爲
import warnings
warnings.filterwarnings('ignore')

def cal_PRretention(data,n): #n爲n日留存
    user=[]
    data=data[data['behavior_type']==4]
    date=pd.Series(data.time.unique()).sort_values()[:-n] #時間截取至最後一天的前n天
    retention_rates=[]
    for i in date:
        new_user=set(data[data.time==i].user_id.unique())-set(user) #識別新用戶,將最初用戶設定爲0
        user.extend(new_user)  #將新用戶加入用戶羣中
        #第n天留存情況
        user_nday=data[data.time<=i+timedelta(n)][data.time>i].user_id.unique() #第n天登錄的用戶情況
        a=0
        for user_id in user_nday:
            if user_id in new_user:
                a+=1
        retention_rate=a/len(new_user) #計算該天第n日留存率
        retention_rates.append(retention_rate) #彙總n日留存數據
    data_retention=pd.Series(retention_rates,index=date)
    return data_retention

PR7=cal_PRretention(df,7)
PR3=cal_PRretention(df,3)
PR1=cal_PRretention(df,1)
PR=pd.concat([PR1,PR3,PR7],axis=1)
PR=PR.rename(columns={0:'次日留存',1:'三日留存',2:'七日留存'})
PR.plot(style = '--.',alpha = 0.8,grid = True,figsize = (15,10),
       subplots = True,#是否分別繪製子圖,False則繪製在一張圖上
       layout = (3,1),#更改子圖佈局,按順序填充
       sharex = False)#是否共享座標

二、用戶消費習慣分析

(1)日均消費次數分析

對產生過購買行爲的用戶分析日均消費可知,絕大多數用戶日均消費次數在10次以下,一半的用戶日均消費次數集中在0.66-2.67次,存在極少量的用戶最高日均消費次數達到126次。

 雙十二當天用戶消費次數直方圖和箱型圖,可以看出雙十二當天用戶消費次數集中在1-4次,存在小部分用戶當日消費次數超過20次。

#用戶日均消費次數分析(總次數/消費天數)
data_user_buy=data[data.behavior_type==4].groupby('user_id')
data_user_buy=data_user_buy.apply(lambda x:x.behavior_type.count()/len(x.drop_duplicates(subset='time').count()))
fig=plt.figure(figsize=(10,3))
plt.subplots_adjust(wspace=0.5,hspace=0)
ax1=fig.add_subplot(121)
sns.distplot(data_user_buy,kde=False,ax=ax1)
plt.title('用戶日均消費次數直方圖')
ax2=fig.add_subplot(122)
data_user_buy.plot.box(grid=True,showfliers = False,ax=ax2)
plt.title('用戶日均消費次數箱型圖')

#雙十二當天
data_user_buy=data[(data.behavior_type==4)&(data.time=='20141212')].groupby('user_id').count()
plt.figure(figsize=(15,6))
sns.countplot(x='time',data=data_user_buy,palette='Blues_r')
plt.xlabel('消費次數')
plt.ylabel('用戶數量')
plt.title('用戶雙十二當天消費次數')

(2)ARPPU

ARPU:一個時間段內運營商從每個用戶所得到的的收入

ARPPU:平均用戶收入,平均每付費用戶收入

因爲數據集沒有訂單金額,所以用消費總次數/總消費人數來表示ARPPU,可以發現除12月12日當天,每位用戶的日均消費次數集中在2-2.2之間波動,在12日當天達到峯值約3.7次。

(3)用戶復購率

復購率:重複購買客戶數量/客戶樣本數量,復購率91.45%說明用戶黏性非常好,絕大多數付費用戶產生重複購買情況。

#用戶復購情況(一天多次購買也算重複購買)
#重複購買用戶總數/總消費人數
date_rp=data[data.behavior_type==4].groupby('user_id').count()['behavior_type']#['time'].apply(lambda x:len(x.unique()))
x=date_rp[date_rp>=2].count()
print('repeat purchase:%.2f%%'%(date_rp[date_rp>=2].count()/date_rp.count()*100))

(4)用戶付費率

用戶付費率:產生購買行爲的用戶/所有用戶,用戶付費率爲88.86%,用戶付費比率很高,說明用戶轉化比較好。

user_count=len(data.user_id.unique())
buyuser_count=len(data[data.behavior_type==4].user_id.unique())
print('afford_rate %.2f%%' %(100*buyuser_count/user_count))

三、用戶行爲轉換漏斗

將加購和收藏作爲點擊與購買的中間層次,統計用戶點擊、加購收藏、購買的每一層轉換率。點擊到加購的轉換率爲4.46%,到收藏的轉換率爲3.22%。可以通過購物推薦算法優化搜索引擎等方式幫助用戶更好找到所需商品。從用戶加入購物車和收藏夾到用戶購買的轉換率爲19.27%,可以通過發送提醒,加購收藏有禮等活動提高這一層的轉換率。

但實際用戶可以不通過加購和收藏環節直接進行購買,這個轉換率的分析不是很準確。如進一步分析,應分析加購後購買,收藏後購買,直接由點擊轉換購買三部分的轉換率。

一個更合理的轉化過程如圖所示,從諮詢、收藏、加購、直接購買等方式來分析轉化率,成交轉化率可以再精細化分爲類目、品牌、單品、渠道、事件等轉化率。(圖片思路來自《數據化管理》,這本書寫零售和電商寫的很詳細啊!)

五、用戶價值度RFM模型分析

RFM分析是根據客戶活躍程度和交易金額的貢獻,進行客戶價值細分的方法。具體參見:http://www.woshipm.com/data-analysis/708326.html

  • R(Recency):客戶最近一次交易時間的間隔。
  • F(Frequency):客戶在最近一段時間內交易的次數。
  • M(Monetary):客戶在最近一段時間內交易的金額。

因爲缺少交易金額,提取交易總次數作爲F參數,距離12-15日的消費時間間隔爲R值,F值越大說明用戶交易越頻繁,R值越大說明用戶發生交易的時間越近

由聯合分佈圖可以看出用戶消費頻次集中在0-100次的區間,消費間隔主要爲10天以內。按照用戶數量均勻分爲1-3類,用戶類型的第一個數值表示R值,R值越大,表示客戶交易發生的日期越近,第二個數值爲F值,F值越大,表示客戶交易越頻繁。在RFM用戶分類中,33對應的用戶消費時間近、消費頻次高,是高價值的用戶。13對應的用戶是消費時間遠,消費頻次高的用戶,是重點保持的用戶。

     

datenow=datetime.datetime(2014,12,15)
#每位用戶最近購買時間
recent_buy_time=data[data.behavior_type==4].groupby('user_id').time.apply(lambda x:datenow-x.sort_values().iloc[-1])
recent_buy_time=recent_buy_time.reset_index().rename(columns={'time':'recent'})
recent_buy_time.recent=recent_buy_time.recent.map(lambda x:x.days)
# #每個用戶消費頻數
buy_freq=data[data.behavior_type==4].groupby('user_id').time.count().reset_index().rename(columns={'time':'freq'})
rfm=pd.merge(recent_buy_time,buy_freq,left_on='user_id',right_on='user_id',how='outer')
# recent表示距離上次購買間隔天數,數值越小越好,因此較小數值賦值3(更重要)
rfm['R_value']=pd.qcut(rfm.recent,3,labels=['3','2','1'])
# freq表示消費次數,數值越大越好,因此較大數值賦值2(更重要)
rfm['F_value']=pd.qcut(rfm.freq,3,labels=['1','2','3'])
rfm['rfm']=rfm['R_value'].str.cat(rfm['F_value'])#str.cat拼接字符串
rfm.head()


#繪製聯合分佈圖
plt.rcParams["patch.force_edgecolor"] = True
sns.jointplot(x=rfm['recent'],y=rfm['freq'],#x軸 y軸
              data=rfm,#設置數據
              color='k',
              s=50,edgecolor='w',linewidth=1,#散點大小、邊緣、線性
              kind='scatter',#kind : {“scatter”|“reg”|“resid”|“kde”|“hex”}
              space=0.2,#散點圖和佈局圖間距
              size=6,#圖表大小
              ratio=3,#散點圖和佈局圖高度比
              marginal_kws=dict(bins=7,rug=True))#柱狀圖箱數

#繪製統計直方圖
sns.countplot(x='rfm',data=rfm,palette='Blues')
plt.title('RFM用戶分類圖')
plt.xlabel('用戶類型')
plt.ylabel('頻數')

商品分析

這一部分我沒有再重新更改,是由12.08-12.15之間的數據進行分析。

一、商品統計

(1)商品品類分析

#統計商品品類
data_buy=data[data['behavior_type']==4]
data_category=data_buy.groupby(['item_category']).time.count()
data_category.sort_values(ascending=False,inplace=True)
#統計銷量最高商品品類的item_id
max_cat=data_category[:1].index.values
data_item=data_buy[data_buy.item_category.isin(max_cat)].groupby(['item_id']).time.count()
data_item.sort_values(ascending=False,inplace=True)

fig,axes = plt.subplots(1,2,figsize=(20,5))
plt.subplots_adjust(wspace=0.3,hspace=0.3)
plt.subplot(121)
data_category[:10].plot.barh()
plt.title('商品種類銷量前十')
plt.subplot(122)
data_item[:10].plot.barh()
plt.title('銷量最高種類的十種暢銷品')

(2)商品的瀏覽,收藏,加購物車,購買的前十名

#提取數據
data_item=data.groupby(['behavior_type','item_id']).time.count()
data_item=data_item.reset_index().rename(columns={'time':'total_num'})
data_click=data_item[data_item.behavior_type==1].sort_values(by='total_num',ascending=False)[:10].set_index('item_id')
data_collect=data_item[data_item.behavior_type==2].sort_values(by='total_num',ascending=False)[:10].set_index('item_id')
data_cart=data_item[data_item.behavior_type==3].sort_values(by='total_num',ascending=False)[:10].set_index('item_id')
data_pay=data_item[data_item.behavior_type==4].sort_values(by='total_num',ascending=False)[:10].set_index('item_id')

#可視化
fig,axes = plt.subplots(2,2,figsize=(20,10))
plt.subplots_adjust(wspace=0.3,hspace=0.3)
plt.subplot(221)
data_click['total_num'].plot.barh()
plt.title('商品點擊量前十')
plt.subplot(222)
data_collect['total_num'].plot.barh()
plt.title('商品收藏量前十')
plt.subplot(223)
data_cart['total_num'].plot.barh()
plt.title('商品加入購物車前十')
plt.subplot(224)
data_pay['total_num'].plot.barh()
plt.title('商品購買量前十')

 (3) 分時段統計最高銷量種類

可以發現在12:00-17:00和17:00-24:00的最高銷量的商品存在部分重疊現象,但銷量排名不完全相同。可以根據不同的時間段推送當前時間段銷量更高的產品,或者從轉化率的角度,可以將商品廣告安排在轉化率較高的時間段。

 (4)分日期統計最高銷量種類

分日期挖掘商品種類,可以發現活動的爆款商品及日常銷量不高但活動期間銷量較高的商品。比如1863類的產品雖然平時銷量也是第一,但雙十二當天銷量遠遠超過其他種類,3064類商品日常銷量並不在前十,但雙十二當天銷量排名第三,非常具有爆款潛質。

(3)帕累託分析

對於item_id進行分析發現45.04%的商品實現了80%的銷量。

data_pareto=data[data['behavior_type']==4].groupby(['item_id']).time.count()
data_pareto=data_pareto.reset_index().sort_values('time',ascending=False)
p=data_pareto['time'].cumsum()/data_pareto['time'].sum()
key = p[p>0.8].index[0]  
print('%.2f%%的商品實現了80%%的銷量'%(100*key/data_pareto.shape[0]))

二、商品銷售結構

這裏我將所有商品分爲六大類別,隨機對每一個category_id分配了一種類別,以此來模擬進行商品類型銷售分析。

(1)商品類別銷售佔比

由分析可知,F類型的商品銷量最高佔比19%,B類型的商品銷量最低佔比15%。

#隨機生成類別的標籤
cat=data.item_category.unique()
r=np.random.randint(1,7,len(cat))
category=pd.DataFrame({'item_category':cat,'class_id':r})
data_category=pd.merge(category,data,how='inner',on='item_category')

#matplotlib畫餅圖太醜了 這個我導出到excel畫的環形圖
data_class=data_category[data_category['behavior_type']==4][['time','class_id','user_id']]
data_class=data_class.groupby('class_id').time.count()
plt.axis('equal')  # 保證長寬相等
plt.pie(data_class,
       labels = data_class.index,#colors='Blues',
        autopct='%.2f%%',
       pctdistance=0.6,#越大離中心越遠
       labeldistance = 1.2,
       shadow = True,
       startangle=0,
       radius=1.5,
       frame=False)

(2)商品每日銷售比例

#商品類別堆疊柱狀圖
day_class=data_category[data_category['behavior_type']==4][['time','class_id','user_id']]
day_class['time']=day_class['time'].apply(lambda x:x.__format__('%Y/%m/%d'))
dc=pd.pivot_table(day_class,values='user_id',index='time',columns='class_id',aggfunc='count')
dc=dc.div(dc.sum(axis=1),axis=0).applymap(lambda x:(100*x))
dc=dc.round(2)
dc.plot(kind='bar',grid=True,colormap='Blues_r',stacked=True,
              figsize=(15,8),edgecolor='black',rot='45',title='商品銷量堆疊直方圖')#stacled=True 堆疊柱狀圖

end

以下爲之前的版本,留在這裏作爲對比。學習使人進步,找不到工作令人不快樂!!!

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

根據分析結果做出以下判斷:

  1. 從10號開始PV和UV逐漸上升,在12日當天都達到頂峯,然後回落。在10-12日,用戶搜索、加購行爲較往日有所增加,而購買行爲在12日當天明顯增加,是平時購買量的三倍左右。
  2. 用戶使用時間集中在18:00-23:00,在21:00-22:00區間內達到最高值,廣告投放、活動運營可以集中在這個時間段進行。
  3. 大部分用戶的日均消費次數在10次以內(進一步排除活動影響可比較非活動週數據),雙十二當天用戶日均消費次數明顯增加。
  4. 用戶付費率達到67.72%,七天內用戶復購率爲75.91%。
  5. 雙十二當天的ARPPU約爲日常的 2倍,活動結束後應做好活躍用戶的引流,保持用戶增長。
  6. PV—收藏加購行爲的轉化率爲7.53%,收藏加購—購買行爲的轉化率爲2.14%,用戶瀏覽頁面行爲次數遠大於其他行爲,需要根據更多的用戶行爲數據進一步分析各階段的轉化率指標。
  7. 根據最近一次消費時間和消費頻率得到的RFM用戶模型,可以結合用戶畫像進行精細化運營。如重點關注RF評分都高的重要價值用戶,針對R高F低的重要發展用戶舉辦活動增加用戶粘性等。
  8. 高點擊量的產品,如點擊量最高的產品209323160的加購和收藏量都很高,但銷量並不在前十。而銷量最高的產品,點擊、加購、收藏都不再前十榜單中。需要結合具體的商品類別和用戶行爲數據進一步分析,增加高曝光產品的購買轉化率,提高銷量高產品的宣傳。
  9. 根據帕累託分析,45.04%的商品實現了80%的銷量。可以針對頭部用戶和長尾效應進一步精細化商品運營。

運營建議:

  1. 可以選擇用戶最有購買意願的時間段(18:00~23:00)推送廣告或者活動;
  2. 用戶點擊、加購、收藏行爲在活動前兩天呈明顯上升趨勢,建議在活動前兩天開始各種預熱活動,活動當天重點刺激購買行爲。
  3. 可以根據每種商品類別中銷量最高的商品重點進行廣告投放,進一步刺激購買。

數據預處理

#導入需要的包
import pandas as pd
import datetime
import matplotlib.pyplot as plt
import matplotlib.dates as mdate
import seaborn as sns

#讀取數據並粗略觀察
df=pd.read_csv(r'D:\數據分析\數據分析\tianchi\taobao.csv',engine='python')
#路徑有中文,選擇python engine
print(df.info())
print(df.head())

#按照時間保留一週的數據
df['time']=pd.to_datetime(df['time'],format='%Y-%m-%d')
t1=datetime.datetime(2014,12,8)
t2=datetime.datetime(2014,12,15)
mask=(df['time']>t1)&(df['time']<t2)
data=df[mask]
print(data.count())

#數據清洗
df.drop_duplicates(inplace=True)#刪除重複數據,無法判斷錄入重複還是時間多次點擊
df.drop('user_geohash',axis=1,inplace=True)#刪除地理位置,缺失值太多且無法分析(可能是加密了)
#標準化時間
df['time']=pd.to_datetime(df['time'],format='%Y-%m-%d')
df['hour']=df.time.dt.hour
df['time']=df.time.dt.normalize()
df=df.sort_values(by='time').reset_index(drop=True)

經過日期篩選和數據標準化,最終得到8164040條數據,各列的數據類型和數據格式如下:

 

 

用戶行爲分析

一、時間維度分析

(1)按日期統計PV、UV

PV:頁面瀏覽量,全部用戶在24小時內看了多少頁面,用戶每打開一個頁面就記做一次,多次打開同一頁面算作多次。這裏我們將用戶所有的操作(click, collect, add to cart,payment)次數進行求和,按照日期統計作爲當日的PV值。

UV:獨立訪客,24小時內訪問網站的用戶數,同一個人多次訪問也算一個,通過訪問的客戶端計算。我們通過用戶唯一標誌user_id進行計數求和,按照日期通知作爲當日的UV值。

由下圖可知,每日的PV和UV的總體波動趨勢相似,從9號開始有明顯的增幅,在12日PV和UV都達到頂峯。

從7號開始pv和uv開始大幅度攀升,在12號到達最大值,然後回落。如果和之前週報比較能排除週五對數值的影響,可以初步判斷雙十二活動明顯促進UV、PV增長。

pv_daily=data.groupby('time')['user_id'].count()
pv_daily=pv_daily.reset_index().rename(columns={'user_id':'pv'})
pv_daily.set_index('time',inplace=True)
uv_daily=data.groupby('time')['user_id'].apply(lambda x:x.drop_duplicates().count())
uv_daily=uv_daily.reset_index().rename(columns={'user_id':'uv'})
uv_daily.set_index('time',inplace=True)

fig=plt.figure(figsize=(15,8))
plt.subplots_adjust(wspace=0,hspace=0.2)
ax1=fig.add_subplot(211)
ax1.set_title('pv_daily')
pv_daily.plot(ax=ax1,ylim=[200000,500000])
plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'y',alpha=0.5)
plt.xlabel('tt')
ax2=plt.subplot(212,sharex=ax1)
ax2.set_title('uv_daily')
uv_daily.plot(ax=ax2,ylim=[6000,8000])
plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'y',alpha=0.5)#網格線

(2)基於PV分析用戶行爲

由圖可以看出,12月10日至12月12日,用戶點擊量、收藏量、加購量都明顯增長,在12月12日達到最大值,而購買量則在12月12日當日大幅度增加。

#按照日期和用戶行爲進行分組
pv_detail=data.groupby(['behavior_type','time'])['user_id'].count()
pv_detail=pv_detail.reset_index().rename(columns={'user_id':'total_pv'})
pv_detail['time']=pv_detail['time'].dt.strftime('%Y-%m-%d')
pv_detail['behavior_type']=pv_detail['behavior_type'].map({1:'click',2:'collect',3:'add_to_cart',4:'payment'})

#可視化
fig,axes=plt.subplots(2,1,sharex=True,figsize=(20,10))
sns.pointplot(x='time',y='total_pv',hue='behavior_type',data=pv_detail,ax=axes[0])
sns.pointplot(x='time',y='total_pv',hue='behavior_type',data=pv_detail[pv_detail.behavior_type!='click'],ax=axes[1])
axes[0].set_title('pv different behavior type')
axes[1].set_title('pv different behavior type except click')

(3)用戶使用時間分析

由圖可知,用戶行爲在18:00-22:00存在上升期,在22:00左右達到峯值。

data_time=data.groupby('hour').count()
data_time.loc[24]=data_time.iloc[0].values#爲了圖片24點有數值
data_time['user_id'].plot(kind='line',style='-g.',rot=45,xlim=[0,24],xticks=list(range(0,24,2)),
        figsize=(8,4),title='用戶行爲發生時段',ylim=[0,225000])#,yticks=list(range(0,2500,250)),
plt.grid(True, linestyle = "--",color = "gray", linewidth = "0.5",axis = 'y',alpha=0.5)#網格線

二、用戶消費習慣分析

(1)日均消費次數分析

對產生過購買行爲的用戶分析日均消費可知,絕大多數這類用戶日均消費次數在5次以下,大多數用戶日均消費集中在0.3-1次,用戶最高日均消費次數是33次。

 雙十二當天用戶消費次數直方圖和箱型圖,可以看出雙十二當天用戶消費次數集中在1-4次,存在小部分用戶當日消費次數超過20次。

#用戶日均消費次數分析(總次數/消費天數)
data_user_buy=data[data.behavior_type==4].groupby('user_id')
data_user_buy=data_user_buy.apply(lambda x:x.behavior_type.count()/len(x.drop_duplicates(subset='time').count()))
fig=plt.figure(figsize=(10,3))
plt.subplots_adjust(wspace=0.5,hspace=0)
ax1=fig.add_subplot(121)
sns.distplot(data_user_buy,kde=False,ax=ax1)
plt.title('用戶日均消費次數直方圖')
ax2=fig.add_subplot(122)
data_user_buy.plot.box(grid=True,showfliers = False,ax=ax2)
plt.title('用戶日均消費次數箱型圖')

#雙十二當天
data_user_buy=data[(data.behavior_type==4)&(data.time=='20141212')].groupby('user_id').count()
plt.figure(figsize=(15,6))
sns.countplot(x='time',data=data_user_buy,palette='Blues_r')
plt.xlabel('消費次數')
plt.ylabel('用戶數量')
plt.title('用戶雙十二當天消費次數')

(2)ARPPU

ARPU:一個時間段內運營商從每個用戶所得到的的收入

ARPPU:平均用戶收入,平均每付費用戶收入

因爲數據集沒有訂單金額,所以用消費總次數/總消費人數來表示ARPPU,可以看出12.08-12.11日,每位用戶的日均消費次數在2-2.25之間波動,在12日當天達到峯值約3.7次。

(3)用戶復購率

復購率:重複購買客戶數量/客戶樣本數量,復購率爲75.91%說明用戶黏性比較好,多數付費用戶產生重複購買情況。

#用戶復購情況(一天多次購買也算重複購買)
#重複購買用戶總數/總消費人數
date_rp=data[data.behavior_type==4].groupby('user_id').count()['behavior_type']#['time'].apply(lambda x:len(x.unique()))
x=date_rp[date_rp>=2].count()
print('repeat purchase:%.2f%%'%(date_rp[date_rp>=2].count()/date_rp.count()*100))

(4)用戶付費率

用戶付費率:產生購買行爲的用戶/所有用戶,用戶付費率爲67.72%,說明用戶付費比率非常高

user_count=len(data.user_id.unique())
buyuser_count=len(data[data.behavior_type==4].user_id.unique())
print('afford_rate %.2f%%' %(100*buyuser_count/user_count))

 

三、用戶行爲轉換漏斗

將加購和收藏作爲點擊與購買的中間層次,統計用戶點擊、加購收藏、購買的每一層轉換率。點擊到加購的轉換率爲4.57%,到收藏的轉換率爲2.96%。可以通過購物推薦算法優化搜索引擎等方式幫助用戶更好找到所需商品。從用戶加入購物車和收藏夾到用戶購買的轉換率爲2.14%,可以通過發送提醒,加購收藏有禮等活動提高這一層的轉換率。

但實際用戶可以不通過加購和收藏環節直接進行購買,這個轉換率的分析不是很準確。如進一步分析,應分析加購後購買,收藏後購買,直接由點擊轉換購買三部分的轉換率。

五、用戶價值度RFM模型分析

RFM分析是根據客戶活躍程度和交易金額的貢獻,進行客戶價值細分的方法。具體參見:http://www.woshipm.com/data-analysis/708326.html

  • R(Recency):客戶最近一次交易時間的間隔。
  • F(Frequency):客戶在最近一段時間內交易的次數。
  • M(Monetary):客戶在最近一段時間內交易的金額。

因爲缺少交易金額,提取交易總次數作爲F參數,距離12-15日的消費時間間隔爲R值,F值越大說明用戶交易越頻繁,R值越大說明用戶發生交易的時間越近

由聯合分佈圖可以看出用戶消費頻次集中在0-25次的區間內,最後一次交易集中在3天(和雙十二活動日期相符)。

按照用戶數量均勻分爲1-3類,用戶類型的第一個數值表示R值,R值越大,表示客戶交易發生的日期越近,第二個數值爲F值,F值越大,表示客戶交易越頻繁。在RFM用戶分類中,33對應的用戶消費時間近、消費頻次高,是高價值的用戶。13對應的用戶是消費時間遠,消費頻次高的用戶,是重點保持的用戶。

              

datenow=datetime.datetime(2014,12,15)
#每位用戶最近購買時間
recent_buy_time=data[data.behavior_type==4].groupby('user_id').time.apply(lambda x:datenow-x.sort_values().iloc[-1])
recent_buy_time=recent_buy_time.reset_index().rename(columns={'time':'recent'})
recent_buy_time.recent=recent_buy_time.recent.map(lambda x:x.days)
# #每個用戶消費頻數
buy_freq=data[data.behavior_type==4].groupby('user_id').time.count().reset_index().rename(columns={'time':'freq'})
rfm=pd.merge(recent_buy_time,buy_freq,left_on='user_id',right_on='user_id',how='outer')
# recent表示距離上次購買間隔天數,數值越小越好,因此較小數值賦值3(更重要)
rfm['R_value']=pd.qcut(rfm.recent,3,labels=['3','2','1'])
# freq表示消費次數,數值越大越好,因此較大數值賦值2(更重要)
rfm['F_value']=pd.qcut(rfm.freq,3,labels=['1','2','3'])
rfm['rfm']=rfm['R_value'].str.cat(rfm['F_value'])#str.cat拼接字符串
rfm.head()


#繪製聯合分佈圖
plt.rcParams["patch.force_edgecolor"] = True
sns.jointplot(x=rfm['recent'],y=rfm['freq'],#x軸 y軸
              data=rfm,#設置數據
              color='k',
              s=50,edgecolor='w',linewidth=1,#散點大小、邊緣、線性
              kind='scatter',#kind : {“scatter”|“reg”|“resid”|“kde”|“hex”}
              space=0.2,#散點圖和佈局圖間距
              size=6,#圖表大小
              ratio=3,#散點圖和佈局圖高度比
              marginal_kws=dict(bins=7,rug=True))#柱狀圖箱數

#繪製統計直方圖
sns.countplot(x='rfm',data=rfm,palette='Blues')
plt.title('RFM用戶分類圖')
plt.xlabel('用戶類型')
plt.ylabel('頻數')

商品分析

一、商品統計

(1)商品品類分析

#統計商品品類
data_buy=data[data['behavior_type']==4]
data_category=data_buy.groupby(['item_category']).time.count()
data_category.sort_values(ascending=False,inplace=True)
#統計銷量最高商品品類的item_id
max_cat=data_category[:1].index.values
data_item=data_buy[data_buy.item_category.isin(max_cat)].groupby(['item_id']).time.count()
data_item.sort_values(ascending=False,inplace=True)

fig,axes = plt.subplots(1,2,figsize=(20,5))
plt.subplots_adjust(wspace=0.3,hspace=0.3)
plt.subplot(121)
data_category[:10].plot.barh()
plt.title('商品種類銷量前十')
plt.subplot(122)
data_item[:10].plot.barh()
plt.title('銷量最高種類的十種暢銷品')

(2)商品的瀏覽,收藏,加購物車,購買的前十名

#提取數據
data_item=data.groupby(['behavior_type','item_id']).time.count()
data_item=data_item.reset_index().rename(columns={'time':'total_num'})
data_click=data_item[data_item.behavior_type==1].sort_values(by='total_num',ascending=False)[:10].set_index('item_id')
data_collect=data_item[data_item.behavior_type==2].sort_values(by='total_num',ascending=False)[:10].set_index('item_id')
data_cart=data_item[data_item.behavior_type==3].sort_values(by='total_num',ascending=False)[:10].set_index('item_id')
data_pay=data_item[data_item.behavior_type==4].sort_values(by='total_num',ascending=False)[:10].set_index('item_id')

#可視化
fig,axes = plt.subplots(2,2,figsize=(20,10))
plt.subplots_adjust(wspace=0.3,hspace=0.3)
plt.subplot(221)
data_click['total_num'].plot.barh()
plt.title('商品點擊量前十')
plt.subplot(222)
data_collect['total_num'].plot.barh()
plt.title('商品收藏量前十')
plt.subplot(223)
data_cart['total_num'].plot.barh()
plt.title('商品加入購物車前十')
plt.subplot(224)
data_pay['total_num'].plot.barh()
plt.title('商品購買量前十')

 (3)帕累託分析

對於item_id進行分析發現45.04%的商品實現了80%的銷量。

data_pareto=data[data['behavior_type']==4].groupby(['item_id']).time.count()
data_pareto=data_pareto.reset_index().sort_values('time',ascending=False)
p=data_pareto['time'].cumsum()/data_pareto['time'].sum()
key = p[p>0.8].index[0]  
print('%.2f%%的商品實現了80%%的銷量'%(100*key/data_pareto.shape[0]))

二、商品銷售結構

這裏我將所有商品分爲六大類別,隨機對每一個category_id分配了一種類別,以此來模擬進行商品類型銷售分析。

(1)商品類別銷售佔比

由分析可知,F類型的商品銷量最高佔比19%,B類型的商品銷量最低佔比15%。

#隨機生成類別的標籤
cat=data.item_category.unique()
r=np.random.randint(1,7,len(cat))
category=pd.DataFrame({'item_category':cat,'class_id':r})
data_category=pd.merge(category,data,how='inner',on='item_category')

#matplotlib畫餅圖太醜了 這個我導出到excel畫的環形圖
data_class=data_category[data_category['behavior_type']==4][['time','class_id','user_id']]
data_class=data_class.groupby('class_id').time.count()
plt.axis('equal')  # 保證長寬相等
plt.pie(data_class,
       labels = data_class.index,#colors='Blues',
        autopct='%.2f%%',
       pctdistance=0.6,#越大離中心越遠
       labeldistance = 1.2,
       shadow = True,
       startangle=0,
       radius=1.5,
       frame=False)

(2)商品每日銷售比例

#商品類別堆疊柱狀圖
day_class=data_category[data_category['behavior_type']==4][['time','class_id','user_id']]
day_class['time']=day_class['time'].apply(lambda x:x.__format__('%Y/%m/%d'))
dc=pd.pivot_table(day_class,values='user_id',index='time',columns='class_id',aggfunc='count')
dc=dc.div(dc.sum(axis=1),axis=0).applymap(lambda x:(100*x))
dc=dc.round(2)
dc.plot(kind='bar',grid=True,colormap='Blues_r',stacked=True,
              figsize=(15,8),edgecolor='black',rot='45',title='商品銷量堆疊直方圖')#stacled=True 堆疊柱狀圖

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章