Tidyverse

Veri önişleme
Author

Hazel Kavili

Published

March 3, 2018

Veri bilimiyle uğraşan birçok insanın karşısında satırlar ve sütunlardan oluşan tablolar mevcut. Bu tabloları bazen API’lar, bazen Excel, csv, txt dosyaları, bazen de veri tabanları sayesinde elde ediyoruz (tabi sadece bunlarla da sınırlı değil). Bunlar kimi zaman düzenli, ama çoğu zaman düzenleme (temizlik) isteyen tablolar. Tidyverse de burada devreye giriyor: bize düzenlemeleri, görselleştirmeleri, modellemeleri kolay bir şekilde yapabilmemizi sağlayan, R’ın birçok paketini içinde bulunduran büyükçe bir paket. Hepsiyle beraber ve en önemlisi Tidyverse bize bir iş akışı (workflow) sunar. Veri bilimi ile uğraşanların sistematik bir şekilde ilerlemesine, işlemler arasında bağlantıların kolay kurulup anlaşılmasına yardımcı olur. Aşağıdaki şemada, tidyverse’ün sağladığı akışı ve kullanabileceğiniz bazı paketleri görebilirsiniz:

Yukarıda bahsedilen tabloları, R dünyasında data frame veya şu anda yaygın halde kullanılan tibble olarak adlandırıyoruz.

Satırlarda gözlemler, sütunlarda değişkenler olacak şekilde aşağıda düzenli, örnek bir data frame var:

Son yıllarda hem okuduklarımdan hem gittiğim konferanslardan hem de içinde bulunduğum R-Ladies topluluğunda veri bilimi eğitimi veren arkadaşlarımızdan edindiğim bilgiler doğrultusunda, bu işe yeni başlayanlara bu alanı sevdirmek için tidyverse yöntemleriyle yazılarıma devam edeceğim. Nedenlerine sevgili Mine Çetintaka-Rundell useR!2017’deki sunumunda çeşitli örneklerle değinmişti. Aşağıdaki örnekleri kendi çalışma alanınızda da deneyebilirsiniz, mtcars R’ın içinde hazır bir veri seti, arabaların benzin tüketimleriyle ve bazı fiziksel özellikleriyle ilgili. Bu iki örnek de aynı sonucu verecektir.

İlk önce install.packages(“tidyverse”) ile paketi yükleyelim ve library(tidyverse) ile de paketi çalışır hale getirelim:
install.packages("tidyverse")
library(tidyverse)
Ardından mtcars veri setine şöyle bir bakalım:
head(mtcars)
##                    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
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
İlk önce base R işlemleriyle yeni bir değişken oluşturalım ve bu değişkenin ismi transmission olsun. Bunu da am değişkenindeki 1 ve 0’lara göre yapalım: 0 olursa “automatic”, 1 olursa “manual” olsun.
mtcars$transmission[mtcars$am == 0] = "automatic"
mtcars$transmission[mtcars$am == 1] = "manual"

Burada $ işareti iki şekilde kullanılmış: sizin veri setinizden bir değişken seçmenize (subset yani alt kümeleme gibi düşünebilirsiniz) ve veri setinizde bir değişken oluşturmada. Bunu ayırt etmesi kolay değil.

Aynı işlemi bir de tidyverse ile yapalım. mutate ve case_when kullanarak:
mtcars <- mtcars %>%
  mutate(
    transmission = 
      case_when(
        am == 0 ~ "automatic",
        am == 1 ~ "manual"
      )
    )
mutate dönüştürmek demek. case_when ise sizi if ve else if yapılarını uzun uzun yazmaktan kurtarır. İkinci yazım şekli adım adım daha okunabilir, kolay yazılabilir ve takip edilebilir.

dplyr’a giriş

dplyr, veri manipülasyonu işlemlerini yapabileceğiniz, birçok temel problemi çözen ve bunları aklıda kalıcı fiillerle yapan bir paket. select, filter, muatate, group_by, arrange, summarise bunlardan birkaçı. Ayrıntılı bilgiye bu sayfadan ulaşabilirsiniz.

Bu bölümde size movies veri setini çalışma alanınıza indirip, okuyup, bir değişkene atadıktan sonra işlenmeye hazır hale getirmeyi anlatacağım. movies veri setini indirebileceğiniz link burada.
filmler <- read.csv(file = "movies.csv" , header = TRUE, sep = ",") 

