library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.1 ✔ stringr 1.5.2
## ✔ ggplot2 4.0.0 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── 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(haven)
library(openintro)
## Zorunlu paket yükleniyor: airports
## Zorunlu paket yükleniyor: cherryblossom
## Zorunlu paket yükleniyor: usdata
Okumam için verilen kaynaklardan ilkinde (Atalay Kabasakal & Gören, 2025) veri düzenleme, görselleştirme ve özetleme konuları ele alınmış.Diğer iki kaynağın odağını is veri görselleştirme konusu oluşturmaktadır. Üç kaynağı birlikte ele aldığımda yaptığımız işin aslında dört başlık altında incelenebileceğini düşündüm. Bu başlıkları aşağıda tek tek açıklamaya çalıştım:
Veriyi düzenlemeyi, veriyi anlamanın ve veri ile hangi istatistiksel işlemlerin yapılabileceğini görmenin ilk adımı olarak görebiliriz. Ayrıca veri düzenleme yaptığımız analizleri ilgili bağlam çerçevesinde yorumlayabilmek için son derece önemli ve gereklidir. Doğru bir şekilde grafikler oluşturmak ve hangi grafiklerin veriye uygun olduğunu anlamak için de veri düzenlemenin çok önemli olduğunu düşünüyorum. Veri düzenleme ile kendimize analiz sürecini doğru yürütebileceğimiz sorular sorma ve bu sorular cevaplar bulma imkanımız olur.
Kaynaklardan ve şimdiye kadar derslerden öğrendiğim kadarıyla R ile veriyi anlamak için “dplyr” paketinin fonksiyonlarından faydalanabilirim. Bu bağlamda aklımda kalan fonksiyonlardan şu anki bilgimle önemli bulduklarımı (Zira bilgi gelişince önem ve önceliklerin değişmesi öğrenmenin doğasında var.) anladığım kadarıyla kısaca açıklamaya çalışacağım.
head: Veri setinin ilk 6 satırını
görmeye yarar. Böylece verinin istenilen şekilde yüklenip yüklenmediği
anlaşılabilir. head(veri) şeklinde kullanılınca ilk 6 satır
veya head(veri, n=10)şeklinde kullanınca istediğimiz sayıda
satır görüntüleyebiliriz.
glimpse: Veri setinin boyutlarını ev
her bir değişkenin tipini incelemek için bu fonksiyondan faydalanırız.
glimpse (veri) şeklinde kullanılır.
distinct: Bu fonksiyon ile veri
setindeki değişkenlerin kategorilerini anlayabiliriz. Örneğin okul türü
adında bir değişkenimiz olsun; bu fonksiyon ile “ilkokul, ortaokul,
lise” gibi kategoriler olduğunu ve daha önemlisi aslında veride olmaması
gereken veya yanlış bir kategorinin veri setine karışıp karışmadığını
tespit etmeye yarar. distinct(veri, degisken1) şeklinde
kullanılır.
filter: Belirtilen koşullara göre veri
setinden ilgilendiğimiz verileri filtrelemeye yarar. Örneğin yukarıdaki
örnekte okul türlerinden sadece ilkokul ile ilgilenmek istiyorsak bu
fonksiyondan faydalanabiliriz. filter(veri, kosul1, kosu2)
şeklinde kullanılır.
select: Veri setinde ilgilendiğimiz
sütunları seçmeye veya hariç tutmaya yarar. Böylece büyük bir veri
setinden sadece analizde ihtiyaç duyacağımız değişkenleri seçerek veri
setini sadeleştirebiliriz. starts_with() veya
matches() gibi yardımcı fonksiyonlarla birlikte toplu
seçimler de yapabiliriz. select(veri, degsiken1, degisken2)
şeklinde kullanınca ilgili değişkenleri seçer. Veri setinden
belirttiğimiz ifade (örneğin:AAA) ile başlayanları seçmek için:
AAA_ile_baslayan<-veri %>%
select(starts_with("AAA"))
Veri setinden içinde belli ifadeler(örneğin:AAA_BBB) geçen değişkenleri seçmek için:
BBB_veri<-veri %>%
select(matches("BBB"))
mutate: Yeni sütunlar oluşturup bu
sütunları veri setine dahil eder. Veriden yeni bilgiler türetmek için
kullanabiliriz. Örneğin öğrencilerin vize ve final notlarının
ortalmasını geçme notu olarak hesaplayıp yeni bir sütun olarak veriye
ekleyebiliriz.
veri %>% mutate(gecme_notu = (vize + final)/2
transmute: mutate gibi
yeni sütun oluşturur. Ancak oluşturulan bu sütun ve belirttiğimiz
değişkenlerden oluşan bir veri seti oluşur.
gecme_notu <- veri %>%transmute(Ogrenci_No = Ogrenci_No,gecme_notu = (vize + final)/2)
unite: Birden fazla sütunu tek bir
sütunda birleştirir. Örneğin veri setinde iki ayrı sütunda “Ad” ve
“Soyad” isimli iki değişken olduğu bir durumda bu fonksiyon ile
“Ad_Soyad” isimli tek bir sütunda toplanabilir.
yeni_ad_soyad <- veri %>% unite(col = "Ad_Soyad", c(Ad, Soyad), sep = " ")
separate:Tek bir sütunu, bir ayırıcıya
göre birden fazla yeni sütuna ayırır. Örneğin veri setinde “Ad_Soyad”
isimli tek bir değişken olduğu bir durumda, bu fonksiyon ile “Ad” ve
“Soyad” isimli iki ayrı sütun oluşturulabilir. unite
fonksiyonunun tersi gibi düşünebiliriz.
ad_soyad_ayri<- veri %>% separate(col = Ad_Soyad,into = c("Ad", "Soyad"),sep = " ")
as_factor: SPSS’ten alınan verilerde
sayısal değerle ifade edilen etiket değerlerini R’da analize uygun
kategorik değerlere dönüştürebiliriz. Örneğin Kadın=1 ve Erkek=2
şeklinde kodlanmış bir SPSS verisinde bu fonksiyon ile 1’ler “Kadın”,
2’leri “Erkek” olarak faktör değişkene çevrilebilir.
mutate(across(where(is_labelled), as_factor)) kalıbıyla
kullanılır.
Veriyi genel hatlarıyla inceledikten sonra özetlemek hem araştırmacının veriyi anlamasına katkı sağlayacak hem de araştırma raporunu yazarken ihtiyaç duyulan pek çok bilgi sağlayacaktır. Bu kısmı SPSS’te betimeyici istatistikler dediğimiz analizlere benzetiyorum. Ancak öğrendikçe R ile çok daha etkili betimleyici analiz yapıldığını öğreniyorum. Burada kaynaklardan öğrenebildiğim fonksiyonları kendi bakış açımla ifade etmeye çalışacağım.
summary: İlgilendiğimiz değişkenin altı
temel istatistiğini ((Minimum, İlk Çeyrek, Medyan, Ortalama, Üçüncü
Çeyrek, Maksimum) verir. summary(veri$degisken) veya
summary(veri) şeklinde kullanabiliriz.
mean: Değişkenin aritmetik ortalamasını
hesaplar. mean(veri$degisken) kalıbıyla kullanılır.
(na.rm = TRUE) koda eklenince kayıp veriler dikkate
alınmadan ortalama hesaplanır. Bu fonksiyona benzer biçimde
median(), min(), max(), sd() ve var()
fonksiyonları da kullanılabilir.
quantile(): Değişkenlerin yüzdelik
dilimlerini hesaplamak için kullanabiliriz. Varsayılan olarak 0, 25, 50,
ve 100’lük şekilde hesaplar. Ancak herhangi bir yüzde(örneğin 60)
belirterek de hesaplama yapabiliriz.
İlk durum için quantile(veri$"degisken", na.rm = TRUE)
şeklinde kullanabiliriz. İkinci durum için ise
quantile(veri$"degisken", probs = 0.60, na.rm = TRUE) kodu
kullanılabilir.
count(): Kategorik değişkenlerdeki her
bir kategorinin kaç kez tekrar ettiğini saydırmak için kullanabiliriz.
veri %>% count(degisken1, degisken2, sort = TRUE)
şeklinde kullanabiliriz.
group_by(): summarise ve
mutate gibi fonksiyonlarla birlikte kullanılarak analizin
değişkendeki alt gruplara göre yapılmasını sağlar. Örneğin kız ve erkek
öğrencilerin ortalamaları ayrı hesaplamak için kullanabiliriz.
cinsiyete_gore_ortalamalar <- veri %>% group_by(cinsiyet)%>%
summarise( ortalama_okuma_puani = mean(degisken, na.rm = TRUE))
across(): summarise ve
mutate fonksiyonları ile birlikte kullanılır. Yapılan
işlemin tek seferde birden fazla sütuna uygulanmasını sağlar. Örneğin
farklı puanlara ait ortalamaları tek seferde hesaplamak için
kullanabiliriz.
puan_ortalamalari<-veri %>% summarise(across(c(puan1,puan2,puan3),mean,na.rm = TRUE))
Verileri özetledikten sonra görsel olarak ele almak veriyi anlamak ve anlatmak için önemli bir adımdır. Bu adımda R’ın ggplot2 paketinin fonksiynlarından faydalanabiliriz. ggplot2 paketi fonksiyonları ile grafikler oluşturulurken + opratörü katmanlı yapı mantığı ile kullanılır.
ggplot : Grafik için temel katmanı
oluşturur. Bu komut ile R’a grafik çizeceğimizi bildirmiş oluruz. Grafik
çizilecek veri setini ve aes fonksiyonunu tanımlamak için
kullanılır.
ggplot(data = veri, mapping = aes(x = degisken1, y = degisken2))
aes: Veri setindeki değişkenlerin
yerini ve görsel özelliklerini tanımladığımız fonksiyondur.
geom_bar: Çubuk garfik oluşturur.
geom_histogram: Histogram grafiği
oluşturur. bindwith sçeneği ile sayısal veri kategoriler
ayrılabilir.
geom_density: Sayısal değişkenler için
yoğunluk grafiği oluşturur.
geom_boxplot: Kutu grafiği
oluşturur.
geom_dotplot: Saçılım grafiği
oluşturur.
geom_col() + coord_polar(): Bu iki
fonksiyon birlikte kullanılarak pasta grafiği oluşturulabilir.
ggplot(veri, aes(x ="", y = oranlar, fill = kategoriler)) +
geom_col(width = 1) + coord_polar("y")
position: geom_bar ile
oluşturulmuş grafikleri karşılaştırma yapabilmek için yan yana dizmeye
yarar. fill Her çubuğun toplam yüksekliğini %100’e (veya
1’e) eşitler ve çubuk içindeki kategorilerin “oransal” dağılımını
gösterir.
ggplot(veri, aes(x = SINIF, fill = CINSIYET)) +
geom_bar(position = "dodge")
facet_wrap() / facet_grid(): Grafiği,
bir veya iki kategorik değişkenin seviyelerine göre alt grafiklere
ayırır . facet_wrap() genellikle tek bir değişkene göre
ayırmak için, facet_grid() ise iki değişkene göre (satır ve
sütun matrisi şeklinde) ayırmak için kullanılır.
... + facet_wrap(~ CINSIYET)
alpha: Şeffaflık seviyesini belirlemek
için kullanılır. Böylelikle fark daha net gözlemlenebilir.
geom_density_ridges(): Farklı gruplar
için yoğunluk grafiklerini üst üste binmeden, bir “dağ silsilesi” gibi
kademeli bir düzende gösterir.
ggplot(veri,aes(x = OKUMA PUANI, y=SINIF, fill= SINIF)) +
geom_density_ridges()
labs: Grafiğin etiketlerini düzenlemek
için kullanılır.
... +
labs(title = "Öğrenci Puan Dağılımı",
x = "Okuma Puanı",
y = "Frekans", fill = "Cinsiyet")
theme: Veri dışındaki arka plan gibi
görsel unsurları düzenlemek için kullanılır.
geom_text: Grafiğe metin katmanı
eklemek için kullanılır.
plot_ly(): Etkileşimli grafikler
oluşturmaya yarayan ana fonksiyondur.
Veri seti olarak PIRLS 2021 Türkiye verilerinin özel bir versiyonundan yararlandım. Bu veri seti PIRLS 2021 döngüsüne ait daha önce bir araya getirdiğim öğrenci ve okul verilerini içeren bir SPSS veri dosyasıdır. Dosya 6032 öğrenci ve 191 okula ait;okul ID, Öğrenci ID, öğrenci (okumayı sevme, cinsiyet, okuma konusunda özgüven vb.) ve okullara (disiplin problemleri, akademik başarıya verilen önem, sosyoekonomi vb) ilişkin kategorie edilmiş çeşitli değişkenler ve öğrencileri olası okuma puanları var. Bu veri setini daha önce yüksek lisans tezimde kullanmıştım ve analizimi MPlus ile yapmıştım. Ancak biraz R öğrenince o zaman R bilseydim şunları da yapardım dediğim çok husus oldu. Veri setini tercih etmemdeki ilk neden bu ikinci neden ise çok sayıda öğrenciden alınmış oldukça kaliteli verilerle bir şeyler yapmayı denemek.
Sch_Std <- read_sav("Sch_Std.sav")
glimpse(Sch_Std)
## Rows: 6,032
## Columns: 20
## $ IDSCHOOL <dbl> 5001, 5001, 5001, 5001, 5001, 5001, 5001, 5001, 5001, 5001, 5…
## $ IDSTUD <dbl> 50010601, 50010602, 50010603, 50010604, 50010605, 50010607, 5…
## $ ITSEX <dbl+lbl> 2, 2, 2, 2, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 2, 1, 1, 1, 2, …
## $ ASDGSEC <dbl+lbl> 1, 3, 2, 1, 3, 2, 1, 3, 1, 2, 2, 2, 1, 2, 1, 2, 2, 2, 1, …
## $ ASDGSSB <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, …
## $ ASDGSB <dbl+lbl> 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, …
## $ ASDGERL <dbl+lbl> 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 1, …
## $ ASDGDRL <dbl+lbl> 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, …
## $ ASDGSLR <dbl+lbl> 2, 2, 1, 1, 1, 2, 1, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 1, 1, …
## $ ASDGHRL <dbl+lbl> 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, …
## $ ASDGSCR <dbl+lbl> 2, 1, 2, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, …
## $ ACDGRRS <dbl+lbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
## $ ACDGEAS <dbl+lbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, …
## $ ACDGDAS <dbl+lbl> 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, …
## $ ACDGSBC <dbl+lbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
## $ ASRREA01 <dbl+lbl> 575.4389, 624.1437, 566.9780, 559.1095, 569.8236, 599.029…
## $ ASRREA02 <dbl+lbl> 557.2702, 612.6839, 568.7682, 606.6993, 570.4883, 594.515…
## $ ASRREA03 <dbl+lbl> 561.9532, 544.7382, 532.7829, 618.6042, 577.8663, 535.789…
## $ ASRREA04 <dbl+lbl> 573.6631, 503.8760, 529.9671, 537.0766, 581.3183, 546.127…
## $ ASRREA05 <dbl+lbl> 567.4520, 556.7769, 574.7689, 578.1380, 563.8770, 568.321…
Veri setinde çeşitli kodlarla belirtilen değişkenlerin ismini Türkçe yaptım.
pirls_turkce<- Sch_Std%>%
rename(
okul_id=IDSCHOOL,
ogrenci_id=IDSTUD,
cinsiyet=ITSEX,
dijital_ozyeterlik=ASDGSEC,
okula_aidiyet=ASDGSSB,
zorbalik=ASDGSB,
derse_katilim=ASDGERL,
Duzeni_Bozan_Davr = ASDGDRL,
Okumay_Sevme = ASDGSLR,
Ev_Kaynaklari = ASDGHRL,
Okuma_Guven = ASDGSCR,
Kaynak_Eksikligi = ACDGRRS,
Akademik_Vurgu = ACDGEAS,
Okul_Disiplini = ACDGDAS,
Ogrenci_Arkaplan = ACDGSBC
)
Veri setindeki olası değerlerden ortalama bir okuma puanı hesapladım. Bu puanı hesaplarken daha önce kullanmadığım haven paketini kullanmam gerekti. Bu paketin SPSS verilerini okumakta kullanıldığını öğrendim.
ortalamali_okuma <- pirls_turkce %>%
rowwise() %>%
mutate(
Ortalama_Okuma = mean(
c(zap_labels(ASRREA01),
zap_labels(ASRREA02),
zap_labels(ASRREA03),
zap_labels(ASRREA04),
zap_labels(ASRREA05)),
na.rm = TRUE
)
) %>%
ungroup()
Olası okuma puanları ile ortalama puan arasındaki ilişkiyi incelemeye çalıştım. Yapay zeka bunu yapabilmem için veriyi önce uzun formata çevirmem gerektiğini söyledi. Önce veriyi dönüştürüp daha sonra grafik çizdirdim.
ortalamali_okuma_yatay <- ortalamali_okuma %>%
mutate(across(starts_with("ASRREA"), zap_labels)) %>%
pivot_longer(
cols = starts_with("ASRREA"),
names_to = "Olasi_Puan",
values_to = "Olasi_Puan_Degeri"
)
Olası puanlar ile okuma puanları arsında çok yüksek bir ilişki olduğunu düşünüyordum ancak biraz farklılık olacağını sandım. Bunu test etmek için korelasyon hesaplayıp grafiğe ekledim. Bu kısımda oldukça zorlandım, yapay zeka yardımı aldım. Tüm olası puanlarla ortalam puanın korelasyonu eşit çıktı. Hata yapmış olabilir miyim? Yoksa bu kadar büyük örenklemde IRT kusursuz sonuç
cor_labels <- ortalamali_okuma_yatay %>%
group_by(Olasi_Puan) %>%
summarise(
R_degeri = cor(Olasi_Puan_Degeri, Ortalama_Okuma, use = "pairwise.complete.obs")
) %>%
mutate(
Etiket = paste0("r = ", round(R_degeri, 2))
)
ggplot(ortalamali_okuma_yatay, aes(x = Olasi_Puan_Degeri, y = Ortalama_Okuma)) +
geom_point(alpha = 0.2, color = "blue") +
geom_smooth(method = "lm", se = FALSE, color = "red", linewidth = 0.5) +
geom_text(
data = cor_labels,
aes(x = 250, y = 750, label = Etiket),
hjust = 0,
color = "black",
fontface = "bold"
) +
facet_wrap(~ Olasi_Puan, ncol = 3) +
labs(
title = "Tüm Olası Puanların Ortalama Okuma Puanı ile İlişkisi",
x = "Olası Puan Degeri",
y = "Ortalama Okuma Puani",
caption = "PIRLS 2021 TUrkiye"
) +
theme_light()
## `geom_smooth()` using formula = 'y ~ x'
Yorum:Grafikte beş olası okuma puanı ile bu puanların ortalamaları arasındaki ilişki incelenmiştir. Tüm olası puanlar ile ortalama okuma puanı ilişkisi yüksek, doğrusal ve pozitiftir. Olası puanlar ile ortalama puanın bu kadar yüksek düzeyde (r=0.96, tüm olası puanlar için) olası değerlerin tutarlılığını göstermektedir. İki sayısal değişken arasındaki ilişkiyi göstermek için uygun bir grafik seçtiğimi düşünüyorum.
Öğrencilerin ortalama okuma puanlarının dijital öz yeterlik düzeyine göre nasıl değiştiğini inceledim.
ozet_veri <- ortalamali_okuma %>%
filter(!is.na(dijital_ozyeterlik)) %>%
group_by(dijital_ozyeterlik) %>%
summarise(
OrtalamaPuan = mean(Ortalama_Okuma, na.rm = TRUE),
n = n(),
.groups = 'drop'
) %>%
mutate(
dijital_etiket = factor(
dijital_ozyeterlik,
levels = c(1, 2, 3),
labels = c("Yuksek", "Orta", "Dusuk")
)
)
ggplot(ozet_veri,
aes(x = dijital_etiket, y = OrtalamaPuan, fill = dijital_etiket)) +
geom_col(show.legend = FALSE) +
geom_text(
aes(label = round(OrtalamaPuan, 1)),
vjust = -0.5,
color = "black",
size = 5,
fontface = "bold"
) +
ylim(0, max(ozet_veri$OrtalamaPuan) * 1.1) +
labs(
title = "Dijital Oz Yeterlik - Okuma Puanlari",
x = "Dijital Oz Yeterlik",
y = "Ortalama Okuma Puani"
) +
theme_minimal()
Yorum: Grafiğe göre dijital öz yeterlik algısı arttıkça okuma puanı belirgin bir şekilde artıyor. Orta düzeyde öz yeterliğe sahip öğrencilerin okuma puanı düşük özyeterliğe sahip olanlarınkinden yaklaşık 32 puan daha yüksek iken yüksek öz yeterliğe sahip öğrencilerin okuma puanından 22 paun daha düşük. Öz yeterliği düşük olanlar ile yüksek olanların puanları arasında özyeterliği yüksek olanlar lehine yaklaşık 54 puan fark var.
Bu garfik sadece ortalamaları karşılaştırma imkanı veriyor ancak kutu grafiği ile daha detaylı inceleme yapma imkanı olabilirdi.
Öğrencilerin okuma puanlarının dağılımının cinsiyete göre okumayı sevme durumları ile ilişkisini inceledim.
genel_ortalama <- mean(ortalamali_okuma$Ortalama_Okuma, na.rm = TRUE)
plot_data <- ortalamali_okuma %>%
filter(!is.na(Okumay_Sevme) & !is.na(cinsiyet) & !is.na(Ortalama_Okuma)) %>%
mutate(
Okumay_Sevme_Etiket = factor(
Okumay_Sevme,
levels = c(3, 2, 1),
labels = c("Dusuk", "Orta", "Yuksek")
),
Cinsiyet_Etiket = factor(
cinsiyet,
levels = c(1, 2),
labels = c("Kiz", "Erkek")
)
) %>%
filter(!is.na(Okumay_Sevme_Etiket) & !is.na(Cinsiyet_Etiket))
ggplot(plot_data,
aes(x = Okumay_Sevme_Etiket, y = Ortalama_Okuma, fill = Cinsiyet_Etiket)) +
geom_boxplot(position = "dodge") +
geom_hline(
yintercept = genel_ortalama,
linetype = "dashed",
color = "black",
linewidth = 1
) +
labs(
title = "Okumayi Sevme ve Cinsiyete Gore Okuma Puani Dagilimi",
x = "Okumayi Sevme Seviyesi",
y = "Ortalama Okuma Puani",
fill = "Cinsiyet"
) +
theme_minimal()
Yorum: Grafikte okumayı sevme düzeyi ile okuma başarısı arasında her iki cinsiyet açısından net bir ilişki olmadığı görülmektedir. Düşük okuma sevgisine sahip yüksek puanı olan öğrenciler olduğu gibi okumayı çok sevdiğini beyan ettiği halde okuma puanı düşük uç değer düzeyinde çok sayıda öğrenci vardır..
Bu grafiğin ele aladığım ilişki için son derec uygun olduğunu düşünüyorum. Grafiğe her bir kategorideki öğrenci sayısını ekleyebilseydim güzel olurdu ancak denediğimde hata verdi. Yorgundum çok fazla uğraşmadım.
Kız ve erkek öğrencilerin ortalama okuma puanlarını yoğunluk grafiği ile gösterdim.
cinsiyet_ortalamalari <- plot_data %>%
group_by(Cinsiyet_Etiket) %>%
summarise(
Grup_Ortalamasi = mean(Ortalama_Okuma, na.rm = TRUE)
)
print(cinsiyet_ortalamalari)
## # A tibble: 2 × 2
## Cinsiyet_Etiket Grup_Ortalamasi
## <fct> <dbl>
## 1 Kiz 511.
## 2 Erkek 495.
ggplot(plot_data,
aes(x = Ortalama_Okuma, fill = Cinsiyet_Etiket, color = Cinsiyet_Etiket)) +
geom_density(alpha = 0.5) +
geom_vline(
data = cinsiyet_ortalamalari,
aes(xintercept = Grup_Ortalamasi, color = Cinsiyet_Etiket),
linetype = "dashed",
linewidth = 1,
show.legend = FALSE
) +
geom_text(
data = cinsiyet_ortalamalari %>% filter(Cinsiyet_Etiket == "Erkek"),
aes(x = 250, y = 0.0035,
label = paste("Erkek Ort:\n", round(Grup_Ortalamasi, 1)),
color = Cinsiyet_Etiket),
fontface = "bold",
size = 4.5,
show.legend = FALSE
) +
geom_text(
data = cinsiyet_ortalamalari %>% filter(Cinsiyet_Etiket == "Kiz"),
aes(x = 700, y = 0.0035,
label = paste("Kiz Ort:\n", round(Grup_Ortalamasi, 1)),
color = Cinsiyet_Etiket),
fontface = "bold",
size = 4.5,
show.legend = FALSE
) +
labs(
title = "Cinsiyete Gore Ortalama Okuma Puani Dagilimi",
x = "Ortalama Okuma Puani",
y = "Yogunluk",
fill = "Cinsiyet",
color = "Cinsiyet"
) +
theme_minimal()
Yorum: Grafikten kızların ortalama okuma puanlarının erkeklerden yüksek olduğu net bir şekilde anlaşılmaktadır. Grafikte örtüşen alanın büyük olması kız ve erkek öğrenciler arasında çok sayıda benzer puana sahip öğrenci olduğu şeklinde yorumlanabilir.
Bu grafik kutu grafiği ile birlikte yorumlanınca daha anlamlı olacaktır.
Öğrencilerin okuma puanlarının değişiminin cinsiyete göre okumayı sevme durumları ile ilişkisini inceledim.
trend_data <- plot_data %>%
group_by(Okumay_Sevme_Etiket, Cinsiyet_Etiket) %>%
summarise(
OrtalamaPuan = mean(Ortalama_Okuma, na.rm = TRUE),
.groups = 'drop' # Gruplamayı otomatik kaldır
)
ggplot(trend_data,
aes(x = Okumay_Sevme_Etiket, y = OrtalamaPuan,
color = Cinsiyet_Etiket, group = Cinsiyet_Etiket)) +
geom_line(linewidth = 1.2) +
geom_point(size = 3) +
geom_text(
aes(label = round(OrtalamaPuan, 0)),
vjust = -1,
fontface = "bold",
show.legend = FALSE
) +
ylim(min(trend_data$OrtalamaPuan) * 0.95, max(trend_data$OrtalamaPuan) * 1.05) +
# Odev sartlari: labs() ve theme()
labs(
title = "Okumayi Sevme Duzeyine Gore Ortalama Okuma Puani",
x = "Okumayi Sevme Seviyesi",
y = "Ortalama Okuma Puani",
color = "Cinsiyet"
) +
theme_minimal() +
theme(legend.position = "top")
Yorum: Grafiğe göre tüm düzeylerde kızların okuma puanları erkeklerden daha yüksek. Ancak her iki cinsiyet için “düşük” okuma sevgisinden “orta” okuma sevgisine geçişte önemli bir değişiklik olmazken “orta” okuma sevgisinden “yüksek” okuma sevgisine geçişte öğrencilerin okuma puanları anlamlı bir şekilde artıyor. Bu grafiğin de amaca çok uygn olduğunu düşünüyorum.
Bu dersi çok sevmeme rağmen bu güne kadar günlük yazma olanağım yoktu. Ancak bundan sonra düzenli ve etkili günlük yazacağım. Bu gün daha ziyade R ve ders hakkındaki düşüncelerimi ifade etmeye çalışacağım. Daha sonraki günlüklerim bilgi içerikli olacak.
R dersini aldığımız günden beri defalarca keşke yüksek lisans tezimi yazarken bunu bilseydim diye içimden geçti. Hatta o zaman analizlerimi MPlus ile yaptım veMplus’ı öğrenmek için yoğun bir çaba ve zaman harcadım. Şimdi keşek aynı analizleri R ile yapmayı öğrenmeyi denesymişim diyorum. Bu düşüncemdeki temel etken MPlus’u öyle detaylı öğrenememiş olsam da şu ana kadar öğrendiğimle bile R olanaklarının çok daha fazla olduğunu ve öğrenme için kaynakların daha etkili olduğunu düşünüyorum.
R dersi benim açımdan R ile neler yapılabileceğini gözlemlediğim keyifli bir yolculuk. Neler yapılabildiğini görünce nasıl yapıldığını bir şekilde öğreneceğimi düşünüyorum. Bu yüzden fonksiyon isiimlerinin zihnimde kalmayışını çok dert etmiyorum. Daha çok yeniyim, bilmiyorum…Belki de dert etmeliyim veya daha çok analiz yapınca fonksiyonlar aklımda kalmaya başlayacak.
Ödevlerimi yaparken sık sık yapay zeka desteği alıyorum. Tecrübeme göre denediklerim arasında R için en az hatalı kodları Claude AI yazıyor. Belki daha iyi yapay zeka araçları vardır, henüz keşfetmedim.