Introduction

The number of thefts recorded in the City of Wyndham in the year ending June 2026 was 10,897, compared with 5,149 in 2017, an increase of 112% (Crime Statistics Agency, 2026). During the same period, Wyndham’s population grew by an estimated 51%, which accounts for part of the increase, but not all of it.

This report investigates which types of theft changed, where in Wyndham theft was recorded, and how Wyndham’s theft rate compares with other parts of Victoria. All charts are interactive: hover for more information, click legend entries to show or hide items, and drag to zoom.

# Data: Crime Statistics Agency, Recorded offences by LGA, year ending June 2026
path <- "Data_Tables_LGA_Recorded_Offences_Year_Ending_June_2026.xlsx"

# Table 01: total offences and rate per 100,000 population, by LGA
t1 <- read_excel(path, sheet = "Table 01") |>
  clean_names() |>
  mutate(local_government_area = str_trim(local_government_area))

# Table 02: offences by type and LGA (theft only, all LGAs)
theft_all <- read_excel(path, sheet = "Table 02") |>
  clean_names() |>
  mutate(local_government_area = str_trim(local_government_area)) |>
  filter(offence_subdivision == "B40 Theft")

# Table 03: offences by type and suburb (Wyndham theft only).
wyn_suburb_theft <- read_excel(path, sheet = "Table 03") |>
  clean_names() |>
  mutate(local_government_area = str_trim(local_government_area)) |>
  filter(local_government_area == "Wyndham",
         offence_subdivision == "B40 Theft",
         offence_subgroup != "B46 Fare evasion")
# Wyndham theft by type and year
theft_by_year <- theft_all |>
  filter(local_government_area == "Wyndham",
         offence_subgroup != "B46 Fare evasion") |>
  group_by(year, offence_subgroup) |>
  summarise(offence_count = sum(offence_count, na.rm = TRUE), .groups = "drop") |>
  mutate(kind = str_remove(offence_subgroup, "^B\\d+ "))

# Wyndham theft by suburb, latest year, ranked
suburb_theft <- wyn_suburb_theft |>
  filter(year == 2026) |>
  group_by(suburb_town_name) |>
  summarise(offence_count = sum(offence_count, na.rm = TRUE), .groups = "drop") |>
  arrange(desc(offence_count))

# Population implied by Table 01 (population = count / rate x 100,000)
pop <- t1 |>
  filter(local_government_area != "Total") |>
  mutate(pop = offence_count / rate_per_100_000_population * 100000) |>
  select(year, local_government_area, pop)

# Theft rate per 100,000 people, every LGA
theft_rate <- theft_all |>
  group_by(year, local_government_area) |>
  summarise(theft = sum(offence_count), .groups = "drop") |>
  inner_join(pop, by = c("year", "local_government_area")) |>
  mutate(rate = theft / pop * 100000,
         is_wyn = local_government_area == "Wyndham")

1. Theft from vehicles peaked in 2025, while shop theft kept climbing

Recorded theft offences in Wyndham by type, years ending June 2017–2026

Not all types of theft changed at the same pace. Stealing from a motor vehicle decreased to 1,195 offences in 2019, rose to 3,923 in 2025, and then fell to 3,101 in 2026. Shop theft was still increasing in 2026, reaching 1,875 offences, which is more than three and a half times the 527 recorded in 2022.

p1 <- ggplot(theft_by_year,
             aes(year, offence_count, colour = kind, group = kind,
                 text = paste0(kind, "<br>", year, ": ", comma(offence_count)))) +
  geom_line(linewidth = 1) +
  geom_point(size = 1.8) +
  scale_colour_viridis_d(end = 0.9) +
  scale_x_continuous(breaks = 2017:2026) +
  scale_y_continuous(labels = comma) +
  labs(x = NULL, y = "Recorded offences", colour = NULL) +
  theme_minimal(base_size = 13) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

ggplotly(p1, tooltip = "text")

Source: Crime Statistics Agency (2026).

Chart description: This line chart shows the number of theft offences recorded each year in Wyndham, by type, from 2017 to 2026. Other theft and stealing from a motor vehicle are the two largest categories. Stealing from a motor vehicle reaches its highest number of 3,923 in 2025 and then falls to 3,101 in 2026. Shop theft rises from 527 in 2022 to 1,875 in 2026.

2. Five suburbs account for nearly four in five thefts, each with a different pattern

Recorded theft offences by suburb and type, year ending June 2026 (counts, not rates)

