Bu haftaki derste, kitabın İleri Düzey Grafik Örnekleri bölümünde anlatılan plotly kütüphanesini kullanarak çeşitli veri görselleştirme yöntemlerini öğrendik. Plotly kütüphanesinde oluşturulan grafikler aynı zamanda etkileşimli olduğu için veriyi görselleştirme ve karşı tarafa daha net aktarma noktasında oldukça zengin içeriğe sahip. plotly, özellikle interaktif görselleştirme açısından çok kullanışlı. Oluşturulan grafiklerin çevrim içi paylaşımı ve kullanıcılarla etkileşimli olması bence bu dersin en etkileyici yanıydı. İleri düzey görselleştirme tekniklerini derinlemesine öğrenmeyi gerçekten çok istiyorum ama ilk aşamada biraz karmaşık geldi tabiki, üzerinde pratikk yapmak gerekiyor. Ama grafiklerle ilgili pratik yapmak sıkıcı değil, ben çok keyif alıyorum diyebilirim.

İLERİ DÜZEY GRAFİK ÖRNEKLERİ

“mtcars” veri seti ile uygulamalar

?mtcars
data("mtcars")

mil başına yakıt tüketimi(mpg) yoğunluk grafiği

# Veriyi silindir sayısına göre gruplama
silindir_sayisi <- mtcars %>% group_split(cyl)

cyl4_yogunluk <- density(silindir_sayisi[[1]]$mpg, na.rm = TRUE)
cyl6_yogunluk <- density(silindir_sayisi[[2]]$mpg, na.rm = TRUE)
cyl8_yogunluk <- density(silindir_sayisi[[3]]$mpg, na.rm = TRUE)

# Yoğunluk Grafiği
plot_ly() %>%
  add_lines(x = ~cyl4_yogunluk$x, y = ~cyl4_yogunluk$y, name = "4 Silindir", fill = 'tozeroy') %>%
  add_lines(x = ~cyl6_yogunluk$x, y = ~cyl6_yogunluk$y, name = "6 Silindir", fill = 'tozeroy') %>%
  add_lines(x = ~cyl8_yogunluk$x, y = ~cyl8_yogunluk$y, name = "8 Silindir", fill = 'tozeroy') %>%
  layout(xaxis = list(title = "MPG (Mil Başına Yakıt Tüketimi)"),
         yaxis = list(title = "Yoğunluk"))

mil başına yakıt tüketimi ve motor gücü grafiği

mtcars %>%
  plot_ly(
    x = ~mpg,                # Yakıt tüketimi (mpg)
    y = ~hp,                 # Motor gücü (hp)
    color = ~factor(cyl),    # Silindir sayısı (cyl)
    colors = "Set1"          
  ) %>%
  add_markers() %>%          # Nokta grafiği ekle
  layout(
    legend = list(title = list(text = '<b> Silindir Sayısı </b>')),
    xaxis = list(
      title = "MPG (Mil Başına Yakıt Tüketimi)",
      range = c(10, 35)),               # X ekseni aralığı
    yaxis = list(
      title = "HP (Motor Gücü)",        
      range = c(50, 350)                # Y ekseni aralığı
    )
  )

Bu grafik, yakıt tüketimi ile motor gücü arasındaki ilişkiyi, silindir sayısına göre renklendirilmiş olarak göstermektedir. Bu görselleştirme, motor gücünün ve yakıt tüketiminin silindir sayısına göre nasıl değiştiğini kolayca anlamamıza olanak tanır.

mil başına yakıt tüketimi ve silindir sayısı grafiği

mtcars %>%
  filter(!is.na(mpg)) %>% 
  plot_ly(
    x = ~factor(cyl),      # Silindir sayısı
    y = ~mpg,              # Yakıt tüketimi (mpg)
    color = ~factor(cyl)) %>%
  add_boxplot() %>%        # Kutu grafiği ekle
    layout(boxmode = "group") %>%     
    layout(legend = list(title=list(text ='<b> Silindir Sayısı </b>'))) %>% 
    layout(
        xaxis = list(title = "Silindir Sayısı"),  
        yaxis = list(title = "MPG (Yakıt Tüketimi)",range = c(10, 35))) # Y ekseni aralığı

