Bölüm8 Dplyr Paketi

Bir çok veri tabanı göründüğünden daha fazla bilgi içerir. dplyr paketi, gruplar arası farklar, değişken gruplamaları, yeni değişkenler oluşturma ve benzeri işlemleri gerçekleştirerek bu gizli bilginin açığa çıkması için kullanılan R paketlerinden biridir. Bu bölümdeki işlemleri yapmak için aşağıdaki kodları kullanarak dplyr paketini bilgisayarınıza indirdiğinizden ve R oturumuna eklediğinizden emin olunuz.

install.packages("dplyr")
install.packages("hflights")
library(dplyr)
library(hflights)

“Beş Büyükler”

dplyr paketi içinde birçok fonksiyon bulunsa da bunlardan beş tanesi paketin temelini oluşturmaktadır. “Beş büyükler” olarak nitelendirebileceğimiz fonksiyonları sayesinde dplyr paketi verinin düzgün bir şekilde manipülasyonu olanaklı kılar. Bu fonksiyonların isimlerini ve açıklamalarını aşağıda bulabilirsiniz.

select() fonksiyonu sütunlar/değişkenler arasından istediklerimizi seçer filter() fonksiyonu satırlar/gözlemler arasından istediklerimizi seçer, arrange() fonksiyonu değişkenlere göre sütunları organize eder, mutate() fonksiyonu veri tabanındaki sütun/değişkenleri kullanrak aynı veritanabına yeni sütun/değişken ekler ve, summarise() fonksiyonu istenilen kriterlere göre gözlemleri gruplar.

Bu bölümdeki işlemlerde hflights paketi içerisinde bulunan “hflights” isimli veri tabanını kullanacağımızdan aynı işlemleri bu paket için de yapmamız gerekiyor. Bu veri tabanında 2011 yılında Houston havaalanından kalkmış tüm uçaklara ait, iptal ve gecikme gibi veriler bulunuyor.

“hflights” veri tabanını konsol üzerinden çağırıp yapısına bakmak mümkün olsa da, bu veri tabanı 250 binden fazla gözlem içerdiğinden sonuç raporu bizim için çok kullanışlı olmayacaktır. Bu noktada dplyr paketinin tbl_df() fonksiyonunu kullanarak bu veri tabanını daha önce gördüğümüz “tibble/tbl” formatına çevirip, daha anlamlı bir rapor oluşturabiliriz.

hflights <- tbl_df(hflights)
hflights
## # A tibble: 227,496 x 23
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
##  * <int> <int>      <int>     <int>   <int>   <int> <chr>             <int>
##  1  2011     1          1         6    1400    1500 AA                  428
##  2  2011     1          2         7    1401    1501 AA                  428
##  3  2011     1          3         1    1352    1502 AA                  428
##  4  2011     1          4         2    1403    1513 AA                  428
##  5  2011     1          5         3    1405    1507 AA                  428
##  6  2011     1          6         4    1359    1503 AA                  428
##  7  2011     1          7         5    1359    1509 AA                  428
##  8  2011     1          8         6    1355    1454 AA                  428
##  9  2011     1          9         7    1443    1554 AA                  428
## 10  2011     1         10         1    1443    1553 AA                  428
## # ... with 227,486 more rows, and 15 more variables: TailNum <chr>,
## #   ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <fct>,
## #   Diverted <int>, Carrier <chr>, Code <chr>

Oluşan rapordan veri tabanında kaç satır/gözlem ve sütun/değişken bulunduğunu (227,496 x 21), değişkenlerin isimlerini rahatlıkla anlayabiliyoruz.

Veri tabanını daha anlaşılır hale getirmek her zaman avantajınıza olur. Bir örnek olarak hflights veri tabanında bulunan uçak firmaları isimlerini kod halinde saklamış veriyi firmaların açık isimleri haline getirelim. Bu işlem için öncelikli olarak firmalara ait açık isimlerin bulunduğu bir vektöre gereksinimimiz var. Aşağıdaki kod bu işlemi gerçekleştiriyor ve vektörü “lut” ismi ile kaydediyor

