Bölüm 6 Veri Görselleştirme

Amacımıza uygun ilgili değişkenleri içerecek şekilde veriyi düzenledikten sonraki önemli diğer aşama, verideki genel bilginin daha kolay bir şekilde ortaya koyulmasını sağlayan veri görselleştirmedir. Verilerin özellikle grafikler ile görselleştirilerek temsil edilmesi, bilginin daha anlaşılır ve kalıcı bir şekilde ifade edilmesini sağlar. Grafikler bir veri kümesini anlamamıza yardımcı olur ve bu kümedeki örüntüyü yorumlayabilmede önemli bir araçtır. Grafikler, veri setinin hatasız ve tutarlı bir şekilde betimlenmesini sağlar ve genellikle değişkenlerin dağılımının görselleştirilmesi ve gruplara göre karşılaştırılması amaçları ile kullanılır. Bu nedenle grafiklerin olabildiğince ayrıntı içermesine, bunu yaparken de ayrıntıların ne kadarının yorumlanabileceğine odaklanılması gerekir. Vurgulanmak istenilen temel özellikler ön plana çıkarılmalı, gereksiz ayrıntılar ortadan kaldırılmalıdır. Temel grafik sistemleri; base öğrenmesi en kolay olan, grid diğer araçları geliştirmek için güçlü modüller içeren, lattice gridler üzerine kurulu genel amaçlı grafikler ve ggplot2 grafiklerin grammeri olarak bilinir.

Veri düzenleme bölümünde; tidyverse paketinin veri düzenlemeleri, görselleştirmeleri, modellemeleri kolay bir şekilde yapabilmemizi sağlayan, R yazılımının birçok paketini içinde bulunduran geniş bir paket olduğundan bahsetmiştik. Bu paketin içeriğinde veri görselleştirme amacıyla en sık kullanılan ggplot2 paketi de yer almaktadır.

# install.packages("tidyverse", repos="https://cran.rstudio.com") # paketin yüklenmesi
library("tidyverse") # paketin aktifleştirilmesi

Grafikler oluşturulurken, genellikle birden fazla değişkene ilişkin gözlemlerin yer aldığı veri setleri kullanılır. Grafiklerin kolay okunması adına PISA veri setinden değişken sayısının azaltılması amacıyla miniPISA veri seti oluşturulmuş, örnekler bu veri seti üzerinden gerçekleştirilmiştir. Ayrıca grafik çizimlerinde grup değişkenlerine ihtiyaç duyulduğu için kategorik değişkenler as.factor() fonksiyonuyla kategorik hâle getirilmiştir. Ardından faktör değişkenlerine düzeyler atanmıştır.

library(dplyr)
library(magrittr)
library(haven)
library(plotly)
load("data/PISA_OGR_2018.rda")
miniPISA <- PISA_OGR_2018 %>%
select(CINSIYET, SINIF,KITAPSAYISI, SES, Anne_Egitim, Baba_Egitim,Okuloncesi_yil,OKUL_TUR,OKUMA_ZEVK,
       OK_YETERLIK,ODOKUMA1) 
# kategorik değişkenlerin faktör olarak kaydı
miniPISA<- miniPISA %>% mutate_if(is.labelled, sjlabelled::as_factor)
# Faktör değiskenlere düzey atama amacıyla yazılan fonksiyon
levelsnames <- function(x){
  levels(x) <- names(attr(x,"labels"))
  x
}
# yazılan fonksiyonun faktör değişkenlere uygulanması
miniPISA <-mutate_if(miniPISA,is.factor, levelsnames)
head(miniPISA)
## # A tibble: 6 × 11
##   CINSIYET SINIF    KITAPSAYISI      SES Anne_Egitim Baba_Egitim Okuloncesi_yil
##   <fct>    <fct>    <fct>          <dbl> <fct>       <fct>       <fct>         
## 1 Erkek    SINIF 10 11-25 kitap  -2.45   Ortaokul    Ortaokul    2 yildan az   
## 2 Erkek    SINIF 10 26-100 kitap -2.10   Ortaokul    Ortaokul    2 yildan az   
## 3 Kiz      SINIF 10 0-10 kitap   -2.27   Ilkokul     Ortaokul    2 yildan az   
## 4 Erkek    SINIF 9  0-10 kitap    0.0324 Lisans ustu Lisans ustu 2 yildan az   
## 5 Erkek    SINIF 9  11-25 kitap  -0.0674 Onlisans    Onlisans    <NA>          
## 6 Erkek    SINIF 10 11-25 kitap   0.398  Onlisans    Lisans ustu <NA>          
## # ℹ 4 more variables: OKUL_TUR <fct>, OKUMA_ZEVK <dbl>, OK_YETERLIK <dbl>,
## #   ODOKUMA1 <dbl>

miniPISA veri seti; sınıf düzeyi (SINIF), cinsiyet(CINSIYET), anne eğitim düzeyi(Anne_Egitim), baba eğitim düzeyi(Baba_Egitim), kitap sayısı(KITAPSAYISI), sosyo ekonomik düzey (SES), okulöncesi eğitim yılı (Okuloncesi_yil), okumaktan zevk alma (OKUMA_ZEVK), okul türü (OKUL_TUR), okuma yeterlik (OK_YETERLIK), okuma puanı olası değer 1 (ODOKUMA1) değişkenleri olmak üzere toplam 11 değişkenden oluşmaktadır. Sınıf düzeyi, okul türü, cinsiyet, anne eğitim düzeyi, baba eğitim düzeyi ise kategorik değişkenlerdir.

6.1 ggplot

