溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

發(fā)布時間:2020-08-11 12:30:05 來源:ITPUB博客 閱讀:143 作者:千鋒Python唐小強 欄目:編程語言

1、項目背景與分析說明

1)項目背景

??網(wǎng)購已經(jīng)成為人們生活不可或缺的一部分,本次項目基于淘寶app平臺數(shù)據(jù),通過相關(guān)指標(biāo)對用戶行為進行分析,從而探索用戶相關(guān)行為模式。

2)數(shù)據(jù)和字段說明

??本文使用的數(shù)據(jù)集包含了2014.11.18到2014.12.18之間,淘寶App移動端一個月內(nèi)的用戶行為數(shù)據(jù)。該數(shù)據(jù)有12256906天記錄,共6列數(shù)據(jù)。

  • user_id:用戶身份
  • item_id:商品id
  • behavior_type:用戶行為類型(包括點擊、收藏、加入購物車、支付四種行為,分別用數(shù)字1、2、3、4表示)
  • user_geohash:地理位置
  • item_category:品類id(商品所屬的分類)
  • time:用戶行為發(fā)生的時間

3)分析的維度

  • 流量指標(biāo)分析
  • 用戶行為分析
  • 漏斗流失分析
  • 用戶價值RFM分析

4)電商常用分析方法

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

5)什么是漏斗分析?

“漏斗分析”是一套流程式數(shù)據(jù)分析,它能夠科學(xué)反映用戶行為狀態(tài),以及從起點到終點各階段用戶轉(zhuǎn)化率情況的一種重要分析模型。

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

2、導(dǎo)入相關(guān)庫

import numpy as np

import pandas as pd
import matplotlib as  mpl
import matplotlib.pyplot as  plt
import seaborn as sns
import warnings
# 設(shè)置為seaborn繪圖風(fēng)格
sns.set(style="darkgrid",font_scale=1.5)

# 用來顯示中文標(biāo)簽
mpl.rcParams["font.family"] = "SimHei"

# 用來顯示負(fù)號
mpl.rcParams["axes.unicode_minus"] = False

# 有時候運行代碼時會有很多warning輸出,像提醒新版本之類的,如果不想這些亂糟糟的輸出,可以使用如下代碼
warnings.filterwarnings('ignore')

3、數(shù)據(jù)預(yù)覽、數(shù)據(jù)預(yù)處理

# 注意:str是為了將所有的字段都讀成字符串

df = pd.read_csv("taobao.csv",dtype=str)
df.shape
df.info()
df.sample(5)

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

1)計算缺失率

# 由于地理位置的缺失值太多,我們也沒辦法填充,因此先刪除這一列

df.apply(lambda x:sum(x.isnull())/len(x),axis=0)

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

2)刪除地理位置這一列

df.drop(["user_geohash"],axis=1,inplace=True)

3)處理時間time列,將該列拆分為date日期列,和hour小時列

df["date"] = df.time.str[0:-3]

df["hour"] = df.time.str[-2:]
df.sample(5)

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

4)將time、date列都變?yōu)闃?biāo)準(zhǔn)日期格式,將hour列變?yōu)閕nt格式

df["date"] = pd.to_datetime(df["date"])

df["time"] = pd.to_datetime(df["time"])
df["hour"] = df["hour"].astype(int)
df.dtypes

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

5)將數(shù)據(jù)按照time列,升序排列

df.sort_values(by="time",ascending=True,inplace=True)

df.head()

解果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

6)刪除原始索引,重新生成新的索引

df.reset_index(drop=True,inplace=True)

df.head()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

知識點:注意reset_index()中傳入?yún)?shù)drop的這種用法。

7)使用describe()函數(shù)查看數(shù)據(jù)的分布,這里使用了一個include參數(shù),注意一下

# 查看所有object字符串類型的數(shù)據(jù)分布狀況

df.describe(include=["object"])
# describe()默認(rèn)只會統(tǒng)計數(shù)值型變量的數(shù)據(jù)分布情況。
df.describe()
# 查看所有數(shù)據(jù)類型的數(shù)據(jù)分布狀況
df.describe(include="all")

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

知識點:注意describe()函數(shù)中傳入?yún)?shù)include的用法。

8)對時間數(shù)據(jù)做一個概覽

df["date"].unique()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

4、模型構(gòu)建

1)流量指標(biāo)的處理

pv:指的是頁面總瀏覽量。每個用戶每刷新一次網(wǎng)頁,就會增加一次pv。

uv:指的是獨立訪客數(shù)。一臺電腦一個ip也就是一個獨立訪客。實際分析中,我們都是認(rèn)為每個人只使用一臺電腦,即每一個獨立訪客代表一個用戶。

① 總計pv和uv

