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")

Derse Giriş için İlk Örnek

Önce Türkiye genelindeki araç sahipliğini görselleştiriyoruz.

ggplot(TGSS) +
  geom_bar(aes(x = as_factor(houcar))) +
  labs(x = "Araç Sahipliği", 
       y = "Sayı") +
  geom_text(x = 2, y = 1350, label = "Araç Sahibi", size = 4) +
  annotate("text", x = 2, y = 1450, label = "Araç Sahibi") +
  theme_bw()

Grafiğn düzenlenmiş hali

ggplot(TGSS, aes(x = as_factor(houcar))) +
  geom_bar(fill = "steelblue", colour = "black", linewidth = 0.8) +
  geom_text(stat = "count", 
            aes(label = after_stat(count)), 
            vjust = -0.4, 
            size = 4.5, 
            fontface = "bold") +
  labs(title = "Araç Sahipliği Dağılımı",
       x = "Araç Sahipliği Durumu",
       y = "Frekans (Kişi Sayısı)") +
  theme_bw(base_size = 14) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5))

Bu grafikte yer alan komutların açıklaması aşağıdaki gibidir:

Kod Parçası İşlevi Açıklama
ggplot(TGSS, aes(x = as_factor(houcar))) Grafiğin temel iskeletini oluşturur Veri setini (TGSS) belirtir ve X eksenine houcar değişkenini kategorik (faktör) olarak yerleştirir. Grafiğin koordinat sistemini tanımlar.
geom_bar(fill = "steelblue", colour = "black", linewidth = 0.8) Çubuk grafiği (bar chart) çizer Her kategori için çubuk oluşturur. fill çubuk iç rengini, colour kenar rengini, linewidth ise kenar kalınlığını belirler.
geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.4, size = 4.5, fontface = "bold") Çubukların üzerine sayı etiketi ekler Her çubuğun frekansını (count) otomatik hesaplar ve çubukların üstüne yazar. vjust etiketin dikey konumunu, size ve fontface ise yazı boyutunu ve kalınlığını ayarlar.
labs(title = "Araç Sahipliği Dağılımı", x = "Araç Sahipliği Durumu", y = "Frekans (Kişi Sayısı)") Grafiğe etiketler ekler Başlık (title), X ekseni etiketi (x) ve Y ekseni etiketi (y) tanımlar.
theme_bw(base_size = 14) Temel temayı uygular Grafiğe temiz, akademik ve siyah-beyaz bir tema verir. base_size = 14 ile tüm yazıların boyutunu büyütür.
theme(plot.title = element_text(face = "bold", hjust = 0.5)) Başlığı özelleştirir Grafik başlığını kalın (bold) yapar ve ortalar (hjust = 0.5).

1. facet_wrap ile Katmanlı/Bölünmüş Grafikler

Hocamızın “Peki şöyle yapacak olsaydım bu kırda ve kentte ve orta yoğun kentte bu durum acaba nasıl diye bakmak istersem bunu nasıl çıkartabilirim?” sorusu, veri görselleştirmede alt grup analizi (subgroup analysis) yapma ihtiyacını vurgulamaktadır.

Araç sahipliği dağılımını (houcar) sadece genel olarak görmek yerine, bu dağılımın kırsal alanlarda (kır), orta yoğun kentlerde ve yoğun kentlerde (degurba değişkenine göre) nasıl değiştiğini incelemek istiyoruz. Yani farklı kentleşme düzeylerinde araç sahipliği pattern’lerinin karşılaştırılması hedefliyoruz.

Bu tür bir analiz, veri setindeki heterojenliği (gruplar arası farklılıkları) ortaya çıkarmak ve daha derin içgörü elde etmek açısından son derece değerlidir.

Grafiği farklı kategorilere (örneğin; kır, orta yoğun kent, yoğun kent) göre bölmek ve ayrı panellerde göstermek için facet_wrap() fonksiyonu kullanılır. Bu fonksiyon, grafikleri bir nevi “görüntü katlama/sarma” mantığıyla çalıştırarak kategorilere göre ayırır.

facet_wrap Kullanımı ve Tilde (~) İşareti