Veri görselleştirmede en çok kullanılan paket ggplot2 paketidir. Bu paket grafiklerin grameri olarak adlandırılır ve iyi görünüme sahip grafiklere sahiptir. Fakat daha gelişmiş kodlama becerileri gerektirir. Grafiklerinizi yayınlamanız veya paylaşmanız gerekiyorsa, mümkünse ggplot2 kullanılması önerilir, aksi takdirde varsayılan grafikler işinizi görecektir. ggplot2 paketi, birden çok değişkeni aynı grafik üzerinde göstermek ve veriler arasındaki çok düzeyli ilişkileri özetlemek amacıyla geliştirilmiştir. Bu bölümde yer alan tüm grafiklerin başlığı, x ve y eksenleri etiketleri, rengi vb. düzenlemeler yapılarak özelleştirilebilir. Katman mantığıyla çalıştıklarından metin ekleme, renklendirme, açıklama kutucukları vb. özelleştirmeler toplama işareti(+) ile kodlara eklenebilmektedir. ggplot2 paketinde yer alan temel fonksiyonlar; qplot() ve ggplot() fonksiyonlarıdır. qplot(), hızlı grafik (quick plot) çizimi anlamına gelmektedir. Bu fonksiyonların kullanımı;

qplot(x, y, data, geom)
ggplot(x, y, data, geom)
ggplot( data, aes(x, y)) + geom.grafikismi()

Burada yer alan aes() argümanı her bir değişkenin alacağı rolü belirlemede kullanılır. aes() fonksiyonu değişkenleri sadece olduğu gibi değil özelleştirilmiş şekilde grafiğe dönüştürmeye olanak vermektedir. data argümanı ile veri setleri üzerinden grafiklerin çizimi yapılmaktadır. geom() fonksiyonu “ggplot2” paketinde çizilecek grafiğin türünü belirlemek amacıyla kullanılmakta olup geometrik nesneler (geometric objects) olarak adlandırılmaktadır. Örneğin yoğunluk grafiği çizilmek istendiğinde aşağıdaki iki kod kullanılabilir.

ggplot(x, y, data, geom="density") 
ggplot( data, aes(x, y)) + geom.density()

6.2 Yoğunluk Grafiği

Her bir geom argümanı farklı grafik türlerini çizmek için bazı hesaplamalar yapar. Yukarıda kullanım örneği verilen yoğunluk grafiği ise frekanslar yardımıyla yoğunluk hesaplar. Yoğunluk grafiği dağılımın şekli hakkında daha detaylı bilgi verir ve grafiğin tepe yaptığı noktalar x eksenindeki değerlerin en çok nerede yoğunlaştığını gösterir. Genellikle belli bir zamana göre yoğunluk grafiği çizdirilir fakat miniveri setinde zamana ilişkin bir değişken olmadığından okuma olası değer 1’in yoğunluk grafiği çizdirilmiştir.

ggplot(miniPISA, aes(x=ODOKUMA1))+
  geom_density(linetype="dashed", fill="pink")

Okuma puanlarına göre geom_density() fonksiyonu yardımıyla yoğunluk grafiği çizilmiştir. Fonksiyonun içine ek işlevler yazılarak grafik görsel açıdan çeşitlendirilmiştir. Örneğin, linetype="dashed" ile kesikli çizgi, fill="pink" ile pembe renkli dolgu yapılmıştır. Bu seçenekler istenildiği gibi çeşitlendirilebilir.

6.3 Histogram

Histogram, sürekli değişkenlerin frekans dağılımlarının betimlenmesinde kullanılır. En az aralık ölçeğindeki değişkenlerin frekans dağılımlarının betimlenmesinde kullanıldığından sütunlar arası boşluk içermemektedir. ggplot2 paketi katman mantığı ile çalışan bir paket olduğundan aşağıdaki kod ile önce ilk katman oluşturulur.”Katmanlar” başlığında daha detaylı bilgi verilecektir.

grafik_1 <- ggplot(miniPISA, aes(x=ODOKUMA1)) #ilk katmanın oluşturulması
grafik_1 # oluşturulan nesnenin kaydedilmesi

6.3.1 Katman eklenmesi

ggplot2 paketi içinde farklı görsel materyaller grafik katmanları oluşturacak şekilde eklenebilir. aes() argümanı ile oluşturulan ilk estetik katmanına geometri katmanı argümanlarından “geom_*” eklenebilir. Yani grafikler, ilk ggplot() komutuna geom katmanları eklenerek çizdirilir. ggplot2 paketi içinde geom_ ile başlayan birçok geometrik nesneler mevcuttur. Bunlardan histogramlar için geom_histogram(), bar(sütun) grafikleri için geom_bar(), saçılım grafiği için geom_point(), çizgi grafikleri için geom_line() en sık kullanılanlardır.

grafik_1 kullanılarak ggplot fonksiyonu içinde aes argümanı ile ilk katman oluşturulmuştur. Şimdi de geom katmanı + ile eklenerek istenilen grafik çizilebilir.

grafik_1 + geom_histogram() # histogram çizilmesi

Çıktıda miniPISA verisindeki okuma puanlarının histogramı elde edilmiştir. geom_histogram() fonksiyonu ile frekanslar y ekseninde olacak şekilde otomatik olarak oluşturulduğundan, okuma puanları x eksenine yerleştirilmiştir. Aynı histogram grafiği ggplot(miniPISA,aes(x=ODOKUMA1)) + geom_histogram() kodu ile de çizilir. Bu arada bir çizimde bir veya birden fazla geometrik nesneler de “+” ile görüntülenebilir.

6.3.2 Yüzey eklenmesi

Bir grafiği, veri grubu başına bir yüzey yani panel olacak şekilde çok panelli bir şekle bölmek için kullanılır. ggplot2 paketinde panel sayısı, düzey değişkeninin faktör sayısına göre belirlenmektedir. Panel oluşturmada düzeyler belirlemek için facet_wrap() ve facet_grid() olmak üzere iki temel fonksiyon vardır. facet_wrap() fonksiyonu bir değişkendeki her bir faktörün panellerde gösterimi için kullanılır. Çünkü bazı durumlarda bir değişkenin farklı düzeylerinin farklı grafikler ile gösterilmesi gerekebilir.

