1  Veri görselleştirme

1.1 Giriş

“Basit bir grafik, veri analistinin zihnine başka herhangi bir araçtan daha fazla bilgi taşımıştır.” — John Tukey

R’ın grafik oluşturmak için birkaç sistemi vardır, ancak ggplot2 en zarif ve en çok yönlü olanlardan biridir. ggplot2, grafikleri tanımlamak ve oluşturmak için tutarlı bir sistem olan grafik gramerini uygular. ggplot2 ile, tek bir sistemi öğrenip pek çok yerde uygulayarak daha fazlasını daha hızlı yapabilirsiniz.

Bu bölümde verilerinizi ggplot2 kullanarak nasıl görselleştireceğinizi öğreneceksiniz. Basit bir saçılım grafiği (scatterplot) oluşturarak başlayacak ve bu grafik üzerinden ggplot2’nin temel yapı taşları olan estetik eşlemeleri ve geometrik nesneleri tanıtacağız. Ardından tek bir değişkenin dağılımını ve iki ya da daha fazla değişken arasındaki ilişkileri nasıl görselleştireceğinizi adım adım göstereceğiz. Bölümü, grafiklerinizi kaydetmeyi ve yaygın sorunları gidermeyi ele alarak tamamlayacağız.

1.1.1 Ön koşullar

Bu bölüm, tidyverse’in çekirdek paketlerinden biri olan ggplot2’ye odaklanır. Bu bölümde kullanılan veri kümelerine, yardım sayfalarına ve fonksiyonlara erişmek için tidyverse’i şu şekilde yükleyin:

library(tidyverse)
#> ── Attaching core tidyverse packages ───────────────────── tidyverse 2.0.0 ──
#> ✔ dplyr     1.2.1     ✔ readr     2.2.0
#> ✔ forcats   1.0.1     ✔ stringr   1.6.0
#> ✔ ggplot2   4.0.3     ✔ tibble    3.3.1
#> ✔ lubridate 1.9.5     ✔ tidyr     1.3.2
#> ✔ purrr     1.2.2     
#> ── Conflicts ─────────────────────────────────────── tidyverse_conflicts() ──
#> ✖ dplyr::filter() masks stats::filter()
#> ✖ dplyr::lag()    masks stats::lag()
#> ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Bu tek satırlık kod, neredeyse her veri analizinde kullanacağınız paketleri, yani tidyverse’in çekirdeğini yükler. Ayrıca tidyverse’deki hangi fonksiyonların temel R fonksiyonlarıyla veya yüklediğiniz diğer paketlerdeki fonksiyonlarla çakıştığını bildirir1.

Bu kodu çalıştırdığınızda there is no package called 'tidyverse' hata mesajını alırsanız, önce paketi kurmanız, ardından library()’i tekrar çalıştırmanız gerekir.

Bir paketi yalnızca bir kez kurmanız yeterlidir; ancak her yeni oturum başlattığınızda onu yeniden yüklemeniz gerekir.

tidyverse’e ek olarak iki paket daha kullanacağız: Palmer Takımadaları’ndaki üç adada yaşayan penguenlerin vücut ölçümlerini içeren penguins veri kümesini sağlayan palmerpenguins ve renk görme farklılıklarına uygun bir renk paleti sunan ggthemes.

library(palmerpenguins)
#> 
#> Attaching package: 'palmerpenguins'
#> The following objects are masked from 'package:datasets':
#> 
#>     penguins, penguins_raw
library(ggthemes)

1.2 İlk adımlar

Yüzgeci daha uzun olan penguenler, yüzgeci daha kısa olan penguenlerden daha ağır mı yoksa daha hafif midir? Muhtemelen zaten bir cevabınız var, ancak cevabınızı biraz daha kesinleştirmeye çalışın. Yüzgeç uzunluğu ile vücut kütlesi arasındaki ilişki nasıl görünüyor? Pozitif mi? Negatif mi? Doğrusal mı? Doğrusal değil mi? Bu ilişki penguenin türüne göre değişiyor mu? Peki ya penguenin yaşadığı adaya göre? Bu sorulara cevap vermek için kullanabileceğimiz görselleştirmeler oluşturalım.

1.2.1 penguins veri çerçevesi

Bu sorulara verdiğiniz yanıtları palmerpenguins paketindeki penguins veri çerçevesiyle (diğer adıyla palmerpenguins::penguins) sınayabilirsiniz. Bir veri çerçevesi, sütunlarda değişkenlerin ve satırlarda gözlemlerin yer aldığı dikdörtgen biçimli bir koleksiyondur. penguins, Dr. Kristen Gorman ve Palmer İstasyonu, Antarktika LTER tarafından toplanıp kullanıma sunulan 344 gözlem içerir2.

Tartışmayı kolaylaştırmak için bazı terimleri tanımlayalım:

  • Bir değişken (variable), ölçebileceğiniz bir miktar, nitelik veya özelliktir.

  • Bir değer (value), bir değişkeni ölçtüğünüzde aldığı durumdur. Bir değişkenin değeri, ölçümden ölçüme değişebilir.

  • Bir gözlem (observation), benzer koşullar altında yapılan bir ölçümler kümesidir (bir gözlemdeki tüm ölçümleri genellikle aynı anda ve aynı nesne üzerinde yaparsınız). Bir gözlem, her biri farklı bir değişkenle ilişkili birkaç değer içerir. Bir gözleme bazen veri noktası da diyeceğiz.

  • Tablo biçimindeki veri (tabular data), her biri bir değişken ve bir gözlemle ilişkilendirilmiş değerler kümesidir. Her değer kendi “hücresine”, her değişken kendi sütununa ve her gözlem kendi satırına yerleştirilmişse veri düzenlidir (tidy).

Bu bağlamda bir değişken, tüm penguenlerin ortak bir özelliğini; bir gözlem ise tek bir penguenin tüm özelliklerini ifade eder.

Veri çerçevesinin adını konsola yazdığınızda R, içeriğinin bir önizlemesini gösterir. Bu önizlemenin üstünde tibble yazdığına dikkat edin. tidyverse’de, yakında daha ayrıntılı öğreneceğiniz tibble adlı özel veri çerçeveleri kullanırız.

penguins
#> # A tibble: 344 × 8
#>   species island    bill_length_mm bill_depth_mm flipper_length_mm
#>   <fct>   <fct>              <dbl>         <dbl>             <int>
#> 1 Adelie  Torgersen           39.1          18.7               181
#> 2 Adelie  Torgersen           39.5          17.4               186
#> 3 Adelie  Torgersen           40.3          18                 195
#> 4 Adelie  Torgersen           NA            NA                  NA
#> 5 Adelie  Torgersen           36.7          19.3               193
#> 6 Adelie  Torgersen           39.3          20.6               190
#> # ℹ 338 more rows
#> # ℹ 3 more variables: body_mass_g <int>, sex <fct>, year <int>