lut <- c("AA" = "American", "AS" = "Alaska", "B6" = "JetBlue", "CO" = "Continental", 
         "DL" = "Delta", "OO" = "SkyWest", "UA" = "United", "US" = "US_Airways", 
         "WN" = "Southwest", "EV" = "Atlantic_Southeast", 
         "F9" = "Frontier", "FL" = "AirTran", 
         "MQ" = "American_Eagle", "XE" = "ExpressJet", "YV" = "Mesa")

İkinci aşamada ise oluşan isim vektörümüzü veri tabanındaki ilgili sütun/değişken (UniqueCarrier) ile eşleştirip yeni bir sütun/değişken olarak (Carrier) veri tabanına eklememiz gerekiyor:

hflights$Carrier <- lut[hflights$UniqueCarrier]
glimpse(hflights)
## Observations: 227,496
## Variables: 23
## $ Year              <int> 2011, 2011, 2011, 2011, 2011, 2011, 2011, 20...
## $ Month             <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
## $ DayofMonth        <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1...
## $ DayOfWeek         <int> 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6,...
## $ DepTime           <int> 1400, 1401, 1352, 1403, 1405, 1359, 1359, 13...
## $ ArrTime           <int> 1500, 1501, 1502, 1513, 1507, 1503, 1509, 14...
## $ UniqueCarrier     <chr> "AA", "AA", "AA", "AA", "AA", "AA", "AA", "A...
## $ FlightNum         <int> 428, 428, 428, 428, 428, 428, 428, 428, 428,...
## $ TailNum           <chr> "N576AA", "N557AA", "N541AA", "N403AA", "N49...
## $ ActualElapsedTime <int> 60, 60, 70, 70, 62, 64, 70, 59, 71, 70, 70, ...
## $ AirTime           <int> 40, 45, 48, 39, 44, 45, 43, 40, 41, 45, 42, ...
## $ ArrDelay          <int> -10, -9, -8, 3, -3, -7, -1, -16, 44, 43, 29,...
## $ DepDelay          <int> 0, 1, -8, 3, 5, -1, -1, -5, 43, 43, 29, 19, ...
## $ Origin            <chr> "IAH", "IAH", "IAH", "IAH", "IAH", "IAH", "I...
## $ Dest              <chr> "DFW", "DFW", "DFW", "DFW", "DFW", "DFW", "D...
## $ Distance          <int> 224, 224, 224, 224, 224, 224, 224, 224, 224,...
## $ TaxiIn            <int> 7, 6, 5, 9, 9, 6, 12, 7, 8, 6, 8, 4, 6, 5, 6...
## $ TaxiOut           <int> 13, 9, 17, 22, 9, 13, 15, 12, 22, 19, 20, 11...
## $ Cancelled         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ CancellationCode  <fct> E, E, E, E, E, E, E, E, E, E, E, E, E, E, E,...
## $ Diverted          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ Carrier           <chr> "American", "American", "American", "America...
## $ Code              <chr> "iptal yok", "iptal yok", "iptal yok", "ipta...

Çıkan raporda son sıradaki “Carrier” ve yedinci sıradaki “UniqueCarrier” değişkenlerini incelediğinizde yaptığımız işlem daha net olarak görebilirsiniz.

Benzer bir işlemi de uçakların iptal nedenlerini anlatan ama bunları açık haliyle değil sadece birer harf olarak kodlamış olan “CancellationCode” değişkeni için yapalım. Amacımız iptal kodlarını açık ve anlaşılır hale getirmek. Yukarıdaki işlemi bu değişken için tekrarlayan aşağıdaki kodu inceleyiniz.

lut2 <- c("A" = "iptal yok", "B" = "firma", "C" = "hava", 
          "D" = "teknik", "E" = "guvenlik")
