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:
- Grafikler belli gramatik elamanlar i?eren katmanlardan olusur ve
- Anlamli estetik eslestirmeler kullanir.
Grafiklerin grameri i?in ilk ??? temel olmakla beraber yedi adet bileske bulunur.
- Veri (Data): Grafigi olusturmak ?zere kullanilan veri tabani
- Estetik Elemanlar (Aesthetics): Verilerimizi ?st?ne yerlestirdigimiz ?l?ekler
- Geometriler (Geometries): Verinin grafikte nasil g?r?necegine dair kullanilan g?rsel elemanlar
- B?l?mlemeler (Facets): Yanyana benzer g?rseller
- Istatistikler (Statistics): Anlatima katkida bulunan hesaplamalar
- Koordinatlar (Coordinates): Verinin islenecegi uzay
- Temalar (Themes): Veriden bagimsiz kullanilan t?m g?rsel elemanlar
Bu bileskeleri detaylandirirsak:
- Veri: ilgilendigimiz degiskenler
- 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)
- Geometriler
- nokta (point)
- ?izgi(line)
- histogram (histogram)
- s?tun(bar)
- kutu grafigi(boxplot)
- B?l?mlemeler
- s?tun bazli (colunms)
- satir bazli (rows)
- Istatistikler
- veri gruplama (binning)
- veri d?zleme (smoothing)
- betimsel (descriptive)
- kestirimsel (inferential)
- Koordinatlar
- kartezyen (cartesian)
- sabit (fixed)
- polar (kutuplu)
- limitli (limits)
- 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.
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)
ggplot2
bir?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?
Veri gerçek değildir, uygulama için kurgulanmıştır.↩