R Dersleri - Ali Onur Gitmez

Ana Sayfa Ders 1 Ders 2 Ders 3 Ders 4 Ders 5 Ders 6 Ders 7 Ders 8 Ders 9 Ders 10 Ders 11 Ders 12 Ders 13 Ders 14 Ders 15

VERİ GÖRSELLEŞTİRME

Veri görselleştirme analiz öncesinde en önemli konulardan. Hatta rapor veya paper yazıldığında okuyan kişilerin dikkatini en çok çekecek noktalardan olduğu için başarılı versiyonunun öğrenilmesi elzem bir konu. R veri görselleştirme konusunda çok güzel seçenekler sunuyor ve hem interaktif hem statik görseller oluşturmamızı sağlıyor. Bu konuda ise temel görselleştirmelere bakıp farklı yöntemleri göreceğiz. Bunun için ise R’ın içinde hazır gelen verileri kullanacağız. Bu derste de hem R’d görselleştirme nasıl yapılır hem de nasıl yapılmalıyı öğreneceğiz.

Veri görselleştirirken kullanacağımız temel tipler vardır. Bunlar:

  • Bar Chart
  • Histogram
  • Line Plot
  • Scatter Plot
  • Box Plot ve burada bahsetmediğim diğerleri. Pie chart noktasına ise konu içinde değineceğim.

Normalde R’ın kendi plot özellikleri var ancak bunlar çok kısıtlı kaldığı için ggplot denilen bir paket artık R’ın resmi paketi oldu diyebiliriz. Bütün işlemlerimizi tidyverse evreninin bir parçası olan ggplot üstünden yapacağız. Çok basit bir örnekle açıklayacak olursak. Bu çok basit duran bir plot oldu. ggplot kullanaraksa bunu çok daha gelişmiş halde yapabiliriz. Elbet verinin de buna uygun olması gerekiyor.

Base R

data <- mtcars
plot(data$mpg, data$drat)

hist(data$carb)

boxplot(data$drat)

library(ggplot2)

ggplot ise bu basit plotlara alternatif olarak göze daha hoş gelen, daha gelişmiş modifiye imkanı sağlayan görselleştirme imkanları sunuyor. Renk, facet, plot çeşidi gibi farklı geliştirme seçenekleri ile internette güzel bloglarda gördüğümüz gibi grafikler oluşturabiliriz. Eğer istersek de bunu bir üst aşamaya taşıyıp plotları anime edebiliriz. Bu derste bunu sadece bir örnek olarak göreceğiz ancak gayet güzel grafikler oluşturmak mümkün. ggplot kodunun genel yapısı şu şekildedir:

plot1 <- ggplot(data, aes(x_variable, y_variable)) +
  geom_graph.type()

data kısmı kullanacağımız verisetinin adını belirtir. aes kısmına kullanacağımız değişkenler başta olmak üzere renk, şekil ve pozisyon gibi birçok değişikliği bu kısma yazarız. Bu aslında görselleştirmenin detaylı değişkiklerinin yapıldığı yer. geom kısmı ise grafiğimizin ne olacağını yazdığımız kısımdır.

Scatter Plot genellikle iki değişken arasındaki ilkişkiyi göstermek için kullanılır. Bu değişkenlerinin ikisinin de continious dediğmiz ve her değeri alabilen değişken olması görseli daha başarılı kılar. Ancak eğitim yılı gibi 10-16 arası değer alabilen bir değişken bile ona continious dememiz için yeterli olabilir. Burada en iyi yapılacak şey grafiği oluşturup nasıl durduğuna bakmak olmalı.

Bu grafiği oluşturduğumuz zaman istatistiksel bir korelasyon veya regresyon analizi yapmadan sadece görsele bakarak bile ilişki hakkında fikir sahibi olabiliriz. Mesela yaş ve gelir arasındaki ilişkiyi göstermek için ideal bir yöntemdir. Şimdi bu konuyla ilgili bazı örnekler inceleyelim.

Scatter Plot

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

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