facet_wrap() fonksiyonunun kullanımı:

facet_wrap(~değişken, ncol=n) 
facet_wrap(~değişken, nrow=n) 

Değişkendeki faktörlerin/düzeylerin sütunda ya da satırda yer alması durumuna göre ncol veya nrow argümanları özelleştirilerek grafik oluşturulabilmektedir. Dikkat edilecek olursa değişken önünde tilda (~) simgesinin olması gerekmektedir.

Cinsiyete göre okuma puanlarının histogramı facet_wrap() fonksiyonu kullanılarak aşağıdaki örneklerdeki gibi çizilebilir.

  • Yüzeylerin sütunlarda olması
grafik_1 +
  geom_histogram()  +       
  facet_wrap(~CINSIYET, ncol=2) # cinsiyet değişkenindeki faktörlerin sütunda yer alması

  • Yüzeylerin satırlarda olması
grafik_1 + 
  geom_histogram() +
   facet_wrap(~CINSIYET, nrow=2) # cinsiyet değişkenindeki faktörlerin satırda yer alması

facet_grid() fonksiyonu ise yüzey düzenlemesine ikinci bir değişken getirilmek istendiğinde kullanılır. Hem tek hem de iki değişkenin panellerde gösterimi için aşağıdaki gibi kullanılır:

facet_grid(satırdeğişkeni~sütundeğişkeni)
facet_grid(satırdeğişkeni~.) 
facet_grid(.~sütundeğişkeni)

Görüldüğü üzere; faced_grid() fonksiyonu ile satır ve sütün değişkeni arasında “~” simgesi konulur fakat tek değişken olduğunda ~ simgesinden önce ya da sonra “.” konulmaktadır.

Cinsiyet ve sınıf değişkenlerine göre okuma puanlarının histogram grafiği facet_grid() fonksiyonları kullanılarak çizilebilir:

Yüzeyde kategorik değişkenlerin düzeylerini görebilmek için faktör değişken olarak tanımlamak gerekir.

library(haven)
miniPISA <- 
  miniPISA %>% 
  mutate_if(is.labelled, funs(as_factor(.)))

Hem sınıf hem de cinsiyet değişkenine göre histogram grafiği:

 ggplot(miniPISA, aes(x=ODOKUMA1)) +
  geom_histogram()+  #histogram çizilmesi
  facet_grid(SINIF~CINSIYET) # sınıf ve cinsiyete göre yüzey eklenmesi

Görüldüğü üzere faced_grid() ile iki değişken (sınıf ve cinsiyet) çaprazlanmıştır. Bu durumda her bir cinsiyetin her bir sınıf düzeyine göre grafikleri verilmiştir.

Tek bir değişkenin her bir düzeyinin yüzeyleri sütunda oluşturulmak istendiğinde:

ggplot(miniPISA,aes(x=ODOKUMA1))+
  geom_histogram()+ #histogram çizilmesi
  facet_grid(.~CINSIYET) # yüzeylerin sütunda oluşturulması

Benzer şekilde değişkenin her bir düzeyinin yüzeylerin satırlarında oluşturulması istendiğinde:

ggplot(miniPISA,aes(x=ODOKUMA1))+
  geom_histogram()+  # #histogram çizilmesi
  facet_grid(CINSIYET~.) # yüzeylerin satırda oluşturulması

6.4 Gruplama değişkenleri

“ggplot2” paketinde gruplama, grup değişkenlerini görselleştiren fonksiyonlar yardımıyla yapılmaktadır. Renklendirme, sembol şekli, sembol büyüklüğü ve çizgi türü belirleyen fonksiyonlar yardımıyla gruplama yapılabilir.

6.4.1 color ile gruplandırma

Grafikler oluşturulurken cinsiyet değişkeninin grup olarak belirlendiği durumda color() argümanı yardımıyla gruplar oluşturularak grafikler çizilebilir. Örneğin sınıf ve cinsiyet değişkenlerinin grup olarak belirlendiği durumda okuma puanları ortalamasının saçılım grafiği aşağıdaki gibi çizilebilir. Dikkat edilecek olursa color argümanı aes() fonksiyonunun içinde yer almaktadır.

p1 <- ggplot(
      miniPISA %>% 
      group_by(SINIF,CINSIYET) %>% 
      mutate(ort=mean(ODOKUMA1)) %>%  # ortalama puanların sütun olarak ekleme
        ungroup(), # gruplamanın iptal edilmesi
     aes(x=SINIF, y=ort, color=CINSIYET )) + # cinsiyete göre sınıf düzeyinde ortalamaların verilmesi
  geom_point() +  #saçılım grafiği oluşturma
  xlab("Sınıf Düzeyi")+ # x eksenine etiket verilmesi
  ylab("Ortalama Puan") #y eksenine etiket verilmesi

p1 # nesnenin kaydedilmesi

Öncelikle miniPISA verisi cinsiyet ve sınıf değişkenlerine göre gruplandırılmış ve ortalama okuma puanlarının yer aldığı bir sütun veri setine eklenmiştir. Daha sonra gruplama çözülmüş, x ekseninde sınıf düzeyleri, y ekseninde ortalama okuma puanları olacak şekilde cinsiyet değişkenine göre gruplama yapılarak saçılım grafiği çizilmiştir.

Yüzey eklenmiş grafiklerde de gruplama değişkeni kullanılabilir.

ggplot(miniPISA,aes(x=ODOKUMA1, y=OKUMA_ZEVK, color=CINSIYET)) + 
  geom_point() +  #saçılım grafiği çizilmesi
  facet_grid(.~SINIF)   

6.5 Grafik nesnesi