facet_wrap fonksiyonu içerisine değişken yazılırken başına tilde (~) işareti konulması zorunludur. Aksi takdirde “object not found” (nesne bulunamadı) hatası alınır.

Tilde (~) İşareti Nasıl Yazılır?

  • Windows → Alt Gr + Ü

  • Mac → Option + N veya Option + Ü

Kod Örneği:

# Hatalı Kullanım (Çalışmaz)
# facet_wrap(degurba)

# Doğru Kullanım
facet_wrap(~degurba)

Şimdi kendi örneğimize dönelim.

ggplot(TGSS) +
  geom_bar(aes(x = as_factor(houcar))) +
  labs(x = "Araç Sahipliği", 
       y = "Sayı") +
  geom_text(x = 2, y = 1350, label = "Araç Sahibi", size = 4) +
  annotate("text", x = 2, y = 1450, label = "Araç Sahibi") +
  facet_wrap(~degurba) +
  theme_bw()

Kategorik Veri Dönüşümü

Grafik panelleri oluştuğunda başlıklar “Kır, Kent” şeklinde değil de “1, 2” gibi sayısal ifadelerle geliyorsa, R o değişkeni etiketsiz bir sayı (number) olarak algılıyor demektir. Bunu çözmek için değişkeni as_factor() fonksiyonu ile kategorik bir formata (faktör) dönüştürmek gerekir.

# Faktör dönüşümü yapılarak facet eklenmesi
facet_wrap(~as.factor(degurba)) # Kodumuzu bu şekilde düzeltelim.

Kodumuzu bu şekilde aşağıdaki gibi düzeltelim. Ayrıca geom_text ve annotate kısımlarını da silersek daha güzel bir görünüm elde ederiz.

ggplot(TGSS) +
  geom_bar(aes(x = as_factor(houcar))) +
  labs(x = "Araç Sahipliği", 
       y = "Sayı") +
  facet_wrap(~as_factor(degurba)) +
  theme_bw()

Bu aşamada grafiğimizdeki sütunları ve çerçevesini renklendirelim.

ggplot(TGSS, aes(x = as_factor(houcar))) +
  geom_bar(fill= "navy", colour = "red", linewidth = 0.6) +
  facet_wrap(~ as_factor(degurba)) +
  labs(title = "Kentleşme Durumuna Göre Araç Sahipliği Dağılımı",
       x = "Araç Sahipliği Durumu",
       y = "Frekans (Kişi Sayısı)") +
  theme_bw()

Eksik Verileri (NA) Temizleme

Görselleştirmeyi iyileştirmek için, grafiğe dahil etmek istemediğimiz eksik verilerden (NA değerlerinden) kurtulmak gerekebilir. Bunun için “pipe” operatörü (%>%) ile beraber filter() fonksiyonu kullanılır. Eşit değildir anlamında veya değildir anlamında ünlem (!) ve is.na() fonksiyonu birleştirilir.

# 'houcar' (veya analiz edilen değişken) içerisindeki NA değerlerini hariç tutma
TGSS %>%
  filter(!is.na(houcar)) %>% # Kodumuzun başına bu satırları aşağıdaki gibi ekleriz.

Kodumuzun başına bu satırları aşağıdaki gibi ekler, gerekli düzenlemeleri yaparız.

TGSS %>%
  filter(!is.na(houcar)) %>% # satırlar ile NA olmayanlar üzerinden işlem yapılsın demiş olduk. (! sayesinde NA olmayanları almış olduk.)
  ggplot(aes(x = as_factor(houcar))) + # TGSS yukarıdaki tanımlandığı için TGSS buradan kalkar.
  geom_bar(fill= "navy", colour = "red", linewidth = 0.6) +
  facet_wrap(~ as_factor(degurba)) +
  labs(title = "Kentleşme Durumuna Göre Araç Sahipliği Dağılımı",
       x = "Araç Sahipliği Durumu",
       y = "Frekans (Kişi Sayısı)") +
  theme_bw()

Değişkeni İnceleme