Bu örnekler hem iyi hem de kötü görselleştirme örneklerini bize gösterdi. Bu yüzden verinin hangi tipte olduğunu bilmemiz ve görseli ona göre oluşturmamız önemlidir. Ancak dikkat edebileceğimiz bir nokta x ve y eksenlerindeki yazıların çok anlaşılır olmaması. Bunlar doğrudan değişken ismini aldığı ve biz değişken ismini rahatça anlaşılırdan ziyade rahat yazılır olarak da düşündüğümüz için ortaya güzel bir görüntü çıkmıyor. Bunu da labs komutu ile yapabiliriz. labs zorunlu olmasa bile grafiklerimizi görselleştirmemize yarayan bir araç olduğu için bolca kullanacağız.

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() + 
  labs(title = "Scatter Plot of MPG vs. Weight", 
       x = "Weight (in 1000 lbs)", y = "Miles per Gallon")

Ikı değişken arasındaki değişimin genel trendini de görsele ekleyebiliriz. Bu aslında bizim regresyon kısmında öğreneceğimiz regresyon çizgisinin ta kendisi. Böylece noktalara ek olarak genel trendi de görebiliriz. Çizginin çevresi ise confidence interval dediğimiz ve değerlerin genel olarak düşeceği aralığı gösteren bir bölge. Bunların hepsini istatistik haftasında öğreneceğiz.

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() + 
  labs(title = "Scatter Plot of MPG vs. Weight", 
       x = "Weight (in 1000 lbs)", y = "Miles per Gallon")+  
  geom_smooth(method = "lm", se = TRUE, color = "red", fill = "blue") 

Line Plot ise genellikle zaman içindeki değişimleri göstermeye yarar. Mesela bir bölgenin son 10 yıldaki suç oranı değişimini böyle bir grafik ile gösterebiliriz. Yine scatter plot gibi genel trendleri görmemize yarar ve time series analizi öncesinde genel bir bakış yapmamıza yarar. Bu veride buna tam bir örnek yok ancak veriyi görüntüleme mantığını kavrama açısından bakacak olursak

mtcars_ordered <- mtcars[order(mtcars$hp), ]
mtcars_ordered$index <- 1:nrow(mtcars_ordered)
ggplot(mtcars_ordered, aes(x = index, y = mpg)) +
  geom_line()

Scatter plotlarda olduğu gibi yine genel bir trend çizgisi ekleyebiliriz

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_line() +  
  geom_smooth(method = "lm", se = FALSE, color = "red") 
## `geom_smooth()` using formula = 'y ~ x'

Bar grafiği ise kategorik verileri göstermeye yarar. Özellikle bir verinin ne kadar yaygın olduğunu görmek istiyorsak bu tarz bir grafiği tercih ederiz. Bu yöntem özellikle şirketlerde sıkça kullanılan pie chart grafiğine göre çok daha tercih edilir bir yöntemdir. Şimdi aynı veride bu iki örneği karşılaştıralım.

Bar Plot

ggplot(mtcars, aes(x = factor(carb))) +
    geom_bar(fill = "steelblue", color = "black")

ggplot(mtcars, aes(x = "", fill = factor(carb))) +
    geom_bar(width = 1, stat = "count") +
    coord_polar("y", start = 0) +
    labs(fill = "Cylinders") +
    theme_void() +
    theme(legend.position = "right")

Burada görüldüğü gibi veri sayısı çok olduğu zaman pasta grafiğinin düzgün ayırt etme gücü azalıyor ancak bar grafiğinde hem farkları hem de aynı sayıda olanları daha rahatça görebiliyoruz. Bir grafik yaparken aklınızda olması gereken konu şu olmalı: Ben neden tablo ile gösterebileceğim şeyleri grafik ile gösteriyorum. Grafik ilk bakışta anlaşılan basit bir görsel olmalı. Her verinin ne olduğunu anlamak için farklı yerlere bakılan değil.

Bar grafiklerinin başka bir avantajı ise sadece tak boyutlu değil, çok boyutlu verileri de görüntüleyebilmemizdir. Bir örnek ile görelim:

ggplot(mtcars, aes(x = factor(carb), fill = factor(gear))) +
  geom_bar(position = "stack") +
  labs(fill = "Number of Gears")

