library(sf)
Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is TRUE
# dane punktowe
= read_sf("data/przestepstwa_2019.gpkg")
p2019 #granica miasta Poznań
= read_sf("data/pzn_borders.gpkg") pzn
Analiza rozkładu przestrzennego danych punktowych ma na celu określenie w jaki sposób obiekty/zdarzenia są rozmieszczone w przestrzeni.
Statystyki centrograficzne stanowią przestrzenną modyfikację statystyk opisowych w klasycznej statystyce. Są podstawową formą opisu rozkładu przestrzennego danych punktowych. Do statystyk centrograficznych zalicza się:
Żródło: https://mgimond.github.io/Spatial/chp11_0.html#centrography
Metody oparte na analizie intensywności analizują rozkład przestrzenny punktów pod względem badanego obszaru.
intensywność zdarzenia (event) jest stała dla całego obszaru
intensywność zmienia się wraz z lokalizacją
Metody oparte na odległości wykorzystują informację o odległości między każdą lokalizacją pomiaru/obserwacji, a najbliższym innym pomiarem/obserwacją.
statystyki najbliższego sąsiada - wykorzystywane do określenia rozkładu odległości pomiędzy każdą lokalizacją pomiaru/obserwacji, a najbliższym innym pomiarem/obserwacją;
funkcja G - podsumowuje rozkład odległości do najbliższego sąsiada w postaci dystrybuanty, wykorzystywana do porównania odległości teoretycznych wynikających z losowego rozkładu punktów z odległościami empirycznymi obliczonymi na podstawie danych;
funkcja K Ripley’a - wykorzystywana do porównania odległości teoretycznych wynikających z losowego rozkładu punktów z odległościami empirycznymi obliczonymi na podstawie danych;
wskaźnik Clarka-Evansa (1954) - stosunek między rzeczywistą średnią odległością od najbliższego sąsiada, a oczekiwaną dla rozkładu losowego.
sfdep
Pakiet sfdep
pozwala na obliczanie różnych statystyk centrograficznych w oparciu o dane punktowe wczytane za pomocą pakietu sf
:
center_mean()
- średnia centralnastd_distance()
- odległość standardowastd_dev_ellipse()
- elipsa odchylenia standardowegospatstat
Pakiet spatstat
dostarcza szeregu funkcji do analizy rozkładu danych punktowych w R. Wzór punktowy w pakiecie spatstat
jest obiektem klasy ppp (plannar point pattern). Wiele funkcji z pakietu wymaga zdefiniowania także obszaru analizy (tzw. okna, window).
Pakiet spatstat
zawiera funkcje pozwalające na zastosowanie:
metod opartych na analizie intensywności:
as.ppp
- konwertuje dane na obiekty klasy ppp. Wymaga podania obiektu oraz określenia obszaru analizy.as.owin
- tworzy okno (window) na podstawie innego obiektu (np. granic miasta Poznania)metod opartych na odległości
pairdist()
- zwraca macierz z odległościami między wszystkimi parami punktów w zbiorze danychnndist()
- zwraca wektor odległości od punktu do najbliżego sąsiada; odległości te są uzyskiwane przez sortowanie odległości między parami punktów i wybierana jest minimalna wartości dla każdego punktudistmap()
- oblicza odległość od każdej komórki do najbliższego punktu i zwraca mapę rastrową.clarkevans()
- obliczenie wskaźnika Clarka-EvansaGest()
- obliczenie funkcji GKest()
- obliczenie funkcji K Ripley’aenvelope()
- estowania hipotezy zerowej dla funkcji G, K Ripley’aquadratcount()
- test zliczania w kwadratachW przykładzie 1 wykorzystano dane dotyczące przestępczości w Poznaniu (plik przestepstwa_2019.gpkg) wraz z granicą miasta Poznania (plik pzn_borders.gpkg). Do podsumowania rozkładu przestępczości wykorzystano statystyki centrograficzne. Plik przestepstwa_2019.gpkg
zawiera tylko kolumnę geom bez dodatkowych atrybutów.
library(sf)
Linking to GEOS 3.10.2, GDAL 3.4.1, PROJ 8.2.1; sf_use_s2() is TRUE
# dane punktowe
= read_sf("data/przestepstwa_2019.gpkg")
p2019 #granica miasta Poznań
= read_sf("data/pzn_borders.gpkg") pzn
head(p2019)
Simple feature collection with 6 features and 0 fields
Geometry type: POINT
Dimension: XY
Bounding box: xmin: 353099.3 ymin: 503305.9 xmax: 361715.2 ymax: 510415
Projected CRS: ETRF2000-PL / CS92
# A tibble: 6 × 1
geom
<POINT [m]>
1 (361379.5 503546.3)
2 (361691.3 503694.6)
3 (360347.3 506216)
4 (353099.3 504204.1)
5 (361715.2 503305.9)
6 (360260.9 510415)
library(tmap)
tm_shape(pzn) +
tm_borders() +
tm_shape(p2019) +
tm_dots()
Statystyki centrograficzne (średnia centralna, odległość standardowa) mogą być obliczone na podstawie ramki danych zawierającej współrzędne x oraz y.
Funkcja st_coordinates()
z pakietu sf
pozwala na wydobycie współrzędnych z obiektu punktowego klasy sf
oraz stworzenie ramki danych zawierającej dwie kolumny: x oraz y.
library(sf)
= st_coordinates(p2019)
p2019_coords head(p2019_coords)
X Y
[1,] 361379.5 503546.3
[2,] 361691.3 503694.6
[3,] 360347.3 506216.0
[4,] 353099.3 504204.1
[5,] 361715.2 503305.9
[6,] 360260.9 510415.0
Średnia centralna wyznaczona jest przez punkt o współrzędnych \(\overline{x_c}\), \(\overline{y_c}\). Średnia centralna obliczana jest jako średnia arytmetyczna współrzędnych x oraz y.
\[\overline{x_c} = \frac{\sum_{i=1}^{n} x_i}{n}\]
\[\overline{y_c} = \frac{\sum_{i=1}^{n} y_i}{n}\]
Średnią centralną obliczamy poprzez wyliczenie średniej wartości dla kolumny X oraz Y.
# mean center
= apply(p2019_coords, 2, mean)
mc mc
X Y
358716.4 506363.5
Odległość standardowa określa średnią odległość puntków (\(x_{i}\), \(y_{i}\)) od punktu centralnego (centroidu, (\(\overline{x_c}\), \(\overline{y_c}\))) i obliczana jest wg wzoru:
\[d = \sqrt{\frac{\sum_{i=1}^{n} d_{ic}^2}{n}}\]
\[d_{ic}^2 = (x_i - \overline{x_c})^2 + (y_i - \overline{y_c})^2 \]
W powyższym wzorze
# standard distance
= sqrt(sum((p2019_coords[,1] - mc[1])^2 + (p2019_coords[,2] - mc[2])^2) / nrow(p2019_coords))
sd sd
[1] 3886.935
Wizualizacja średniej centralnej wymaga utworzenia obiektu przestrzennego w oparciu o współrzędne punktu. W tym celu wykorzystanie zostanie funkcja st_point()
oraz st_sfc()
z pakietu sf
.
#Przekształcenie obiektu mc na obiekt przestrzenny klasy sfc_POINT
= st_sfc(st_point(mc), crs = st_crs(p2019)) mc_point
plot(mc_point)
Odległość standardowa graficznie przedstawiana jest jako koło o środku w punkcie wyznaczonym przez średnią centralną oraz promieniu równym odległości standardowej. Do stworzenia obiektu przestrzennego przedstawiającego zasięg odległości standardowej wykorzystana zostanie funkcja st_buffer()
z pakietu sf
.
#wyznaczenie strefy buforowej wokół średniej centralnej o promieniu równym odległości standardowej
= st_buffer(mc_point, sd) sd_buffer
tm_shape(pzn) +
tm_borders() +
tm_shape(p2019) +
tm_dots() +
tm_shape(mc_point) +
tm_symbols(fill = "red") +
tm_shape(sd_buffer) +
tm_borders(col = "red", lwd = 2)
Statystyki centrograficzne w R można wyznaczyć używając funkcji z pakietu sfdep
:
center_mean()
- średnia centralnalibrary(pracma)
library(sfdep)
#srednia centralna
= center_mean(p2019) mc_point2
std_distance()
- odległość standardowalibrary(pracma)
library(sfdep)
# odległość standardowa
= std_distance(p2019) #zwraca wartość z odległością
sd2 = st_buffer(mc_point2, sd2) #zwraca obiekt przestrzenny sd2_buffer
std_dev_ellipse()
- elipsa odchylenia standardowegolibrary(pracma)
library(sfdep)
# funkcja std_dev_ellipse zwraca parametry elipsy, st_ellipse tworzy na ich podstawie obiekt liniowy
= std_dev_ellipse(p2019)
p2019_e = st_ellipse(p2019_e, sx = p2019_e$sx, sy = p2019_e$sy) p2019_e
tm_shape(pzn) +
tm_borders() +
tm_shape(p2019) +
tm_dots() +
tm_shape(mc_point) +
tm_dots(fill = "red", size = 2) +
tm_shape(sd2_buffer) +
tm_borders(col = "red", lwd = 3) +
tm_shape(p2019_e) +
tm_lines(col = "darkgreen", lwd = 3)
W drugim przykładzie wykorzystano dane pozyskane z BDOT10k z warstwy przedstawiającej budynki (OT_BUBD_A) oraz granice administracyjne (OT_ADJA_A) do przeanalizowania rozkładu przestrzennego szkół podstawowych w Poznaniu.
Granica miasta Pozania została pozyskana z warstwy OT_ADJA_A.
= read_sf("data/bdot10k/PL.PZGiK.308.BDOT10k.3064__OT_ADJA_A.gpkg")
granica = granica[granica$RODZAJ == "powiat", "geometria"] granica
Warstwa OT_BUBD_A jest warstwą poligonową zawierającą różne typy budynków.
<- read_sf("data/bdot10k/PL.PZGiK.308.BDOT10k.3064__OT_BUBD_A.gpkg") budynki
head(budynki)
Simple feature collection with 6 features and 19 fields
Geometry type: POLYGON
Dimension: XY
Bounding box: xmin: 359155.6 ymin: 500467.5 xmax: 362596.6 ymax: 502295.9
Projected CRS: ETRF2000-PL / CS92
# A tibble: 6 × 20
TERYT LOKALNYID PRZESTRZENNAZW WERSJA POCZATEKWERSJIOBIEKTU
<chr> <chr> <chr> <dttm> <dttm>
1 3064 3c25a636-5303-… PL.PZGiK.308.… 2023-12-31 12:00:00 2023-12-31 12:00:00
2 3064 12e66037-0d58-… PL.PZGiK.308.… 2023-12-31 12:00:00 2023-12-31 12:00:00
3 3064 021dfd88-65df-… PL.PZGiK.308.… 2023-12-31 12:00:00 2023-12-31 12:00:00
4 3064 5b5acb18-3c3a-… PL.PZGiK.308.… 2023-12-31 12:00:00 2023-12-31 12:00:00
5 3064 a4b459f2-551c-… PL.PZGiK.308.… 2023-12-31 12:00:00 2023-12-31 12:00:00
6 3064 3fddfa4f-6f68-… PL.PZGiK.308.… 2023-12-31 12:00:00 2023-12-31 12:00:00
# ℹ 15 more variables: OZNACZENIEZMIANY <chr>,
# ZRODLODANYCHGEOMETRYCZNYCH <chr>, KATEGORIAISTNIENIA <chr>, UWAGI <chr>,
# INFORMACJADODATKOWA <chr>, KODKARTO10K <chr>, SKROTKARTOGRAFICZNY <chr>,
# KODKST <chr>, FUNKCJAOGOLNABUDYNKU <chr>, PRZEWAZAJACAFUNKCJABUDYNKU <chr>,
# LICZBAKONDYGNACJI <dbl>, NAZWA <chr>, FSBUD <chr>, IDEGIB <chr>,
# geometria <POLYGON [m]>
Informacje o typach budynków zapisane są w dwóch kolumnach: FUNKCJAOGOLNABUDYNKU oraz PRZEWAZAJACAFUNKCJABUDYNKU.
unique(budynki$FUNKCJAOGOLNABUDYNKU)
[1] "budynki szpitali i inne budynki opieki zdrowotnej"
[2] "budynki transportu i łączności"
[3] "budynki mieszkalne"
[4] "budynki produkcyjne, usługowe i gospodarcze dla rolnictwa"
[5] "zbiorniki, silosy i budynki magazynowe"
[6] "budynki przemysłowe"
[7] "budynki oświaty, nauki i kultury oraz budynki sportowe"
[8] "budynki handlowo-usługowe"
[9] "pozostałe budynki niemieszkalne"
[10] "budynki biurowe"
= unique(budynki$PRZEWAZAJACAFUNKCJABUDYNKU) funcja_szczegolowa_budynku
Szkoły podstawowe to kategoria określona jako przeważająca funkcja budynku (kolumna PRZEWAZAJACAFUNKCJABUDYNKU).
= budynki[budynki$PRZEWAZAJACAFUNKCJABUDYNKU%in%c("szkoła podstawowa"),] szkoly_podstawowe
Warstwa BUBD_A jest warstwą poligonową. Aby zamienić budynki (poligony) na punkty należy użyć funkcji st_centroid()
z pakietu sf
.
= st_centroid(szkoly_podstawowe[, "geometria"]) szkoly_pkt
st_write(szkoly_pkt, dsn = "data/out_poznan_szkoly.gpkg", layer = "szkoly", delete_dsn = TRUE)
Deleting source `data/out_poznan_szkoly.gpkg' using driver `GPKG'
Writing layer `szkoly' to data source
`data/out_poznan_szkoly.gpkg' using driver `GPKG'
Writing 84 features with 0 fields and geometry type Point.
st_write(granica, dsn = "data/out_poznan_szkoly.gpkg", layer = "granica")
Writing layer `granica' to data source
`data/out_poznan_szkoly.gpkg' using driver `GPKG'
Writing 1 features with 0 fields and geometry type Polygon.
Do wizualizacji lokalizacji szkół podstawowych w mieście Poznań wykorzystano pakiet tmap()
.
library(tmap)
tm_shape(granica) +
tm_borders(col = "black") +
tm_shape(szkoly_pkt) +
tm_dots(col = "black", size = 0.7)
Wykorzystując funkcje z pakietu sfdep
zostały obliczone statystyki centrograficzne: średnia centralna (funkcja center_mean()
), odległość standardowa (funkcja std_distance()
), elipsa odchylenia standardowego (std_dev_ellipse()
).
library(pracma)
library(sfdep)
#srednia centralna
= center_mean(szkoly_pkt)
mc_point2
# odległość standardowa
= std_distance(szkoly_pkt) #zwraca wartość z odległością
sd2 = st_buffer(mc_point2, sd2) #zwraca obiekt przestrzenny
sd2_buffer
# funkcja std_dev_ellipse zwraca parametry elipsy, st_ellipse tworzy na ich podstawie obiekt liniowy
= std_dev_ellipse(szkoly_pkt)
szkoly_pkt_e = st_ellipse(szkoly_pkt_e, sx = szkoly_pkt_e$sx, sy = szkoly_pkt_e$sy) szkoly_pkt_e
tm_shape(granica) +
tm_borders(col = "black") +
tm_shape(szkoly_pkt) +
tm_dots(fill = "black", size = 0.7) +
tm_shape(mc_point2) +
tm_dots(fill = "red", size = 2) +
tm_shape(sd2_buffer) +
tm_borders(col = "red", lwd = 3) +
tm_shape(szkoly_pkt_e) +
tm_lines(col = "darkgreen", lwd = 3)