What is happening near you, and what usually happens
Discovery interviews found that people could not tell an unverified rumour from a confirmed incident, and had no sense of whether what they were seeing was normal for their area. Every alert here is labelled by status and sits above the official baseline for its police division.
Nine police divisions, two layers
Switch between what is being reported right now and what the official record says about the last ten years. Select any division to read its numbers.
File a report
The reporting flow as the discovery research shaped it: fixed incident types rather than free text, a hard length limit on descriptions, and anonymity available without an account.
Fifty years of the official record
Built from four published Central Statistical Office and police spreadsheets by a reproducible R and SQL pipeline. Raw government files in, normalised SQLite out. No scraping, no estimates, no modelling.
Two patterns that look like findings and are not
This is the more useful half of the analysis. Both are documented rather than plotted as trends, because plotting them would assert something the sources do not support.
The post-2010 “crime decline” is almost certainly an artefact
Serious crime fell from 22,161 in 2009 to 11,135 in 2015. The fall is almost entirely property offences: breaking and burglary down 60%, larceny down 51%, robbery down 52%. Murder fell only 11% and felonious wounding only 3%.
Murder and wounding are the hardest offences to under-report. The year-to-year path is also implausible for real crime: −21.1%, then +12.4%, then −26.3%.
Most of the 2017 rise is a reclassification
Serious crime rose by 1,620 offences between 2016 and 2017. Firearms possession offences moved from Minor Crime into Serious Crime in that year.
Those offences account for 1,162 of the rise, roughly 72%. The remaining 458 is the part of the increase the data can actually speak to.
How this was built
Four source spreadsheets are parsed and tidied in R (01_clean.R), loaded into a SQLite fact constellation with four fact tables at four honest grains and four conformed dimensions (02_build_db.R), checked by seven validation tests that exit non-zero on failure (03_validate.R), and served through SQL views that compute year-over-year change with window functions (04_views.R).
Detection rate is never stored. It is derived in a view as detected over reported, so the stored data stays at published source values. A dash in the source is parsed as null, not zero: it means the category was not separately defined that year, and treating it as zero would assert a claim the source does not make.
The murder series shown above splices two publications, 1975-2014 from the offence-by-year file and 2015-2024 from the murders-by-division file. The three publications that overlap agree exactly on every year from 2015 to 2022, so the join asserts nothing new.