Plot editleme

Grafiklerdeki arka planı beğenmiyorsak bunu da değiştirebiliriz. Bazı örneklere bakacak olursak

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() + 
  labs(title = "Scatter Plot of MPG vs. Weight", 
       x = "Weight (in 1000 lbs)", y = "Miles per Gallon")+  
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  theme_classic()

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() + 
  labs(title = "Scatter Plot of MPG vs. Weight", 
       x = "Weight (in 1000 lbs)", y = "Miles per Gallon")+  
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  theme_dark()

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() + 
  labs(title = "Scatter Plot of MPG vs. Weight", 
       x = "Weight (in 1000 lbs)", y = "Miles per Gallon")+  
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  theme_minimal()

Ek değişiklik olarak noktaların rengini, boyutunu ve şeklini de değiştirebiliriz.

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(color = "blue", size = 5, shape = 17) + 
  labs(title = "Scatter Plot of MPG vs. Weight",
       x = "Weight (in 1000 lbs)", y = "Miles per Gallon")+  
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  theme_minimal()

İstersek rengi belli bir değişkene göre değiştirebiliriz.

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(aes(color = factor(cyl)), size = 3, shape = 19) +
  scale_color_manual(values = c("4" = "green", "6" = "blue", "8" = "red"),
                     name = "Cylinders") + 
  labs(title = "Scatter Plot of MPG vs. Weight", 
       x = "Weight (in 1000 lbs)", y = "Miles per Gallon")+  
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  theme_minimal()

İstersek boyutu da belli bir değişkene göre değiştirebiliriz.

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(aes(size = hp), color = "purple", shape = 15) +
  scale_size_continuous(name = "Horsepower") + 
  labs(title = "Scatter Plot of MPG vs. Weight", 
       x = "Weight (in 1000 lbs)", y = "Miles per Gallon")+  
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  theme_minimal()

Şekli de belli bir değişkene göre değiştirebiliriz.

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(aes(shape = factor(am)), 
             color = "blue", size = 3) +
  scale_shape_manual(values = c("0" = 21, "1" = 24),
                     name = "Transmission",
                     labels = c("Automatic", "Manual")) + 
  labs(title = "Scatter Plot of MPG vs. Weight", 
       x = "Weight (in 1000 lbs)", y = "Miles per Gallon")+  
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  theme_minimal()

Grafik içindeki çizgilerin de yapısını değiştirebiliriz.

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_line(linetype = "dashed") + 
  geom_smooth(method = "lm", se = FALSE, 
              color = "red", linetype = "dotted")
## `geom_smooth()` using formula = 'y ~ x'

Şu ana kadar örneklerde legend yanda duruyordu. Eğer istersek onu da aşağıya veya başka noktalara alabiliriz. Bir örnek olarak:

ggplot(mtcars, aes(x = factor(carb), fill = factor(gear))) +
  geom_bar(position = "stack") +
  labs(x = "Number of Carburetors",
       y = "Count",
       fill = "Number of Gears",
       title = "Car Count by Carburetors and Gears") +
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.box = "horizontal",
        plot.title = element_text(hjust = 0.5)) +
  scale_fill_brewer(palette = "Set2")

Istersek kaldirabiliriz

ggplot(mtcars, aes(x = factor(carb), fill = factor(gear))) +
  geom_bar(position = "stack") +
  labs(x = "Number of Carburetors",
       y = "Count",
       fill = "Number of Gears",
       title = "Car Count by Carburetors and Gears") +
  theme_minimal() +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5)) +
  scale_fill_brewer(palette = "Set2")

Bar grafiklerinde barların da rengini belirleyebiliriz

