Product / data analyst. I work in SQL and Python, and I care most about the step most write-ups skip: turning a number into a decision someone can act on, and being able to say why the number is trustworthy.
Every repository below runs. Tests are green in CI, the numbers in each README were produced by the code in that repository, and each project ends with a recommendation rather than a metric.
| The decision it answers | Stack | |
|---|---|---|
| retail-analytics — live dashboard | Where should a wholesaler's win-back budget go? Not to the 1,556 largest lapsed accounts — to 352 smaller ones that ordered 7.7 times before going quiet. 1.07M invoice lines, warehouse to dashboard. | DuckDB · dbt · Evidence · GitHub Pages |
| ab-test-analysis | Should a mobile game move its progression gate from level 30 to 40? No — it costs 0.82 pp of 7-day retention (95% CI [−1.33, −0.31]). 90,189 players, statistics written by hand. | pandas · numpy · scipy |
| bank-marketing-ml | Which bank clients are worth a call? Targeting the top 28.5% earns €48,400 against €15,370 for calling everyone. Threshold from unit economics, not from a grid search. | scikit-learn · FastAPI · drift monitoring |
| macro-nowcast | Can euro-area inflation be nowcast from public ECB data without accidentally using the future? 16.3% better than a random walk, with an ablation proving the gain is not look-ahead. | requests · pandera · DuckDB · scikit-learn |
| news-topic-classifier | Which topic is this text, which words decided it, and when should the model decline to answer? 85.1% accuracy on the 67% of posts it accepts. | TF-IDF · logistic regression · Streamlit |
| algorithms-practice | 82 solved problems across 17 topics, an ml_and_data block (ROC-AUC, Welford, reservoir sampling, k-means from scratch) and 10 runnable analytical SQL queries. |
Python · SQLite |
Five minutes: the retail dashboard, then the A/B walkthrough notebook — GitHub renders it with every chart and output already in place.