class: center, top, title-slide .title[ # İLT668, Birinci Ders ] .subtitle[ ## R, Rstudio, Nesneler ve Veri Yapıları ] .author[ ### Umut Yener Kara ] .date[ ### 5 Mart, 2023
Güncelleme: Mar 7, 2023 ] --- # Neden R? R veri analizi için tasarlanmış bir *programlama dilidir*. Benzer yazılımlara ve programlama dillerine kıyasla avantajları nelerdir? -- * R *ücretsiz* ve *özgür* bir yazılımdır. -- * R'ın *geniş* bir kullanıcı tabanı ve topluluğu vardır. -- * R az çok bütün veri formatıyla uyumludur. -- * R tekrarlanabilir analizleri kolaylaştırır. -- * R *her şeyi* yapabilir. -- * R son derece kolay bir programlama dilidir ve R becerileri Python gibi diğer daha zor dillere rahatlıkla aktarılabilir. --- # Neden R Studio? R Studio, R kullanmayı, kod yazmayı ve analizleri kolaylaştıran bir arayüz programıdır (IDE: Integrated Development Environment). Ne işe yarar? -- * Kodları, çıktıları ve grafikleri düzenlemeyi ve organize etmeyi sağlar. -- * Kodları otomatik tamamlama, hataları gösterme, sentaksı daha açık hale getirmeyi sağlar. -- * Verileri ve nesneleri görmeyi sağlar. -- * Başka dillerde kod yazma gibi pek çok ileri özelliği bulunmaktadır. --- # Başlarken R Studio'yu açın *File > New File > R Script* diyerek yeni bir script yaratın. Scriptler R kodunun yazıldığı ve kaydediliği metin dosyalarıdır. Ardından, arayüze bir göz atalım: * **Sol Üst**: Kod **Editor** bölmesi, açık scriptler * **Sol Alt**: Kodun çalıştığı **Konsol** bölmesi (`>` işareti) * **Sağ Üst**: Oturumda (session) tanımlı nesnelerin görüldüğü **Environment (Ortam)** bölmesi, **History (Geçmiş)** bölmesi vesaire * **Sağ Alt**: Dosyaların, klasörlerin, grafiklerin, paketlerin, yardım sekmelerinin olduğu bölme. Bölmelerin düzeni *Preferences > Pane Layout* kısmından değiştirilebilir. --- # Kod Düzenleme ve Çalıştırma RStudio'da R kodunu çalıştırmak için birkaç yol vardır: -- * **Editor** penceresinde satırları seçin, yukarıdaki *Run* tuşuna basarak veya `Ctrl+Enter` veya `⌘+Enter` kısayollarına basarak çalıştırın. -- * **İmleci** çalıştırmak istediğiniz kod satırının üzerine getirin, *Run* veya `Ctrl+Enter` veya `⌘+Enter` kısayollarına basın. Bu şekilde imleciniz bir sonraki satıra atlayacaktır, böylece tekrar tekrar basarak kodu arka arkaya çalıştırabilirsiniz. -- * **Konsola** kod satırları yazın ve `Enter'a` basın. -- Konsol çalıştırdığınız kod satırlarını ve işlemin sonucunu gösterecektir. --- # Eksik Kod Kod yazarken hata yaptığınızda (örn. parantezlerin bir tanesini eksik bıraktığınızda), R konsolda komutu tamamlamak için bazen `+` işareti gösterecektir: ```r > sum(11+2 # sum fonksiyonu toplama işlemi yapar + ``` Bu durumlarda komutu tamamlayabilir (örn. eksik parantezi ekleyerek) veya `Esc` tuşuna basarak işlemi iptal edebilirsiniz. --- # Hesap Makinesi Olarak R En basit haliyle, R bir hesap makinesi olarak kullanılabilir. İşlemleri gerçekleştirmek için konsola kodu yazıp Enter tuşuna basabiliriz. **Konsola**, `123 + 456 + 789` yazıp `Enter'a` basınız. -- ```r 123 + 456 + 789 ``` ``` ## [1] 1368 ``` -- İşlem sonucundaki `[1]` işareti sonuç satırlarının sayısal **indeks** numarasını gösterir. -- Şimdi boş bir R script dosyasında **editor** penceresine `sqrt(100)` yazıp çalıştırmayı deneyin. -- ```r sqrt(100) ``` ``` ## [1] 10 ``` --- # Fonksiyonlar ve Yardım `sqrt()` bir **fonksiyon** örneğidir. Fonksiyonlar iki parantez içerisindeki girdilere işlem yaparak sonucu getirirler. Eğer `sqrt()` fonksiyonu ile ilgili yardım almak istiyorsak, `?sqrt`, `help(sqrt)` veya `F1` kısayoluyla sağ alt taraftaki **Help** paneline bakabiliriz. ```r ?sqrt ``` -- **Arguments (Argümanlar)** fonksiyonların *girdileridir*. Bu durumda `sqrt()` fonksiyonu için tek argüman `x` idir. Bu örnekte `x` herhangi bir sayı veya vektör anlamına gelmektedir. Argümanlar genelde iki türdendir: * Fonksiyonun uygulandığı **nesne** (herhangi bir veri yapısı olabilir). * Fonksiyonun nasıl çalıştığını değiştiren **komutlar**, yani **opsiyonlar**. -- Yardım dosyaları fonksiyonların nasıl kullanılacağı, argümanlar ve örnek kodlar gibi pek çok faydalı bilgi barındırmaktadır. --- # Nesneler ve Operatörler R her şeyi **nesne** olarak tanımlamaktadır. Veriler, fonksiyonlar, grafikler, modeller ve sonuçlar az çok her şey **nesne** olabilir. -- Nesneler R'da **atama(assignment) operatörü**: `<-` ile yaratılır. -- ```r yeni_nesne <- 144 ``` -- `<-` gibi **operatörler** sembol gibi görünen fonksiyonlardır ancak `sqrt(x)` için olduğu gibi `()` içerisine değil nesneler arasına yazılırlar. **Uyarı:** İnternette bazen atama işlemi için Python'da olduğu gibi `=` işaretinin (örn. `yeni_nesne = 144`) veya ters okun (örn. `144 -> yeni_nesne`) kullanıldığını görebilirsiniz. Çalışıyor olsalar da epey karışıklık yarattıklarından *kullanılmamaları* tavsiye edilir. --- # Aritmetik İşlem Operatörleri .pull-left[ Toplama (**+**) ```r 12 + 30 ``` ``` ## [1] 42 ``` Çıkarma (**-**) ```r 50 - 2 ``` ``` ## [1] 48 ``` Çarpma (*****) ```r 10*2 ``` ``` ## [1] 20 ``` ] .pull-right[ Bölme (**/**) ```r 10/2 ``` ``` ## [1] 5 ``` Üs Alma (**^** veya ******") ```r 10^2 ``` ``` ## [1] 100 ``` ```r 10**2 ``` ``` ## [1] 100 ``` Kalan (Modulo) (**%%**) ```r 10%%3 ``` ``` ## [1] 1 ``` ] --- # Nesneler ve İsimlendirme R'da nesneler veri saklayan kaplar olarak düşünülebilir. Bir nesnenin ismini yazıp çalıştırdığımızda R onun içeriğini getirecektir. ```r yeni_nesne ``` ``` ## [1] 144 ``` -- Nesne isimleri boşluk içeremezler. Nesne isimleri `_` gibi semboller veya sayı içerebilirler ama böyle semboller veya sayılarla *başlayamazlar*. -- R nesne isimleri - ayrıca fonksiyon ve argüman isimleri - **büyük harf/küçük harf duyarlıdır**. Kod yazarken bazen hatalar bu hususa dikkat etmemekten kaynaklanabilmektedir. ```r Yeni_nesne Sqrt(100) ``` Y ve S harfleri büyük yazıldığından yukarıdaki kod çalışmayacaktır. *İsimlendirme okunabilir, düzenli ve temiz kod yazmak için son derece önemlidir.* --- # İsimlendirme için Öneriler -- * Rstudio'nun otomatik tamamlama özelliği kısa ve belirsiz nesne isimlerinden ziyade uzun isimleri tercih edilebilir hale getirir. -- * Uzun isimlerde `_` işaretinin kullanılması (örn. `doğum_yılı`) *önerilir*. İnternette nokta işaretinin sıkça kullanıldığını görebilirsiniz (örn. `doğum.yılı`) ancak çeşitli karışıklıklar yaratmaktadır. -- * Hataları engellemek için *sadece küçük harf* kullanılması önerilir. -- * `ş`, `ç` gibi Türkçe karakterler belli durumlarda hatalara sebebiyet verebilmektedir (İngilizce isimlendirme bir seçenektir). --- # Nesnelerle İşlemler Bir nesnenin **ismi** o nesnenin içerisine kaydedilmiş veriyi temsil eder, bu yüzden nesne isimleriyle değerlerle yaptığınız her işlemi yapabilirsiniz. -- ```r yeni_nesne + 10 ``` ``` ## [1] 154 ``` ```r yeni_nesne * yeni_nesne ``` ``` ## [1] 20736 ``` ```r sqrt(yeni_nesne) ``` ``` ## [1] 12 ``` -- Environment'da kayıtlı olan nesneleri çeşitli fonksiyonlarla sorgulayabilir, onları tek tek veya tamamen silebiliriz. ```r ls() # kayıtlı nesneleri listeler rm(x) # x nesnesini siler rm(list = ls()) # kayıtlı tüm nesneleri hafızadan siler. ``` --- # Temel Veri Türleri .pull-left[ R'daki ana veri türleri şöyle sıralanabilir: * **Sayı** (`double` diye de geçer) - `10.5`, `55`, `787` * **Tam Sayı** (Integer) - `1L`, `55L`, `100L`("L" sayının tam sayı olduğunu belirtir). * **Karakter** (`string` diye de geçer) - `"k"`, `"mehmet"`, `"FALSE`", `"11.5"`<sup>*</sup> * **Mantıksal** (`Boolean` diye de geçer) - `TRUE` ve `FALSE` * **Eksik Veri** -`NA` .footnote[*R tırnak içerisine alınmış her türlü değeri karakter verisi olarak tanımlayacaktır.] ] -- .pull-right[ * class() veya typeof() fonksiyonları ile nesnelerin sınıfını ve tipini sorgulayabilirsiniz. ```r isim <- "ahmet" class(isim) ``` ``` ## [1] "character" ``` ```r sayı <- 5 typeof(sayı) ``` ``` ## [1] "double" ``` ] -- --- # Vektörler R'daki en basit ve yaygın veri yapısı **vektörlerdir**. Vektörler birden fazla değer alabilen tek boyutlu veri dizileri olarak tanımlanırlar. R dilinde vektörler c() ile ifade edilen *birleştir* (combine veya concatenate) fonksiyonu ile yaratılırlar. c() fonksiyonu kullanılırken vektör elemanları tek tek tanımlanır ve aralarına virgül işareti konur. -- ```r yeni_nesne <- c(4, 9, 16, 25, 36) yeni_nesne ``` ``` ## [1] 4 9 16 25 36 ``` -- Bir nesneye, var olan bir nesnenin ismini verdiğinizde, yeni nesneyi eskisinin *üzerine yazacaktır (overwrite)*. -- Pek çok fonksiyon argüman olarak vektörlerle de çalışır. Böyle durumlarda fonksiyon vektörün içerisindeki bütün değerlere uygulanacaktır. -- ```r sqrt(yeni_nesne) ``` ``` ## [1] 2 3 4 5 6 ``` --- # Kompleks Nesneler Aynı ilkeler **matrisler**, **listeler**, ve **veri çerçeveleri (data frame)** gibi farklı veri yapısına sahip nesneler için geçerlidir. Bu derste genelde **veri çerçeveleri** ile çalışacağımızdan bu konuya odaklanacağız ancak önce kısaca matrisleri ve listeleri tanıtalım. --- # Listeler Listeler vektörlerden farklı olarak birden fazla veri türü saklayabilen veri yapılarıdır. Çok yaygın olmasalar da kullanılırlar. **list()** fonksiyonuyla içinde bir sayı, bir vektör, bir mantıksal değer ve bir de hayali sayı içeren bir liste yaratalım. .pull-left[ ```r liste <- list(1, c("a", "b"), TRUE, 1 + 4i) liste ``` ``` ## [[1]] ## [1] 1 ## ## [[2]] ## [1] "a" "b" ## ## [[3]] ## [1] TRUE ## ## [[4]] ## [1] 1+4i ``` ] .pull-right[ Spesifik öğelere erişmek için listelerde çift köşeli parantez kullanılır. ```r liste[[3]] ``` ``` ## [1] TRUE ``` ```r class(liste[[2]]) ``` ``` ## [1] "character" ``` ] --- # Matrisler .pull-left[ **Matrisler** sıralara ve sütunlara sahip tablo tipi veri yapılarıdır. Matrisler ile veri çerçeveleri arasındaki temel fark matrislerin sadece tek türden (sayısal, karakter vb.) veri saklayabilmesi, veri çerçevelerinin ise birden fazla veri tipi barındırabilmesidir. R'da `matrix()` fonksiyonuyla matris yaratılabiliriz. Aşağıdaki örneği inceleyelim: ```r matris <- matrix(1:9, byrow = TRUE, nrow = 3) matris ``` ``` ## [,1] [,2] [,3] ## [1,] 1 2 3 ## [2,] 4 5 6 ## [3,] 7 8 9 ``` ] .pull-right[ `matrix()` fonksiyonu içerisinde: * İlk argüman R'ın matrisin sıralarına ve sütunlarına dizeceği değerlerdir. Burada `c(1, 2, 3, 4, 5, 6, 7, 8, 9)` yerine kısayolunu `1:9` ifadesini kullanıyoruz. * `byrow` argümanı matrisin soldan sağa sıra bazında doldurulacağını belirtir. Matrisin yukarıdan aşağıya sütun bazında doldurulmasını isteseydik, `byrow = FALSE` yazacaktık. * Üçüncü argüman olan `nrow` matrisin kaç sırası olacağını belirler (bu örnekte 3). ] --- # Veri Çerçeveleri Veri çerçeveleri R ortamında en yaygın kullanılan veri yapısıdırlar ve matrislere oldukça benzerdirler Matrislerden farklı olarak veri çerçeveleri birden fazla veri türü (karakter, sayı vesaire.) barındırabilirler. Örnek olarak R ile birlikte gelen `mtcars` verisetini yükleyerek inceleyelim. -- `data(mtcars)` komutu veri setini **Global Environment'a** yükleyecektir (ilk başta *promise* diyecektir). -- `View(mtcars)` komutu veri setini **Viewer** panosunda açacaktır. -- ```r head(mtcars, 5) # ilk 5 sırayı yazdırır, tail() tersini yapar ``` ``` ## mpg cyl disp hp drat wt qsec vs am gear carb ## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 ## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 ## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 ## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 ## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 ``` --- # Veri Çerçevelerini İncelemek `str()` bir nesnenin yapısını gösterir. ```r str(mtcars) # str[ucture] ``` ``` ## '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 ... ``` --- # `Summary()`fonksiyonu `summary()` veri çerçevesinin değerlerini özetleyen istatistikler verir. ```r summary(mtcars) ``` ``` ## mpg cyl disp hp ## Min. :10.40 Min. :4.000 Min. : 71.1 Min. : 52.0 ## 1st Qu.:15.43 1st Qu.:4.000 1st Qu.:120.8 1st Qu.: 96.5 ## Median :19.20 Median :6.000 Median :196.3 Median :123.0 ## Mean :20.09 Mean :6.188 Mean :230.7 Mean :146.7 ## 3rd Qu.:22.80 3rd Qu.:8.000 3rd Qu.:326.0 3rd Qu.:180.0 ## Max. :33.90 Max. :8.000 Max. :472.0 Max. :335.0 ## drat wt qsec vs ## Min. :2.760 Min. :1.513 Min. :14.50 Min. :0.0000 ## 1st Qu.:3.080 1st Qu.:2.581 1st Qu.:16.89 1st Qu.:0.0000 ## Median :3.695 Median :3.325 Median :17.71 Median :0.0000 ## Mean :3.597 Mean :3.217 Mean :17.85 Mean :0.4375 ## 3rd Qu.:3.920 3rd Qu.:3.610 3rd Qu.:18.90 3rd Qu.:1.0000 ## Max. :4.930 Max. :5.424 Max. :22.90 Max. :1.0000 ## am gear carb ## Min. :0.0000 Min. :3.000 Min. :1.000 ## 1st Qu.:0.0000 1st Qu.:3.000 1st Qu.:2.000 ## Median :0.0000 Median :4.000 Median :2.000 ## Mean :0.4062 Mean :3.688 Mean :2.812 ## 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:4.000 ## Max. :1.0000 Max. :5.000 Max. :8.000 ``` --- # Basit grafikler `hist()` bir vektörün histogram grafiğini üretir. Bir veri çerçevesinin sütunu olan vektörlere `$`, yani **çıkarma (extract) operatörü** ile erişebilirsiniz. .pull-left[ ```r hist(mtcars$hp) ``` <img src="data:image/png;base64,#ders_1_files/figure-html/unnamed-chunk-1-1.png" height="330px" /> ] .pull-right[ ```r hist(mtcars$qsec) ``` <img src="data:image/png;base64,#ders_1_files/figure-html/unnamed-chunk-2-1.png" height="330px" /> ] --- #R Paketleri ve Swirl **Swirl** interaktif R egzersizleri içeren bir pakettir. R paketlerini **install.packages("paket ismi")** formülüyle komut yazarak kurabildiğimiz gibi Rstudio'nun arayüzünü kullanarak **tools>install packages** kısmına tıklayıp paket ismini yazarak da kurabiliyoruz. ```r install.packages("swirl") ``` Kurulum *tek seferlik* bir süreçtir ancak paketleri kullanmak için *her oturumda* **library(paket ismi)** komutuyla kullanılacak paket(ler)i yüklemek gerekmektedir. **library(swirl)** komutu ile Swirl'ü yükledikten sonra **swirl()** komutu ile paketi çalıştırıyoruz. ```r library(swirl) swirl() ```