项目背景
-
Facebook被众多企业作为首选的广告平台之一,特别是在投放原生广告方面。这个平台允许根据如性别、年龄、地理位置和兴趣等多重标准来细化目标用户群。广告主能够制作专门的Facebook广告,并设定一个特定的“受众群体”,便于他们向某些特定用户展示更加针对性的内容。为了确定广告活动是否如预期般有效,并找到最准确的目标受众,广告的发布者必须利用数据分析技术进行深入的效果评估和广告优化。
-
我们从广告投放商的角度对广告数据进行分析,找到精准的受众群体,不断的对广告进行优化。
数据字段说明
广告分析的常用指标
加载数据
import pandas as pd
import matplotlib.pylab as plt
import numpy as np
import warnings
#中文乱码的处理
#plt.rcParams['font.sans-serif']=['PingFang HK'] #mac系统使用
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# windows使用设置微软雅黑字体
plt.rcParams['axes.unicode_minus'] = False # 避免坐标轴不能正常的显示负号
warnings.filterwarnings('ignore')
#./data.csv
data = pd.read_csv('./data.csv')
data.head()
一行数据表示xyz_campaign_id表示的广告播放后观看用户的年龄段、性别、兴趣标签类别和广告的曝光量、点击量、向facebook支付的费用、用户咨询次数和用户购买的次数信息。
查看数据
data.shape
(1143, 11)
data['xyz_campaign_id'].unique()
#xyz公司在facebook平台一共制定了3种不同广告
array([ 916, 936, 1178], dtype=int64)
data['ad_id'].nunique()
1143
数据清洗
#查看是否存在缺失数据
data.isnull().any() #没有缺失数据
#查看是否存在重复数据
data.duplicated().sum() #没有重复数据
0
#是否存在异常数据
data.describe().T
基本操作
#每个广告的播放次数
data.groupby(by='xyz_campaign_id')['ad_id'].nunique()
#每个广告的播放次数
data['xyz_campaign_id'].value_counts()
#每个广告的总花费,降序排序
data.groupby(by='xyz_campaign_id')['Spent'].sum().sort_values(ascending=False)
#计算xyz_campaign_id=916广告的点击率
#点击率:点击量/曝光量
df_916 = data.loc[data['xyz_campaign_id'] == 916] #916广告对应的行数据
click_rate = format((df_916['Clicks'].sum() / df_916['Impressions'].sum()),'.2%')
click_rate
‘0.02%’
#计算xyz_campaign_id=916广告的转换率
#转换率:转换量 / 点击量
#转换量:用户点击了广告后,发生下单行为的用户数量
trans_rate = format(df_916['Approved_Conversion'].sum() / df_916['Clicks'].sum(),'.2%')
trans_rate
‘21.24%’
#在3种广告中interest 值为多少的人点击率最高?
#点击率:点击量/曝光量
ret = data.groupby(by=['xyz_campaign_id','interest'])['Clicks','Impressions'].sum()
for ad_id in data['xyz_campaign_id'].unique():
#ad_id就一次表示916,936和1178这三种广告的唯一标识
ad_id_df = ret.loc[ad_id] #取出了不同广告对应的行数据
#计算广告的点击率
click_rate = (ad_id_df['Clicks'] / ad_id_df['Impressions']).sort_values(ascending=False).head(1)
print('广告%d中%d类别的兴趣标签的点击率最高,为%f'%(ad_id,click_rate.index.values[0],click_rate.values))
广告916中21类别的兴趣标签的点击率最高,为0.000458
广告936中2类别的兴趣标签的点击率最高,为0.000424
广告1178中26类别的兴趣标签的点击率最高,为0.000219
#在3种广告中不同性别对应的转换率为多少
#转换率:转换量 / 点击量
s_click = data.groupby(by=['xyz_campaign_id','gender'])['Clicks'].sum()
def func(x):
return np.count_nonzero(x)
s_trans = data.groupby(by=['xyz_campaign_id','gender'])['Approved_Conversion'].apply(func)
(s_trans / s_click).map(lambda x:format(x,'.2%'))
#男性的转换率是高于女性
#3种广告中哪个年龄段的男性转换率最高?
man_df = data.loc[data['gender'] == 'M']
def func(x):
return np.count_nonzero(x)
click_rate = man_df.groupby(by=['xyz_campaign_id','age'])['Clicks'].sum()
trans_rate = man_df.groupby(by=['xyz_campaign_id','age'])['Approved_Conversion'].apply(func)
#计算出的转换率
p = (trans_rate / click_rate).map(lambda x:format(x,'.2f'))
for ad_id in data['xyz_campaign_id'].unique():
max_s = p[ad_id].sort_values(ascending=False).head(1)
print('%d广告在%s年龄段对应的转换率最高%f'%(ad_id,max_s.index.values[0],max_s.values))
916广告在35-39年龄段对应的转换率最高0.380000
936广告在30-34年龄段对应的转换率最高0.440000
1178广告在40-44年龄段对应的转换率最高0.020000
探索数据
- 观察广告花费和点击量的关系
plt.scatter(data['Clicks'],data['Spent'])
plt.xlabel('点击量')
plt.ylabel('花费')
#点击量和总花费之间是呈现正比
- 观察广告花费和曝光量的关系
plt.scatter(data['Impressions'],data['Spent'])
plt.xlabel('曝光量')
plt.ylabel('花费')
- 观察广告花费和购买量的关系
plt.scatter(data['Approved_Conversion'],data['Spent'])
plt.xlabel('购买量')
plt.ylabel('花费')
#没有关系
分析3支广告的综合效果如何?
- 分别计算三支广告的投放量、成本费用、浏览量/曝光量、点击量、购买量和广告投资回报率ROAS。
#三支广告的投放量
s1 = data.groupby(by='xyz_campaign_id')['ad_id'].count()
s1
xyz_campaign_id
916 54
936 464
1178 625
Name: ad_id, dtype: int64
#三支广告的总费用
s2 = data.groupby(by='xyz_campaign_id')['Spent'].sum()
s2
xyz_campaign_id
916 149.710001
936 2893.369999
1178 55662.149959
Name: Spent, dtype: float64
#三支广告的曝光量
s3 = data.groupby(by='xyz_campaign_id')['Impressions'].sum()
s3
xyz_campaign_id
916 482925
936 8128187
1178 204823716
Name: Impressions, dtype: int64
#三支广告的点击量
s4 = data.groupby(by='xyz_campaign_id')['Clicks'].sum()
s4
xyz_campaign_id
916 113
936 1984
1178 36068
Name: Clicks, dtype: int64
#三支广告的购买量
s5 = data.groupby(by='xyz_campaign_id')['Approved_Conversion'].sum()
s5
xyz_campaign_id
916 24
936 183
1178 872
Name: Approved_Conversion, dtype: int64
#三支广告的点击率=点击量/曝光量
s6 = s4 / s3
s6
xyz_campaign_id
916 0.000234
936 0.000244
1178 0.000176
dtype: float64
#三支广告的ROAS:转化带来的销售额/广告花费
s7 = s5 / s2
s7
xyz_campaign_id
916 0.160310
936 0.063248
1178 0.015666
dtype: float64
#数据整合
ret_df = pd.DataFrame([s1.to_list(),s2.to_list(),s3.to_list(),
s4.to_list(),s5.to_list(),s6.to_list(),s7.to_list()],
columns=[916,936,1178],index=['投放量','总费用','浏览量','点击量','购买量','点击率','ROAS']).T
ret_df
- 结论:
- 1178组广告的投放成本最高且远超另外两组,也因此带来了大量的投放量、浏览量、点击量和购买量。但是它的ROAS是三组中最低的。(综合效果最差)
- 916组广告的投资成本是最低的只有149.71,但是它的ROAS是三组最高的。(综合效果最好)
- 936组广告的点击率高于916,但是ROAS却低于916,ROAS虽然不如916组但也是1178组的好几倍多。(综合效果居中)
为何1178这组广告的综合效果最差呢?可以从该广告的用户画像进行分析。
1178广告用户的用户画像
-
从性别和年龄2个维度(用户特征)衡量广告的点击率CTR、转换率CVR、每次点击费用CPC和广告投资回报率ROAS来查看1178广告的综合效果情况。
- 点击量CTR = 点击量/曝光量
- 转换率CRV = 转换量/点击量
- 转换量:用户点击广告后,发生下单行为的用户数量
- CPC = 点击次数 / 花费
- ROAS = 转化带来的购买量 / 广告花费
-
基于年龄绘制用户画像
#获取1178行数据
df_1178 = data.loc[data['xyz_campaign_id'] == 1178]
df_1178
#计算点击率
df1_1178 = df_1178.groupby(by='age')['Impressions','Clicks'].sum()
s1_1178 = df1_1178['Clicks'] / df1_1178['Impressions']
s1_1178
age
30-34 0.000138
35-39 0.000166
40-44 0.000193
45-49 0.000214
dtype: float64
#计算转换量
def func(x):
return np.count_nonzero(x)
s_ret = df_1178.groupby(by='age')['Approved_Conversion'].apply(func)
#转换率
s2_1178 = s_ret / df1_1178['Clicks']
s2_1178
age
30-34 0.014880
35-39 0.013378
40-44 0.010525
45-49 0.006528
dtype: float64
#CPC = 点击次数 / 花费
#花费
cost_s = df_1178.groupby(by='age')['Spent'].sum()
#CPC
s3_1178 = df1_1178['Clicks'] / cost_s
s3_1178
age
30-34 0.618168
35-39 0.635383
40-44 0.666306
45-49 0.667502
dtype: float64
#ROAS:转化带来的购买量 / 广告花费
s4_1178 = df_1178.groupby(by='age')['Approved_Conversion'].sum() / cost_s
s4_1178
age
30-34 0.026715
35-39 0.015600
40-44 0.012677
45-49 0.008872
dtype: float64
#数据整合
ret_df_1178_age = pd.DataFrame([s1_1178.to_list(),s2_1178.to_list(),s3_1178.to_list(),
s4_1178.to_list()],columns=['30-34',"35-39","40-44",'45-49'],
index=['CTR点击量','CRV转换率','CPC每次点击费用','ROAS投资回报率'])
ret_df_1178_age
从结果可看出45-49这个年龄段广告花费最多,点击量最大,但是用户的转化率和投资回报率最低,说明这个群体对于广告展示内容不太满意或者他们的付费能力偏低;年龄段30-34转化率最高,广告花费和投资回报率最好,适合进一步优化投放。
- 基于性别绘制用户画像
#计算点击率
df1_1178 = df_1178.groupby(by='gender')['Impressions','Clicks'].sum()
s1_1178 = df1_1178['Clicks'] / df1_1178['Impressions']
s1_1178
gender
F 0.000205
M 0.000144
dtype: float64
#计算转换量
def func(x):
return np.count_nonzero(x)
s_ret = df_1178.groupby(by='gender')['Approved_Conversion'].apply(func)
#转换率
s2_1178 = s_ret / df1_1178['Clicks']
s2_1178
gender
F 0.007750
M 0.015568
dtype: float64
#CPC = 点击次数 / 花费
#花费
cost_s = df_1178.groupby(by='gender')['Spent'].sum()
#CPC
s3_1178 = df1_1178['Clicks'] / cost_s
s3_1178
gender
F 0.692397
M 0.587681
dtype: float64
#ROAS:转化带来的购买量 / 广告花费
s4_1178 = df_1178.groupby(by='gender')['Approved_Conversion'].sum() / cost_s
s4_1178
gender
F 0.012199
M 0.020373
dtype: float64
#数据整合
ret_df_1178_gender = pd.DataFrame([s1_1178.to_list(),s2_1178.to_list(),s3_1178.to_list(),
s4_1178.to_list()],columns=['Female','Male'],
index=['CTR点击率','CRV转换率','CPC每次点击费用','ROAS投资回报率'])
ret_df_1178_gender
结论:女性的点击率和花费最高但是投资回报率和转换率最低,说明应加大对男性用户的投放力度。
示例数据来之大数据分析课程。