Ö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.
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")
Ö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). |
facet_wrap ile Katmanlı/Bölünmüş
GrafiklerHocamı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 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 + Ü
# 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()
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()
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()
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):
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
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.
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:
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
typeof(TGSS$educ)
## [1] "double"
is.numeric(TGSS$educ)
## [1] TRUE