Giriş: Küratör Şapkamızı Takma Zamanı

Merhaba dostlar!

Önceki bölümlerde ggplot2 ile birbirinden anlamlı grafikler oluşturmayı öğrendik. Ancak bu grafikler genellikle tek başlarına duruyorlardı. Peki ya bir rapor hazırlarken, birden fazla grafiği tek bir tuvalde, anlamlı bir bütünlük içinde sunmak isteseydik?

Bu bölümde tam olarak bu ihtiyaca çözüm bulacağız ve R’da bunu yapmanın farklı yollarını keşfederek neden modern yaklaşımın genellikle daha güçlü olduğunu anlayacağız.

# Gerekli kütüphanelerimizi çağıralım
library(tidyverse) # ggplot2, dplyr ve diğerleri için
library(patchwork) # Grafikleri birleştirme sihirbazımız

# Serimiz boyunca tutarlı ve temiz bir görünüm için varsayılana ayarlayalım
theme_set(theme_light())

1. Problemi Tanımlayalım: “Toplu Gösterim İhtiyacı”

Hadi bir senaryo ile başlayalım: Elimizdeki mpg veri setinde bulunan tüm sayısal değişkenlerin dağılımını (histogramlarını) hızlıca görmek istiyoruz. Amacımız, veri setinin genel bir panoramasını çekmek.

Bu grafikleri tek tek çizmek yerine, hepsini tek bir tuvalde nasıl sergileyebiliriz? İşte bu bölümün ana sorusu bu.

2. Yaklaşım 1: “Tek Tek Ama Otomatik” (Slayt Gösterisi Yöntemi)

İlk akla gelen yöntem, bir for döngüsü kullanarak her bir sayısal değişken için bir ggplot grafiği oluşturup print() fonksiyonu ile ekrana bastırmak olabilir.

# eval=FALSE çünkü bu kod Rmd dosyasını çok sayıda grafikle doldurur.
# Sadece mantığı göstermek için R konsolunda denenebilir.

# Sayısal değişkenlerin isimlerini alalım
numeric_vars <- mpg %>% select_if(is.numeric) %>% names()

# Her değişken için bir ggplot histogramı çiz ve ekrana bas
for (var in numeric_vars) {
  p <- ggplot(mpg, aes_string(x = var)) +
    geom_histogram(fill = "steelblue", color = "white", bins = 20) +
    labs(title = paste("Dağılım:", var))
  
  print(p) # Grafiği ekrana çizdir
}

Bu kodu R konsolunda çalıştırırsanız, RStudio’nun “Plots” panelinde grafiklerin birbiri ardına çizildiğini görürsünüz. Ancak onları sadece ileri-geri oklarıyla gezebilirsiniz. Bu yöntem, grafikleri bir araya getirip tek bir bütün olarak sunmaz. Bu bir “sergi” değil, sadece peş peşe bir “slayt gösterisi” gibidir. Kontrol bizde değildir ve bir rapor için kesinlikle kullanışsızdır.

Gördüğümüz gibi, bu yöntem bize tek bir bütünleşik çıktı vermiyor. Bize, grafikleri tek bir tuvalde düzenleyecek bir yöntem lazım. Gelin R’da bunu yapmanın yollarını inceleyelim.

3. Yaklaşım 2: “Klasik Yöntem (Base R ile Çalışan Çözüm)”

R’ın temel (“Base R”) fonksiyonlarını kullanarak bu problemi çözebiliriz. par(mfrow = ...) fonksiyonu, çizim alanını belirli bir satır ve sütun sayısına bölmemizi sağlar. Ardından bir for döngüsü içinde Base R’ın hist() fonksiyonunu kullanarak her bir değişken için histogram çizebiliriz.

Bu yöntem işe yarar, ancak bir veri kaşifinin işi sadece çalışan kod yazmak değil, aynı zamanda bulgularını en anlaşılır ve profesyonel şekilde sunmaktır. Bu da genellikle grafiklerdeki etiketleri kendi dilimize çevirmeyi gerektirir.

Ustalık Notu: Grafikleri Kendi Dilimize Çevirmek (“Çeviri Sözlüğü” Stratejisi)

Grafiklerimizi Türkçeleştirmek için kodun içinde if (var == "displ") { etiket <- "Motor Hacmi" } gibi tek tek kontrol blokları yazmak hem yorucu, hem de hataya açık bir yöntemdir.