Bu veri çerçevesi 8 sütun içerir. Tüm değişkenleri ve her değişkenin ilk birkaç gözlemini görebileceğiniz alternatif bir görünüm için glimpse() fonksiyonunu kullanın. Ya da RStudio kullanıyorsanız, etkileşimli bir veri görüntüleyici açmak için View(penguins) çalıştırın.

glimpse(penguins)
#> Rows: 344
#> Columns: 8
#> $ species           <fct> Adelie, Adelie, Adelie, Adelie, Adelie, Adelie, A…
#> $ island            <fct> Torgersen, Torgersen, Torgersen, Torgersen, Torge…
#> $ bill_length_mm    <dbl> 39.1, 39.5, 40.3, NA, 36.7, 39.3, 38.9, 39.2, 34.…
#> $ bill_depth_mm     <dbl> 18.7, 17.4, 18.0, NA, 19.3, 20.6, 17.8, 19.6, 18.…
#> $ flipper_length_mm <int> 181, 186, 195, NA, 193, 190, 181, 195, 193, 190, …
#> $ body_mass_g       <int> 3750, 3800, 3250, NA, 3450, 3650, 3625, 4675, 347…
#> $ sex               <fct> male, female, female, NA, female, male, female, m…
#> $ year              <int> 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007, 2…

penguins içindeki değişkenlerden bazıları şunlardır:

  1. species: penguenin türü (Adelie, Chinstrap veya Gentoo).

  2. flipper_length_mm: penguenin yüzgeç uzunluğu, milimetre cinsinden.

  3. body_mass_g: penguenin vücut kütlesi, gram cinsinden.

penguins hakkında daha fazla bilgi edinmek için ?penguins çalıştırarak yardım sayfasını açın.

1.2.2 Nihai hedef

Bu bölümdeki nihai hedefimiz, penguenlerin türünü de dikkate alarak yüzgeç uzunluğu ile vücut kütlesi arasındaki ilişkiyi gösteren aşağıdaki görselleştirmeyi yeniden oluşturmaktır.

Penguenlerin vücut kütlesine karşı yüzgeç uzunluğunun saçılım grafiği; bu iki değişken arasındaki ilişkiye ait en iyi uyum çizgisi üzerine bindirilmiştir. Grafik, bu iki değişken arasında pozitif, oldukça doğrusal ve nispeten güçlü bir ilişki göstermektedir. Türler (Adelie, Chinstrap ve Gentoo) farklı renk ve şekillerle temsil edilmiştir. Vücut kütlesi ile yüzgeç uzunluğu arasındaki ilişki bu üç tür için kabaca aynıdır ve Gentoo penguenleri diğer iki türden daha büyüktür.

1.2.3 Bir ggplot oluşturma

Bu grafiği adım adım yeniden oluşturalım.

ggplot2 ile grafik oluşturmaya, üzerine katmanlar ekleyeceğiniz bir grafik nesnesi tanımlayan ggplot() fonksiyonuyla başlarsınız. ggplot()’un ilk argümanı grafikte kullanılacak veri kümesidir. Dolayısıyla ggplot(data = penguins), penguins verisini göstermeye hazır bir grafik oluşturur; ancak verileri nasıl görselleştireceğini henüz belirtmediğimiz için grafik şimdilik boştur. Bu pek heyecan verici bir grafik değil, ama bunu grafiğinizin kalan katmanlarını üzerine boyayacağınız boş bir tuval gibi düşünebilirsiniz.

ggplot(data = penguins)

Boş, gri bir grafik alanı.

Sırada, ggplot()’a verimizdeki bilginin görsel olarak nasıl temsil edileceğini söylemek var. ggplot() fonksiyonunun mapping argümanı, veri kümenizdeki değişkenlerin grafiğinizin görsel özelliklerine, yani estetiklere (aesthetics), nasıl eşleneceğini tanımlar. mapping argümanı her zaman aes() fonksiyonu içinde tanımlanır ve aes()’in x ve y argümanları, x ve y eksenlerine hangi değişkenlerin eşleneceğini belirtir. Şimdilik yalnızca yüzgeç uzunluğunu x estetiğine, vücut kütlesini ise y estetiğine eşleyeceğiz. ggplot2, eşlenen değişkenleri data argümanında, bu durumda penguins içinde arar.

Aşağıdaki grafik, bu eşlemeleri eklemenin sonucunu gösterir.

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g)
)

Grafik, x ekseninde 170 ile 230 arasında değerler alan yüzgeç uzunluğunu ve y ekseninde 3.000 ile 6.000 arasında değerler alan vücut kütlesini göstermektedir.

Boş tuvalimiz artık daha fazla yapıya sahip: Yüzgeç uzunluklarının nerede (x ekseninde), vücut kütlelerinin nerede (y ekseninde) gösterileceği netleşti. Ama penguenlerin kendileri henüz grafikte değil. Bunun nedeni, veri çerçevemizdeki gözlemleri grafiğimizde nasıl temsil edeceğimizi kodumuzda henüz ifade etmemiş olmamız.

Bunu yapmak için bir geom, yani grafiğin verileri temsil etmekte kullandığı geometrik nesneyi tanımlamamız gerekir. Bu geometrik nesneler, ggplot2’de geom_ ile başlayan fonksiyonlar aracılığıyla kullanıma sunulur. İnsanlar genellikle grafikleri, kullandıkları geom türüne göre tanımlar. Örneğin çubuk grafikler çubuk geom’larını (geom_bar()), çizgi grafikleri çizgi geom’larını (geom_line()), kutu grafikleri kutu geom’larını (geom_boxplot()), saçılım grafikleri ise nokta geom’larını (geom_point()) kullanır.

geom_point() fonksiyonu, grafiğinize bir nokta katmanı ekler ve bu da bir saçılım grafiği oluşturur. ggplot2, her biri bir grafiğe farklı bir katman türü ekleyen pek çok geom fonksiyonuyla birlikte gelir. Kitap boyunca, özellikle Bölüm 9 bölümünde, pek çok geom öğreneceksiniz.

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +
  geom_point()
#> Warning: Removed 2 rows containing missing values or values outside the scale range
#> (`geom_point()`).

Penguenlerin vücut kütlesine karşı yüzgeç uzunluğunun saçılım grafiği. Grafik, bu iki değişken arasında pozitif, doğrusal ve nispeten güçlü bir ilişki göstermektedir.

