广告投放分析

news2024/11/28 4:40:35
项目背景
  • 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

在这里插入图片描述

结论:女性的点击率和花费最高但是投资回报率和转换率最低,说明应加大对男性用户的投放力度。

示例数据来之大数据分析课程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1581946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

django 4.2 自定义signal的使用方法

环境:win11 python3.9.2 django 4.2.11 背景:执行异步数据存储,想要使用该方法实现(失败了) 时间:20240410 说明:记录一下,避免忘记 1、创建django项目,并实现首页 …

vue点击上传图片并实现图片预览功能,并实现多张图片放到一个数组中进行后端请求(使用原生input)

一、将 File 对象转成 BASE64 字符串 &#xff08;FileReader&#xff09; <template><div><!-- 用来显示封面的图片 --><!-- <img src"/assets/images/cover.jpg" alt"" class"cover-img" ref"imgRef" />…

蓝桥杯嵌入式2023年第十四届省赛主观题解析

1 题目 2 代码 /* Includes ------------------------------------------------------------------*/ #include "main.h" #include "adc.h" #include "rtc.h" #include "tim.h" #include "gpio.h"/* Private includes --…

Leetcode:27.移除元素

题目要求 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出…

C语言指针—野指针、指针运算、指针与数组

野指针 指针未初始化 int main(){int *p;//没有初始化&#xff0c;就意味着没有明确的方向//一个局部变量不初始化&#xff0c;放的是随机值:0xCCCCCCCC//请注意&#xff0c;这个地址并不是我们定义的&#xff0c;是一个非法的地址*p 10;//非法访问内存了&#xff0c;这里的…

Unity面经(自整)——移动开发与Shader

Unity与Android混合开发 为什么使用Flutter构建 Flutter 是 Google 的开源工具包&#xff0c;用于从单个代码库为移动、Web、桌面和嵌入式设备构建应用程序&#xff08;一套代码跨平台构建app是它最大的优点&#xff09;&#xff0c;并且可以构建高性能、稳定和丰富UI的应用程…

Spring MVC体系结构和处理请求控制器(一)

一、MVC模式 MVC模式是指Model-View-Controller&#xff08;模型-视图-控制器&#xff09;模式&#xff0c;是开发Web应用程序时常用的一种代码分层模式MVC模式是软件工程中的一种架构模式&#xff0c;会强制行的把系统的输入、处理和输出分开&#xff0c;是系统从功能上形成M…

评论发布完整篇(react版)

此篇文章阐述评论的最新、最热之间的tab标签切换&#xff08;包括当前所在tab标签的高亮显示问题&#xff09;&#xff1b;当前评论的删除&#xff1b;除此之外还延伸了用户的评论实时发布功能。其中最新tab标签所展示的内容是根据当前评论点赞数来进行排序&#xff0c;点赞数量…

数字社会下的智慧公厕:构筑智慧城市的重要组成部分

智慧城市已经成为现代城市发展的趋势&#xff0c;而其中的数字化转型更是推动未来社会治理体系和治理能力现代化的必然要求。在智慧城市建设中&#xff0c;智慧公厕作为一种新形态的信息化公共厕所&#xff0c;扮演着重要角色。本文智慧公厕源头实力厂家广州中期科技有限公司&a…

Go gin框架(详细版)

目录 0. 为什么会有Go 1. 环境搭建 2. 单-请求&&返回-样例 3. RESTful API 3.1 首先什么是RESTful API 3.2 Gin框架支持RESTful API的开发 4. 返回前端代码 go.main index.html 5. 添加静态文件 main.go 改动的地方 index.html 改动的地方 style.css 改动…

C语言 | 字符函数和字符串函数

目录&#xff1a; 1. 字符分类函数 2. 字符转换函数 3. strlen的使用和模拟实现 4. strcpy的使用和模拟实现 5. strcat的使用和模拟实现 6. strcmp的使用和模拟实现 7. strncpy函数的使用 8. strncat函数的使用 9. strncmp函数的使用 10. strstr的使用 11. strtok函…

力扣121. 买卖股票的最佳时机

Problem: 121. 买卖股票的最佳时机 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义一个int数组max大小同prices&#xff1b;定义int变量curMax初始化为0&#xff1b; 2.从后往前遍历数组&#xff0c;若当前元素prices[i] > curMax时&#xff0c;则使将其赋值给curMa…

医院预约系统微信小程序APP前后端

医院预约系统具体功能介绍&#xff1a;展示信息、可以注册和登录&#xff0c; 预约&#xff08;包含各个科室的预约&#xff0c;可以预约每个各个医生&#xff09;&#xff0c;就诊引导包含预约的具体信息&#xff0c;包含就诊时间、就诊科室、就诊医生以及就诊人信息、和支付状…

如何注册midjourney账号

注册Midjourney账号比较简单&#xff0c;准备好上网工具&#xff0c;进入官网 Midjourney访问地址&#xff1a; https://www.midjourney.com/ 目前没有免费使用额度了&#xff0c;会员最低 10 美元/月&#xff0c;一般建议使用30美元/月的订阅方案。了解如何订阅可以查看订阅…

MyBatis源码介绍

文章目录 MyBatis的核心流程介绍SqlSessionFactory的理解MyBatis中的Executor的源码理解Spring中是如何解决MySQL的SqlSession的线程安全问题MyBatis面向Mapper编程工作原理Mybatis动态sql执行原理Mybatis的一级、二级缓存实现原理Mybatis的插件运行原理以及如何编写一个插件my…

019——IIC模块驱动开发(基于EEPROM【AT24C02】和I.MX6uLL)

目录 一、 IIC基础知识 二、Linux中的IIC&#xff08;韦东山老师的学习笔记&#xff09; 1. I2C驱动程序的层次 2. I2C总线-设备-驱动模型 2.1 i2c_driver 2.2 i2c_client 三、 AT24C02 介绍 四、 AT24C02驱动开发 实验 驱动程序 应用程序 一、 IIC基础知识 总线类…

【linux】谈MobaXterm支持的连接方式

目前远程联机服务器主要有文字命令行接口和图形界面接口两种。 一、命令行接口方式 1.1 加密传输-SSH SSH为主&#xff0c;目前大多在网络上的数据封包都是加密的技术&#xff0c;等到传输的封包加密后再传输到网络上&#xff0c;以增加数据在Internet上面传送的安全性 1.2…

【软考】哈希表

目录 一、概念1.1 定义 二、哈希函数的构造方法2.1 说明2.2 特性 三、处理冲突的方法3.1 说明3.2 开放定址法3.2.1 说明3.2.2 线性探测 3.3 链地址法3.4 再哈希法3.5 建立公共溢出区 四、哈希表的查找4.1 查找过程4.2 查找特点4.3 装填因子 一、概念 1.1 定义 1.一般存储结构由…

Solid Converter 10.1下载地址及安装教程

Solid Converter 10是一款专业的PDF转换工具&#xff0c;用于将PDF文件转换为可编辑的文档格式&#xff0c;如Word、Excel、PowerPoint等。它提供了强大的转换功能和一系列实用的工具&#xff0c;帮助用户将PDF内容转换为可重复使用和编辑的格式。 Solid Converter 10的主要功…

vcruntime140.dll文件缺失的多种解决方法,这五种修复vcruntime140.dll绝对有效

当你在使用电脑的时候&#xff0c;可能会遇到一个提示错误&#xff0c;显示“vcruntime140.dll文件缺失&#xff0c;程序因此无法启动”。这种状况不但打断了你的日常使用&#xff0c;还可能对你的工作效率造成不利影响。为了助你更好地搞清楚这个问题的由来以及解决方案&#…