Do grocery and bodega stores see a higher share of felony complaints between midnight and 5am than at other hours, and if so, what should the chain do about it?
Client: The report is written for the operations team of a 24/7 neighborhood grocery store chain in New York City. The chain runs stores across all five boroughs and is weighing whether to add late-night staff and camera coverage. Late-night staffing is one of the largest operating costs, so this decision needs reliable evidence rather than assumptions.
Problem: The chain keeps its stores open overnight but has no clear idea of whether late-night trade carries higher risk. Without that evidence, it must choose between paying for extra cover at every store or reducing hours and accepting unknown risk.
Data: The dataset is the NYPD complaint extract for 1 October to 31 December 2024, containing 136,402 complaints. Each row is one complaint, recording the offense, its law category (felony, misdemeanor or violation), the time the offense began, the premises type and the borough. The key variables are LAW_CAT_CD, PREM_TYP_DESC and CMPLNT_FR_TM.
Cleaning: I converted the start time to an hour, flagged offenses between midnight and 5am as “night”, and created a felony indicator. About 6,400 complaints have no end time, which is expected, since an end time is only recorded when the exact start time is unknown. I flagged the 1,233 complaints recorded at exactly 00:00:00, which may be placeholders, and kept them, because removing them barely changes the result (the grocery and bodega night felony share falls from 43.0% to 42.3%). I set five invalid victim age codes to missing and kept “UNKNOWN” as its own category, but victim age is not used in the analysis. I [kept all jurisdictions / filtered to N.Y. Police Dept]. I also kept the 339 complaints with no borough recorded, since borough is not used in the grocery analysis.
# A tibble: 19 × 2
JURIS_DESC n
<chr> <int>
1 N.Y. POLICE DEPT 119165
2 N.Y. HOUSING POLICE 8251
3 N.Y. TRANSIT POLICE 7467
4 PORT AUTHORITY 565
5 MTA POLICE DEPT 406
6 OTHER 175
7 DEPT OF CORRECTIONS 137
8 N.Y.C. DEPT OF HOMELESS SERVICES 71
9 N.Y. STATE POLICE 41
10 TRI-BORO BRDG TUNNL 29
11 NYC PARKS 26
12 AMTRACK 24
13 HEALTH & HOSP CORP 23
14 DISTRICT ATTORNEY OFFICE 7
15 N.Y.C. DEPT OF PROBATION 7
16 N.Y. STATE PARKS 3
17 NEW YORK CITY SHERIFF OFFICE 3
18 NYC DEPT ENVIRONMENTAL PROTECTION 1
19 U.S. PARK POLICE 1
Evidence
Overall pattern: Across all premises, complaints between midnight and 5am are more likely to be felonies than complaints at other hours. Felonies make up 39.8% of night complaints (7,814 of 19,618) compared with 29.7% at other hours.
Hypothesis test (all premises):H0: the law category is independent of the time band.
H1: the law category depends on the time band. The chi-square test assumes independent complaints and expected counts of at least 5 in each cell, and both conditions are met. The result is p < 0.001, so H0 is rejected.
Grocery and bodega premises: The client’s stores are the premises of interest, so I repeated the test on those complaints alone (Figure 1). Felonies make up 43.0% of late-night complaints (148 of 344) compared with 30.6% at other hours (480 of 1,570). The chi-square test gives p < 0.001, so the pattern holds for the client’s own store type.
Code
grocery <- complaints |>filter(PREM_TYP_DESC =="GROCERY/BODEGA")grocery_plot_data <- grocery |>count(time_band, LAW_CAT_CD) |>group_by(time_band) |>mutate(share = n /sum(n))ggplot(grocery_plot_data,aes(x = time_band, y = share, fill = LAW_CAT_CD)) +geom_col(width =0.6) +geom_text(aes(label = scales::percent(share, accuracy =1)),position =position_stack(vjust =0.5), colour ="white", size =3.5) +scale_y_continuous(labels = scales::percent) +scale_fill_manual(values =c(FELONY ="#B5452E", MISDEMEANOR ="#5B7A8C", VIOLATION ="#B9B3A4")) +labs(title ="Felonies make up a larger share of complaints late at night",subtitle ="Grocery and bodega premises, NYC, Oct to Dec 2024",x =NULL, y ="Share of complaints", fill ="Law category",caption ="Source: NYPD Complaint Data 2024" ) +theme_minimal(base_size =12) +theme(legend.position ="top", plot.title.position ="plot")
Figure 1: Share of complaints by law category, grocery and bodega premises, midnight to 5am vs other hours (Oct to Dec 2024).
Hour of day: Felony share peaks at about 4am (43%) and is lowest at 8am (25%), so the pattern is concentrated in the early hours rather than spread across the night (Figure 2).
Code
complaints |>filter(!is.na(hour)) |>count(hour, LAW_CAT_CD) |>group_by(hour) |>mutate(share = n /sum(n)) |>filter(LAW_CAT_CD =="FELONY") |>ggplot(aes(x = hour, y = share)) +geom_line(colour ="#B5452E", linewidth =1) +geom_point(colour ="#B5452E") +scale_x_continuous(breaks =0:23) +scale_y_continuous(labels = scales::percent) +labs(title ="Felony share of complaints by hour of day",subtitle ="All premises, NYC, Oct to Dec 2024",x ="Hour the offense began",y ="Share of complaints that are felonies",caption ="Source: NYPD Complaint Data 2024" ) +theme_minimal(base_size =12)
Figure 2: Share of complaints that are felonies by hour the offense began, all premises (Oct to Dec 2024).
Comparison with other retail: Grocery and bodega premises have a higher felony share than chain stores (15.1%), department stores (17.1%) and drug stores (9.6%).
Limitations: These are complaints, not confirmed crimes, and reporting rates vary by neighborhood, so the true rate could be higher or lower. The data has no foot-traffic or population denominator, so I compared shares within premises types rather than counts across boroughs. The window covers only three months, so seasonal effects such as the holiday period may influence the result. 1,233 records show exactly 00:00:00, which may be placeholders. These fall in the midnight to 5am group, so the night share could shift if they are wrong. These limits mean the effect size is indicative rather than precise, and the client should recheck it with a full year of data before making permanent changes.
External evidence: The ASU Center for Problem-Oriented Policing guide on convenience store robbery reports that the effect of mandated clerk staffing has been questioned in several studies, and that the preventive effect of CCTV is questionable. It does report that limiting the cash kept in the register may deter most potential robbers, and recommends drop safes with time-delayed release. The guide addresses robbery specifically rather than all felonies, so I use it as context for the recommendation rather than as proof of it.
Recommendation
TipRecommendation
Limit cash held in registers and install time-delayed drop safes at grocery and bodega stores from midnight to 5am, where felonies make up 43% of complaints compared with 31% at other hours. Review whether a second staff member and camera coverage are also needed after one year of data.
AI Use Statement
I used Claude (Haiku 5.5), published by Anthropic, available at https://claude.ai, to plan the report structure, check the marking criteria, draft and refine the introduction, evidence and recommendation, and check the R code. I checked all AI-generated text, code and figures against the data and sources before including them.
Acknowledgements
Project brief and marking criteria: DATA1001 Individual Project brief and the 2026S2 DATA1001 P2 Report rubric, Canvas, accessed 13 October 2026.
Dataset: NYPD Complaint Data 2024, NYC Open Data, accessed through the DATA1001 Canvas site on [date].
External evidence: ASU Center for Problem-Oriented Policing, Robbery of convenience stores, https://popcenter.asu.edu/problems/robbery_convenience/4, accessed [23.10.25].
AI assistance: see the AI Use Statement above.
References
Anthropic. (2026). Claude (Haiku 5.5) [Large language model]. https://claude.ai
ASU Center for Problem-Oriented Policing. (n.d.). Robbery of convenience stores. https://popcenter.asu.edu/problems/robbery_convenience/4
NYPD Complaint Data historic | NYC Open Data. (2026, April 28). https://data.cityofnewyork.us/Public-Safety/NYPD-Complaint-Data-Historic/qgea-i56i/about_data