total_pv = df["user_id"].count()

total_pv
total_uv = df["user_id"].nunique()
total_uv

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

結(jié)果分析:從圖中可以看到,該網(wǎng)站頁面的總瀏覽量為12256906次,該頁面的獨立訪客數(shù)共有10000個。

② 日期維度下的uv和pv:uv表示頁面總瀏覽量,pv表示獨立訪客數(shù)

pv_daily = df.groupby("date")['user_id'].count()

pv_daily.head(5)
uv_daily = df.groupby("date")['user_id'].apply(lambda x: x.nunique())
# uv_daily = df.groupby("date")['user_id'].apply(lambda x: x.drop_duplicates().count())
uv_daily.head()
pv_uv_daily = pd.concat([pv_daily,uv_daily],axis=1)
pv_uv_daily.columns = ["pv","uv"]
pv_uv_daily.head()
# 繪圖代碼如下
plt.figure(figsize=(16,10))
plt.subplot(211)
plt.plot(pv_daily,c="r")
plt.title("每天頁面的總訪問量(PV)")
plt.subplot(212)
plt.plot(uv_daily,c="g")
plt.title("每天頁面的獨立訪客數(shù)(UV)")
#plt.suptitle("PV和UV的變化趨勢")
plt.tight_layout()
plt.savefig("PV和UV的變化趨勢",dpi=300)
plt.show()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

繪圖如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

結(jié)果分析:從圖中可以看出,pv和uv數(shù)據(jù)呈現(xiàn)高度的正相關(guān)。雙12前后,pv和uv都在350000-400000之間波動,雙十二的時候,頁面訪問量急劇上升,證明這次活動的效果很好。

③ 時間維度下的pv和uv

pv_hour = df.groupby("hour")['user_id'].count()

pv_hour.head()
uv_hour = df.groupby("hour")['user_id'].apply(lambda x: x.nunique())
uv_hour.head()
pv_uv_hour = pd.concat([pv_hour,uv_hour],axis=1)
pv_uv_hour.columns = ["pv_hour","uv_hour"]
pv_uv_hour.head()
# 繪圖代碼如下
plt.figure(figsize=(16,10))
pv_uv_hour["pv_hour"].plot(c="steelblue",label="每個小時的頁面總訪問量")
plt.ylabel("頁面訪問量")

pv_uv_hour["uv_hour"].plot(c="red",label="每個小時的頁面獨立訪客數(shù)",secondary_y=True)
plt.ylabel("頁面獨立訪客數(shù)")
plt.xticks(range(0,24),pv_uv_hour.index)

plt.legend(loc="best")
plt.grid(True)

plt.tight_layout()
plt.savefig("每個小時的PV和UV的變化趨勢",dpi=300)
plt.show()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

繪圖如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

結(jié)果分析:從圖中可以看出,晚上22:00-凌晨5:00,頁面的訪問用戶數(shù)量和訪問量逐漸降低,該時間段很多人都是處在休息之中。而從早上6:00-10:00用戶數(shù)量逐漸呈現(xiàn)上升趨勢,10:00-18:00有一個比較平穩(wěn)的狀態(tài),這個時間段是正常的上班時間。但是18:00以后,一直到晚上22:00,用戶劇烈激增,一直達到一天中訪問用戶數(shù)的最大值。運營人員可以參考用戶的活躍時間段,采取一些促銷活動。

2)用戶行為指標(biāo)

① 總計點擊、收藏、添加購物車、支付用戶的情況

type_1 = df[df['behavior_type']=="1"]["user_id"].count()

type_2 = df[df['behavior_type']=="2"]["user_id"].count()
type_3 = df[df['behavior_type']=="3"]["user_id"].count()
type_4 = df[df['behavior_type']=="4"]["user_id"].count()
print("點擊用戶:",type_1)
print("收藏用戶:",type_2)
print("添加購物車用戶:",type_3)
print("支付用戶:",type_4)

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

結(jié)果分析:從圖中可以看到,用戶進行頁面點擊–>收藏和加如購物車–>支付,逐漸呈現(xiàn)下降趨勢。關(guān)于這方面的分析,將在下面的漏斗圖中繼續(xù)更為深入的說明。

② 日期維度下,點擊、收藏、添加購物車、支付用戶的情況

pv_date_type = pd.pivot_table(df,index='date',

                            columns='behavior_type',
                            values='user_id',
                            aggfunc=np.size)
pv_date_type.columns = ["點擊","收藏","加入購物車","支付"]
pv_date_type.head()
# 繪圖如下
plt.figure(figsize=(16,10))
sns.lineplot(data=pv_date_type[['收藏', '加入購物車', '支付']])

plt.tight_layout()
plt.savefig("不同日期不同用戶行為的PV變化趨勢",dpi=300)
plt.show()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