Artık “saçılım grafiği” diyebileceğimiz bir grafiğimiz var. Henüz nihai hedefimizdeki grafikle aynı değil, ancak keşfimizi başlatan soruyu yanıtlamaya başlayabiliriz: “Yüzgeç uzunluğu ile vücut kütlesi arasındaki ilişki nasıl görünüyor?” İlişki pozitif (yüzgeç uzunluğu arttıkça vücut kütlesi de artıyor), oldukça doğrusal (noktalar bir eğri yerine bir çizgi etrafında kümelenmiş) ve orta düzeyde güçlü (bu çizginin çevresinde fazla saçılma yok) görünüyor. Yüzgeci daha uzun penguenler genellikle daha büyük vücut kütlesine sahiptir.

Bu grafiğe daha fazla katman eklemeden önce, bir an durup aldığımız uyarı mesajını gözden geçirelim:

Removed 2 rows containing missing values (geom_point()).

Bu mesajı görmemizin nedeni, veri kümemizde vücut kütlesi ya da yüzgeç uzunluğu değerlerinden en az biri eksik olan iki penguen bulunmasıdır. ggplot2, her iki değer de olmadan penguenleri grafikte gösteremez. R gibi, ggplot2 de eksik değerlerin asla sessizce kaybolmaması gerektiği felsefesine bağlıdır. Bu, gerçek verilerle çalışırken karşılaşacağınız en yaygın uyarılardan biridir. Eksik değerler çok sık görülür; kitap boyunca, özellikle Bölüm 18 bölümünde, bu konu hakkında daha fazla bilgi edineceksiniz. Bu bölümdeki diğer grafiklerin her birinin yanında görünmemesi için bu uyarıyı bastıracağız.

1.2.4 Estetikler ve katmanlar ekleme

Saçılım grafikleri, iki sayısal değişken arasındaki ilişkiyi göstermek için kullanışlıdır; ancak iki değişken arasındaki görünürdeki her ilişkiye şüpheyle yaklaşmak ve bu görünürdeki ilişkinin doğasını açıklayabilecek veya değiştirebilecek başka değişkenler olup olmadığını sormak her zaman iyi bir fikirdir. Örneğin yüzgeç uzunluğu ile vücut kütlesi arasındaki ilişki türe göre farklılık gösteriyor mu? Türü grafiğimize ekleyelim ve bunun, değişkenler arasındaki görünürdeki ilişkiye ilişkin yeni içgörüler sağlayıp sağlamadığına bakalım. Bunu, türleri farklı renkli noktalarla temsil ederek yapacağız.

Bunu yapmak için estetik eşlemeyi mi yoksa geom’u mu değiştirmemiz gerekir? “Estetik eşlemeyi, aes() içinde” diye tahmin ettiyseniz ggplot2 ile veri görselleştirmeleri oluşturmanın püf noktasını kavramaya başlamışsınız demektir! Tahmin edemediyseniz hiç sorun değil. Kitap boyunca çok daha fazla ggplot yapacak ve bunları yaparken sezgilerinizi kontrol etmek için çok daha fazla fırsatınız olacak.

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g, color = species)
) +
  geom_point()

Penguenlerin vücut kütlesine karşı yüzgeç uzunluğunun saçılım grafiği. Grafik, bu iki değişken arasında pozitif, oldukça doğrusal ve nispeten güçlü bir ilişki göstermektedir. Türler (Adelie, Chinstrap ve Gentoo) farklı renklerle temsil edilmiştir.

Kategorik bir değişken bir estetiğe eşlendiğinde ggplot2, değişkenin her benzersiz düzeyine (üç türün her birine) estetiğin benzersiz bir değerini (burada farklı bir renk) otomatik olarak atar. Bu sürece ölçekleme (scaling) denir. ggplot2 ayrıca hangi değerlerin hangi düzeylere karşılık geldiğini açıklayan bir gösterge (legend) ekler.

Şimdi bir katman daha ekleyelim: vücut kütlesi ile yüzgeç uzunluğu arasındaki ilişkiyi gösteren düzgün bir eğri (smooth curve). Devam etmeden önce, yukarıdaki koda geri dönün ve bunu mevcut grafiğimize nasıl ekleyebileceğimizi düşünün.

Bu, verimizi temsil eden yeni bir geometrik nesne olduğundan, nokta geom’umuzun üzerine bir katman olarak yeni bir geom ekleyeceğiz: geom_smooth(). Ve method = "lm" ile doğrusal (linear) bir modele dayalı en iyi uyum çizgisini çizmek istediğimizi belirteceğiz.

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g, color = species)
) +
  geom_point() +
  geom_smooth(method = "lm")

Penguenlerin vücut kütlesine karşı yüzgeç uzunluğunun saçılım grafiği. Saçılım grafiğinin üzerine, bu değişkenler arasındaki ilişkiyi her tür (Adelie, Chinstrap ve Gentoo) için gösteren üç düzgün eğri bindirilmiştir. Farklı penguen türleri, noktalar ve düzgün eğriler için farklı renklerle çizilmiştir.

Çizgileri başarıyla ekledik, ancak bu grafik Bölüm 1.2.2 bölümündeki grafiğe benzemiyor. O grafikte her penguen türü için ayrı çizgiler yerine tüm veri kümesi için tek bir çizgi vardı.

Estetik eşlemeler ggplot() içinde, yani genel (global) düzeyde tanımlandığında grafiğin sonraki tüm geom katmanlarına aktarılır. Ancak ggplot2’deki her geom fonksiyonu bir mapping argümanı da alabilir; böylece genel düzeyden devralınan eşlemelere yerel düzeyde yeni estetik eşlemeler eklenebilir. Noktaların türe göre renklendirilmesini istediğimiz, ancak çizgilerin türlere göre ayrılmasını istemediğimiz için, color = species’i yalnızca geom_point() için belirtmeliyiz.

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +
  geom_point(mapping = aes(color = species)) +
  geom_smooth(method = "lm")

Penguenlerin vücut kütlesine karşı yüzgeç uzunluğunun saçılım grafiği. Saçılım grafiğinin üzerine, bu değişkenler arasındaki genel ilişkiyi gösteren tek bir en iyi uyum çizgisi bindirilmiştir. Farklı penguen türleri yalnızca noktalar için farklı renklerle çizilmiştir.

İşte oldu! Nihai hedefimize çok benzeyen bir şeye sahibiz, ama henüz mükemmel değil. Hâlâ her penguen türü için farklı şekiller kullanmamız ve etiketleri iyileştirmemiz gerekiyor.

