{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"project","url":"https://ejfox.com/projects/ccrb-clusters","json_url":"https://ejfox.com/projects/ccrb-clusters.json","generator":"ejfox.com/json-twin@1","data":{"cacheVersion":"2026-05-13-gear-cards","html":"<figure role=\"figure\" aria-label=\"Force-directed network graph of NYPD civilian complaint clusters showing officers connected by shared misconduct patterns\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/fl_progressive:semi,c_scale,dpr_auto,w_1280/v1624505769/Screen_Shot_2021-06-21_at_8.58.50_PM.jpg\" alt=\"Force-directed network graph of NYPD civilian complaint clusters showing officers connected by shared misconduct patterns\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/fl_progressive:semi,c_scale,dpr_auto,w_1280/v1624505769/Screen_Shot_2021-06-21_at_8.58.50_PM.jpg 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/fl_progressive:semi,c_scale,dpr_auto,w_1280/v1624505769/Screen_Shot_2021-06-21_at_8.58.50_PM.jpg 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/fl_progressive:semi,c_scale,dpr_auto,w_1280/v1624505769/Screen_Shot_2021-06-21_at_8.58.50_PM.jpg 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/fl_progressive:semi,c_scale,dpr_auto,w_1280/v1624505769/Screen_Shot_2021-06-21_at_8.58.50_PM.jpg 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Force-directed network graph of NYPD civilian complaint clusters showing officers connected by shared misconduct patterns\" width=\"2800\" height=\"2285\" style=\"--splay-rot:-1.18deg;\" data-dimensions=\"2800×2285\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Force-directed network graph of NYPD civilian complaint clusters showing officers connected by shared misconduct patterns</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"Scrolling the published Gothamist investigation — the officer-cluster network as readers met it\" class=\"\"><video class=\"img-full my-8 rounded-sm\" autoplay loop muted playsinline preload=\"metadata\" poster=\"https://res.cloudinary.com/ejf/video/upload/so_0,f_jpg,q_auto,w_1280/projects/ccrb-clusters/published-piece-scroll.jpg\" src=\"https://res.cloudinary.com/ejf/video/upload/q_auto/projects/ccrb-clusters/published-piece-scroll.mp4\" aria-label=\"Scrolling the published Gothamist investigation — the officer-cluster network as readers met it\"></video><figcaption class=\"\">Scrolling the published Gothamist investigation — the officer-cluster network as readers met it</figcaption></figure>\n<figure role=\"figure\" aria-label=\"The network visualization in the published piece\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/ccrb-clusters/article-viz.png\" alt=\"The network visualization in the published piece\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/ccrb-clusters/article-viz.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/ccrb-clusters/article-viz.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/ccrb-clusters/article-viz.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/ccrb-clusters/article-viz.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The network visualization in the published piece\" width=\"1080\" height=\"800\" style=\"--splay-rot:2.31deg;\" data-dimensions=\"1080×800\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">The network visualization in the published piece</figcaption>\n</figure>\n<p class=\"\">In 2021, WNYC/Gothamist got the NYPD's full civilian-complaint dataset through a FOIL request and handed it to me — every complaint and every officer since 2000, including officers named only as witnesses and complaints the CCRB never substantiated. Noisier than the data ProPublica had published a year earlier, but for mapping a network that noise is the signal: being named on a complaint alongside another officer, even an unfounded one, means the two of them interacted in a way the public noticed.</p>\n<p class=\"\">Complaints are often the first and only warning that an officer is on a course of escalating violence. Derek Chauvin had at least 22 complaints across 19 years before he killed George Floyd; the officer who choked Eric Garner had 7. Nothing disrupted either pattern.</p>\n<p class=\"\">So I built the network — 29,915 officer nodes, 159,671 relationships, in Neo4j (with a lot of Cypher help from David Allen at Neo4j) and laid out in Gephi (love-hate relationship, but unrivaled for networks). Two officers get a link — a <code class=\"md-inline-code\">CO_OCCURANCE</code> — when they appear on the same complaint, weighted by how many they share: three complaints together, weight 3. I filtered out everything the CCRB marked <em class=\"\">exonerated</em> or <em class=\"\">unfounded</em> first, and only labeled an officer by name if they'd had a complaint <em class=\"\">substantiated</em> — a caution I was told lawyers would appreciate. Everyone else stays an anonymous ID.</p>\n<p class=\"\">One sign it was working: when I ran community detection, the clusters mirrored real NYPD precincts — officers appear on complaints with the officers they actually work beside.</p>\n<p class=\"\">Then the big nodes surfaced — Martinez, Radoncic, Grieco — officers co-appearing on complaint after complaint. When Gothamist reporter George Joseph took those names to the street and interviewed victims, the graph held up: the central nodes were acting as catalysts in real life. One man described a big node, Adnan Radoncic, sparking a group assault — <em class=\"\">\"As soon as he grabbed me, all the officers was hands on. It's like they just followed his lead.\"</em> Math and reality matched up.</p>\n<p class=\"\">I documented every query and every decision so anyone could rebuild this for their own police department: <strong class=\"\"><a href=\"/blog/2021/nypd-ccrb-complaint-clusters\" class=\"text-blue-600 dark:text-blue-400\">the full methodology write-up →</a></strong></p>","title":"Clusters of NYPD Misconduct","metadata":{"title":"Clusters of NYPD Misconduct","date":"2021-06-15T04:00:00.000Z","category":"Journalism","modified":"2025-08-26T19:52:56.000Z","url":"https://gothamist.com/news/mapping-clusters-nypd-officers-repeatedly-accused-misconduct","tech":["Neo4j","SQLite","Gephi","Network Analysis","Cypher"],"featured":true,"state":"deployed","ai-involvement":"human-only","context":"client","tags":["data","nypd","journalism","database"],"words":395,"images":3,"imageDetails":{"total":3,"cloudinary":3,"withDimensions":0},"links":4,"codeBlocks":0,"headers":{},"toc":[],"type":"post"}},"_links":{"self":"https://ejfox.com/projects/ccrb-clusters.json","html":"https://ejfox.com/projects/ccrb-clusters","index":"/projects.json"}}