Bölüm9 Veri Görselleştirme

9.1 Giris

Sosyal veri bilimi için veri görselleştirme (Bundan sonra VeriGör), istatistiğin ve tasarımın anlamlı bir şekilde birleşimi olarak tanımlanabilir. VeriGör, hem isin istatistik yani için eldeki veriyi grafiksel olarak tutarlı ve hatasız olarak betimleyebilmeli, hem de tasarım yani için tasarım ilkelerine uygun olarak veriyi sadece güzelleştirmeyi değil aynı zamanda anlaşılır ve anlamı bir şekilde sunmayı amaçlar. Böylece bir görsel iletişim aracı olarak VeriGör analizleri daha kolay anlaşılır hale getirir ve paylaşımını kolaylaştırır.

VeriGör temel olarak “kesifsel” ve “açıklayıcı” olarak ikiye ayrılır. Kesifsel VeriGör materyalleri kolay oluşturulur, veri açısından zengindir ve akademisyenler gibi dar ve uzman bir hedef kitlesine hitap eder. Bir başka deyişle Kesifsel VeriGör grafiksel veri analizi yapmayı hedefler. A?iklayici VeriGör ise daha fazla emek ister, verinin inceltilmesini gerektirir ve geniş kitleleri hedefler. Dolayısıyla A?iklayici VeriGör iletişimin bir par?asi olarak tasarlanır. Sosyal veri bilimcisinin işi her iki türü beraber ve etkin olarak kullanmaktır. Unutmayın, iyi görsel tasarım hedeflenecek kitleyi düşünmek ile baslar.

MASS paketinde bulunan ve bazı memelilerin vücut ve beyin büyüklüklerini içeren mammals veri tabanını inceleyerek ise başlayalım.

library("MASS")
library("tibble")
glimpse(mammals)
## Observations: 62
## Variables: 2
## $ body  <dbl> 3.385, 0.480, 1.350, 465.000, 36.330, 27.660, 14.830, 1....
## $ brain <dbl> 44.50, 15.50, 8.10, 423.00, 119.50, 115.00, 98.20, 5.50,...

Veri tabaninda bulunan v?cut (body) ve beyin (brain) degiskenleri arasinda bir iliski olup olmadigina bakalim. Bu is i?in yapilacak ilk is bir sa?inim grafigi (scatter plot) ?retmektir. Asagidaki kod size karisik g?r?nebilir, dert etmeyin ve simdilik l?tfen sadece olusan grafige odaklanin

library("ggplot2")
ggplot(mammals, aes(x=body, y=brain)) +
  geom_point()

Veri tabanindaki memelilerin v?cut ve beyin b?y?kl?klerii eksenlere yerlestirdigimizde, grafigin ?st?nde yer alan iki degerin, afrika ve asya filleri, genel dagilimin disinda oldugunu g?rebiliyoruz. Ayrica iki degisken arasinda ayni y?nde bir iliskiden de bahsedebiliriz. Grafigimize lineer bir model de ekleyebiliriz.

library("ggplot2")
ggplot(mammals, aes(x=body, y=brain)) +
  geom_point() +
  stat_smooth(method = "lm", col= "red", se =T)

Hemen fark edilecegi ?zere bu model aslinda, iki asiri deger y?z?nden, olduk?a zayif bir modeldir. Degiskenlerin logaritmik transformasyonu ile daha kuvvetli bir model olusturabiliriz.

library("ggplot2")
ggplot(mammals, aes(x=body, y=brain)) +
  geom_point(alpha= 0.6) +
  coord_fixed() +
  scale_x_log10() +
  scale_y_log10() +
  stat_smooth(method = "lm", col= "red", se =T)

Yukarida g?r?len kodlar ggplot2 paketine ait kodlardir. ?rnekleri anlayabilmek i?in paketi bilgisayariniza indirdiginizden ve oturumunuza eklediginizden emin olun. ggplot2 komutlarini inceleyerek ise baslayabiliriz. R ile beraber gelen veri tabanlarindan biri olan ve 32 araba hakkinda bilgiler i?eren mtcars isimli veri tabanini kullanarak asagidaki kod ile bir grafik olusturalim.

?ncelikle veri tabaninin yapisina bir g?z atalim

str(mtcars)
## 'data.frame':    32 obs. of  11 variables:
##  $ mpg : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
##  $ cyl : num  6 6 4 6 8 6 8 4 4 6 ...
##  $ disp: num  160 160 108 258 360 ...
##  $ hp  : num  110 110 93 110 175 105 245 62 95 123 ...
##  $ drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
##  $ wt  : num  2.62 2.88 2.32 3.21 3.44 ...
##  $ qsec: num  16.5 17 18.6 19.4 17 ...
##  $ vs  : num  0 0 1 1 0 1 0 1 1 1 ...
##  $ am  : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ gear: num  4 4 4 3 3 3 3 4 4 4 ...
##  $ carb: num  4 4 1 1 2 1 4 2 2 4 ...

Olusan R ?iktisindan veri tabanimizda 32 g?zlem ve 11 degisken oldugunu anliyoruz. Simdi arabalarin silindir sayilari (cyl) ile yakit t?ketimini (mpg) iliskilendiren grafigimizi olusturalim. Koda bakarak ggplot paketinin veriyi nasil kullandigini anlamaya ?alisalim

ggplot(mtcars, aes(x = cyl, y = mpg)) +
  geom_point()

