Veri Düzenleme ve Görselleştime Kitabından Notlar
Grafik yapmaya başlamadan önce kategorik değişkenlerin faktör olarak tanımlanması gereklidir.
Örnek kod: miniPISA<- miniPISA %>%mutate_if(is.labelled,sjlabelled::as_factor)
Sonra, faktör değiskenlere düzey atama amacıyla aşağıdaki fonksiyondan faydalanılabilir.
Örnek kod: levelsnames <- function(x){levels(x) <-names(attr(x,“labels”))}
Yazılan fonksiyonun faktör değişkenlere uygulanması için örnek kod aşağıdadır:
Örnek kod: miniPISA <-mutate_if(miniPISA,is.factor, levelsnames)
GGPLOT katman mantığı ile çalışır, her katman + işareti ile eklenir. aes() fonksiyonu değişkenin alacağı rolü belirlerken, geom() fonksiyonu ile çizilecek grafiğin türü belirlenir.
Yoğunluk grafiği için geom_density() fonksiyonundan faydalanılır, bu grafikte frekanslar baz alınır, yoğunluğun nerede olduğu kolayca görülmüş olur.Linetype ile çizgi çeşidi belirlenir, fill ile dolgu rengi seçilir.
Histogram grafiği için, geom_histogram() fonksiyonundan faydalanılır, sürekli değişkenlerin frekans dağılımını gösterir.Değişkenlerin en az aralık ölçek düzeyinde olması gerekir.
Bar(sütun) grafikleri için geom_bar(), saçılım grafiği için geom_point(), çizgi grafikleri için geom_line() fonksiyonlarını kullanmak gerekir.
Grafiğimizi oluşturken, yüzey eklemek için facet_wrap() ve facet_grid() fonksiyonlarını kullanabiliriz. Sütun ve satır sayısı ncol ve nrow ile fonksiyona eklenebilir.Aradaki fark,facet_wrap() tek bir değişkenin seviyelerine göre yüzey oluşturur,facet_grid() ise, bir ya da iki değişkenin kesişimine( örnek, cinsiyet ve yaş gibi) dayalı yüzey oluşturur.
Yüzeyde kategorik değişkenlerin düzeylerini görebilmek için önce aşağıdaki örnek koddaki gibi faktör değişken olarak tanımlamak gerekir.
Örnek kod: library(haven) miniPISA <- miniPISA %>% mutate_if(is.labelled, funs(as_factor(.)))
Grafik fonksiyonun içerisinde isteğimize göre çeşitli düzenlemeler yapmak için şu fonksiyonlardan yararlanabiliriz: color(şekil), size(büyüklük), shape(şekil), alpha(şeffaflık düzeyi). Geom_text() fonksiyonu ile metinler veri sembolü olarak grafiğe eklenebilir.
Scale_x_continuous() ve scale_y_continuous() fonksiyonları ile,
sürekli değişkenler için x ve y eksenlerinin ölçeklerini
özelleştirebiliriz. Sınırları, “limits”, kesmeleri “breaks” ile
belirtebiliriz, “expand” ile genişletme yapabiliriz.scale_x_discrete()
ve scale_y_discrete() ise kategorik değişkenler için kullanılır.
Örnek kod: scale_x_continuous(limits = c(0, 10), breaks = seq(0, 10, by
= 2))
Labs argümanı ile isim etiketlemesi yapılır. X ve Y eksenine, başlık(title), alt başlık(subtitle) ve grup (color) isimleri eklenebilir.
Bar grafikleri sınıflama ve sıralama ölçeğinde tercih edilir ve frekans dağılımını gösterir. Sütunlar arasında boşluk vardır. geom_bar() fonksiyonu ile çizilir.
geom_line() fonksiyonu ile çizgi grafiği oluşturulabilir, theme() fonksiyonu ile arka plan değişiklikleri yapılabilir.
geom_boxplot() fonksiyonu ile kutu grafiği oluşturulur. Kutu grafiği bize veri setinin minimum, ilk çeyrek, medyan, üçüncü çeyrek ve maksimum değerlerini gösterir. coord_flip() fonksiyonu ile x ve y eksenlerinin yönü değiştirilebilir.
Hafta 3 Görselleştime Notları
Veri setinde bazı düzeylerde çok az sayıda gözlem varsa, bunları çıkarmak işe yarayabilir.Filter fonksiyonu ile filter(!is.na(değişken adı)), ilgili sütunda NA olan satırlar atılır, droplevels() fonksiyonu ile filtreleme ile kaybolan seviyeler temizlenir.
Geom_bar() fonksiyonuna position = “dodge” argümanını eklersek, sütunların yanyana olmalarını sağlarız.
Kategorik değişkenler için kullanabileceğimiz bir diğer grafik türü ise “pie chart”. pie() fonksiyonu ile yapılır.
Geom_dotplot() fonksiyonu ile nokta grafiği oluşturulabilir, sayısal veriler için kullanımı uygundur, dotsize argümanı ile noktaların büyüklükleri değiştirilebilir.
Geom_density() ile oluşturulan yoğunluk grafiklerinde, bandwidth argümanı ile daha temiz görüntüler elde edebiliriz. Yoğunluk grafiğinde, her yoğunluğu ayrı bir seviyeye ayırarak bir görüntü elde etmek istersek, ggridges paketini indirip, geom_density_ridges() fonksiyonunu kullanmamız gerekir.
Geom_boxplot() ile oluşturulan kutu grafiklerinde aykırı değerler kolayca görülür, ayrıca birden fazla dağılımı aynı anda incelemek istersek de faydalıdır, dezavantajı ise birden fazla mod olduğunuda bunu göremeyiz. Kutu grafiklerinde aes katmanında x yerine y kullanmak daha uygundur.
Y eksenindeki etiket ve legend(açıklama kutusu) aynı şeyi gösterdiğinde, açıklama kutusunu kaldırmak istersek onun için, theme()fonksiyonu ekleyip, içerisine legend.position = “hide” argümanını ekleriz.
OpenIntro Tutorials – Explore Websitesi Notları
Bu tutorial öncelikle datayı keşfetme ile başlıyor ve bunun için de önce glimpse() fonksiyonu ile veriye bir gözatılıyor, distinct() fonksiyonu ile belirli bir kategorik değişkenin kaç farklı etiketi olduğu öğreniliyor, count() değişkeni ile ilgilenilen değişkenlerin ikili kombinasyonları ile çapraz tablolar oluşturulmuş, oluşturulan tablo pivot_wider() fonksiyonu ile uzun formattan geniş formata aktarılmış. id ve align isimli iki kategorik değişkenle ilgilenilmiş ve geom_bar() fonksiyonu ile grafik oluşturulurken, x eksenine id eklenmiş,align değişkeni fill argümanı ile grafiğe eklenmiş. Count ile gözlem sayıları incelendikten sonra oranların incelenmesi için mutate() fonksiyonu ile yeni bir değişken oluşturulup, tekrar bir çapraz tablo oluşturulmuş.
İkinci ders, sayısal veri keşfetme ile başlıyor.Sayısal veri ile grafik oluştuma için nokta grafiği(geom_dotplot) ve histogram grafikleri geom_histogram() ile örnekler oluşturulmuş. geom_density() dağılımın şeklini görmek için iyi bir alternatif olduğu, ama büyük verilerle tercih edilmesi gerektiği söylenmiş.Kutu grafiğinin(geom_boxplot), ham datayı göstermediğini onun yerine verinin bir özetini sunduğu belirtilmiş. Yoğunluk grafiğinde dağılımların üst üste gözükmesi için geom_density_ridges() kullanılmış. Birden fazla değişkenle çoklu yüzey oluşturulmak istenirse facet_wrap(), yerine facet_grid() fonksiyonu kullanılması gerektiği belirtilmiş.
Üçüncü ders ise, sayısal verilerin özetlenmesi ile ilgiliydi. group_by() fonksiyonu ile veri gruplara ayrılıp, summarize() fonksiyounu yardımıyla, ortalama ve medyan değerleri hesaplanmış. Dağılımları incelerken, dağılımın dört özelliği ile ilgilenildiği söylenmiş, merkez, dağılımın yayılımı veya değişkenliği, üçüncü özellik ise dağılımın şekli, bunu tepe sayısı ve çarpıklık açısından ele almış. Eğer tek bir belirgin tepe varsa (örneğin çan eğrisi gibi), “unimodal” (tek modlu) ,eğer iki belirgin tepe varsa,“bimodal” (çift modlu) ,üç veya daha fazla tepe varsa ,“multimodal” (çok modlu) olarak adlandırılır.Son olarak, eğer belirgin hiçbir tepe yoksa ve dağılım tüm değerler boyunca düz bir şekilde yayılmışsa, buna “uniform” (düzgün / eş dağılımlı) denir.Eğer bir dağılımın sağa doğru uzanan uzun bir kuyruğu varsa, bu dağılıma “sağa çarpık” (right-skewed) denir.Eğer uzun kuyruk sola doğru uzanıyorsa, dağılım “sola çarpık” (left-skewed) olarak adlandırılır. Eğer iki kuyruk da yaklaşık olarak eşit uzunluktaysa, bu durumda dağılım “simetrik” (symmetric) olarak tanımlanır. Dördüncü özellik ise, aykırı değerlerdir, ve kutu grafiği ile kolayca aykırı değerler görülebilir.
Veri seçimi
Ödev için ilgili veri setlerinden gapminder verisetini seçtim ve ilk iş olarak o veri setini açtım ve incelemeye başladım. Değişkenler: ülke(country),kıta(continent),yıl(year),yaşam süresi beklentisi(lifeExp),nüfus(pop) ve kişi başına düşen gayri safi yurt içi hasıla (gdpPercap). Kategorik değişkenler faktör olarak tanımlanmış, o yüzden bir değişiklik yapmadım.?gapminder yardım fonksiyonu ile yaptığım inceleme sonucunda, değişken isimlerini, verinin hangi yılları kapsadığını(1952-2007), gdpPercap değişkeninin dolar cinsinden ifade edildiğini gördüm.
    library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
    library(gapminder)
    data(gapminder)
    glimpse(gapminder)
