library(sf)
library(spdep)Hellenic Spatial Statistics Lab - A Spatial Statistics Primer
From Classical to Spatial Statistics: Neighborhoods, Weights, and k-NN
Hellenic Spatial Statistics Lab (HSSL)
The Hellenic Spatial Statistics Lab (HSSL) is an academic initiative dedicated to spatial econometrics and spatial data analysis, with a strong focus on applications in Greece and Europe. It was created to promote open, reproducible research using R and to connect advanced statistical methods with the broader field of regional science.
HSSL is closely connected to the book «Εισαγωγή στη Χωρική Οικονομετρία, Δούκισσας Λ. & Πανταζής Π., 2025» (in Greek) - “Introduction to Spatial Econometrics, Doukissas L & Pantazis P., 2025” (title in english) which is currently under publication. The Lab extends the book by providing online resources-interactive notes, reproducible R code, and case studies-so that theoretical concepts are always supported by practical demonstrations.
By linking spatial econometrics with regional development challenges, the HSSL aims to foster a community of scholars, students, and practitioners, while also contributing to policy debates on spatial inequality, smart specialization, and economic growth.
Από την Κλασική στη Χωρική Στατιστική: Η Έννοια του Χώρου στα Δεδομένα
Η Χωρική Στατιστική και ευρύτερα η Χωρική Ανάλυση αποτελούν τον κλάδο της στατιστικής και της οικονομετρίας που μελετά δεδομένα τα οποία φέρουν χωρική διάσταση∙ δηλαδή, παρατηρήσεις που δεν είναι ανεξάρτητες μεταξύ τους, αλλά συσχετίζονται ανάλογα με τη γεωγραφική τους θέση. Σε αντίθεση με την κλασική στατιστική, όπου η υπόθεση της ανεξαρτησίας ανάμεσα στις παρατηρήσεις θεωρείται θεμελιώδης, στη χωρική στατιστική το “πού” συμβαίνει ένα φαινόμενο είναι εξίσου σημαντικό με το “πόσο” ή το “πώς”. Η ειδοποιός διαφορά έγκειται ακριβώς στην αναγνώριση και ποσοτικοποίηση αυτής της χωρικής αλληλεξάρτησης, είτε μέσω της έννοιας της γειτνίασης (adjacency), είτε μέσω της χωρικής αυτοσυσχέτισης (spatial autocorrelation).
Συνοπτικά, η χωρική στατιστική καλείται να απαντήσει σε ερωτήματα όπως:
Υπάρχει χωρικό μοτίβο (clustering ή διάχυση) στα δεδομένα;
Πώς ορίζουμε και μετράμε τη γειτονιά (queen, rook, k-NN);
Ποιες είναι οι επιπτώσεις της χωρικής αυτοσυσχέτισης στους δείκτες, στις παλινδρομήσεις και στις προβλέψεις;
Με ποιον τρόπο μπορούμε να χρησιμοποιήσουμε τα χωρικά βάρη και τα μοντέλα (SAR, SEM, SDM, spatial panel) για να κατανοήσουμε καλύτερα οικονομικά, κοινωνικά ή περιβαλλοντικά φαινόμενα;
Έτσι, η Χωρική Στατιστική διαφοροποιείται από την κλασική στατιστική όχι επειδή χρησιμοποιεί διαφορετικά μαθηματικά εργαλεία, αλλά επειδή ενσωματώνει στον πυρήνα της ανάλυσης την τοποθεσία και τη γειτνίαση, καθιστώντας τον χώρο αναπόσπαστο μέρος της ερμηνείας και των συμπερασμάτων.
Χωρικές Γειτνιάσεις
Η ανάλυση χωρικών δεδομένων βασίζεται στην έννοια της γειτνίασης: πόσο «κοντά» βρίσκονται δύο χωρικές μονάδες μεταξύ τους.
Αυτό αποτυπώνεται με έναν πίνακα γειτνίασης ή πίνακα βαρών (W).
Ορισμός
Έστω (n) χωρικές μονάδες. Ορίζουμε έναν πίνακα:
\[ W = [w_{ij}], \quad i,j = 1,\dots,n \]
όπου:
- (w_{ij} = 1) αν η μονάδα (i) είναι γειτονική της (j),
- (w_{ij} = 0) διαφορετικά,
- με (w_{ii} = 0) (καμία μονάδα δεν είναι γείτονας του εαυτού της).
Είδη γειτνίασης
- Κοινά όρια (rook ή queen contiguity): δύο περιοχές είναι γείτονες αν μοιράζονται κοινό σύνορο (rook) ή ακόμη και κοινό σημείο (queen).
- Απόσταση (distance-based): οι περιοχές είναι γείτονες αν η μεταξύ τους απόσταση είναι μικρότερη από ένα κατώφλι.
- Κ-πλησιέστεροι γείτονες (k-nearest neighbors): κάθε περιοχή συνδέεται με τις (k) πιο κοντινές της.
Κανονικοποίηση
Συχνά χρησιμοποιούνται κανονικοποιήσεις για να εξασφαλίζεται συγκρισιμότητα:
Binary (B):
\[ w_{ij} = a_{ij} \] απλή ένδειξη γειτνίασης.Row-standardized (W):
\[ w_{ij} = \frac{a_{ij}}{\sum_j a_{ij}} \] κάθε γραμμή αθροίζει στο 1, ώστε οι τιμές να εκφράζουν σχετικό βάρος.Σημείωση
Ο πίνακας βαρών λειτουργεί σαν «χάρτης σχέσεων» μεταξύ περιοχών:
δείχνει ποιος επηρεάζει ποιον. Η μορφή της γειτνίασης καθορίζει το πώς η χωρική εξάρτηση θα αποτυπωθεί στη στατιστική ανάλυση και τα υποδείγματα.Queen vs Rook Contiguity:
Η έννοια της γειτνίασης είναι θεμελιώδης στη χωρική ανάλυση, καθώς καθορίζει πώς οι γεωγραφικές μονάδες “επικοινωνούν” μεταξύ τους. Υπάρχουν δύο βασικοί τρόποι ορισμού της γειτονίας: η queen contiguity και η rook contiguity.
Queen Contiguity
Στη queen contiguity, δύο γεωγραφικές περιοχές (πολύγωνα) θεωρούνται γείτονες όταν μοιράζονται είτε μια κοινή πλευρά είτε μια κοινή κορυφή (γωνία).
Ο όρος “queen” προέρχεται από τη βασίλισσα στο σκάκι, η οποία κινείται τόσο οριζόντια και κάθετα όσο και διαγώνια.
Στην πράξη, αυτός ο ορισμός δημιουργεί περισσότερους γείτονες για κάθε περιοχή, καθώς λαμβάνονται υπόψη και οι διαγώνιες επαφές.
Είναι χρήσιμος όταν μελετάμε φαινόμενα που μπορούν να “μεταδοθούν” ή να αλληλεπιδράσουν ακόμη και μέσω μιας απλής γωνιακής επαφής (π.χ. περιβαλλοντικοί ρύποι, επιδημίες).
Rook Contiguity
Στη rook contiguity, δύο περιοχές θεωρούνται γείτονες μόνο όταν μοιράζονται κοινή πλευρά.
Ο όρος “rook” προέρχεται από τον πύργο στο σκάκι, που κινείται μόνο οριζόντια ή κάθετα - ποτέ διαγώνια.
Αυτός ο ορισμός δημιουργεί λιγότερους γείτονες για κάθε περιοχή, αφού οι διαγώνιες επαφές αγνοούνται.
Είναι χρήσιμος όταν θέλουμε να αποτυπώσουμε πιο “στενές” ή αυστηρές χωρικές σχέσεις, όπου μόνο οι πραγματικές γειτονικές πλευρές μετρούν (π.χ. κοινά σύνορα μεταξύ δήμων ή χωρική διάχυση μέσω οδικών δικτύων).
Παράδειγμα σε πλέγμα 3x3
Για το κεντρικό κελί (στο μέσο του πλέγματος), με queen contiguity έχει 8 γείτονες (πάνω, κάτω, αριστερά, δεξιά, και τις 4 διαγώνιες).
Με rook contiguity, έχει μόνο 4 γείτονες (πάνω, κάτω, αριστερά, δεξιά).
Παράδειγμα γειτνίαση Queen
# Packages
# install.packages(c("sf","spdep"))
library(sf)
library(spdep)
# Βοηθητική συνάρτηση: τετράγωνο με κέντρο (cx, cy)
make_square <- function(cx, cy, half = 0.5) {
x1 <- cx - half; x2 <- cx + half
y1 <- cy - half; y2 <- cy + half
st_polygon(list(rbind(
c(x1,y1), c(x2,y1), c(x2,y2), c(x1,y2), c(x1,y1)
)))
}
# Δημιουργούμε 9 τετράγωνα σε πλέγμα 3x3
polys <- st_sfc(
make_square(0,0), make_square(1,0), make_square(2,0),
make_square(0,1), make_square(1,1), make_square(2,1),
make_square(0,2), make_square(1,2), make_square(2,2),
crs = 4326
)
grid <- st_sf(id = 1:9, geometry = polys)
# Queen contiguity
nb_queen <- poly2nb(grid, queen = TRUE)
# Σημεία για labels
lab_pts <- st_coordinates(st_point_on_surface(grid))
# Σχεδίαση
plot(st_geometry(grid), border="grey40", col=NA, lwd=2)
plot(nb_queen, lab_pts, add=TRUE, col="blue", lwd=2)
text(lab_pts, labels=grid$id, cex=1, font=2)
title("Queen contiguity (3x3 grid)")Παράδειγμα γειτνίασης Rook
# Βοηθητική συνάρτηση: τετράγωνο με κέντρο (cx, cy)
make_square <- function(cx, cy, half = 0.5) {
x1 <- cx - half; x2 <- cx + half
y1 <- cy - half; y2 <- cy + half
st_polygon(list(rbind(
c(x1,y1), c(x2,y1), c(x2,y2), c(x1,y2), c(x1,y1)
)))
}
# Δημιουργία 9 τετραγώνων σε πλέγμα 3x3
polys <- st_sfc(
make_square(0,0), make_square(1,0), make_square(2,0),
make_square(0,1), make_square(1,1), make_square(2,1),
make_square(0,2), make_square(1,2), make_square(2,2),
crs = 4326
)
grid <- st_sf(id = 1:9, geometry = polys)
# Rook contiguity (μόνο κοινή πλευρά)
nb_rook <- poly2nb(grid, queen = FALSE)
# Σημεία για labels
lab_pts <- st_coordinates(st_point_on_surface(grid))Warning: st_point_on_surface assumes attributes are constant over geometries
Warning in st_point_on_surface.sfc(st_geometry(x)): st_point_on_surface may not
give correct results for longitude/latitude data
# Σχεδίαση
plot(st_geometry(grid), border="grey40", col=NA, lwd=2)
plot(nb_rook, lab_pts, add=TRUE, col="red", lwd=2)
text(lab_pts, labels=grid$id, cex=1, font=2)
title("Rook contiguity (3x3 grid)")Διαφορά Queen vs Rook
Στο queen, κάθε κελί συνδέεται με όλα τα γειτονικά (και διαγώνια). Π.χ. το κεντρικό κελί (id=5) έχει 8 γείτονες.
Στο rook, κάθε κελί συνδέεται μόνο με όσα μοιράζονται πλευρά. Π.χ. το κεντρικό κελί (id=5) έχει 4 γείτονες (πάνω, κάτω, αριστερά, δεξιά).
Nearest Neighbors (NN)
Nearest Neighbors σημαίνει «πλησιέστεροι γείτονες». Σε ένα σύνολο από σημεία (ή περιοχές),
ο πλησιέστερος γείτονας ενός σημείου είναι εκείνο με τη μικρότερη απόσταση από αυτό.
Η γενίκευση k-Nearest Neighbors (k-NN) παίρνει τους k πιο κοντινούς γείτονες κάθε σημείου.
Χρησιμότητα στην χωρική ανάλυση
- Μας δίνει έναν φυσικό τρόπο γειτνίασης όταν δεν υπάρχουν κοινά σύνορα (π.χ. για σημεία).
- Κάθε μονάδα έχει περίπου τον ίδιο αριθμό γειτόνων (k), άρα πιο σταθερά βάρη.
- Με τα βάρη αυτά υπολογίζουμε μέσους όρους γειτόνων (π.χ. για εξομάλυνση ή διάχυση επιρροής).
Πώς μετράμε «κοντά»
- Επιλέγουμε μετρική απόστασης (π.χ. Ευκλείδεια σε επίπεδες συντεταγμένες, γεωδαιτική σε γεωγραφικές).
- Ορίζουμε το k (συνήθως μικρός αριθμός για «τοπική» γειτονιά).
Κατεύθυνση και συμμετρία
- Αρχικά είναι κατευθυνόμενο (Α θεωρεί τον Β γείτονα, όχι πάντα και το αντίστροφο).
- Συνήθως το κάνουμε συμμετρικό:
OR (αν υπάρχει σχέση προς μία τουλάχιστον κατεύθυνση) ή AND (μόνο αν είναι αμοιβαία).
Καλές πρακτικές
- Δοκιμάζουμε διαφορετικά k και ελέγχουμε διαγνωστικά (π.χ. Moran’s I).
- Mονάδες: διαφορετικές μονάδες μέτρησης επηρεάζουν τις αποστάσεις - κανονικοποιούμε όπου χρειάζεται.
- Ακριανά σημεία (edge effects) και ανομοιόμορφη πυκνότητα μπορεί να αλλοιώσουν τη γειτνίαση.
Παράδειγμα k-NN στην R (k = 1)
Ιδέα: 4 σημεία σε ευθεία, κάθε σημείο «βλέπει» τον 1 πιο κοντινό του γείτονα.
Έτσι ο πίνακας βαρών (W) μοιράζει όλο το βάρος στον 1 γείτονα (γραμμές αθροίζουν σε 1).
# 1) 4 σημεία σε ευθεία (x-άξονας) με άνισες αποστάσεις για να μην έχουμε ισοπαλίες
xpos <- c(0, 1, 3, 6) # P1=0, P2=1, P3=3, P4=6
names(xpos) <- paste0("P", 1:4)
k <- 1
n <- length(xpos)
# 2) Πίνακας αποστάσεων |xi - xj|
distmat <- abs(outer(xpos, xpos, "-"))
diag(distmat) <- Inf # αγνοούμε τον εαυτό
# 3) Για κάθε i, βρίσκουμε τον πλησιέστερο j (directed k-NN με k=1)
nn <- apply(distmat, 1, which.min)
# 4) Φτιάχνουμε τον directed πίνακα γειτνίασης A (a_ij = 1 αν j είναι ο πλησιέστερος του i)
A <- matrix(0, n, n, dimnames = list(names(xpos), names(xpos)))
for (i in 1:n) A[i, nn[i]] <- 1
# 5) Κανονικοποίηση γραμμών: εδώ W = A (κάθε γραμμή έχει ακριβώς ένα 1)
W <- A
# 6) Παράδειγμα τιμών ανά σημείο και υπολογισμός Wx (μέσος γειτόνων)
val <- c(10, 20, 30, 40); names(val) <- names(xpos)
Wx <- as.vector(W %*% val)
# 7) Επισκόπηση
cbind(val, Wx) # αρχική τιμή και τιμή «γειτονιάς» val Wx
P1 10 20
P2 20 10
P3 30 20
P4 40 30
# Θέσεις στον άξονα και τιμές
xpos <- c(0, 1, 3, 6); names(xpos) <- paste0("P", 1:4)
val <- c(10, 20, 30, 40); names(val) <- names(xpos)
# Πλησιέστερος γείτονας (k=1, directed)
distmat <- abs(outer(xpos, xpos, "-")); diag(distmat) <- Inf
nn <- apply(distmat, 1, which.min) # π.χ. c(2,1,2,3)
# Πίνακας βαρών W (ένα 1 ανά γραμμή)
W <- matrix(0, 4, 4, dimnames = list(names(xpos), names(xpos)))
for (i in 1:4) W[i, nn[i]] <- 1
# Υπολογισμός Wx (ίδιο με val[nn] όταν k=1)
Wx <- as.vector(W %*% val)
cbind(val, Wx) val Wx
P1 10 20
P2 20 10
P3 30 20
P4 40 30
Τι συμβαίνει εδώ:
Το P1 έχει πλησιέστερο το P2 → κοιτά μόνο την τιμή του P2.
Το P2 έχει πλησιέστερο το P1 → κοιτά μόνο την τιμή του P1.
Το P3 έχει πλησιέστερο το P2 → κοιτά μόνο την τιμή του P2.
Το P4 έχει πλησιέστερο το P3 → κοιτά μόνο την τιμή του P3.
Άρα, με τιμές val = (10, 20, 30, 40), το Wx επιστρέφει για κάθε σημείο την τιμή του 1 γείτονα του.
Ιδέα
Με k=1, κάθε σημείο κοιτά μόνο τον 1 πιο κοντινό του γείτονα.
Ο πίνακας βαρών \(W\) έχει 1 σε κάθε γραμμή (στη στήλη του πλησιέστερου γείτονα) και μηδενικά αλλού.
Στο παράδειγμά
Θέσεις (σε ευθεία): P1=0, P2=1, P3=3, P4=6
Πλησιέστερος:
P1 → P2
P2 → P1
P3 → P2
P4 → P3
Με τιμές val = (10, 20, 30, 40) ⇒
k-NN (k=1): Τιμές γειτόνων
Με τιμές = (10, 20, 30, 40)
\[ (Wx)_{P_1} = x_{P_2} = 20 \]
\[ (Wx)_{P_2} = x_{P_1} = 10 \]
\[ (Wx)_{P_3} = x_{P_2} = 20 \]
\[ (Wx)_{P_4} = x_{P_3} = 30 \]
## Δεδομένα: 4 σημεία στον x-άξονα (χωρίς ισοπαλίες)
# install.packages("ggplot2") # αν χρειάζεται
library(ggplot2)Warning: package 'ggplot2' was built under R version 4.2.3
library(grid) # arrow()
df <- data.frame(
id = paste0("P", 1:4),
x = c(0, 1, 3, 6),
y = 0
)
# πλησιέστερος γείτονας
distmat <- abs(outer(df$x, df$x, "-")); diag(distmat) <- Inf
nn <- apply(distmat, 1, which.min)
edges <- data.frame(
from = df$id,
to = df$id[nn],
x = df$x, y = df$y,
xend = df$x[nn], yend = df$y[nn]
)
p <- ggplot(df, aes(x, y)) +
geom_hline(yintercept = 0, color = "grey85") +
geom_point(size = 2) +
geom_text(aes(label = id), vjust = -1.1, size = 3) +
geom_segment(data = edges,
aes(x = x, y = y, xend = xend, yend = yend),
arrow = arrow(length = unit(2.5, "mm"), type = "closed")) +
scale_y_continuous(NULL, breaks = NULL) +
labs(x = "x", title = "k-NN (k=1): each point → nearest neighbor") +
coord_cartesian(ylim = c(-0.35, 0.35)) +
theme_minimal(base_size = 10) +
theme(plot.title = element_text(size = 10),
axis.title.x = element_text(size = 9),
panel.grid.minor = element_blank(),
panel.grid.major.y = element_blank())
pΣημείωση: Αν εφαρμόζαμε συμμετρικοποίηση (OR) πριν την κανονικοποίηση, τότε κάθε κόμβος με 2 γείτονες θα έπαιρνε μέσο όρο των δύο τιμών και τα αποτελέσματα θα ήταν διαφορετικά. Εδώ κρατάμε directed k=1, άρα Wx = «τιμή του 1 πλησιέστερου».
Βιβλιογραφία
- Anselin, L. (1988). Spatial Econometrics: Methods and Models. Dordrecht: Kluwer Academic.
- Bivand, R. S., Pebesma, E., & Gómez-Rubio, V. (2013). Applied Spatial Data Analysis with R (2nd ed.). New York: Springer.
- Cliff, A. D., & Ord, J. K. (1981). Spatial Processes: Models & Applications. London: Pion.
- Cressie, N. (1993). Statistics for Spatial Data (Revised ed.). New York: Wiley.
- Kopczewska, K. (Ed.). (2021). Applied Spatial Statistics and Econometrics: Data Analysis in R. London & New York: Routledge.
- LeSage, J. P., & Pace, R. K. (2009). Introduction to Spatial Econometrics. Boca Raton: CRC Press.
Άδεια / Αναδημοσίευση
© 2025 Doukissas Leonidas, Pantazis Panagiotis, Psycharis Yannis, Politis Konstantinos.
Κείμενο: Διατίθεται με άδεια Creative Commons CC BY 4.0.
Μπορείτε να αναδιανείμετε και να προσαρμόσετε, με αναφορά στους δημιουργούς.
Άδεια: https://creativecommons.org/licenses/by/4.0/
Κώδικας R: MIT License (ελεύθερη χρήση, τροποποίηση, αναδιανομή με αναφορά).
Άδεια: https://opensource.org/licenses/MIT
Δεδομένα/Εικόνες τρίτων: Παραμένουν στις αρχικές τους άδειες.
Για χρήσεις πέραν των παραπάνω, επικοινωνήστε: leondoukissas@gmail.com.
Προτεινόμενη αναφορά:
Doukissas, L., Pantazis, P., Psycharis, Y., & Politis, K. (2025). Hellenic Spatial Statistics Lab – HSSL. RPubs. Διαθέσιμο στο: https://rpubs.com/LeonidasD/1338607