read.csv(), read.xlsx(), read.table() gibi fonksiyonlar verinizi çalışma alanınıza almanızı sağlar. <- operatörü, atama operatörüdür. Burada, veri setimizi okuyup, atama operatörü ile filmler isimli bir değişkene atamış olduk.

Şimdi veri setimize bir bakalım. head() fonksiyonu bize veri setimizin ilk 6 gözlemini, tail() fonksiyonu son 6 gözlemini veriyor. Ancak n argümanını değiştirerek istediğiniz kadar gözlemi getirebilirsiniz:
head(filmler, n = 5)
##       director_name duration     actor_2_name     gross    actor_1_name
## 1     James Cameron      178 Joel David Moore 760505847     CCH Pounder
## 2    Gore Verbinski      169    Orlando Bloom 309404152     Johnny Depp
## 3        Sam Mendes      148     Rory Kinnear 200074175 Christoph Waltz
## 4 Christopher Nolan      164   Christian Bale 448130642       Tom Hardy
## 5    Andrew Stanton      132  Samantha Morton  73058679    Daryl Sabara
##                                 movie_title         actor_3_name language
## 1                                   Avatar             Wes Studi  English
## 2 Pirates of the Caribbean: At World's End        Jack Davenport  English
## 3                                  Spectre      Stephanie Sigman  English
## 4                    The Dark Knight Rises  Joseph Gordon-Levitt  English
## 5                              John Carter          Polly Walker  English
##   country    budget title_year imdb_score genres
## 1     USA 237000000       2009        7.9 Action
## 2     USA 300000000       2007        7.1 Action
## 3      UK 245000000       2015        6.8 Action
## 4     USA 250000000       2012        8.5 Action
## 5     USA 263700000       2012        6.6 Action
tail(filmler, n = 3)
##         director_name duration       actor_2_name gross actor_1_name
## 3704 Neill Dela Llana       80    Edgar Tancangco 70071  Ian Gamazon
## 3705     Edward Burns       95 Caitlin FitzGerald  4584  Kerry Bishé
## 3706         Jon Gunn       90   Brian Herzlinger 85222  John August
##             movie_title    actor_3_name language     country budget
## 3704            Cavite        Quynn Ton  English Philippines   7000
## 3705         Newlyweds  Daniella Pineda  English         USA   9000
## 3706 My Date with Drew         Jon Gunn  English         USA   1100
##      title_year imdb_score      genres
## 3704       2005        6.3    Thriller
## 3705       2011        6.4      Comedy
## 3706       2004        6.6 Documentary

str(filmler), summary(filmler) ve dim(filmler) fonksiyonlarını da çalıştırıp veri setinizi daha yakından tanıyabilirsiniz. str structure (yapı), summary özet, dim dimension (boyut) demektir.

Şimdi gelelim dplyr’ın nimetlerine.

Örneğin veri setinizdeki 13 değişkenle iş yapmak yerine, sadece bazı değişkenleri seçmek istiyorsunuz. Kullanacağınız fonksiyon: select()
filmler_ulkeler <- filmler %>% select(country, budget, imdb_score) %>% head(n=3)
filmler_ulkeler
##   country    budget imdb_score
## 1     USA 237000000        7.9
## 2     USA 300000000        7.1
## 3      UK 245000000        6.8
Seçmek istediğiniz kolonların sayı sırasını biliyorsanız sayı değerlerini yazabilir, setinizde istemediğiniz değişkeni önüne eksi (-) yazarak çıkarabilirsiniz:
filmler_ulkeler <- filmler %>% select(2:6, -4) %>% head(n=3)
filmler_ulkeler
##   duration     actor_2_name    actor_1_name
## 1      178 Joel David Moore     CCH Pounder
## 2      169    Orlando Bloom     Johnny Depp
## 3      148     Rory Kinnear Christoph Waltz
##                                 movie_title
## 1                                   Avatar 
## 2 Pirates of the Caribbean: At World's End 
## 3                                  Spectre 

Burada yeni bir operatörle karşı karşıyayız: %>% Buna pipe operatörü deniyor, biz de zincir operatörü demeyi tercih ediyoruz. Bu operatör soldakinin çıktısını, sağdakine girdi olarak veriyor. Örneğin yukarıda filmler veri setini alıyor, country, budget, imdb_score değişkenlerini seçiyor. Ve yeni bir değişkene, filmler_ülkeler, değişkenine atama yapıyor.