Yeniden kodlama yapmadan önce veri setindeki mevcut değişkenin içeriğini ve kategorilerini görmek önemlidir. Eğitim durumunu belirten 8 kategorili educ değişkeni şu kodlarla incelenebilir:

table(TGSS$educ)
## 
##   1   2   3   4   5   6   7   8 
## 113 492 395 862 255 427  61  10
table(as_factor(TGSS$educ))
## 
##                Herhangi bir okul bitirmedim 
##                                         113 
##                                     İlkokul 
##                                         492 
##                       Ortaokul / İlköğretim 
##                                         395 
##                                        Lise 
##                                         862 
##          2 veya 3 yıllık meslek yüksekokulu 
##                                         255 
## 4-5-6 yıllık fakülte / 4 yıllık yüksekokulu 
##                                         427 
##                               Yüksek lisans 
##                                          61 
##                                     Doktora 
##                                          10
attributes(TGSS$educ)
## $label
## [1] "Bitirdiğiniz en yüksek eğitim seviyesi nedir?"
## 
## $format.spss
## [1] "F8.2"
## 
## $class
## [1] "haven_labelled" "vctrs_vctr"     "double"        
## 
## $labels
##                Herhangi bir okul bitirmedim 
##                                           1 
##                                     İlkokul 
##                                           2 
##                       Ortaokul / İlköğretim 
##                                           3 
##                                        Lise 
##                                           4 
##          2 veya 3 yıllık meslek yüksekokulu 
##                                           5 
## 4-5-6 yıllık fakülte / 4 yıllık yüksekokulu 
##                                           6 
##                               Yüksek lisans 
##                                           7 
##                                     Doktora 
##                                           8

Mevcut Kategoriler (8 Grup):

  1. Herhangi bir okul bitirmedi
  2. İlkokul
  3. Ortaokul
  4. Lise
  5. Yüksekokul
  6. Üniversite (Lisans)
  7. Yüksek Lisans
  8. Doktora

Hedeflenen Yeni Kategoriler (6 Grup): Analizi kolaylaştırmak için bu 8 grup, 6 gruba düşürülmek istenmektedir. Yüksekokul ve Üniversite (5 ve 6) “Üniversite” adı altında tek bir grupta (Yeni Kod: 5); Yüksek lisans ve Doktora (7 ve 8) ise “Lisansüstü” adı altında tek bir grupta (Yeni Kod: 6) birleştirilecektir. Diğer kategoriler aynı kalacaktır.

mutate() ve case_when() ile Yeniden Kodlama (Uzun Yol)

Tidyverse paketinde mevcut durumları farklı kategorilere dönüştürürken mutate() (yeni değişken oluşturma) ve case_when() (koşullu atama yapma) fonksiyonları birlikte kullanılır.

Önemli Kurallar:

  • Mantıksal (aritmetik) eşitlik ararken tek eşittir (=) değil, çift eşittir (==) kullanılır. Tek eşittir R’da değer atama (assign) anlamına gelir.

  • Koşul sağlanıyorsa yapılacak atama işlemi için tilde (~) işareti kullanılır (“şu ise şu yap” anlamında).

Uzun Yol Kod Örneği:

TGSS <- TGSS %>%
  mutate(educ6 = case_when(
    educ == 1 ~ 1,
    educ == 2 ~ 2,
    educ == 3 ~ 3,
    educ == 4 ~ 4,
    educ == 5 ~ 5,
    educ == 6 ~ 5,
    educ == 7 ~ 6,
    educ == 8 ~ 6
  ))

Açıklama: Bu kod bloğu TGSS verisini alır, eğitim durumunu kontrol eder, örneğin educ değişkeni 6’ya eşitse bunu yeni değişkende 5 yapar; 8’e eşitse 6 yapar. Tüm bu değişikliği mevcut TGSS ’ye atamamız gerekir.Dikkat veri yapısı artık bu şekilde olur bilginize

%in% ve c() ile Çoklu Kodlama (Kısa Yol)

Kategorileri tek tek yazmak yerine, çoklu seçim yapmak ve birden fazla değeri tek seferde bir koda atamak için %in% operatörü ve c() (concatenate - birleştirme) fonksiyonu kullanılır.