Bir grafikte bilgiyi yalnızca renklerle temsil etmek genellikle iyi bir fikir değildir; çünkü insanlar renk körlüğü veya diğer renk görme farklılıkları nedeniyle renkleri farklı algılar. Bu yüzden, renge ek olarak species’i shape estetiğine de eşleyebiliriz.

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +
  geom_point(mapping = aes(color = species, shape = species)) +
  geom_smooth(method = "lm")

Penguenlerin vücut kütlesine karşı yüzgeç uzunluğunun saçılım grafiği. Saçılım grafiğinin üzerine, bu değişkenler arasındaki genel ilişkiyi gösteren tek bir en iyi uyum çizgisi bindirilmiştir. Farklı penguen türleri yalnızca noktalar için farklı renk ve şekillerle çizilmiştir.

Göstergenin, noktaların farklı şekillerini de yansıtacak biçimde otomatik olarak güncellendiğine dikkat edin.

Son olarak, yeni bir katmanda labs() fonksiyonunu kullanarak grafiğimizin etiketlerini iyileştirebiliriz. labs()’a verilen argümanlardan bazıları kendini açıklıyor olabilir: title bir başlık, subtitle ise grafiğe bir alt başlık ekler. Diğer argümanlar estetik eşlemelerle örtüşür: x ve y eksen etiketlerini, color ve shape ise göstergenin etiketini tanımlar. Ayrıca, ggthemes paketindeki scale_color_colorblind() fonksiyonuyla renk paletini renk körlüğüne duyarlı hale getirerek iyileştirebiliriz.

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +
  geom_point(aes(color = species, shape = species)) +
  geom_smooth(method = "lm") +
  labs(
    title = "Vücut kütlesi ve yüzgeç uzunluğu",
    subtitle = "Adelie, Chinstrap ve Gentoo penguenlerinin ölçüleri",
    x = "Yüzgeç uzunluğu (mm)", y = "Vücut kütlesi (g)",
    color = "Tür", shape = "Tür"
  ) +
  scale_color_colorblind()

Penguenlerin vücut kütlesine karşı yüzgeç uzunluğunun saçılım grafiği; bu iki değişken arasındaki ilişkiye ait en iyi uyum çizgisi üzerine bindirilmiştir. Grafik, bu iki değişken arasında pozitif, oldukça doğrusal ve nispeten güçlü bir ilişki göstermektedir. Türler (Adelie, Chinstrap ve Gentoo) farklı renk ve şekillerle temsil edilmiştir. Vücut kütlesi ile yüzgeç uzunluğu arasındaki ilişki bu üç tür için kabaca aynıdır ve Gentoo penguenleri diğer iki türden daha büyüktür.

Sonunda nihai hedefimizle tam olarak eşleşen bir grafiğe sahibiz!

1.2.5 Alıştırmalar

  1. penguins içinde kaç satır var? Kaç sütun var?

  2. penguins veri çerçevesindeki bill_depth_mm değişkeni neyi tanımlıyor? Öğrenmek için ?penguins yardımını okuyun.

  3. bill_depth_mm’e karşı bill_length_mm’in bir saçılım grafiğini yapın. Yani, y ekseninde bill_depth_mm ve x ekseninde bill_length_mm olan bir saçılım grafiği yapın. Bu iki değişken arasındaki ilişkiyi tanımlayın.

  4. species’e karşı bill_depth_mm’in bir saçılım grafiğini yaparsanız ne olur? Daha iyi bir geom seçimi ne olabilir?

  5. Aşağıdaki kod neden bir hata veriyor ve bunu nasıl düzeltirsiniz?

    ggplot(data = penguins) +
      geom_point()
  6. geom_point()’teki na.rm argümanı ne işe yarar? Argümanın varsayılan değeri nedir? Bu argümanı TRUE olarak ayarlayarak başarıyla kullandığınız bir saçılım grafiği oluşturun.

  7. Önceki alıştırmada yaptığınız grafiğe şu açıklamayı ekleyin: “Veriler palmerpenguins paketinden alınmıştır.” İpucu: labs() dokümantasyonuna göz atın.

  8. Aşağıdaki görselleştirmeyi yeniden oluşturun. bill_depth_mm hangi estetiğe eşlenmeli? Bu eşleme genel düzeyde mi yoksa geom düzeyinde mi yapılmalı?

    Gaga derinliğine göre renklendirilmiş, penguenlerin vücut kütlesine karşı yüzgeç uzunluğunun saçılım grafiği. Vücut kütlesi ile yüzgeç uzunluğu arasındaki ilişkiyi gösteren düzgün bir eğri üzerine bindirilmiştir. İlişki pozitif, oldukça doğrusal ve orta düzeyde güçlüdür.

  9. Bu kodu kafanızda çalıştırın ve çıktının neye benzeyeceğini tahmin edin. Ardından kodu R’da çalıştırın ve tahminlerinizi kontrol edin.

    ggplot(
      data = penguins,
      mapping = aes(x = flipper_length_mm, y = body_mass_g, color = island)
    ) +
      geom_point() +
      geom_smooth(se = FALSE)
  10. Bu iki grafik farklı görünecek mi? Neden?

    ggplot(
      data = penguins,
      mapping = aes(x = flipper_length_mm, y = body_mass_g)
    ) +
      geom_point() +
      geom_smooth()
    
    ggplot() +
      geom_point(
        data = penguins,
        mapping = aes(x = flipper_length_mm, y = body_mass_g)
      ) +
      geom_smooth(
        data = penguins,
        mapping = aes(x = flipper_length_mm, y = body_mass_g)
      )

1.3 ggplot2 çağrıları

Bu giriş bölümlerini geride bırakırken ggplot2 kodunu daha kısa yazmaya başlayacağız. Şimdiye kadar her şeyi açıkça yazdık; öğrenme aşamasında bu yaklaşım yararlıdır:

ggplot(
  data = penguins,
  mapping = aes(x = flipper_length_mm, y = body_mass_g)
) +
  geom_point()

Genellikle bir fonksiyonun ilk bir veya iki argümanı o kadar önemlidir ki, onları ezbere bilmeniz gerekir. ggplot()’un ilk iki argümanı data ve mapping’dir; kitabın geri kalanında bu isimleri belirtmeyeceğiz. Bu hem daha az yazmanızı sağlar hem de fazladan metni azaltarak grafikler arasındaki farkları görmeyi kolaylaştırır. Bu önemli programlama konusuna Bölüm 25 bölümünde yeniden döneceğiz.

