Tidyverse
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:
options(jupyter.rich_display = FALSE)
suppressPackageStartupMessages(library(tidyverse))
filmler <- read.csv(file = "movies.csv" , header = TRUE, sep = ",")
head(filmler, n = 3)
İ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:
filmler_sure <- filmler %>%
mutate(duration_hour = round(duration/60, digits = 2))
head(filmler_sure, n = 3)
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:
filmler_sure %>%
select(movie_title, duration, duration_hour) %>%
head(n=5)
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:
filmler %>%
select(movie_title, director_name, budget, gross) %>%
mutate_if(~is.numeric(.), scales::dollar_format(prefix = "$")) %>%
head()
İ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:
filmler %>% group_by(director_name) %>%
summarise(ortalama_puan = round(mean(imdb_score), digits = 2)) %>%
arrange(desc(ortalama_puan)) %>% head()
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:
filmler %>% group_by(title_year) %>%
summarise(max_puan = max(imdb_score), max_sure = max(duration)) %>%
arrange(desc(max_puan)) %>%
head()
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:
filmler %>%
filter(title_year == 1994, imdb_score == 9.3 | duration == 212)
Son olarak veri setimizde film türlerine göre kaçar film olduğuna bakalım:
filmler %>% group_by(genres) %>%
summarise(film_sayisi = n_distinct(movie_title)) %>%
arrange(desc(film_sayisi)) %>% head()
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:
filmler %>% group_by(movie_title) %>%
summarize(n = n()) %>%
filter(n > 1) %>%
arrange(desc(n)) %>% head()
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.