Kiosk density in Germany
By Lukas
In a recent article I read about the “Kiosk-Kultur” in Germany and the impact COVID-19 has on the sector.
That motivated me to have a closer look on where in Germany the in the article mentioned 23.500 “Kioske” are located and how the relation of population to number of kiosks spreads across Germany.
I will use {osmdata} and the {eurostat} R package to retrieve the Kiosk locations and NUTS3 boundaries as well as the population density. Please note, that the query to retrieve the kiosk data takes some time.
library(osmdata)
library(viridis)
library(showtext)
library(tidyverse)
library(dplyr)
library(sf)
library(eurostat)
#looking for density dataset on eurostat
search_eurostat("density") %>%
pull(code)
## [1] "demo_r_d3dens" "met_d3dens" "urt_d3dens" "orch_apples3"
## [5] "orch_peach3" "orch_oranges3" "orch_olives3" "orch_grapes3"
## [9] "orch_apples2" "orch_peach2" "orch_oranges2" "orch_olives2"
## [13] "orch_grapes2" "demo_r_d3dens" "orch_apples3" "orch_peach3"
## [17] "orch_oranges3" "orch_olives3" "orch_grapes3" "orch_apples2"
## [21] "orch_peach2" "orch_oranges2" "orch_olives2" "orch_grapes2"
#get NUTS3 for germany
germany_nuts3 <- get_eurostat_geospatial(output_class = "sf", nuts_level = "3") %>%
filter(CNTR_CODE == "DE")
#filter density dataset for German NUTS3
germany_pop_density <- get_eurostat(id = "demo_r_d3dens") %>%
filter(lubridate::year(time) == 2018 & geo %in% germany_nuts3$geo) %>%
rename(pop_density = values)
#create query via osmdata package
germany_bbox <- osmdata::getbb(place_name = "Germany", featuretype = "country")
germany_poly <- osmdata::getbb(place_name = "Germany", featuretype = "country", format_out = "polygon", limit = 1)
q <- opq(bbox = germany_bbox, timeout = 600) %>%
add_osm_feature(key = 'shop', value = 'kiosk')
#run the query
germany_kiosk <- osmdata_sf(q)
#trim osmdata:
germany_kiosk_trimmed <- germany_kiosk %>% trim_osmdata(bb_poly = germany_poly,exclude = TRUE)
germany_kiosk_trimmed <- germany_kiosk_trimmed$osm_points %>% select(osm_id)
After loading the data from OSM and Eurostat I count the number of “Kioske” per NUTS3 polygon and ad it to the sf object.
Further I calculate the ratio between kiosk density and population density to figure out how many kiosks there are in relation to the population.
#counting number of kioske in each NUTS3
germany_nuts3$kiosk_count <- lengths(sf::st_intersects(germany_nuts3, germany_kiosk_trimmed))
germany_nuts3$area <- sf::st_area(germany_nuts3)
germany_nuts3 <- germany_nuts3 %>% mutate(kiosk_density = kiosk_count/area) %>%
left_join(germany_pop_density %>% select(geo, pop_density)) %>%
mutate(kiosk_to_pop_density = kiosk_density/pop_density)
germany_nuts3 %>%
ggplot(aes(fill=kiosk_count))+
geom_sf()+
theme_void()+
scale_fill_viridis()+
coord_sf()+
theme(plot.background = element_rect(fill = "transparent",colour = NA),
panel.background = element_rect(fill = "transparent", color = NA),
legend.background = element_rect(fill = "transparent", color = NA),
text = element_text(size = 10),
legend.title = element_blank(),
legend.position = c(0, 0.12))+
labs(title = 'Number of "Kioske" per NUTS3 in Germany', caption = "Source: OpenStreetMap, eurostat")
germany_nuts3 %>%
ggplot(aes(fill=as.numeric(kiosk_to_pop_density)))+
geom_sf()+
theme_void()+
scale_fill_viridis()+
theme(plot.background = element_rect(fill = "transparent",colour = NA),
panel.background = element_rect(fill = "transparent", color = NA),
legend.background = element_rect(fill = "transparent", color = NA),
text = element_text(size = 10),
legend.title = element_blank(),
legend.position = c(0, 0.12))+
labs(title = 'Ratio of kiosk density to population density', caption = "Source: OpenStreetMap, eurostat")