Önceki grafiği daha kısa biçimde şöyle yazabiliriz:

ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g)) +
  geom_point()

İleride aynı grafiği aşağıdaki gibi oluşturmanızı sağlayan pipe operatörünü (|>) de öğreneceksiniz:

penguins |>
  ggplot(aes(x = flipper_length_mm, y = body_mass_g)) +
  geom_point()

1.4 Dağılımları görselleştirme

Bir değişkenin dağılımını nasıl görselleştireceğiniz, değişkenin türüne bağlıdır: kategorik veya sayısal.

1.4.1 Kategorik bir değişken

Bir değişken, yalnızca küçük bir değerler kümesinden birini alabiliyorsa kategoriktir. Kategorik bir değişkenin dağılımını incelemek için bir çubuk grafik kullanabilirsiniz. Çubukların yüksekliği, her x değeriyle kaç gözlem oluştuğunu gösterir.

ggplot(penguins, aes(x = species)) +
  geom_bar()

Penguen türlerinin frekanslarını gösteren bir çubuk grafik: Adelie (yaklaşık 150), Chinstrap (yaklaşık 90), Gentoo (yaklaşık 125).

Yukarıdaki species değişkeni gibi düzeyleri sıralı olmayan kategorik değişkenlerin çubuk grafiklerinde, çubukları sıklıklarına göre yeniden sıralamak genellikle daha uygundur. Bunun için değişkeni bir faktöre (R’ın kategorik verileri işleme biçimi) dönüştürmeniz, ardından faktör düzeylerini yeniden sıralamanız gerekir.

ggplot(penguins, aes(x = fct_infreq(species))) +
  geom_bar()

Penguen türlerinin frekanslarını gösteren, çubukların yüksekliklerine (frekanslarına) göre azalan sırada düzenlendiği bir çubuk grafik: Adelie (yaklaşık 150), Gentoo (yaklaşık 125), Chinstrap (yaklaşık 90).

Faktörler ve faktörlerle ilgilenmek için kullanılan fonksiyonlar (yukarıda gösterilen fct_infreq() gibi) hakkında Bölüm 16 bölümünde daha fazla bilgi edineceksiniz.

1.4.2 Sayısal bir değişken

Bir değişken, geniş bir sayısal değer aralığı alabiliyorsa ve bu değerlerle toplama, çıkarma veya ortalama alma anlamlıysa sayısaldır (veya niceliksel). Sayısal değişkenler sürekli veya kesikli olabilir.

Sürekli değişkenlerin dağılımları için yaygın olarak kullanılan bir görselleştirme histogramdır.

ggplot(penguins, aes(x = body_mass_g)) +
  geom_histogram(binwidth = 200)

Penguenlerin vücut kütlelerinin bir histogramı. Dağılım tek modlu ve sağa çarpık olup yaklaşık 2.500 ile 6.500 gram arasında değişmektedir.

Bir histogram, x eksenini eşit genişlikte aralıklara (bin) böler ve her aralığa düşen gözlem sayısını çubuğun yüksekliğiyle gösterir. Yukarıdaki grafikte, en yüksek çubuk, 39 gözlemin body_mass_g değerinin 3.500 ile 3.700 gram arasında olduğunu gösteriyor; bunlar çubuğun sol ve sağ kenarlarıdır.

Histogramdaki aralıkların genişliğini, x değişkeninin birimleriyle ölçülen binwidth argümanıyla ayarlayabilirsiniz. Farklı aralık genişlikleri farklı örüntüler ortaya çıkarabildiğinden histogramları çeşitli genişliklerle incelemelisiniz. Aşağıdaki grafiklerde 20 birimlik genişlik fazla dardır; çok fazla çubuk oluştuğu için dağılımın şeklini belirlemek zorlaşır. Benzer biçimde 2.000 birimlik genişlik fazla büyüktür; tüm veriler yalnızca üç çubukta toplandığından dağılımın şeklini belirlemek yine zorlaşır. 200 birimlik genişlik makul bir denge sağlar.

ggplot(penguins, aes(x = body_mass_g)) +
  geom_histogram(binwidth = 20)
ggplot(penguins, aes(x = body_mass_g)) +
  geom_histogram(binwidth = 2000)

Penguenlerin vücut kütlelerine ait iki histogram; biri 20 birimlik (solda), diğeri 2.000 birimlik (sağda) aralık genişliğiyle. 20 birimlik genişliğe sahip histogram, aralıkların yüksekliklerinde pek çok iniş çıkış göstererek pürüzlü bir çizgi oluşturur. 2.000 birimlik genişliğe sahip histogram ise yalnızca üç aralık gösterir.

Penguenlerin vücut kütlelerine ait iki histogram; biri 20 birimlik (solda), diğeri 2.000 birimlik (sağda) aralık genişliğiyle. 20 birimlik genişliğe sahip histogram, aralıkların yüksekliklerinde pek çok iniş çıkış göstererek pürüzlü bir çizgi oluşturur. 2.000 birimlik genişliğe sahip histogram ise yalnızca üç aralık gösterir.

Sayısal değişkenlerin dağılımları için bir başka görselleştirme yoğunluk grafiğidir (density plot). Bir yoğunluk grafiği, bir histogramın yumuşatılmış bir versiyonudur ve özellikle altta yatan düzgün bir dağılımdan gelen sürekli veriler için pratik bir alternatiftir. geom_density()’nin yoğunluğu nasıl tahmin ettiğine girmeyeceğiz (bu konuda daha fazlasını fonksiyonun dokümantasyonunda okuyabilirsiniz); ama yoğunluk eğrisinin nasıl çizildiğini bir benzetmeyle açıklayalım. Tahta bloklardan yapılmış bir histogram hayal edin. Ardından, üzerine pişmiş bir spagetti telinin düştüğünü hayal edin. Spagettinin blokların üzerine örtündüğünde alacağı şekil, yoğunluk eğrisinin şekli olarak düşünülebilir. Bir histogramdan daha az ayrıntı gösterir; ama özellikle modlar ve çarpıklık açısından, dağılımın şeklini hızlıca kavramayı kolaylaştırabilir.

ggplot(penguins, aes(x = body_mass_g)) +
  geom_density()
#> Warning: Removed 2 rows containing non-finite outside the scale range
#> (`stat_density()`).

Penguenlerin vücut kütlelerinin bir yoğunluk grafiği. Dağılım tek modlu ve sağa çarpık olup yaklaşık 2.500 ile 6.500 gram arasında değişmektedir.

