The Project Lab

Eight end-to-end Power BI builds on real Kaggle datasets, each scoped for an 8-year senior — multi-fact models, advanced DAX, performance, RLS, forecasting. Replicate them, then put the best 3 on your resume & portfolio.

How to run each project 1) Download the dataset from Kaggle (search the name shown). 2) Shape in Power Query, build a star schema. 3) Write the listed DAX. 4) Design the report. 5) Do the senior twist & a stretch goal. 6) Validate vs source, then write a 3-line README: problem → what you built → impact. Practice the interview pitch out loud with the AI tutor.
ExpertE-commerce

1 · Brazilian E-Commerce analytics

Dataset: Olist Brazilian E-Commerce — Kaggle olistbr/brazilian-ecommerce (~100k orders, 9 related tables)

🎯 Business problem

A marketplace wants one view of order economics: revenue, delivery performance, seller quality, and customer satisfaction — across products, sellers, and Brazilian regions.

🧮 Why it’s senior

9 normalized tables force real modeling: orders, order_items, products, sellers, customers, payments, reviews, geolocation, category translation. You must collapse to a clean star, handle a fact at order-item grain, and a separate payments fact — a genuine multi-fact model.

🧱 Model

  • Facts: FactOrderItems (item grain: price, freight), FactPayments (payment grain).
  • Dims: Date, Customer (+ geolocation), Seller (+ geolocation), Product (+ English category via translation table).
  • Two facts share Date & Order dimensions — never relate fact-to-fact.

⚡ Key DAX

On-Time Delivery % =
VAR Delivered = CALCULATE(COUNTROWS(Orders),
   NOT ISBLANK(Orders[delivered_date]))
RETURN DIVIDE(
   CALCULATE(COUNTROWS(Orders),
     Orders[delivered_date] <= Orders[estimated_date]), Delivered)

Avg Delivery Days =
AVERAGEX(Orders,
   DATEDIFF(Orders[purchase_date], Orders[delivered_date], DAY))
multi-fact starorder-item graingeo mapsdelivery SLAreview scores
🚀 Senior twistAdd RLS by seller (a seller sees only their orders) via a dynamic role + USERPRINCIPALNAME() mapping. Add a p95 delivery time measure with PERCENTILEX.INC — averages hide the late tail.
💬 Interview pitch"I modeled 9 Olist tables into a two-fact star (order-items + payments) sharing conformed dimensions, built delivery-SLA and review measures, and secured it with per-seller RLS. The map + p95 lead time exposed which states drove late deliveries."
ExpertRetail / CRM

2 · RFM segmentation & cohort retention

Dataset: Online Retail II (UCI) — Kaggle mashlyn/online-retail-ii-uci (~1M invoice lines, 2009–2011)

🎯 Business problem

Segment customers by value and behavior (RFM), measure retention by acquisition cohort, and estimate customer lifetime value to target marketing.

🧮 Why it’s senior

RFM and cohort retention are pure advanced DAX — virtual tables, dynamic segmentation, and a cohort matrix built without a physical cohort column. This is where mid-level developers stall.

⚡ Key DAX

-- Recency / Frequency / Monetary per customer
Recency Days =
VAR Last = CALCULATE(MAX(Sales[InvoiceDate]))
RETURN DATEDIFF(Last, MAX('Date'[Date]), DAY)

-- dynamic segment using a disconnected band table + TREATAS
Segment Sales =
CALCULATE([Total Sales],
  TREATAS(VALUES(Bands[Segment]), Customer[Segment]))

Build the cohort matrix: rows = acquisition month, columns = months-since-first-purchase, values = retained customers / cohort size.

RFMcohort matrixCLVvirtual tablesdynamic segmentation
🚀 Senior twistBuild a what-if parameter for "discount %" and model its effect on projected CLV. Add a field parameter so users swap R, F, or M on the axis.
💬 Interview pitch"I computed RFM scores in DAX, segmented customers via a disconnected band table with TREATAS, and built a cohort-retention matrix entirely in measures — no physical cohort column. CLV + a what-if discount slider made it actionable for marketing."
HardTelecom

3 · Telco customer churn

Dataset: Telco Customer Churn — Kaggle blastchar/telco-customer-churn (~7k customers, 21 fields)

🎯 Business problem

Find who churns and why. Quantify churn rate, revenue at risk, and the drivers (contract type, tenure, services) so retention can act.

⚡ Key DAX