In 2026, Tarneit, Hoppers Crossing, Werribee, Point Cook and Truganina had 8,478 of the 10,897 thefts in Wyndham (78%). Their patterns are different. About a third of thefts in Hoppers Crossing (34%) and Point Cook (31%) were from retail stores, compared with only about 4% in Truganina, where thefts of and from motor vehicles made up around three in five cases. These are counts, not rates, so larger suburbs will usually record more offences.

sub2026 <- wyn_suburb_theft |>
  filter(year == 2026) |>
  mutate(kind = str_remove(offence_subgroup, "^B\\d+ ")) |>
  group_by(suburb_town_name, kind) |>
  summarise(n = sum(offence_count), .groups = "drop") |>
  mutate(suburb = fct_reorder(suburb_town_name, n, .fun = sum))

p2 <- ggplot(sub2026,
             aes(n, suburb, fill = kind,
                 text = paste0(suburb, "<br>", kind, ": ", comma(n)))) +
  geom_col() +
  scale_fill_viridis_d(end = 0.9) +
  scale_x_continuous(labels = comma) +
  labs(x = "Recorded offences", y = NULL, fill = NULL) +
  theme_minimal(base_size = 13)

ggplotly(p2, tooltip = "text")

Source: Crime Statistics Agency (2026).

Chart description: This horizontal stacked bar chart shows 2026 theft offences in Wyndham’s 17 suburbs, with each bar split by type of theft. Tarneit has the most (2,316), followed by Hoppers Crossing (2,025), Werribee (1,824), Point Cook (1,186) and Truganina (1,127). Six suburbs have fewer than 100 offences.

3. Tarneit went from fourth to first, with thefts rising nearly four-fold

Top ten suburbs by theft in 2026 (counts, not rates)

Tarneit’s increase is the most pronounced change over time. In 2017, Hoppers Crossing had 1,286 thefts and Werribee had 1,254, while Tarneit ranked fourth with 586. In 2026, Tarneit led with 2,316.

top10 <- suburb_theft |> slice_head(n = 10) |> pull(suburb_town_name)

heat <- wyn_suburb_theft |>
  filter(suburb_town_name %in% top10) |>
  group_by(suburb_town_name, year) |>
  summarise(n = sum(offence_count), .groups = "drop") |>
  complete(suburb_town_name, year = 2017:2026, fill = list(n = 0)) |>
  mutate(suburb = factor(suburb_town_name, levels = rev(top10)))

p3 <- ggplot(heat, aes(factor(year), suburb, fill = n,
                       text = paste0(suburb, ", ", year, ": ", comma(n)))) +
  geom_tile(colour = "white") +
  scale_fill_viridis_c(labels = comma) +
  labs(x = NULL, y = NULL, fill = "Offences") +
  theme_minimal(base_size = 13)

ggplotly(p3, tooltip = "text")

Source: Crime Statistics Agency (2026). Suburb-years with no record are shown as zero.

Chart description: This heatmap shows the number of theft offences in Wyndham’s ten suburbs with the most theft in 2026, for each year from 2017 to 2026. Colours range from dark purple (few offences) to yellow (many offences). Tarneit is a darker row in 2017 (586 offences) and the brightest row in 2026 (2,316 offences).

4. Per person, Wyndham’s theft rate rose 40%, faster than most of Victoria

Theft offences per 100,000 people, 2017–2026. Wyndham in purple, each grey line is another Victorian LGA

Is this just a bigger Wyndham? In part. The estimated population of Wyndham grew by around 51% from 2017 to 2026, the second-highest growth of the 79 local government areas in this data. However, Wyndham’s theft rate also increased by around 40% (from approximately 2,130 to 2,990 thefts per 100,000 people), whereas the typical (median) LGA increased by only about 15%. As a result, Wyndham moved from 37th to 23rd highest theft rate among the 79 LGAs. The 2026 rate uses estimated population figures, so it should be read with some care.

p4 <- ggplot(theft_rate,
             aes(year, rate, group = local_government_area,
                 text = paste0(local_government_area, ", ", year, ": ",
                               comma(round(rate)), " per 100,000"))) +
  geom_line(data = filter(theft_rate, !is_wyn),
            colour = "grey70", linewidth = 0.4) +
  geom_line(data = filter(theft_rate, is_wyn),
            colour = "#440154", linewidth = 1.5) +
  geom_text(data = filter(theft_rate, is_wyn, year == 2026),
            aes(x = year, y = rate, label = "Wyndham"),
            inherit.aes = FALSE, hjust = -0.1,
            colour = "#440154", fontface = "bold") +
  scale_x_continuous(breaks = seq(2017, 2026, by = 3),
                     expand = expansion(mult = c(0.02, 0.15))) +
  scale_y_continuous(labels = comma) +
  labs(x = NULL, y = "Offences per 100,000 people") +
  theme_minimal(base_size = 13)