繪圖如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

③ 時間維度下,點擊、收藏、添加購物車、支付用戶的情況

pv_hour_type = pd.pivot_table(df,index='hour',

                            columns='behavior_type',
                            values='user_id',
                            aggfunc=np.size)
pv_hour_type.columns = ["點擊","收藏","加入購物車","支付"]
pv_hour_type.head()
# 繪圖如下
plt.figure(figsize=(16,10))
sns.lineplot(data=pv_hour_type[['收藏', '加入購物車', '支付']])

pv_hour_type["點擊"].plot(c="pink",linewidth=5,label="點擊",secondary_y=True)
plt.legend(loc="best")

plt.tight_layout()
plt.savefig("不同小時不同用戶行為的PV變化趨勢",dpi=300)
plt.show()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

繪圖如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

④ 支付次數(shù)前10的用戶行為細分

df["user_id1"] = df["user_id"]

buy_first = pd.pivot_table(df,index='user_id',
                            columns='behavior_type',
                            values='user_id1',
                            aggfunc="count")
buy_first.columns = ["點擊","收藏","加入購物車","支付"]
buy_first_10 = buy_first.sort_values(by="支付",ascending=False)[:10]
buy_first_10
# 繪制圖形如下
plt.figure(figsize=(16,10))
plt.subplot(311)
plt.plot(buy_first_10["點擊"],c="r")
plt.title("點擊數(shù)的變化趨勢")
plt.subplot(312)
plt.plot(buy_first_10["收藏"],c="g")
plt.title("收藏數(shù)的變化趨勢")
plt.subplot(313)
plt.plot(buy_first_10["加入購物車"],c="b")
plt.title("加入購物車的變化趨勢")

plt.xticks(np.arange(10),buy_first_10.index)

plt.tight_layout()
plt.savefig("支付數(shù)前10的用戶,在點擊、收藏、加入購物車的變化趨勢",dpi=300)
plt.show()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

繪圖如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

結(jié)果分析:通過這個分析,我們可以看出,購買次數(shù)最多的用戶,點擊、收藏、加入購車的次數(shù)不一定是最多的,

⑤ ARPPU分析:平均每用戶收入,即可通過“總收入/AU” 計算得出

total_custome = df[df['behavior_type'] == "4"].groupby(["date","user_id"])["behavior_type"].count()\

               .reset_index().rename(columns={"behavior_type":"total"})
total_custome.head()
total_custome2 = total_custome.groupby("date").sum()["total"]/\
                total_custome.groupby("date").count()["total"]
total_custome2.head(10)
# 繪圖如下
x = len(total_custome2.index.astype(str))
y = total_custome2.index.astype(str)

plt.plot(total_custome2.values)
plt.xticks(range(0,30,7),[y[i] for i in range(0,x,7)],rotation=90)
plt.title("每天的人均消費次數(shù)")

plt.tight_layout()
plt.savefig("每天的人均消費次數(shù)",dpi=300)
plt.show()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

繪圖如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

⑥ 日ARPU分析:表示的是平均每用戶收入。ARPU = 總收入/AU得到

df["operation"] = 1

aa = df.groupby(["date","user_id",'behavior_type'])["operation"].count().\
    reset_index().rename(columns={"operation":"total"})
aa.head(10)
aa1 = aa.groupby("date").apply(lambda x: x[x["behavior_type"]=="4"]["total"].sum()/x["user_id"].nunique())
aa1.head(10)
# 繪圖如下
x = len(aa1.index.astype(str))
y = aa1.index.astype(str)

plt.plot(aa1.values)
plt.xticks(range(0,30,7),[y[i] for i in range(0,x,7)],rotation=90)
plt.title("每天的活躍用戶消費次數(shù)")

plt.tight_layout()
plt.savefig("每天的活躍用戶消費次數(shù)",dpi=300)
plt.show()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

繪圖如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

⑦ 付費率PUR = APA/AU,這里用【消費人數(shù) / 活躍用戶人數(shù)】代替

rate = aa.groupby("date").apply(lambda x: x[x["behavior_type"]=="4"]["total"].count()/x["user_id"].nunique())

rate.head(10)
# 繪圖如下
x = len(rate.index.astype(str))
y = rate.index.astype(str)

plt.plot(rate.values)
plt.xticks(range(0,30,7),[y[i] for i in range(0,x,7)],rotation=90)
plt.title("付費率分析")

plt.tight_layout()
plt.savefig("付費率分析",dpi=300)
plt.show()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

⑧ 復(fù)購情況分析(復(fù)購率)

re_buy = df[df["behavior_type"]=="4"].groupby("user_id")["date"].apply(lambda x: x.nunique())

