广告投放数据分析
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)多维度下其他特征,可以结合时间维度,多做测试,然后取舍。