Selected work

Projects with receipts.

Each of these is real, end-to-end work, not a tutorial. The first one ships with a live dashboard built from the actual project data, right here on the page.

Featured · BigQuery · dbt · SQL · Python/ML · Tableau

Marketplace Operations & Revenue Analytics (Olist)

View repo ↗

End-to-end analytics on a Brazilian e-commerce marketplace: I loaded ~100k orders into a cloud warehouse, modeled and tested them with dbt, ran the analysis in SQL, designed a controlled experiment, and shipped a live interactive dashboard.

100K+
orders modeled (9 tables)
~6x
higher 1–2★ rate when delivery is late
R$15.4M
revenue analyzed
  • Built a BigQuery + dbt pipeline: 9 raw tables modeled into a tested star schema (staging → facts) with automated data-quality tests.
  • Wrote analytical SQL (window functions, CTEs) for revenue trends, delivery performance, seller concentration, and customer retention.
  • Confirmed the effect is causal, not just correlation: a logistic regression controlling for price, freight, item count, and delivery estimate still put late orders at ~13x the odds of a bad review, and a Random Forest ranked late delivery the top driver (notebook).
  • Designed an A/B test (hypothesis, primary + guardrail metrics, sample size) to validate a more conservative delivery promise.
  • Shipped an interactive Tableau dashboard from the modeled data, embedded live below.
What I found

Late deliveries are only ~8% of orders but do outsized damage: they average a 2.57 review score versus 4.29 on time, and are roughly 6x more likely to draw a 1–2★ rating. Since 96.9% of customers never buy again, that first delivery is effectively the whole relationship. Revenue is also concentrated, the top 20% of sellers drive 82% of it, so the recommended lever is a more conservative delivery promise, tested via a clean experiment.

What I'd recommend

Under-promise delivery dates (add a buffer at checkout) to cut late-vs-promise orders, the biggest controllable lever, validated with an A/B test. Send proactive delay alerts to soften the hit when an order will run late. Protect the top 20% of sellers who drive 82% of revenue with reliable fulfillment. And add a post-first-order retention nudge, since ~97% of customers never come back.

BigQuerydbtSQLPythonstatsmodelsscikit-learnTableauGit
olist_marketplace · Tableau Public● LIVE · interactive
Featured · Python · SQL · Streamlit

Restaurant Analytics Platform

View repo ↗

End-to-end analytics for a 20-branch restaurant chain across 14 US states: a full ETL pipeline, advanced SQL, an ML model, and an interactive dashboard. I built roughly 80% of this, owning the technical pipeline end to end.

$248K
revenue analyzed
1,838/1,839
orders with a data-quality defect I caught & fixed
8
advanced SQL queries (window fns + CTEs)
  • Built a Python + SQL ETL pipeline: extract from SQLite, transform via analytical views, load a separate reporting database.
  • Caught a revenue defect where stored subtotals were wrong for 1,838 of 1,839 orders (~$87 each) and recomputed every figure from line items.
  • Wrote 8 advanced SQL queries using RANK, LAG, ROW_NUMBER, rolling windows, and a CTE for nested aggregates.
  • Trained Linear Regression and Random Forest models; reported an honest null finding plus a per-item promote/improve shortlist.
What I found

The cheapest items to make, sides like coleslaw and fries, earn the best margins, while a few best-selling mains barely turn a profit, so promoting high-margin sides lifts profit more than pushing big-ticket dishes. And customer ratings track service, not the menu, so better staffing moves reviews faster than new recipes.

PythonpandasSQL / SQLitescikit-learnStreamlitPlotlyJupyter
restaurant_analytics · live preview● LIVE · real data
$0
Total revenue
0
Orders
$0
Avg order value
0
Branches · 14 states

Monthly revenue trend

Menu margin: best vs. lowest (gross margin %)

Team Lead · PySpark · AWS

Job Market Intelligence

Led a 5-person team to mine the labor market for data and analytics roles and deliver a market-entry roadmap.

47,500+
job postings processed
4
job families identified by clustering
  • Built a PySpark / Apache Spark ETL pipeline on AWS EC2 to process 47,500+ postings, demonstrating scalable, large-dataset handling.
  • Trained a Random Forest salary model that outperformed baselines, and used unsupervised clustering to surface 4 distinct job families.
  • Presented an actionable market-entry roadmap to a faculty review panel; version-controlled in Git.
What I found

Professional Services firms dominate hiring (Deloitte alone posted ~2,300 roles, about 5% of the market). Clustering the postings surfaced four job families: a large general-analyst group, specialized AI / deep-learning engineers, big-data engineers (highest Spark and Scala, mostly on-site), and entry-level data roles, which were the most remote-friendly. For a job seeker, the widest and most accessible door is the general-analyst track.

PythonPySparkApache SparkAWS EC2Random ForestGit
Pricing · ML

Retail Pricing & Market Analysis (Zurich)

Decoded the pricing dynamics of a short-stay market and built models to predict price tiers.

2,500+
listings analyzed
~32%
nightly-rate lift per added bedroom
4
market segments for pricing strategy
  • Used regression to quantify the drivers of price and identify the biggest levers.
  • Built price-tier prediction models (k-NN, Decision Tree, DistilBERT) and segmented the market into 4 actionable profiles.
What I found

Two levers move price the most: size and location. Each added bedroom lifts the nightly rate about 32%, and prices vary sharply across the 10 neighbourhoods. K-Means surfaced 4 distinct host profiles, and a language model (DistilBERT) reading the listing text predicted price tiers better than the traditional models, useful for spotting under- and over-priced listings.

Pythonpandasscikit-learnDistilBERTK-Means
zurich_listings · live● real data
0
Listings analyzed
$0
Avg nightly price
$0
Median price
~32%
Price lift per bedroom
Pricing · Marketing Analytics

Category Revenue & Pricing Strategy (Festival)

Translated customer research into category pricing and a vendor mix that the client adopted.

989
households segmented
$182K/day
revenue driver identified
  • Applied conjoint analysis and A/B testing to evaluate pricing effectiveness and rank category preferences.
  • Recommended a category pricing and vendor mix, identifying savoury food as a $182K/day driver, adopted as the final strategy.
What I found

K-Means (on income, distance, event interest, and household size) split the 989 households into 5 named, actionable segments: Affluent Enthusiasts (~$153K income, 8.2/10 interest, the prime VIP/premium target), Budget-Conscious Enthusiasts (lower income but high interest, larger families, win with value and family bundles), Affluent Skeptics (money but low interest, need different messaging to convert), Disengaged Small Households (average income, low interest, low priority), and Local Opportunists (~93% from Portland's Cumberland County, easy impulse and repeat visits). Marketing priority went to Affluent Enthusiasts and Local Opportunists. Conjoint analysis and A/B testing then ranked preferences, with savoury food the clear #1 revenue driver at ~$182K/day, which set the final vendor lineup.

PythonConjoint AnalysisA/B TestingK-Means
regional_families · live● real data
0
Households segmented
5
Customer profiles (K-Means)
8.3/10
Interest in prime segment
$182K/day
Top revenue driver

Customer profiles: income vs. event interest (bubble size = segment size)