Bu grafik, farklı silindir sayılarının yakıt tüketim dağılımlarını karşılaştırmayı kolaylaştırır.

mil başına yakıt tüketimi ve vites sayısı grafiği

mtcars %>%
  plot_ly(
    x = ~factor(gear),  # Vites sayısı (gear)
    y = ~mpg) %>%       # Yakıt tüketimi (mpg)
  add_boxplot() %>%     # Kutu grafiği ekle
  layout(
      xaxis = list(title = "Vites Sayısı (Gear)"),
      yaxis = list(title = "MPG (Yakıt Tüketimi)",range = c(10, 35)))

Silindir sayısı ve vites sayısına göre frekans grafiği

mtcars %>%
  count(cyl, gear) %>%
  plot_ly(x = ~factor(gear), y = ~n, hoverinfo = "y", color = ~factor(cyl)) %>%     
  add_bars() %>%            
      layout(legend = list(title = list(text = '<b> Silindir Sayısı </b>'))) %>% 
      layout(
        xaxis = list(title = "Vites Sayısı"),  
        yaxis = list(title = "Frekans", range = c(0, 15)))

Bu grafik, her bir silindir sayısındaki araçların vites dağılımını anlamayı kolaylaştırır.

KONTROL YAPILARI VE DÖNGÜLER

  • Kontrol yapıları, girdilere veya verilerin özelliklerine yanıt vermemize ve buna göre farklı R ifadeleri yürütmemize olanak tanır.

  • Bu derste; if, else, ifelse gibi yapıların nasıl doğru şekilde kullanılacağını öğrendik.

if-else kullanımı

if(<koşul>) {
        ## kodlar
} 

Yukarıdaki kod, koşul yanlışsa hiçbir şey yapmaz. Koşul yanlış olduğunda yürütmek istediğimiz bir eylemimiz varsa, o zaman bir else cümlesine ihtiyacımız vardır.

if(<koşul>) {
        ## kodlar
}else {
        ## kodlar
}

if’i herhangi bir if ile takip ederek bir dizi test yapabilirsiniz. else if kullanabilirsiniz.

if(<kosul1>) {
        ## kodlar
} else if(<kosul2>)  {
        ## kodlar
} else {
        ## kodlar
}

if/else yapısana geçerli bir örnek:

##  bir rastgele sayı oluşturun
set.seed(41)
x <- runif(1, 0, 10)
if(x > 3) {
        y <- 10
} else {
        y <- 0
}
x;y
## [1] 2.134905
## [1] 0

Bu kod, x değerinin 3’ten büyük olup olmadığını kontrol eder ve buna göre y değerini 10 veya 0 olarak belirler.

Aynı ifade eşdeğer bir şekilde şöyle yazılabilir:

y <- if(x > 3) {
        10
} else { 
        0
}
  • Ders içi örnek;
  1. Yapılan bir sınavda geçme notu 60 olarak belirlendiğinde, 75 alan bir öğrencinin durumu aşağıdaki if() durum cümlesiyle belirlenebilmektedir.
x<-75
if(x>=60){
print("Basarili")
}
## [1] "Basarili"
  1. Ancak kontrol durumu çoğunlukla tek önermeye bağlı değildir. Aşağıdaki kod çıktı vermeyecektir.
x <-55
if(x>=60){
print("Basarılı")
}

else kullanımı ile çıktı alabiliriz:

x <-55
# Başarılı Durum
if(x>=60){
print("Basarili")
}else{
print("Basarisiz")
}
## [1] "Basarisiz"
  1. Koşul her zaman iki kategori ile tanımlanamayabilir. Bu durumda kullanımı else if() ile destekleyebiliriz:
