Assignment details

Editor topic: Topic 2 — Social and economic issues
Article format: Five charts
Working publication: The Conversation
Audience: Students, young workers, renters, educators, families and policy-minded general readers.
Central question: Australia is still called “the lucky country”, but does the data show a widening gap between essential costs and young people’s ability to keep up?

Story pitch

Australia’s cost-of-living debate often appears as one headline number: inflation. As a student living in Australia, I wanted to look beyond the general phrase “cost of living crisis” and see which costs are actually moving faster than wages. This story focuses on young Australians because rent, transport, food and education costs affect everyday decisions such as where to live, how much to work, and whether study feels financially manageable.

This five-chart story uses public Australian Bureau of Statistics releases to show why Australia can feel less “lucky” for young people trying to study, work, rent and plan ahead. The visual story begins with the return of inflation pressure, then breaks that pressure down by category, city, household type and wage growth. The strongest finding is not simply that prices rose. It is that several unavoidable costs — especially housing, transport and education — rose faster than the national wage benchmark, while living-cost pressure differs across household groups and places.

The story is designed for The Conversation because it connects economic indicators to everyday decisions: where to live, how much paid work students need, whether moving city helps, and whether wage growth is enough to restore confidence. The pitch is not that every young person experiences the same struggle. It is that national averages can hide the squeeze placed on people with less savings, lower housing security and fewer years of wage progression behind them.

Data, reliability and ethics notes

This story uses publicly available Australian Bureau of Statistics data. The visualisations are designed to show broad cost-of-living patterns rather than individual experiences. The charts avoid personal data, use clear labels, and include source notes to reduce the risk of misleading interpretation. Some values are rounded for readability, so the visuals should be interpreted as an evidence-based public story rather than a precise financial calculator.A limitation of this story is that national ABS data cannot show every student’s personal situation. For example, a student living with family may feel cost pressure differently from a student renting near campus. However, the data is still useful because it shows the broader economic conditions shaping these everyday experiences.

source_register <- tribble(
  ~source, ~publisher, ~reference_period, ~used_for,
  "Consumer Price Index, Australia", "Australian Bureau of Statistics", "April 2026", "CPI category, city and essential-cost comparisons",
  "Wage Price Index, Australia", "Australian Bureau of Statistics", "March quarter 2026", "Wage trend, sector benchmark and income-growth comparison",
  "Selected Living Cost Indexes, Australia", "Australian Bureau of Statistics", "March quarter 2026", "Household-type living-cost comparison"
)

kable(source_register, caption = "Source register: public data used in this story")
Source register: public data used in this story
source publisher reference_period used_for
Consumer Price Index, Australia Australian Bureau of Statistics April 2026 CPI category, city and essential-cost comparisons
Wage Price Index, Australia Australian Bureau of Statistics March quarter 2026 Wage trend, sector benchmark and income-growth comparison
Selected Living Cost Indexes, Australia Australian Bureau of Statistics March quarter 2026 Household-type living-cost comparison

How to interact with the charts

Hover over a cell, point, line or bar to read exact values and context. Use the legend to isolate groups where available. Each chart is scaled to approximately 600px wide for the Five Charts publication format.

Chart 1 — The pressure returned, but not evenly