hflights$Code <- lut2[hflights$CancellationCode]
glimpse(hflights)
## Observations: 227,496
## Variables: 23
## $ Year              <int> 2011, 2011, 2011, 2011, 2011, 2011, 2011, 20...
## $ Month             <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
## $ DayofMonth        <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1...
## $ DayOfWeek         <int> 6, 7, 1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6,...
## $ DepTime           <int> 1400, 1401, 1352, 1403, 1405, 1359, 1359, 13...
## $ ArrTime           <int> 1500, 1501, 1502, 1513, 1507, 1503, 1509, 14...
## $ UniqueCarrier     <chr> "AA", "AA", "AA", "AA", "AA", "AA", "AA", "A...
## $ FlightNum         <int> 428, 428, 428, 428, 428, 428, 428, 428, 428,...
## $ TailNum           <chr> "N576AA", "N557AA", "N541AA", "N403AA", "N49...
## $ ActualElapsedTime <int> 60, 60, 70, 70, 62, 64, 70, 59, 71, 70, 70, ...
## $ AirTime           <int> 40, 45, 48, 39, 44, 45, 43, 40, 41, 45, 42, ...
## $ ArrDelay          <int> -10, -9, -8, 3, -3, -7, -1, -16, 44, 43, 29,...
## $ DepDelay          <int> 0, 1, -8, 3, 5, -1, -1, -5, 43, 43, 29, 19, ...
## $ Origin            <chr> "IAH", "IAH", "IAH", "IAH", "IAH", "IAH", "I...
## $ Dest              <chr> "DFW", "DFW", "DFW", "DFW", "DFW", "DFW", "D...
## $ Distance          <int> 224, 224, 224, 224, 224, 224, 224, 224, 224,...
## $ TaxiIn            <int> 7, 6, 5, 9, 9, 6, 12, 7, 8, 6, 8, 4, 6, 5, 6...
## $ TaxiOut           <int> 13, 9, 17, 22, 9, 13, 15, 12, 22, 19, 20, 11...
## $ Cancelled         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ CancellationCode  <fct> E, E, E, E, E, E, E, E, E, E, E, E, E, E, E,...
## $ Diverted          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
## $ Carrier           <chr> "American", "American", "American", "America...
## $ Code              <chr> "iptal yok", "iptal yok", "iptal yok", "ipta...

8.1 select() fonksiyonu

Uçuşlardaki ortalama gecikmeyi hesaplamaya çalıştığımızı düşünelim. Elimizdeki veri tabanında bulunan değişkenlerden sadece birkaçını kullanarak bu soruyu cevaplayabiliriz. İhtiyacımız olan değişkenleri seçmek için select() fonksiyonunu kullanacağız. Bu fonksiyonun kullanımı aşağıdaki gibidir.

select(veri_tabanı, değişken1, değişken2)

select() fonksiyonu aynı zamanda : ve - ifadeleri ile de kullanılabilir. Aşağıdaki kod veri tabanın birinci sütunundan dördüncü sütununa kadar olan kısmını, ikinci sütun/değişken dışarıda bırakılarak, seçilmesini sağlar. Sütun/değişken numaraları yerine isimleri de kullanılabilir.

select(veri_tabanı, 1:4, -2)

select() seçim yaptığınız orjinal veri tabanında bir değişikliğe yol açmaz. Dolayısıyla yaptığınız seçimleri ayrı bir R objesi halinde saklamak uygun olacaktır.

names() komutu ile veri tabanımızdaki değişkenlere bir göz atalım.

names(hflights)
##  [1] "Year"              "Month"             "DayofMonth"       
##  [4] "DayOfWeek"         "DepTime"           "ArrTime"          
##  [7] "UniqueCarrier"     "FlightNum"         "TailNum"          
## [10] "ActualElapsedTime" "AirTime"           "ArrDelay"         
## [13] "DepDelay"          "Origin"            "Dest"             
## [16] "Distance"          "TaxiIn"            "TaxiOut"          
## [19] "Cancelled"         "CancellationCode"  "Diverted"         
## [22] "Carrier"           "Code"

Bu değişkenlerden “Year” (yıl) ve “DayOfWeek” (haftanın günü) değişkenleri arasındaki tüm değişkenleri seçip “s1” olarak tanımlamak istediğimizde aşağıdaki kodu kullanırız.

