Wyndham ranks 4th among Victorian councils for the number of recorded offences, but 54th when those offences are measured relative to its resident population. Both rankings describe the same council in the same year.
So, what does a crime ranking actually tell us?
I explore this question through three comparisons: offence counts and rates, different offence categories, and changes over time. The report uses Crime Statistics Agency (CSA, 2026) data for 79 Victorian council areas, covering annual periods ending in June from 2017 to 2026.
Wyndham recorded 23,923 offences in the year ending June 2026. That placed it 4th by count. Its rate was approximately 6,554 offences per 100,000 residents, placing it 54th by rate.
Northern Grampians shows the reverse pattern. It ranked 55th by count, but 6th by rate.
A count tells us how many offences were recorded. A rate puts that count in relation to the resident population. The choice of measure changes how these two councils compare with the rest of Victoria.
Try it: Hover over a council to see its count, rate and rankings. Points on the dashed line would have the same rank under both measures. Rank 1 means the highest count or rate.
Source: Crime Statistics Agency (2026), Table 01. The dashed line marks equal ranks. Recorded offence rankings do not measure individual safety. Ranks compare 79 Victorian councils, with equal values receiving the same rank. A large gap between ranks does not necessarily mean a large difference in offence rates.
Wyndham’s overall rate rank is 54th, but its position changes across offence categories. It ranks 30th for property and deception offences and 64th for justice procedures offences.
Northern Grampians ranks 6th overall, while its ranks across the five categories shown range from 3rd to 14th.
The overall ranking brings these different offence categories together. Looking at them separately shows details that the combined ranking leaves out.
Try it: Choose a council from the dropdown. The points show its rank for each offence category, while the dashed line marks its overall rate rank. Hover over a point to see its count and rate.
Source: Crime Statistics Agency (2026), Tables 01 and 02. Category ranks use aggregated LGA rates from Table 02. Overall ranks use published rates from Table 01. The five categories shown have records for all 79 councils. “Other offences” is excluded because only 74 councils have records in that division. The dashed line marks the selected council’s overall rate rank. Detailed sums can differ slightly from published totals. These rankings do not measure offence severity.
Wyndham ranked 55th by rate in 2017 and 54th in 2026. Its position looks almost unchanged, but its recorded offence rate fluctuated during that period.
The rate was 7.7% higher in 2026 than in 2017, despite a 7.6% fall between 2025 and 2026.
Northern Grampians followed a different pattern. Its rate rose 39.0% between 2017 and 2026, including a 19.8% increase in the latest year. Its rank moved from 12th to 6th.
Rank tells us where a council sits relative to other councils. The rate and its history show what changed within that council.
Try it: Hover over a point to see the count, rate, rank and change from the previous year. The labels at the end of the lines show the total percentage change since 2017.
Source: Crime Statistics Agency (2026), Table 01. Each year covers a 12-month period ending in June. Wyndham and Northern Grampians are contrasting examples from Chart 1; they are not a representative sample of Victorian councils.
Before judging a council by its crime ranking, ask: Is the ranking based on counts or rates? Which offences does it include? What has changed over time? A single rank cannot answer all three questions.
I used the CSA’s recorded offences workbook for the year ending June 2026 (Crime Statistics Agency, 2026).
The council comparisons include 79 local government areas. I excluded regional totals, justice institutions and immigration facilities, and Unincorporated Victoria from the council dataset.
Table 01 and Table 02 were converted from the downloaded workbook
into UTF-8 CSV files using a Python standard-library script
(support/export_source_tables.py). The export reads stored
cell values, preserving the numeric precision in the workbook rather
than Excel’s rounded display formatting. It does not change the counts
or calculate new rates.
The R preparation script imports these CSV files with
read.csv(), converts numeric fields, simplifies column
names and trims text. It checks row counts, council coverage, missing
values, negative values and duplicate records. The report does not need
to reopen the Excel workbook during knitting.
For overall counts, rates and rankings, I used the published figures in Table 01.
For offence categories, I added the detailed counts and LGA rates in Table 02 within each council, year and offence division. Police service area rates were not used.
I also compared the detailed counts with the published totals. They matched for 540 of 790 council-year records. The remaining 250 differed by exactly one offence. I retained these differences rather than changing the figures to make the tables agree. The exact cause of each difference was not established.
I ranked councils from the highest value to the lowest, separately for each year. For category comparisons, I ranked councils separately within each offence division.
The code uses min_rank(desc(value)). Equal values
receive the same rank, and the next position is skipped. For example,
two councils tied in second place would both rank 2, followed by rank 4.
This follows the documented behaviour of min_rank()
(Wickham et al., 2026).
The difference between the two ranks is calculated as:
Rank difference = count rank − rate rank.
A positive result means the council is closer to rank 1 when ranked by rate than when ranked by count. This is a difference in positions, not a percentage change in crime.
For the annual change shown in Chart 3, I used:
Annual change (%) = ((current year’s rate − previous year’s rate) / previous year’s rate) × 100.
The R calculation is equivalent to:
100 * (offence_rate / previous_rate - 1)
There is no annual change for the first year because the dataset used here does not include the preceding year’s rate.
For the change between the first and last years, I used:
Change from 2017 to 2026 (%) = ((2026 rate − 2017 rate) / 2017 rate) × 100.
These are standard percentage-change calculations applied to the CSA rates. The endpoint change is the total change over the period, not an average annual growth rate.
Calculations use the numeric precision stored in the source workbook. Further rounding is applied only when displaying figures.
I used R for the analysis and visualisations. R provides the statistical computing environment used by the scripts (R Core Team, 2026).
The main packages and their roles were:
read.csv() and
converting numeric fields (R Core Team, 2026).str_trim()
(Wickham, 2025).These references document the software and methods used. They do not mean that the complete assignment scripts were copied from those publications.
Council areas contain multiple neighbourhoods. A council-level result should not be treated as a description of every suburb, street or resident within that area.
The figures describe recorded offences. A rate per 100,000 residents is not an individual’s probability of experiencing crime.
The charts show differences and changes in the data. They do not establish what caused those patterns or provide a complete measure of personal safety.
Allaire, J. J., Xie, Y., Dervieux, C., McPherson, J., Luraschi, J., Ushey, K., Atkins, A., Wickham, H., Cheng, J., Chang, W., & Iannone, R. (2026). rmarkdown: Dynamic documents for R (Version 2.32) [Computer software]. https://github.com/rstudio/rmarkdown
Crime Statistics Agency. (2026). Recorded offences by LGA: Year ending June 2026 [Data set]. DataVic. https://discover.data.vic.gov.au/dataset/data-tables-recorded-offences
R Core Team. (2026). R: A language and environment for statistical computing [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/
Sievert, C. (2020). Interactive web-based data visualization with R, plotly, and shiny. Chapman & Hall/CRC. https://plotly-r.com/
Wickham, H. (2025). stringr: Simple, consistent wrappers for common string operations (Version 1.6.0) [Computer software]. https://doi.org/10.32614/CRAN.package.stringr
Wickham, H., François, R., Henry, L., Müller, K., & Vaughan, D. (2026). dplyr: A grammar of data manipulation (Version 1.2.0) [Computer software]. https://doi.org/10.32614/CRAN.package.dplyr
Xie, Y. (2026). knitr: A general-purpose package for dynamic report generation in R (Version 1.52) [Computer software]. https://yihui.org/knitr/