Data Analytics Capstone · UT Dallas 2026

Customer Analytics — Retail Campaign Study

A food and wine retailer ran five marketing campaigns and then a sixth, final offer. This page looks at 2,237 of its customers to answer three questions a marketing manager would ask: who responds, where the spend comes from, and what the next campaign should do differently. Use the filters to slice every number by age, education, kids at home and marital status.

Built with SQL · Python · HTML/JS 2,237 customers 6 campaigns 2012–2014
n = 2,237 customers

Customers

–

People in the current slice of the data.

Avg income

–

Yearly household income, mean of customers who reported it.

Avg spend (2 yrs)

–

Total spent across all six product categories per customer.

Response rate

–

Share who accepted the last campaign offer.

Accepted any campaign

–

Share who said yes to at least one of the five earlier campaigns.

Web visits / mo

–

Average visits to the website in the last month.

Where the spend and the responses come from

All six charts below respond to the filters.

Spend by product category

Total spent in the last two years, current slice

No customers match these filters.

Purchases by channel

Average purchases per customer. Deals are discounted purchases across channels, not a separate channel.

No customers match these filters.

Campaign acceptance rate

Share of customers who accepted each offer. The last campaign (Response) is highlighted.

No customers match these filters.

Response rate by age group

Last-campaign response. Other filters apply; the age filter is ignored here so groups stay comparable.

No customers match these filters.

Average spend by education

Two-year spend per customer. Other filters apply; the education filter is ignored here.

No customers match these filters.

Spend concentration

Share of total spend by customer spend quartile. Full dataset, not filtered.

61.5%

of all spend comes from the top 25% of customers. The bottom half accounts for 9.3%.

Who says yes

Full dataset, not filtered.

Response by prior campaign accepts

Last-campaign response rate by how many of the five earlier offers a customer accepted

Response by days since last purchase

Recent buyers say yes far more often

What the data says

    What I'd recommend

      Numbers in both panels are from the full dataset of 2,237 customers.

      How this was built

      MySQL→ Python · pandas · seaborn→ This page · HTML/JS · Chart.js

      Income arrived as text with dollar signs and commas, 24 customers had no income on file, and three birth years put customers over 110 years old. I cleaned those in SQL and pandas, aggregated the results, and embedded a compact summary table in this page so every filter recomputes in the browser with no server.

      The data is the public, anonymized "marketing_campaign" customer-personality teaching dataset (2,240 customers, enrolled 2012–2014). Ages are calculated as of 2014, the last year in the data.

      Source and code

      github.com/gilbertrenteria/customer-analytics-capstone

      SQL queries, the Python notebook, the cleaned CSV and this dashboard are all in the repo.

      Built by Gilbert Renteria · gilbertrenteria.dev