ggplot(mtcars, aes(x = factor(cyl), fill = factor(cyl))) +
  geom_bar() +
  scale_fill_manual(values = 
                      c("4" = "orange", 
                        "6" = "purple", 
                        "8" = "cyan")) +
  labs(x = "Number of Cylinders", 
       y = "Count", fill = "Cylinders") +
  theme_minimal() +
  ggtitle("Bar Plot of Car Counts by 
          Number of Cylinders with Custom Fill Colors")

Birden çok plotu da aynı grafik içinde toplayıp yanyana gösterebiliriz. Mesela aynı veriyi Fransa, Italya ve Almanya için görselleştireceksek bunların hepsini farklı plotlar yapmak yerine aynı plot şekilde de yapabiliriz.

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  facet_wrap(~ gear) +
  labs(title = "Faceted Scatter Plots by Gear Type")

Eğer bunu daha uzun yolla oluşturacak olsaydık

plot_3_gear <- ggplot(mtcars[mtcars$gear == 3, ], 
                      aes(x = wt, y = mpg)) +
  geom_point() +
  labs(title = "3 Gears")
plot_4_gear <- ggplot(mtcars[mtcars$gear == 4, ],
                      aes(x = wt, y = mpg)) +
  geom_point() +
  labs(title = "4 Gears")
plot_5_gear <- ggplot(mtcars[mtcars$gear == 5, ], 
                      aes(x = wt, y = mpg)) +
  geom_point() +
  labs(title = "5 Gears")
faceted_plot <- ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  facet_wrap(~ gear, ncol = 3) +
  labs(title = "Faceted Scatter Plots by Gear Type",
       x = "Weight",
       y = "Miles per Gallon")
faceted_plot

Title ekleme ve axis label değiştirme konusunu görmüştük ancak yeniden değinecek olursak:

Subtitle ve caption eklememizde mümkün.

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(color = "blue", size = 5, shape = 17) +
  labs(
    title = "Scatter Plot of MPG vs. Weight",
    subtitle = "Relationship between 
    car weight and fuel efficiency",
    x = "Weight (in 1000 lbs)",
    y = "Miles per Gallon",
    caption = "Data source: mtcars dataset in R"
  ) +
  geom_smooth(method = "lm", se = TRUE, 
              color = "red") +
  theme_minimal()

Eğer istersek verinin sadece bir kısmına odaklanabiliriz

ggplot(mtcars, aes(x = wt, y = mpg)) + 
  geom_point(color = "blue", size = 5, shape = 17) + 
  labs(title = "Fuel Efficiency vs. Car Weight",
       x = "Vehicle Weight (thousands of pounds)",
       y = "Fuel Efficiency (miles per gallon)") +
  geom_smooth(method = "lm", se = TRUE, color = "red") + 
  xlim(1.5, 5.5) +
  ylim(20, 35) +
  theme_minimal()

Axis scallarının değişim oranlarını ayarlayabiliriz.

ggplot(mtcars, aes(x = wt, y = mpg)) + 
  geom_point(color = "blue", size = 5, shape = 17) + 
  labs(title = "Fuel Efficiency vs. Car Weight",
       x = "Vehicle Weight (thousands of pounds)",
       y = "Fuel Efficiency (miles per gallon)") +
  geom_smooth(method = "lm", se = TRUE, color = "red") + 
  scale_x_continuous(breaks = seq(1.5, 5.5, by = 0.5)) +
  scale_y_continuous(breaks = seq(10, 35, by = 5)) +
  theme_minimal()

Textlerin yazı tipini değiştirebiliriz

ggplot(mtcars, aes(x = wt, y = mpg)) + 
  geom_point(color = "blue", size = 5, shape = 17) + 
  labs(title = "Fuel Efficiency vs. Car Weight",
       x = "Vehicle Weight (thousands of pounds)",
       y = "Fuel Efficiency (miles per gallon)") +
  geom_smooth(method = "lm", se = TRUE, color = "red") + 
  theme_minimal() +
  theme(
    axis.title = element_text(face = "bold", size = 12),
    axis.text.x = element_text(angle = 45, hjust = 1),
    axis.text.y = element_text(face = "italic")
  )

Plotların sadece dışındaki textleri editlemenin ötesinde içine de text eklememiz mümkün. Bunu yaparken de x ve y koordinatlarını kullanmamız gerekir ve zaten bunlar verinin içinde doğrudan var.

ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point() +
  annotate("text", x = 5, y = 30, label = 
             "High Efficiency", color = "blue", size = 5) +
  labs(title = "Scatter Plot with Annotations")

Görselleri kişiselleştirirken tek bir boyutta değil, birden fazla veri üstünde de editleme yapabiliriz.

ggplot(mtcars, aes(x = wt, y = mpg, color = factor(cyl), size = hp)) +
  geom_point() +
  labs(color = "Number of Cylinders", 
       size = "Horsepower")

Belli noktalara çizgi çekebiliriz. Bu özellikle verilerde belli bir nokta varsa onu ayırmamıza yarar.

ggplot(mtcars, aes(x = hp, y = mpg)) +
  geom_point() +
  geom_vline(xintercept = 150, 
             color = "red", linetype = "dashed") +
  geom_hline(yintercept = 20, 
             color = "blue", linetype = "dotted") +
  labs(title = "Scatter Plot with Vertical 
       and Horizontal Lines",
       x = "Horsepower (hp)",
       y = "Miles per Gallon (mpg)")

İstersek belirli bir bölgeye odaklanmak için orayı dörtgen içine de alabiliriz.

ggplot(mtcars, aes(x = hp, y = mpg)) +
  geom_point() +
  geom_rect(aes(xmin = 100, xmax = 200, 
                ymin = 15, ymax = 25),
            fill = NA,  
            color = "red", 
            linetype = "dashed",
            size = 1) + 
  labs(title = "Scatter Plot with 
       Highlighted Area (Outlined)",
       x = "Horsepower (hp)",
       y = "Miles per Gallon (mpg)")

Box plot daha advanced diyebileceğimiz bir görselleştirme şekli. Bunu verilerin dağılımını ve outlier dediğimiz verileri görmek için kullanırız. Bu aslında haftaya da göreceğimiz quartile, min, max, median ve outlier değerlerinin bir görsel özeti.

ggplot(mtcars, aes(x = factor(cyl), y = mpg)) +
  geom_boxplot(outlier.colour = "red", outlier.shape = 8) +
  labs(title = "Box Plot of MPG by Number 
       of Cylinders", x = "Cylinders", 
       y = "Miles per Gallon")

Histogram ise continious bir değişkenin dağılımın görmemize yarar. Verinin analize uygun olup olmadığını da bunu kullanarak görebililiriz. Haftaya istatistik kısmında daha detaylı konuşacağız.

ggplot(mtcars, aes(x = mpg)) +
  geom_histogram(binwidth = 2, 
                 fill = "lightblue", color = "red") +  
  geom_density(aes(y = 2 * ..count..), 
               color = "blue", linewidth = 1) +
  labs(title = "Histogram and Density of MPG",
       x = "Miles per Gallon")

Plotları save etmek için ise:

p <- ggplot(mtcars, aes(x = wt, 
                        y = mpg)) + geom_point()
ggsave("scatter_plot.png", plot = p, 
       width = 8, height = 6, dpi = 300)

Dersin asıl kısmı buraya kadardı. Şimdi hızlıca 2 örnek görelim ve böylece R ile görselleştirmenin ne kadar güçlü olabileceğini de anlamış oluruz.

Adanvced Plots

İnteraktif plotlar oluşturabiliriz

library(plotly)
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
plot_plotly <- plot_ly(
  data = mtcars,
  x = ~hp,  
  y = ~mpg,
  type = 'scatter',
  mode = 'markers', 
  marker = list(size = 10, color = 'blue')
)
plot_plotly

Plotları da animate edebiliriz

library(ggplot2)
library(gganimate)
library(av)
library(gifski)
p_animate <- ggplot(mtcars, aes(x = hp,
                                y = mpg, 
                                color = 
                                  factor(cyl))) +
  geom_point(size = 3) +
  labs(
    title = 'Relationship between 
    Horsepower and Miles Per Gallon',
    x = 'Horsepower (hp)',
    y = 'Miles per Gallon (mpg)',
    color = 'Cylinders'
  ) +
  theme_minimal()
animated_plot <- p_animate + 
  transition_states(disp, transition_length = 2, 
                    state_length = 1) + 
  ease_aes('cubic-in-out') 
animated_plot

SON