2: R ile Veri Görselleştirmeye Giriş (ggplot2)

R ortamında proje açılarak çalışmaya başlanmalı ve gerekli paketler yüklenmelidir. ggplot2, R’ı dünya çapında meşhur eden tidyverse mega paketinin içerisindeki “Grammar of Graphics” (Grafiğin Grameri) felsefesine dayanan bir görselleştirme paketidir. Çalışma mantığı, boş bir sofra bezi (kanvas) serip, geometrik ve estetik objeleri Lego gibi üst üste eklemeye (katmanlı yapıya) dayanır.

Gerekli Paketlerin Yüklenmesi ve Aktifleştirilmesi

Öncelikle SPSS dosyalarını çekmek için haven, veri seti etiketlerini okumak için labelled ve veri düzenleme/görselleştirme için tidyverse paketleri R ortamına indirilir ve çalıştırılır.

# Bu kodlar paketler yüklü değilse bir kere çalıştırılmalıdır.Tırnak içinde yazınız.
install.packages("haven")
install.packages("labelled")
install.packages("tidyverse") #ggplot2 paketi içindedir.
# Gelecek hafta dplyr paketi anlatılacaktır.(Veri Düzenleme) Bu paket de tidyverse içindedir.

Veri Setinin R Ortamına Çekilmesi

SPSS veri seti (.sav uzantılı), bilgisayardan bulunarak dosyamıza aktarılır. TGSS_2024 veri dosyasının çalıştğımız klasörde olmasını lütfen sağlayalım.

# Paketleri kütüphaneye çağıralım.Tırnak kullanmayınız.
library(haven)
library(tidyverse)
## Warning: package 'dplyr' was built under R version 4.5.2
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.2.1     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   4.0.0     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(labelled)
# Veri setini R'a okutalım
TGSS <- read_sav("TGSS_2024.sav")

Etiket kütüphanesini görmek için kullanılan kod:

TGSS_degiskenler <- look_for(TGSS)
TGSS_degiskenler

Veri Tiplerini Kontrol Etme ve Değiştirme

R’ın değişkenleri nasıl tanıdığı (sayısal mı, kategorik mi) çok önemlidir. Sayısal değişkenler için sorgu şu şekilde yapılır:

is.numeric(TGSS$gender)
## [1] TRUE

Bir değişkenin frekans tablosunu almak için:

table(TGSS$gender)
## 
##    1    2 
## 1331 1284

Sayısal (numeric) olarak gelen bir değişkeni, etiketleriyle (kadın/erkek vb.) kategorik bir formata (faktöre) dönüştürmek için aşağıdaki kodlar kullanılır:

table(as_factor(TGSS$gender))
## 
## Erkek Kadın 
##  1331  1284

Eğer haven paketine ait özel faktör dönüştürücü özellikle kullanılmak istenirse yani bir başka pakette de bu komut var ise ve biz mutlaka haven paketine ait olanı kullanmak istiyorsak aşağıdaki gibi komutu yazarız.

table(haven::as_factor(TGSS$gender))
## 
## Erkek Kadın 
##  1331  1284

Tüm veri setindeki değişkenleri tek seferde faktöre dönüştürmek için:

TGSS <- as_factor(TGSS)

Bu komuttan sonra değişkenlerin hepsi faktöre dönüşmüştür. Örneğin degurbayı kontrol edelim

is.factor(TGSS$degurba) # sonuc TRUE gelir.
## [1] TRUE

3: ggplot2 (Grammar of Graphics) Kodlaması ve Katmanların Oluşturulması

Grafik oluştururken işlemler + işareti ile birbirine bağlanarak eklenir.

Temel Sütun Grafiği (Bar Chart)

ggplot() komutu ile boş bir kanvas oluşturduk.

ggplot()

data= argümanı ile veri setimiz girilir. X eksenine “gender” (cinsiyet) atamak için aes (estetik - aesthetics) argümanı ile x ekseninde cinsiyet olacağız tarif edilir.

ggplot(data = TGSS, mapping = aes(x = gender))

Bu kod sadece eksenleri çizer. Sütun objelerini getirmek için geom_bar() eklenir:

ggplot(data = TGSS, aes(x = gender)) + geom_bar()

Bir başka değişken (kentleşme derecesi) için kısaltılmış yazım: (data = yazmadan da ilk olarak data setimizi direkt yazabilirdik. Yine mapping yazmaya da gerek yoktur.)

ggplot(data = TGSS, aes(x = degurba)) + geom_bar()