Grafikler daha sonradan kullanılmak üzere kaydedilmek istendiğinde herhangi bir isim ile bir nesneye atanır. Örnekte oluşturulan saçılım grafiği “p” nesnesine atanmıştır. p nesnesine “+” ile katmanlar eklenebilir. Kategorik değişkenler eksen değerlerini belirler.

p2 <- ggplot(miniPISA, aes(x=SINIF, y=ODOKUMA1)) + # x ve y eksenlerini belirleme
  geom_point() # saçılım grafiği çizme
p2

6.6 AESTHETICS

Estetik, çizilmiş verinin görsel bir özelliğini ifade etmektedir. ggplot2 paketinin kullandığı estetik özellikler bulunmaktadır. Bunlar; color nokta ve diğer şekillerin renklerini, fill sekil içi doldurma rengini, size noktaların büyüklüğünü, çizgilerin kalınlığı/inceliğini, alpha saydamlık derecesini, linetype kesikli çizgi tiplerini, labels eksen veya grafik etiketlerini, shape şekilleri görselleştirmede kullanılır. Buradaki “estetik”, geomlarda/şekillerde çizilen verileri de kapsamaktadır. Bu argümanların çoğu geom içerisinde kullanılır. Örnek miniPISA veri seti üzerinden bu özelliklerin kullanımını inceleyelim.

6.6.1 color parametresi

aes içindeki color argümanı ile gruplandırma yaparak her bir kategoriyi farklı renklendirmeden bahsettik. Burada geom_point() fonksiyonu içindeki color argümanı grafiğin renklendirilmesini sağlamaktadır.

ggplot(miniPISA, aes(CINSIYET, OK_YETERLIK)) +
  geom_point(color = "purple") # saçılım grafiğinin rengini seçme

Çıktıda görüldüğü üzere, x ekseninde cinsiyet kategorik değişkeni y ekseninde ise okuma yeterlik puanları olmak üzere bu iki değişken arasındaki ilişki geom_point() argümanı ile saçılım grafiği ile verilmiştir. Bu argümanın içine color = “purple” yazılarak grafik mor renge dönüştürülmüştür.

6.6.2 size ve shape parametreleri

Size parametresi ile büyüklük shape parametresi ile şekil düzenlemesi yapılabilmektedir. Default değerleri sırasıyla 1 ve noktadır. Bir örnek veri seti üzerinden bu parametrelerin kullanımlarını inceleyelim.

ggplot(miniPISA, aes(CINSIYET, OK_YETERLIK)) +
  geom_point(color = "blue",size=5, shape="a") # saçılım grafiğinin rengini, 

# büyüklüğünü ve şeklini seçme

Görüldüğü üzere saçılım grafiğindeki şekillerin rengi, büyüklüğü ve şekli geom_point() fonksiyonu içinde özelleştirilmiştir. Mavi renkli büyüklüğü “5” olan ve “a” şeklinde cinsiyet ve okuma yeterliği arasındaki ilişkiyi inceleyen saçılım grafiği oluşturulmuştur. Bu argümanlar yine color argümanında olduğu gibi aes() içinde yazılarak gruplandırma yapılabilir. Gruplandırma ile her bir kategorinin farklı renklendirilmesi sağlanır. Aşağıdaki örnek cinsiyete göre gruplandırma yapıldığını göstermektedir.

ggplot(miniPISA, aes(SINIF, OK_YETERLIK, color = CINSIYET)) + # cinsiyete göre gruplandırma
  geom_point() # saçılılm grafiği çizme

Elde edilen çıktıda sınıf değişkeni renk olarak gruplandırıldığından kız ve erkek öğrencilerin sınıf düzeyleri ile okuma yeterlikleri arasındaki ilişki farklı renkler ile gösterilmektedir. Eğer burada üst üste gelen noktalar ayrıştırmak isteniyorsa aşağıdaki örnekte olduğu gibi geom_point() fonksiyonu içine position=“jitter” denklemi yazılabilir.

ggplot(miniPISA, aes(SINIF, OK_YETERLIK, color = CINSIYET)) + # cinsiyete göre renk 
  # açısından gruplandırma
  geom_point(position = "jitter") # üst üste gelen noktaları kaydırma

Okuma yeterlik puanları ile sınıf düzeyleri arasındaki ilişki cinsiyete göre gruplandırılarak saçılım grafiği çizilmiştir. Fazla gözlem içerdiğinden üst üste gelen noktalar kaydırılmıştır.

6.6.3 size parametresi

Bahsedildiği gibi size parametresi ile grafikteki şekillerin büyüklüğü ayarlanabilirken, color parametresinde olduğu gibi de şekillerin büyüklüğüne göre gruplama yapılabilir. aes() içinde size parametresi verilerek gruplama yapılmıştır.

ggplot(miniPISA, aes(CINSIYET, OK_YETERLIK, size = SINIF)) + #sınıf değişkenine göre büyüklük 
  # açısından gruplandırma
  geom_point() #saçılım grafiği çizme

Elde edilen çıktıda sınıf değişkeni size olarak gruplandırıldığından farklı sınıf düzeylerindeki öğrencilerin cinsiyetleri ile okuma yeterlikleri arasındaki ilişki farklı büyüklükteki noktalar ile gösterilmektedir. Ayrıca bu örnekteki gibi bazı veri setleri oldukça fazla gözlemler içerdiğinden çoğu gözlem grafikte üst üste gelmekte ve bunun sonucunda bu gözlemlerin görüntülenmesi zorlaşmaktadır. Bu durumda üst üste binen noktaları kaydırarak ayırmak için position parametresi kullanılmaktadır.

Bu parametrenin alabildiği bazı değerler aşağıda açıklanmıştır.

“identity”: Bu varsayılan konum/position ayarlamasıdır. Verileri değiştirmez ve noktalar doğrudan belirtilen x ve y koordinatlarında çizilir. Bu genellikle dağılım grafikleri için kullanılır. Üst üste binen gözlemler nedeniyle sütun grafiklerinde kullanışlı değildir.

