🗺️ CBS & Mekansal Analiz

Yoğunluk Analizi ve KDE Nedir? QGIS ve Python ile Mekansal Isı Haritası Rehberi

📅 Güncellendi: 4 Temmuz 2026 ⏱️ 25 dk okuma 🗺️ Mekansal Analiz

Bir şehrin trafik kazası noktaları haritaya işlendiğinde, veriler dağınık ve anlamsız görünür. Aynı veriye Kernel Density Estimation (KDE) uygulandığında ise kazaların yoğunlaştığı bölgeler pürüzsüz bir ısı haritasına dönüşür. KDE, dağınık nokta verilerini sürekli bir yoğunluk yüzeyine çeviren parametrik olmayan istatistiksel bir yöntemdir. Bu kapsamlı rehberde KDE'nin matematiksel temelinden adaptif varyantına, Python ile tam iş akışından QGIS adım adım uygulamasına kadar her boyutunu ele alıyoruz.

1. KDE Nedir? Sayım Yönteminden Farkı

Nokta verilerini analiz etmenin en temel yolu basit sayım (point density)'dır: çalışma alanı ızgaraya bölünür, her hücredeki nokta sayılır. Hızlıdır ama kaba sonuç verir — hücre sınırları yapay keskinlikler yaratır, komşu hücreler arasında ani geçişler olur, küçük ızgara boyutu gürültü, büyük ızgara boyutu bilgi kaybı demektir.

KDE bu sorunu çözer: her noktanın çevresine matematiksel bir ağırlık fonksiyonu (kernel) yerleştirir. Tüm noktaların kernel fonksiyonları üst üste bindirilir ve pürüzsüz, sürekli bir yoğunluk yüzeyi elde edilir. Noktaya yakın bölgeler yüksek, uzak bölgeler düşük katkı alır. Sonuç haritası keskin sınırlar yerine yumuşak geçişlerle gerçekçi bir yoğunluk görüntüsü sunar.

Somut örnek: İstanbul'daki 10.000 trafik kazasını haritaya işlediğinizde bazı bölgelerin yoğun, bazılarının seyrek göründüğünü görürsünüz. KDE, bu noktaları pürüzsüz bir yoğunluk yüzeyine dönüştürür: Bağcılar kavşağı belirgin bir "tepe" oluştururken kırsal bölgeler "düzlük" kalır. Trafik mühendisleri bu yüzeyi kullanarak öncelikli müdahale noktalarını belirler.

① Nokta Verisi ② Kernel Yerleştirme ③ KDE Yüzeyi yakın noktalar → yüksek yoğunluk
Şekil 1. KDE çalışma prensibi: Her noktaya bir kernel (çan eğrisi) yerleştirilir; tüm kernellerin toplamı pürüzsüz bir yoğunluk yüzeyi oluşturur. Birbirine yakın noktaların kernelleri üst üste binerek yüksek yoğunluk zirvesi yaratır.

2. Matematiksel Temel

KDE'nin matematiksel özü şudur: n adet gözlem noktası {x₁, x₂, ..., xₙ} verildiğinde, herhangi bir konumdaki yoğunluk tahmini şöyle hesaplanır:

f̂(x) = (1/nh) · Σᵢ K((x − xᵢ)/h)

Bu formülde:

  • n: Toplam nokta sayısı
  • h: Bandwidth (bant genişliği, arama yarıçapı)
  • K(·): Kernel fonksiyonu — belirli özellikleri sağlayan simetrik bir olasılık yoğunluk fonksiyonu
  • x − xᵢ: Tahmin noktası ile i. gözlem noktası arasındaki mesafe

2B (iki boyutlu, mekansal) KDE için formül vektörel hale gelir:

f̂(x,y) = (1/nh²) · Σᵢ K(d(x,y; xᵢ,yᵢ)/h)

Burada d(·) Öklid mesafesidir ve her nokta kendi çevresine 2D bir çan eğrisi yerleştirir. Tüm noktaların çan eğrileri toplandığında yoğunluk yüzeyi oluşur.

