Maven Marketing Dashboard

Introduction

About This Dashboard

🔍 What This Dashboard Solves

Business Challenge How This Helps
Identifying high-value customers Visual segmentation by spending, demographics, and purchase frequency
Measuring campaign ROI Clear performance metrics for all marketing initiatives
Optimizing product mix Spending breakdown across 6 product categories
Improving channel strategy Purchase method analysis (web/store/catalog)

📊 Tab Overview

1. Customer Profiles
- Age/income distributions
- Education and marital status breakdowns
- Geographic concentration maps

2. Spending Patterns
- Total revenue by product category
- Income-to-spending correlations
- Customer lifetime value estimates

3. Campaign Analytics
- Acceptance rates for 5 campaigns
- Response rate by demographic
- Country-level performance heatmap

â„šī¸ Data Notes

  • Source: Maven Marketing (2,240 customers)
  • Timeframe: 2012-2014

Data Source: Download Full Data Dictionary

Customer Overview Tab

Code
library(ggplot2)
library(plotly)

ggplot(marketing_data_clean, aes(x = Age, fill = Education, text = paste("Age:", Age, "<br>Education:", Education))) +
  geom_histogram(binwidth = 5, alpha = 0.8) +
  labs(title = "Customer Age Distribution by Education Level", x = "Age", y = "Count") +
  dashboard_theme -> plot1

ggplotly(plot1, tooltip = "text")
Code
plot2 <- ggplot(marketing_data_clean, aes(x = Marital_Status, y = Income, fill = Marital_Status)) +
  geom_boxplot() +
  labs(title = "Income Distribution by Marital Status", x = "Marital Status", y = "Income") +
  dashboard_theme
ggplotly(plot2) %>% layout(plot_bgcolor = "#f0f8ff", paper_bgcolor = "#e6f2ff")

Customer Demographics Charts

Problems Tackled:

  • “Who are our best customers?”

  • “Where should we focus acquisition?”

Actionable Insights:

  • Target 35-55yo professionals with premium offers

  • Adjust messaging for single vs. partnered customers

  • Allocate regional budgets based on customer concentration

Spending Analysis Tab

Code
plot3 <- marketing_data_clean %>%
  select(starts_with("Mnt")) %>%
  summarise(across(everything(), sum)) %>%
  pivot_longer(everything(), names_to = "Category", values_to = "Amount") %>%
  mutate(Category = str_remove_all(Category, "Mnt|Prods")) %>%
  ggplot(aes(x = reorder(Category, Amount), y = Amount, fill = Category)) +
  geom_col() +
  coord_flip() +
  labs(title = "Total Spending by Product Category", x = "", y = "Total Amount Spent") +
  dashboard_theme
ggplotly(plot3) %>% layout(plot_bgcolor = "#f0f8ff", paper_bgcolor = "#e6f2ff")
Code
plot4 <- ggplot(marketing_data_clean, aes(x = Income, y = Total_Spent, color = Education)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "lm", formula = y ~ x, color = "red") +
  labs(title = "Total Spending vs. Income", x = "Income", y = "Total Spending") +
  dashboard_theme
ggplotly(plot4) %>% layout(plot_bgcolor = "#f0f8ff", paper_bgcolor = "#e6f2ff")

Spending Analysis Charts

Problems Tackled:

  • “Which products drive revenue?”

  • “How does income affect spending?”

Actionable Insights:

  • Bundle low-performing categories with wines

  • Create income-tiered loyalty programs

  • Flag outliers for potential data errors

Campaign Performance Tab

Code
# Campaign acceptance rates
campaign_means <- marketing_data_clean %>%
  select(starts_with("AcceptedCmp")) %>%
  summarise(across(everything(), mean))

response_rate <- mean(marketing_data_clean$Response == "Yes")

campaign_data <- campaign_means %>%
  pivot_longer(everything(), names_to = "Campaign", values_to = "Acceptance_Rate") %>%
  add_row(Campaign = "Response", Acceptance_Rate = response_rate) %>%
  mutate(Campaign = case_when(
    Campaign == "AcceptedCmp1" ~ "Campaign 1",
    Campaign == "AcceptedCmp2" ~ "Campaign 2",
    Campaign == "AcceptedCmp3" ~ "Campaign 3",
    Campaign == "AcceptedCmp4" ~ "Campaign 4",
    Campaign == "AcceptedCmp5" ~ "Campaign 5",
    Campaign == "Response" ~ "Latest Campaign",
    TRUE ~ Campaign
  ))


