# Esra Cohadar
# 2025-10-07
# Ödevin Amacı
# Bu ödevin amacı, dplyr ve ggplot2 paketlerini kullanarak bir eğitim veri seti üzerinde veri düzenleme ve görselleştirme uygulamaları yapmaktır.
library (tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ 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(ggplot2)
library (readr)
"/Users/esracohadar/Desktop/student-mat.csv"
## [1] "/Users/esracohadar/Desktop/student-mat.csv"
student_mat <- read.csv2("/Users/esracohadar/Desktop/student-mat.csv",
stringsAsFactors = FALSE)
# Alıştırma 1: Veri Düzenleme
# Bu bölümde select, filter, mutate, group_by, summarise ve arrange fonksiyonları ile ilgili örneklere yer verilmiştir.
# Sütunları seçme (select ()): Bu adımda bazı temel sütunları seçiyoruz.
student_sel <- student_mat %>%
select(sex, age, failures, activities, studytime, G1, G2, G3)
head(student_sel)
## sex age failures activities studytime G1 G2 G3
## 1 F 18 0 no 2 5 6 6
## 2 F 17 0 no 2 5 5 6
## 3 F 15 3 no 2 7 8 10
## 4 F 15 0 yes 3 15 14 15
## 5 F 16 0 no 2 6 10 10
## 6 M 16 0 yes 2 15 15 15
# filtreleme (`filter()`): Bu adımda belirli bir koşula göre veri alt kümesi oluşturuyoruz. Örneğin ders çalışma süresi 2 saatten fazla olan öğrencileri seçebiliriz.
student_filtered <- student_sel %>%
filter(studytime > 2)
head(student_filtered)
## sex age failures activities studytime G1 G2 G3
## 1 F 15 0 yes 3 15 14 15
## 2 F 15 0 yes 3 10 12 12
## 3 M 15 0 no 3 14 16 16
## 4 F 16 0 yes 3 13 14 14
## 5 F 15 0 yes 3 10 9 8
## 6 M 15 0 yes 3 15 16 18
# yeni sütun oluşturma (`mutate()`): Bu adımda örnek olarak öğrencilerin haftalık ders çalışma süresine göre “Yüksek” ve “Düşük” olmak üzere iki kategori oluşturup study_level olarak bir sütun ekleyebiliriz.
student_mut <- student_filtered %>%
mutate(study_level = ifelse(studytime >= 3, "Yüksek", "Düşük"))
head(student_mut, 10)
## sex age failures activities studytime G1 G2 G3 study_level
## 1 F 15 0 yes 3 15 14 15 Yüksek
## 2 F 15 0 yes 3 10 12 12 Yüksek
## 3 M 15 0 no 3 14 16 16 Yüksek
## 4 F 16 0 yes 3 13 14 14 Yüksek
## 5 F 15 0 yes 3 10 9 8 Yüksek
## 6 M 15 0 yes 3 15 16 18 Yüksek
## 7 M 16 0 yes 3 15 16 15 Yüksek
## 8 F 15 0 yes 3 12 12 11 Yüksek
## 9 M 16 0 yes 4 19 19 20 Yüksek
## 10 F 16 0 yes 3 10 9 9 Yüksek
# özetleme: (`group_by()` + `summarise()`) bu adımda örnek olarak cinsiyete göre final notlarının ortalamasını bulabiliriz.
student_summary <- student_mut %>%
group_by(sex) %>%
summarise(ortalama_G3 = mean(as.numeric(G3)))
student_summary
## # A tibble: 2 × 2
## sex ortalama_G3
## <chr> <dbl>
## 1 F 10.8
## 2 M 13.0
# sıralama (`arrange()`): bu adımda örnek olarak öğrencileri study_level'e göre gruplayıp her grubu final notuna göre yüksekten düşüğe doğru sıralayabiliriz.
student_sorted2 <- student_mut %>%
arrange(study_level, desc(as.numeric(G3)))
head(student_sorted2, 13)
## sex age failures activities studytime G1 G2 G3 study_level
## 1 M 16 0 yes 4 19 19 20 Yüksek
## 2 F 18 0 no 3 18 18 19 Yüksek
## 3 F 18 0 no 3 19 18 19 Yüksek
## 4 M 15 0 yes 3 15 16 18 Yüksek
## 5 M 16 0 yes 3 16 18 18 Yüksek
## 6 F 17 0 no 4 18 18 18 Yüksek
## 7 F 17 0 yes 4 17 17 18 Yüksek
## 8 M 16 0 yes 3 16 17 17 Yüksek
## 9 F 18 0 no 4 16 15 17 Yüksek
## 10 M 15 0 no 3 14 16 16 Yüksek
## 11 F 15 0 no 4 16 16 16 Yüksek
## 12 F 16 0 yes 3 14 15 16 Yüksek
## 13 M 18 0 no 3 16 15 16 Yüksek
# Alıştırma 2: Görselleştirme
# Bu bölümde çeşitli grafikler ile ilgili örneklere yer verilmiştir.
ggplot(student_mat, aes(x = absences, fill = sex)) +
geom_histogram(binwidth = 3, color = "white", alpha = 0.7, position = "identity") +
scale_fill_manual(values = c("#ffde66", "#8b0a50"), name = "Cinsiyet",
labels = c("Kadın", "Erkek")) +
labs(title = "Cinsiyete Göre Devamsızlık Dağılımı",
x = "Devamsızlık Sayısı",
y = "Öğrenci Sayısı",
caption = "Grafikte görüldüğü üzere, devamsızlık sayısı 0-20 aralığında yoğunlaşmaktadır.") +
theme_minimal(base_size = 11) +
theme(text = element_text(family = "Times New Roman"))

heat_data <- student_mat %>%
group_by(school, sex) %>%
summarise(mean_G3 = mean(as.numeric(G3)), .groups = "drop")
ggplot(heat_data, aes(x = school, y = sex, fill = mean_G3)) +
geom_tile(color = "white") +
geom_text(aes(label = round(mean_G3,1)), color = "black", size = 5) +
scale_fill_gradient(low = "lightyellow", high = "darkgreen") +
labs(title = "Okul ve Cinsiyete Göre Ortalama Final Notu",
x = "Okul", y = "Cinsiyet", fill = "Ortalama G3") +
theme_minimal(base_size = 11) +
theme(text = element_text(family = "Times New Roman"))

# Grafik iki okuldaki (GP: Gabriel Pereira ve MS: Mousinho da Silveira) öğrencilerin cinsiyetlerine göre ortalama final notlarını karşılaştırmaktadır. Genel GP okulundaki öğrencilerin notları, MS okulundakilere göre daha yüksektir. GP’de erkek öğrenciler (11.1) en yüksek ortalamaya sahiptir; bunu GP’deki kız öğrenciler (10.0) izlemektedir. MS okulunda ise kız (9.9) ve erkek (9.8) öğrencilerin not ortalamaları birbirine oldukça yakındır. Bu durum okullar arası performans farkının, cinsiyet farkından daha belirgin olduğunu düşündürmektedir. Başka bir deyişle not ortalamalarını açıklamada okul faktörü, cinsiyet faktörüne kıyasla daha etkili görünmektedir.
ggplot(student_mat, aes(x = as.factor(health), y = as.numeric(Walc), fill = sex)) +
geom_boxplot(alpha = 0.7, outlier.shape = 21, outlier.color = "darkviolet") +
facet_wrap(~sex) +
labs(title = "Sağlık Durumu ve Hafta Sonu Alkol Tüketimi",
x = "Sağlık Durumu (1=çok kötü, 5=çok iyi)",
y = "Hafta Sonu Alkol Tüketimi (1-5)") +
theme_minimal(base_size = 11) +
scale_fill_manual(values = c("#B388EB", "#D8BFD8")) +
theme(plot.title = element_text(face = "bold", color = "#4B0082"))

# Sağlık durumu ile hafta sonu alkol tüketimi arasında cinsiyete göre farklı eğilimler görülmektedir. Kadın öğrencilerde sağlık düzeyi arttıkça alkol tüketiminde belirgin bir değişim gözlenmemektedir. Erkek öğrencilerde ise sağlık düzeyi yükseldikçe tüketim eğilimi hafif artmaktadır. Sağlık puanı 1 olan erkeklerde medyan 1,5 civarındayken, sağlık puanı 5 olanlarda medyan 3’e kadar çıkmaktadır. Bu durum erkeklerde daha iyi sağlık algısının hafta sonu alkol tüketimini azaltmak yerine artırabildiğini düşündürmektedir.
# R Markdown Günlüğü
# Derste kullandığımız kaynaklardan birinde de belirtildiği gibi, R Markdown, veri bilimi yapmak için bir ortamdır; modern bir laboratuvar defteri gibi, sadece ne yaptığınızı değil, ne düşündüğünüzü de kaydedebilirsiniz. Örgü örme konusunda yetenekli biriyim, gerçek örgüden bahsediyorum :) Birinin üzerinde örgü bir kıyafet gördüğümde, sadece dıştan nasıl göründüğünü değil, iplerin ve ilmeklerin kıyafetin iç yüzünde nasıl birleştiğini de hayal ederek, tasarımın bir modelini veya taslağını çıkarabilirim. R Markdown’da Source sekmesi, örgü tasarımında ilmeklerin nasıl birleştirileceğini planladığımız kısım gibi; kod ve yapıyı görebildiğimiz teknik alan. Visual sekmesi ise, örgü kıyafetin dışarıdan nasıl görüneceğini ayarladığımız, çıktıyı görselleştirdiğimiz alan gibi. R Markdown’daki chunk’lar, kod ve çıktıyı birbirine bağlayan küçük yapı taşları; aynı benzetmeden ilerleyecek olursam her chunk, tek bir örgü parçası veya motif gibi düşünülebilir. Hepsi birleştiğinde R Markdown hem detayları hem de son görünümü aynı anda takip edebildiğim bir kullanım sunuyor.