x <- 90 # Başarılı Durum
if(x>=90){
print("AA-kim kaybetmis biz bulalım")
}else if(x>=80){
print("BA")
}else if(x>=70){
print("BB")
}else if(x>=65){
print("CB")
}else if(x>=60){
print("CC")
}else if(x>=50){
print("DD")
}else if(x>=30){
print("FD")
}else{
print("FF")
}
## [1] "AA-kim kaybetmis biz bulalım"

Sıra Sizde

  1. a sayısının çarpmaya göre tersi 1/a’dir. Ancak bu durum 0 için tanımsızdır. if() durum cümlesi kullanarak bu durumu kodlayınız. x <- 5 ve x<-0 için için test ediniz.
a<-5
if(a==0){
print("1/0 tanimsizdir.")
}else{
print(paste(a,"'in carpmaya gore tersi 1/",a,sep=""))
}
## [1] "5'in carpmaya gore tersi 1/5"
  1. -2 ile 2 arasında sayılar üretip, bunu x değişkenine atayalım.
v1 <- rnorm(1)
v1
## [1] 1.899161
if(v1>1){
print("1'den buyuk")
}else if(v1>=-1 & v1<=1){
print("-1 ile +1 arasında")
}else{
print("-1'den kucuk")
}
## [1] "1'den buyuk"

if() & all()

if() önermesi bir elemanlı vektörlerde çıktı verse de if() önermesi içinde kullanılabilen all fonkisyonu ile vektörün tüm elemanları için koşul testi yapabilir.

x <- c(1,2,-3,4)
if(all(x>0)){
  
  print("tum sayilar 0'dan buyuktur")
  
} else{
  
  print("tum sayilar 0'dan buyuk degildir")
}
## [1] "tum sayilar 0'dan buyuk degildir"

if() & any()

Bir vektörde içinde yer alan her hangi bir elemana dair test ise if() fonksiyonu içinde any() fonksiyonu ile sağlanabilir.

x <- c(1,2,-3,4)
if(any(x<0)){
  
  print("nesne en az bir negatif sayi icerir")
  
} else{
  
  print("nesne negatif sayi icermez")
}
## [1] "nesne en az bir negatif sayi icerir"

if() çoklu islem

x <- 2
if(x == 2) {
  
  goster3 <- "Dogru"  
  goster3b <- c(1,2,3)
  goster3c <- sample(1:1000,4)
} else  {
  
  goster3 <- "Yanlis"  
  goster3b <- c(3,2,1)
  goster3c <- 10000 + sample(1:1000,4)
  
}

goster3
## [1] "Dogru"
goster3b
## [1] 1 2 3
goster3c
## [1]  96 894 584 698

ifelse()

ifelse() durum cümlesi, if() durum cümlelerinde vektörlerin kullanımından kaynaklı sıkıntılara çözüm sunar. Bu bakımdan ifelse(), if() durum cümlelerinin vektörler için kullanılabilir halidir.

  • ifelse() durum cümlesinin genel kullanımı aşağıdaki gibidir.

ifelse(koşul, Doğru İfade, Yanlış İfade)

v2 <- 20
ifelse(v2>= 65, "Basarili" ,"Basarisiz")
## [1] "Basarisiz"
  • ifelse() eksik veri atamak için de kullanılabilir. Eksik verinin 99 ile gösterildiği bir vektörde eksik veri yerine NA atama örneği:
(x <- c(1,2,3,4,99,5))
## [1]  1  2  3  4 99  5
ifelse(x==99, NA, x)
## [1]  1  2  3  4 NA  5

Sıra Sizde

  1. Elimizdeki bir nesnede yer alan sayıların tek ya da çift olduğunu yazdırma:
set.seed(41)
sayilar <- sample(50:90,27)
sayilar
##  [1] 89 84 54 81 57 78 55 71 80 62 87 67 70 83 82 61 66 53 50 69 79 64 85 51 73
## [26] 74 88
ifelse(sayilar %% 2==0, "Cift Sayi", "Tek Sayi")
##  [1] "Tek Sayi"  "Cift Sayi" "Cift Sayi" "Tek Sayi"  "Tek Sayi"  "Cift Sayi"
##  [7] "Tek Sayi"  "Tek Sayi"  "Cift Sayi" "Cift Sayi" "Tek Sayi"  "Tek Sayi" 
## [13] "Cift Sayi" "Tek Sayi"  "Cift Sayi" "Tek Sayi"  "Cift Sayi" "Tek Sayi" 
## [19] "Cift Sayi" "Tek Sayi"  "Tek Sayi"  "Cift Sayi" "Tek Sayi"  "Tek Sayi" 
## [25] "Tek Sayi"  "Cift Sayi" "Cift Sayi"
  1. Elimizdeki bir nesnede yer alan sayıların 0, pozitif veya negatif oldugu belirleme:
set.seed(987)
sayilar1 <- sample(-10:10,27,replace=TRUE)
sayilar1
##  [1]   4   3   4   2   1   7 -10   5   6  -8   7  -3   9   7  -9  10   4  -1  -8
## [20]   8  -3   0   4   5   8   1   3
sonuc <- ifelse(sayilar1 == 0, "Sifir", 
                ifelse(sayilar1 < 0, "Negatif", "Pozitif"))
sonuc
##  [1] "Pozitif" "Pozitif" "Pozitif" "Pozitif" "Pozitif" "Pozitif" "Negatif"
##  [8] "Pozitif" "Pozitif" "Negatif" "Pozitif" "Negatif" "Pozitif" "Pozitif"
## [15] "Negatif" "Pozitif" "Pozitif" "Negatif" "Negatif" "Pozitif" "Negatif"
## [22] "Sifir"   "Pozitif" "Pozitif" "Pozitif" "Pozitif" "Pozitif"
  1. Finalden 50 ve üzeri alan ve en az 11 derse devam edem öğrencilerin geçme notları finalin %60 ve vizenin %40 alınarak hesaplansın, 11’den az derse devam eden öğrencilerin geçme notu final notunun %60’ olarak alınsın.
vize <- c(60,70,80,90,55)
final <- c(45,65,70,50,80)
devam <- c(14,10,13,12,11)
gecme_notu<-ifelse(devam>=11,
                   (final*0.60+vize*0.40),
                   (final*0.60))
gecme_notu
## [1] 51 39 74 66 70

for

R’de for döngüleri bir ara değişken alır ve ona bir dizi ya da vektörden ardışık değerler atar. For döngüleri en yaygın olarak bir nesnenin (liste, vektör, vb.) elemanları üzerinde yineleme yapmak için kullanılır.

for(i in 1:10) {
        print(i)
}
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10

Döngüde indeks değişkeni herhangi bir nesne ile tanımlanabilir. Örneğin i, ayrıca indeks değerinin başlangıcı 1 olmak zorunda değildir.

for(i in 5:8) {
 print(i)
}
## [1] 5
## [1] 6
## [1] 7
## [1] 8

Karakter yazımında indeks i sadece tekrar amaçlı kullanılır.

for(i in 5:10){
  print("Merhaba")
}
## [1] "Merhaba"
## [1] "Merhaba"
## [1] "Merhaba"
## [1] "Merhaba"
## [1] "Merhaba"
## [1] "Merhaba"

Sıra Sizde

  1. Aşağıdaki çıktıyı sağlayacak kodu yazınız.

1 + 1 = 2 2 + 2 = 4 3 + 3 = 6 4 + 4 = 8 5 + 5 = 10 6 + 6 = 12 7 + 7 = 14 8 + 8 = 16 9 + 9 = 18 10 + 10 = 20