1.4.3 Alıştırmalar

  1. penguins veri çerçevesindeki species değişkenini y estetiğine eşleyerek bir çubuk grafik oluşturun. Bu grafik nasıl farklı?

  2. Aşağıdaki iki grafik birbirinden nasıl farklı? Çubukların rengini değiştirmek için color mu yoksa fill mi daha kullanışlı?

    ggplot(penguins, aes(x = species)) +
      geom_bar(color = "red")
    
    ggplot(penguins, aes(x = species)) +
      geom_bar(fill = "red")
  3. geom_histogram()’daki bins argümanı ne işe yarar?

  4. tidyverse paketini yüklediğinizde kullanılabilen diamonds veri kümesindeki carat değişkeninin histogramını oluşturun. Farklı bin genişlikleriyle deneyler yapın. Hangi bin genişliği en ilginç örüntüleri ortaya çıkarıyor?

1.5 İlişkileri görselleştirme

Bir ilişkiyi görselleştirmek için bir grafiğin estetiklerine eşlenmiş en az iki değişkene ihtiyacımız vardır. Aşağıdaki bölümlerde, iki veya daha fazla değişken arasındaki ilişkileri görselleştirmek için yaygın olarak kullanılan grafikleri ve bunları oluşturmak için kullanılan geom’ları öğreneceksiniz.

1.5.1 Sayısal ve kategorik bir değişken

Sayısal ve kategorik bir değişken arasındaki ilişkiyi görselleştirmek için yan yana kutu grafikleri (box plots) kullanabiliriz. Bir kutu grafiği (boxplot), bir dağılımı tanımlayan konum ölçülerinin (yüzdelik dilimlerin) bir tür görsel kısayoludur. Potansiyel aykırı değerleri belirlemek için de kullanışlıdır. Şekil 1.1 bölümünde gösterildiği gibi, her kutu grafiği şunlardan oluşur:

  • Verinin orta yarısının aralığını gösteren, dağılımın 25. yüzdelik diliminden 75. yüzdelik dilimine kadar uzanan ve çeyrekler arası aralık (interquartile range, IQR) olarak bilinen mesafeyi belirten bir kutu. Kutunun ortasında, dağılımın medyanını, yani 50. yüzdelik dilimini gösteren bir çizgi vardır. Bu üç çizgi, size dağılımın yayılımı ve dağılımın medyan etrafında simetrik mi yoksa bir yöne çarpık mı olduğu hakkında bir fikir verir.

  • Kutunun her iki kenarından IQR’nin 1,5 katından daha uzakta kalan gözlemleri gösteren noktalar. Bu aykırı noktalar sıra dışı olduğundan, ayrı ayrı çizilirler.

  • Kutunun her iki ucundan uzanan ve dağılımdaki en uzak aykırı olmayan noktaya kadar giden bir çizgi (veya bıyık).

Yukarıda özetlenen adımları izleyerek bir kutu grafiğinin nasıl oluşturulduğunu gösteren bir diyagram.
Şekil 1.1: Bir kutu grafiğinin nasıl oluşturulduğunu gösteren diyagram.

geom_boxplot() kullanarak vücut kütlesinin türe göre dağılımına bir göz atalım:

ggplot(penguins, aes(x = species, y = body_mass_g)) +
  geom_boxplot()

Adelie, Chinstrap ve Gentoo penguenlerinin vücut kütlesi dağılımlarının yan yana kutu grafikleri. Adelie ve Chinstrap penguenlerinin vücut kütlesi dağılımları, medyanları yaklaşık 3.750 gram olacak şekilde simetrik görünmektedir. Gentoo penguenlerinin medyan vücut kütlesi çok daha yüksek olup yaklaşık 5.000 gramdır ve bu penguenlerin vücut kütlesi dağılımı biraz sağa çarpık görünmektedir.

Alternatif olarak, geom_density() ile yoğunluk grafikleri de yapabiliriz.

ggplot(penguins, aes(x = body_mass_g, color = species)) +
  geom_density(linewidth = 0.75)

Penguen türüne göre penguenlerin vücut kütlelerinin bir yoğunluk grafiği. Her tür (Adelie, Chinstrap ve Gentoo), yoğunluk eğrileri için farklı renkli çizgilerle temsil edilmiştir.

Çizgileri arka planda biraz daha belirgin kılmak için linewidth argümanıyla kalınlıklarını da özelleştirdik.

Ayrıca, species’i hem color hem de fill estetiklerine eşleyebilir ve dolgulu yoğunluk eğrilerine saydamlık eklemek için alpha estetiğini kullanabiliriz. Bu estetik, 0 (tamamen saydam) ile 1 (tamamen opak) arasında değerler alır. Aşağıdaki grafikte 0,5’e ayarlanmıştır (set).

ggplot(penguins, aes(x = body_mass_g, color = species, fill = species)) +
  geom_density(alpha = 0.5)

Penguen türüne göre penguenlerin vücut kütlelerinin bir yoğunluk grafiği. Her tür (Adelie, Chinstrap ve Gentoo), yoğunluk eğrileri için farklı renkli çizgilerle temsil edilmiştir. Yoğunluk eğrileri ayrıca aynı renklerle, biraz saydamlık eklenerek doldurulmuştur.

Burada kullandığımız terminolojiye dikkat edin:

  • Bir estetiğin temsil ettiği görsel özelliğin, o değişkenin değerlerine göre değişmesini istiyorsak değişkenleri estetiklere eşleriz (map).
  • Aksi takdirde, bir estetiğin değerini ayarlarız (set).

1.5.2 İki kategorik değişken

İki kategorik değişken arasındaki ilişkiyi görselleştirmek için yığılmış çubuk grafikleri kullanabiliriz. Örneğin aşağıdaki iki yığılmış çubuk grafik de island ile species arasındaki ilişkiyi, daha açık ifadeyle her adadaki tür dağılımını gösterir.

İlk grafik, her adadaki penguen türlerinin sıklıklarını gösterir. Sıklık grafiği, her adada eşit sayıda Adelie olduğunu gösteriyor. Ama her adadaki yüzdesel dengeye dair iyi bir fikrimiz yok.

ggplot(penguins, aes(x = island, fill = species)) +
  geom_bar()

Adaya (Biscoe, Dream ve Torgersen) göre penguen türlerinin çubuk grafikleri.

İkinci grafik, geom’da position = "fill" ayarlanarak oluşturulan bir göreli sıklık grafiğidir. Adalardaki penguen sayılarının eşit olmamasından etkilenmediği için tür dağılımlarını karşılaştırmaya daha uygundur. Bu grafiği kullanarak, Gentoo penguenlerinin tamamının Biscoe adasında yaşadığını ve o adadaki penguenlerin yaklaşık %75’ini oluşturduğunu; Chinstrap’lerin tamamının Dream adasında yaşadığını ve o adadaki penguenlerin yaklaşık %50’sini oluşturduğunu; Adelie’lerin ise her üç adada da yaşadığını ve Torgersen’deki penguenlerin tamamını oluşturduğunu görebiliriz.