cpi_groups <- tribble(
  ~category, ~Nov_25, ~Dec_25, ~Jan_26, ~Feb_26, ~Mar_26, ~Apr_26,
  "All groups CPI", 3.4, 3.8, 3.8, 3.7, 4.6, 4.2,
  "Food & non-alcoholic beverages", 3.3, 3.4, 3.1, 3.1, 3.1, 2.8,
  "Alcohol & tobacco", 4.3, 4.9, 5.0, 4.3, 4.4, 4.3,
  "Clothing & footwear", 5.1, 3.4, 5.6, 5.0, 7.1, 5.9,
  "Housing", 5.2, 5.5, 6.8, 7.2, 6.5, 6.3,
  "Furnishings, household equipment & services", 1.3, 2.0, 1.4, 1.3, 1.4, 1.2,
  "Health", 3.6, 3.6, 3.2, 3.2, 3.0, 4.0,
  "Transport", 2.7, 1.6, 1.1, -0.2, 8.9, 6.6,
  "Communications", 1.3, 1.1, 1.4, 0.8, 1.4, 1.5,
  "Recreation & culture", 2.0, 4.4, 3.7, 4.1, 2.8, 2.5,
  "Education", 5.4, 5.4, 5.4, 4.8, 4.8, 4.8,
  "Insurance & financial services", 2.5, 2.5, 2.4, 2.4, 2.8, 3.0
) %>%
  pivot_longer(-category, names_to = "month", values_to = "annual_change") %>%
  mutate(
    month = factor(str_replace(month, "_", "-"), levels = c("Nov-25", "Dec-25", "Jan-26", "Feb-26", "Mar-26", "Apr-26")),
    cost_role = case_when(
      category %in% c("Housing", "Transport", "Food & non-alcoholic beverages", "Education", "Health") ~ "Everyday essential",
      category == "All groups CPI" ~ "Overall benchmark",
      TRUE ~ "Other category"
    )
  )

p1 <- ggplot(cpi_groups, aes(
  x = month, y = fct_rev(category), fill = annual_change,
  text = paste0("Category: ", category,
                "<br>Month: ", month,
                "<br>Annual CPI movement: ", annual_change, "%",
                "<br>Role in story: ", cost_role)
)) +
  geom_tile(colour = "white", linewidth = 0.4) +
  scale_fill_gradient2(low = "#2C7BB6", mid = "#FFFFBF", high = "#D7191C", midpoint = 3.3) +
  labs(
    title = "Inflation returned unevenly across the things people buy",
    subtitle = "Housing, education and transport stayed above the national wage benchmark in April 2026.",
    x = NULL, y = NULL, fill = "Annual change (%)",
    caption = "Source: ABS Consumer Price Index, Australia, April 2026. Benchmark midpoint uses national WPI growth of 3.3%."
  ) +
  plot_theme +
  theme(axis.text.y = element_text(size = 9))

make_interactive(p1, height = 520)

Narrative point: The opening chart avoids a single-number inflation story. It shows readers that some categories cooled while essentials such as housing and education remained persistently high. This immediately creates the human question: which costs can young people actually avoid?

Chart 2 — Place changes the pressure

city_cpi <- tribble(
  ~category, ~Sydney, ~Melbourne, ~Brisbane, ~Adelaide, ~Perth, ~Hobart, ~Darwin, ~Canberra, ~Weighted_average,
  "All groups", 4.2, 3.9, 4.6, 4.6, 3.9, 5.0, 4.2, 4.0, 4.2,
  "Food & non-alcoholic beverages", 2.9, 2.8, 2.6, 2.3, 2.7, 4.1, 2.9, 2.5, 2.8,
  "Alcohol & tobacco", 3.5, 4.3, 4.4, 5.3, 4.8, 7.5, 4.0, 4.9, 4.3,
  "Clothing & footwear", 6.6, 5.8, 6.5, 4.9, 4.6, 4.4, 3.3, 4.5, 5.9,
  "Housing", 6.4, 6.0, 6.6, 7.0, 5.5, 7.9, 5.6, 5.2, 6.3,
  "Furnishings & household services", 1.0, 1.1, 1.9, 1.4, 1.2, 1.8, 1.2, 2.1, 1.2,
  "Health", 4.4, 3.9, 3.6, 4.1, 3.5, 3.4, 2.7, 3.6, 4.0,
  "Transport", 6.9, 3.5, 9.3, 8.3, 8.8, 7.9, 9.8, 7.7, 6.6,
  "Communication", 1.6, 1.5, 1.4, 1.5, 1.4, 1.5, 1.6, 1.9, 1.5,
  "Recreation & culture", 2.0, 3.2, 2.9, 2.9, 1.6, 2.3, 3.1, 1.9, 2.5,
  "Education", 4.7, 4.8, 4.8, 4.2, 5.3, 3.8, 3.4, 5.9, 4.8,
  "Insurance & financial services", 3.3, 3.6, 2.1, 4.1, 0.7, 4.4, 3.3, 1.9, 3.0
) %>%
  pivot_longer(-category, names_to = "city", values_to = "annual_change") %>%
  filter(city != "Weighted_average") %>%
  mutate(
    city = str_replace(city, "_", " "),
    essential = if_else(category %in% c("Housing", "Transport", "Food & non-alcoholic beverages", "Education", "Health"), "Everyday essential", "Other category")
  )