Churn Rate =
DIVIDE(CALCULATE(COUNTROWS(Customers), Customers[Churn]="Yes"),
        COUNTROWS(Customers))

Revenue at Risk =
CALCULATE(SUM(Customers[MonthlyCharges]), Customers[Churn]="Yes")

📊 Report

Use the Key Influencers and Decomposition Tree AI visuals to surface drivers, tenure cohorts, and a churn-by-contract matrix.

churn KPIsKey Influencersdecomposition treewhat-if
🚀 Senior twistScore churn probability upstream (Python/sklearn or Fabric notebook), load it as a column, and band customers into risk tiers in DAX — show the BI layer consuming an ML output.
💬 Interview pitch"I built churn-rate and revenue-at-risk measures, used Key Influencers to rank drivers (month-to-month contracts dominated), and fed a model-scored churn probability into risk tiers — turning a dashboard into a targeting tool."
HardHR

4 · HR attrition & hierarchy RLS

Dataset: IBM HR Analytics Employee Attrition — Kaggle pavansubhasht/ibm-hr-analytics-attrition-dataset (~1.5k employees)

🎯 Business problem

HR wants attrition rate by department, role, and satisfaction — and each manager should see only their org.

🧮 Why it’s senior

The standout skill here is organizational-hierarchy RLS with PATH / PATHCONTAINS, plus field parameters for flexible analysis.

⚡ Key DAX

HierPath = PATH(Employee[EmpID], Employee[ManagerID])

-- RLS role filter: manager sees their whole subtree
PATHCONTAINS(Employee[HierPath],
  LOOKUPVALUE(Employee[EmpID], Employee[Email], USERPRINCIPALNAME()))

Attrition % =
DIVIDE(CALCULATE(COUNTROWS(Employee), Employee[Attrition]="Yes"),
        COUNTROWS(Employee))
hierarchy RLSPATH/PATHCONTAINSfield parametersattrition KPIs
🚀 Senior twistAdd a field parameter letting HR swap the breakdown dimension (Department / JobRole / Education) on one chart, and a tornado view of attrition drivers.
💬 Interview pitch"I flattened the org with PATH and built dynamic hierarchy RLS so a manager sees their entire reporting tree from one role. Field parameters let HR re-slice attrition without me building ten charts."
ExpertRetail / Finance

5 · Retail sales forecasting & time intelligence

Dataset: Rossmann Store Sales — Kaggle rossmann-store-sales (~1M rows, 1,115 stores) · or Walmart M5

🎯 Business problem

Forecast store sales, compare actual vs prior year & vs forecast, and analyze the impact of promotions, holidays, and store type.

🧮 Why it’s senior

Deep time intelligence, a store hierarchy, and the architecture decisions: incremental refresh design on ~1M rows and calculation groups so you don’t write YTD/PY/YoY for every measure.

⚡ Key DAX

Sales PY = CALCULATE([Sales], SAMEPERIODLASTYEAR('Date'[Date]))
Sales YTD = TOTALYTD([Sales], 'Date'[Date])
Sales 4W MA =
VAR W = DATESINPERIOD('Date'[Date], MAX('Date'[Date]), -28, DAY)
RETURN CALCULATE(AVERAGEX(VALUES('Date'[Date]), [Sales]), W)

Use the line chart’s built-in Analytics → Forecast with confidence bands; compare to actuals.

time intelligencecalculation groupsincremental refreshforecast visualpromo analysis
🚀 Senior twistBuild calculation groups in Tabular Editor (Current / PY / YoY% / YTD) applied to any measure via one slicer. Document the incremental refresh policy (RangeStart/RangeEnd, last 12 months hot).
💬 Interview pitch"I built a full time-intelligence model with calculation groups — one slicer switches Current/PY/YoY across every measure — and designed incremental refresh so only recent partitions reload. Forecast bands + promo flags explained the spikes."
HardSupply chain

6 · Supply chain & logistics SLA

Dataset: DataCo Smart Supply Chain — Kaggle shashwatwork/dataco-smart-supply-chain-for-big-data-analysis (~180k orders)

🎯 Business problem

Track delivery performance, late-shipment risk, profit per order, and where the supply chain leaks margin or time.

⚡ Key DAX

Late Delivery % =
DIVIDE(CALCULATE(COUNTROWS(Orders), Orders[LateRisk]=1),
        COUNTROWS(Orders))

