# Bu kod bloğunu sadece paketler yüklü değilse bir kere çalıştırın
install.packages("DataExplorer")
install.packages("summarytools")
install.packages("dlookr")
# Temel kütüphanemiz
library(tidyverse)
# Yeni Otomatik EDA kütüphanelerimiz
library(DataExplorer)
library(summarytools)
library(dlookr)
# Analiz edeceğimiz veri setini yükleyelim
insurance_df <- read_csv("insurance.csv")
DataExplorer ile Verinin Röntgenini
ÇekmekBu bölümün belki de en sihirli anına hoş geldiniz. Bölüm
5.1’de, insurance_df veri setini anlamak için ne
kadar çok adım attığımızı hatırlayın:
colSums(is.na()) ile kontrol ettik.geom_histogram() ile
histogramlar çizdik.geom_bar() ile çubuk
grafikler oluşturduk.Tüm bu işlemleri, DataExplorer paketinin
create_report() adındaki tek bir fonksiyonuyla saniyeler
içinde yapabiliriz. Bu fonksiyon, veri setimizin adeta tam vücut
röntgenini çeker ve bulgularını bize interaktif bir HTML raporu olarak
sunar.
Ustalık Notu: Raporu Nasıl Oluştururuz?
Aşağıdaki kod bloğunu doğrudan RStudio’nun Konsol
penceresine kopyalayıp çalıştırdığınızda, DataExplorer
projenizin bulunduğu klasörde report.html adında bir rapor
dosyası oluşturacaktır. .Rmd dosyasının derlenmesi
sırasında hata almamak için bu tür otomatik raporlama fonksiyonlarını
doğrudan konsolda çalıştırmak en iyi pratiktir.
Bu yüzden, aşağıdaki kod bloğunu eval=FALSE seçeneği ile
“çalışmayacak” şekilde ayarlıyoruz.
Ancak size hangi komutu kullanacağınızı göstermek için burada bırakıyoruz.
# Bu kodu RStudio Konsolu'nda çalıştırarak raporunuzu oluşturun!
create_report(insurance_df)
Yukarıdaki kodu çalıştırdığınızda, create_report()
fonksiyonu, tarayıcınızda bir HTML dosyası oluşturur. Bu dosya
tarayıcınızda açıldığında raporu daha rahat inceleyebilirsiniz.
create_report()’un oluşturduğu bu rapor, adeta bir
kaşifin adanın üzerinden drone ile çektiği yüksek çözünürlüklü
görüntüler gibidir. Gelin bu görüntülerin bize neler anlattığına bakalım
ve Bölüm 5.1’deki “elle” yaptığımız keşiflerle
karşılaştıralım.
Rapor genellikle şu bölümlerden oluşur:
Raporun bize sunduğu ilk ve en temel bilgi, veri setimizin kimlik kartıdır.
Gördüklerimiz ve Yorumumuz:
Bu bölüm, projemizin ilk adımında glimpse() ve
colSums(is.na()) gibi komutlarla elde ettiğimiz bilgilerin
temiz bir özetidir:
DataExplorer, karakter (chr) tipindeki
sex, smoker ve region
değişkenlerimizi doğru bir şekilde kategorik (ayrık) olarak
tanımlamış.dbl) tipindeki age, bmi,
children ve charges değişkenlerimizi sürekli
olarak tanımlamış.Bu ilk tablo sayesinde, daha tek bir grafik bile görmeden, veri setimizin boyutu, yapısı ve temizliği hakkında anında fikir sahibi olmuş olduk.
Aynı bilgileri yüzdesel olarak ve görsel bir formatta sunan “Percentages” grafiği, durumu daha da netleştirir.
Gördüklerimiz ve Yorumumuz:
Bu çubuk grafik, temel istatistikleri görsel bir özet haline getirir:
Kısacası, bu iki görsel (temel istatistikler tablosu ve yüzdeler grafiği), bize veri setimizin yapısı ve kalitesi hakkında sağlam bir başlangıç noktası sunar.
Raporun bu bölümü, glimpse() fonksiyonunun yaptığı işi
görsel bir ağaç yapısıyla sunar.
Gördüklerimiz ve Yorumumuz:
Bu minimalist ama etkili görsel, veri setimizin bir “kök”ten
(root) dallanarak 7 farklı değişkene ayrıldığını gösterir.
Bize sunduğu bilgiler şunlardır:
obs.) ve 7 değişkenden (variables) oluştuğunu
teyit eder.age (num), bmi (num),
children (num), charges (num): Bunların
sayısal (numeric) değişkenler olduğunu gösterir.sex (chr), smoker (chr),
region (chr): Bunların metin (character)
tipinde değişkenler olduğunu gösterir.Bu görsel, glimpse() komutunun metin tabanlı çıktısını
daha sezgisel bir şemaya dönüştürerek, veri setimizin yapısını bir
bakışta anlamamızı sağlar. Özellikle çok sayıda değişkeni olan karmaşık
veri setlerinde, hangi değişkenin hangi tipte olduğunu hızlıca görmek
için harika bir araçtır.
Bu bölüm, veri setimizdeki eksik değer (NA) durumunu
görsel olarak özetler. Bir veri kaşifi için, projenin en başında bu
profili çıkarmak hayati önem taşır.
Ustalık Notu: Koddaki Uyarı (Warning) Mesajı Ne Anlama Geliyor?
Görselin üzerinde
Warning: aes_string() was deprecated in ggplot2 3.0.0.
şeklinde bir uyarı fark etmiş olabilirsiniz. Bu bir hata değildir ve
raporun oluşmasını engellemez. Bu mesaj, DataExplorer
paketinin kendi iç kodlarında, ggplot2’nin eski bir
fonksiyonu olan aes_string()’i kullandığını belirtir.
ggplot2 güncellendiği için artık bu eski fonksiyon yerine
yeni yöntemlerin kullanılması tavsiye edilmektedir. Bu, paketin
geliştiricisini ilgilendiren bir durumdur ve bizim analizimizi
etkilemez.
Gördüklerimiz ve Yorumumuz:
age, sex, bmi vb.) temsil
eder.DataExplorer’ın veri setimizin eksik
veri açısından “iyi” durumda olduğunu teyit ettiğini gösterir.Bu görsel, colSums(is.na(insurance_df)) komutunun bize
sayısal olarak verdiği “her sütunda 0 eksik var” bilgisini, bir bakışta
anlaşılır ve raporlanabilir bir grafiğe dönüştürmüş halidir.
Bu bölüm, projemizin 5.1 Adım 2’sinin tamamen otomatize edilmiş halidir. Rapor, hem sayısal hem de kategorik değişkenler için dağılım grafiklerini otomatik olarak çizer. İlk olarak sayısal değişkenlerin histogramlarına bakalım.
Gördüklerimiz ve Yorumumuz:
Bu grafik, Bölüm 5.1, Adım 2.1’de
ggplot2 ile tek tek oluşturup patchwork ile
birleştirdiğimiz histogramların bir benzerini tek seferde sunuyor.
Bulgularımız tamamen aynı:
Bu otomatik oluşturulmuş grafikler sayesinde, her bir sayısal değişkenin dağılım karakteristiğini saniyeler içinde anlama fırsatı bulduk ve “elle” yaptığımız analizde ulaştığımız sonuçları hızlıca doğruladık.
Şimdi de raporun, kategorik değişkenler için otomatik olarak
oluşturduğu çubuk grafiklere (bar chart) bakalım.
Gördüklerimiz ve Yorumumuz:
Bu görsel, Bölüm 5.1, Adım 2.2’de
ggplot2 ile oluşturduğumuz çubuk grafiklerin yatay
versiyonlarını sunuyor. Varılan sonuçlar yine birebir aynı:
male ve
female kategorilerinin çubuk uzunlukları neredeyse eşit.
Bu, veri setimizin cinsiyet açısından dengeli olduğunu
bir kez daha gösteriyor.no
çubuğunun, yes çubuğundan çok daha uzun olduğu net bir
şekilde görülüyor. Bu, veri setimizin sigara içme durumu açısından
dengesiz olduğunun en net görsel kanıtıdır. İnsanların
büyük çoğunluğu sigara içmiyor.Bu otomatik grafikler sayesinde, tek tek kod yazmadan, tüm kategorik değişkenlerimizin frekans dağılımlarını anında görmüş ve “elle” yaptığımız analizdeki bulgularımızı doğrulamış olduk.
Histogramların yanı sıra, DataExplorer raporu sayısal
değişkenlerin teorik bir normal dağılıma ne kadar uyduğunu test eden
Q-Q Plot (Quantile-Quantile Plot) grafiklerini de
otomatik olarak oluşturur. Bu, serimizin ilerleyen bölümlerinde
detaylarına gireceğimiz “normallik testleri” konusuna harika bir görsel
giriştir.
Gördüklerimiz ve Yorumumuz:
Bir Q-Q Plot’un temel felsefesi basittir: Eğer bir değişkenin dağılımı normale yakınsa, grafikteki noktaların düz çapraz çizgi etrafında toplanması beklenir.
bmi’ın normale yakın bir
dağılıma sahip olduğunu istatistiksel olarak destekler.age’in
“uniform” dağılımı ve children’ın ayrık (discrete) yapısı,
noktaların çizgiden sapmasına neden olur.Bu grafikler, bize sadece dağılımın şekli hakkında değil, aynı zamanda ileride kullanacağımız bazı istatistiksel modellerin varsayımlarının (örneğin normallik varsayımı) karşılanıp karşılanmadığı hakkında da önemli ipuçları verir.
Raporun bu bölümü, veri setimizdeki tüm sayısal ve kategorik değişkenler arasındaki korelasyonu görsel bir ısı haritası (heatmap) ile sunar. Korelasyon, iki değişkenin ne kadar birlikte hareket ettiğini ölçen bir katsayıdır ve -1 ile +1 arasında bir değer alır.
Ustalık Notu:
DataExplorer bu grafiği oluşturmadan önce, kategorik
değişkenleri (sex, smoker vb.) arka planda
otomatik olarak “one-hot encoding” yöntemine benzer bir şekilde sayısal
(0/1 gibi) değişkenlere dönüştürür. Bu sayede tüm değişkenleri tek bir
matriste karşılaştırabilir.
Gördüklerimiz ve Yorumumuz:
Isı haritasını yorumlarken, kırmızı renkler pozitif
korelasyonu (biri artarken diğeri de artar), mavi
renkler ise negatif korelasyonu (biri artarken diğeri azalır) gösterir.
Rengin tonu ne kadar koyuysa, ilişki o kadar güçlüdür. Hedefimiz olan
charges satırına odaklanalım:
charges ve smoker_yes: Bu
iki değişkenin kesiştiği kare, koyu kırmızı renkte ve
içinde 0.79 yazıyor. Bu, +1’e çok yakın, çok güçlü bir
pozitif korelasyon demektir. Bu, bugüne kadarki en önemli bulgumuzu
sayısal olarak kanıtlıyor: Sigara içiyor olmak
(smoker_yes), masrafların (charges) artmasıyla
çok güçlü bir şekilde ilişkilidir.charges ve age: Bu
karenin değeri 0.3, yani orta kuvvette pozitif bir
korelasyon. Bu da Bölüm 5.1, Adım 3.2’de
geom_point ile gördüğümüz “yaş arttıkça masraflar artar”
trendini doğrular.charges ve bmi: Bu
karenin değeri 0.2, yani zayıf-orta arası pozitif bir
korelasyon. Bu da bmi arttıkça masrafların artma eğiliminde
olduğunu gösterir.Bu korelasyon matrisi, “elle” yaptığımız analizde saatler sürebilecek hipotezleri ve görsel bulguları, tek bir tabloda özetleyerek bize saniyeler içinde sunar. Özellikle hangi değişkenlerin hedef değişkenimizle daha güçlü bir ilişkiye sahip olduğunu belirlemede inanılmaz derecede hızlı ve etkilidir.
Raporun bu bölümü, Temel Bileşenler Analizi (PCA) adında daha ileri seviye bir istatistiksel tekniğin özetini sunar.
Ustalık Notu: PCA Nedir?
PCA, birbiriyle ilişkili (korelasyonlu) çok sayıda değişkeni, bilgiyi mümkün olduğunca az kayıpla, daha az sayıda ve birbiriyle ilişkisiz yeni değişkenlere (bunlara “temel bileşen” denir) dönüştürme sanatıdır. Amacı, veri setindeki “bilgi gürültüsünü” azaltmak ve enformasyonu daha yoğun bir şekilde temsil etmektir. Bu konu, makine öğrenmesi serilerinde detaylıca ele alınır.
Gördüklerimiz ve Yorumumuz:
Bu grafik, her bir temel bileşenin (PC1, PC2, vb.) veri setimizdeki toplam varyansın (değişkenliğin) yüzde kaçını açıkladığını gösterir.
23%, 40%, 53%…), o bileşen ve
ondan öncekilerin birlikte varyansın toplamda ne kadarını açıkladığını
gösterir. Örneğin, ilk üç temel bileşen (PC1, PC2, PC3)
bir araya geldiğinde, veri setimizdeki toplam değişkenliğin
%53’ünü açıklayabilmektedir.Bu analiz, EDA’nın bu aşamasında bizim için doğrudan bir “aksiyon” gerektirmese de, veri setimizin iç yapısı ve değişkenlerinin kolektif olarak ne kadar “bilgi” taşıdığı hakkında bize fikir verir. Bu, serimizin gelecek bölümlerinde değinebileceğimiz daha ileri seviye konular için bir “merak uyandırma” notu olarak düşünülebilir.
Bir önceki grafik bize ne kadar varyansın açıklandığını gösterirken, bu ikinci PCA grafiği bize bu varyansı hangi değişkenlerin açıkladığını gösterir.
Gördüklerimiz ve Yorumumuz:
Bu grafik, ilk 5 temel bileşenin (PC1, PC2, …) her birinin hangi orijinal değişkenlerle güçlü bir şekilde ilişkili olduğunu gösterir. Çubuk ne kadar uzunsa, o değişkenin o temel bileşeni oluşturmadaki rolü o kadar büyüktür.
smoker_yes,
smoker_no ve
charges olduğunu görüyoruz.
smoker_yes ve charges’ın çubukları aynı
(negatif) yöndeyken, smoker_no’nun çubuğu zıt (pozitif)
yöndedir.sex
(cinsiyet) ile, PC3 ve PC4’ün ise region (bölge)
değişkenlerinin farklı kategorileri ile ilişkili olduğunu görebiliriz.
Bu da bize veri setindeki diğer varyasyon kaynakları hakkında fikir
verir.Gördüğümüz gibi, DataExplorer::create_report()
fonksiyonu, Keşifsel Veri Analizi’nin ilk ve en önemli adımlarını
inanılmaz bir hızla gerçekleştirerek bize saatler kazandırdı. Bölüm
5.1’de adım adım keşfettiğimiz temel bulguların neredeyse tamamını
(değişken dağılımları, eksik veri durumu, temel ilişkiler) tek bir
komutla teyit etmiş olduk.
Bu rapor, bize aynı zamanda serimizin gelecek bölümlerinde derinlemesine dalacağımız bazı ileri seviye konular hakkında da bir ön izleme sundu:
charges
değişkeninin normal dağılımdan ne kadar uzak olduğunu görsel olarak
gördük. Bir değişkenin dağılımını “normale” yaklaştırmak için
log gibi dönüşümler yapma sanatını ve bu
durumu istatistiksel olarak test edeceğimiz normallik
testlerini ilerideki bölümlerde işleyeceğiz.smoker_yes ve charges arasındaki güçlü
ilişkiyi (0.79) bize sayısal olarak gösterdi. İki değişken arasındaki
ilişkinin istatistiksel olarak “anlamlı” olup olmadığını test etmeyi ve
korelasyonun inceliklerini gelecek maceralarımızda öğreneceğiz.Şimdilik bu analizleri, veri setimiz hakkında bize hızlıca “fikir veren” güçlü araçlar olarak düşünebiliriz.
DataExplorer bize adanın genel bir haritasını verdi.
Ancak bu harita, her patikayı veya her küçük dereyi göstermez. Bazen,
belirli bölgelere daha yakından bakmak veya haritada olmayan detayları
keşfetmek için farklı bir alet gerekir.
İşte bu noktada bir sonraki aracımız devreye giriyor. Bir
sonraki adımımız, summarytools ile Detaylı ve Şık Özetler
oluşturmak!