TGSS <- TGSS %>%
  mutate(educ6_new = case_when(
    educ %in% c(5, 6) ~ 5,
    educ %in% c(7, 8) ~ 6,
    educ %in% 1:4 ~ educ
  ))

Açıklama:

  • educ %in% c(5, 6) ~ 5 komutu, eğitim değişkeni 5 veya 6 olanları bulup 5 olarak atar.

  • educ %in% c(7, 8) ~ 6 komutu, 7 veya 8 olanları 6 yapar.

  • educ %in% 1:4 ~ educ komutu, eğitim değeri 1’den 4’e kadar olanları orijinal değişken içerisindeki kendi orijinal numarasıyla bırakır Tüm bu değişikliği mevcut TGSS ’ye atamamız gerekir.Dikkat veri yapısı artık bu şekilde olur bilginize

3. Toplama İşlemi ile Yeni Değişken Oluşturma

mutate() fonksiyonu yalnızca kategorik gruplama için değil, mevcut değişkenler arasında sayısal işlemler yaparak yeni değişken oluşturmak için de kullanılır.

Örnek: Anne (maeduc) ve baba (paeduc) eğitim durumunu toplayarak “toplam ebeveyn eğitim puanı” (par_edu_total) elde etme.

# 1. Önce iki değişkeni de sayısal hale getirip yeni toplam değişkeni oluştur
TGSS <- TGSS %>%
  mutate(
    paeduc_num = as.numeric(paeduc),
    maeduc_num = as.numeric(maeduc),
    par_edu_total = paeduc_num + maeduc_num
  )

# 2. Yeni değişkenin frekans dağılımına bak (doğru yöntemler)
table(TGSS$par_edu_total)                    # en basit yöntem
## 
##   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16 
## 404 415 111 767 187 266 108 135  49  53  19  26   9   4   1
# veya daha güzel çıktı için:
TGSS %>%
  count(par_edu_total) %>%
  arrange(par_edu_total)
# veya janitor paketiyle (tavsiye edilir):
library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
tabyl(TGSS, par_edu_total)

Bu işlemi kalıcı hale getirmek için yeni bir veri setine veya mevcut veri seti üzerine (TGSS <- TGSS %>% ...) yeniden yazdırılması (atama yapılması) gerekmektedir.

4. Sorun Giderme ve Hata Ayıklama (Debugging)

NOT: Yukarıdaki kodlarımız kontrol edilmiş ve sorunsuz çalışmıştır arkadaşlar bilginize. Dersdeki problem TGSS veri setine yeni değişkenlerin katılması ile çözülmüştür.

Dersin son kısımlarında bazı kodlar teknik sebeplerden ötürü (Environment veya datanın yapısının bozulması) çalışmamıştır. Bu tür durumlarda veri seti ile ilgili yapılabilecek kontroller şunlardır:

  1. Değişkeni Kontrol Etmek: Yeni oluşturulan veya var olan bir değişkenin olup olmadığını kontrol etmek için tablolama veya özet alma işlemleri yapılır.
table(TGSS$educ6_new)
## 
##   1   2   3   4   5   6 
## 113 492 395 862 682  71
summary(TGSS$educ6_new)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   3.000   4.000   3.658   5.000   6.000
  1. Veri Tipini Kontrol Etmek: Hatalar bazen değişkenin metin (character), sayısal (numeric) veya double tipinde algılanmasından kaynaklanır. Bir sütunun veya objenin veri tipini anlamak için fonksiyonlar kullanılır:
typeof(TGSS$educ)
## [1] "double"
is.numeric(TGSS$educ) 
## [1] TRUE
  1. Genel Hata Ayıklama Yaklaşımı: “Unknown or uninitialized column” (Bilinmeyen veya başlatılmamış sütun) hatası alındığında veya daha önce çalışan kodlar bozulduğunda, RStudio’da Environment panelinin (hafızadaki değerlerin) temizlenmesi, ilgili paketlerin (library) ve veri setlerinin baştan yüklenmesi/çalıştırılması önerilmektedir.