p2 <- ggplot(city_cpi, aes(
  x = city, y = fct_rev(category), fill = annual_change,
  text = paste0("City: ", city,
                "<br>Category: ", category,
                "<br>Annual movement: ", annual_change, "%",
                "<br>Category type: ", essential)
)) +
  geom_tile(colour = "white", linewidth = 0.35) +
  scale_fill_gradient2(low = "#2C7BB6", mid = "#FFFFBF", high = "#D7191C", midpoint = 4.2) +
  labs(
    title = "The cost-of-living story is also a postcode story",
    subtitle = "Transport and housing pressure varied sharply across capital cities in April 2026.",
    x = NULL, y = NULL, fill = "Annual change (%)",
    caption = "Source: ABS Consumer Price Index, Australia, April 2026."
  ) +
  plot_theme +
  theme(axis.text.x = element_text(angle = 35, hjust = 1), axis.text.y = element_text(size = 9))

make_interactive(p2, height = 540)

Narrative point: This chart adds place-based nuance. A young person in Melbourne, Brisbane or Hobart may face different combinations of rent, food and transport pressure. That matters because advice such as “move somewhere cheaper” is not simple when costs shift differently across cities.

Chart 3 — Wages recovered, but latest CPI still sits higher

wpi_trend <- tribble(
  ~quarter, ~annual_wpi,
  "Mar-19", 2.3, "Jun-19", 2.3, "Sep-19", 2.2, "Dec-19", 2.2,
  "Mar-20", 2.2, "Jun-20", 1.8, "Sep-20", 1.4, "Dec-20", 1.3,
  "Mar-21", 1.5, "Jun-21", 1.8, "Sep-21", 2.2, "Dec-21", 2.4,
  "Mar-22", 2.4, "Jun-22", 2.7, "Sep-22", 3.1, "Dec-22", 3.3,
  "Mar-23", 3.7, "Jun-23", 3.6, "Sep-23", 4.1, "Dec-23", 4.3,
  "Mar-24", 4.0, "Jun-24", 4.1, "Sep-24", 3.5, "Dec-24", 3.2,
  "Mar-25", 3.4, "Jun-25", 3.4, "Sep-25", 3.3, "Dec-25", 3.4,
  "Mar-26", 3.3
) %>%
  mutate(
    quarter = factor(quarter, levels = quarter),
    cpi_benchmark = 4.2,
    wage_gap = annual_wpi - cpi_benchmark
  )

p3 <- ggplot(wpi_trend, aes(
  x = quarter,
  y = annual_wpi,
  group = 1,
  text = paste0(
    "Quarter: ", quarter,
    "<br>Annual wage growth: ", annual_wpi, "%",
    "<br>April 2026 CPI benchmark: 4.2%",
    "<br>Gap against CPI benchmark: ", round(wage_gap, 1), " percentage points"
  )
)) +
  geom_hline(
    yintercept = 4.2,
    linetype = "dashed",
    colour = tc_grey,
    linewidth = 0.8
  ) +
  geom_line(colour = tc_blue, linewidth = 1.1) +
  geom_point(colour = tc_blue, size = 2) +
  annotate(
    "text",
    x = 21,
    y = 4.35,
    label = "April 2026 CPI = 4.2%",
    colour = tc_grey,
    size = 3
  ) +
  labs(
    title = "Wages recovered, but the latest CPI benchmark still sits higher",
    subtitle = "Annual wage growth reached 3.3% in March quarter 2026, below April CPI of 4.2%.",
    x = NULL,
    y = "Annual wage growth (%)",
    caption = "Sources: ABS Wage Price Index, March 2026; ABS Consumer Price Index, April 2026."
  ) +
  plot_theme +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