Bunun yerine, daha zarif ve ölçeklenebilir bir strateji izleyeceğiz: Değişken isimlerinin İngilizce ve Türkçe karşılıklarını içeren bir “sözlük” oluşturacağız. R’da bunu yapmanın en kolay yolu, isimlendirilmiş bir vektör (named vector) kullanmaktır.

Bu yaklaşım, hem kodumuzu temiz tutar hem de gelecekte yeni çeviriler eklemeyi çok kolaylaştırır. Şimdi, sonraki adımlarda kullanacağımız bu sözlüğü oluşturalım.

# --- GRAFİKLERİ TÜRKÇELEŞTİRMEK İÇİN SÖZLÜK ---
# Bu, kodumuzda esneklik sağlar.
# Vektörün "isimleri" (names) orijinal değişken adları, 
# "değerleri" ise bizim istediğimiz Türkçe karşılıklarıdır.
# R, bu yapı sayesinde ceviri_sozlugu["displ"] dediğimizde bize "Motor Hacmi"ni verir.

ceviri_sozlugu <- c(
  "displ" = "Motor Hacmi",
  "year" = "Model Yili",
  "cyl" = "Silindir Sayisi",
  "cty" = "Sehir Ici Tuketim (MPG)",
  "hwy" = "Otoyol Tuketimi (MPG)"
)

Şimdi, oluşturduğumuz bu ‘sözlüğü’ kullanarak hem klasik hem de modern yöntemle üreteceğimiz grafikleri nasıl Türkçeleştireceğimize bakalım.

Klasik Yöntemin Koda Dökümü

# Az önce oluşturduğumuz 'ceviri_sozlugu'nü burada kullanacağız.

# 1. Sadece sayısal değişkenlerin isimlerini alalım
numeric_vars_indices <- sapply(mpg, is.numeric)
numeric_var_names <- names(mpg)[numeric_vars_indices]

# 2. Grafik düzenini ayarlayalım
old_par <- par(mfrow = c(2, 3))

# 3. Her sayısal değişken için bir histogram çizelim
for (var in numeric_var_names) {
  
  # Sözlükten Türkçe karşılığı alalım.
  # Eğer sözlükte o değişken için bir çeviri yoksa, orijinal ismi kullanır.
  turkce_isim <- ceviri_sozlugu[var]
  if (is.na(turkce_isim)) {
    turkce_isim <- var
  }
  
  hist(mpg[[var]],
       main = paste(turkce_isim, "Dagilimi"), 
       xlab = turkce_isim,
       ylab = "Frekans",
       col = "lightgreen",
       border = "gray")
}

# 4. Grafik ayarlarını varsayılana geri döndürelim
par(old_par)

Gördüğünüz gibi, bu yöntem hem çalışıyor hem de oluşturduğumuz ‘sözlük’ sayesinde etiketlerimiz artık tamamen Türkçe ve anlaşılır. Bu, hızlı bir ön inceleme için oldukça pratiktir. Peki madem bu çalışıyor, neden yeni bir şeye ihtiyacımız var? Çünkü bu “iyi” bir çözüm olsa da, “daha iyisi” var.

Ustalık Notu: Klasik Yöntemin Sınırları

  1. Estetik Esneklik: Bu grafiklerin görünümünü özelleştirmek (ggplot’taki gibi temalar eklemek, renkleri başka bir değişkene göre ayarlamak) çok daha zahmetlidir.
  2. “Çiz ve Unut” Mantığı: Bu grafikler çizildiği anda “tuvale basılır” ve bir nesne olarak saklanmaz. Yani sonradan bir grafiği alıp başka bir grafikle farklı bir düzende birleştiremezsiniz.
  3. Modern İş Akışından Kopukluk: Serimiz boyunca tidyverse ve ggplot2’nin sunduğu modern, tutarlı ve veri-çerçevesi-merkezli iş akışını benimsedik. Base R’ın grafik sistemi bu akışın dışında kalır.

İşte bu sınırlamalar, bizi daha esnek ve güçlü olan modern çözüme yönlendiriyor.

4. Yaklaşım 3: “İyinin Daha İyisi: Modern Yöntem (ggplot2 + patchwork)”