“jitter”: Bahsettiğiniz gibi, bu, noktaları yaymak ve aşırı çizimi azaltmak için noktalara az miktarda rastgele gürültü ekler. Özellikle saçılım grafiklerinde oldukça kullanışlıdır.

jitter argümanının direkt kullanımı:

# sınıf değişkenine göre büyüklük açısından gruplandırma
ggplot(miniPISA, aes(CINSIYET, OK_YETERLIK, size = SINIF)) +
  geom_point(position = "jitter") # üst üste gelen noktaları kaydırma

jitter argümanının manipüle edilmesine imkân tanıyan fonksiyon şeklinde kullanımı:

ggplot(miniPISA, aes(CINSIYET, OK_YETERLIK, size = SINIF)) + 
  geom_point(position = position_jitter(width = 0.2, height = 0.1))

“dodge”: Genellikle çubuk grafiklerle kullanılır. Üst üste binen nesneleri yan yana konumlandırır. Örneğin, kategorik x eksenli bir çubuk grafiğinde gruplar karşılaştırılmak istendiğinde dodge kullanılması faydalıdır.

“stack”: Noktaları üst üste yığar. Bu, yoğunluk grafikleri veya alan grafikleri ile uğraşırken kullanışlıdır.

“fill”: Bu, “stack”a benzer ancak noktalar arasındaki boşluğu doldurur. Genellikle çizgi grafikleri ile kullanılır.

Her bir pozisyon parametresi “jitter” örneğinde olduğu gibi fonksiyon şeklinde yazılabilir ve uzunluk, genişlik parametreleri ayarlanabilir. Ayrıca konum parametresinin seçimi, grafiğinizin özel gereksinimlerine ve çalıştığınız veri türüne bağlıdır. İstediğiniz görsel temsili elde etmek için farklı değerlerle denemeler yapabilirsiniz.

6.7 Katmanlar

ggplot2 paketi içinde farklı görsel materyaller grafik katmanları oluşturacak şekilde eklenebileceğinden bahsetmiştik. Her komut bir öncekine artı sembolü (+) ile eklenerek çok katmanlı bir çizim nesnesi oluşturulur. Karmaşık görünen bu sistem aslında oldukça kullanışlıdır.Temel olarak ggplot() fonksiyonu ile başlanır ve geom katmanları ile histogram, saçılım, frekans gibi grafik türleri eklenir. Daha sonra ise eksen etiketleri, başlık, yazı tipleri, boyutlar, renk şemaları, şekiller gibi tasarımla ilgili parametreler çizime eklenir.

6.7.1 alpha

Şeffaflık düzeyini ayarlamak için alpha kullanılır. Bu değer sıfıra yaklaştıkça saydamlık artar.

ggplot(miniPISA, aes(ODOKUMA1, OK_YETERLIK, color = SINIF)) +
  geom_point(alpha = 0.3)

Elde edilen çıktıda ODOKUMA1 ile OK_YETERLIK değişkenleri arasındaki ilişkinın sınıf düzeyine göre saçılım grafiği görülmektedir. geom_point() fonksiyonu içindeki alpha argümanı ile noktaların şeffaflığı sağlanmıştır.

Katmanlar, “+” ile grafik1 adlı nesneye eklenebilir.

grafik1 <- ggplot(miniPISA, aes(ODOKUMA1, OK_YETERLIK, color = SINIF))
grafik1 +geom_point(alpha = 1.2)

grafik1 adlı nesneye CINSIYET değişkenine göre şekil eklenebilir. Burada cinsiyet değişkeninin düzeyleri farklı şekillerde gruplanır. Bir noktayı(varsayılan şekil) yıldız, üçgen, kare ya da harfler olarak görselleştirebiliriz.

grafik1+geom_point(aes(shape=CINSIYET))

6.7.2 text

geom_text() fonksiyonu ile metinler veri sembolü olarak eklenebilir. Gösterim amacıyla veri setinin sadece ilk 10 satırı kullanılmıştır.

ggplot(miniPISA[1:10,], aes(ODOKUMA1, OK_YETERLIK))+
         geom_text(aes(label = CINSIYET))

Çıktıda görüldüğü üzere değişkenler arası ilişkiler nokta ya da şekil yerine yazı ile ifade edilmiştir. Burada dikkat edilmesi gereken, geom_text() fonksiyonunun içine yazılacak label argümanı ile etiketlemenin hangi gruplama değişkeni ile yapılması gerektiğidir.

6.7.3 Scale

ggplot2 paketinde, scale_*() fonksiyonları çeşitli çizim estetiğinin ölçeklerini özelleştirmek için kullanılır. Bu fonksiyonlar, ggplot’unuzdaki eksenlerin, etiketlerin ve diğer görsel öğelerin görünümünü ve davranışını kontrol etmenizi sağlar.

Yaygın olarak kullanılan bazı scale_*() fonksiyonları amaçlarıyla birlikte verilmiştir. Bu fonksiyonlar, grafiklerinizin görünümünde ince ayar yapmak ve iletmek istediğiniz bilgileri etkili bir şekilde iletmelerini sağlamak için esnek bir yol sağlar.

scale_x_continuous() ve scale_y_continuous(): Bu fonksiyonlar, sürekli değişkenler için x ve y eksenlerinin ölçeklerini özelleştirmek için kullanılır. Sınırları, kesmeleri, etiketleri ve diğer özellikleri belirtebilirsiniz. Örneğin scale_x_continuous(limits = c(0, 10), breaks = seq(0, 10, by = 2)) kodu ile x ekseni limitlerini ve kesim noktalarını belirler.

scale_x_discrete() ve scale_y_discrete(): Bu fonksiyonlar x ve y eksenlerindeki kategorik(factor) değişkenler için kullanılır. Eksen etiketlerinin ve adlarının görünümünü özelleştirmenize olanak tanırlar. Örneğin scale_x_discrete(labels = c("A", "B", "C")) kodu ile kategorik(faktor) değişkenin düzeyi değiştirilebilir.

