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 errors1 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:
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.
install.packages("tidyverse")
library(tidyverse)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:
species: penguenin türü (Adelie, Chinstrap veya Gentoo).flipper_length_mm: penguenin yüzgeç uzunluğu, milimetre cinsinden.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.

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)
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.
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()`).
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()
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")
Ç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")
İş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")
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()
Sonunda nihai hedefimizle tam olarak eşleşen bir grafiğe sahibiz!
1.2.5 Alıştırmalar
penguinsiçinde kaç satır var? Kaç sütun var?penguinsveri çerçevesindekibill_depth_mmdeğişkeni neyi tanımlıyor? Öğrenmek için?penguinsyardımını okuyun.bill_depth_mm’e karşıbill_length_mm’in bir saçılım grafiğini yapın. Yani, y eksenindebill_depth_mmve x eksenindebill_length_mmolan bir saçılım grafiği yapın. Bu iki değişken arasındaki ilişkiyi tanımlayın.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?-
Aşağıdaki kod neden bir hata veriyor ve bunu nasıl düzeltirsiniz?
ggplot(data = penguins) + geom_point() geom_point()’tekina.rmargümanı ne işe yarar? Argümanın varsayılan değeri nedir? Bu argümanıTRUEolarak ayarlayarak başarıyla kullandığınız bir saçılım grafiği oluşturun.Ö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.-
Aşağıdaki görselleştirmeyi yeniden oluşturun.
bill_depth_mmhangi estetiğe eşlenmeli? Bu eşleme genel düzeyde mi yoksa geom düzeyinde mi yapılmalı?
-
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) -
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.
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()
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)
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)

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()`).
1.4.3 Alıştırmalar
penguinsveri çerçevesindekispeciesdeğişkeniniyestetiğine eşleyerek bir çubuk grafik oluşturun. Bu grafik nasıl farklı?-
Aşağıdaki iki grafik birbirinden nasıl farklı? Çubukların rengini değiştirmek için
colormu yoksafillmi daha kullanışlı? geom_histogram()’dakibinsargümanı ne işe yarar?tidyverse paketini yüklediğinizde kullanılabilen
diamondsveri kümesindekicaratdeğ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).
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()
Alternatif olarak, geom_density() ile yoğunluk grafikleri de yapabiliriz.
ggplot(penguins, aes(x = body_mass_g, color = species)) +
geom_density(linewidth = 0.75)
Ç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)
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.
İ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.
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.
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()
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))
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)
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
ggplot2 paketiyle birlikte gelen
mpgveri ç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?mpgyazın.)mpg’yi çalıştırdığınızda bu bilgiyi nasıl görebilirsiniz?mpgveri çerçevesini kullanarakhwy’e karşıdispl’in bir saçılım grafiğini yapın. Ardından, üçüncü, sayısal bir değişkeni öncecolor’a, sonrasize’a, sonra hemcolorhemsize’a, sonra dashape’e eşleyin. Bu estetikler, kategorik ve sayısal değişkenler için nasıl farklı davranır?hwy’e karşıdispl’in saçılım grafiğinde, üçüncü bir değişkenilinewidth’a eşlerseniz ne olur?Aynı değişkeni birden fazla estetiğe eşlerseniz ne olur?
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 yaspeciesdeğişkenine göre panellere ayırmak?-
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") -
Aşağıdaki iki yığılmış çubuk grafiğini oluşturun. Birincisiyle hangi soruyu yanıtlayabilirsiniz? İkincisiyle hangi soruyu yanıtlayabilirsiniz?
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
-
Aşağıdaki kod satırlarını çalıştırın. İki grafikten hangisi
mpg-plot.pngolarak kaydedilir? Neden? 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.
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.↩︎
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.↩︎
Burada “formül”,
~ile oluşturulan şeyin adıdır, “denklem”in bir eş anlamlısı değildir.↩︎