Yukaridaki grafige bakalim ve uygun olmayan ?zelliklerini bulmaya ?alisalim. Ilk olarak ggplot2 paketinin kategorik olan silindir sayisi (cyl) degiskenini s?rekli (continious) bir degisken olarak algiladigini g?r?yoruz. Bu y?zden aslinda olmayan 5 ve 7 silindir se?enekleri de grafige islendi. Bu durumu d?zeltmek i?in daha ?nceden g?rd?g?m?z factor() fonksiyonunu cyl degiskenine tanimlamaliyiz. Bu isi ggplot i?inde yapabiliriz.

ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
  geom_point()

G?rd?g?n?z gibi artik aslinda olmayan 5 ve 7 silindir verisini grafigimizden kaldirmis olduk ve veriyi daha d?zg?n altan bir grafik elde ettik.

Yukaridaki ?rnek aslinda t?m grafiklerin, ayni yazim kurallarinda oldugu gibi belli dilbilgisi /gramer kurallari kullanilarak olusturuldugunu anlatiyor. VeriG?r ayni ?zne, t?mle?, sifat ve y?klem gibi bileskeleri olan bir c?mle gibi d?s?n?lebilir. C?mlenin i?indeki bileskeler degistirildiginde anlaminin degistigi gibi, VeriG?r’e ait bileskeler de degistirilerek aktarilmak istenen i?erik degistirilebilir. Grafiklerin Grameri olarak adlandirilan bu ?izim ilkelerini ilk olarak Leland Wilkinson 1999 yilinda yayinladigi “Grammer of Graphics” isimli kitabinda ele alir. Bu anlayis i?erisinde grafiklerin grameri iki anahtar husus i?erir:

  1. Grafikler belli gramatik elamanlar i?eren katmanlardan olusur ve
  2. Anlamli estetik eslestirmeler kullanir.

Grafiklerin grameri i?in ilk ??? temel olmakla beraber yedi adet bileske bulunur.

  1. Veri (Data): Grafigi olusturmak ?zere kullanilan veri tabani
  2. Estetik Elemanlar (Aesthetics): Verilerimizi ?st?ne yerlestirdigimiz ?l?ekler
  3. Geometriler (Geometries): Verinin grafikte nasil g?r?necegine dair kullanilan g?rsel elemanlar
  4. B?l?mlemeler (Facets): Yanyana benzer g?rseller
  5. Istatistikler (Statistics): Anlatima katkida bulunan hesaplamalar
  6. Koordinatlar (Coordinates): Verinin islenecegi uzay
  7. Temalar (Themes): Veriden bagimsiz kullanilan t?m g?rsel elemanlar

Bu bileskeleri detaylandirirsak:

  1. Veri: ilgilendigimiz degiskenler
  2. Estetik Elemanlar
    • x ve ye eksenleri
    • renk (color) ve i?ini doldurma (fill)
    • b?y?kl?k (size) ve etiket (label)
    • alfa degeri (alpha) ve sekil tipi (shape)
    • ?izgi genisligi/eni (line width) ve ?izgi tipi (line type)
  3. Geometriler
    • nokta (point)
    • ?izgi(line)
    • histogram (histogram)
    • s?tun(bar)
    • kutu grafigi(boxplot)
  4. B?l?mlemeler
    • s?tun bazli (colunms)
    • satir bazli (rows)
  5. Istatistikler
    • veri gruplama (binning)
    • veri d?zleme (smoothing)
    • betimsel (descriptive)
    • kestirimsel (inferential)
  6. Koordinatlar
    • kartezyen (cartesian)
    • sabit (fixed)
    • polar (kutuplu)
    • limitli (limits)
  7. Temalar
    • veriden bagimsiz g?rsel islemler

Bu esnek yapi VeriG?r i?in istenilen yapida g?rsel iletisim malzemesi ?retilmesini olanakli kilar. Bir baska deyisle bu yapi arastirmacilara yazilimlarin i?ine g?m?l? olan grafikleme unsurlarinin disina ?ikarak tamamen ihtiyaca y?nelik g?rsel iletisim malzemesi olusturma firsatini verir.

Simdi bu ilkeleri ?rneklendirelim. L?tfen ?rnekler boyunca kodda ger?eklesen degisikliklere dikkat ediniz.

Asagidaki ilk ?rnek kod mtcars veri tabaninda bulunan arabalarin bir galon benzin ile gidebildigi mesafe ile (veri tabanindaki “mpg” degiskeni), arabanin agirligini (veri tabanindaki “wt” degiskeni) iliskilendiren grafigi olusturuyor.

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point()

Yukaridaki grtafikten arabalarin agirligi ile 1 galon benzin kullanarak gidebildikleri mesafe arasinda ters y?nl? bir iliski oldugu anlasiliyor.

Simdi gelin kodun estetik elemanlar yani aes() kismindaki color yani renk arg?manini kullanarak grafigimizdeki noktalari veri tabaninda bulunan “disp” degiskenine g?re gruplandiralim. (“disp” degiskeni arabalarin silindir hacmi ile ilgili bilgi i?eriyor)

ggplot(mtcars, aes(x = wt, y = mpg, color = disp)) +
  geom_point()

Son olarak ayni grafigi estetik elemanimiz olan aes() komutu i?indeki color arg?mani yerine b?y?kl?g? ifade eden size arg?mani ile kullanip degisiklige g?z atalim

ggplot(mtcars, aes(x = wt, y = mpg, size = disp)) +
  geom_point()