s1 <- dplyr::select(hflights, Year:DayOfWeek)
s1
## # A tibble: 227,496 x 4
##     Year Month DayofMonth DayOfWeek
##  * <int> <int>      <int>     <int>
##  1  2011     1          1         6
##  2  2011     1          2         7
##  3  2011     1          3         1
##  4  2011     1          4         2
##  5  2011     1          5         3
##  6  2011     1          6         4
##  7  2011     1          7         5
##  8  2011     1          8         6
##  9  2011     1          9         7
## 10  2011     1         10         1
## # ... with 227,486 more rows

dplyr select() fonksiyonu için bir grup yardımcı fonksiyon da içerir. Bu fonksiyonlar sayesinde değişkenler içerisinden daha detaylı ayıklamalar yapılabilir. Yardımcı fonksiyonların listesini aşağıda bulabilirsiniz. Dikkat edilmesi gereken nokta bu yardımcı fonksiyonlarım çift tırnak (“”) ile beraber kullanılması gerekliliğidir.

  • starts_with("X"): “X” ile başlayan değişkenler,
  • ends_with("X"): “X” ile biten değişkenler,
  • contains("X"): “X” içeren değişkenler
  • matches("X"): “X” ifadesini içeren değişkenler,
  • num_range("x", 1:5): x01, x02, x03, x04 and x05 şeklinde kayıtlı değişkenler.

İçinde “Delay” (gecikme) geçen değişkenleri yardımcı fonksiyon kullanarak bulup d1 ismi ile tanımlayalım.

d1 <- dplyr::select(hflights, contains("Delay"))
d1
## # A tibble: 227,496 x 2
##    ArrDelay DepDelay
##  *    <int>    <int>
##  1      -10        0
##  2       -9        1
##  3       -8       -8
##  4        3        3
##  5       -3        5
##  6       -7       -1
##  7       -1       -1
##  8      -16       -5
##  9       44       43
## 10       43       43
## # ... with 227,486 more rows

Görüldüğü üzere içinde aradığımız kelime geçen iki değişkeni fonksiyonumuz d1 adı ile ayrı bir R nesnesi olarak tanımladı.

8.2 mutate() fonksiyonu

Bu bölümde ikinci olarak inceleyeceğimiz mutate() fonksiyonu veri tabanına yeni değişkenler eklemek istediğimiz zaman kullanılır ve yazımı aşağıdaki gibidir:

mutate(veri_tabani, yeni_değişken = değişken1 + değişken2)

Bu örnekte veri tabanında bulunan iki değişken toplanılarak yeni bir değişken üretiliyor. Yeni değişken üretiminde sadece toplama değil istenen her türlü işlem yapılabilir. Aynı select() fonksiyonunda olduğu gibi, bu fonksiyonda da yaptığınız işlemi ayrı bir R nesnesi (ki bu durumda bir veri tabanı/data frame/ tbl formatında) olarak kaydetmenizi öneririm.

Yolcuların uçmadan önce yerde geçirdikleri zamanı hesap etmeye çalışalım. hflights veri tabanında bulunan ve yolculukta geçirilen tüm zamanı belirten “ActualElapsedTime” (Yolculukta geçen toplam zaman) değişkeninden, sadece havada geçen zamanı belirten “AirTime” (Havada geçen zaman) değişkenini çıkartıp, oluşan yeni değişkeni “ActualGroundTime” (Yerde geçen zaman) değişkeni olarak “g1” isimli yeni veri tabanına kaydeden kodu aşağıda bulabilirsiniz.

g1 <- mutate(hflights, ActualGroundTime = AirTime - ActualElapsedTime)
g1
## # A tibble: 227,496 x 24
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
##    <int> <int>      <int>     <int>   <int>   <int> <chr>             <int>
##  1  2011     1          1         6    1400    1500 AA                  428
##  2  2011     1          2         7    1401    1501 AA                  428
##  3  2011     1          3         1    1352    1502 AA                  428
##  4  2011     1          4         2    1403    1513 AA                  428
##  5  2011     1          5         3    1405    1507 AA                  428
##  6  2011     1          6         4    1359    1503 AA                  428
##  7  2011     1          7         5    1359    1509 AA                  428
##  8  2011     1          8         6    1355    1454 AA                  428
##  9  2011     1          9         7    1443    1554 AA                  428
## 10  2011     1         10         1    1443    1553 AA                  428
## # ... with 227,486 more rows, and 16 more variables: TailNum <chr>,
## #   ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <fct>,
## #   Diverted <int>, Carrier <chr>, Code <chr>, ActualGroundTime <int>