for (i in 1:10) {
  cat(i, "+", i, "=", i + i, "\n")
}
## 1 + 1 = 2 
## 2 + 2 = 4 
## 3 + 3 = 6 
## 4 + 4 = 8 
## 5 + 5 = 10 
## 6 + 6 = 12 
## 7 + 7 = 14 
## 8 + 8 = 16 
## 9 + 9 = 18 
## 10 + 10 = 20
for (i in 1:10) {
  print(paste(i, "+", i, "=", i + i))
}
## [1] "1 + 1 = 2"
## [1] "2 + 2 = 4"
## [1] "3 + 3 = 6"
## [1] "4 + 4 = 8"
## [1] "5 + 5 = 10"
## [1] "6 + 6 = 12"
## [1] "7 + 7 = 14"
## [1] "8 + 8 = 16"
## [1] "9 + 9 = 18"
## [1] "10 + 10 = 20"

for() Döngüsü ve Kontrol

Her zaman işlemi tüm elemanlara uygulamak istemeyebiliriz. Bunu önlemek icin akış kontrolü yapmak gerekir.

Kontrol mantıksal operatörlerle ya da koşul cümleleri ile sağlanabilir.

for(i in 1:3){
  if (i==2) cat("indeks cift sayidir","\n")
  else cat(i,"\n")
}
## 1 
## indeks cift sayidir 
## 3
for(i in 1:3){
  if (i==2) {
cat("indeks degeri ikidir:",i,"\n") 
  }else{cat("indeks degeri iki degildir","\n")}
}
## indeks degeri iki degildir 
## indeks degeri ikidir: 2 
## indeks degeri iki degildir

if sadece numerik değer ve vektörlerle çalışmaz. Aynı zamanda veri seti, matris ve listelerle de çalışabilir.

d <- data.frame(a = 1:5, b=2:6)
d
for(x in d) {
  cat("sutun toplamlari:", sum(x), "\n")
}
## sutun toplamlari: 15 
## sutun toplamlari: 20
X <- cbind(1:5, 21:25)
X
##      [,1] [,2]
## [1,]    1   21
## [2,]    2   22
## [3,]    3   23
## [4,]    4   24
## [5,]    5   25

Sıra Sizde

X matrisini kullanarak aşağıdaki çıktıyı elde etmek için gerekli kodu yazınız.

1 satirdaki degerlerin carpimi 21 olarak hesaplanmistir. 2 satirdaki degerlerin carpimi 44 olarak hesaplanmistir. 3 satirdaki degerlerin carpimi 69 olarak hesaplanmistir. 4 satirdaki degerlerin carpimi 96 olarak hesaplanmistir. 5 satirdaki degerlerin carpimi 125 olarak hesaplanmistir.

X <- cbind(1:5, 21:25)
X
for (i in 1:nrow(X)) {
  carpim <- prod(X[i, ]) # Satırdaki elemanların çarpımı
  cat(i, ". satirdaki degerlerin carpimi", carpim, "olarak hesaplanmistir.\n")
}
## 1 . satirdaki degerlerin carpimi 21 olarak hesaplanmistir.
## 2 . satirdaki degerlerin carpimi 44 olarak hesaplanmistir.
## 3 . satirdaki degerlerin carpimi 69 olarak hesaplanmistir.
## 4 . satirdaki degerlerin carpimi 96 olarak hesaplanmistir.
## 5 . satirdaki degerlerin carpimi 125 olarak hesaplanmistir.
for(i in 1:nrow(X)){
  cat(i, ". satirdaki degerlerin carpimi =", X[i,1]*X[i,2],sep = "", "\n")
}
## 1. satirdaki degerlerin carpimi =21
## 2. satirdaki degerlerin carpimi =44
## 3. satirdaki degerlerin carpimi =69
## 4. satirdaki degerlerin carpimi =96
## 5. satirdaki degerlerin carpimi =125