## Rows: 1,704
## Columns: 6
## $ country   <fct> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", …
## $ continent <fct> Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, Asia, …
## $ year      <int> 1952, 1957, 1962, 1967, 1972, 1977, 1982, 1987, 1992, 1997, …
## $ lifeExp   <dbl> 28.801, 30.332, 31.997, 34.020, 36.088, 38.438, 39.854, 40.8…
## $ pop       <int> 8425333, 9240934, 10267083, 11537966, 13079460, 14880372, 12…
## $ gdpPercap <dbl> 779.4453, 820.8530, 853.1007, 836.1971, 739.9811, 786.1134, …
    ?gapminder
Veri seti boyutunu ve eksik veri olup olmadığını inceledim, ayrıca country değişkeni için etiketleri inceledim. 1704 satır 6 sütundan oluşan veride hiç eksik veri bulunmamaktadır. 142 adet ülke, 5 adet kıta, bulunmaktadır.
dim(gapminder)
## [1] 1704    6
gapminder %>% distinct(country)
## # A tibble: 142 × 1
##    country    
##    <fct>      
##  1 Afghanistan
##  2 Albania    
##  3 Algeria    
##  4 Angola     
##  5 Argentina  
##  6 Australia  
##  7 Austria    
##  8 Bahrain    
##  9 Bangladesh 
## 10 Belgium    
## # ℹ 132 more rows
gapminder %>% distinct(continent)
## # A tibble: 5 × 1
##   continent
##   <fct>    
## 1 Asia     
## 2 Europe   
## 3 Africa   
## 4 Americas 
## 5 Oceania
colSums(is.na(gapminder))
##   country continent      year   lifeExp       pop gdpPercap 
##         0         0         0         0         0         0
Ülke ve yıl değişkenleri ile çapraz tablo oluşturup, geniş formatta tabloyu inceledim. Bu tablo sayesinde hangi kıtada, hangi yılda,kaç adet ülke verisi var onu görmüş oldum.
library(tidyr)
gapminder %>% count(continent, year) %>% 
pivot_wider(names_from=continent,values_from=n)
## # A tibble: 12 × 6
##     year Africa Americas  Asia Europe Oceania
##    <int>  <int>    <int> <int>  <int>   <int>
##  1  1952     52       25    33     30       2
##  2  1957     52       25    33     30       2
##  3  1962     52       25    33     30       2
##  4  1967     52       25    33     30       2
##  5  1972     52       25    33     30       2
##  6  1977     52       25    33     30       2
##  7  1982     52       25    33     30       2
##  8  1987     52       25    33     30       2
##  9  1992     52       25    33     30       2
## 10  1997     52       25    33     30       2
## 11  2002     52       25    33     30       2
## 12  2007     52       25    33     30       2
Dört farklı grafik
Grafik 1
 library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.1
 ortalama_yasam<-gapminder %>% group_by(continent) %>%summarise           (ortalamalife_Exp=mean(lifeExp))    
 ggplot(ortalama_yasam, aes(x=continent, y=ortalamalife_Exp, fill = continent)) +
   geom_col(alpha=0.5) +
   labs(x="Kıta", y=" Ortalama Beklenen Yasam Suresi", title="Kıtalara gore Ortalama Beklenen Yasam Suresi") +
   theme_classic()