Modern yaklaşım, iki güçlü aracın birleşimine dayanır:

  1. ggplot2: Her bir grafiği esnek ve özelleştirilebilir birer “nesne” olarak oluşturmak için.
  2. patchwork: Bu ggplot nesnelerini inanılmaz bir kolaylıkla bir araya getirmek için.

Tıpkı yukarıda yaptığımız gibi, “çeviri sözlüğümüzü” kullanarak ggplot2 ile oluşturduğumuz grafikleri de tamamen Türkçeleştireceğiz.

Adım 4a: Programatik Güç (wrap_plots())

Klasik yöntemde for döngüsü ile yaptığımız işin modern karşılığı, ggplot nesnelerini bir listede toplayıp wrap_plots() fonksiyonuna vermektir.

Modern Yöntemin Koda Dökümü

# 1. Grafik nesnelerini saklamak için boş bir liste oluşturalım
plot_list <- list()

# 2. 'for' döngüsü ile her değişken için bir ggplot nesnesi oluşturup listeye ekleyelim
for (var in numeric_var_names) {
  
  # Sözlükten Türkçe karşılığı alıyoruz
  turkce_isim <- ceviri_sozlugu[var]
  if (is.na(turkce_isim)) {
    turkce_isim <- var
  }
  
  p <- ggplot(mpg, aes_string(x = var)) +
    geom_histogram(bins = 15, fill = "skyblue", color = "white") +
    labs(
      title = turkce_isim,      # Başlık olarak Türkçe ismi kullan
      x = turkce_isim,          # X ekseni için Türkçe ismi kullanıyoruz
      y = "Frekans"             # Y ekseni için Türkçe etiket
    )
  
  plot_list[[var]] <- p
}

# 3. wrap_plots() ile grafikleri birleştirelim
wrap_plots(plot_list, ncol = 3)

Base R yöntemiyle neredeyse aynı görseli elde ettik, ancak çok önemli bir farkla: Artık her bir grafiğimiz (plot_list içindeki p’ler) hala yaşayan, üzerinde değişiklik yapabileceğimiz, kaydedebileceğimiz veya başka düzenlerde kullanabileceğimiz birer R nesnesi!

Ustalık Notu: Görsel Tekrar ve Minimalist Tasarım

Harika bir iş çıkardık ve az önceki kodumuzla her grafiğin x eksenine kendi kimliğini verdik. Bu, genellikle en doğru ve en bilgilendirici yaklaşımdır. Ancak bir veri kaşifi olarak alet çantanızda farklı tasarım felsefelerinin de olması gerekir.

Bir an düşünün: Grafiğin başlığında zaten “Motor Hacmi” yazıyorsa, x ekseninde tekrar “Motor Hacmi” yazmak gerçekten gerekli mi? Bu tür durumlarda, görsel bir “tekrar” oluşur. Daha temiz, daha minimalist bir görünüm elde etmek ve okuyucunun doğrudan veriye odaklanmasını sağlamak için bazen bu tekrarı ortadan kaldırmak isteyebiliriz.

İşte bu noktada labs() fonksiyonunun bir başka gücü devreye giriyor: Bir etiketi NULL olarak ayarlayarak onu tamamen kaldırabiliriz.

# ...döngünün içindeki labs() fonksiyonunu şu şekilde düzenleyebiliriz...
labs(
  title = turkce_isim, # Başlık zaten değişkeni belirtiyor
  x = NULL,            # x ekseni etiketini tamamen kaldırır
  y = "Frekans"
)

Peki, hangisi “doğru”? İkisi de! Bu tamamen sizin tasarım tercihinize ve anlatmak istediğiniz hikayeye bağlı. Eğer her bilginin en açık şekilde yer almasını istiyorsanız, eksen etiketini kullanın. Eğer daha sade ve modern bir sunum hedefliyorsanız, etiketi kaldırarak grafiğin “nefes almasını” sağlayabilirsiniz. Unutmayın, siz bu veri sergisinin küratörüsünüz!

Adım 4b: Esnekliğin Zirvesi (+ ve / ile İnteraktif Düzenleme)

patchwork’ün asıl devrimci yönü, farklı türdeki ggplot nesnelerini birleştirmenin çocuk oyuncağı olmasıdır. Şimdi bu esnekliği, grafiklerimizin her bir noktasını (başlıklar, eksenler, lejant başlığı ve hatta lejantın içindeki etiketler) tamamen kendi dilimize çevirerek birleştirelim ve ustalığımızı sergileyelim.

