home/data projects/supermarket pricing
Data Story — 03

Neither supermarket is cheaper. The specials are.

I scraped 1,000 staple products from Woolworths and Coles every day for six months. The “cheaper” store flips almost weekly — and chasing the wrong one quietly costs a household real money.

Role
Solo analysis
Stack
Python · Postgres · dbt
Source
Daily price scrape
Window
6 months · 1,000 SKUs
01 Overview

“Woolies is cheaper.” “No, Coles is.” Everyone has a confident answer and none of them have the receipts. I wanted the receipts.

So I built a scraper that priced the same basket of 1,000 staples at both chains, every single day, for six months. The goal: stop arguing from vibes and actually watch how the two giants price against each other over time.

02 The data

Roughly 2,000 price points a day — every product at both stores — landing in PostgreSQL, cleaned and modelled with dbt into a tidy daily basket. Matching products across two different catalogues was the hard part; pack sizes and naming never line up.

0
Annual gap between best- and worst-case basket choices.
0
Of weeks, the cheaper store flipped from the week before.
0
Staple products tracked daily across both chains.
03 Approach

Once the baskets were comparable, the analysis wrote itself: plot both stores' basket cost over time, count who won each week, and break the gap down by category to find where the real differences hide. Spoiler — it's not where loyalty cards point you.

04 Key insights

Insight one: the lines cross constantly. There is no permanently cheaper store — only a cheaper week.

Weekly basket cost — same 1,000 staples
AUD · 6 months
$150$138wk 1wk 26
WoolworthsColes
Read: the basket cost is near-identical on average — the two lines trade the lead almost every fortnight.
Avg basket · Woolworths
$142.10
Avg basket · Coles
$142.80

“Loyalty to one chain is the most expensive habit in the trolley. The savings live in the specials, not the sign.”

Insight two: the discounts aren't spread evenly. Pantry and snacks swing hard; fresh food barely moves.

Average discount depth when on special, by category
% off shelf price
Pantry & dry32%
Snacks28%
Frozen25%
Household22%
Fresh produce14%
Meat11%
Read: stock up on pantry and snacks when they dip — that's where the real discounting happens. Fresh food rarely rewards waiting.
05 What's next
  1. 01Add Aldi to the comparison — the wildcard that could break the two-horse race entirely.
  2. 02Build a basket-builder that tells you which store is cheaper for your specific shopping list this week.
  3. 03Detect “fake” specials — items marked down from an inflated shelf price they never really held.
06 Take a look