scale_color_*() ve scale_fill_*(): Bu fonksiyonlar, renk ve dolgu gibi farklı estetikler için renk ölçeklerini özelleştirmek için kullanılır. Renk paletlerini, etiketler ve diğer özellikleri değiştirebilirsiniz. Örneğin scale_color_manual(values = c("red", "blue", "green")) üç düzeyli bir kategorik değişkeninin renklerini ayarlar.

scale_size() ve scale_size_continuous(): Bu fonksiyonlar bir çizimdeki öğelerin boyutunu özelleştirmek için kullanılır.

scale_shape(): Bu fonksiyon, bir dağılım grafiğindeki noktaların şeklini özelleştirmek için kullanılır. Şekiller ile aşağıda yer alan 24 değer kullanılabilir.

 sekiller <- data.frame(sekil = 0:24)
ggplot(sekiller, aes(0, 0, shape = sekil)) +
  geom_point(aes(shape = sekil), size = 5, fill = 'red') +
  scale_shape_identity() +
  facet_wrap(~sekil) +
  theme_void()

ggplot(miniPISA, aes(x = ODOKUMA1,y = OK_YETERLIK, color = CINSIYET)) +
geom_point(position = "jitter") +
scale_color_manual(values = c("red", "blue"))

6.7.4 Limits

limits argümanı ile sınırlar belirlenir. Örneğin x ekseninin minimum ve maksimum değerleri belirlenmek isteniyorsa aşağıdaki örnekteki gibi bu argüman kullanılır.

ggplot(miniPISA, aes(x = ODOKUMA1,y = OK_YETERLIK,color = CINSIYET)) + # cinsiyete göre gruplandırma
geom_point(position = "jitter") +  # üst üste gelen noktaları kaydırma 
scale_x_continuous("Okuma Puanları",limits = c(100,900)) + # x eksenindeki okuma puanlarını sınırlandırma
scale_color_discrete("Cinsiyet",labels=c("KIZ","ERKEK"))  # cinsiyete göre 

6.7.5 Breaks

breaks=seq() fonksiyonu ile eksenin sınırları ve ayrımı belirlenir. seq() içine sırasıyla eksenin başlayacağı sayı, biteceği sayı ve kaçar kaçar ilerleneceği yazılır.

ggplot(miniPISA, aes(x = ODOKUMA1,
y = OK_YETERLIK,
color = CINSIYET)) +
geom_point(position = "jitter") +
scale_x_continuous("Okuma Puanları",limits = c(100,900),
         breaks=seq(100,900,100)) +
  scale_color_discrete("Cinsiyet")

Çıktıda görüldüğü üzere x ekseninde okuma puanları, y ekseninde okuma yeterlik puanları yer alacak seçilde saçılım grafiği çizilmiştir. x ekseni 100 ile 900 arasında sınırlandırılmış ve 100’er 100’er ayrılmıştır. Cinsiyet değişkenine göre gruplandırma yapıldığından kız ve erkek öğrencilere ait saçılım grafiği verilmiştir.

6.7.6 expand

expand argümanı ile genişletme yani birleştirme yapılır. Aşağıdaği örnekte expand=c(0,0) ile x eksen limitleri değiştirilmiştir.

ggplot(miniPISA, aes(x = ODOKUMA1,
y = OK_YETERLIK,
color = CINSIYET)) +
geom_point(position = "jitter") +
scale_x_continuous("Okuma Puanları",limits = c(100,900),
                   breaks=seq(100,900,100), expand=c(0,0)) +
scale_color_discrete("Cinsiyet")

6.7.7 labs

labs argümanı ile etiketleme eklenir. Grafik eksenleri (x ve y), başlık(title), alt başlık(subtitle) ve grup (color) isimlendirmeleri yapılır.

ggplot(miniPISA, aes(x = ODOKUMA1,
y = OK_YETERLIK,
color = CINSIYET)) +
geom_point(position = "jitter") +
  labs(x = "\nBasari Puanları",
       y = "\nYeterlik Puanları",
       color = "Grup")

6.8 Bar Grafiği

En sık kullanılan grafiklerden olan bar grafikleri ya da sütun grafikleri frekansların dağılımını vermektedir. En çok kullanılan dikeyde frekansların yatay eksende ise değişken ve değişken kategorilerinin yer aldığı dikey versiyondur. Ayırıcı özelliği ise sütunlar arasında boşluk olmasıdır. Bu durum sıralama ve sınıflama ölçeğindeki verilerin görselleştirilmesinde kullanılan grafik türü olmasından kaynaklanmaktadır.

ggplot(miniPISA, aes(CINSIYET, fill = SINIF)) + geom_bar() + # sütun grafiği
  labs(x = "Cinsiyet",
       y = "Frekans") #etiketleme yapılması

Grafik ile veri eşlemesi aynı zamanda mapping= argümanı ile de yapılabilir.

ggplot(data = miniPISA, mapping = aes(x = CINSIYET)) +
  geom_bar() 

Elde edilen çıktıda x ekseninde cinsiyet y ekseninde ise frekansların yer aldığı görülmektedir. Şimdi y ekseninde frekans değerleri yerine yüzde değerlerini alalım.

ggplot(data = miniPISA, mapping = aes(x = CINSIYET)) + 
  geom_bar(aes(y = (..count..)/sum(..count..)))+ 
  scale_y_continuous(name = "Yüzde", labels=scales::percent) 

Burada bar grafiği yardımıyla sütundaki frekans değerleri yüzdeye çevrilerek verilmiştir. Elde edilen sonuca göre kız ve erkek oranları birbirine oldukça yakındır.

6.8.1 scale_fill