P95 Shipping Days =
PERCENTILEX.INC(Orders,
   DATEDIFF(Orders[OrderDate], Orders[ShipDate], DAY), 0.95)

📊 Report

Geo map of late-shipment hotspots, profit waterfall by category, and an SLA scorecard. Mention you’d use p95/p99, not averages, for SLAs.

SLA scorecardpercentile DAXprofit waterfallgeo hotspots
🚀 Senior twistAdd a bridge table for the many-to-many between orders and shipping carriers/routes, and a drill-through page to a single order’s timeline.
💬 Interview pitch"I built an SLA scorecard on p95 shipping time rather than averages, mapped late-delivery hotspots, and used a profit waterfall to show where margin leaked — the kind of view a logistics lead acts on weekly."
ExpertSports

7 · Formula 1 analytics (relational depth)

Dataset: F1 World Championship 1950–2020 — Kaggle rohanrao/formula-1-world-championship-1950-2020 (13 related tables)

🎯 Business problem

Driver & constructor standings over time, head-to-head comparisons, circuit performance, and pit-stop efficiency.

🧮 Why it’s senior

13 interrelated tables (races, results, drivers, constructors, circuits, lap_times, pit_stops, qualifying) — great for showing relationship design, role-playing handling, and ranking DAX over a big relational set.

⚡ Key DAX

Driver Points = SUM(Results[points])
Driver Rank =
RANKX(ALL(Drivers[name]), [Driver Points], , DESC, Dense)
Avg Pit Stop (s) =
AVERAGEX(PitStops, PitStops[milliseconds]) / 1000
13-table modelRANKXseason trendshead-to-headdrill-through
🚀 Senior twistBuild a dynamic head-to-head page using two disconnected driver slicers + measures with SELECTEDVALUE + TREATAS to compare any two drivers across seasons.
💬 Interview pitch"I modeled 13 F1 tables, built ranking measures with RANKX, and a dynamic head-to-head comparison using disconnected slicers and TREATAS — it showed I can tame a complex relational model and still keep DAX clean."
ExpertPerformance

8 · Big-data performance lab

Dataset: NYC Yellow Taxi (tens of millions of rows) or US Accidents — Kaggle sobhanmoosavi/us-accidents (~7.7M rows)

🎯 Goal

Not a pretty report — a performance engineering project. Take millions of rows and make a model that’s small, fast, and refreshable.

🧮 What you practice

  • Cardinality reduction: split DateTime into Date + Time, drop precise lat/long precision, remove unused columns — measure size in VertiPaq Analyzer.
  • Aggregation tables: pre-summarize by date+zone; verify the engine hits the agg.
  • Incremental refresh: partition by date so only recent data reloads.
  • DAX tuning: read Server Timings in DAX Studio; kill CallbackDataID; SE vs FE.
  • Composite model: import dims + DirectQuery/agg the giant fact.
VertiPaq Analyzeraggregationsincremental refreshDAX Studiocomposite model
🚀 Senior twistDocument a before/after: model size (e.g. 3.1 GB → 780 MB) and a slow visual’s DAX time (e.g. 4.2s → 0.4s). That single slide wins senior interviews.
💬 Interview pitch"I took a 7.7M-row dataset, cut the model ~75% through cardinality work and encoding, added aggregation tables and incremental refresh, and used DAX Studio server timings to drop a key visual from 4s to under half a second."

100+ curated projects

A browsable bank of 100 Power BI / data projects across every domain — each with a real Kaggle dataset and a one-look approach (the answer). Filter by domain or level, search a skill, click approach to reveal how to build it.

Finish

Delivery checklist (every project)

  • ☐ Clean star schema, dedicated Date table marked as date table.
  • ☐ Measures named & organized in display folders; no stray calculated columns.
  • ☐ Numbers validated against a source SQL/COUNT.
  • ☐ At least one senior twist (RLS / calc groups / aggregations / what-if).
  • ☐ Report is focused: clear titles, consistent color, mobile layout.
  • ☐ README: problem → data → what you built → impact (with numbers).
  • ☐ Published to a workspace; refresh works; .pbip committed to GitHub.
  • ☐ You can explain every layer and pitch it in 30 seconds.
Portfolio tipPick your 3 strongest (e.g. Olist multi-fact, RFM/cohort, big-data perf lab) for the resume — they show modeling, advanced DAX, and performance, which is exactly the senior trifecta interviewers probe.