# Geregistreerde overlast per buurt

Elke maand telt de politie hoeveel meldingen van overlast er binnenkwamen, per buurt en per soort: van verwarde personen en jeugd tot geluidshinder en drugs. CBS publiceert de cijfers als open tabel, met een maand vertraging.

- Uitgever: Politie, Centraal Bureau voor de Statistiek
- Gebied: Nederland · Laagste detail: buurt
- Periode: 2012 – 2026 · Ververst: maandelijks
- Toegang: Open · Licentie: CC BY 4.0
- Koppelsleutels: buurtcode (BU), wijkcode (WK), gemeentecode (GM)
- Status: ok (2026-10-15)
- URL: https://data.politie.nl

## Wat kun je ermee?
- **Vergelijk je buurt met de rest van je gemeente.** Deel de meldingen door het aantal inwoners en zet je buurt naast de andere buurten in dezelfde gemeente. Dat is eerlijker dan een landelijke ranglijst.
- **Zoek het seizoensritme.** Overlast piekt in de zomer en rond de jaarwisseling. Zet elk jaar als eigen lijn in één grafiek en het patroon springt eruit.
- **Factcheck: 'de overlast neemt toe'.** Vergelijk dezelfde maanden met vorig jaar, niet de laatste maand met de vorige. Let op de trendbreuk van maart 2021 als je verder terugkijkt.
- **Verwarde personen en de ggz.** Leg de meldingen over verwarde personen naast cijfers over ggz-gebruik per buurt. Corrigeer voor inkomen en dichtheid, anders meet je vooral stedelijkheid.

## Zo verwerk je het
1. **Kies je gebieden.** Zoek de codes op in de wijk- en buurtkaart. Codes hebben een vaste lengte: GM + 4 cijfers, WK + 6, BU + 8.
2. **Haal de maandcijfers op.** Filter op gebied en soort overlast. Vul de sleutels aan met spaties tot de vaste lengte en pagineer per 10.000 rijen.
   `https://dataderden.cbs.nl/ODataApi/OData/47024NED/TypedDataSet?$filter=WijkenEnBuurten eq 'BU03630000' &$skip=0`
3. **Maak er een nette tabel van.** Zet Perioden om naar een datum ('2026MM09' wordt 2026-09) en haal de spaties uit de sleutels. Rijen zonder meldingen ontbreken: tel ze als nul.
4. **Deel door inwoners.** Koppel het aantal inwoners uit de kerncijfers op buurtcode. Laat buurten met heel weinig inwoners weg, daar wordt één melding meteen een uitschieter.
5. **Laad elke maand alles opnieuw.** De politie past oude maanden aan. Een maandelijkse verversing haalt daarom de hele reeks op, niet alleen de nieuwste maand.

