1 提出問題:如何實現廣告的精准投放
實現廣告的精准投放就是最大化投入產出的過程,需要知道我們的用戶在哪里,在哪些渠道能夠更大化用戶價值,以及各個渠道用戶價值的變化規律。通過對渠道方式和渠道質量的追蹤,以引流和轉化率為關鍵事件,做好渠道的優化和維護。
本文通過研究阿里天池數據,僅從渠道,投放時間,投放人群,以點擊率為數據指標進行數據分析,從而給出更好的方案和建議,實現高效率高產出。
2 數據來源
2.1 數據源
Ali_Display_Ad_Click是阿里巴巴提供的一個淘寶展示廣告點擊率預估數據集。
https://tianchi.aliyun.com/dataset/dataDetail?dataId=56&lang=zh-cn
2.2 數據理解
數據集不存在投入產出字段,命題轉化為以瀏覽量、點擊率作為數據指標,進行數據分析。
3 分析思路
4 導入數據
#導入所需要的庫 %matplotlib inline import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # from dateutil.parser import parse import datetime as dt plt.rcParams["font.sans-serif"]='SimHei' #解決中文亂碼 plt.rcParams['axes.unicode_minus'] = False #解決負號無法 #讀取文件,加載數據 df1 = pd.read_csv(r"E:\Data analysis\data\tianchi\AD data\user_profile.csv",encoding = "gbk") df2 = pd.read_csv(r"E:\Data analysis\data\tianchi\AD data\raw_sample.csv",encoding = "gbk") df3 = pd.read_csv(r"E:\Data analysis\data\tianchi\AD data\ad_feature.csv",encoding = "gbk")
4.1 計算各個廣告的點擊次數
由於數據量巨大,宕機時間長,選擇部分數據分析,以下計算各個廣告的點擊次數。
4.2 選擇子集
篩選廣告點擊湊數最多的710164作為新的數據集建表
5 數據分析
5.1 分析不同渠道點擊率
group1 = df.groupby("pid").agg({"clk":"sum","pid":"count"}) rate = (group1["clk"]/group1["pid"]).apply(lambda x: format(x, '.2%')) group1
由於渠道有限,僅從2個渠道源分析來看,430548_1007需要繼續維護渠道,提高轉化率,430548_1007需要加大渠道投入,做好引流。
5.2 分析不同投放時間點擊率
5.2.1 每日各時間段點擊率分析
# 時間處理, 注意: unix時間戳,轉北京時間(差8個鍾) df["time"]=pd.to_datetime(df['time_stamp'],unit="s",utc=True)+dt.timedelta(hours=8)#.tz_convert("Asia/Shanghai") # 取日期,並新增列 df["date"] = df["time"].dt.normalize() # 取hour,並新增列 df['hour'] = [dt.datetime.strftime(x,'%H') for x in df['time']] # 每日各時間段點擊率分析 group2 = df.groupby("hour").agg({"pid":"count","clk":"sum"}) xdata_1 = group2.index ydata_1 = group2["pid"] rate_1 = (group2["clk"]/group2["pid"]) # 繪雙坐標圖 fig,ax=plt.subplots() ax.bar(xdata_1,ydata_1) ax.set_ylabel('瀏覽量', color='b') ax.tick_params('y', colors='b') ax1 =ax.twinx() ax1.set_ylim([0,0.14]) ax1.plot(xdata_1,rate_1,"r") ax.set_xlabel('小時') ax1.set_ylabel('點擊率', color='r') ax1.tick_params('y', colors='r') fig.tight_layout() plt.show()
a. 在瀏覽量達到一定數據時,每日的上午10點、下午3點的點擊率出現了小高峰。
b. 晚上由9點開始瀏覽量主鍵提升,但點擊率相對於前段時間較低,說明多數用戶是目的性流量走低。
c. 深夜0-2點點擊率超過12%,推測原因,可能是瀏覽量較低,偶然性提升,也可能是這部分人群的目的性較強,如果能獲知這些人群畫像,能高效的做好營銷轉化。
說明,目標客戶在深夜轉化的可能性更高。
5.2.2 每周各天點擊率分析
df["dayofweek"] = df["date"].dt.dayofweek group3 = df.groupby("dayofweek").agg({"pid":"count","clk":"sum"}) # 繪雙坐標圖 fig,ax=plt.subplots() ax.bar(group3.index,group3["pid"]) ax.set_ylabel('瀏覽量', color='b') ax.tick_params('y', colors='b') ax1 =ax.twinx() ax1.set_ylim([0,0.14]) ax1.plot(group3.index,group3["clk"]/group3["pid"],"r") ax.set_xlabel('星期') ax1.set_ylabel('點擊率', color='r') ax1.tick_params('y', colors='r') fig.tight_layout() plt.show()
可知,周六、日,周一點擊率較高,瀏覽量也不低,說明這幾天帶來的收益是更大的。
5.2.3 各天各時間段分析
# 5.2.3 各天各時間段分析 df["dayofweek"] = df["date"].dt.dayofweek group4 = df.groupby(["dayofweek","hour"]).agg({"pid":"count","clk":"sum"}) group4["rate_3"] = group4["clk"]/group4["pid"] # 前五 group4.sort_values(by="rate_3",ascending=False).head()
5.3 分析人群特征點擊率
5.3.1 各年齡層次人群點擊率分析
# 5.3 分析人群特征點擊率 # 5.3.1 各年齡層次人群點擊率分析 group5 = df.groupby("age_level").agg({"pid":"count","clk":"sum"}) # 繪雙坐標圖 fig,ax=plt.subplots() ax.bar(group5.index,group5["pid"]) ax.set_ylabel('瀏覽量', color='b') ax.tick_params('y', colors='b') ax1 =ax.twinx() ax1.set_ylim([0,0.14]) ax1.plot(group5.index,group5["clk"]/group5["pid"],"r") ax.set_xlabel('年齡層') ax1.set_ylabel('點擊率', color='r') ax1.tick_params('y', colors='r') fig.tight_layout() plt.show()
a. 廣告投放在1/2/5年齡層帶來的點擊率更高,需要從時間維度考慮,增大廣告投入對這三個年齡層的效果。
b. 對與年齡層6,可以從時間維度考慮增大樣本投入后會不會有更大的點擊率,從而判定是否需要更多的投入。
c. 對比年齡層1/5和3,說明可以放棄對年齡層3的投入,最好增加時間維度和投入資源維度。
d. 年齡層0需要投入更多的資源,觀察效果后判定舍去與否。
5.3.2 各個消費等級人群點擊率分析
# 5.3.2 各個消費等級人群點擊率分析 group6 = df.groupby("pvalue_level").agg({"pid":"count","clk":"sum"}) # 繪雙坐標圖 fig,ax=plt.subplots() ax.bar(group6.index,group6["pid"]) ax.set_ylabel('瀏覽量', color='b') ax.tick_params('y', colors='b') ax1 =ax.twinx() ax1.set_ylim([0,0.14]) ax1.plot(group6.index,group6["clk"]/group6["pid"],"r") ax.set_xlabel('消費等級') ax1.set_ylabel('點擊率', color='r') ax1.tick_params('y', colors='r') fig.tight_layout() plt.show()
高檔人群點擊率偏低僅有7.13%,原因可能是產品的客單價是109,不符合這類人群的需求。
5.3.3 各購物深度人群點擊率分析
# 5.3.3 各購物深度人群點擊率分析 group7 = df.groupby("shopping_level").agg({"pid":"count","clk":"sum"}) # 繪雙坐標圖 fig,ax=plt.subplots() ax.bar(group7.index,group7["pid"]) ax.set_ylabel('瀏覽量', color='b') ax.tick_params('y', colors='b') ax1 =ax.twinx() ax1.set_ylim([0,0.14]) ax1.plot(group7.index,group7["clk"]/group7["pid"],"r") ax.set_xlabel("購物深度") ax1.set_ylabel('點擊率', color='r') ax1.tick_params('y', colors='r') fig.tight_layout() plt.show()
中、深度用戶點擊率略高,如果逐步轉化至付費階段,相比於淺度用戶,中、深度用戶后續付費根能行會更大。
5.3.4 各職業(是否大學生)人群點擊率分析
# 5.3.4 各職業(是否大學生)人群點擊率分析 group8 = df.groupby("occupation").agg({"pid":"count","clk":"sum"}) # 繪雙坐標圖 fig,ax=plt.subplots() ax.bar(group8.index,group8["pid"]) ax.set_ylabel('瀏覽量', color='b') ax.tick_params('y', colors='b') ax1 =ax.twinx() ax1.set_ylim([0,0.14]) ax1.plot(group8.index,group8["clk"]/group8["pid"],"r") ax.set_xlabel("是否大學生群體(1-是,0-非)") ax1.set_ylabel('點擊率', color='r') ax1.tick_params('y', colors='r') fig.tight_layout() plt.show()
大學生的點擊率略高,但總體區分度不大,說明樣本用戶群體對710164敏感度差異性不大,可能是價格109屬於平價款的原因。
6 結論和建議
6.1 渠道分析
只有2個渠道,區分度不大,從引流和轉化的角度看,430548_1007需要繼續維護渠道,提高轉化率,430548_1007需要加大渠道投入,做好引流。
6.2 投放時間分析
加大對深夜0-2點時間段廣告投放,周六、日和周一,投放效果更好。
6.3 人群分析
(1)加大對年齡層1/2/5年齡層投放效果,建議減少對高檔人群的投放,加大對中深度用戶投放,加大對城市等級2/4投放,廣告對職業不敏感,建議取消這部分投入
(2)多維度下其他特征,可以結合時間維度,多做測試,然后取舍。