plot5 <- ggplot(campaign_data, aes(x = reorder(Campaign, Acceptance_Rate), y = Acceptance_Rate, fill = Campaign)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Campaign Acceptance Rates", x = "", y = "Acceptance Rate") +
  dashboard_theme
ggplotly(plot5) %>%
  layout(
    plot_bgcolor = "#f0f8ff",
    paper_bgcolor = "#e6f2ff"
  )
Code
plot6 <- marketing_data_clean %>%
  group_by(Country) %>%
  summarise(Response_Rate = mean(Response == "Yes")) %>%
  ggplot(aes(x = reorder(Country, Response_Rate), y = Response_Rate, fill = Country)) +
  geom_col() +
  coord_flip() +
  scale_y_continuous(labels = scales::percent) +
  labs(title = "Response Rate by Country", x = "", y = "Response Rate") +
  dashboard_theme
ggplotly(plot6) %>% layout(plot_bgcolor = "#f0f8ff", paper_bgcolor = "#e6f2ff")

Campaign Performance Charts

Problems Tackled:

  • “Which campaigns work best?”

  • “Where do campaigns fail?”

Actionable Insights:

  • Replicate Campaign 3’s successful tactics

  • Retire underperforming campaigns (save 15-20% budget)

  • Localize creatives for low-response regions

Purchase Channel Analysis

Channel Preferrence

Code
# Calculate revenue by channel
channel_revenue <- marketing_data_clean %>%
  summarise(
    `Deals Purchases` = sum(NumDealsPurchases * (Total_Spent/Total_Purchases), na.rm = TRUE),
    `Web Purchases` = sum(NumWebPurchases * (Total_Spent/Total_Purchases), na.rm = TRUE),
    `Catalog Purchases` = sum(NumCatalogPurchases * (Total_Spent/Total_Purchases), na.rm = TRUE),
    `Store Purchases` = sum(NumStorePurchases * (Total_Spent/Total_Purchases), na.rm = TRUE)
  ) %>%
  pivot_longer(everything(), names_to = "Channel", values_to = "Revenue")

channel_plot <- channel_revenue %>%
  ggplot(aes(x = reorder(Channel, Revenue), y = Revenue, fill = Channel,
             text = paste("Channel:", Channel, "<br>Revenue: $", round(Revenue/1000,1), "K"))) +
  geom_col() +
  coord_flip() +
  scale_fill_brewer(palette = "Set2") +
  labs(title = "Total Revenue by Purchase Channel",
       x = "", y = "Total Revenue ($)") +
  dashboard_theme +
  theme(legend.position = "none")

ggplotly(channel_plot, tooltip = "text") %>%
  layout(
    plot_bgcolor = "#f0f8ff",
    paper_bgcolor = "#e6f2ff"
  )

Channel vs. Customer Value

Code
avg_spend <- marketing_data_clean %>%
  summarise(
    `Deals` = mean(Total_Spent[NumDealsPurchases > 0], na.rm = TRUE),
    `Web` = mean(Total_Spent[NumWebPurchases > 0], na.rm = TRUE),
    `Catalog` = mean(Total_Spent[NumCatalogPurchases > 0], na.rm = TRUE),
    `Store` = mean(Total_Spent[NumStorePurchases > 0], na.rm = TRUE)
  ) %>%
  pivot_longer(everything(), names_to = "Channel", values_to = "Avg_Spend")

value_plot <- avg_spend %>%
  ggplot(aes(x = reorder(Channel, Avg_Spend), y = Avg_Spend, fill = Channel,
             text = paste("Channel:", Channel, "<br>Avg Spend: $", round(Avg_Spend)))) +
  geom_col() +
  coord_flip() +
  scale_fill_brewer(palette = "Set2") +
  labs(title = "Average Customer Spending by Preferred Channel",
       x = "", y = "Average Total Spend ($)") +
  dashboard_theme +
  theme(legend.position = "none")

ggplotly(value_plot, tooltip = "text") %>%
  layout(
    plot_bgcolor = "#f0f8ff",
    paper_bgcolor = "#e6f2ff"
  )

Purchase Channel Charts

Problems Tackled:

  • “Where do customers buy?”

  • “Which channels drive quality sales?”

Actionable Insights:

  • Shift budget from web to catalog for high-value customers

  • Improve in-store experience for younger demographics

  • Optimize deal-focused buyer retention