Sezgisel açıklama: Her noktaya üzerine biraz çay döküldüğünü hayal edin. Çay yayılır ve kenarlara doğru incelir. Birbirine yakın noktaların çayları üst üste biner — bu bölgeler daha "ıslak" yani yoğun görünür. İşte KDE tam da bunu yapar.

3. Kernel Fonksiyonu Türleri

Kernel fonksiyonu, her noktanın çevresine nasıl bir ağırlık dağılımı uygulanacağını belirler. Birbirinden farklı matematiksel şekillere sahiptirler ama pratikte sonuçlar arasındaki fark küçüktür — bandwidth seçimi çok daha belirleyicidir.

Kernel TürüŞekilÖzellikTipik Kullanım
Gaussian (Normal)Sonsuz uzanan çan eğrisiBandwidth dışına da düşük ağırlık verir; pürüzsüz yüzeyPython varsayılanı, genel amaçlı
EpanechnikovKesik parabolikİstatistiksel olarak optimal (MSE minimize eder)Akademik çalışmalar
Quartic (Bisquare)Kesik dördüncü derece eğriEpanechnikov'a benzer, bandwidth dışını sıfırlarQGIS ve ArcGIS varsayılanı
Uniform (Box)Düz dikdörtgenBandwidth içindeki tüm noktalara eşit ağırlıkBasit sayıma yakın sonuç
TriangularÜçgenMerkeze doğrusal azalan ağırlıkSınırlı kullanım
CosineKosinüs şekliYumuşak kenarlı, Gaussian'a benzersklearn seçeneği
Gaussian Epanechnikov Uniform Triangular ∞ kuyruklar sınırlı parabolik eşit ağırlık doğrusal azalan
Şekil 2. Dört yaygın kernel fonksiyonu şekli. Gaussian sonsuz kuyrukludur; Epanechnikov ve Uniform bandwidth sınırında sıfıra düşer (sınırlı). Pratikte kernel türünün etkisi bandwidth seçiminden çok daha küçüktür.

4. Bandwidth: KDE'nin En Kritik Parametresi

Bandwidth (bant genişliği / arama yarıçapı), her noktanın çevresine yerleştirilen kernel fonksiyonunun ne kadar geniş yayılacağını belirler. KDE sonucunu doğrudan şekillendirir:

Çok Küçük h
📉
Her nokta dar sivri tepe oluşturur. Harita gürültülü, aşırı ayrıntılı. Gerçek örüntü gizlenir. Undersmoothing.
Uygun h
Gerçek yoğunluk örüntüsünü anlamlı biçimde özetler. Yerel zirveler ve çukurlar okunabilir.
Çok Büyük h
📊
Yüzey aşırı düzleşir, bölgesel farklar kaybolur. Tüm alan uniform görünür. Oversmoothing.
yoğun 0 ▲ veri noktaları (6 adet) Küçük h — aşırı ayrıntı (undersmoothing) Uygun h — gerçek yapıyı ortaya koyar Büyük h — aşırı düzleştirme (oversmoothing)
Şekil 3. Bandwidth değerinin KDE yüzeyine etkisi. Küçük bandwidth (kırmızı) her noktada keskin bir sivri oluşturarak gürültülü harita üretir; büyük bandwidth (turuncu kesikli) gerçek kümeleri birleştirip oluşan yapıyı siler; uygun bandwidth (yeşil) iki cluster'ı net biçimde ayrıştırır.

Silverman's Rule of Thumb

En yaygın otomatik bandwidth seçim yöntemidir. Verinin standart sapması ve nokta sayısına dayalı analitik bir formüldür:

h = 0.9 × min(σ, IQR/1.34) × n−1/5

Burada σ standart sapma, IQR çeyrekler arası aralık, n nokta sayısıdır. Python'da scipy.stats.gaussian_kde'nin bw_method='silverman' seçeneği bu formülü kullanır. Normal dağılım varsayımı nedeniyle çok yoğun veya çok seyrek verilerde yanıltıcı olabilir.

Çapraz Doğrulama (Cross-Validation) ile Bandwidth Seçimi

Farklı bandwidth değerleri denenerek tahmin hatası (MISE — Mean Integrated Squared Error) minimize edilir. İstatistiksel olarak daha sağlam ama hesaplama maliyeti yüksektir. sklearn'ün GridSearchCV'si bu işlemi otomatikleştirir.