fill argümanı ile belli bir değişkenin düzeylerine göre gruplama yapılan veri seti, scale_fill argümanıyla da her bir gruba ait farklı şekil içi renklendirme yapılır. Hatta bu şekil içi dolgular scale_fill_manual argümanı ile özelleştirilebilir.

ggplot(miniPISA, aes(CINSIYET, fill = SINIF)) +
  geom_bar() +
   labs(x = "Cinsiyet",
       y = "Frekans") +
  scale_fill_manual("CINSIYET", values = c("red","blue","orange","green",
                                           "darkblue","purple"))

6.9 Çizgi Grafiği

Veri setindeki gözlemlerin çizgilerle birleştirildiği çizgi grafikleri, x ekseninde genellikle zamanın yer aldığı verilerin zamana göre değişimi hakkında bilgi verir. Yıllara göre değişimi gösteren bir grafik elde etmek için 2009, 2012 , 2015 , 2018 veri setleri içlerinden okuma olası puanları (PV1READ) ve okuma olası puanları (ESCS) seçilerek R ortamına aktarılmıştır.

library(tuev)
PISA2009 <-PISA_STU_2009 %>% 
  select(PV1READ,ESCS) %>% 
  mutate(YIL=2009)

PISA2012 <-PISA_STU_2012 %>% 
  select(PV1READ,ESCS) %>% 
  mutate(YIL=2012)

PISA2015 <-PISA_STU_2015 %>% 
  select(PV1READ,ESCS) %>% 
  mutate(YIL=2015)

PISA2018 <-PISA_STU_2018 %>% 
  select(PV1READ,ESCS) %>% 
  mutate(YIL=2018)

Dört veri seti rbind fonskiyonu ile birleştirilmiştir.

dat <-rbind(PISA2009, PISA2012, PISA2015, PISA2018)

Yıllara göre ortalama başarı puanlarını göstermek için öncelikle group_by() ve summarise() fonksiyonları ile ortalama alınmış, daha sonra geom_line() fonksiyonu içinde çizgi türü ve renk değiştirilerek grafik elde edilmiştir.

dat1 <- dat %>% 
  group_by(YIL )  %>%  
 summarise( ortalama = mean(PV1READ,na.rm=TRUE))  %>% 
  ungroup()

ggplot(dat1 , aes(x=YIL,y= ortalama)) + 
  geom_line(linetype = 2 , color = "blue") +
  theme_minimal()

Yukarıda yer alan çizgi grafiğinde theme_minimal() fonksiyonu ile arka plan sadeleştirilmiştir. theme_*() fonksiyonları ile farklı arka planlar deneyebilirsiniz.

Çizgi grafikleri özellikle regresyon eğrileri oluşturmak için kullanır. Sosyoekonomik düzey başarı arasındaki ilişkiyi görselleştirmek için ilk olarak ESCS değişkeni kategorik hale getirilmiştir. Daha sonra ESCS’in kategorik düzeyleri için ESCS ve PV1 read değişkenlerinin ortalaması alınmıştır. Oluşan veri setinin ilk satırları yazdırılmıştır.

dat2 <- dat %>% mutate(ESCS_kategorik = 
                            case_when(
                              ESCS > -4 & ESCS <=  -2 ~ "Dusuk",
                              ESCS > -2 & ESCS <=  0 ~ "Orta",
                              ESCS > 0    ~ "Yuksek")) 
                            
dat3 <- dat2 %>% group_by(YIL, ESCS_kategorik)   %>%  
  summarise(ortalamaSES= mean(ESCS,na.rm=TRUE),
            ortalamaPV1= mean(PV1READ,na.rm=TRUE))   %>% 
  arrange(desc(ortalamaSES)) %>% ungroup()
head(dat3)
## # A tibble: 6 × 4
##     YIL ESCS_kategorik ortalamaSES ortalamaPV1
##   <dbl> <chr>                <dbl>       <dbl>
## 1  2009 Yuksek               0.697        521.
## 2  2018 Yuksek               0.620        520.
## 3  2012 Yuksek               0.560        547.
## 4  2015 Yuksek               0.543        474.
## 5  2009 Orta                -1.10         468.
## 6  2015 Orta                -1.10         428.

Regresyon doğrusunun oluşturulması için ggpubr (Kassambara, 2023) paketinin stat_regline_equation() fonksiyonundan yararlanılmıştır.

library(ggpubr)
ggplot(dat3, aes(x=ortalamaSES , y=ortalamaPV1)) + 
  geom_line() +
  facet_wrap(vars(YIL)) +
  geom_smooth(method='lm', formula= y~x)+
  stat_regline_equation() +
    xlab("Ortalama ESCS") + ylab("Ortalama PV1") +
theme_bw()

6.10 Kutu grafiği

geom_boxplot() fonksiyonu ile kutu grafiği çizilir. Kutu grafiği ile veri setinin minimum, ilk çeyrek, medyan, üçüncü çeyrek ve maksimum değerleri gösterilir.

ggplot(miniPISA, aes(x = CINSIYET,y = OK_YETERLIK)) +
  geom_boxplot(color="red", fill="purple", alpha=0.2) 

coord_flip() fonksiyonu, x ve y eksenlerinin yerlerini değiştirmek amacıyla kullanılır. Bazen bu şekilde bir kullanım daha faydalı olabilmektedir.

ggplot(miniPISA, aes(x = CINSIYET,y = OK_YETERLIK)) +
  geom_boxplot(color="red", fill="purple", alpha=0.2) +
coord_flip()

Bu bölümde veri görselleştirmede en sık kullanılan ggplot paketi, bu pakette yer alan temel fonksiyonların kullanımı ve grafik türleri örneklerle anlatılmıştır. Bir sonraki bölümde veri görselleştirmede kullanılan ileri düzey grafiklere örnekler verilmiştir.

Bölüm 7 İleri Düzey Grafik Örnekleri