Her iki grafikte de disp degiskenine ait okuma g?stergelerinin (legend) grafiklerin yanina otomatik olarak eklendigini de g?r?yoruz. L?tfen simdi kodlari inceleyerek olusan grafikler ile iliskilendirmeye ?alisiniz.

Grafiklerin grameri ile ilgili temel bilgileri ?grendigimize g?re, bu gramerin R i?erisinde kullanilmasini olanakli kilan ggplot2 paketini incelemeye baslayabiliriz. ggplot2 grafiklerin grameri ilkelerine bagli olarak olusturdugu g?rsel materyalleri katmanlar halinde olusturur. Asagidaki sekil bu katmanlari g?stermektedir.

Grafik Grameri Katmanlari

Grafik Grameri Katmanlari

Simdi R i?inde diamonds ismi ile bulunan ve 50000 elmasa ait degisik ?l??mler ve fiyat bilgisi i?eren veri tabani ?zerinde bazi uygulamalar yapalim. Bu veri tabanindaki “carat” degiskeni elmaslarin boyutu, “price” degiskeni ise elmaslarin fiyatlari hakkinda bilgi i?ermektedir. Asagida sik?a kullanilan iki ayri geometri bileskesi, geom_point() ve geom_smooth() ile bu degiskenlerin grafiklerini ?izen kodlari bulabilirsiniz.

ggplot(diamonds, aes(x = carat, y = price)) +
  geom_point()

ggplot(diamonds, aes(x = carat, y = price)) +
  geom_point() +
  geom_smooth()

Koddan da anlasilacagi ?zere ggplot sayesinde farkli geometri katmanlari estetik katmaninin ?zerine “+” isareti ile ekleyerek grafikleri zenginlestirebiliyoruz. Son olarak daha ?nce g?rd?g?m?z aes() arg?manlarini da toplu olarakl kullanan asagidaki grafigi inceleyiniz. Bu grafikte ek olarak geometri katmanini belirleyen geom_point() i?erisine kullanilan noktalari seffaflastiran alpha arg?manini da g?riyoruz

ggplot(diamonds, aes(x = carat, y = price, colour= clarity)) +
geom_point(alpha= 0.4)

Grafiklerin grameri ?zerinde ?alismaya baska bir grafik ile devam edelim. Bu ?rnekte daha ?nce ?grendigimiz R ?zellikleri de devreye alacagiz. Ilk basta diamonds veri tabanini kullanarak “carat” ve “price” degiskenlerini grafik ?zerinde g?sterlim ve “elmaslar” isimli R nesnesi halinde kaydedelim. Bu kullanim, yani ggplot grafiklerini R nesnesi olarak tanimlayabilme, bu nesneleri tekrar tekrar kullanilabilmesini olanakli kilar.

elmaslar <- ggplot(diamonds, aes(x=carat, y=price))

Simdi yarattigimiz elmaslar nesnesine geometri katmani ekleyelim

elmaslar + geom_point()

Son olarak farkli birsey yapalim ve estetik aes() katmanini, geom_point geometri katmaninin i?inde tanimlayalim. Daha ?nceki ?rneklerde aes() hep ilk satirda ve ayri olarak tanimlanmisti. ggplot2 estetik katmaninin geometri katmaninin i?inden de ?agrilmasini olanakli kilarak, ?nemini ileriki ?rneklerde anlayacagimiz, olduk?a esnek bir kullanim saglar.

elmaslar + geom_point(aes(color=clarity))

Asagidaki kodu inceleyerek estetik ve geometri katmanlarinin kullanimlarindaki esnekligi degerlendirmeye ?alisiniz.

elmaslar + 
  geom_point(alpha=0.2)+
  geom_smooth(aes(color = clarity), se=F)

9.2 Estetik Elemanlar / Aesthetics

Estetik dendiginde akla bir nesnenin nasil g?r?nd?g?ne dair bilgiler, ?rnegin renk, bi?im, b?y?kl?k k???kl?k vb. gelir. Ancak ggplot i?in estetik nitelik anlamina gelir. Bir baska deyisle ggplot i?in estetik g?r?nt?n?n nasil oldugu ile ilgili degil, o g?r?nt?y? kullanan degisken ile ilgilidir.

R i?inde y?kl? bulunan iris veri tabanina bir g?z atalim. Bu veri tabani Iris setosa, versicolor ve virginica adli 3 degisik t?r?n ?i?ekleri (Petal) ve ta? yapraklarina (Sepal) ait genislik (width) ve uzunluk (length) ?l??mlerini i?erir. Toplamda 150 g?zlemden olusan iris veri tabanind 5 degisken bulunur.

str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

ggplot i?in estetik renk ?zelliginin bir degiskene eslenmis/uygulanmis/giydirilmis (mapped) halidir. Buradaki esleme kelimesini asagidaki grafik ile anlamaya ?alisalim.

ggplot(iris, aes(x=Sepal.Length, y = Sepal.Width))+
  geom_point()

Yukaridaki grafikte “Sepal.Length”/Ta?YaprakUzunlugu x ekseni, “Sepal.Width”/Ta?YaprakGenisligi ise y ekseni ile eslenmistir. ?nemli olan nokta sudur: grafikteki noktalarin rengini siyahtan kirmiziya ?evirdigimizde estetik ile ilgili bir degisiklik yapmis olmayiz, yaptigimiz degisiklik nitelik ile (attribute) ilgili olur. Ancak asagidaki ?rnekte oldugu gibi baska bir degisken kullanarak renk niteligini degistirmek m?mk?nd?r ki, baska bir degiskeni bir renk ile esledigimizden bu bir estetik degisikligidir.

