Data Analytics project 04
Marketing Campaign Analysis Project with Python
Build a complete marketing campaign analysis portfolio project with documented metrics, reproducible Python code, validation checks, and responsible interpretation.
Explore Data Analytics training in VizagView all project ideas
Business question
How do CTR, CPC, conversion rate, customer acquisition cost, and ROAS compare across campaigns and channels?
Dataset and grain
Sixty synthetic campaigns across search, social, email, and display with impressions, clicks, conversions, spend, and attributed revenue.
Requirements
Python 3.10 or later with numpy and pandas installed.
Method and validation checks
Calculate row-level ratios with safe denominators, aggregate funnel numerators and denominators by channel, then recompute rates from aggregated totals.
- Clicks never exceed impressions
- Conversions never exceed clicks
- Channel rates are weighted from totals, not averaged row percentages
- ROAS remains separate from profit and incrementality
Complete Python code
Save the code as da_marketing_campaign_analysis.py. Review the stated model and field assumptions before using another dataset.
"""Calculate funnel and return metrics for synthetic marketing campaigns."""
from __future__ import annotations
import numpy as np
import pandas as pd
def make_demo_campaigns(n: int = 60, seed: int = 42) -> pd.DataFrame:
rng = np.random.default_rng(seed)
impressions = rng.integers(25_000, 300_000, n)
clicks = rng.binomial(impressions, rng.uniform(0.008, 0.055, n))
conversions = rng.binomial(clicks, rng.uniform(0.015, 0.12, n))
spend = rng.uniform(20_000, 240_000, n)
revenue = conversions * rng.uniform(1200, 6000, n)
return pd.DataFrame({"campaign_id": [f"CMP{i:03d}" for i in range(1, n + 1)],
"channel": rng.choice(["Search", "Social", "Email", "Display"], n),
"impressions": impressions, "clicks": clicks, "conversions": conversions,
"spend": spend.round(2), "revenue": revenue.round(2)})
def analyse_campaigns(data: pd.DataFrame) -> tuple[pd.DataFrame, pd.DataFrame]:
campaigns = data.copy()
campaigns["ctr"] = campaigns["clicks"] / campaigns["impressions"]
campaigns["cpc"] = campaigns["spend"] / campaigns["clicks"].replace(0, np.nan)
campaigns["conversion_rate"] = campaigns["conversions"] / campaigns["clicks"].replace(0, np.nan)
campaigns["cac"] = campaigns["spend"] / campaigns["conversions"].replace(0, np.nan)
campaigns["roas"] = campaigns["revenue"] / campaigns["spend"].replace(0, np.nan)
channel = campaigns.groupby("channel", as_index=False).agg(impressions=("impressions", "sum"), clicks=("clicks", "sum"), conversions=("conversions", "sum"), spend=("spend", "sum"), revenue=("revenue", "sum"))
channel["ctr"] = channel["clicks"] / channel["impressions"]
channel["conversion_rate"] = channel["conversions"] / channel["clicks"]
channel["roas"] = channel["revenue"] / channel["spend"]
return campaigns, channel.sort_values("roas", ascending=False)
def main() -> None:
_, channel = analyse_campaigns(make_demo_campaigns())
print(channel.round(3).to_string(index=False))
print("ROAS excludes margin and incrementality; attribution does not prove causality.")
if __name__ == "__main__":
main()
Build and run the project
Run python da_marketing_campaign_analysis.py to calculate campaign and channel funnel metrics.
- Confirm the source grain and field definitions.
- Reconcile record counts and additive totals.
- Validate rate denominators and date filters.
- Review outliers and missing values.
- Read the interpretation limits before sharing conclusions.
Expected analytical output
Campaign-level funnel metrics and a channel summary ranked by attributed return on ad spend.
Interpretation and responsible-use limits
Attribution does not prove that advertising caused the conversion. ROAS ignores margin and often cross-channel effects; decisions require incrementality tests and a documented attribution window.
Ways to extend the project
Add assisted conversions, margin-adjusted return, confidence intervals, experiment results, budget pacing, and channel-specific attribution rules.
Continue learning Data Analytics
Try the next project, return to the Softenant project library, or explore the Data Analytics course in Vizag for guided SQL, Excel, Power BI, Python, dashboard, and portfolio practice.