Alan Uzmanı Kararı

Bazı analizlerde coğrafi veya operasyonel bir anlam taşıyan mesafe değerleri kullanmak daha mantıklıdır:

  • Yürüyüş mesafesi: 400 m
  • Polis devriye yarıçapı: 500 m
  • Hastalık bulaşma yarıçapı: 1 km
  • Şehir içi mahalle ölçeği: 2–5 km

Pratik öneri: Silverman ile başlayın, sonucu görsel olarak değerlendirin. Fazla gürültülüyse bandwidth'i 2 katına çıkarın. Çok düz görünüyorsa yarıya indirin. Duyarlılık analizi yaparak 3 farklı bandwidth ile kıyaslamalı haritalar üretin.

5. Adaptif KDE

Standart KDE'nin en büyük sınırlılığı sabit bandwidth kullanmasıdır: tüm çalışma alanında aynı h uygulanır. Ama gerçek dünya verileri homojen değildir — kent merkezinde yoğun, kırsal alanda seyrek noktalar olabilir. Sabit bandwidth bu durumda iki soruna yol açar:

  • Yoğun bölgelerde oversmoothing — gerçek zirveler yumuşar
  • Seyrek bölgelerde undersmoothing — gürültü yüksek görünür

Adaptif (değişken) KDE, bandwidth'i yerel nokta yoğunluğuna göre otomatik ayarlar:

  • Yoğun bölgelerde → küçük bandwidth (ince ayrıntı)
  • Seyrek bölgelerde → büyük bandwidth (düzleştirme)

Popüler yöntem k-en yakın komşu bandwidth'idir: her nokta için en yakın k noktanın mesafesi bandwidth olarak kullanılır. Bu sayede yerel veri yoğunluğuna duyarlı bir yüzey elde edilir.

# pip install KDEpy from KDEpy import FFTKDE, TreeKDE import numpy as np import geopandas as gpd gdf = gpd.read_file("noktalar.gpkg") coords = np.column_stack([gdf.geometry.x, gdf.geometry.y]) # Sabit bandwidth KDE (FFTKDE — çok hızlı) x, y_vals = (FFTKDE(kernel='gaussian', bw='silverman') .fit(coords) .evaluate()) # Adaptif KDE (TreeKDE ile) # bw: başlangıç bandwidth, sonra yerel yoğunluğa göre ayarlanır x_grid = np.linspace(coords[:,0].min(), coords[:,0].max(), 200) y_grid = np.linspace(coords[:,1].min(), coords[:,1].max(), 200) xx, yy = np.meshgrid(x_grid, y_grid) grid_pts = np.column_stack([xx.ravel(), yy.ravel()]) kde_adaptive = (TreeKDE(kernel='gaussian', bw='silverman') .fit(coords) .evaluate(grid_pts)) density_adaptive = kde_adaptive.reshape(xx.shape)

6. Ağırlıklı KDE

Standart KDE her noktaya eşit ağırlık verir. Ama bazı analizlerde noktaların önem düzeyi farklıdır: kazadaki yaralı sayısı, suçun şiddet skoru, hastalığın bulaşıcılık oranı gibi nitelik değerleri yoğunluk hesabına dahil edilebilir.

Ağırlıklı KDE formülü:

f̂w(x,y) = (1/h²Σwᵢ) · Σᵢ wᵢ · K(d(x,y; xᵢ,yᵢ)/h)

Her nokta kendi ağırlık değeri (wᵢ) ile çarpılarak yoğunluk yüzeyine katkıda bulunur. Ağır bir olayın bulunduğu konum, hafif bir olayın konumuna göre yüzeyi daha fazla yukarı çeker.

Pratik örnek: Trafik kazası analizinde yalnızca kaza sayısını değil, her kazadaki yaralı sayısını ağırlık olarak kullansanız: 1 yaralılı 10 kaza ile 10 yaralılı 1 kaza, standart KDE'de aynı katkıyı verirdi ama ağırlıklı KDE'de ikincisi 10 kat daha fazla etkiler. Bu, şiddetli kazaların yoğunlaştığı bölgeleri çok daha doğru ortaya koyar.