ggplot(iris, aes(x=Sepal.Length, y = Sepal.Width, col = Species)) +
  geom_point()

ggplot2 paketinin kullandigi estetik ?zellikler asagida siralanmistir.

Estetik Tanim
x x ekseni
y y ekseni
color noktalarin ve diger sekillerin renkleri
fill sekil i?i doldurma rengi
size noktalarin ?api, ?izgilerin kalinligi/inceligi
alpha saydamlik derecesi
linetype kesikli ?izgi tipleri
labels eksenlerde veya grafik ?st?ndeki metinler
shape sekiller

Yukaridaki estetik ile ilgili bilesenleri mtcars veri tabaninda bulunan ve silindir hacmini ?l?en “cyl”, agirlik ?l?en “wt”, ve arabanin bir galon benzin ile gidebildigi mesafeyi ?l?en “mpg” degiskenleri ?zerinde uygulayalim. Grafigin d?zg?n g?r?nmesi i?in “cyl” degiskenini hep fackt?r olarak tanimlayalim

library(ggplot2)
# 1 - mpg degiskenini x ekseni, cyl degiskenini y ekseni ile esle
ggplot(mtcars, aes(mpg, factor(cyl))) +
  geom_point()

# 2 - Tersi: mpg degiskenini y ile, cyl degiskenini x ile esle
ggplot(mtcars, aes(factor(cyl), mpg)) +
  geom_point()

# 3 - wt degiskenini x eksenine, mpg degiskenini y eksenine ve cyl degiskenini col arg?manina esle
ggplot(mtcars, aes(wt, mpg, col = factor(cyl))) +
  geom_point()

# 4 - Yukaridaki grafikte bulunan noktalarin sekil ve b?y?kl?g?n? degistir
ggplot(mtcars, aes(wt, mpg, col = factor(cyl))) +
  geom_point(shape = 1, size = 4)

Ufak bir hatirlatma yapalim: eger grafginizde noktalar kullaniyorsaniz, fill estetigi yerine her zaman color estetigi kullanilmalidir. fill estetigi ise s?tun veya histogram tipi grafiklerde ise yarayacaktir.

Gene mtcars veri tabanini kullanarak arabalarin agirliklari ile (“wt” degiskeni) 1 galon benzin ile gidebildikleri mesafeyi (“mpg” degiskeni) iliskilendiren ve farkli estetikleri kullanan sa?inim grafiklerini ?izelim. Burada “wt” bagimsiz “mpg” ise bagimli degisken olarak kullanilmaktadir. aes() i?erisine tanimlanan ilk degiskenin x eksenine, ikincisinin ise y eksenine eslenecegini unutmayiniz. Asagidaki kod “cyl” degiskenini degisik estetikler ile kullaniyor:

# cyl degiskenini size/b?y?kl?k estetigi ile esle
ggplot(mtcars, aes(wt, mpg, size = factor(cyl))) +
geom_point()
## Warning: Using size for a discrete variable is not advised.

# cyl degiskenini alpha/saydamlik estetigi ile esle
ggplot(mtcars, aes(wt, mpg, alpha = factor(cyl))) +
geom_point()
## Warning: Using alpha for a discrete variable is not advised.

# cyl degiskenini shape/sekil estetigi ile esle 
ggplot(mtcars, aes(wt, mpg, shape = factor(cyl))) +
geom_point()

# cyl degiskenini text/metin estetigi ile esle
ggplot(mtcars, aes(wt, mpg, label = factor(cyl))) +
geom_text()

Son grafikte geom_point() yerine geom_text geometrisinin kullanildigina dikkat ediniz.

aes() arg?manlari estetik olarak kullanilabildigi gibi esas grafigin nitelikleri olarak da tanimlanabilir. Ancak bu islem tercih edilirse dikkatli olunmasi gerekir zira grafik niteligi olarak kullanilan aes() arg?manlari ger?ek aes() arg?manlarinin ?zerine yazilabilir! Bu noktada hexadecimal renklerden bahsetmek yerinde olabilir. Hexadecimal 16’lik temel kullanan bir sayi sistemidir ve tekil degerleri 0-9 ile A-F araliginda olusur. Hexadecimal renk sistemi bu yapi i?inde Kirmizi, Yesil ve Mavi degerlerini (“#RRGGBB”) alti basamakli renk kodlari ile ifade eder. (?rnegin: Mavi: “#0000FF”, siyah: “#000000”, beyaz: “#FFFFFF”). R hex kodlarini renk olarak tanir. color estetigini t?m grafigin niteligi olarak kullanan asagidaki kodu inceleyiniz.

benim_rengim <- "#9e0000"

ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl))) +
  geom_point( color = benim_rengim)

Yukaridaki kod ilk olarak begendigim bordo renginin hex kodunu #9e0000 benim_rengim adi ile bir R nesnesi yaratti ve daha sonra bu nesneyi geometri i?inde kullanarak t?m grafigin niteligi olarak tanimladi.

Son olarak bir?ok estetik aes() ?zelligini beraber kullanan asagidaki kodu inceleyin. Bu kod arabalarin hizlarini ?l?en “qsec” degiskeni ile 1 galon benzinle gidebildigi mesafeyi ?l?en “mpg” degiskenini, arabalarin silindir hacmini “cyl”, vites tipini “am” (a: otomatik vites,0, m: manuel vites,1) ve beygir g?c?n? “hp” ve agirligini “wt” da g?rselin i?ine katarak grafigi olusturmaktadir.