R raporundan da anlaşılacağı gibi ActualGroundTime değişkenimiz son olarak veri tabanına eklendi. mutate() fonksiyonunun bir başka özelliği ise ihtiyaç duyulduğunda aynı anda aynı kodun içerisinde birden fazla yeni değişken üretebilmesidir. Aşağıdaki kodu kullanarak kendiniz aynı anda yeni değişkenler yaratmayı deneyebilirsiniz.

mutate(veri_tabani, yeni_değişken1 = değişken1 + değişken2, yeni_değişken2 = değişken3 * değişken4)

8.3 filter() fonksiyonu

filter() fonksiyonu veri tabanındaki satırları/gözlemleri istenilen şekilde filtrelemek için kullanılır. Yani bir bakıma sütunlar/değişkenleri ayıklamak için kullanılan select() fonksiyonunun satırlar/gözlemler için kullanılan halidir. filter() ile sadece seçtiğimiz gözlemlerden oluşan yeni bir veri tabanı oluşturmuş oluruz.

filter() fonksiyonu ile hflights veri tabanını kullanarak iptal edilmiş uçuşların sayısını bulmaya çalışalım. Bu iş için öncelikle uçuş iptali ile ilgili bilgiyi içeren sütunu/değişkeni saptamamız gerekiyor. Bu verinin hflights veri tabanındaki “Cancelled” (İptal edilmiş) sütununda/değişkeninde “1” ve “0” kodları ile kodlandığını görüyoruz. Değişkendeki “1” değeri uçuşun iptal edildiğini “0” değeri ise iptal edilmediğini ifade ediyor. Aynı select() fonksiyonunda olduğu gibi bu fonksiyonda da yeni oluşan veri tabanını yeni bir isimle kaydetmenizi öneririm. Aşağıdaki koda bir göz atalım:

iptaller <- filter(hflights, Cancelled == 1)
iptaller
## # A tibble: 2,973 x 23
##     Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
##    <int> <int>      <int>     <int>   <int>   <int> <chr>             <int>
##  1  2011     1         24         1      NA      NA AA                 1700
##  2  2011     1          9         7      NA      NA AA                 1820
##  3  2011     1         11         2      NA      NA B6                  624
##  4  2011     1         19         3      NA      NA B6                  624
##  5  2011     1         27         4      NA      NA B6                  624
##  6  2011     1         31         1      NA      NA CO                  442
##  7  2011     1         31         1      NA      NA CO                  500
##  8  2011     1         31         1      NA      NA CO                 1711
##  9  2011     1         29         6      NA      NA CO                  408
## 10  2011     1         28         5      NA      NA CO                  158
## # ... with 2,963 more rows, and 15 more variables: TailNum <chr>,
## #   ActualElapsedTime <int>, AirTime <int>, ArrDelay <int>,
## #   DepDelay <int>, Origin <chr>, Dest <chr>, Distance <int>,
## #   TaxiIn <int>, TaxiOut <int>, Cancelled <int>, CancellationCode <fct>,
## #   Diverted <int>, Carrier <chr>, Code <chr>

Görüldüğü gibi filter() fonksiyonu veri tabanının ismi ile beraber bizden bir mantıksal test ifadesi ister. Bu mantıksal test yukarıdaki örnekte “Cancelled==1”, yani iptal edilmiş uçuşlar şeklinde ifade edilmiş. Sonuçta da bu mantıksal kontrole dayanarak oluşan “iptaller” isimli veri tabanına “Cancelled” değişkeninin sadece “1” olarak kodlandığı gözlemler seçilmiş oldu. Oluşan rapordan, raporun üst kısmındaki satır sayısına dayanarak, toplamda 2973 uçuşun iptal olduğu bilgisini de elde ediyoruz.