7. Sınır Etkisi ve Düzeltme

Çalışma alanının kenarlarındaki noktalar, sınır dışına da kernel yayar ama bu alan analiz kapsamı dışındadır. Sonuç olarak sınır yakınındaki yoğunluk değerleri yapay olarak düşük hesaplanır. Bu sınır etkisi (edge effect) özellikle küçük çalışma alanlarında belirgindir.

Sınır Etkisi ile Başa Çıkma Yöntemleri

  • Buffer zone: Çalışma alanını gerçek sınırın dışına taşıp kesip dışa taşan katkıları sıfırlamak. En basit yaklaşım.
  • Reflection (yansıma): Sınırın ayna görüntüsünde hayali noktalar oluşturarak toplam katkının dengelenmesi. QGIS'in bazı araçları bunu otomatik yapar.
  • Guard zone: Analiz alanını genişletip daha fazla gerçek nokta dahil etmek.
  • Kernel normalizasyonu: Her ızgara hücresi için yalnızca çalışma alanı içindeki kernel katkısını normalize etmek.

Uyarı: Suç veya hastalık haritalarında sınır etkisi ciddi hatalara yol açabilir. Bir mahallenin sınırında yoğun olan suç aktivitesi, komşu mahallenin analizi dışında kaldığı için sınırda yapay düşük yoğunluk görünebilir. Raporlarda sınır etkisini açıkça belirtin.

8. Python ile Tam Uygulama

pip install geopandas scipy scikit-learn rasterio matplotlib folium KDEpy
import numpy as np import geopandas as gpd import matplotlib.pyplot as plt from scipy.stats import gaussian_kde # Nokta verisini yükle (GeoPackage, Shapefile veya CSV) gdf = gpd.read_file("trafik_kazalari.gpkg") # Projeksiyon kontrolü — metre cinsinden projeksiyon şart (UTM, TM35) print(gdf.crs) # EPSG:4326 (derece) ise metre cinsine çevir: # gdf = gdf.to_crs("EPSG:32636") # UTM Zone 36N (Türkiye) print(f"Toplam nokta: {len(gdf)}") print(gdf.head())
# Koordinatları çıkar x = gdf.geometry.x.values y = gdf.geometry.y.values coords = np.vstack([x, y]) # KDE — Silverman bandwidth otomatik kde = gaussian_kde(coords, bw_method='silverman') print(f"Silverman bandwidth faktörü: {kde.factor:.4f}") print(f"Gerçek bandwidth (x): {kde.factor * np.std(x):.1f} metre") # Değerlendirme ızgarası oluştur x_min, y_min, x_max, y_max = gdf.total_bounds resolution = 100 # piksel boyutu (metre) n_x = int((x_max - x_min) / resolution) n_y = int((y_max - y_min) / resolution) xx, yy = np.mgrid[x_min:x_max:n_x*1j, y_min:y_max:n_y*1j] grid_coords = np.vstack([xx.ravel(), yy.ravel()]) # Yoğunluk hesapla (büyük izgaralarda vektörizasyon için chunk'lara böl) density = kde(grid_coords).reshape(xx.shape) # Normalize et: km² başına olay sayısına çevir density_per_km2 = density * len(gdf) * 1e6 # m² → km²
# Yaralı sayısını ağırlık olarak kullan weights = gdf["yarali_sayisi"].fillna(1).values weights = weights / weights.sum() # normalize kde_weighted = gaussian_kde(coords, bw_method='silverman', weights=weights) density_w = kde_weighted(grid_coords).reshape(xx.shape)
from sklearn.neighbors import KernelDensity from sklearn.model_selection import GridSearchCV # Koordinatları sklearn formatına çevir X_sk = np.column_stack([x, y]) # Büyük veri seti için örneklem al n_sample = min(5000, len(X_sk)) idx = np.random.choice(len(X_sk), n_sample, replace=False) X_sample = X_sk[idx] # Denenecek bandwidth değerleri (metre cinsinden) params = {'bandwidth': np.linspace(200, 2000, 20)} grid_search = GridSearchCV( KernelDensity(kernel='gaussian'), params, cv=5, n_jobs=-1 ) grid_search.fit(X_sample) best_bw = grid_search.best_params_['bandwidth'] print(f"Optimal bandwidth: {best_bw:.0f} metre") # En iyi bandwidth ile tam KDE kde_sk = KernelDensity(kernel='gaussian', bandwidth=best_bw).fit(X_sk) grid_pts_T = np.column_stack([xx.ravel(), yy.ravel()]) log_density = kde_sk.score_samples(grid_pts_T) density_cv = np.exp(log_density).reshape(xx.shape)
import rasterio from rasterio.transform import from_bounds from rasterio.crs import CRS # Raster parametreleri transform = from_bounds(x_min, y_min, x_max, y_max, n_x, n_y) crs_epsg = gdf.crs.to_epsg() # KDE değerini km² başına normalize et out_density = (density_per_km2.T)[::-1] # rasterio için satır sırası ters with rasterio.open( "kde_output.tif", "w", driver="GTiff", height=n_y, width=n_x, count=1, dtype=rasterio.float32, crs=CRS.from_epsg(crs_epsg), transform=transform, compress="lzw" ) as dst: dst.write(out_density.astype(np.float32)[np.newaxis, :, :]) print("✓ kde_output.tif kaydedildi — QGIS'te açabilirsiniz")
fig, axes = plt.subplots(1, 2, figsize=(16, 7)) # 1. Standart KDE im1 = axes[0].contourf(xx, yy, density_per_km2, levels=20, cmap='YlOrRd') gdf.plot(ax=axes[0], color='black', markersize=1, alpha=0.3) plt.colorbar(im1, ax=axes[0], label='Kaza / km²') axes[0].set_title('Standart KDE (Silverman)') # 2. Ağırlıklı KDE im2 = axes[1].contourf(xx, yy, density_w * len(gdf) * 1e6, levels=20, cmap='YlOrRd') gdf.plot(ax=axes[1], color='black', markersize=1, alpha=0.3) plt.colorbar(im2, ax=axes[1], label='Ağırlıklı Yoğunluk') axes[1].set_title('Ağırlıklı KDE (Yaralı Sayısı)') plt.tight_layout() plt.savefig('kde_karsilastirma.png', dpi=150, bbox_inches='tight') plt.show()