Grafik 2
gapminder %>% filter(continent=="Americas") %>% 
ggplot(aes(x=lifeExp)) +
   geom_histogram(binwidth = 5, color="white", fill="blue") +
   facet_wrap(~country) +
   labs(x="yasam suresı", y=" gozlem sayısı", title="Amerika kıtasındaki Ulkelerin Beklenen Yasam Surelerı Dagılımı")           +
   theme_minimal() 
      gapminder %>% filter(country=="Turkey") %>% 
      ggplot(aes(x=year, y=gdpPercap)) +
      geom_line(color="purple", linetype =3 ) +
      geom_vline(xintercept = 2002, linetype = "dashed", color = "red",size=0.5) +
      labs (x="Yıllar", y="GSYIH", title= "Yıllara göre Türkiye'deki kişi başına düşen gayri safi yurt içi hasıla değişimi") +
      theme_bw()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
gapminder %>% filter(year == 2007) %>%
  ggplot(aes(x = continent, y = pop, color=continent)) +                          scale_y_log10(breaks = c(1e6, 1e7, 1e8, 1e9),labels = c("1 Milyon", "10 Milyon", "100 Milyon", "1 Milyar"))+ 
        geom_boxplot(size=1.2) +
        labs(x = "Kıta",y = "Ulke Nüfusu", title = "2007 Yılı Kıtalara Göre Nüfus Dağılımı") +
        theme_minimal()