ggplotly(p4, tooltip = "text") 

Source: Crime Statistics Agency (2026). Population implied by CSA rates; the latest year is estimated. This chart includes all theft subgroups so every LGA is compared on the same basis.

Chart description: This line chart shows theft offences per 100,000 people for all 79 Victorian LGAs from 2017 to 2026. Wyndham is the thick purple line and the other LGAs are thin grey lines. Wyndham begins near the middle of the group at about 2,130 in 2017, rises to about 3,240 in 2025, and falls back to about 2,990 in 2026.

5. Slide through the six theft types to see which suburbs drove each

Recorded offences in the eight suburbs with most theft in 2026 (counts, not rates)

Use the slider at the bottom of the chart (or press Play) to change the type of theft. Suburbs have different mixes of theft types, so the lines take on different shapes as the type changes.

top8 <- suburb_theft |> slice_head(n = 8) |> pull(suburb_town_name)

sub_kind <- wyn_suburb_theft |>
  filter(suburb_town_name %in% top8) |>
  mutate(kind = str_remove(offence_subgroup, "^B\\d+ ")) |>
  group_by(suburb_town_name, kind, year) |>
  summarise(n = sum(offence_count), .groups = "drop") |>
  complete(suburb_town_name, kind, year = 2017:2026, fill = list(n = 0))

p5 <- ggplot(sub_kind,
             aes(year, n, colour = suburb_town_name,
                 group = suburb_town_name, frame = kind,
                 text = paste0(suburb_town_name, ", ", year, ": ", comma(n)))) +
  geom_line(linewidth = 1) +
  geom_point(size = 1.8) +
  scale_colour_viridis_d(end = 0.9) +
  scale_x_continuous(breaks = seq(2017, 2026, by = 3)) +
  scale_y_continuous(labels = comma) +
  labs(x = NULL, y = "Recorded offences", colour = NULL) +
  theme_minimal(base_size = 13)

ggplotly(p5, tooltip = "text") |>
  animation_slider(currentvalue = list(prefix = "Theft type: "))

Source: Crime Statistics Agency (2026). Counts, not population-adjusted rates.

Chart description: This line chart has a slider for the type of theft. For the selected type, it shows offences recorded in each year from 2017 to 2026 in the eight suburbs of Wyndham with the most theft in 2026 (Tarneit, Hoppers Crossing, Werribee, Point Cook, Truganina, Laverton North, Wyndham Vale and Manor Lakes). The vertical axis stays the same so that theft types can be compared.

Conclusion

The number of thefts recorded in Wyndham has more than doubled since 2017. Population growth explains part of this increase, but not all of it, because the rate of theft per person also grew faster than in most of Victoria. The increase was not even: it differed by type of theft and was concentrated in a few suburbs.

Data notes

  • Data are recorded offences for years ending 30 June. The 2026 data cover July 2025 to June 2026.
  • Suburb data are counts, not rates, because the workbook does not include suburb populations.
  • Rates are based on populations worked out from the CSA’s published rates (count ÷ rate × 100,000). The CSA states that the latest year uses state government population estimates.
  • Fare evasion (7 Wyndham records in ten years) has been left out of the Wyndham charts. All theft types are included in Chart 4 so that every LGA is compared on the same basis.
  • Suburb-years without a record are shown as zero in Charts 3 and 5.
  • Recorded crime reflects policing and reporting activity as well as the amount of crime that actually occurs.

Acknowledgements

I used Claude (Anthropic, 2026), a generative AI tool, to help with R code understanding, debugging, exploring the data, structuring this report, and drafting and editing some of the written text. I used Grammarly (Grammarly, 2026) to check and improve the grammar and wording of my writing. I chose the topic of theft in Wyndham and reviewed and edited the final report. The data come from the Crime Statistics Agency (2026).

References

Crime Statistics Agency. (2026). Data tables LGA recorded offences year ending June 2026 [Data set]. https://www.crimestatistics.vic.gov.au/crime-statistics/latest-victorian-crime-data/download-data