Seaborn ile Türkiye Deprem Verilerini Görselleştirme

Şu Kaggle yazısını okuduktan sonra basit bir şekilde Türkiye’de olan deprem verileri ile görselleştirme yapmaya çalıştım.

AFAD’a bağlı bu web sitesinden harita üzerinde bir coğrafi alan seçerek o bölgede kayıt edilmiş sismik hareketleri bir kaç filtre ile almak mümkün. Fakat veri sayısı çoğalınca harita üzerinde işaretlemeye çalışması zorlaşıyor ve tarayıcıyı kilitleyebiliyor. Ya tarayıcının ağ isteklerine bakıp istekten dönen JSON dosyasını kullanabilirsiniz ya da istekten sonra adres çubuğunun sonuna csv ekleyerek verileri CSV formatında elde edebilirsiniz. Bu arada verileri aldığımız bu web sitesinde kaynak gösterilmesi uyarısı var dikkatinize.

Bazı kolon isimlerinde karakter kodlaması sorunu olduğu için inen dosya kullanılabilir bir CSV olmayabilir. Ben dosyayı bir metin editörü ile açarak kolon isimlerindeki bozulan ‘ı’ harflerini düzelttim. Büyük veri için bu uygulanabilir değil tabi ama bu dosya için hızlı bir çözüm.

Spyder‘ı açarak veri dosyasının olduğu klasörü “Working Directory” olarak seçiyoruz. Şu anki sürümde sağ üstteki adres çubuğuna klasör yolunu girince yanında beliren onay işaretine basarak yapabilirsiniz.

Sol üst kısımdaki New butonuna basarak yeni bir python dosyası oluşturuyoruz.

%matplotlib inline

# gerekli modülleri ekliyoruz
import numpy as np # büyük diziler ve hesaplamalar için
import pandas as pd # veri seti üzerinde işlemler yapabilmek için
import matplotlib.pyplot as plt # veri görselleştirme
import seaborn as sns; sns.set() # daha estetik veri görselleştirme

#%%

%matplotlib inline; çizdiğimiz grafikleri/görselleri bize konsolda gösterecek komut.
#%%; Spyder üzerinde kodumuzu hücrelere bölerek çalışmamızı sağlar. Bu hücreyi bu oturum boyunca bir kez çalıştırmamız yetecektir.

Hücremizde bir yere tıklayıp CTRL ve Enter tuşlarına basarak hücreyi çalıştırıyoruz. Eksik olan bir paketiniz varsa konsol üzerinde hata alacaksınız bunları kurmanız gerekli. Yoksa devam;





# http://www.deprem.gov.tr/tr/depremkatalogu 4< <10
data = pd.read_csv("deprem.csv")
data.describe()
# data.head()
#%%
data.describe(); veri setindeki uygun sayısal kolonlar hakkında bize bilgi verir. Veriyi anlamak için göz gezdirmekte fayda var.
data.head(); veri setinin ilk bir kaç satırını konsola yazar. Bilerek yorum içine aldım konsol üzerinde çok fazla veri olmaması için ayrıca çalıştırabilirsiniz.

Verimizin sütunlarını düzenleyerek devam edelim.
# işimize yarayan sütunları alalım
data = pd.DataFrame(data, columns=["Zaman (UTC)","Büyüklük","Enlem", "Boylam", "Derinlik"])

# kolon isimlerini düzeltelim
data.columns = ['Zaman', 'Buyukluk', 'Enlem', 'Boylam', 'Derinlik']

data["Zaman"] = pd.to_datetime(data["Zaman"], format="%Y-%m-%d %H:%M:%S")
# Burada data["Zaman"].dtype  <M8[ns] gibi birşey döndürebilir. 
# işlemci ve os mimarisine göre bu datetime64 dtype ı ile eşit olabilirmiş
# np.dtype('datetime64[ns]') == np.dtype('<M8[ns]') 
# yani bu eşitlik true döndüğü süre sorun yok

# yil ve ay kolonu oluşturalım
data["Yil"] = data["Zaman"].dt.year
data["Ay"] = data["Zaman"].dt.month

data.describe()
#%%

Bir pandas veri setinde sütun isimlerini columns özelliğine kolon sayısı kadar elemanı olan bir liste atayarak kolaylıkla yapabiliyoruz.
Veri setimizdeki Zaman verisi string türündeydi bunu datetime türüne pandas yardımı ile çeviriyoruz. Çevirimden sonra yıl ve ay bilgilerini ayrı kolonlara koyarak daha rahat kullanabiliriz.

