# Load and read data
data_file <- "C:/Users/889737/Downloads/campaign_performance.csv"
data <- read.csv(data_file)
# Assign data types and clean data
data <- data %>%
mutate(
campaign_name = as.character(campaign_name),
channel = as.character(channel),
impressions = str_remove_all(impressions, ","),
impressions = as.integer(impressions),
ctr = str_remove_all(ctr, "%"),
ctr = as.numeric(ctr) / 100
)
# Calculate nr. of clicks per campaign
data$clicks <- with(data, ctr * impressions)
The dataset contains 50 campaigns across 5 channels.
# Group data by channel and calculate CTR per channel
data_grouped <- data %>%
group_by(channel) %>%
summarise(
total_impressions = sum(impressions),
total_clicks = sum(clicks),
ctr_percent = total_clicks / total_impressions
) %>%
arrange(desc(ctr_percent))
data_grouped %>%
mutate(
total_impressions = format(total_impressions, big.mark = ","),
total_clicks = format(round(total_clicks), big.mark = ","),
ctr_percent = scales::percent(ctr_percent, accuracy = 0.01)
) %>%
kable(
col.names = c("Channel", "Impressions", "Clicks", "CTR"),
align = c("l", "r", "r", "r"),
caption = "Totals and CTR per channel"
)
| Channel | Impressions | Clicks | CTR |
|---|---|---|---|
| Paid Search | 13,291,625 | 588,646 | 4.43% |
| Retargeting | 5,399,745 | 69,276 | 1.28% |
| Paid Social | 37,768,487 | 196,693 | 0.52% |
| Video | 44,060,212 | 150,686 | 0.34% |
| Display | 102,891,287 | 116,676 | 0.11% |
ggplot(data_grouped, aes(x = reorder(channel, -ctr_percent), y = ctr_percent)) +
# Column chart
geom_col(fill = "steelblue") +
# Horizontal line at 4%
geom_hline(yintercept = 0.04, color = "red", linetype = "dashed", linewidth = 1) +
# Show y-axis as percentages
scale_y_continuous(labels = scales::percent) +
# Labels
labs(
title = "CTR per Channel",
x = "Channel",
y = "CTR (%)"
) +
theme_clean()
CTR per channel. The dashed red line marks the 4% target.
Channels above the 4% target: Paid Search