# --- 1. ADIM: GENEL ÇEVİRİ SÖZLÜĞÜMÜZ ---
# Eksen ve lejant başlıkları için kullanacağımız sözlük.
ceviri_sozlugu_genisletilmis <- c(
  "displ" = "Motor Hacmi",
  "hwy" = "Otoyol Tuketimi (MPG)",
  "class" = "Arac Sinifi",
  "manufacturer" = "Uretici Firma"
)

# --- 2. ADIM: LEJANT İÇERİĞİ İÇİN ÖZEL SÖZLÜK ---
# `class` değişkeninin içindeki her bir değer için Türkçe karşılık.
# Bu, sadece lejantın *içindeki* etiketleri değiştirmek için kullanılacak.
sinif_ceviri_sozlugu <- c(
  "compact" = "Kompakt",
  "midsize" = "Orta Boy",
  "suv" = "SUV",
  "2seater" = "2 Koltuklu Spor",
  "minivan" = "Minivan",
  "pickup" = "Kamyonet",
  "subcompact" = "Kucuk Boy"
)


# --- 3. ADIM: GRAFİKLERİ OLUŞTURMA ---

# Grafik 1: Tamamen Türkçeleştirilmiş Saçılım Grafiği
p_scatter_tamamen_turkce <- ggplot(mpg, aes(x = displ, y = hwy)) + 
  geom_point(aes(color = class)) +
  # Başlıkları, altyazıyı ve eksen etiketlerini `labs()` ile ayarlıyoruz.
  # Lejant başlığını da `color = ...` diyerek burada belirtiyoruz.
  labs(
    title = "Motor Hacmi ve Yakit Tuketimi Iliskisi",
    subtitle = "Arac Sinifina Gore Renklendirilmistir",
    x = ceviri_sozlugu_genisletilmis["displ"],
    y = ceviri_sozlugu_genisletilmis["hwy"],
    color = ceviri_sozlugu_genisletilmis["class"]
  ) + 
  # YENİ KATMAN: İşte sihir burada!
  # `scale_color_discrete` ile lejantın İÇERİĞİNİ değiştiriyoruz.
  scale_color_discrete(labels = sinif_ceviri_sozlugu)


# Grafik 2: Tamamen Türkçeleştirilmiş Bar Grafiği
p_bar_turkce <- ggplot(mpg, aes(y = manufacturer)) + 
  geom_bar(fill = "steelblue") +
  labs(
    title = "Ureticilere Gore Arac Dagilimi",
    y = ceviri_sozlugu_genisletilmis["manufacturer"],
    x = "Arac Sayisi"
  )

# --- 4. ADIM: TAM KONTROL SAHİBİ OLDUĞUMUZ GRAFİKLERİ BİRLEŞTİRME ---
p_scatter_tamamen_turkce + p_bar_turkce

Neden Modern Yöntem?

patchwork’ün asıl devrimci yönü, bu ggplot nesnelerini inanılmaz bir kolaylıkla bir araya getirmektir. Örneğin, az önce oluşturduğumuz o tamamen Türkçeleştirilmiş iki farklı grafiği (p_scatter_tamamen_turkce ve p_bar_turkce) yan yana koyup, bu ikilinin altına da daha önce oluşturduğumuz histogram listesinden bir grafiği (plot_list içindeki “Motor Hacmi” grafiği) ekleyebiliriz.

Bu tür karmaşık ve iç içe düzenler oluşturmak, par(mfrow)’un basit grid yapısıyla neredeyse imkansızdır. Gelin bu gücü canlı olarak görelim:

# Karmaşık bir düzen oluşturalım:
# Üst sırada: Saçılım grafiği + Bar grafiği
# Alt sırada: Histogram listemizden "Motor Hacmi" grafiği

# Gerekli nesnelerimiz zaten önceki kod bloklarında oluşturulmuştu.
# Sadece onları bir araya getiriyoruz.
ust_sira <- p_scatter_tamamen_turkce + p_bar_turkce
alt_sira <- plot_list[["displ"]] # "displ" (Motor Hacmi) histogramını seçiyoruz

# Şimdi bu iki sırayı `/` operatörü ile alt alta koyalım
ust_sira / alt_sira