9. QGIS ile KDE Adım Adım

QGIS'te KDE iki farklı şekilde uygulanabilir. Görselleştirme için Semboloji, gerçek analiz için İşleme Araçları kullanılır.

Yöntem 1: Anlık Görselleştirme (Semboloji)

Nokta katmanına sağ tık Özellikler (Properties)
Semboloji sekmesi
"Tekli Sembol" yerine Isı Haritası (Heatmap) seç
Yarıçap (Radius): analiz ölçeğinize uygun değer (piksel veya harita birimi)
Renk rampası: YlOrRd, Magma veya özel
Maksimum değer: "Genel" veya "Katman"
Uygula → Tamam

⚠ Bu yaklaşım görselleştirme içindir; raster çıktı üretmez.

Yöntem 2: Raster KDE (Analiz Amaçlı)

Üst menü: İşleme (Processing) Araç Kutusu
Arama: "Isı Haritası" veya "Heatmap"
Interpolasyon → Isı Haritası (Kernel Yoğunluğu Tahmini)

Girdi noktası katmanı: nokta vektör katmanınız
Yarıçap (Radius): bandwidth değeri (metre cinsinden, örn. 500)
Çıktı raster boyutu (piksel boyutu): 50 m önerilir
Kernel şekli: Quartic (varsayılan) veya Gaussian
Ağırlık alanı (isteğe bağlı): sayısal ağırlık sütunu seçin
Çıktı dosyası: kde_sonuc.tif
Çalıştır

Çıktıyı Renklendirme

KDE raster katmanına sağ tık Özellikler Semboloji
Render tipi: Tek Bant Sözde Renk (Singleband pseudocolor)
Renk rampası: Magma veya YlOrRd
Sınıflandırma modu: Kantil (Quantile) veya Eşit Aralık
Sınıf sayısı: 10–15
Uygula

Bandwidth Optimizasyonu QGIS'te