filter() fonksiyonundan tam anlamıyla yararlanmak için eşit “==”, eşit değil “!=”, büyük “>”, küçük “<”, büyük eşit “>=” vb. mantıksal operatörlerin iyi bilinmesi gerekir. Bu operatörlerin detaylı açıklamalarına konsola “?Comparison” yazarak ulaşabilirsiniz. filter() fonksiyonunun bir başka özelliği de birden fazla mantıksal testi aynı anda çalıştırarak satır/gözlem seçimini yapabilmesidir. Aşağıdaki örnekte a değişkeninin 0 değerinden büyük olduğu, b değişkeninin 3 değerinden küçük veya eşit olduğu ve c değişkeninin “NA”/kayıp veri olarak kodlanmadığı gözlemleri seçen kodu bulabilirsiniz.

filter(veri_tabanı, a>0, b<=3, !is.na(c))

8.4 arrange() fonksiyonu

arrange() fonksiyonu satırları/gözlemleri içeriklerine göre sıralamak için kullanılır. Böylece veri tabanınızı hem istenilen kriterde sıralamış, hem de sadece verinin üst kısmına bakarak değişkenler arasındaki ilişkiyi görme şansını elde etmiş olursunuz. arrange() fonksiyonun kullanımı gayet kolaydır; fonksiyonun içine sadece veri tabanının ismini ve sıralama için kullanacağınız değişkeni tanımlamanız yeterli olur. Aşağıdaki kod önce hflights veri tabanından 3 değişkeni (içerisinde “Delay” kelimesi olanlar ve uçak kuyruk numarasını belirten “TailNum” değişkenleri) “gecikme” isimli yeni bir veri tabanına taşıyor, ve “gecikme” isimli veri tabanındaki “DepDelay” (Kalkıştaki gecikme) değişkenini kullanarak sıralamayı gerçekleştiriyor:

gecikme <- dplyr::select(hflights, TailNum, contains("Delay"))
arrange(gecikme, DepDelay)
## # A tibble: 227,496 x 3
##    TailNum ArrDelay DepDelay
##    <chr>      <int>    <int>
##  1 N728SK       -25      -33
##  2 N648MQ       -23      -23
##  3 N13908       -12      -19
##  4 N11107       -40      -19
##  5 N27610       -17      -18
##  6 N134EV       -31      -18
##  7 N14960       -15      -17
##  8 N14604        -9      -17
##  9 N13995       -17      -17
## 10 N502MQ       -23      -17
## # ... with 227,486 more rows

Yukarıda oluşan raporda bulunan gözlemlerdeki “-” değerlerden anlaşılacağı üzere bazı uçaklar belirtildiği saatlerden erken havalanmışlar. Hatta en üstteki gözleme göre bunlardan bir tanesi uçuş vaktinden 33 dakika önce havalanmış! Gene rapordan bazı gözlemlerin sıralandığında aynı değerlere sahip olduğunu anlıyoruz; örneğin yedinci ve onuncu gözlemler arası “DepDelay” değişkeni -17 değerini almış. arrange() ile bir başka değişkeni işe katarak bu eşitliği kendi içinde sıralayabiliriz:

arrange(gecikme, DepDelay, ArrDelay)
## # A tibble: 227,496 x 3
##    TailNum ArrDelay DepDelay
##    <chr>      <int>    <int>
##  1 N728SK       -25      -33
##  2 N648MQ       -23      -23
##  3 N11107       -40      -19
##  4 N13908       -12      -19
##  5 N134EV       -31      -18
##  6 N27610       -17      -18
##  7 N14943       -33      -17
##  8 N879AS       -32      -17
##  9 N368NB       -31      -17
## 10 N26215       -28      -17
## # ... with 227,486 more rows

arrange() sıralamayı önceden tanımlı/default olarak küçükten büyüğe yapar. Sıralamayı büyükten küçüğe yapmak için, arrange() içerisinde desc() fonksiyonun kullanılması gerekir. İlk yaptığımız sıralamayı büyükten küçüğe yapalım:

gecikme <- dplyr::select(hflights, TailNum, contains("Delay"))
arrange(gecikme, desc(DepDelay))
## # A tibble: 227,496 x 3
##    TailNum ArrDelay DepDelay
##    <chr>      <int>    <int>
##  1 N69063       957      981
##  2 N473AA       978      970
##  3 N502MQ       918      931
##  4 N670UA       861      869
##  5 N6EAMQ       793      814
##  6 N609MQ       822      803
##  7 N74856       775      780
##  8 N75861       766      758
##  9 N764NC       701      730
## 10 N651MQ       704      691
## # ... with 227,486 more rows

8.5 summarise() fonksiyonu ve pipe/aktarım operatörü

Beş büyüklerin sonuncusu olan summarise() (özetle) fonksiyonu verinizi inceleyerek değişkenlerinizi betimleyen özet istatistiki bilgileri içeren ufak veri tabanları oluşturmaya yarar. Hangi istatistiki bilgileri özetlemek istediğine ise kullanıcı kendi karar verir. Örneğin summarise() ile rötar bilgileri hakkında en yüksek, en düşük ve ortalama değerleri özetleyen bir veri tabanı yaratabiliriz.

summarise() fonksiyonunun yazımı mutate() fonksiyonuna benzer. İlk başta veri tabanının ismi yazılır, daha sonra ise istenen istatistiki testler sütun/değişken isimleri ile beraber fonksiyona eklenir.

`summarise(veri_tabanı, toplam = sum(A), ortalama = mean(B), varyans = var(C))`

Yukarıdaki kod ilgili veri tabanını kullanarak A değişkenine ait toplamı, B değişkenine ait ortalamayı ve C değişkenine ait varyansı hesaplayıp “toplam”, “ortalama” ve “varyans” isimli sütunlara yerleştirir. Formülde kullanılan sum(), mean(), ve var() fonksiyonları temel R içinde gelen toplam, ortalama ve varyans hesaplamaya yarayan fonksiyonlardır. Bir önceki örnekte “gecikme” ismi ile kaydettiğimiz veri tabanı üzerinde summarise() fonksiyonunu kullanan aşağıdaki örneği inceleyelim

gecikme <- filter(gecikme, !is.na(DepDelay))
summarise(gecikme, en_az = min(DepDelay), ortalama = mean(DepDelay), en_fazla = max(DepDelay))
## # A tibble: 1 x 3
##   en_az ortalama en_fazla
##   <dbl>    <dbl>    <dbl>
## 1   -33     9.44      981

Kodda ilk adım olarak “DepDelay” değişkeni içinden NA/kayıp veri içeren gözlemleri eledik. Daha sonra ise min() en az, mean() ve max() en fazla fonksiyonlarını kullanarak verimiz hakkında ufak bir özet hazırladık. Sonucu raporda görebilirsiniz.

Bu noktadadplyr paketindeki fonksiyonları bir zincir halinde beraber kullanmanın avantajlı olacağını düşünüyor olabilirsiniz. Örneğin aynı veri tabanında filter(), mutate(), select(), arrange() ve summarise() fonksiyonlarını aynı anda tek bir kod halinde kullanmak yapılacak işi hem daha kolay hem de daha anlaşılır hale getirecektir. pipe operatörü tam da bu işe yarar. %>% ile ifade edilen pipe operatörü R nesnesi ile fonksiyonun arasına yerleşerek solunda yer alan R nesnesini alıp sağında yer alan kullanılacak fonksiyonun içerisine yerleştirir. Aşağıdaki örneği inceleyiniz

a %>%
  select(X, Y, Z) %>%
  filter(X > Y) %>%
  mutate(Q= X+Y+Z) %>% 
  summarise(all = sum(Q))

Yukarıda kullanılmış olan %>% işaretini “sonra” diye okuyabiliriz: a veri tabanını al, sonra X Y ve Z değişkenlerini seç, sonra X’in Y’den büyük olduğu gözlemleri filtrele, sonra X Y ve Z değişkenlerinin toplamı olan Q değişkenini hesapla sonra Q değişkenini toplayarak özetle.