# mpg degiskenini x ekseni, qsec degiskenini y ekseni 
# ve fakt?r haline getirilmis cyl degiskenini de col / renk 
# estetigi ile esle 

ggplot(mtcars, aes(mpg, qsec, col=factor(cyl))) +
geom_point()

# Bir diger esleme ekle: fakt?r haline getirilmis vites
# tipi degiskenini (am) shape / sekil estetigi ile esle 
# ve grafige ekle
ggplot(mtcars, aes(mpg, qsec, col=factor(cyl), shape=factor(am))) +
geom_point()

# Bir diger esleme ekle: beygir g?c?n? "hp" agirliga b?l 
# (hp/wt) ve size / b?y?kl?k estetigi ile esle
ggplot(mtcars, aes(mpg, qsec, col=factor(cyl), shape=factor(am), size = (hp/wt))) +
geom_point()

Su ana kadar bir?ok estetik aes() ?zelligini g?rd?g?m?ze g?re, simdi bu ?zellikleri nasil d?zenleyecegimize bir g?z atalim. Position/Pozisyonlar bileskleri bir katmanda ?st?ste gelmis g?zlemleri d?zenlemek i?in kullanilir. En belirgin pozisyon bileskesi identity olarak kullanilir. identity degeri ggplot grafiklerinde default/?nceden tanimli halde gelir ve g?zlemlemek istedigimiz degiskenin degerinin degistirilmeden ayni olarak grafikte yer almasini saglar.

Asagidaki grafige bir g?z atalim

ggplot(iris, aes(x = Sepal.Length, y=Sepal.Width, col= Species)) +
  geom_point()

Bu grafik i?in kullandigimiz veri tabaninda ?l??mler milimetre cinsinden yapilmis. Dolayisiyla grafigimiz ?st?ste gelen ve kolayca ayristirilamayan bir ?ok g?zlem i?eriyor. Bu g?zlemleri birbirinden ayirmak ve yogunluk olan b?lgeleri g?rebilmek i?in x ve y eksenlerindeki her bir g?zleme rastlantisal olarak biraz noise/g?r?lt? eklememiz gerekir. Bu isleme jittering/titrestirme ismi verilir. Jitter hem bir arg?man hem de bir fonksiyon olarak kullanilabilir. Asagidaki slk grafikte jitter bir arg?man, ikincisinde ise bir fonksiyon olarak kullanilmistir. Ikinci kullanimda jitter degerinin tanimlanmis olduguna dikkat ediniz.

ggplot(iris, aes(x = Sepal.Length, y=Sepal.Width, col= Species)) +
  geom_point(position="jitter")

j.fonk <- position_jitter(width =1)
ggplot(iris, aes(x = Sepal.Length, y=Sepal.Width, col= Species)) +
  geom_point(position=j.fonk)

position/pozisyonlar fonksiyonu gibi sik?a kullanilan bir diger aes() d?zenleme fonksiyonu scale/?l?ek fonksiyonudur. “scale_” ile baslayan bu fonksiyonun yaziminin ikinci kismi hangi estetik degerine ulasmak istedigimizi tanimlar. ?rnegin “scale_x_…” yazildiginda x eksenindeki aes degerleri ile islem yapilacagini anlariz. Fonksiyon yaziminin ???nc? ve son kisimi ise kulandigimiz verinin t?r? ile uyusmalidir: esit aralikli/s?rekli degiskenler i?in continous, nomina/kategorik degiskenler i?in “discrete” gibi. Bu durumda x eksenindeki esit aralikli/s?rekli degiskeni modifiye etmek istedigimizde fonksiyonun yazimi “scale_x_continuous” seklinde olur. scale fonksiyonu i?in bir ?ok arg?man bulunur. Bunlardan en siklikla kullanilanlari “limits” ve “label” arg?manlaridir. “limits” adindan da anlasilacagi ?zere modifiye edilmek istenen ?zelligin baslangi? ve bitis degerlerini tanimlar. “labels” ise degiskenlerin isimlerini degistirir. Isim degisikligi i?in ayrica labs() fonksiyonu da kullanilir.

ggplot(iris, aes(x = Sepal.Length, y=Sepal.Width, col= Species)) +
  geom_point(position="jitter") +
  labs(x = "?anak Yaprak Uzunlugu", y = "?anak Yaprak Genisligi", col ="T?rler")

Asagidaki ?rnek mtcars veri tabanini kullanarak arabalari silindirleri cyl ve vites tiplerine g?re gruplayan bir s?tun grafigi ?iziyor. Kodu inceleyerek grafigin bir obje olarak ilk basta nasil tanimlandigini, aes() estetik ?zelliklerinin “stack”, “fill” ve “dodge” arg?manlari ile nasil modifiye edildigini ve son olarak okuma g?stergesi/legend i?in yapilan ayarlamayi inceleyiniz.

# temel grafik katmani
sil_vit <- ggplot(mtcars, aes(x = factor(cyl), fill = factor(am)))
#"stack" arg?mani
sil_vit + geom_bar(position = "stack")

# "fill" arg?mani
sil_vit + geom_bar(position = "fill")

# "dodge" arg?mani
sil_vit + geom_bar(position = "dodge")

