Final Deliverable | Detroit, Michigan | 2019
Dataset: Open Crime Database (OCDB) via the
crimedata R package
Source URL:
https://osf.io/zyaqn/
Time Period: January 1, 2019 — December 31, 2019
This analysis uses the Open Crime Database (OCDB),
accessed through the crimedata R package developed by
criminologist Dr. Michael Langton and colleagues. The
OCDB aggregates standardized, geocoded crime incident data from police
departments across major U.S. cities, making it one of the most
accessible open-source crime datasets available for academic
research.
Dataset URL: https://osf.io/zyaqn/
The specific dataset used here covers Detroit, Michigan for the full calendar year 2019, drawing from incident-level records reported by the Detroit Police Department (DPD). Detroit was selected due to its historically elevated crime rates relative to other U.S. cities, making it a meaningful subject for criminological prediction and pattern analysis.
The OCDB provides standardized variable documentation across all participating cities. Key variables relevant to this analysis include:
| Variable | Description |
|---|---|
offense_type |
Specific offense classification (e.g., aggravated assault) |
offense_group |
Broader offense category (e.g., assault offenses) |
offense_against |
Whether the offense is against a person, property, or society |
date_single |
Date and time of the incident |
latitude / longitude |
Geographic coordinates of the incident |
census_block |
U.S. Census block identifier for spatial aggregation |
The OCDB synchronizes offense classifications using the FBI’s National Incident-Based Reporting System (NIBRS) taxonomy, enabling consistent cross-city comparisons. Full codebook documentation is available at the OSF repository linked above.
The data originates from the Detroit Police Department’s public crime incident reporting system, aggregated into the OCDB by Langton et al. Detroit’s open data portal publishes crime incidents as part of Michigan’s broader commitment to government transparency under the Freedom of Information Act (FOIA).
The OCDB project is hosted on the Open Science Framework (OSF), a non-profit, open-source platform for research data sharing, ensuring long-term accessibility and reproducibility.
Crime incident data is collected by law enforcement agencies for operational and legal purposes: dispatching officers, prosecuting offenses, and allocating departmental resources. Secondary academic use, as in this analysis, repurposes these administrative records to identify spatial and temporal crime patterns, test criminological theories, and inform evidence-based policy recommendations.
library(crimedata)
library(leaflet)
library(leaflet.extras)
library(dplyr)
library(RColorBrewer)
library(DT)target_offenses <- c(
"assault offenses",
"burglary/breaking & entering",
"motor vehicle theft",
"robbery",
"homicide offenses"
)
crimes <- crimes_raw |>
filter(
!is.na(longitude),
!is.na(latitude),
offense_group %in% target_offenses
) |>
mutate(
offense_group = as.character(offense_group),
offense_label = paste0(
toupper(substring(offense_group, 1, 1)),
substring(offense_group, 2)
),
date_fmt = format(date_single, "%b %d, %Y")
) |>
slice_sample(n = min(8000, nrow(crimes_raw)))The raw dataset required the following preparation steps before analysis:
Filtering: The full OCDB dataset for Detroit 2019 contains numerous offense categories. This analysis focuses on five high-impact violent and property crime categories — assault, burglary, motor vehicle theft, robbery, and homicide — which represent the offenses most closely associated with public safety outcomes and predictive policing research.
Geocoding validation: Incidents missing latitude or longitude coordinates were removed, as spatial visualization is a central component of this analysis. Approximately 0 records were excluded for missing coordinates.
Sampling: For browser performance in the interactive map, a random sample of up to 8,000 incidents was drawn from the filtered dataset. All non-map visualizations use the full filtered dataset.
Variable recoding: The offense_group
variable was stored as a factor and required conversion to character
before string formatting functions could be applied.
Overall, the dataset was relatively clean with consistent variable naming across years, which is a key advantage of the OCDB’s standardized schema.
Langton, S., & Steenbeek, W. (2017). Residential burglary target selection: An analysis at the property-level using Google Street View. Applied Geography, 86, 292–299.
Weisburd, D., Bushway, S., Lum, C., & Yang, S. M. (2004). Trajectories of crime at places: A longitudinal study of street segments in the city of Seattle. Criminology, 42(2), 283–322.
Brantingham, P. J., & Brantingham, P. L. (1984). Patterns in Crime. Macmillan.
Sherman, L. W., Gartin, P. R., & Buerger, M. E. (1989). Hot spots of predatory crime: Routine activities and the criminology of place. Criminology, 27(1), 27–56.
The chart below provides a high-level overview of the five offense categories analyzed in this report, showing the total incident count for each.
overview <- crimes |>
count(offense_label) |>
arrange(desc(n))
par(
bg = "#222", fg = "#eee", col.axis = "#eee",
col.lab = "#eee", col.main = "#fff", mar = c(6, 5, 4, 2)
)
colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00")
bp <- barplot(
overview$n,
names.arg = rep("", nrow(overview)),
col = colors[1:nrow(overview)],
border = NA,
horiz = FALSE,
las = 1,
ylim = c(0, max(overview$n) * 1.15),
main = "Total Crime Incidents by Offense Type — Detroit 2019",
ylab = "Incident Count",
xlab = "",
cex.axis = 0.85
)
text(
x = bp,
y = par("usr")[3] - max(overview$n) * 0.04,
labels = overview$offense_label,
srt = 20,
adj = 1,
xpd = TRUE,
col = "#eee",
cex = 0.82
)
text(
x = bp,
y = overview$n + max(overview$n) * 0.02,
labels = format(overview$n, big.mark = ","),
col = "#fff",
cex = 0.80
)
mtext("Offense Type", side = 1, line = 4.5, col = "#eee", cex = 0.9)Interpretation: Assault offenses dominate the dataset by a wide margin, consistent with Detroit’s profile as a city with elevated rates of interpersonal violence. Motor vehicle theft is the second most common offense, reflecting the city’s automobile-centric culture and documented vehicle theft trends. Homicide offenses are the least frequent, as expected given their severity, but remain notably higher than comparably-sized U.S. cities.
The map below plots geocoded incidents across Detroit. Click any marker to see the offense type, date, and census block. Toggle between point markers (colored by offense type) and a density heatmap using the layer control panel.
categories <- sort(unique(crimes$offense_label))
palette_cols <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00")[seq_along(categories)]
pal <- leaflet::colorFactor(palette = palette_cols, domain = categories)
map <- leaflet(crimes) |>
addProviderTiles(providers$CartoDB.DarkMatter, group = "Dark") |>
addProviderTiles(providers$CartoDB.Positron, group = "Light") |>
addProviderTiles(providers$Esri.WorldImagery, group = "Satellite") |>
addHeatmap(
lng = ~longitude, lat = ~latitude,
intensity = 1, blur = 18, max = 0.05, radius = 12,
group = "Heat Map"
) |>
addCircleMarkers(
lng = ~longitude,
lat = ~latitude,
color = ~pal(offense_label),
radius = 4,
stroke = FALSE,
fillOpacity = 0.65,
popup = ~paste0(
"<b style='font-size:13px;'>", offense_label, "</b><br>",
"<i>", date_fmt, "</i><br>",
"<span style='color:#888;'>Census Block: ", census_block, "</span>"
),
group = "Points by Offense"
) |>
addLegend(
position = "bottomright", pal = pal,
values = ~offense_label, title = "Offense Type", opacity = 0.85
) |>
addLayersControl(
baseGroups = c("Dark", "Light", "Satellite"),
overlayGroups = c("Points by Offense", "Heat Map"),
options = layersControlOptions(collapsed = FALSE)
) |>
hideGroup("Heat Map") |>
addMiniMap(toggleDisplay = TRUE, minimized = TRUE) |>
addScaleBar(position = "bottomleft") |>
setView(lng = -83.0458, lat = 42.3314, zoom = 11) |>
addControl(
html = "<div style='background:rgba(0,0,0,0.7);color:#fff;padding:8px 14px;
border-radius:6px;font-family:Georgia,serif;font-size:14px;line-height:1.5;'>
<b>Detroit Crime Map — 2019</b><br>
<span style='font-size:11px;color:#bbb;'>Click any marker for offense details</span></div>",
position = "topleft"
)
mapInterpretation: The spatial distribution of crime is clearly non-random. High-density clusters appear in Detroit’s east side and along major commercial corridors, consistent with routine activity theory, which predicts crime concentration near nodes of activity (Sherman et al., 1989). The heatmap layer reveals macro-level hot spots that align with neighborhoods historically documented as high-crime areas.
monthly <- crimes |>
mutate(
month = format(date_single, "%b"),
month_n = as.integer(format(date_single, "%m"))
) |>
count(month, month_n, offense_label) |>
arrange(month_n)
monthly_wide <- tapply(monthly$n, list(monthly$month, monthly$offense_label), sum)
monthly_wide[is.na(monthly_wide)] <- 0
month_order <- month.abb[month.abb %in% rownames(monthly_wide)]
monthly_wide <- monthly_wide[month_order, , drop = FALSE]
par(bg = "#222", fg = "#eee", col.axis = "#eee", col.lab = "#eee",
col.main = "#fff", mar = c(4, 4, 3, 1))
barplot(
t(monthly_wide), beside = TRUE,
col = c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00")[1:ncol(monthly_wide)],
names.arg = rownames(monthly_wide),
legend.text = colnames(monthly_wide),
args.legend = list(x = "topright", bty = "n", cex = 0.75, text.col = "#eee"),
main = "Monthly Crime Incidents by Offense Type — Detroit 2019",
xlab = "Month", ylab = "Incident Count",
border = NA, las = 1
)Interpretation: Assault offenses peak in summer months (June–August), a well-documented seasonal pattern attributable to increased outdoor activity and social interaction during warmer weather (Brantingham & Brantingham, 1984). Motor vehicle theft shows less pronounced seasonality, suggesting it is driven more by opportunity structures than weather. This monthly breakdown is valuable for resource allocation, police departments can anticipate demand surges and pre-position officers accordingly.
tod_line <- crimes |>
mutate(
hour = as.integer(format(date_single, "%H")),
time_of_day = case_when(
hour >= 0 & hour < 5 ~ "Late Night\n(12-5am)",
hour >= 5 & hour < 12 ~ "Morning\n(6-11am)",
hour >= 12 & hour < 17 ~ "Afternoon\n(12-4pm)",
hour >= 17 & hour < 21 ~ "Evening\n(5-8pm)",
hour >= 21 ~ "Night\n(9-11pm)"
)
) |>
count(time_of_day, offense_label)
time_order <- c("Late Night\n(12-5am)", "Morning\n(6-11am)",
"Afternoon\n(12-4pm)", "Evening\n(5-8pm)", "Night\n(9-11pm)")
offense_cats <- sort(unique(tod_line$offense_label))
colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00")
par(bg = "#222", fg = "#eee", col.axis = "#eee", col.lab = "#eee",
col.main = "#fff", mar = c(6, 5, 4, 2))
plot(1:5, rep(0, 5), type = "n", xlim = c(1, 5),
ylim = c(0, max(tod_line$n) * 1.15),
xaxt = "n", yaxt = "n",
main = "Crime Incidents by Time of Day & Offense Type — Detroit 2019",
xlab = "", ylab = "Incident Count",
panel.first = {
abline(h = pretty(tod_line$n), col = "#444", lty = 2, lwd = 0.8)
abline(v = 1:5, col = "#333", lty = 2, lwd = 0.8)
})
axis(1, at = 1:5, labels = time_order, col = "#eee", col.axis = "#eee", cex.axis = 0.78, las = 1)
axis(2, col = "#eee", col.axis = "#eee", cex.axis = 0.85, las = 1)
mtext("Time of Day", side = 1, line = 5, col = "#eee", cex = 0.9)
for (i in seq_along(offense_cats)) {
cat_data <- tod_line[tod_line$offense_label == offense_cats[i], ]
cat_data <- cat_data[match(time_order, cat_data$time_of_day), ]
lines(x = 1:5, y = cat_data$n, col = colors[i], lwd = 2.5)
points(x = 1:5, y = cat_data$n, col = colors[i], pch = 19, cex = 1.2)
}
legend("topright", legend = offense_cats, col = colors[seq_along(offense_cats)],
lwd = 2.5, pch = 19, bty = "n", cex = 0.75, text.col = "#eee")Interpretation: Assault offenses spike dramatically during late night hours, peaking between 9–11pm, consistent with alcohol-fueled altercations at bars and social gatherings. Burglary follows the opposite pattern it is most common during morning and afternoon hours when residents are away from home. Motor vehicle theft is elevated at night across all time windows. These temporal signatures align with routine activity theory: offenses occur when motivated offenders, suitable targets, and absent guardians converge.
dow_line <- crimes |>
mutate(
day_of_week = weekdays(as.Date(date_single)),
day_num = as.integer(format(as.Date(date_single), "%u"))
) |>
count(day_of_week, day_num, offense_label) |>
arrange(day_num)
day_order <- c("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")
offense_cats <- sort(unique(dow_line$offense_label))
colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00")
par(bg = "#222", fg = "#eee", col.axis = "#eee", col.lab = "#eee",
col.main = "#fff", mar = c(6, 5, 4, 2))
plot(1:7, rep(0, 7), type = "n", xlim = c(1, 7),
ylim = c(0, max(dow_line$n) * 1.15),
xaxt = "n", yaxt = "n",
main = "Crime Incidents by Day of Week & Offense Type — Detroit 2019",
xlab = "", ylab = "Incident Count",
panel.first = {
abline(h = pretty(dow_line$n), col = "#444", lty = 2, lwd = 0.8)
abline(v = 1:7, col = "#333", lty = 2, lwd = 0.8)
})
axis(1, at = 1:7, labels = day_order, col = "#eee", col.axis = "#eee", cex.axis = 0.82, las = 1)
axis(2, col = "#eee", col.axis = "#eee", cex.axis = 0.85, las = 1)
mtext("Day of Week", side = 1, line = 4, col = "#eee", cex = 0.9)
for (i in seq_along(offense_cats)) {
cat_data <- dow_line[dow_line$offense_label == offense_cats[i], ]
cat_data <- cat_data[match(day_order, cat_data$day_of_week), ]
lines(x = 1:7, y = cat_data$n, col = colors[i], lwd = 2.5)
points(x = 1:7, y = cat_data$n, col = colors[i], pch = 19, cex = 1.2)
}
legend("topright", legend = offense_cats, col = colors[seq_along(offense_cats)],
lwd = 2.5, pch = 19, bty = "n", cex = 0.75, text.col = "#eee")Interpretation: Weekend days, particularly Friday and Saturday, show the highest assault counts, reinforcing the connection between nightlife activity and violent crime. Burglary is more evenly distributed across weekdays, suggesting professional offenders operate on a work-week schedule when homes are most likely to be unoccupied. Motor vehicle theft spikes slightly on weekends, possibly linked to vehicles parked overnight at entertainment venues.
box_data <- crimes |>
mutate(hour = as.integer(format(date_single, "%H"))) |>
filter(!is.na(hour), !is.na(offense_label), nchar(trimws(offense_label)) > 0)
offense_cats <- sort(unique(trimws(box_data$offense_label)))
offense_cats <- offense_cats[nchar(offense_cats) > 0]
colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00")
hour_list <- lapply(offense_cats, function(cat) box_data$hour[box_data$offense_label == cat])
names(hour_list) <- seq_along(offense_cats)
par(bg = "#222", fg = "#eee", col.axis = "#eee", col.lab = "#eee",
col.main = "#fff", mar = c(8, 5, 4, 2))
bp <- boxplot(
hour_list,
names = rep("", length(offense_cats)),
col = colors[seq_along(offense_cats)],
border = "#eee", whisklty = 1, whisklwd = 1.5,
staplelwd = 1.5, medlwd = 2.5, medcol = "#fff",
outpch = 20, outcex = 0.4, outcol = "#aaa",
boxwex = 0.5, xaxt = "n", yaxt = "n",
main = "Distribution of Incident Hour by Offense Type — Detroit 2019",
ylab = "Hour of Day", xlab = ""
)
axis(1, at = seq_along(offense_cats), labels = FALSE)
text(x = seq_along(offense_cats), y = par("usr")[3] - 1.2,
labels = offense_cats, srt = 30, adj = 1, xpd = TRUE, col = "#eee", cex = 0.82)
axis(2, at = c(0,3,6,9,12,15,18,21,23),
labels = c("12am","3am","6am","9am","12pm","3pm","6pm","9pm","11pm"),
col = "#eee", col.axis = "#eee", cex.axis = 0.82, las = 1)
abline(h = c(0,3,6,9,12,15,18,21,23), col = "#444", lty = 2, lwd = 0.8)
mtext("Offense Type", side = 1, line = 6.5, col = "#eee", cex = 0.9)
text(x = seq_along(offense_cats), y = bp$stats[3,] + 0.8,
labels = paste0("med: ", bp$stats[3,], ":00"), col = "#fff", cex = 0.72)Interpretation: The box plot reveals meaningful differences in the distribution of incident hours across offense types. Assault has a high median hour and wide interquartile range, indicating it occurs throughout the day but concentrates in evening hours. Burglary has a lower, tighter distribution clustered in daytime hours. Homicide offenses show the widest spread, occurring at any hour, which is consistent with their often opportunistic or retaliatory nature. These distributional differences have direct implications for patrol scheduling.
hist_data <- crimes |>
mutate(hour = as.integer(format(date_single, "%H"))) |>
filter(!is.na(hour))
offense_cats <- sort(unique(trimws(hist_data$offense_label)))
colors <- c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00")
par(mfrow = c(2, 3), bg = "#222", fg = "#eee", col.axis = "#eee",
col.lab = "#eee", col.main = "#fff", mar = c(4, 4, 3, 1))
for (i in seq_along(offense_cats)) {
cat_hours <- hist_data$hour[hist_data$offense_label == offense_cats[i]]
hist(cat_hours, breaks = 0:24, col = colors[i], border = "#222",
main = offense_cats[i], xlab = "Hour of Day", ylab = "Incident Count",
xaxt = "n", yaxt = "n", cex.main = 0.88, cex.lab = 0.82, freq = TRUE)
axis(1, at = c(0,6,12,18,24), labels = c("12am","6am","12pm","6pm","11pm"),
col = "#eee", col.axis = "#eee", cex.axis = 0.75)
axis(2, col = "#eee", col.axis = "#eee", cex.axis = 0.75, las = 1)
abline(v = c(0,6,12,18,24), col = "#444", lty = 2, lwd = 0.8)
abline(v = mean(cat_hours), col = "#fff", lty = 2, lwd = 1.8)
text(x = mean(cat_hours) + 0.5,
y = max(hist(cat_hours, breaks = 0:24, plot = FALSE)$counts) * 0.92,
labels = paste0("mean: ", round(mean(cat_hours), 1), "h"),
col = "#fff", cex = 0.68, adj = 0)
}
plot.new()
legend("center", legend = offense_cats, fill = colors[seq_along(offense_cats)],
border = NA, bty = "n", cex = 0.88, text.col = "#eee",
title = "Offense Type", title.col = "#fff")Interpretation: The per-offense histograms provide granular resolution into the hourly rhythms of each crime type. Assault shows a pronounced right-skewed distribution with a long tail into late-night hours (mean ~15h). Burglary peaks sharply between 10am–2pm. Motor vehicle theft displays a bimodal pattern, a daytime peak and a secondary late-night peak, suggesting two distinct offender profiles: opportunistic thefts during the day and planned thefts at night. Homicide’s relatively flat distribution underscores the difficulty of predicting its occurrence by time alone.
Visualizing this dataset fundamentally changed the analytical perspective in several important ways. Raw tabular data, even when filtered to five offense types, makes it difficult to perceive the temporal rhythms and spatial clustering that define Detroit’s crime landscape. The interactive map immediately revealed that crime is not uniformly distributed across the city; instead, it concentrates in specific census blocks and corridors. This spatial concentration is consistent with Weisburd et al.’s (2004) finding that a small proportion of street segments account for the majority of crime in any given city.
The time-of-day and day-of-week charts made abstract statistical patterns viscerally concrete: it becomes obvious that policing assault on a Friday night at 11pm requires fundamentally different tactics than addressing burglary on a Tuesday morning. Without visualization, these patterns would remain buried in thousands of rows of incident data.
Perhaps most surprising, the box plot and histogram comparisons revealed that different offense types have distinctive temporal signatures, a finding with direct operational implications. If Detroit PD were to allocate patrol resources based solely on aggregate crime counts, they would likely underpolice daytime burglary and overpolice times when assault risk is actually lower.
Based on this analysis, several predictions can be made with important caveats about the limits of single-year, incident-level data.
What we can reasonably predict:
Assault incidents will spike on Friday and Saturday evenings between 9pm–2am, particularly in census blocks near entertainment districts. This prediction is robust because it is consistent across multiple independent lines of evidence (day-of-week, time-of-day, and spatial analyses).
Residential burglary will concentrate in weekday morning and afternoon hours in neighborhoods with lower residential density or higher vacancy rates, based on the temporal patterns observed.
Motor vehicle theft hot spots will persist in areas near transit hubs and commercial lots, consistent with environmental criminology’s emphasis on target availability.
What we cannot reliably predict:
Homicide is too rare and contextually complex (gang retaliation, domestic disputes, robbery gone wrong) to be predicted from temporal and spatial patterns alone. Prediction would require social network data, gang intelligence, and domestic violence history that is not present in the OCDB.
Year-over-year trends cannot be assessed from a single year of data. External shocks, economic downturns, policing policy changes, demographic shifts, can substantially alter crime trajectories in ways a single-year model cannot capture.
In sum, this dataset supports descriptive prediction (forecasting when and where past patterns will recur) but not causal prediction (explaining why crime occurs or what interventions will reduce it). Predictive policing tools built on data like this must be used cautiously to avoid reinforcing existing enforcement disparities (Brantingham & Brantingham, 1984).
This analysis of Detroit’s 2019 crime incident data reveals clear and actionable patterns in the spatial and temporal distribution of five major offense categories. Assault offenses dominate numerically and concentrate in evening and weekend hours; burglary follows a workday schedule targeting unoccupied residences; motor vehicle theft exhibits a distinctive bimodal hourly pattern; and homicide, while rare relative to other offenses, is spatially clustered in ways consistent with broader neighborhood disadvantage.
These findings are consistent with established criminological theory, particularly routine activity theory and environmental criminology, lending confidence to the analytical approach. The geocoded, standardized structure of the OCDB makes it well-suited for this type of exploratory spatial analysis, and Detroit’s inclusion in the database provides a meaningful case study given its historically elevated crime rates.
From a criminal justice policy perspective, the clearest implication is that resource allocation should be temporally and spatially targeted rather than uniform. Predictive deployment of officers to high-risk areas during high-risk time windows, informed by analyses like this one, can improve response efficiency while potentially reducing harm.
R’s functional approach to data manipulation made filtering,
grouping, and summarizing the dataset straightforward once the
dplyr syntax was understood. The pipe operator
(|>) allowed analysis steps to be chained together in a
readable, logical sequence that closely mirrors the analyst’s thought
process. The leaflet package made interactive geocoded
mapping accessible without requiring GIS software, which I thought would
have been a significant barrier to entry. R Markdown itself with the
integration of code, output, and narrative in a single reproducible
document, is genuinely powerful for putting together deliverables like
this. Once again, I would be Chief of Justice somewhere if I had these
tools years ago.
The learning curve was steeper than I expected in several areas.
Package dependency management proved to be a
significant source of friction: functions like comma() and
percent() from the scales package,
datatable() from DT, and operators like
%>% from dplyr each required explicit
loading, and the error messages were not always intuitive for a new user
such as myself. Data type mismatches, particularly the
factor-vs-character issue with offense_group, required
debugging that consumed a disproportionate amount of time relative to
the conceptual complexity of the problem. Windows-specific
toolchain requirements (Rtools) added an installation hurdle
not faced by Mac or Linux users, I’ve noticed. Finally, the
OCDB’s city naming conventions were undocumented in a
user-facing way, requiring trial and error to identify the correct
string format.
Despite these challenges, R’s ecosystem for crime data analysis, and
particularly the combination of crimedata,
leaflet, and dplyr, is remarkably capable once
the initial setup friction is resolved.
Brantingham, P. J., & Brantingham, P. L. (1984). Patterns in Crime. Macmillan.
Langton, S., & Steenbeek, W. (2017). Residential burglary target selection: An analysis at the property-level using Google Street View. Applied Geography, 86, 292–299. https://doi.org/10.1016/j.apgeog.2017.06.014
Sherman, L. W., Gartin, P. R., & Buerger, M. E. (1989). Hot spots of predatory crime: Routine activities and the criminology of place. Criminology, 27(1), 27–56.
Weisburd, D., Bushway, S., Lum, C., & Yang, S. M. (2004). Trajectories of crime at places: A longitudinal study of street segments in the city of Seattle. Criminology, 42(2), 283–322.
Open Crime Database. (2019). Crime Open Database (OCDB). Open Science Framework. https://osf.io/zyaqn/
Report generated with R 4.5.2 · crimedata ·
leaflet · leaflet.extras ·
dplyr