Eklentiler Eklentileri Yönet QGIS Heatmap Bandwidth
veya
İşleme R Scripti (R yüklüyse) bw.ucv() fonksiyonu ile
cross-validation bandwidth hesabı yapılabilir.

QGIS'te karşılaştırmalı analiz: Aynı veri için 3 farklı bandwidth (örn. 250 m, 500 m, 1000 m) ile 3 ayrı KDE rasterı oluşturun. Her birini aynı renk skalasına normalize edip yan yana görüntüleyin. Hangisi araştırma sorunuza uygun detayı veriyorsa onu seçin.

10. KDE Çıktısını Yorumlama

KDE raster çıktısı piksel değerlerini birim alan başına olay yoğunluğu (km² başına olay sayısı) olarak verir. Yorumlarken dikkat edilmesi gereken noktalar:

  • Mutlak değerler görecelidir. Bandwidth ve kernel türüne göre değişir; aynı veri seti farklı parametrelerle farklı yoğunluk değerleri üretir. Analizler arası karşılaştırma için parametreler sabit tutulmalıdır.
  • KDE istatistiksel anlamlılık testi yapmaz. Yüksek yoğunluk görünen bölge rastlantısal da olabilir. İstatistiksel doğrulama için Gi* veya LISA ile birlikte kullanın.
  • Nüfus düzeltmesi gerekebilir. Suç veya hastalık analizlerinde ham nokta yoğunluğu yanıltıcı olabilir — nüfus yoğunluğu yüksek bir yerde daha fazla suç normal olarak beklenir. KDE çıktısını nüfus rasterına bölerek "nüfus düzeltmeli oran" haritası oluşturun.
  • Sınır yakınındaki değerleri dikkatli yorumlayın. Sınır etkisi nedeniyle yapay düşük yoğunluk olabilir.

Raster Hesap Makinesi ile Yoğunluk Sınıflandırma

QGIS: Raster Raster Hesap Makinesi

Normalleştirme (0-1 arası):
("kde_sonuc@1" - minimum) / (maksimum - minimum)

Eşik ile ikili harita (yoğun bölge = 1, seyrek = 0):
IF("kde_sonuc@1" > 0.75 * maksimum, 1, 0)

11. KDE vs Diğer Yöntemler

YöntemÇıktıİstatistiksel TestNüfus DüzeltmesiEn İyi Kullanım
Basit SayımHücre başına sayıHayırHayırHızlı ön bakış
KDE (standart)Sürekli yoğunluk yüzeyiHayırMümkünGörselleştirme, keşifsel analiz
Ağırlıklı KDEŞiddet ağırlıklı yüzeyHayırMümkünŞiddet + sıklık birlikte
Getis-Ord Gi*z-skoru, güven düzeyiEvetHayırİstatistiksel sıcak nokta doğrulama
Local Moran's IKüme tipleri (HH, LL…)EvetHayırAnomali ve aykırı değer tespiti
Interpolasyon (IDW)Sürekli değer yüzeyiHayırEvetSürekli alan verisini tahmin etme

Tipik iş akışı: KDE ile başlayın (keşifsel görselleştirme) → Gi* ile istatistiksel doğrulama yapın → Nüfus düzeltmesi uygulayın → Sonuçları karşılaştırarak raporlayın.

12. Uzamsal-Zamansal (Space-Time) KDE

Standart KDE yalnızca mekânsal boyutu ele alır. Oysa birçok fenomen zaman içinde de değişir: suç belirli saatlerde yoğunlaşır, hastalık yayılır, trafik kazaları hafta sonu farklılaşır. Uzamsal-zamansal KDE (STKDE), mekansal boyutlara üçüncü bir boyut olarak zamanı ekler.

Matematiksel olarak:

f̂(x, y, t) = (1/nh_s²·h_t) · Σᵢ K_s(d_s/h_s) · K_t(d_t/h_t)

h_s mekansal bandwidth, h_t zamansal bandwidth (saat, gün, ay cinsinden) olur. Farklı zaman dilimlerine ait KDE'ler birbirine çıkarılarak değişim haritaları üretilebilir.