Yukaridaki ?? grafikten sonuncusu istedigim tipte bir grafik yaratti. ?zerinde asagidaki kodu kullanarak daha anlasilabilir hale getirebiliriz.

val = c("#E41A1C", "#000000")
lab = c("D?z vites", "Otomatik vites")
sil_vit +
  geom_bar(position = "dodge") +
  scale_x_discrete("Silindir Sayisi") + 
  scale_y_continuous("Araba Sayisi") +
  scale_fill_manual("Vites Tipi", 
                    values = val,
                    labels = lab)

ggplot2bir?ok aes() ?zelligi sundugundan grafikleri ?izerken hangisini se?eceginiz konusunda kafaniz karisabilir. S?rekli degiskenler i?in “x”, “y”, “size”, “alpha”, “colour” ve “fill”, kategorik degiskenler i?in ise “labels”, “fill”, “shape”, “alpha”, “linetype” ve “size” estetik ?gelerinin kullanilmasi digerlerine g?re daha uygun olacaktir.

9.3 Geometriler / Geoms

ggplot2 mantiginda ???nc? ve temel katman geom/geometri katmani olarak adlandirilir ve bu katman grafigin nasil g?r?necegi ile ilgilidir. Aslinda su ana kadar yaptigimiz ?rneklerde bir ?ok geometri ?rnegini kullandik. Bu b?l?mde geometri ?rneklerine daha yakindan bakacagiz.

ggplot 37 degisik geometri ?zelligini i?erir. Bu kadar farkli se?enekten hangisini kullanacaginiz size ve uzmanliginiza kalmis bir durumdur. Bu b?l?mde sik?a kullanilan ?? ayri geometri tipi ?zerinde duracagiz

  • Sa?inim grafikleri / scatter plots
    • arg?manlar: points, jitter abline
  • S?tun grafikleri / bar plots
    • arg?manlar: histogram, bar, errorbar
  • ?izgi grafikler / line plots
    • arg?manlar: line

9.3.1 Sa?inim Grafikleri / Scatter Plots

Bir ?nceki b?l?mde aes() estetik ?zelliklerini incelerken ?ogunlukla sa?inim grafiklerini geom_point() geom fonksiyonu ile kullanmistik. Bu noktada her geometri fonksiyonunun belli bir aes() estetik ?zelligi ?zerinden ?alisacagini s?ylememiz gerekir. ?rnegin geom_point() x ve y aes() ?zellikleri olmadan ?alismayacaktir. Zorunlu estetik ?zellikleri disinda geom_point() ile “alpha”, “colour”, “fill”, “shape” ve “size” aes() ?zelliklerini kullanabiliriz.

ggplot paketinin bir ?zelligi de aes() estetik ?zelliklerinin geom_...() geometri ?zellikleri i?erisinden de ?alistirilabilmesidir. B?ylece farkli geom katmanlarina ait estetik ?zelliklerini ayri ayri manip?le edebiliriz. Bunun yaninda geom_...() i?erisine farkli bir veri tabani tanimlayarak birden fazla veri tabanindan ?ektigimiz verileri ?st ?ste katmanlar halinde grafikleyebiliriz.

Asagidaki ?rnekte “iris” veri tabanindan ayri ayri ?i?eklerin ?l??mlerine dayanan veri ile bu ?l??mlerin ortalamalarini i?eren “iris2” veri tabanindan gelen veri ayni anda grafiklenmektedir.

# iris.summary adi altinda ?l??mlerin ortalamalrini i?eren ikinci
#veri tabanini yaratalim
iris.summary <- aggregate(iris[1:4], list(iris$Species), mean)
names(iris.summary)[1] <- "Species"
ggplot(iris, aes(Sepal.Length, Sepal.Width, col=Species)) +
  geom_point() +
  geom_point(data = iris.summary, shape=15, size=5)

G?r?ld?g? ?zere yukarida iki ayri geom_point() tanimlandi. Ilkinde orjinal verideki ?l??mler ikincisinde ise bu ?l??mlerin ortalamasi baska bir veri tabanindan ?agrildi ve ayni grafige islendi. Fark edilecegi ?zere ikinci veri tabanindan gelecek veri i?in aes() tanimi yapilmadi, ??nk? ggplot bu aes() ?zelliklerini ilk satiri kullanarak isledi. “shape” ve “size” arg?manlari kullanilarak farklilastirma yapildi. “Shape” arg?maninin farkli sekillere denk d?sen degerleri i?in l?tfen yardim dosyasini kontrol ediniz.

Bu noktada b?y?k veri setlerini incelerken ?izilen grafiklerde karsilasilan ve kalabaliklasma / overplotting olarak adlandirilan sorundan bahsetmek gerekir. Bu tip veri setlerinde bir?ok veri noktasi biriri ile ?st?ste geleceginden ?izilen grafiklerde kalabaliklasma yasanir. Asagidaki ?rnegi inceleyelim.

library(ggplot2)
ggplot(diamonds, aes(carat, price)) +
  geom_point()

Simdi bu kalabaliklasma sorunu ??zmek i?in bazi aes() ?zelliklerini kullanalim.

library(ggplot2)
ggplot(diamonds, aes(carat, price)) +
  geom_point(alpha = 0.3, shape = ".")

9.3.2 S?tun grafikleri / Bar Plots

