knitr::opts_chunk$set(warning = FALSE, message = FALSE)Praktikum 2: Eksplorasi Data Titik
Analisis Eksplorasi Data Point Pattern
Titik adalah objek dalam dimensi nol dan menggambarkan sifat dari titik menduduki ruang. Pola keseluruhan titik dalam ruang mencerminkan sifat keseluruhan titik tersebut. Pembahasan bukan membicarakan sebuah titik tapi keseluruhan titik dalam ruang.
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).
Kedua 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.
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
den <- density(x = X, sigma = 10)
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
plot(den, main = "Intensity")
contour(den, add = TRUE) # contour plotDalam 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. Empirical K-Function
Misal contoh data lainnya 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)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 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 Barat", "Kalimantan Tengah",
"Kalimantan Selatan", "Kalimantan Timur",
"Kalimantan Utara"))
# 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: 266724.9 ymin: 10064520 xmax: 276882.9 ymax: 10086940
Projected CRS: WGS 84 / UTM zone 49S
Provinsi Kab.Kota Kecamatan Desa Tanggal
1 Kalimantan Barat BENGKAYANG Sungai Raya Kepulauan Karimunting 25-08-2026
2 Kalimantan Barat BENGKAYANG Sungai Raya Kepulauan Karimunting 25-08-2026
3 Kalimantan Barat BENGKAYANG Sungai Raya Kepulauan Karimunting 25-08-2026
4 Kalimantan Barat BENGKAYANG Sungai Raya Kepulauan Karimunting 25-08-2026
5 Kalimantan Barat BENGKAYANG Sungai Raya Sungai Duri 25-08-2026
6 Kalimantan Barat BENGKAYANG Sungai Raya Sungai Duri 25-08-2026
Waktu Satelit Confidence geometry
1 08:39 WIB NASA-MODIS High POINT (267443.8 10086207)
2 03:25 WIB NASA-MODIS Low POINT (266724.9 10086937)
3 03:25 WIB NASA-MODIS Medium POINT (267707.9 10086790)
4 08:39 WIB NASA-MODIS Medium POINT (267292.9 10085109)
5 01:13 WIB NASA-NOAA20 Medium POINT (276825.9 10064516)
6 01:13 WIB NASA-NOAA20 Medium POINT (276882.9 10064881)
summary(df_sf) Provinsi Kab.Kota Kecamatan Desa
Length:6213 Length:6213 Length:6213 Length:6213
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Tanggal Waktu Satelit Confidence
Length:6213 Length:6213 Length:6213 Length:6213
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
geometry
POINT :6213
epsg:32749 : 0
+proj=utm ...: 0
c. Batas Administratif Provinsi di Kalimantan
# Mengambil dan melakukan transformasi batas administratif Kalimantan
kalimantan_poly <- ne_states(country = "indonesia", returnclass = "sf") %>%
filter(name %in% c("Kalimantan Barat", "Kalimantan Tengah",
"Kalimantan Selatan", "Kalimantan Timur",
"Kalimantan Utara")) %>%
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 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) %>% 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 Jabar (Buffer 5km)") +
theme_minimal()Gambar di atas menunjukkan distribusi spasial titik panas di Provinsi Kalimantan pada periode pengamatan (Agustus 2026). Titik merah merepresentasikan lokasi titik panas, sedangkan garis hitam menunjukkan batas administratif Provinsi Kalimantan 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
5.929589
# 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: 626.749
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 = 626.749 (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 1754 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 = 9612.8, 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
library(spatstat)
set.seed(123)
# Ambil indeks 1000 titik acak dari total titik yang ada
idx <- sample(1:titikpanas$n, size = 1000)
# Subsetting objek ppp berdasarkan indeks
titikpanas_sub <- titikpanas[idx]
# Jalankan Kest
K <- Kest(titikpanas_sub, 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. Kondisi ini menunjukkan bahwa jumlah rata-rata titik tetangga dalam radius tertentu lebih besar dibandingkan dengan pola distribusi acak. 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 SPONGI 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