ggplot(penguins, aes(x = island, fill = species)) +
  geom_bar(position = "fill")

Adaya (Biscoe, Dream ve Torgersen) göre penguen türlerinin çubuk grafikleri; çubuklar aynı yüksekliğe ölçeklenerek göreceli sıklık grafiği hâline getirilmiştir. Y ekseni varsayılan olarak "count" ile etiketlenmiştir.

Bu çubuk grafikleri oluştururken, çubuklara ayrılacak değişkeni x estetiğine, çubukların içindeki renkleri değiştirecek değişkeni ise fill estetiğine eşleriz. ggplot2, y eksenini varsayılan olarak "count" ile etiketler. Bu etiketi "Oran" olarak belirleyen bir labs() katmanı ekleyerek değiştirebiliriz.

ggplot(penguins, aes(x = island, fill = species)) +
  geom_bar(position = "fill") +
  labs(y = "Oran")

Adaya (Biscoe, Dream ve Torgersen) göre penguen türlerinin çubuk grafikleri; çubuklar aynı yüksekliğe ölçeklenerek göreceli sıklık grafiği hâline getirilmiştir. Y ekseni "Oran" ile etiketlenmiştir.

1.5.3 İki sayısal değişken

Şimdiye kadar, iki sayısal değişken arasındaki ilişkiyi görselleştirmek için saçılım grafikleri (geom_point() ile oluşturulur) ve düzgün eğriler (geom_smooth() ile oluşturulur) hakkında bilgi edindiniz. İki sayısal değişken arasındaki ilişkiyi görselleştirmek için muhtemelen en yaygın kullanılan grafik saçılım grafiğidir.

ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g)) +
  geom_point()

Penguenlerin vücut kütlesine karşı yüzgeç uzunluğunun saçılım grafiği. Grafik, bu iki değişken arasında pozitif, doğrusal, nispeten güçlü bir ilişki göstermektedir.

1.5.4 Üç veya daha fazla değişken

Bölüm 1.2.4 bölümünde gördüğümüz gibi, değişkenleri ek estetiklere eşleyerek bir grafiğe daha fazla değişken dahil edebiliriz. Örneğin, aşağıdaki saçılım grafiğinde noktaların renkleri türü, noktaların şekilleri ise adaları temsil eder.

ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g)) +
  geom_point(aes(color = species, shape = island))

Penguenlerin vücut kütlesine karşı yüzgeç uzunluğunun saçılım grafiği. Grafik, bu iki değişken arasında pozitif, doğrusal, nispeten güçlü bir ilişki göstermektedir. Noktalar penguenlerin türüne göre renklendirilmiştir ve noktaların şekilleri adaları temsil eder (yuvarlak noktalar Biscoe adası, üçgenler Dream adası ve kareler Torgersen adasıdır). Grafik çok karışıktır ve noktaların şekillerini ayırt etmek zordur.

Ancak bir grafiğe çok fazla estetik eşleme eklemek, grafiği karmaşık ve anlaşılması zor hâle getirir. Özellikle kategorik değişkenler için kullanışlı bir başka yöntem, grafiği her biri verilerin bir alt kümesini gösteren panellere (facets) bölmektir.

Grafiğinizi tek bir değişkene göre panellere ayırmak için facet_wrap() kullanın. facet_wrap()’in ilk argümanı, ~ ve ardından bir değişken adıyla oluşturduğunuz bir formüldür3. facet_wrap()’e verdiğiniz değişken kategorik olmalıdır.

ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g)) +
  geom_point(aes(color = species, shape = species)) +
  facet_wrap(~island)

Penguenlerin vücut kütlesine karşı yüzgeç uzunluğunun saçılım grafiği. Noktaların şekilleri ve renkleri türü temsil eder. Her adadaki penguenler ayrı bir panelde yer alır. Her panelde, vücut kütlesi ile yüzgeç uzunluğu arasındaki ilişki pozitif, doğrusal, nispeten güçlüdür.

Bölüm 9 bölümünde, değişkenlerin dağılımlarını ve aralarındaki ilişkileri görselleştirmek için kullanılan pek çok başka geom hakkında bilgi edineceksiniz.

1.5.5 Alıştırmalar

  1. ggplot2 paketiyle birlikte gelen mpg veri çerçevesi, ABD Çevre Koruma Ajansı tarafından 38 araç modeli üzerinde toplanan 234 gözlem içerir. mpg’deki hangi değişkenler kategoriktir? Hangi değişkenler sayısaldır? (İpucu: Veri kümesinin dokümantasyonunu okumak için ?mpg yazın.) mpg’yi çalıştırdığınızda bu bilgiyi nasıl görebilirsiniz?

  2. mpg veri çerçevesini kullanarak hwy’e karşı displ’in bir saçılım grafiğini yapın. Ardından, üçüncü, sayısal bir değişkeni önce color’a, sonra size’a, sonra hem color hem size’a, sonra da shape’e eşleyin. Bu estetikler, kategorik ve sayısal değişkenler için nasıl farklı davranır?

  3. hwy’e karşı displ’in saçılım grafiğinde, üçüncü bir değişkeni linewidth’a eşlerseniz ne olur?

  4. Aynı değişkeni birden fazla estetiğe eşlerseniz ne olur?

  5. bill_depth_mm’e karşı bill_length_mm’in bir saçılım grafiğini yapın ve noktaları species’e göre renklendirin. Türe göre renklendirme eklemek, bu iki değişken arasındaki ilişki hakkında neyi ortaya çıkarıyor? Peki ya species değişkenine göre panellere ayırmak?

  6. Aşağıdaki kod neden iki ayrı gösterge veriyor? İki göstergeyi birleştirmek için kodu nasıl düzeltirsiniz?

    ggplot(
      data = penguins,
      mapping = aes(
        x = bill_length_mm, y = bill_depth_mm,
        color = species, shape = species
      )
    ) +
      geom_point() +
      labs(color = "Tür")
  7. Aşağıdaki iki yığılmış çubuk grafiğini oluşturun. Birincisiyle hangi soruyu yanıtlayabilirsiniz? İkincisiyle hangi soruyu yanıtlayabilirsiniz?

    ggplot(penguins, aes(x = island, fill = species)) +
      geom_bar(position = "fill")
    ggplot(penguins, aes(x = species, fill = island)) +
      geom_bar(position = "fill")