Yorumlar
Grafik 1 kıtalara göre ortalama yaşam sürelerini bize göstermektedir. Bu grafiğe göre en yüksek yaşam süresi ortalamasına Okyanusya kıtası sahipken, onu Avrupa kıtası takip etmektedir. Amerika kıtası yaklaşık 65 yıl, Asya kıtası ise yaklaşık 60 yıl ortalamaya sahiptir.En düşük ortalama ise Afrika kıtasına aittir.İlk başta, geom_bar ile grafiği oluşturmaya çalıştım, ama orda sadece x argümanı gerektiği uyarısını alınca uygun bir grafik seçimi olmadığını anladım, yani basitçe kıtalarda ülke sayısını frekans olarak göstermek istesem evet doğru seçim olabilirdi ama ben y ekseninde sayısal değer kullanmak istediğim için geom_col kullanmak zorunda kaldım. Bu yüzden, amaç, ortalama yaşam süresini kıtalara göre kabaca görmek ise evet bu grafik seçimi bence doğru.
Grafik 2 Amerika kıtasındaki ülkelerin beklenen yaşam süreleri dağılımını göstermektedir. Kanada ülkesine ait gözlemlerin neredeyse tamamı 70-80 yıl aralığında toplanmıştır.Porto Riko,ABD, Uruguay ülkeleri de Kanada’ya benzer bir yapıdadır.Gözlemlerin büyük çoğunluğu 60-70 ve özellikle 70-80 yıl aralıklarındadır. Haiti ülkesine ait gözlemlerin tamamı 40-50 ve 50-60 yıl aralıklarında yoğunlaşmıştır.Diğer ülkelere göre düşük ortalamalara sahip olduğu görülmektedir. Bolivya Haiti’den sonra en düşük dağılıma sahip ülkedir ve gözlemlerin çoğu 40-50 ve 50-60 yıl aralıklarındadır, 60-70 aralığında çok az gözlem vardır. Grafik seçimi aslında uygun istenilen bilgiyi görselleştirdi mi evet; fakat yorumlarken bana biraz karışık geldi,sanırım daha açık bir şekilde ülkeler arasında karşılaştırma yapmak için yoğunluk grafiği daha iyi bir seçim olabilirmiş.
Grafik 3, yıllara göre Türkiyedeki kişi başına düşen gayri safi yurt içi hasıla (GSYİH) değişimini göstermektedir. 1950’lerden yaklaşık 1980’lere kadar bir artış olduğu görülmektedir.1980’ler civarında yatay bir seyir olması o dönemde artış olmadığını göstermektedir. Yaklaşık 1982-1983 yıllarından 1990ların sonuna kadar tekrar artış eğilimi görülmektedir. Grafikte kırmızı çizgi ile belirtilen 2002 yılı itibari ile daha keskin bir artış görülmektedir. Genel olarak zaman içerisinde duraklama ve dalgalanmalar olsa da Türkiyenin 1952 ve 2007 yılları arasında kişi başı gelir miktarında artış yaşanmıştır.Zaman içinde değişimi görmek için çizgi grafiğinin iyi bir seçim olduğunu düşünüyorum, çünkü çok açık bir şekilde seçtiğim ülkeye ait yıllar içinde değişimi rahatlıkla takip edebildim.
Grafik 4, 2007 yılında kıtalara göre nüfus dağılımını göstermektedir. Ortanca değeri en yüksek olan kıta Asyadır. Afrika, Amerika ve Avrupa’nın ortanca nüfus değerleri birbirine yakındır. Asya kıtasında üst çizginin 1 milyarı geçmesi en kalabalık ülkelerin bu kıtada olduğunu gösterir. Dikey çizgilerin her iki tarafa da uzun olması Afrika kıtasında nüfus çeşitliliğinin fazla olduğunu gösterir.Avrupa kıtasında 1 tane aykırı değer bulunmaktadır.Okyanusya kıtasında nüfus çeşitliliği azdır. Amerika kıtasında ortanca değeri yaklaşık 10 milyondur, bu kıtada en kalabalık ülkeler 100 milyonu aşmakta iken, en az nüfuslu ülkeler, yaklaşık 1 milyon civarı nüfusa sahiptir.Kutu grafiğinin gruplar arası karşılaştırma için doğru seçim olduğunu düşünüyorum, sadece ilk başta ölçekleme yapmadığım için açıkcası çıkan grafikler hiç anlaşılır değildi, sonra biraz araştırıp scale_y_log10() fonksiyonu ile y eksenin logaritmik ölçeklenmesi gerektiğini öğrendim bu sefer etiketler, “1e6, 1e7, 1e8, 1e9” şeklinde çıkınca bu etiketlerin yerine türkçe karşılığı olan etiketleri ekleyince daha anlaşılır bir grafik oldu, bu şekliyle doğru bir seçim yaptığımı düşünüyorum.
Bu haftaki derste öncelikle yeni bir fonksiyonun, function() ile oluşturulacağını { } içerisinde argümanların yazılacağını ve bunu da bir nesneye atamamız gerektiğini öğrendim. rnorm() fonksiyonu ile normal dağılıma sahip, rastgele veriler üretebileceğimi, içerisinde n,mean ve sd argümanları olduğunu öğrendim. Daha sonra ders, veri görselleştime ile devam etti. PISA verisini önce glimpse(), count() fonksiyonları ile inceledik. distinct() fonksiyonu ile belirli bir kategorik değişkenin kaç farklı etiketi olduğuna bakabileceğimizi öğrendim. Eğer veride label etiketleri varsa bunları faktör olarak kaydetmek için şu fonksiyonu kullanabileceğimizi öğrendim; mutate(across(where(is_labelled),as_factor)). Eksik veri bulma ve silme işlemlerini sırasıyla colSums(is.na()) ve na.omit()fonksiyonları ile yapabileceğimi öğrendim. pivot_wider fonksiyonu ile tabloyu daha geniş formata çevirebildik. position = “dodge” komutunun çubukları yanyana dizdiğini, facet_wrap(~) ile grafiği ayrı ayrı küçük grafiklere bölebileceğimizi, histogram grafiğinde bins ile çubuk sayısını, binwidth ile çubuk genişliği ayarlayabileceğimi, geom_vline() ile grafikte dikey bi çizgi ekleyebileceğimi, geom_density() ile yoğunluk grafiği oluşturabileceğimi, alpha komutu ile şeffaflığı ayarlayabileceğimi öğrendim. Genel olarak bu hafta, veri görselleştirme ile ilgili daha fazla şey öğrenmiş oldum, sanırım bu daha buz dağının görünen kısmı gibi duruyor:)