Tidyverse

Veri önişleme
Author

Hazel Kavili

Published

March 3, 2018

Bir önceki yazımda Tidyverse dünyasına bir giriş yapmıştım. Bize nasıl bir iş akışı ve kolaylık sağladığından bahsetmiştim. Şimdi de sıklıkla kullandığımız mutate(), group_by() ve summarise() fonksiyonlarını, aynı veri setiyle nasıl kullanacağımızı anlatacağım.

Veri setimizi tekrar çalışma alanımıza yükleyip, değişkenleri hatırlamak için ilk 3 satırına bir bakalım:

In [1]:
options(jupyter.rich_display = FALSE)
suppressPackageStartupMessages(library(tidyverse))
filmler <- read.csv(file = "movies.csv" , header = TRUE, sep = ",") 
head(filmler, n = 3)
  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
  movie_title                               actor_3_name     language country
1 Avatar                                    Wes Studi        English  USA    
2 Pirates of the Caribbean: At World's End  Jack Davenport   English  USA    
3 Spectre                                   Stephanie Sigman English  UK     
  budget    title_year imdb_score genres
1 237000000 2009       7.9        Action
2 300000000 2007       7.1        Action
3 245000000 2015       6.8        Action

İlk fonksiyonumuz mutate(), adı üzerinde bir şeyleri değiştirmek, dönüştürmek için kullanacağız. Mutate fonksiyonu her değer için bir dönüşüm yapıyor ve bunu sizin isimlendireceğiniz yeni bir değişkene atıyor. Örneğin veri setimizde duration (filmlerin süresi) dakika olarak verilmiş ve bunu saat olarak da görmek istediğimizi düşünelim. duration_hour diye isimlendirdiğimiz yeni bir değişken oluşturup, dakikayı saate çeviriyoruz ve virgülden sonra 2 basamağı alacak şekilde gösteriyoruz. Oluşturduğum duration_hour değişkeni de veri setimin son değişkeni olacak şekilde ekleniyor:

In [2]:
filmler_sure <- filmler %>% 
  mutate(duration_hour = round(duration/60, digits = 2)) 

head(filmler_sure, n = 3)
  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
  movie_title                               actor_3_name     language country
1 Avatar                                    Wes Studi        English  USA    
2 Pirates of the Caribbean: At World's End  Jack Davenport   English  USA    
3 Spectre                                   Stephanie Sigman English  UK     
  budget    title_year imdb_score genres duration_hour
1 237000000 2009       7.9        Action 2.97         
2 300000000 2007       7.1        Action 2.82         
3 245000000 2015       6.8        Action 2.47

Burada önceki yazımda bahsettiğim zincir (pipe) operatörü ve select fonksiyonunu da tekrar kullanalım ve sadece movie_title, duration ve duration_hour değişkenlerini seçelim ve ilk 5 gözlemi inceleyelim:

In [3]:
filmler_sure %>% 
  select(movie_title, duration, duration_hour) %>% 
  head(n=5)
  movie_title                               duration duration_hour
1 Avatar                                    178      2.97         
2 Pirates of the Caribbean: At World's End  169      2.82         
3 Spectre                                   148      2.47         
4 The Dark Knight Rises                     164      2.73         
5 John Carter                               132      2.20

Mutate fonksiyonunun başka güzelliklerine de değinmek istiyorum. Örneğin veri setimizdeki budget ve gross değişkenlerinin para ile ilgili değişkenler olduğunu, yanlarına ekleyeceğim $ sembolü ile özellikle vurgulamak istiyorum. mutate_if (*) fonksiyonu “değişkenlerim nümerik ise” diye kontrol edecek ve sonrasında scales paketinin dollar_format fonksiyonu ile eğer nümerik ise başlarına $ sembolü koymasını sağlayacak:

In [4]:
filmler %>% 
  select(movie_title, director_name, budget, gross) %>% 
  mutate_if(~is.numeric(.), scales::dollar_format(prefix = "$")) %>% 
  head()
  movie_title                               director_name     budget      
1 Avatar                                    James Cameron     $237,000,000
2 Pirates of the Caribbean: At World's End  Gore Verbinski    $300,000,000
3 Spectre                                   Sam Mendes        $245,000,000
4 The Dark Knight Rises                     Christopher Nolan $250,000,000
5 John Carter                               Andrew Stanton    $263,700,000
6 Spider-Man 3                              Sam Raimi         $258,000,000
  gross       