print(len(re_buy))
re_buy[re_buy >= 2].count() / re_buy.count()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

3)漏斗分析

df_count = df.groupby("behavior_type").size().reset_index().\

          rename(columns={"behavior_type":"環(huán)節(jié)",0:"人數(shù)"})
         
type_dict = {
   "1":"點擊",
   "2":"收藏",
   "3":"加入購物車",
   "4":"支付"
}
df_count["環(huán)節(jié)"] = df_count["環(huán)節(jié)"].map(type_dict)

a = df_count.iloc[0]["人數(shù)"]
b = df_count.iloc[1]["人數(shù)"]
c = df_count.iloc[2]["人數(shù)"]
d = df_count.iloc[3]["人數(shù)"]
funnel = pd.DataFrame({"環(huán)節(jié)":["點擊","收藏及加入購物車","支付"],"人數(shù)":[a,b+c,d]})

funnel["總體轉(zhuǎn)化率"] = [i/funnel["人數(shù)"][0] for i in funnel["人數(shù)"]]
funnel["單一轉(zhuǎn)化率"] = np.array([1.0,2.0,3.0])
for i in range(0,len(funnel["人數(shù)"])):
   if i == 0:
       funnel["單一轉(zhuǎn)化率"][i] = 1.0
   else:
       funnel["單一轉(zhuǎn)化率"][i] = funnel["人數(shù)"][i] / funnel["人數(shù)"][i-1]
# 繪圖如下
import plotly.express as px
import plotly.graph_objs as go

trace = go.Funnel(
   y = ["點擊", "收藏及加入購物車", "購買"],
   x = [funnel["人數(shù)"][0], funnel["人數(shù)"][1], funnel["人數(shù)"][2]],
   textinfo = "value+percent initial",
   marker=dict(color=["deepskyblue", "lightsalmon", "tan"]),
   connector = {"line": {"color": "royalblue", "dash": "solid", "width": 3}})
   
data =[trace]

fig = go.Figure(data)

fig.show()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

繪圖如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了

結(jié)果分析:由于收藏和加入購車都是有購買意向的一種用戶行為,切不分先后順序,因此我們將其合并看作一個階段。從上面的漏斗圖和funnel表可以看出,從瀏覽到具有購買意向(收藏和加入購物車),只有5%的轉(zhuǎn)化率,但是到了真正到購買的轉(zhuǎn)化率只有1%,再看“單一轉(zhuǎn)化率”,從具有購買意向到真正購買的轉(zhuǎn)化率達到了20%。說明從瀏覽到進行收藏和加入購物車的階段,是指標(biāo)提升的重要環(huán)節(jié)。

4)客戶價值分析(RFM分析)

from datetime import datetime

# 最近一次購買距離現(xiàn)在的天數(shù)
recent_buy = df[df["behavior_type"]=="4"].groupby("user_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"].apply(lambda x: x.days)
recent_buy[:10]
# 購買次數(shù)計算
buy_freq = df[df["behavior_type"]=="4"].groupby("user_id")["date"].count().reset_index().\
         rename(columns={"date":"freq"})
buy_freq[:10]
# 將上述兩列數(shù)據(jù),合并起來
rfm = pd.merge(recent_buy,buy_freq,on="user_id")
rfm[:10]
# 給不同類型打分
r_bins = [0,5,10,15,20,50]
f_bins = [1,30,60,90,120,900]
rfm["r_score"] = pd.cut(rfm["recent"],bins=r_bins,labels=[5,4,3,2,1],right=False)
rfm["f_score"] = pd.cut(rfm["freq"],bins=f_bins,labels=[1,2,3,4,5],right=False)
for i in ["r_score","f_score"]:
   rfm[i] = rfm[i].astype(float)
rfm.describe()
# 比較各分值與各自均值的大小
rfm["r"] = np.where(rfm["r_score"]>3.943957,"高","低")
rfm["f"] = np.where(rfm["f_score"]>1.133356,"高","低")
# 將r和f列的字符串合并起來
rfm["value"] = rfm["r"].str[:] + rfm["f"].str[:]
rfm.head()
# 自定義函數(shù)給用戶貼標(biāo)簽
def trans_labels(x):
   if x == "高高":
       return "重要價值客戶"
   elif x == "低高":
       return "重要喚回客戶"
   elif x == "高低":
       return "重要深耕客戶"
   else:
       return "重要挽回客戶"
rfm["標(biāo)簽"] = rfm["value"].apply(trans_labels)
# 計算出每個標(biāo)簽的用戶數(shù)量
rfm["標(biāo)簽"].value_counts()

結(jié)果如下:

Python:我的交易行為終于在分析1225萬條淘寶數(shù)據(jù),搞清楚了
向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI