为什么做这个项目?
1.1 行业痛点
在数字化营销时代,企业每天在社交媒体广告上投入大量资金。一个中型电商平台每天可能投放数百个广告,月花费可达数十万元。然而,很多企业面临以下困境:

1.2 核心问题
广告投放的钱,到底花在哪里最有效?
这个问题可以拆解为四个子问题:
哪个广告系列 ROI 最高? —— 帮助决定预算分配方向
哪类人群转化效果最好? —— 指导受众定向策略
哪些兴趣标签值得重点投放? —— 优化兴趣定向
花费和转化是否存在最优区间? —— 避免无效花费
这个项目解决什么问题?
2.1 解决的问题清单

2.2 项目价值

为什么选择这个数据集?
3.1 数据集特点

3.2 数据能回答的问题

为什么做 ETL 而不是直接分析 CSV?

技术栈概述
本项目使用 Python 作为数据处理工具,主要依赖以下第三方库:

数据库连接配置
4.1 连接参数设置
首先配置 MySQL 数据库的连接信息,包括主机地址、用户名、密码、数据库名称和端口号。
# 导入所需库import pandas as pdimport numpy as npfrom sqlalchemy import create_engine, textimport pymysqlfrom datetime import datetime# MySQL数据库连接配置DB_CONFIG = {'host': 'localhost', # 数据库主机地址'user': 'root', # 数据库用户名'password': '88888888', # 数据库密码'database': 'ecommerce_analysis', # 数据库名称'port': 3306 # MySQL默认端口}# 创建数据库连接引擎def get_db_engine():"""创建MySQL数据库连接引擎"""connection_string = f"mysql+pymysql://{DB_CONFIG['user']}:{DB_CONFIG['password']}@{DB_CONFIG['host']}:{DB_CONFIG['port']}/{DB_CONFIG['database']}?charset=utf8mb4"return create_engine(connection_string)
4.2 配置说明

数据提取(Extract)
5.1 读取原始数据
# 读取CSV文件df = pd.read_csv('../data/KAG_conversion_data.csv')# 查看数据基本信息print(f"数据形状: {df.shape}")print(f"\n数据字段: {list(df.columns)}")print(f"\n前5行数据预览:")df.head()
5.2 原始字段说明

数据转换(Transform)
6.1 字段重命名(中文化)
为了方便后续在 BI 工具中理解和使用,将所有字段名改为中文。
# 字段重命名为中文df.columns = [col.lower() for col in df.columns]df.rename(columns={'ad_id': '广告ID','xyz_campaign_id': '广告系列ID','fb_campaign_id': '脸书广告系列ID','age': '年龄段','gender': '性别','interest': '兴趣代码','impressions': '曝光量','clicks': '点击量','spent': '花费_美元','total_conversion': '总转化数','approved_conversion': '批准转化数'}, inplace=True)print("重命名后的字段:")print(list(df.columns))
6.2 数据类型转换
确保数值字段为正确的数据类型。
# 数值字段列表numeric_cols = ['曝光量', '点击量', '花费_美元', '总转化数', '批准转化数']# 转换为数值类型for col in numeric_cols:df[col] = pd.to_numeric(df[col], errors='coerce')print("数据类型转换完成")df[numeric_cols].dtypes
6.3 缺失值处理
# 检查缺失值print("缺失值统计:")print(df.isnull().sum())# 记录清洗前的数量before_drop = len(df)# 删除关键字段为空的行df = df.dropna(subset=['广告ID', '广告系列ID', '曝光量'])# 记录清洗后的数量after_drop = len(df)print(f"\n删除空值记录: {before_drop - after_drop} 条")print(f"清洗后记录数: {after_drop} 条")
6.4 派生指标计算
计算营销分析的核心指标,这些指标将在 BI 可视化中直接使用。
# 点击率 CTR = 点击量 / 曝光量 × 100df['点击率_CTR_百分比'] = (df['点击量'] / df['曝光量'].replace(0, np.nan)) * 100df['点击率_CTR_百分比'] = df['点击率_CTR_百分比'].fillna(0).round(4)# 千次曝光成本 CPM = (花费 / 曝光量) × 1000df['千次曝光成本_CPM_美元'] = (df['花费_美元'] / df['曝光量'].replace(0, np.nan)) * 1000df['千次曝光成本_CPM_美元'] = df['千次曝光成本_CPM_美元'].fillna(0).round(2)# 单次点击成本 CPC = 花费 / 点击量df['单次点击成本_CPC_美元'] = df['花费_美元'] / df['点击量'].replace(0, np.nan)df['单次点击成本_CPC_美元'] = df['单次点击成本_CPC_美元'].fillna(0).round(4)# 转化率 = 总转化数 / 点击量 × 100df['转化率_百分比'] = (df['总转化数'] / df['点击量'].replace(0, np.nan)) * 100df['转化率_百分比'] = df['转化率_百分比'].fillna(0).round(4)# 广告支出回报率 ROAS = 批准转化数 / 花费df['广告支出回报率_ROAS'] = df['批准转化数'] / df['花费_美元'].replace(0, np.nan)df['广告支出回报率_ROAS'] = df['广告支出回报率_ROAS'].fillna(0).round(4)# 单次转化成本 CPA = 花费 / 批准转化数df['单次转化成本_CPA_美元'] = df['花费_美元'] / df['批准转化数'].replace(0, np.nan)df['单次转化成本_CPA_美元'] = df['单次转化成本_CPA_美元'].fillna(0).round(4)# 添加ETL时间戳df['ETL处理时间'] = datetime.now()
6.5 派生指标汇总

6.6 数据统计报告
# 整体数据概览print("=" * 60)print("数据统计报告")print("=" * 60)print(f"\n📊 数据概览:")print(f" - 总记录数: {len(df):,} 条")print(f" - 广告系列数: {df['广告系列ID'].nunique()} 个")print(f" - 广告系列列表: {sorted(df['广告系列ID'].unique())}")print(f" - 年龄段: {df['年龄段'].unique().tolist()}")print(f" - 性别: {df['性别'].unique().tolist()}")print(f" - 兴趣代码数: {df['兴趣代码'].nunique()} 个")# 核心指标统计total_spend = df['花费_美元'].sum()total_impressions = df['曝光量'].sum()total_clicks = df['点击量'].sum()total_approved = df['批准转化数'].sum()avg_roas = df['广告支出回报率_ROAS'].mean()avg_ctr = df['点击率_CTR_百分比'].mean()print(f"\n💰 核心指标:")print(f" - 总花费: ${total_spend:,.2f}")print(f" - 总曝光量: {total_impressions:,}")print(f" - 总点击量: {total_clicks:,}")print(f" - 总批准转化数: {total_approved:,}")print(f" - 平均ROAS: {avg_roas:.4f}")print(f" - 平均CTR: {avg_ctr:.2f}%")
数据加载(Load)
7.1 写入 MySQL 数据库
# 创建数据库连接engine = get_db_engine()# 表名(中文表名,便于BI工具识别)table_name = '广告投放效果数据'# 将数据写入MySQLdf.to_sql(table_name, engine, if_exists='replace', index=False, chunksize=1000)print(f"✅ 数据写入成功: {len(df)} 条记录 -> 表 `{table_name}`")# 验证写入结果with engine.connect() as conn:result = conn.execute(text(f"SELECT COUNT(*) FROM `{table_name}`"))count = result.fetchone()[0]print(f"✅ 验证通过: `{table_name}` 表共有 {count} 条记录")
7.2 查看表结构
# 查看最终的表字段with engine.connect() as conn:result = conn.execute(text(f"DESCRIBE `{table_name}`"))print("\n📋 最终表结构:")for row in result:print(f" - {row[0]}")
数据导出(可选)
8.1 保存清洗后的本地副本
# 保存为CSV文件(便于备份或离线分析)df.to_csv('../output/广告投放数据_清洗后.csv', index=False, encoding='utf-8-sig')print("✅ 清洗后数据已保存: output/广告投放数据_清洗后.csv")
总结
9.1 ETL流程回顾
┌─────────────┐ ┌─────────────┐ ┌─────────────┐│ Extract │ ──▶ │ Transform │ ──▶ │ Load ││ 数据提取 │ │ 数据转换 │ │ 数据加载 │└─────────────┘ └─────────────┘ └─────────────┘│ │ │▼ ▼ ▼CSV文件 清洗+派生指标 MySQL数据库
下一步
数据已成功存入 MySQL 数据库,接下来可以:
打开 Power BI Desktop
连接 MySQL 数据库 ecommerce_analysis
导入表 广告投放效果数据
开始可视化分析
连接数据库
10.1 安装 MySQL ODBC 驱动
在连接数据库之前,需要先安装 MySQL ODBC 驱动。(先看power bi能不能连接上mysql数据库,如果连接失败在修改这个驱动,先把自己的8.0.17删掉再安装这个8.0.16)