İşte patchwork’ün büyüsü budur! Serimizin felsefesi olan “ustalığa” giden yolda, ggplot2 ve patchwork ikilisi, veri hikayelerinizi anlatırken size sınırsız bir yaratıcılık ve kontrol imkanı verecektir.

Özet: Sanat Eserinden Profesyonel Sergiye

Bravo dostlar! Bu bölümde, tekil sanat eserleri gibi duran grafiklerimizi alıp onları profesyonel bir sergiye dönüştürme sanatını öğrendik. Birden çok grafiği bir araya getirme problemini çözmek için çıktığımız bu yolda, üç farklı yaklaşımı karşılaştırdık ve her birinden önemli dersler çıkardık:

  1. Slayt Gösterisi Yöntemi (print + for): Bir rapor için çözüm olmadığını, sadece peş peşe bir gösterim olduğunu anladık.

  2. Klasik Yöntem (par + hist): Hızlı ve çalışan bir çözüm olduğunu gördük. Hatta bir “çeviri sözlüğü” tekniğiyle etiketlerini nasıl Türkçeleştireceğimizi bile öğrendik. Ancak "çiz ve unut" mantığı ve modern ggplot akışıyla uyumsuzluğu gibi önemli sınırları olduğunu da fark ettik.

  3. Modern Yöntem (ggplot + patchwork): “İyinin daha iyisi” olan bu yaklaşımın neden “altın standart” olduğunu kanıtladık. Bu yöntem bize sadece nesne tabanlı ve düzenleme konusunda esnek bir çözüm sunmakla kalmadı, aynı zamanda bir grafiğin her bir zerresini kontrol etme gücü verdi:

    • labs() ile başlıkları ve eksenleri,
    • scale_*() fonksiyon ailesi ile lejant başlıklarından içindeki en küçük etiketlere kadar her detayı,
    • Ve + ile / operatörleriyle en karmaşık sergi düzenlerini bile kolayca oluşturmayı öğrendik.

Serimizin felsefesi olan “ustalığa” giden yolda, ggplot2 ve patchwork ikilisi, veri hikayelerinizi anlatırken size sınırsız bir yaratıcılık ve kontrol imkanı verecektir.

Bir Sonraki Durağımız: Uygulama ve Hız Kazanma!

Peki, bu kazandığımız yeni süper güçleri nerede kullanacağız? Veri Görselleştirme Sanatı’nın temellerini ve ustalık dokunuşlarını öğrendiğimize göre, artık vites yükseltme zamanı geldi!

Bir sonraki durağımız, iki aşamadan oluşacak olan Bölüm 5: Uygulama ve Hız Kazanma olacak.

Mini-Bölüm 5.1: Bir Veri Kaşifinin Günlüğü - Sigorta Masrafları EDA Projesi

İlk olarak, Mini-Bölüm 5.1: Bir Veri Kaşifinin Günlüğü - Sigorta Masrafları EDA Projesi ile sahaya ineceğiz. Bu bölümde, yaş, sigara kullanımı veya yaşanılan bölge gibi faktörlerin bir kişinin sağlık sigortası maliyetlerini nasıl etkilediğini araştıracağız. Şu ana kadar öğrendiğimiz dplyr, ggplot2 ve patchwork yeteneklerimizi kullanarak baştan sona gerçek bir Keşifsel Veri Analizi projesi gerçekleştireceğiz. Teoriyi pratiğe dökeceğimiz bu macera, öğrendiklerimizin bir araya geldiğinde ne kadar güçlü olduğunu bize kanıtlayacak.

Mini-Bölüm 5.2: Veri Kaşifinin Pusulası - Otomatik EDA Paketleri

Hemen ardından, Mini-Bölüm 5.2: Veri Kaşifinin Pusulası - Otomatik EDA Paketleri bölümünde işleri bir üst vitese takacağız. Projeyi “elle” yapmanın ardındaki mantığı anladıktan sonra, DataExplorer, summarytools ve SmartEDA gibi güçlü paketler sayesinde tüm bu keşif sürecini tek bir komutla nasıl otomatize edebileceğimizi ve projelerimize başlarken nasıl inanılmaz bir hız kazanabileceğimizi göreceğiz.

Hazır olun, çünkü alet çantamızı doldurduk ve şimdi gerçek keşiflere başlıyoruz. Lütfen veriyle kalın, takipte kalın dostlar!