Pekiyi gözlemlerin içinden bazılarını filtrelemek istiyorsanız, örneğin Christopher Nolan’ın imdb puanı 7’den büyük olan filmlerini görmek istiyorsunuz, bu durumda kullanacağınız fonksiyon: filter():
filmler_puanlar <- filmler %>% filter(imdb_score > 7, director_name == "Christopher Nolan")

filmler_puanlar
##       director_name duration   actor_2_name     gross        actor_1_name
## 1 Christopher Nolan      164 Christian Bale 448130642           Tom Hardy
## 2 Christopher Nolan      152   Heath Ledger 533316061      Christian Bale
## 3 Christopher Nolan      169  Anne Hathaway 187991439 Matthew McConaughey
## 4 Christopher Nolan      148      Tom Hardy 292568851   Leonardo DiCaprio
## 5 Christopher Nolan      128    Liam Neeson 205343774      Christian Bale
## 6 Christopher Nolan      118  Maura Tierney  67263182           Al Pacino
## 7 Christopher Nolan      130   Hugh Jackman  53082743      Christian Bale
## 8 Christopher Nolan      113  Thomas Lennon  25530884       Callum Rennie
##              movie_title         actor_3_name language country    budget
## 1 The Dark Knight Rises  Joseph Gordon-Levitt  English     USA 250000000
## 2       The Dark Knight        Morgan Freeman  English     USA 185000000
## 3          Interstellar         Mackenzie Foy  English     USA 165000000
## 4             Inception  Joseph Gordon-Levitt  English     USA 160000000
## 5         Batman Begins        Morgan Freeman  English     USA 150000000
## 6              Insomnia          Crystal Lowe  English     USA  46000000
## 7          The Prestige    Scarlett Johansson  English     USA  40000000
## 8               Memento             Jorja Fox  English     USA   9000000
##   title_year imdb_score    genres
## 1       2012        8.5    Action
## 2       2008        9.0    Action
## 3       2014        8.6 Adventure
## 4       2010        8.8    Action
## 5       2005        8.3    Action
## 6       2002        7.2     Drama
## 7       2006        8.5     Drama
## 8       2000        8.5   Mystery
Filter fonksiyonu ile tüm mantıksal operatörleri kullanabilirsiniz. Öğrendiğimiz iki fonksiyonu birleştirmek gerekirse:
filmler_UK <- filmler %>% select(country, title_year, imdb_score) %>% 
  filter (imdb_score >= 6 & country == "UK") 

head(filmler_UK)
##   country title_year imdb_score
## 1      UK       2015        6.8
## 2      UK       2009        7.5
## 3      UK       2008        6.7
## 4      UK       2012        7.8
## 5      UK       2016        7.8
## 6      UK       2007        7.5
Bu yazıdaki son fonksiyon da gözlemlerinizi, seçeceğiniz değişkene göre sıralamak istediğiniz zaman kullanacağınız fonksiyon: arrange()
filmler_butce <- filmler %>% select(movie_title, imdb_score, budget) %>% arrange(budget)

head(filmler_butce)
##          movie_title imdb_score budget
## 1         Tarnation         7.2    218
## 2 My Date with Drew         6.6   1100
## 3            Primer         7.0   7000
## 4            Cavite         6.3   7000
## 5         Newlyweds         6.4   9000
## 6    Pink Flamingos         6.1  10000
Eğer gözlemleri bir (ya da daha fazla) değişkene göre artan sıralamak istiyorsanız fazladan bir şey yazmanız gerekmiyor, ama azalan sıralamak istiyorsanız:
filmler_butce <- filmler %>% select(movie_title, imdb_score, budget) %>% arrange(desc(budget))

head(filmler_butce)
##                                 movie_title imdb_score    budget
## 1                                    Kites         6.0 600000000
## 2  The Messenger: The Story of Joan of Arc         6.4 390000000
## 3 Pirates of the Caribbean: At World's End         7.1 300000000
## 4                              John Carter         6.6 263700000
## 5                                  Tangled         7.8 260000000
## 6                             Spider-Man 3         6.2 258000000

Bir sonraki yazıda mutate(), group_by() ve summarise() fonksiyonlarını aynı veri seti üzerinden anlatacağım.