10.2 配置 ODBC 数据源

10.3 在 Power BI 中连接

数据模型准备
11.1 字段说明

11.2 创建度量值(DAX)
创建方法:右键点击字段列表中的表名 →「新建度量值」

仪表板设计
12.1 整体布局规划

12.2 图表1:KPI卡片图

12.3 图表2:广告系列ROAS对比柱状图

12.4 图表3:年龄段+性别ROAS热力图

12.5 图表4:兴趣代码ROAS TOP10条形图

12.6 图表5:花费 vs 转化散点图

12.7 图表6:转化漏斗图

转化阶段表结构(使用「输入数据」功能创建):

12.8 筛选器(切片器)

页面美化

快速统一格式技巧:设置好一个图表的所有格式后,右键点击该图表 →「复制格式」,再选中其他图表 → 右键 →「选择性粘贴」→「格式」
发布与分享

业务洞察对应表

可能遇见的问题


报告概述
本报告基于 Facebook 广告投放数据,通过 ETL 数据处理和 Power BI 可视化分析,旨在为企业广告投放决策提供数据支持,回答「广告预算花在哪里最有效」这一核心业务问题。
核心指标总览

初步判断:从曝光到点击的转化约为 179%(38.17 / 21.34),数据可能存在重复计数或统计口径差异,建议核查数据源定义。
关键业务问题与决策建议
问题一:哪个广告系列 ROI 最高?

决策建议:
将预算向 ROAS 最高的 1-2 个广告系列倾斜
暂停或大幅削减 ROAS 低于平均值的广告系列
建议设定 ROAS 红线(如 50),低于红线的系列停止投放
问题二:哪类人群(年龄段+性别)转化效果最好?
根据热力图数据,按 ROAS 从高到低排序:
关键发现:

关键发现:

决策建议:

问题三:哪些兴趣代码值得重点投放?
根据 TOP10 条形图数据,兴趣代码 ROAS 分布如下:

决策建议:
识别出 ROAS 最高的 5-10 个兴趣代码,作为核心投放标签
将 80% 的预算集中在 TOP 10 兴趣代码上
定期(每周/每月)更新兴趣代码效果排名,及时调整
对于 ROAS 极低的兴趣代码,直接排除定向
问题四:花费与转化的关系是怎样的?

决策建议:
建立花费与转化的监控看板,每日追踪
对「高花费低转化」的广告进行及时干预
分析「低花费高转化」广告的成功因素,复制其模式
建议设定单次转化成本上限(如 100 元),超过则自动暂停
综合决策建议汇总

核心结论

https://www.heywhale.com/mw/project/69e74388e331eba145a97839/content

扫一扫
二维码
获取更多专业知识
往
期
推
荐