Genel olarak g?r?nt?de birbirine benzese de aslinda iki ana tip s?tun grafigi bulunur: histogramlar ve s?tun grafikleri. Histogramlar esit aralikli veriler i?in dagilimin anlasilmasi i?in kullanilir. Histogramlar ?izilirken x ekseni i?in geom_histogram() geomu kullanilir ve bu geom verili olarak (default) stat="bin" arg?manini i?erir. Histogramlarin s?rekli/esit aralikli sekilde kayitli olan daginik veriyi, veri gruplari haline (bins) d?n?st?rerek g?rsel hale getirdigini d?s?nd?g?m?zde yukaridaki arg?mandaki “bin” anlamli hale gelecektir. geom_histogram() otomatik olarak veriyi 30 esit araliga b?lerek g?rsellestirir. Ancak bu durumu bindwith=range/20 seklinde bir kod ile 20 esit aralik ayarlamak m?mk?nd?r. ggplot2 de histogramlar x eksenine ait tek bir estetik ile ?izilirler. Histogramlar i?in Y ekseni degerleri ise otomatik olarak hesaplanir ve y eksenine islenir. Bu islemi ggplot2 arkaplanda bizler i?in yapar ve her bir veri grubuna (bin) d?sen g?zlem sayisini ve yogunlugunu (density) hesaplar. Asagidaki ?rnek arabalar ile ilgili olan mtcars veri tabanini kullanarak ?esitli grafik ?rneklerini sunmaktadir.