make_interactive(p3, height = 430)

Narrative point: This chart shows that wage growth has recovered since the pandemic period, but the latest national CPI benchmark still sits above annual wage growth. For young Australians, this helps explain why a pay rise can still feel insufficient when rent, transport, education and other essential costs are moving faster.

Chart 4 — Living-cost pressure depends on income source

lci_households <- tribble(
  ~quarter, ~Employee, ~Age_pensioner, ~Other_government_transfer, ~Pensioner_beneficiary, ~Self_funded_retiree,
  "Mar-22", 4.9, 4.4, 4.6, 4.5, 4.2,
  "Jun-22", 6.6, 5.8, 6.2, 6.0, 5.3,
  "Sep-22", 7.1, 6.5, 6.9, 6.7, 6.0,
  "Dec-22", 9.3, 7.8, 8.1, 8.0, 7.1,
  "Mar-23", 9.6, 7.9, 8.3, 8.1, 7.3,
  "Jun-23", 9.0, 6.7, 7.2, 7.0, 6.3,
  "Sep-23", 6.9, 5.2, 5.8, 5.6, 4.9,
  "Dec-23", 6.9, 4.8, 5.3, 5.1, 4.5,
  "Mar-24", 6.5, 4.0, 4.6, 4.4, 3.8,
  "Jun-24", 6.2, 4.2, 4.8, 4.6, 4.0,
  "Sep-24", 4.7, 3.4, 4.1, 3.8, 3.2,
  "Dec-24", 4.0, 3.0, 3.6, 3.3, 2.9,
  "Mar-25", 3.4, 2.8, 3.2, 3.0, 2.6,
  "Jun-25", 3.2, 2.9, 3.3, 3.1, 2.7,
  "Sep-25", 3.1, 3.0, 3.4, 3.2, 2.8,
  "Dec-25", 3.3, 3.1, 3.5, 3.3, 3.0,
  "Mar-26", 3.5, 3.2, 3.7, 3.4, 3.1
) %>%
  pivot_longer(
    cols = -quarter,
    names_to = "household_type",
    values_to = "annual_lci"
  ) %>%
  filter(household_type %in% c(
    "Employee",
    "Other_government_transfer",
    "Pensioner_beneficiary"
  )) %>%
  mutate(
    household_type = recode(
      household_type,
      "Employee" = "Employee households",
      "Other_government_transfer" = "Other government-transfer households",
      "Pensioner_beneficiary" = "Pensioner and beneficiary households"
    ),
    quarter = factor(quarter, levels = unique(quarter))
  )

p4 <- ggplot(lci_households, aes(
  x = quarter,
  y = annual_lci,
  colour = household_type,
  group = household_type,
  text = paste0(
    "Quarter: ", quarter,
    "<br>Household type: ", household_type,
    "<br>Annual living cost change: ", annual_lci, "%"
  )
)) +
  geom_line(linewidth = 1.1) +
  geom_point(size = 2) +
  labs(
    title = "Living-cost pressure depends on income source",
    subtitle = "Employee households improved by March 2026, while government-payment households faced stronger annual pressure.",
    x = NULL,
    y = "Annual living cost change (%)",
    colour = NULL,
    caption = "Source: ABS Selected Living Cost Indexes, March quarter 2026."
  ) +
  plot_theme +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

make_interactive(p4, height = 430)