Bu bölümde veri görselleştirme ile ilgili daha ileri düzey grafiklere ait birkaç örneğe yer verilerek okuyucularla etkileşim oluşturmak amaçlanmıştır. Burada yer alan grafikler, plotly (Sievert, 2020) kütüphanesi kullanılarak oluşturulmuştur. “plotly” paketi ise R yazılımında hem basit grafiklerin hem de 3 boyutlu grafiklerin çiziminde oldukça modern görseller sağlamaktadır. Ek olarak “plotly” paketi R Shiny uygulamalarında sıklıkla kullanılan bir pakettir. Basit ve istatistiksel grafiklerin yanında, bilimsel ve finans grafiklerinin çizimine de olanak sağlamaktadır. Ayrıca harita grafikleri, 3 boyutlu grafikler, çoklu eksenlere dayalı garfikler ile animasyonlar ile oldukça geniş bir veri görselleştirme olanağı sunmaktadır. Eğer elde edilen grafikler çevrim içi ortamlarda yayınlanacak ise plotly bu bakımdan kullanım kolaylığı sağlamaktadır. plot_ly() ana fonksiyonunun yanında birden çok argüman ile birlikte çalıştırılmaktadır. “ggplot2” paketine benzer bir şekilde grafikleri nesnelere kaydederek çizmektedir.

7.1 Anne Eğitim Düzeyi

library(plotly)
data <- miniPISA %>% group_split(Anne_Egitim)
#data[1][[1]]
OD_1 <- density(data[1][[1]]$ODOKUMA1, na.rm = TRUE)
OD_2 <- density(data[2][[1]]$ODOKUMA1, na.rm = TRUE)
OD_3 <- density(data[3][[1]]$ODOKUMA1, na.rm = TRUE)
OD_4 <- density(data[4][[1]]$ODOKUMA1, na.rm = TRUE)
OD_5 <- density(data[5][[1]]$ODOKUMA1, na.rm = TRUE)
OD_6 <- density(data[6][[1]]$ODOKUMA1, na.rm = TRUE)
OD_7 <- density(data[7][[1]]$ODOKUMA1, na.rm = TRUE)

plot_ly() %>%
  add_lines(x = ~OD_1$x, y = ~OD_1$y, name = "Okul_oncesi", fill = 'tozeroy') %>%
  add_lines(x = ~OD_2$x, y = ~OD_2$y, name = "Ilkokul", fill = 'tozeroy') %>%
  add_lines(x = ~OD_3$x, y = ~OD_3$y, name = "Ortaokul", fill = 'tozeroy') %>%
  add_lines(x = ~OD_4$x, y = ~OD_4$y, name = "Lise", fill = 'tozeroy') %>%
  add_lines(x = ~OD_5$x, y = ~OD_5$y, name = "Önlisans", fill = 'tozeroy') %>%
  add_lines(x = ~OD_6$x, y = ~OD_6$y, name = "Lisans", fill = 'tozeroy') %>%
  add_lines(x = ~OD_7$x, y = ~OD_7$y, name = "Lisansustu", fill = 'tozeroy') %>%
  layout(xaxis = list(title = 'Okuma Başarı Puanı (OD1)'),
         yaxis = list(title = 'Yoğunluk'))

7.2 Sosyoekonomik Düzey ve Anne Eğitimi

miniPISA %>%
  plot_ly(x = ~ODOKUMA1, y = ~SES, color = ~factor(Anne_Egitim))  %>%
  add_markers() %>%
    layout(boxmode = "group")%>%
    layout(legend=list(title=list(text='<b> Anne Eğitimi </b>')))%>%
  layout(
    xaxis = list(title = "Okuma Basari Puanı (OD1)" ,range = c(180,810)),
     yaxis = list(title = "Sosyoekonomik Duzey",range = c(-5,4))
  )

7.3 Okul Öncesi Eğitim Süresi ve Anne Eğitimi

miniPISA %>%
  filter(!is.na(Okuloncesi_yil)) %>%
  plot_ly(x = ~Okuloncesi_yil, y = ~ODOKUMA1, color = ~(Anne_Egitim)) %>%
  add_boxplot()  %>% 
    layout(boxmode = "group")%>%
    layout(legend=list(title=list(text='<b> Anne_Egitim </b>')))%>%
    layout(
        xaxis = list(title = "Okul Öncesi Eğitimi Süresi"),
        #title = "Matematik Puanı Dağılımı",
         yaxis = list(title = "Okuma Basari Puanı (OD1)",range = c(180,800)))

7.4 Evdeki Kitap Sayısı

miniPISA %>%
  #filter(!is.na(Okuloncesi_yil)) %>%
  plot_ly(x = ~KITAPSAYISI, y = ~ODOKUMA1) %>%
  add_boxplot()  %>% 
    layout(
        xaxis = list(title = "Evdeki Kitap Sayısı"),
        #title = "Matematik Puanı Dağılımı",
         yaxis = list(title = "Okuma Basari Puanı (OD1)"))

7.5 Evdeki Kitap Sayısı ve Anne Eğitimi

miniPISA %>%
  count(Anne_Egitim,KITAPSAYISI) %>%
  plot_ly(x = ~ KITAPSAYISI, y = ~n, hoverinfo = "y",color=~factor(Anne_Egitim)) %>%
  add_bars()%>%
  #layout(barmode = "stack") %>%
      layout(legend=list(title=list(text='<b> Anne Egitimi </b>')))%>%
     layout(
        xaxis = list(title = "Evdeki Kitap Sayısı"),
         yaxis = list(title = "Frekans",range = c(0,610)))

Kaynaklar

Kassambara, A. (2023). Ggpubr: ’ggplot2’ based publication ready plots. https://CRAN.R-project.org/package=ggpubr
Sievert, C. (2020). Interactive web-based data visualization with r, plotly, and shiny. Chapman and hall/CRC.