<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
1)專案背景
網購已經成為人們生活不可或缺的一部分,本次專案基於淘寶app平臺資料,通過相關指標對使用者行為進行分析,從而探索使用者相關行為模式。
2)資料和欄位說明
本文使用的資料集包含了2014.11.18到2014.12.18之間,淘寶App行動端一個月內的使用者行為資料。該資料有12256906天記錄,共6列資料。
3)分析的維度
流量指標分析
使用者行為分析
漏斗流失分析
使用者價值RFM分析
4)電商常用分析方法
5)什麼是漏斗分析?
“漏斗分析”是一套流程式資料分析,它能夠科學反映使用者行為狀態,以及從起點到終點各階段使用者轉化率情況的一種重要分析模型。
import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns import warnings # 設定為seaborn繪圖風格 sns.set(style="darkgrid",font_scale=1.5) # 用來顯示中文標籤 mpl.rcParams["font.family"] = "SimHei" # 用來顯示負號 mpl.rcParams["axes.unicode_minus"] = False # 有時候執行程式碼時會有很多warning輸出,像提醒新版本之類的,如果不想這些亂糟糟的輸出,可以使用如下程式碼 warnings.filterwarnings('ignore')
# 注意:str是為了將所有的欄位都讀成字串 df = pd.read_csv("taobao.csv",dtype=str) df.shape df.info() df.sample(5)
結果如下:
1)計算缺失率
# 由於地理位置的缺失值太多,我們也沒辦法填充,因此先刪除這一列 df.apply(lambda x:sum(x.isnull())/len(x),axis=0)
結果如下:
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)
結果如下:
4)將time、date列都變為標準日期格式,將hour列變為int格式
df["date"] = pd.to_datetime(df["date"]) df["time"] = pd.to_datetime(df["time"]) df["hour"] = df["hour"].astype(int) df.dtypes
結果如下:
5)將資料按照time列,升序排列
df.sort_values(by="time",ascending=True,inplace=True) df.head()
解果如下:
6)刪除原始索引,重新生成新的索引
df.reset_index(drop=True,inplace=True) df.head()
結果如下:
知識點:注意reset_index()中傳入引數drop的這種用法。
7)使用describe()函數檢視資料的分佈,這裡使用了一個include引數,注意一下
# 檢視所有object字串型別的資料分佈狀況 df.describe(include=["object"]) # describe()預設只會統計數值型變數的資料分佈情況。 df.describe() # 檢視所有資料型別的資料分佈狀況 df.describe(include="all")
結果如下:
知識點:注意describe()函數中傳入引數include的用法。
8)對時間資料做一個概覽
df["date"].unique()
結果如下:
pv:指的是頁面總瀏覽量。每個使用者每重新整理一次網頁,就會增加一次pv。
uv:指的是獨立訪客數。一臺電腦一個ip也就是一個獨立訪客。實際分析中,我們都是認為每個人只使用一臺電腦,即每一個獨立訪客代表一個使用者。
① 總計pv和uv
total_pv = df["user_id"].count() total_pv total_uv = df["user_id"].nunique() total_uv
結果如下:
結果分析:從圖中可以看到,該網站頁面的總瀏覽量為12256906次,該頁面的獨立訪客數共有10000個。
② 日期維度下的uv和pv:uv表示頁面總瀏覽量,pv表示獨立訪客數
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("每天頁面的獨立訪客數(UV)") #plt.suptitle("PV和UV的變化趨勢") plt.tight_layout() plt.savefig("PV和UV的變化趨勢",dpi=300) plt.show()
結果如下:
繪圖如下:
結果分析:從圖中可以看出,pv和uv資料呈現高度的正相關。雙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="每個小時的頁面獨立訪客數",secondary_y=True) plt.ylabel("頁面獨立訪客數") 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()
結果如下:
繪圖如下:
結果分析:從圖中可以看出,晚上22:00-凌晨5:00,頁面的存取使用者數量和存取量逐漸降低,該時間段很多人都是處在休息之中。而從早上6:00-10:00使用者數量逐漸呈現上升趨勢,10:00-18:00有一個比較平穩的狀態,這個時間段是正常的上班時間。但是18:00以後,一直到晚上22:00,使用者劇烈激增,一直達到一天中存取使用者數的最大值。運營人員可以參考使用者的活躍時間段,採取一些促銷活動。
① 總計點選、收藏、新增購物車、支付使用者的情況
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)
結果如下:
結果分析:從圖中可以看到,使用者進行頁面點選–>收藏和加如購物車–>支付,逐漸呈現下降趨勢。關於這方面的分析,將在下面的漏斗圖中繼續更為深入的說明。
② 日期維度下,點選、收藏、新增購物車、支付使用者的情況
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()
結果如下:
繪圖如下:
③ 時間維度下,點選、收藏、新增購物車、支付使用者的情況
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()
結果如下:
繪圖如下:
④ 支付次數前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("點選數的變化趨勢") plt.subplot(312) plt.plot(buy_first_10["收藏"],c="g") plt.title("收藏數的變化趨勢") 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("支付數前10的使用者,在點選、收藏、加入購物車的變化趨勢",dpi=300) plt.show()
結果如下:
繪圖如下:
結果分析:通過這個分析,我們可以看出,購買次數最多的使用者,點選、收藏、加入購車的次數不一定是最多的,
⑤ 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("每天的人均消費次數") plt.tight_layout() plt.savefig("每天的人均消費次數",dpi=300) plt.show()
結果如下:
繪圖如下:
⑥ 日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("每天的活躍使用者消費次數") plt.tight_layout() plt.savefig("每天的活躍使用者消費次數",dpi=300) plt.show()
結果如下:
繪圖如下:
⑦ 付費率PUR = APA/AU,這裡用【消費人數 / 活躍使用者人數】代替
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()
結果如下:
⑧ 復購情況分析(復購率)
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()
結果如下:
df_count = df.groupby("behavior_type").size().reset_index(). rename(columns={"behavior_type":"環節",0:"人數"}) type_dict = { "1":"點選", "2":"收藏", "3":"加入購物車", "4":"支付" } df_count["環節"] = df_count["環節"].map(type_dict) a = df_count.iloc[0]["人數"] b = df_count.iloc[1]["人數"] c = df_count.iloc[2]["人數"] d = df_count.iloc[3]["人數"] funnel = pd.DataFrame({"環節":["點選","收藏及加入購物車","支付"],"人數":[a,b+c,d]}) funnel["總體轉化率"] = [i/funnel["人數"][0] for i in funnel["人數"]] funnel["單一轉化率"] = np.array([1.0,2.0,3.0]) for i in range(0,len(funnel["人數"])): if i == 0: funnel["單一轉化率"][i] = 1.0 else: funnel["單一轉化率"][i] = funnel["人數"][i] / funnel["人數"][i-1] # 繪圖如下 import plotly.express as px import plotly.graph_objs as go trace = go.Funnel( y = ["點選", "收藏及加入購物車", "購買"], x = [funnel["人數"][0], funnel["人數"][1], funnel["人數"][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()
結果如下:
繪圖如下:
結果分析:由於收藏和加入購車都是有購買意向的一種使用者行為,切不分先後順序,因此我們將其合併看作一個階段。從上面的漏斗圖和funnel表可以看出,從瀏覽到具有購買意向(收藏和加入購物車),只有5%的轉化率,但是到了真正到購買的轉化率只有1%,再看“單一轉化率”,從具有購買意向到真正購買的轉化率達到了20%。說明從瀏覽到進行收藏和加入購物車的階段,是指標提升的重要環節。
from datetime import datetime # 最近一次購買距離現在的天數 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] # 購買次數計算 buy_freq = df[df["behavior_type"]=="4"].groupby("user_id")["date"].count().reset_index(). rename(columns={"date":"freq"}) buy_freq[:10] # 將上述兩列資料,合併起來 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() # 自定義函數給使用者貼標籤 def trans_labels(x): if x == "高高": return"重要價值客戶" elif x == "低高": return"重要喚回客戶" elif x == "高低": return"重要深耕客戶" else: return"重要挽回客戶" rfm["標籤"] = rfm["value"].apply(trans_labels) # 計算出每個標籤的使用者數量 rfm["標籤"].value_counts()
結果如下:
以上就是Python資料分析之分析千萬級淘寶資料的詳細內容,更多關於Python淘寶資料分析的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45