Narrative point: This chart keeps the story social rather than purely economic. Young Australians are not only students or workers; many live in households supported by wages, family income or government payments. The chart shows why cost-of-living pressure is uneven and why a national average can hide very different household experiences.

Chart 5 — The final gap: essential costs versus wages

latest_cpi <- cpi_groups %>%
  filter(
    month == "Apr-26",
    category %in% c(
      "All groups CPI",
      "Housing",
      "Transport",
      "Food & non-alcoholic beverages",
      "Education",
      "Health"
    )
  ) %>%
  transmute(
    indicator = category,
    annual_change,
    benchmark_wpi = 3.3,
    gap_vs_wpi = annual_change - benchmark_wpi,
    gap_direction = if_else(
      gap_vs_wpi >= 0,
      "Above wage growth",
      "Below wage growth"
    )
  ) %>%
  mutate(
    indicator = fct_reorder(indicator, gap_vs_wpi)
  )

p5 <- ggplot(latest_cpi, aes(
  x = indicator,
  y = gap_vs_wpi,
  fill = gap_direction,
  text = paste0(
    "Indicator: ", indicator,
    "<br>Annual price movement: ", annual_change, "%",
    "<br>National WPI benchmark: ", benchmark_wpi, "%",
    "<br>Gap versus wages: ", round(gap_vs_wpi, 1), " percentage points",
    "<br>Interpretation: ", gap_direction
  )
)) +
  geom_hline(
    yintercept = 0,
    colour = "#333333",
    linewidth = 0.8
  ) +
  geom_col(width = 0.65) +
  coord_flip() +
  scale_fill_manual(
    values = c(
      "Above wage growth" = tc_blue,
      "Below wage growth" = tc_grey
    ),
    guide = "none"
  ) +
  labs(
    title = "The final gap: essentials are still outrunning wages",
    subtitle = "Bars above zero rose faster than the 3.3% Wage Price Index benchmark; the grey bar rose more slowly.",
    x = NULL,
    y = "Gap vs wage growth (percentage points)",
    caption = "Sources: ABS Consumer Price Index, April 2026; ABS Wage Price Index, March quarter 2026."
  ) +
  plot_theme

ggplotly(p5, tooltip = "text") %>%
  layout(
    height = 470,
    margin = list(l = 140, r = 30, t = 80, b = 80),
    xaxis = list(automargin = TRUE),
    yaxis = list(automargin = TRUE)
  )

Narrative point: This final chart turns the story into a clear conclusion. Wage growth is used as the zero line, so every bar above zero represents a cost category rising faster than wages. Housing, transport, education and health sit above the wage benchmark, showing why young Australians can feel worse off even when wages are technically increasing. Food is lower than wages in this snapshot, but it remains an everyday cost that interacts with rent, transport and education pressure.

Conclusion

These five charts show why cost of living is more than a temporary economic complaint. Inflation is uneven across categories, cities and household types. Wages are rising, but not fast enough to neutralise several essential-cost pressures. For young Australians, that gap can shape study load, working hours, housing security and long-term confidence. The “lucky country” story still exists, but the luck is unevenly distributed.

Acknowledgements

I used ChatGPT to help brainstorm the story structure, improve wording, and troubleshoot R/Plotly layout issues. I reviewed and edited the final narrative, code, visualisations and references before submission.

References

Australian Bureau of Statistics. (2026). Consumer Price Index, Australia, April 2026. https://www.abs.gov.au/statistics/economy/price-indexes-and-inflation/consumer-price-index-australia/latest-release

Australian Bureau of Statistics. (2026). Selected Living Cost Indexes, Australia, March 2026. https://www.abs.gov.au/statistics/economy/price-indexes-and-inflation/selected-living-cost-indexes-australia/latest-release

Australian Bureau of Statistics. (2026). Wage Price Index, Australia, March 2026. https://www.abs.gov.au/statistics/economy/price-indexes-and-inflation/wage-price-index-australia/latest-release