1 $760,505,847
2 $309,404,152
3 $200,074,175
4 $448,130,642
5 $73,058,679 
6 $336,530,303

İkinci ve üçüncü fonksiyonlarımız ise group_by ve summarise. Belirlediğimiz değişkene/değişkenlere göre gruplama yapmak istiyorsak group_by kullanıyoruz. summarise (veya summarize) ise bize görmek istediğimiz özet bir sayıyı veriyor. Özet sayı, değişkenin ortalama, standard sapma, varyans, minimum, maksimum vb değerleri olabilir.

Bu iki fonksiyonu beraber göstermek istiyorum. İlk olarak yönetmenlerin filmlerinin IMDB puanlarının ortalamasına bakmak ve bunu ortalama puanı yüksek olandan düşük olana doğru sıralamak istiyorsak:

In [5]:
filmler %>% group_by(director_name) %>% 
  summarise(ortalama_puan = round(mean(imdb_score), digits = 2)) %>% 
  arrange(desc(ortalama_puan)) %>%  head()
  director_name         ortalama_puan
1 Charles Chaplin       8.60         
2 Tony Kaye             8.60         
3 Alfred Hitchcock      8.50         
4 Damien Chazelle       8.50         
5 Christopher Nolan     8.43         
6 Marius A. Markevicius 8.40

Burada ilk önce hangi değişkene göre gruplamak istiyorsak onu group_by fonksiyonunun içine yazdık ve ardından summarise fonksiyonu ile görmek istediğimiz ortalama_puan değişkenini mean fonksiyonu ile hesapladık.

Başka bir örnek türetelim. Yıllara göre gruplayıp, en yüksek IMDB puanına ve film süresine bakalım:

In [6]:
filmler %>% group_by(title_year) %>% 
  summarise(max_puan = max(imdb_score), max_sure = max(duration)) %>% 
  arrange(desc(max_puan)) %>%  
  head()
  title_year max_puan max_sure
1 1994       9.3      212     
2 1972       9.2      175     
3 1974       9.0      220     
4 2008       9.0      166     
5 1993       8.9      330     
6 2003       8.9      280

Bu örnek bize 1994 yılında gösterimdeki filmlerin en yüksek puanının 9.3 ve en yüksek süresinin 212 dakika olduğunu söylüyor. Ama bu iki değerin aynı filme ait olduğu anlamına gelmiyor, buraya dikkat edelim. Bunların hangi filmlere ait olduklarını bilmek istiyorsak da şöyle bir şey deneyebiliriz:

In [7]:
filmler %>% 
  filter(title_year == 1994, imdb_score == 9.3 | duration == 212)
  director_name   duration actor_2_name     gross    actor_1_name  
1 Lawrence Kasdan 212      Catherine O'Hara 25052000 Dennis Quaid  
2 Frank Darabont  142      Jeffrey DeMunn   28341469 Morgan Freeman
  movie_title               actor_3_name        language country budget  
1 Wyatt Earp                Isabella Rossellini English  USA     63000000
2 The Shawshank Redemption  Bob Gunton          English  USA     25000000
  title_year imdb_score genres   
1 1994       6.6        Adventure
2 1994       9.3        Crime

Son olarak veri setimizde film türlerine göre kaçar film olduğuna bakalım:

In [8]:
filmler %>% group_by(genres) %>% 
  summarise(film_sayisi = n_distinct(movie_title)) %>%
  arrange(desc(film_sayisi)) %>% head()
  genres    film_sayisi
1 Comedy    989        
2 Action    897        
3 Drama     614        
4 Adventure 356        
5 Crime     241        
6 Biography 201

Burada bazı filmler birden fazla yazıldığı için (benzeri olmayan film sayısı 3606) n_distinct fonksiyonunu kullandık. Hangi filmlerin birden fazla yazıldığına bakmak istiyorsak da aşağıdaki gibi inceleyebiliriz:

In [9]:
filmler %>% group_by(movie_title) %>% 
  summarize(n = n()) %>%
  filter(n > 1) %>% 
  arrange(desc(n)) %>% head()
  movie_title               n
1 Halloween                 3
2 Home                      3
3 King Kong                 3
4 Pan                       3
5 The Fast and the Furious  3
6 Victor Frankenstein       3

Bir sonraki yazımda ggplot2 paketiyle bu veriler üzerinden görselleştirme örnekleri yapacağım.

(*) mutate_at, mutate_if, mutate_all, summarise_at, summarise_if, summarise_all fonksiyonlarına mutlaka bakmanızı tavsiye ederim.