knitr::opts_chunk$set(warning = FALSE, message = FALSE)Praktikum 2: Eksplorasi Data Titik
Analisis Eksplorasi Data Point Pattern
Data titik adalah representasi objek spasial berdimensi nol yang menyatakan lokasi suatu kejadian atau entitas dalam ruang koordinat (x, y), di mana kumpulan titik-titik tersebut membentuk pola sebaran (point pattern) yang dapat dianalisis secara statistik untuk mengidentifikasi karakteristik distribusi spasialnya — seperti clustering, dispersi, atau keacakan (CSR).
Contoh fenomena yang dapat direpresentasikan sebagai data titik antara lain:
Lokasi pohon atau tanaman
Titik panas dan titik kebakaran hutan
Lokasi penderita suatu penyakit
Lokasi kejadian kriminal
Titik sekolah, rumah sakit, minimarket
Titik epicentrum gempa bumi
dsb.
Ada tiga pola titik:
Random (Acak) : setiap titik mempunyai peluang yang sama untuk menduduki suatu ruang dan tidak dipengaruhi oleh titik yang lain
Regular/Uniform : Titik-titik tersebar dengan jarak yang relatif merata, sehingga cenderung saling menjauh
Agregated/Cluster (bergerombol) : Banyak titik terkonsentrasi menduduki pada ruang yang sama, dan ruang yang lain sangat sedikit ditempati oleh titik
Identifikasi Pola Titik
Identifikasi pola titik spasial dapat dilakukan dengan berbagai pendekatan.
Beberapa metode yang umum digunakan adalah metode kuadran , Empirical K-Function (Ripley’s K Function) dan Kernel Density Estimator (KDE).
Ketiga metode ini memiliki keunggulan masing-masing dalam mendeteksi apakah pola titik cenderung acak, seragam, atau mengelompok.
1. Metode Kuadran
Salah satu cara awal untuk menganalisis pola titik spasial adalah dengan metode kuadran.
Metode ini sederhana namun cukup efektif untuk memperoleh gambaran awal apakah titik-titik tersebar secara acak, seragam, atau mengelompok.
Langkah-langkah metode kuadran adalah:
Membagi daerah studi menjadi beberapa sel dengan ukuran yang sama. Ukuran sel ditentukan berdasarkan skala yang diinginkan.
Menghitung rata-rata banyaknya titik per sel.
Menghitung ragam (variance) banyaknya titik per sel.
Menghitung perbandingan ragam dengan rata-rata (Variance-to-Mean Ratio / VMR)
Keterangan Interpretasi nilai Variance-to-Mean Ratio (VMR) adalah sebagai berikut:
- VMR = 0 → Titik menyebar seragam (uniform / sistematik)
- VMR = 1 → Titik menyebar secara acak/random
- VMR > 1 → Titik cenderung mengelompok (clustered)
Hipotesis :
Aplikasi pada R
Sebagai ilustrasi, berikut digunakan dataset swedishpines dari paket spatstat. Dataset ini sering digunakan untuk contoh analisis pola titik spasial karena bentuknya sederhana namun tetap merepresentasikan fenomena nyata di lapangan.
Deskripsi: Data ini memberikan lokasi anakan/biji pohon pinus di sebuah hutan di Swedia.
Penggunaan : data(swedishpines)
Format: Sebuah objek berkelas "ppp"(Planar Point Pattern) yang merepresentasikan pola titik dari lokasi pohon dalam plot persegi panjang berukuran 9,6×10 meter.
Planar point pattern adalah pola titik yang terletak pada bidang datar dua dimensi (2D plane) yaitu kumpulan lokasi kejadian yang koordinatnya dinyatakan dalam sistem (x, y) pada ruang Euclidean datar, bukan pada permukaan bumi yang melengkung.
library(spatstat)
data(swedishpines)X <- swedishpines
plot(X, main = "Swedishpines")
axis(1)
axis(2)summary(X)Planar point pattern: 71 points
Average intensity 0.007395833 points per square unit (one unit = 0.1 metres)
Coordinates are integers
i.e. rounded to the nearest unit (one unit = 0.1 metres)
Window: rectangle = [0, 96] x [0, 100] units
Window area = 9600 square units
Unit of length: 0.1 metres
Dalam analisis pola titik spasial, fungsi quadratcount() dari paket spatstat digunakan untuk membagi jendela pengamatan (window) menjadi grid berbentuk nx × ny kuadrat dengan ukuran yang sama.
Setelah grid terbentuk, fungsi ini akan menghitung jumlah titik yang jatuh ke dalam masing-masing kuadrat.
Dengan cara ini, kita dapat mengevaluasi variasi distribusi titik di seluruh area studi.
Hasil perhitungan dapat dijadikan dasar untuk analisis lebih lanjut, misalnya menghitung VMR (Variance-to-Mean Ratio) untuk menguji pola sebaran titik.
q <- quadratcount(X, nx = 4, ny = 3)
q x
y [0,24] (24,48] (48,72] (72,96]
(66.7,100] 7 3 6 5
(33.3,66.7] 5 9 7 7
[0,33.3] 4 3 6 9
plot(X)
axis(1)
axis(2)
plot(q, add = TRUE, cex = 1.5)mu <- mean(q)
sigma <- sd(q)^2
VMR <- sigma/mu
VMR[1] 0.6901408
Nilai VMR = 0.690 pada contoh sebelumnya memberikan indikasi awal bahwa titik-titik cenderung menyebar seragam (uniform).
Namun, untuk memastikan hal ini secara statistik, kita dapat menggunakan fungsi quadrat.test() dari paket spatstat.
Pilihan Hipotesis Alternatif
alternative = "two.sided"H0 : Titik menyebar acak
H1 : Titik tidak acak (bisa uniform atau cluster)
alternative = "regular"H0 : Titik menyebar acak atau cluster
H1 : Titik menyebar seragam (uniform)
alternative = "clustered"H0 : Titik menyebar acak atau uniform
H1 : Titik menyebar mengelompok (cluster)
Metode Uji
Secara default, quadrat.test() menggunakan pendekatan Chi-Square test (method = "Chisq").
Namun, dapat juga dilakukan uji berbasis Monte Carlo (method = "MonteCarlo") untuk hasil yang lebih robust, terutama pada data dengan ukuran sampel kecil.
quadrat.test(q)
Chi-squared test of CSR using quadrat counts
data:
X2 = 7.5915, df = 11, p-value = 0.5013
alternative hypothesis: two.sided
Quadrats: 4 by 3 grid of tiles
quadrat.test(q, alt = "regular")
Chi-squared test of CSR using quadrat counts
data:
X2 = 7.5915, df = 11, p-value = 0.2506
alternative hypothesis: regular
Quadrats: 4 by 3 grid of tiles
quadrat.test(q, alt = "clustered")
Chi-squared test of CSR using quadrat counts
data:
X2 = 7.5915, df = 11, p-value = 0.7494
alternative hypothesis: clustered
Quadrats: 4 by 3 grid of tiles
Apa Kesimpulan Anda?
2. Kernel Density Estimation (KDE)
den <- density(x = X, sigma = 10) #bandwith
summary(den)real-valued pixel image
128 x 128 pixel array (ny, nx)
enclosing rectangle: [0, 96] x [0, 100] units (one unit = 0.1 metres)
dimensions of each pixel: 0.75 x 0.78125 units
(one unit = 0.1 metres)
Image is defined on the full rectangular grid
Frame area = 9600 square units
Pixel values
range = [0.001841662, 0.0156937]
integral = 71.01604
mean = 0.007397504
Sigma adalah bandwidth parameter yang mengontrol seberapa lebar/halus kernel yang digunakan untuk “menyebarkan” pengaruh setiap titik ke area sekitarnya.
plot(den, main = "Intensity")
contour(den, add = TRUE) # contour plotPola ini mengindikasikan bahwa sebaran pohon pinus tidak merata (heterogen) di seluruh area studi, dengan kecenderungan mengelompok (clustered) pada beberapa lokasi spesifik
3. Empirical K-Function
Fungsi K (Ripley’s K Function) merupakan salah satu alat eksplorasi penting dalam analisis pola titik spasial.
Fungsi ini digunakan untuk menilai tingkat ketergantungan antar lokasi pada berbagai jarak .
Secara intuitif, Fungsi K menghitung jumlah rata-rata titik lain yang berada dalam radius dari sebuah titik, kemudian membandingkannya dengan ekspektasi apabila pola sebaran mengikuti Complete Spatial Randomness (CSR).
Interpretasi
Jika kurva K(r) mendekati garis CSR → pola titik acak.
Jika kurva K(r) berada di atas garis CSR → pola cenderung mengelompok (clustered).
Jika kurva K(r) berada di bawah garis CSR → pola cenderung seragam (regular/uniform).
Misal contoh data yang membentuk pola selain acak/random adalah dataset longleaf
nn <- nndist(longleaf)
hist(nn)K<- Kest(longleaf, correction="Ripley")
plot(K)Z<-envelope(longleaf,Kest, nsim=99)Generating 99 simulations of CSR ...
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
99.
Done.
plot(Z)mad.test() adalah fungsi di package spatstat untuk melakukan Monte Carlo testmenggunakan MAD (Maximum Absolute Deviation) — biasanya dipakai untuk menguji apakah pola titik sesuai dengan CSR (Complete Spatial Randomness) atau model tertentu.
Hipotesis:
alternative = "two.sided"menguji 𝐻0: Titik menyebar acak vs 𝐻1: Titik tidak menyebar acak (uniform atau kluster)alternative = "less"menguji 𝐻0: Titik menyebar acak atau kluster vs 𝐻1: Titik menyebar uniformalternative = "greater"menguji 𝐻0: Titik menyebar acak atau uniform vs 𝐻1: Titik menyebar kluster
mad.test(longleaf, Kest, nsim=99, alternative="two.sided")Generating 99 simulations of CSR ...
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
99.
Done.
Maximum absolute deviation test of CSR
Monte Carlo test based on 99 simulations
Summary function: K(r)
Reference function: theoretical
Alternative: two.sided
Interval of distance values: [0, 50] metres
Test statistic: Maximum absolute deviation
Deviation = observed minus theoretical
data: longleaf
mad = 1020.7, rank = 1, p-value = 0.01
Penerapan pada Studi Kasus
a. Load Libraries
library(tidyverse)
library(sf)
library(rnaturalearth)
library(ggspatial)
library(spatstat)
library(viridis)b. Persiapan Data
Data yang digunakan adalah Titik Panas di Kalimantan Tengah yang bersumber dari SIPONGI KEMENHUT (https://sipongi.gakkum.kehutanan.go.id/sebaran-titik-panas). Opsi yang dipilih adalah periode “24 Jam” (tanggal akses 25 Agustus 2026 22:06), artinya data di tabel hanya menampilkan titik panas yang terdeteksi oleh satelit dalam 24 jam terakhir (1 hari ke belakang dari saat ini). Satelit berupa NASA-MODIS, NASA-NOAA20, dan NASA-SNPP. Dalam hal ini, yang digunakan sebagai contoh adalah untuk semua tingkat kepercayaan (High, Medium, Low).
setwd("/Users/rositariarusesta/Documents/Regresi Spasial")
df_raw <- read.csv2('sebaran-hotspot.csv',sep=";")
df_kalimantan <- df_raw %>%
filter(Provinsi %in% c("Kalimantan Tengah"))
# Mengubah dataframe menjadi objek spasial (sf) dan ditransformasikan ke UTM Zona 49S
df_sf <- st_as_sf(df_kalimantan, coords = c("Longitude", "Latitude"), crs = 4326) %>%
st_transform(crs = 32749)
# Ringkasan Data
class(df_sf)[1] "sf" "data.frame"
head(df_sf)Simple feature collection with 6 features and 8 fields
Geometry type: POINT
Dimension: XY
Bounding box: xmin: 910108.4 ymin: 9736889 xmax: 939820 ymax: 9813236
Projected CRS: WGS 84 / UTM zone 49S
Provinsi Kab.Kota Kecamatan Desa
1 Kalimantan Tengah BARITO SELATAN Dusun Hilir Sungai Jaya
2 Kalimantan Tengah BARITO SELATAN Dusun Selatan Pamangka
3 Kalimantan Tengah BARITO SELATAN Jenamas Kelurahan Rantau Kujang
4 Kalimantan Tengah BARITO SELATAN Dusun Hilir Sungai Jaya
5 Kalimantan Tengah BARITO SELATAN Dusun Hilir Sungai Jaya
6 Kalimantan Tengah BARITO SELATAN Dusun Hilir Sungai Jaya
Tanggal Waktu Satelit Confidence geometry
1 25-08-2026 12:14 WIB NASA-NOAA20 High POINT (910108.4 9749527)
2 25-08-2026 12:14 WIB NASA-NOAA20 High POINT (939820 9813236)
3 25-08-2026 12:14 WIB NASA-NOAA20 High POINT (935041.7 9736889)
4 25-08-2026 01:15 WIB NASA-NOAA20 Medium POINT (920479.1 9739940)
5 25-08-2026 01:15 WIB NASA-NOAA20 Medium POINT (919989 9740014)
6 25-08-2026 01:15 WIB NASA-NOAA20 Medium POINT (918677.4 9741224)
summary(df_sf) Provinsi Kab.Kota Kecamatan Desa
Length:2298 Length:2298 Length:2298 Length:2298
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Tanggal Waktu Satelit Confidence
Length:2298 Length:2298 Length:2298 Length:2298
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
geometry
POINT :2298
epsg:32749 : 0
+proj=utm ...: 0
c. Batas Administratif Provinsi Kalimantan Tengah
# Mengambil dan melakukan transformasi batas administratif Kalimantan Tengah
kalimantan_poly <- ne_states(country = "indonesia", returnclass = "sf") %>%
filter(name %in% c("Kalimantan Tengah")) %>%
st_transform(crs = 32749) # Zona UTM 49S
# Membuat buffer sejauh 5000 meter (5 km) agar titik di dekat batas wilayah tetap terhitung
kalimantan_buffered <- st_buffer(kalimantan_poly, dist = 5000)Pada bagian ini bertujuan untuk memperoleh dan menyiapkan batas administratif Provinsi Kalimantan Tengah sebagai wilayah studi dalam analisis spasial. Selain itu, dilakukan pula pembuatan buffer atau zona penyangga sejauh 5.000 meter (5 km) di sekitar batas Provinsi yang ada di Kalimantan untuk menghindari kehilangan titik pada batas wilayah.
d. Melakukan Konversi ke Objek Planar Point Pattern
kalimantan_window <- as.owin(kalimantan_buffered)
coords_utm <- st_coordinates(df_sf)
titikpanas <- ppp(x = coords_utm[,1], y = coords_utm[,2], window = kalimantan_window)
# Menghapus titik duplikat dan mengubah satuan dari meter ke km
titikpanas <- unique(titikpanas) %>% spatstat.geom::rescale(1000, "km")Pembentukan objek bertipe ppp (planar point pattern) bertujuan untuk merepresentasikan data titik panas sebagai suatu realisasi proses titik spasial dalam ruang dua dimensi. Sehingga, dimungkinkan penerapan metode statistik spasial berbasis proses titik, seperti: (1) Kernel Density Estimation; (2) Quadrant Analysis; dan (3) Ripley’s K-function.
Penghapusan titik duplikat memastikan bahwa setiap lokasi hanya dipresentasikan satu kali dalam pola titik. Selain itu, dilakukan perubahan satuan dari meter menjadi kilometer yang lebih relevan untuk analisis skala provinsi.
e. Visualisasi Sebaran Titik Panas
ggplot() +
annotation_map_tile(type = "osm", zoomin = 0) +
geom_sf(data = kalimantan_poly, fill = NA, color = "black", lwd = 1) +
geom_sf(data = df_sf, color = "red", size = 1.2, alpha = 0.6) +
labs(title = "Sebaran Lokasi Titik Panas Kalimantan Tengah (Buffer 5km)") +
theme_minimal()Gambar di atas menunjukkan distribusi spasial titik panas di Provinsi Kalimantan Tengah pada periode pengamatan (Agustus 2026). Titik merah merepresentasikan lokasi titik panas, sedangkan garis hitam menunjukkan batas administratif Provinsi Kalimantan Tengah dengan mempertimbangkan buffer sejauh 5 km dari batas administratif wilayah.
Secara visual, distribusi titik panas tidak tersebar secara merata di seluruh wilayah provinsi. Sebaliknya, terlihat adanya konsentrasi tinggi (klaster) pada beberapa wilayah tertentu. Hal ini mengindikasikan bahwa kejadian titik panas cenderung membentuk pola mengelompok (clustered pattern), bukan acak sempurna.
f. Analisis Intensitas (Heatmap)
#Menampilkan kernel titik panas
kernel_titikpanas <- density(titikpanas)
plot(kernel_titikpanas)#Menampilkan countour
contour(kernel_titikpanas)Angka-angka pada garis kontur tersebut (seperti 0.005, 0.01, 0.015, 0.02, 0.025, 0.03) menunjukkan nilai Intensitas Kepadatan Spasial (Spatial Intensity / Density Value) dari Kernel Density Estimation (KDE). Nilai ini merepresentasikan jumlah estimasi titik panas (hotspot) per satu satuan luas wilayah.
Semakin Besar Angkanya (misal: 0.03): Menunjukkan area pusat konsentrasi/kepadatan tertinggi (hotspot cluster). Di wilayah sekitar garis ini, kejadian titik panas sangat rapat dan banyak.
Semakin Kecil Angkanya (misal: 0.005): Menunjukkan area dengan kepadatan rendah. Titik panas di wilayah ini cenderung jarang atau menyebar.
# Menghitung bandwidth optimal
sigma_opt <- bw.ppl(titikpanas)
sigma_opt sigma
1.932024
# Menghitung estimasi kepadatan titik
ds <- density(titikpanas, sigma = sigma_opt)
# Menampilkan peta, garis kontur dan titik asli
plot(ds, main = "Peta Intensitas Titik Panas (Titik/Km²)", col = magma(100), las = 1)
contour(ds, add = TRUE, col = "#FFFFFF80", drawlabels = FALSE)
plot(titikpanas, add = TRUE, pch = 20, cex = 0.2, col = rgb(1,1,1,0.3))g. Metode Kuadran
# Membagi area menjadi 5x3 grid dan menghitung jumlah titik per kuadran
q_count <- quadratcount(titikpanas, nx = 5, ny = 3)
plot(q_count, main = "Quadrat Count: Jumlah Titik per Kuadran", col = "red")
plot(kalimantan_window, add = TRUE, border = "blue", lty = 2)# Menghitung VMR
counts <- as.vector(q_count)
vmr_val <- var(counts) / mean(counts)
cat("\nNilai VMR:", round(vmr_val, 3), "\n")
Nilai VMR: 319.452
Indikator pola dalam analisis spasial, jika: (1) VMR=0 : titik menyebar sistematik (uniform); (2) VMR=1 : titik menyebar acak (random); (3) VMR>1 : titik menyebar lebih mengelompok (clustered).
Karena nilai VMR = 319.45 (jauh di atas 1), ini menunjukkan titik menyebar mengelompok (sangat ekstrem). Titik-titik data tidak tersebar secara merata, melainkan menumpuk sangat padat di area tertentu (seperti yang terlihat pada angka 723 di peta kuadran) dan hampir kosong di area lainnya.
Oleh karena itu, dilakukan uji hipotesis menggunakan statistik uji chi-square dengan hipotesis sebagai berikut:
H0 : Titik menyebar acak
H1 : Titik mempunyai pola mengelompok (clustered)
# Uji Chi-square
quadrat.test(q_count, alternative = "clustered")
Chi-squared test of CSR using quadrat counts
data:
X2 = 2932.3, df = 13, p-value < 2.2e-16
alternative hypothesis: clustered
Quadrats: 14 tiles (irregular windows)
Hasil uji hipotesis menghasilkan nilai p-value < 2.2e-16 (<0.05) yang berarti Tolak H0. Maka dari itu, cukup bukti untuk menyatakan bahwa pola titik berkelompok (clustered) pada taraf nyata 5%.
h. Empirical K-Function
# Jalankan Kest
K <- Kest(titikpanas, correction = "Ripley")
plot(K)Berdasarkan hasil visualisasi, terlihat bahwa nilai fungsi K empiris secara konsisten berada di atas fungsi K teoritis pada seluruh rentang jarak pengamatan. Dengan demikian, pola persebaran titik panas menunjukkan kecenderungan pengelompokan spasial (clustered pattern).
Fungsi K empiris adalah rata-rata kumulatif jumlah titik data yang berada dalam jarak r dari suatu titik data acuan, yang telah dikoreksi terhadap efek tepi, dan dinormalisasi dengan membaginya terhadap intensitas titik.
Latihan !!!
- Lakukan running pada semua sintaks dalam pembelajaran praktikum 2
- Lakukan identifikasi pola titik menggunakan dua pendekatan, yaitu metode Quadrat dan Empirical K-Function, pada dataset titik panas yang tersedia di web SIPONGI KEMENHUT sesuai provinsi yang kamu pilih. Selanjutnya, jelaskan apakah pola titik yang terbentuk bersifat acak, reguler, atau berkelompok.
- Gabungkan poin 1 dan 2 dan kumpulkan dalam format .html