library(ggplot2)
# 1 - X eksenin galon basina gidilen mesafeyi isleyen tek degiskenli bir histogram ?izimi
ggplot(mtcars, aes(mpg)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

# 2 - Birinci grafigin veri gruplarinin genisligini (bindwith) ayarlyan kod 
ggplot(mtcars, aes(mpg)) +
  geom_histogram(binwidth = 1)

# 3 - Ikinci grafige y ekseninde yogunluk (..density..) bilgisini isleyen kod
ggplot(mtcars, aes(mpg)) +
  geom_histogram(aes(y = ..density..), binwidth = 1)

# 4 - ???nc? grafige mavi renk ekleyen kod 
ggplot(mtcars, aes(mpg)) +
  geom_histogram(aes(y = ..density..), binwidth = 1, fill = "#377EB8")

Sa?inim grafiklerine benze bir sekilde s?tun grafiklerin de pozisyonlari ayarlanabilir. Hem geom_bar() hem geom_histogram() geomlari i?in stack (?st?ste bindir), fill (doldur) ve dodge (kaydir) arg?manlari g?rselin daha anlamli hale gelmesi i?in siklikla kullanilir. Arabalar ile ilgili veri tabaninda silindir sayisini i?eren cyl degiskenini x eksenine isleyip vites tipine g?re gruplayan (am) asagidaki grafigin farkli arg?manlar ile nasil degistigini inceleyiniz.

# ?st?ste bindir (stack)
ggplot(mtcars, aes(x = cyl, fill = factor(am))) +
  geom_bar(position = "stack")

# Doldur(fill)
ggplot(mtcars, aes(x = cyl, fill = factor(am))) +
  geom_bar(position = "fill")

# Kaydir (dodge)
ggplot(mtcars, aes(x = cyl, fill =factor(am))) +
  geom_bar(position = "dodge")

# Kaydir (dodge)
ggplot(mtcars, aes(x = cyl, fill =factor(am))) +
  geom_bar(position = "dodge")

Ayni grafigi s?tunlari birbirinin ?st?ne bindirerek ?izmek de m?mk?nd?r. Bunun i?in ilk basta position_dodge() arg?mani ile iki s?tunu ?st?ste bindiren R objesini yaratip, bu objeyi ggplot koduna eklememiz gerekir.

# 1 - Ilk olarak yukaridaki grafigin aynisini ?izelim
ggplot(mtcars, aes(x = cyl, fill = factor(am))) +
  geom_bar(position = "dodge")

# 2 - Ikinci olarak "bindir" adi altinda position_dodge() arg?mani ile objemizi yaratalim
bindir <- position_dodge(0.2)

# 3 - ???nc? olarak pozisyon ar?manini "bindir" olarak tanimlayalim
ggplot(mtcars, aes(x = cyl, fill = factor(am))) +
  geom_bar(position = bindir)

# 4 - Son olarak bindir arg?manina alpha 0.6 degerini ekleyerek s?tun 
# saydamliklarini ayarlayalim
ggplot(mtcars, aes(x = cyl, fill = factor(am))) +
  geom_bar(position = bindir, alpha = 0.6)

9.3.3 ?izgi Grafikleri / Line Plots

Bu b?l?mde ele alacagimiz son grafik tipi ?ogunlukla zaman serisi verisi i?in kullanilan ?izgi grafikleri olacak. Bu grafik tipini anlamak i?in ggplot2 paketinde bulunan, issizlik (unemploy), n?fus (pop) ve tarih (date) verisini i?eren economics isimli veri tabanini kullanacagiz. Veri tabanindaki tarih bilgisini (date) x eksenine ve issizlik verisini de (unemploy) y eksenine isleyen asagidaki kodu inceleyiniz.

# Veriye bir g?z atalim...
head(economics)
## # A tibble: 6 x 6
##   date         pce    pop psavert uempmed unemploy
##   <date>     <dbl>  <int>   <dbl>   <dbl>    <int>
## 1 1967-07-01  507. 198712    12.5     4.5     2944
## 2 1967-08-01  510. 198911    12.5     4.7     2945
## 3 1967-09-01  516. 199113    11.7     4.6     2958
## 4 1967-10-01  513. 199311    12.5     4.9     3143
## 5 1967-11-01  518. 199498    12.5     4.7     3066
## 6 1967-12-01  526. 199657    12.1     4.8     3018
# Issizligi zamanin bir fonksiyonu olarak ?izen grafik
ggplot(economics, aes(x = date, y = unemploy)) +
geom_line()

# Grafigin, issizlerin n?fusa orani olarak yeniden ?izilmis hali. G?rd?g?n?z gibi
# y eksenine kolayca b?lme islemini tanimlanabilmektedir.
ggplot(economics, aes(x = date, y = unemploy/pop)) +
geom_line()

Yukaridaki grafikler yeterince a?iklayici olmasina ragmen, eger a?iklayici g?c? artacaksa eldeki grafiklere farkli degiskenlerin eklenmesi tercih edilmelidir.

Zaman serisi kullanan çizgi grafikler, çoğunlukla birden fazla değişkeni içerirler. Aşağıdaki örnekte kullanılan balıklar veri tabanı 1950-2010 yılları arasında Karadeniz’de yakalanmış balık türlerinin yıllara göre nasıl değiştiği bilgisini içeriyor.6

Ancak bu işlem için öncelikle verinin daha önce gördüğümüz tidyr paketindeki gather() fonksiyonunun kullanımıyla her bir satıra bir gözlem gelecek şekilde yeniden düzenlenmesi gerekiyor. gather() fonksiyonu dört argüman içerir: ilki verisetinin ismi (baliklar), ikincisi anahtar değişken -ismi biz veriyoruz- (Türler), miktarlar -ismi gene biz veriyoruz- (Ton) ve önüne eksi “-” işareti koyarak gruplama değişkeni (Yıl)

# Veriyi istediğimiz hale getirelim ve baliklar_1 ismi ile saklayalım
library(tidyr)
baliklar_1 <- gather(baliklar, turler, ton, -Yıl)

# Yeni verimize bir göz atalim...
head(baliklar_1)
## # A tibble: 6 x 3
##   `Yil` turler    ton
##   <dbl> <chr>   <dbl>
## 1  1950 hamsi  100600
## 2  1951 hamsi  259000
## 3  1952 hamsi  132600
## 4  1953 hamsi  235900
## 5  1954 hamsi  123400
## 6  1955 hamsi  244400

Artık grafiği çizmeye hazırız

library(ggplot2)
ggplot(baliklar_1, aes(x=Yıl, y=ton,  color=turler)) +
  geom_line()

Veri görselleştirmenin nasıl kullanılabileceği ve neden önemli olduğu konusuna son bir örnek vererek bu bölümü bitirelim. Bir tavuk çiftliğinde 4 değişik beslenme programına tabi tutulan tavuklar olduğunu varsayalım ve çiftlik sahibi bu 4 değişik beslenme türünden bir tanesine karar vermek zorunda olsun. Elimizdeki veri setinde tavukların 21 gün boyunca hangi beslenme türü ile beslendikleri ve bu zaman içinde gösterdikleri değişim kaydedilmiş durumda olsun. ChickWeight isimli veri seti bu veriyi içermektedir. Öncelikle verimize bir göz atalım

head(ChickWeight)
## Grouped Data: weight ~ Time | Chick
##   weight Time Chick Diet
## 1     42    0     1    1
## 2     51    2     1    1
## 3     59    4     1    1
## 4     64    6     1    1
## 5     76    8     1    1
## 6     93   10     1    1

Görüldüğü gibi veri setimiz tavukların ağırlığını (weight), bu ağırlık ölçümünün yapıldığı günü (Time), tavuk numarasını (Chick) ve beslenme türünü (Diet) içeriyor. Veri seti bu hali ile gayet düzenli görünüyor, üzerinde herhangi bir tidyr fonksiyonunu kullanarak düzenleme yapmamıza gerek yok. İlk olarak her bir tavuğun gelişimini gösteren çizgi grafiğimizi çizelim. Bu iş için X eksenine zaman (Time) değişkenini, y eksenine ise ağırlık (weight) değişkenini koyalım

library(ggplot2)
ggplot(ChickWeight, aes(Time, weight, group=Chick)) +
  geom_line()

Görüldüğü üzere hme görsel hem içerik açısından oldukça zayıf bir grafik oluştu. Bu grafikten tavukların beslenme türlerini birbirinden ayırt etmek mümkün olmadı, sadece zaman içinde kilo aldıklarını söyleyebilriz. Aşağıdaki kod tavukları beslenme türlerine göre ayırt ediyor, lütfen üstteki kod ile karşılaştırıp farkı anlamaya çalışınız.

ggplot(ChickWeight, aes(Time, weight, group=Chick, color=Diet)) +
  geom_line()

İlkine göre daha açıklayıcı olsa da bu grafikte de hangi beslenme türünün daha üstün olduğunu anlamak mümkün değil. Bunu ancak farklı renklerin ortalamalarını alarak yapabiliriz. Farklı beslenme türlerine ait renkleri koruyarak bu beslenme türlerinin ortalamasını çizen kodu aşağıda bulabilirsiniz.

ggplot(ChickWeight, aes(Time, weight,  color=Diet)) +
  geom_line(aes(group=Chick), alpha=0.3) +
  geom_smooth(lwd=2, se= FALSE)

Sizce çiftçimiz hangi beslenme türünü tercih etmeli?


  1. Veri gerçek değildir, uygulama için kurgulanmıştır.