1.6 Grafiklerinizi kaydetme

Bir grafik oluşturduktan sonra onu başka bir yerde kullanmak üzere görüntü olarak kaydetmek isteyebilirsiniz. En son oluşturulan grafiği diske kaydetmek ggsave() fonksiyonunun işidir:

ggplot(penguins, aes(x = flipper_length_mm, y = body_mass_g)) +
  geom_point()
ggsave(filename = "penguin-plot.png")

Bu kod grafiğinizi çalışma dizininize (working directory) kaydeder; bu kavramı Bölüm 6 bölümünde daha ayrıntılı öğreneceksiniz.

width ve height değerlerini belirtmezseniz mevcut çizim aygıtının boyutları kullanılır. Yeniden üretilebilir kod yazmak için bu değerleri açıkça belirtmelisiniz. ggsave() hakkında daha fazla bilgiyi dokümantasyonunda bulabilirsiniz.

Ancak genel olarak nihai raporlarınızı Quarto ile hazırlamanızı öneriyoruz. Quarto, kodunuzla açıklamalarınızı iç içe geçirmenizi ve grafikleri metninize otomatik olarak eklemenizi sağlayan, yeniden üretilebilir bir yazım sistemidir. Quarto hakkında Bölüm 28 bölümünde daha fazla bilgi edineceksiniz.

1.6.1 Alıştırmalar

  1. Aşağıdaki kod satırlarını çalıştırın. İki grafikten hangisi mpg-plot.png olarak kaydedilir? Neden?

    ggplot(mpg, aes(x = class)) +
      geom_bar()
    ggplot(mpg, aes(x = cty, y = hwy)) +
      geom_point()
    ggsave("mpg-plot.png")
  2. Grafiği PNG yerine PDF olarak kaydetmek için yukarıdaki kodda neyi değiştirmeniz gerekir? ggsave()’de hangi görüntü dosyası türlerinin işe yarayacağını nasıl öğrenebilirsiniz?

1.7 Yaygın sorunlar

R kodu çalıştırmaya başladıkça sorunlarla karşılaşmanız olasıdır. Endişelenmeyin — bu herkesin başına gelir. Hepimiz yıllardır R kodu yazıyoruz; ama her gün hâlâ ilk denemede çalışmayan kod yazıyoruz!

Çalıştırdığınız kodu kitaptaki kodla dikkatlice karşılaştırarak başlayın. R son derece titizdir ve yanlış yerleştirilmiş tek bir karakter büyük fark yaratabilir. Her (’in bir ) ile eşleştiğinden ve her "’in başka bir " ile eşleştiğinden emin olun. Bazen kodu çalıştırırsınız ve hiçbir şey olmaz. Konsolunuzun sol tarafını kontrol edin: Burada + varsa R, henüz eksiksiz bir ifade yazmadığınızı düşünüyor ve tamamlamanızı bekliyor demektir. Bu durumda Esc tuşuna basarak geçerli komutun işlenmesini iptal edip baştan başlayabilirsiniz.

ggplot2 grafikleri oluştururken karşılaşılan yaygın bir sorun, +’ı yanlış yere koymaktır: satırın sonunda olması gerekir, başında değil. Başka bir deyişle, yanlışlıkla şöyle bir kod yazmadığınızdan emin olun:

ggplot(data = mpg)
+ geom_point(mapping = aes(x = displ, y = hwy))

Hâlâ takıldıysanız, yardıma başvurun. Konsolda ?function_name çalıştırarak veya RStudio’da fonksiyon adını seçip F1 tuşuna basarak herhangi bir R fonksiyonu hakkında yardım alabilirsiniz. Yardım pek yararlı görünmüyorsa endişelenmeyin; doğrudan örneklere geçip yapmaya çalıştığınız işe benzeyen kodu arayın.

Bu da yardımcı olmazsa, hata mesajını dikkatlice okuyun. Bazen cevap orada gizlidir! Ama R’da yeniyseniz, cevap hata mesajında olsa bile onu nasıl anlayacağınızı henüz bilmiyor olabilirsiniz. Bir başka yararlı araç da Google’dır: Hata mesajını aratmayı deneyin; büyük olasılıkla başka biri de aynı sorunla karşılaşmış ve çevrimiçi yardım almıştır.

1.8 Özet

Bu bölümde, ggplot2 ile veri görselleştirmenin temellerini öğrendiniz. ggplot2’nin dayandığı temel fikirle başladık: bir görselleştirme, verinizdeki değişkenlerden konum, renk, boyut ve şekil gibi estetik özelliklere yapılan bir eşlemedir. Ardından, grafiklerinizin karmaşıklığını artırmayı ve sunumunu katman katman iyileştirmeyi öğrendiniz. Ayrıca ek estetik eşlemelerden yararlanarak veya grafiği panellerle küçük çoklu grafiklere bölerek tek bir değişkenin dağılımını ve iki ya da daha fazla değişken arasındaki ilişkileri görselleştirmekte sık kullanılan grafikleri öğrendiniz.

Kitap boyunca görselleştirmeleri tekrar tekrar kullanacak, ihtiyaç duydukça yeni teknikler tanıtacağız. Ayrıca Bölüm 9 ile Bölüm 11 arasındaki bölümlerde ggplot2 ile görselleştirme oluşturmayı çok daha ayrıntılı ele alacağız.

Görselleştirmenin temellerini öğrendiğinize göre bir sonraki bölümde biraz vites değiştirip uygulamaya yönelik iş akışı önerileri vereceğiz. Kitabın bu kısmında iş akışı önerilerini veri bilimi araçlarının arasına serpiştiriyoruz; çünkü bu öneriler giderek daha fazla R kodu yazarken düzenli kalmanıza yardımcı olacak.


  1. conflicted paketini kullanarak bu mesajı kaldırabilir ve çakışmaların yalnızca gerektiğinde çözülmesini sağlayabilirsiniz. Daha fazla paket yükledikçe conflicted paketinin önemi artar. conflicted hakkında daha fazla bilgiyi https://conflicted.r-lib.org adresinden edinebilirsiniz.↩︎

  2. Horst AM, Hill AP, Gorman KB (2020). palmerpenguins: Palmer Archipelago (Antarctica) penguin data. R package version 0.1.0. https://allisonhorst.github.io/palmerpenguins/. doi: 10.5281/zenodo.3960218.↩︎

  3. Burada “formül”, ~ ile oluşturulan şeyin adıdır, “denklem”in bir eş anlamlısı değildir.↩︎