Uçakla mı kara yoluyla mı gidelim? Gelin bu sorunun cevabını hflights veri tabanını kullanarak bulmaya çalışalım. Ortalama hızı araba ile gitmekten daha düşük olan uçuşları bulmak için aşağıdaki adımları tek bir kod halinde yazmaya çalışalım.

  • “ActualElapsedTime” değişkenine 100 dakika ekleyen ve uçak yolculuğunda havaalanına gitmek vb gibi zaman alan adımlarını da hesaba katan “gercek_zaman” isimli ve
  • Gidelecek uzaklığı “gercek_zaman” değişkenine bölüp 60 ile çarparak yolculuk sırasındaki saatteki hızımızı ölçen “saatteki_hiz” değişkenlerini yaratalım.

Daha sonra “saateki_hiz” değişkenimizdeki NA/kayıp veri içeren ve 70 değerinden daha küçük olan gözlemleri ayıklayalım.

Son olarak da, gözlem sayısını “gozlem”, varış noktalarının sayısını “varis”, en yakın mesafeyi “en_yakin” ve en uzak mesafeyi “en_uzak” sütunlarında tanımlayan veri tabanını oluşturalım

hflights %>%
mutate(gercek_zaman = ActualElapsedTime + 100, 
       saateki_hiz = Distance / gercek_zaman * 60) %>%
  filter(!is.na(saateki_hiz), saateki_hiz < 70) %>%
  summarise(gozlem = n(), 
            varis = n_distinct(Dest), 
            en_yakin = min(Distance), 
            en_uzak = max(Distance))
## # A tibble: 1 x 4
##   gozlem varis en_yakin en_uzak
##    <int> <int>    <dbl>   <dbl>
## 1   6726    13       79     305

Sonuçlardan 12 uçuşun araba ile gitmekten daha yavaş olduğunu anlıyoruz.

summarise() ile tüm veri tabanı üzerindeki gözlemleri istatistiki olarak özetlemenin mümkün olduğunu gördük. Fakat analizlerde çoğu zaman gözlemleri oluşturan farklı gruplara ait istatistiki özetlere gereksinim duyarız. dplyr grup bazlı bu özetleri group_by() fonksiyonu ile oluşturur. Havayolu şirketlerini yaptıkları gecikmelere göre karşılatırıp sıralayan aşağıdaki kodu inceleyiniz

hflights %>%
  group_by(UniqueCarrier) %>%
   summarise(p_canc = mean(Cancelled == 1) * 100, 
             avg_delay = mean(ArrDelay, na.rm = TRUE)) %>%
   arrange(avg_delay, p_canc)
## # A tibble: 15 x 3
##    UniqueCarrier p_canc avg_delay
##    <chr>          <dbl>     <dbl>
##  1 US             1.13     -0.631
##  2 AA             1.85      0.892
##  3 FL             0.982     1.85 
##  4 AS             0         3.19 
##  5 YV             1.27      4.01 
##  6 DL             1.59      6.08 
##  7 CO             0.678     6.10 
##  8 MQ             2.90      7.15 
##  9 EV             3.45      7.26 
## 10 WN             1.55      7.59 
## 11 F9             0.716     7.67 
## 12 XE             1.55      8.19 
## 13 OO             1.39      8.69 
## 14 B6             2.59      9.86 
## 15 UA             1.64     10.5

Yukarıdaki kod ilk başta hflights veri tabanini çağırıyor. Daha sonra farklı firmaların isimlerini içeren “UniqueCarrier” değişkenini kullanarak grupluyor. Bu gruplama üzerinden iptal yüzdesini hesaplayan “p_canc” ve ortalama gecikmeyi hesaplayan “avg_delay” isimli iki yeni değişkeni özetleyip ortalama gecikmeye göre sıraya sokuyor. Sonuçtan “UA” United Airlines firmasının en fazla geciken firma olduğu ortaya çıkıyor.