Police discipline in British Columbia · the published record, 2010–2025

Anticipatory Scandal

1,243 allegations · 727 cases · 15 municipal agencies · 576 adjudication documents · 2010–2025

Every file, the R script, and a way to run it in the browser.

What this is. This site reproduces what the OPCC publishes about concluded discipline cases. We added one flag: it marks the allegations involving gender-based violence. The methods page explains how the flag was built and checked. The numbers compare groups within one administrative record; they show how the gender-based violence cases were treated and cannot say why. That group is small, so a handful of cases can shift a percentage. We describe the allegations as substantiated because almost every one here, 1,235 of 1,243, ends in a disciplinary or corrective measure; the OPCC's own table does not use the word.

Every file

Everything behind this site can be downloaded: the OPCC's export as published, the analysis table, every hand-coding sheet with its supporting quotes, and the scripts behind every number. The archive is 4.2 MB. The 576 adjudication PDFs (569 MB) stay at opcc.bc.ca, and the index in the archive lists every URL.

Or take the files one at a time

bc_police_discipline_complete.zip 4.2 MB
The complete archive: the OPCC's export as published, the coded tables, every hand-coding sheet with its evidence quotes, the passage corpora, the figures and the scripts that produce every number.
What is inside the archive

The README maps its five folders: the source as published, the coded tables, the hand-coding sheets, the passage corpora, and the results with their scripts. Each hand-coded sheet opens with a provenance header naming who or what coded it, when, and with which script.

allegations.csv 1,243 rows · 272 KB
The analysis frame. One row per allegation, with the four flag columns kept separate; the dictionary below defines every column.
Column dictionary: what every column holds
ColumnWhat it holds
allegation_idRow number, 1 to 1,243.
file_numberThe OPCC file number; one case per file.
agencyThe municipal police agency.
year_concludedThe year the case concluded.
incident_yearThe year of the incident, where the digest records it.
statutory_headingThe Police Act heading the allegation was filed under, as published.
opcc_sublabelThe OPCC's own keyword sub-label.
conduct_categoryThe machine-coded conduct category, one of fourteen; checks on the methods page.
is_gbvThe wide gender-based violence flag: any of the four rules.
is_gbv_narrowRules 1 and 2 only: conduct an officer committed.
is_gbv_reviewedRule 1: flagged on review and upheld by the refuting pass.
is_gbv_deferredRule 2: deference to the OPCC's own sexualized-conduct label.
is_gbv_hand_addedRule 3: the single hand-added allegation.
is_gbv_neglectRule 4: neglect or mistreatment of a woman who reported violence.
dismissedA dismissal is recorded on this allegation.
job_level_measureA measure reaching the officer's job is recorded; the exact rule is stated in reproduce.R.
suspension_daysSuspension length in days, where recorded.
months_to_decisionMonths from incident to conclusion, where both dates exist.
appealedThe digest records an appeal or review.
pathwayHow the case entered: OI ordered investigation, PC public complaint, ID internal discipline, SH serious harm.
criminal_processThe digest records a parallel criminal process.
no_charge_approvedThe digest records that Crown counsel approved no charge.
criminal_process_probeThe machine probe behind criminal_process; kept so the column can be audited.
no_charge_approved_probeThe machine probe behind no_charge_approved; kept so the column can be audited.
trust_languageThe published text uses public-trust language.
allegation_membersMembers named on this allegation, as published.
members_in_fileMembers named anywhere in the file.
measure_members_namedMembers the recorded measure names.
measure_is_member_splitThe measure line assigns different measures to different members.
text_lengthCharacter length of the published summary.
msr_*One column per statutory measure (suspension, written reprimand, training, dismissal, advice as to future conduct, verbal reprimand, close supervision, counselling, program or activity, reduction in rank, transfer or reassignment): 1 where that measure is recorded on the allegation.
cases.json 1.8 MB
The published summary text and the supporting quote for each allegation, as shown in the browser on the decisions page.
dismissal_by_heading.csv 224 rows · 20 KB
Every bar in the four figures on the findings page, one row per bar: the outcome, whether rows count cases or allegations, the statutory heading, which of the two groups the bar shows, the count behind it, and its 95 per cent interval.
decision_pdf_index.csv 576 rows · 110 KB
The 576 documents on the OPCC's hearing and review pages (decisions, notices, submissions, rulings), one URL per row, with listing and file size.
reproduce.R 28 KB
An annotated base-R script that recomputes the main findings from allegations.csv and prints each one beside its rule. No packages.
$ data & code run real R in this tab no install · R, Python, curl, files, citation
static files · CORS open · no key · no rate limit

A real R session, running in your browser through webR. Nothing is sent anywhere. The table is loaded as allegations, one row per allegation. The first run downloads R itself, about 30 MB.

R has not started yet. Press Run.
Press Run. The first run takes a moment while R downloads.