import pandas as pd from scipy.stats import gaussian_kde # Veri: x, y koordinatları + tarih sütunu gdf['saat'] = pd.to_datetime(gdf['tarih']).dt.hour # Gece (22:00-06:00) vs gündüz KDE karşılaştırması gece = gdf[gdf['saat'].isin(range(22, 24)) | gdf['saat'].isin(range(0, 7))] gunduz = gdf[gdf['saat'].isin(range(7, 22))] kde_gece = gaussian_kde(np.vstack([gece.geometry.x, gece.geometry.y])) kde_gunduz = gaussian_kde(np.vstack([gunduz.geometry.x, gunduz.geometry.y])) # Fark haritası: gece yoğunluğu - gündüz yoğunluğu diff_density = (kde_gece(grid_coords) - kde_gunduz(grid_coords)).reshape(xx.shape) # Pozitif değerler gece daha yoğun, negatif değerler gündüz daha yoğun plt.contourf(xx, yy, diff_density, levels=20, cmap='RdBu_r') plt.colorbar(label='Gece − Gündüz Yoğunluk Farkı') plt.title('Gece vs Gündüz Kaza Yoğunluğu Farkı') plt.show()

13. Uygulama Alanları

AlanVeriAmaçAğırlık
Suç haritalamasıSuç olayı konumlarıDevriye güzergahı, kaynak tahsisiSuç şiddet skoru
Trafik güvenliğiKaza noktalarıÖncelikli iyileştirme noktalarıYaralı/ölü sayısı
EpidemiyolojiVaka konumlarıYayılım modeli, risk bölgesiHastalık şiddeti
EkolojiTür gözlem noktalarıHabitat kullanım yoğunluğuBirey sayısı
PerakendeMüşteri adresleriYeni şube konumu seçimiHarcama miktarı
GayrimenkulSatış işlemleriPiyasa aktivite yoğunluğuİşlem fiyatı
SismolojiDeprem episantr noktalarıSismik risk bölgeleriDeprem büyüklüğü

14. Yaygın Hatalar

  • Coğrafi koordinatlarda KDE hesaplamak: Derece cinsinden koordinatlarla (EPSG:4326) yapılan KDE anlamsız bandwidth değerleri üretir. Mutlaka metre cinsinden projeksiyon kullanın (UTM, TM35).
  • Nüfus düzeltmesi yapmamak: Yoğun nüfuslu kentsel alanlarda her fenomen daha fazla sayıda olur. Ham KDE haritası yanıltıcı olabilir — nüfusa normalize edin.
  • Tek bandwidth ile karar vermek: En az 3 farklı bandwidth deneyip karşılaştırın; duyarlılık analizi yapın.
  • Sınır etkisini görmezden gelmek: Özellikle küçük çalışma alanlarında sınır yakınındaki değerler yapay düşüktür.
  • KDE'yi istatistiksel anlamlılık kanıtı saymak: KDE görsel keşif aracıdır; "bu bölgede gerçekten istatistiksel küme var" demek için Gi* veya LISA gerekir.
  • Farklı parametre setleri ile üretilen KDE'leri karşılaştırmak: Aynı veri için farklı bandwidth ile yapılmış iki haritanın yoğunluk değerleri doğrudan karşılaştırılamaz.

Mekansal Yoğunluk Analizi İçin Uzman Desteği

KDE, sıcak nokta analizi, uzamsal-zamansal analiz ve mekansal görselleştirme projelerinde profesyonel CBS danışmanlığı.

Ücretsiz Danışmanlık Alın

Kaynaklar

  • Silverman, B. W. (1986). Density Estimation for Statistics and Data Analysis. Chapman & Hall.
  • Chainey, S., Tompson, L., & Uhlig, S. (2008). The utility of hotspot mapping for predicting spatial patterns of crime. Security Journal, 21(1–2), 4–28.
  • Fotheringham, A. S., Brunsdon, C., & Charlton, M. (2000). Quantitative Geography: Perspectives on Spatial Data Analysis. SAGE Publications.
  • Nakaya, T., & Yano, K. (2010). Visualising crime clusters in a space-time cube. GeoJournal, 75(3), 289–306.
  • KDEpy kütüphanesi belgeleri: kdepy.readthedocs.io
  • QGIS Heatmap dokümantasyonu: docs.qgis.org