Histogram (Sayısal Değişkenler İçin)

Kategorik bir değişken histograma sokulmaya çalışıldığında R hata verir; bu yüzden verinin as.numeric ile sayısal formata çevrilmesi gerekir. bins= argümanı ile aralık (sütun sayısı) belirlenebilir.

ggplot(TGSS, aes(x = as.numeric(income))) + geom_histogram(bins = 30)
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_bin()`).

Aslında kategorik olan educ değişkenini nümerik al deseydik aşağıdaki gibi komutu yazardık.

ggplot(TGSS, aes(x = as.numeric(educ))) + geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value `binwidth`.

Görsel Elemanların Değiştirilmesi (Renk, Saydamlık ve Çizgi Kalınlığı)

Şimdi tekrar aşağıdaki grafiğe gelelim.

ggplot(data = TGSS, aes(x = degurba)) + geom_bar()

Sütunların içini doldurmak için fill, saydamlığını ayarlamak için alpha, dış kenar çerçevesini renklendirmek için colour, çizgi kalınlığını ayarlamak için ise linewidth kullanılır.

fill ile içinin rengini değişterelim

ggplot(data = TGSS, aes(x = degurba)) + geom_bar(fill = "navy" )

alpha değeri 1 olursa yukarıdaki görüntünün kendisidir küçültürsek saydamlaşma başlar.

ggplot(TGSS, aes(x = degurba)) + geom_bar(fill = "navy", alpha = 0.5)

Dış kenar çerçevesini renklendirmek için colourı kullanalım

ggplot(TGSS, aes(x = degurba)) + 
  geom_bar(fill = "navy", alpha = 0.8, colour = "red")

Çizgi kalınlığını ayarlamak için ise linewidth kullanalım.

ggplot(TGSS, aes(x = degurba)) + 
  geom_bar(fill = "navy", alpha = 0.8, colour = "red", linewidth = 1)

Şimdi marital değişkeninin grafiğini yapalım.

Ama önce data setimizi tekrar yükleyelim. Çünkü herşey faktör olmuştu.

# Veri setini R'a okutalım
TGSS <- read_sav("TGSS_2024.sav")

as_factor olarak tanıtık ki etiketlerini görelim.

ggplot(TGSS, aes(x = as_factor(marital))) + geom_bar(fill = "navy", alpha = 0.5)

fill, colour ve linewidth kullanarak grafiğimizi düzenleyelim.

ggplot(TGSS, aes(x = as_factor(marital))) + 
  geom_bar(fill = "pink4", colour = "black", linewidth = 1)

EK BİLGİ :ggplot2’de Modüler (Adım Adım) Grafik Oluşturma Tekniği

ggplot2 paketinde grafikler nesne tabanlı ve katmanlı (layered) bir yapıda oluşturulur. Bu sayede grafiğin temel iskeletini bir değişkene, her bir görsel katmanı (geom, scale, theme vb.) ise ayrı değişkenlere atayarak kodu çok daha okunaklı, yönetilebilir ve yeniden kullanılabilir hâle getirebilirsiniz.

Hocamızın bu durumu bize izah etmiştir. Aşağıdaki kod tam olarak bu tekniğin basit bir uygulamasıdır:

# 1. Temel grafik nesnesi (ggplot katmanı)
base_plot <- ggplot(TGSS, aes(x = as_factor(marital)))

# 2. Geometrik katman (geom) ve estetik ayarları
bar_layer <- geom_bar(fill = "pink4", 
                      colour = "black", 
                      linewidth = 1)

# 3. Parçaları birleştirme
final_plot <- base_plot + bar_layer

# 4. Grafiği göster
final_plot

Eksen İsimlerini Değiştirme (Labs) ve Yön Çevirme (Coord Flip)

X ve Y eksenlerindeki İngilizce veya ham değişken isimlerini değiştirmek için labs() kullanılır. + ile eklenir.

Grafikte degurba (Kentleşme Durumu) değişkeni kullanılmıştır.

ggplot(TGSS, aes(x = degurba)) + 
  geom_bar(fill = "navy", 
                   colour = "red", 
                   linewidth = 1) + 
  labs(x = "Kentleşme Durumu", y = "Frekans (Sayı)")

Dikey sütunları yataya çevirmek (X ve Y eksenlerinin yerini değiştirmek) için coord_flip() komutu eklenir.

ggplot(TGSS, aes(x = degurba)) + 
  geom_bar(fill = "navy", 
                   colour = "red", 
                   linewidth = 1) + 
  labs(x = "Kentleşme Durumu", y = "Frekans (Sayı)") + 
  coord_flip()

Temaların (Theme) Uygulanması

Yine aynı grafiğimize bakalım.

ggplot(TGSS, aes(x = degurba)) + 
  geom_bar(fill = "navy", 
                   colour = "red", 
                   linewidth = 1) + 
  labs(x = "Kentleşme Durumu", y = "Frekans (Sayı)")

Arka plandaki gri rengi ve şablonu değiştirmek için temalar kullanılır. Örneğin siyah-beyaz arka plan için theme_bw() veya theme_minimal() tercih edilebilir.

ggplot(TGSS, aes(x = degurba)) + 
  geom_bar(fill = "navy", 
                   colour = "red", 
                   linewidth = 1) + 
  labs(x = "Kentleşme Durumu", y = "Frekans (Sayı)") +
  theme_bw() # isterseniz theme_minimal() komutunu da kullanabilirsiniz.

Bir Başka Grafik Örneği: Değişken olarak gender (cinsiyet) değişkeni kullanılmıştır.

ggplot(TGSS, aes(x = as_factor(gender))) + 
  geom_bar(fill = "navy", 
                   colour = "red", 
                   linewidth = 1) + 
  labs(x = "Cinsiyet", y = "Frekans (Sayı)") +
  coord_flip()

4: Dağılım Grafikleri (Scatter Plot), Jitter ve Regresyon Eğrisi

İki sayısal değişken (eğitim ve gelir) arasındaki ilişkiyi göstermek için nokta grafiği (geom_point) kullanılır.

Anlatım kolaylığı olsun diye data setimizi orijinal hali ile tekrar yükleyelim.

# Veri setini R'a okutalım
TGSS <- read_sav("TGSS_2024.sav")
ggplot(TGSS, aes(x = educ, y = income)) + geom_point()
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

Noktaları renklendirelim colour ile

ggplot(TGSS, aes(x = educ, y = income)) + geom_point(colour="blue")
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

Noktaları büyütme size ile

ggplot(TGSS, aes(x = educ, y = income)) + geom_point(colour="blue", size = 1.5)
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

Noktaları büyütme bir değişkene atanmış şekilde size çalışması

sz = 1.5
ggplot(TGSS, aes(x = educ, y = income)) + geom_point(colour="blue", size = sz)
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

Noktaları saydamlaştırma alpha ile

ggplot(TGSS, aes(x = educ, y = income)) + geom_point(colour="blue", alpha = 0.4, size = 1.5)
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

Jitter Kullanımı

Çok fazla aynı değere sahip gözlem olduğunda noktalar üst üste biner. Bunu çözmek ve gözlemleri “dağıtmak” için geom_point yerine geom_jitter kullanılır. Dağılımın genişliği width ile ayarlanır.

ggplot(TGSS, aes(x = educ, y = income)) + geom_jitter(width = 1)
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

Etiket ekleme

ggplot(TGSS, aes(x = educ, y = income)) + geom_jitter(width = 1) +
labs(x="Eğitim", y = "Gelir")
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

Trend Çizgisi (Regresyon Eğrisi) Eklemek

Verideki genel eğilimi göstermek için grafiğe geom_smooth() eklenir. Metod olarak doğrusal regresyon “lm” (linear model) belirtilmelidir. Standart hatayı (gri gölge alanı) gizlemek istenirse se = FALSE argümanı kullanılır.

ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income))) + 
  geom_jitter(width = 0.5) + 
  geom_smooth(method = "lm", se = TRUE) +
  labs(x="Eğitim", y = "Gelir")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

method = loess kullanmak

ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income))) + 
  geom_jitter(width = 0.5) + 
  geom_smooth(method = "loess", se = TRUE) +
  labs(x="Eğitim", y = "Gelir")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

Teknik Açıklama

loess = Locally Estimated Scatterplot Smoothing (Yerel Tahmini Saçılım Grafiği Düzleştirme)

Bu yöntem, veriyi tümünde tek bir düz çizgi ile özetlemek yerine, her bölgeyi (her eğitim seviyesini) ayrı ayrı inceler.

Her x değeri (her eğitim seviyesi) etrafında yerel bir regresyon yapar ve o bölgedeki noktaların en iyi nasıl özetleneceğini hesaplar.

Sonuçta ortaya çıkan pürüzsüz eğri, eğitim seviyesi değiştikçe gelirin nasıl ve ne şekilde değiştiğini net bir şekilde gösterir.

Trend Çizgisini Renklendirmek,Gölge Vermek,Şeffat Yapmak

Trend çizgisinin rengi (color) ve gölge rengi (fill), şeffaflığı (alpha) değiştirilebilir:

ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income))) + 
  geom_jitter(width = 1) + 
  geom_smooth(method = "lm", se=TRUE, fill = "red", color = "darkred", alpha = 0.2, size = 2)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

Alt Gruplara Göre Renklendirme ve Manuel Renk Atama

Trendi tüm veriye değil de kadın/erkek olarak iki alt gruba bölerek ayrı ayrı renkli doğrularla göstermek için genel estetik (aes) içerisine colour argümanı eklenir. Değişkenin kategorik görülmesi için as_factor kullanılmalıdır.

ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income), colour = as_factor(gender))) + 
  geom_jitter(width = 1, alpha = 0.4) + 
  geom_smooth(method = "lm", se = TRUE) +
  labs(x="Eğitim", y = "Gelir")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

Göstergeyi (Legend) aşağı almak için tema ayarı yapılır:

ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income), color = as_factor(gender))) + 
  geom_jitter(width = 1, alpha = 0.4) + 
  geom_smooth(method = "lm", se = TRUE) +
  labs(x="Eğitim", y = "Gelir")+
  theme_bw() +
  theme(legend.position = "bottom")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

Önemli Not: Kodların sıralaması önemlidir. Önce temayı belirleyip, ardından temanın içerisindeki diğer bileşenleri eklemek daha doğru sonuç verir. Yani önce theme_bw() sonra theme(legend.position = “bottom”) olmalı gibi

Programın atadığı renkler yerine kendi istediğimiz manuel renkleri atamak için scale_color_manual fonksiyonu ve values argümanı kullanılır. C (vektör) yapısı içinde kategori isimlerine karşılık gelen renkler yazılır.

ggplot(TGSS, aes(x = as.numeric(educ), y = as.numeric(income), color = as_factor(gender))) + 
  geom_jitter(width = 1, alpha = 0.4) + 
  geom_smooth(method = "lm",fill = "gray", se = TRUE) +
  labs(x="Eğitim", y = "Gelir") +
  scale_color_manual(values = c("Erkek" = "navy", "Kadın" = "pink4")) + # Değerlerin veri setinizdeki etiketlerle eşleştiğinden emin olun.
  theme_bw() +
  theme(legend.position = "bottom")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 60 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 60 rows containing missing values or values outside the scale range
## (`geom_point()`).

5: R’da Grafikleri Kaydetme (ggsave)

Grafikler doğrudan R arayüzünden manuel olarak Export -> Save as Image yöntemiyle (PNG, SVG, JPEG olarak) kaydedilebileceği gibi, çok daha profesyonel ve otomatize bir yöntem olan ggsave kodu ile de kaydedilir.

# 1. Grafiği bir objeye ata
p1 <- ggplot(TGSS, aes(x = degurba)) + 
      geom_bar(fill="steelblue") + 
      labs(title = "Kentleşme Düzeyine Göre Dağılım", x = "Kentleşme Düzeyi", y = "Sayı") +
      theme_minimal()

RStudio’da Console kısmına p1 yazıp bu satırı çalıştırdığımızda RStudio’nun Plots ekranında grafik karşımıza gelir. Burada Export yardımı ile görselimizi ister image formatında ister pdf formatında grafiğimizi bilgisayarımıza kayıt edebiliriz.

(Uyarı: Grafikleri kopyala-yapıştır ile Word’e atmak görsel kalitesini çok düşürür, daima dosya olarak dışa aktarılıp Word’e “Resim Ekle” ile alınmalıdır).

ggsave Kodu ile Kaydetme

Dosyanın genişlik (width), yükseklik (height), kalite (dpi) ve birimi (units) belirlenebilir. Önce bir grafik objesi oluşturulup sonra kaydedilmesi en temiz yöntemdir.

# 1. Grafiği bir objeye ata
p1 <- ggplot(TGSS, aes(x = degurba)) + 
      geom_bar(fill="steelblue") + 
      labs(title = "Kentleşme Düzeyine Göre Dağılım", x = "Kentleşme Düzeyi", y = "Sayı") +
      theme_minimal()

# 2. ggsave ile objeyi kaydet
ggsave(filename = "images/kentlesme_grafigi.png", 
       plot = p1, 
       dpi = 300, 
       width = 17, 
       height = 10, 
       units = "cm")