## Interessante koppelingen
- Hebben buurten met een laag inkomen meer overlast? → [cbs-kwb](https://www.opendataindex.nl/nl/bron/cbs-kwb.md) via buurtcode (BU). Inkomen en inwoners staan per buurt in de kerncijfers. In Staat van bleek de samenhang tussen laag inkomen en overlast sterk (ρ ≈ 0,58).
- Waar in de stad zit de overlast? → [pdok-wijkenbuurten](https://www.opendataindex.nl/nl/bron/pdok-wijkenbuurten.md) via buurtcode (BU). De buurtgrenzen maken van de tabel een kaart. Gebruik de grenzen van hetzelfde jaar als de indeling van de cijfers.
- Geeft warm weer meer overlast? → [knmi-daggegevens](https://www.opendataindex.nl/nl/bron/knmi-daggegevens.md) via datum (maand). Middel de temperatuur per maand en leg die naast de meldingen. Corrigeer voor seizoen en jaarwisseling.

## Vergelijkbare bronnen
- [politie-misdrijven](https://www.opendataindex.nl/nl/bron/politie-misdrijven.md): Misdrijven in plaats van overlast: aangiften en registraties van strafbare feiten.
- [Veiligheidsmonitor (CBS)](https://www.veiligheidsmonitor.nl): Een enquête: hoe veilig mensen zich voelen en wat ze zelf meemaakten, ook als ze het niet meldden.
- [Meldingen openbare ruimte (gemeenten)](https://data.amsterdam.nl): Meldingen bij de gemeente over afval, lawaai en kapotte straten. Ander loket, andere mensen die melden.

## Waar je op moet letten
- **Een registratie is geen gebeurtenis.** Wat niemand meldt, staat er niet in. Hoe vaak mensen de politie bellen verschilt per buurt en per soort overlast.
- **Trendbreuk in maart 2021.** De politie veranderde toen hoe meldingen worden vastgelegd. Vooral 'verward persoon' sprong omhoog. Vergelijk daarom niet zomaar 2020 met 2022.
- **Cijfers veranderen achteraf.** Oudere maanden worden met terugwerkende kracht bijgewerkt. Laad de hele reeks opnieuw in plaats van alleen de nieuwe maand toe te voegen.
- **Altijd de nieuwste buurtindeling.** CBS rekent de hele reeks om naar de buurtgrenzen van het laatste jaar. Buurtcodes uit oude bestanden bestaan daardoor soms niet meer.
- **Valkuilen in de API.** Sleutels zijn met spaties aangevuld ('NL00      '); zonder die spaties krijg je niets terug. Maximaal 10.000 rijen per verzoek. Het Feed-endpoint past alleen het eerste filter toe en negeert de rest zonder foutmelding.

## API (OData v3)

- Basis: https://dataderden.cbs.nl/ODataApi/OData/47024NED
- Toegang: Geen sleutel of account; de beschrijving en onze aanroep werken anoniem. (getest)
- Formaten: JSON, Atom/XML
- Omvang: 31798062 rijen (cellen) in TypedDataSet (getest)
- Filteren: OData-expressies in $filter, sleutels tussen enkele aanhalingstekens; eq, ne, gt, ge, lt, le, and, or, substringof(), startswith()

### Endpoints
- `GET /TableInfos`: titel, samenvatting, periode en wijzigingsdatum van de tabel
- `GET /UntypedDataSet`: de cijfers, alle waarden als tekst
- `GET /TypedDataSet`: de cijfers, met getallen als getal
- `GET /DataProperties`: alle kolommen: dimensies en onderwerpen met eenheid
- `GET /CategoryGroups`: groepering van categorieën
- `GET /Overlast`: codes en namen van de dimensie Overlast
- `GET /WijkenEnBuurten`: codes en namen van de dimensie WijkenEnBuurten
- `GET /Perioden`: codes en namen van de dimensie Perioden

### Parameters
- `$filter`: rijen kiezen, bv. WijkenEnBuurten eq 'GM0363    ' (platform)
- `$select`: alleen deze kolommen (platform)
- `$top / $skip`: pagineren (platform)
- `$orderby`: sorteren (platform)
- `$format`: json of atom (platform)
- `$count`: achter een pad: alleen het aantal (platform)

### Dimensies
- `Overlast` (9 codes): '0.0.0 ' = Totaal registraties overlast; 'E33   ' = Overlast door verward persoon; 'E35   ' = Melding overlast jeugd
- `WijkenEnBuurten` (18498 codes): 'NL00      ' = Nederland; 'GM1680    ' = Aa en Hunze; 'WK168000  ' = Wijk 00 Annen
- `Perioden` (191 codes): '2012MM01' = 2012 januari; '2012MM02' = 2012 februari; '2012MM03' = 2012 maart

### Velden (3)
`GeregistreerdeOverlast_1` long, `Gemeentenaam_2` string, `SoortRegio_3` string

### Limieten en valkuilen
- Maximaal 10.000 rijen per verzoek; pagineer met $skip. (ervaring)
- Sleutels zijn met spaties aangevuld tot vaste lengte: 'GM0363    ', '0.0.0 ', 'E33   '. Zonder spaties krijg je een lege lijst, geen foutmelding. (ervaring)
- Het Feed-endpoint past alleen het eerste $filter-predicaat toe en negeert de rest zonder melding. Gebruik TypedDataSet. (ervaring)
- TableInfos.Modified verandert bijna dagelijks (metadata). Voor versheid kijk je naar de hoogste Perioden-sleutel. (ervaring)
- Oude maanden worden met terugwerkende kracht bijgewerkt. Laad altijd de hele reeks opnieuw. (ervaring)
- Python urllib (LibreSSL op macOS) faalt op de TLS van cbs.nl; gebruik curl of Node fetch. (ervaring)

### Voorbeeld
```
https://dataderden.cbs.nl/ODataApi/OData/47024NED/TypedDataSet?$filter=WijkenEnBuurten%20eq%20'GM0363%20%20%20%20'%20and%20Overlast%20eq%20'0.0.0%20'&$top=3
```

## Zo haal je het op
```bash
curl "https://dataderden.cbs.nl/ODataApi/OData/47024NED/TypedDataSet?\$filter=WijkenEnBuurten%20eq%20'GM0363%20%20%20%20'%20and%20Overlast%20eq%20'0.0.0%20'"
```