Bir şeyler çizmeye başlayabiliriz.

# yillara göre toplam deprem sayısı
# burada Zaman kolonu tek bir kolonun adetini bulması için rastgele seçilmiştir
data_yc = data.groupby("Yil")["Zaman"].count()
data_yc.plot(figsize=(8,3), title="Yıl - Deprem Sayısı")
#%%

# Yıl ve Aylara göre daha detaylı
data_yc = data.groupby(["Yil","Ay"])["Zaman"].count()
data_yc.plot(figsize=(8,3), title="Yıl/Ay - Deprem Sayısı")
#%%
# Sadece aylara göre dağılım
data_yc = data.groupby("Ay")["Zaman"].count()
data_yc.plot(figsize=(8,3), title="Yıl/Ay - Deprem Sayısı")
#%%

figsize; çizilecek görselin boyutunu belirtir.

Yıllara göre toplam deprem sayısı
 
Yıl ve aylara göre toplam deprem sayıları
 
Aylara göre toplam deprem sayıları

Klasik çizgi grafiklerimiz bu şekilde. Searborn’un içinde bulunan heatmap görselleştirmesine deneyelim şimdi de.


# verimizi Yıl ve aya göre gruplayalım
data_hm = data.groupby(["Yil","Ay"]).count().reset_index()
# verimizin şeklini Yil=>Satır(Row/Index) Ay=>Kolon(column) 
# ve toplamları almak için rastgele kullandığımız Zaman=>Değer
data_hm = data_hm.pivot(index="Yil",columns="Ay",values="Zaman")

# 2 satırlı bir subplot grubu oluşturacağız. grid_kws ile birbirlerine oranlarını
# ve aralık mesafesini vereceğiz
grid_kws = {"height_ratios": (100, .5), "hspace": .045}

# subplotu oluşturuyoruz.
# 2 => kaç satırı olacağı,  gridspec_kw => bu satırların özellileri
# figsize => döndürdüğü Figure nesnesine gönderilen çizim boyutu (gen, yük)
f, (ax, cbar_ax) = plt.subplots(2, gridspec_kw=grid_kws,figsize=(6, 40))
ax = sns.heatmap(data_hm, ax=ax,
                 cbar_ax=cbar_ax,
                 annot=True,
                 cbar_kws={"orientation": "horizontal"})

reset_index(); grupladığımızda dönen veri setinin index değerleri gruplama kriterlerimiz oluyor ve bu kolonları kaybediyoruz. reset_index metoduyla bu kolonları geri alıyoruz.

Çıkan sonuç burada uzunca bir görsel. Baktığımızda son yıllar sayılarda artış olduğu göze çarpıyor. Bu ölçüm kalitesini artmasından mı yoksa gerçekten gün geçtikçe sismik hareketlilik artıyor mu?

Son olarak da bir pairplot çizerek parametreler arasındaki bağlantılara göz atalım.

sns.pairplot(data, vars=['Buyukluk','Enlem','Boylam','Derinlik'], hue="Buyukluk")

Pairplot; vars olarak verdiğimiz kolon isimlerimizi çapraz olarak çiftleyecek ve her çift için bir nokta grafik(scatter plot) çıkaracak bize. Hue parametresi ise bu noktaları renklendirmemiz için kullanabileceğimiz bir parametre, noktanın verilerine ait satırdaki Buyukluk bilgisine göre bir renk atanacak.

Bir istatistikçi olmasak da grafiği yorumlamaya çalışalım.

1. Enlem-Boylam kesişimdeki grafiğin bu kadar kalabalık olması ülkemizde hemen her yerde deprem riski olduğunu gösteriyor. Boşluk görünen enlem:37 boylam:39 civarı ise Şanlıurfa merkezine yakın bir bölgeye denk geliyor ve fay hattı etkisinin az olduğu bir bölge.

2. Derinlik-Buyukluk çiftinde ise şiddetli depremlerin yüzeye daha yakın bölgelerde olduğu görülüyor ama sayıları çok az olduğu için genelleme yapmak doğru olmaz sanırım.

Esinlendiğim yazıda güneş ve ayın konumları gibi daha farklı bilgiler de var, bu da çok farklı görselleştirmeler yaparak daha yoruma açık grafikler sunmuş göz atmanızı tavsiye ederim.


Yayımlandı

kategorisi

yazarı: