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
mat_data<- read_delim("student-mat(in).csv",
delim = ";",
escape_double = FALSE,
trim_ws = TRUE)
## Rows: 395 Columns: 33
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr (17): school, sex, address, famsize, Pstatus, Mjob, Fjob, reason, guardi...
## dbl (16): age, Medu, Fedu, traveltime, studytime, failures, famrel, freetime...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
glimpse(mat_data)
## Rows: 395
## Columns: 33
## $ school <chr> "GP", "GP", "GP", "GP", "GP", "GP", "GP", "GP", "GP", "GP",…
## $ sex <chr> "F", "F", "F", "F", "F", "M", "M", "F", "M", "M", "F", "F",…
## $ age <dbl> 18, 17, 15, 15, 16, 16, 16, 17, 15, 15, 15, 15, 15, 15, 15,…
## $ address <chr> "U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U", "U",…
## $ famsize <chr> "GT3", "GT3", "LE3", "GT3", "GT3", "LE3", "LE3", "GT3", "LE…
## $ Pstatus <chr> "A", "T", "T", "T", "T", "T", "T", "A", "A", "T", "T", "T",…
## $ Medu <dbl> 4, 1, 1, 4, 3, 4, 2, 4, 3, 3, 4, 2, 4, 4, 2, 4, 4, 3, 3, 4,…
## $ Fedu <dbl> 4, 1, 1, 2, 3, 3, 2, 4, 2, 4, 4, 1, 4, 3, 2, 4, 4, 3, 2, 3,…
## $ Mjob <chr> "at_home", "at_home", "at_home", "health", "other", "servic…
## $ Fjob <chr> "teacher", "other", "other", "services", "other", "other", …
## $ reason <chr> "course", "course", "other", "home", "home", "reputation", …
## $ guardian <chr> "mother", "father", "mother", "mother", "father", "mother",…
## $ traveltime <dbl> 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 3, 1, 2, 1, 1, 1, 3, 1, 1,…
## $ studytime <dbl> 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 1, 2, 3, 1, 3, 2, 1, 1,…
## $ failures <dbl> 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0,…
## $ schoolsup <chr> "yes", "no", "yes", "no", "no", "no", "no", "yes", "no", "n…
## $ famsup <chr> "no", "yes", "no", "yes", "yes", "yes", "no", "yes", "yes",…
## $ paid <chr> "no", "no", "yes", "yes", "yes", "yes", "no", "no", "yes", …
## $ activities <chr> "no", "no", "no", "yes", "no", "yes", "no", "no", "no", "ye…
## $ nursery <chr> "yes", "no", "yes", "yes", "yes", "yes", "yes", "yes", "yes…
## $ higher <chr> "yes", "yes", "yes", "yes", "yes", "yes", "yes", "yes", "ye…
## $ internet <chr> "no", "yes", "yes", "yes", "no", "yes", "yes", "no", "yes",…
## $ romantic <chr> "no", "no", "no", "yes", "no", "no", "no", "no", "no", "no"…
## $ famrel <dbl> 4, 5, 4, 3, 4, 5, 4, 4, 4, 5, 3, 5, 4, 5, 4, 4, 3, 5, 5, 3,…
## $ freetime <dbl> 3, 3, 3, 2, 3, 4, 4, 1, 2, 5, 3, 2, 3, 4, 5, 4, 2, 3, 5, 1,…
## $ goout <dbl> 4, 3, 2, 2, 2, 2, 4, 4, 2, 1, 3, 2, 3, 3, 2, 4, 3, 2, 5, 3,…
## $ Dalc <dbl> 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1,…
## $ Walc <dbl> 1, 1, 3, 1, 2, 2, 1, 1, 1, 1, 2, 1, 3, 2, 1, 2, 2, 1, 4, 3,…
## $ health <dbl> 3, 3, 3, 5, 5, 5, 3, 1, 1, 5, 2, 4, 5, 3, 3, 2, 2, 4, 5, 5,…
## $ absences <dbl> 6, 4, 10, 2, 4, 10, 0, 6, 0, 0, 0, 4, 2, 2, 0, 4, 6, 4, 16,…
## $ G1 <dbl> 5, 5, 7, 15, 6, 15, 12, 6, 16, 14, 10, 10, 14, 10, 14, 14, …
## $ G2 <dbl> 6, 5, 8, 14, 10, 15, 12, 5, 18, 15, 8, 12, 14, 10, 16, 14, …
## $ G3 <dbl> 6, 6, 10, 15, 10, 15, 11, 6, 19, 15, 9, 12, 14, 11, 16, 14,…
select
Komutu ile Belirli Sütunları Seçme: Öğrencinin
Okulu, Cinsiyeti, Yaşı, Annenin Eğitim Düzeyi ve Final Notu
değişkenlerini seçerek yeni bir tablo oluşturdum. Dah sonra bu
değişkenlere Türkçe isim verdim.
secilen_degiskenler <- mat_data %>%
select(school, sex, age, Medu,G3)
secilen_degiskenler %>%
rename(
Okul=school,
Cinsiyet=sex,
Yas=age,
Anne_Egitim_Duzeyi=Medu,
Final=G3
)
## # A tibble: 395 × 5
## Okul Cinsiyet Yas Anne_Egitim_Duzeyi Final
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 GP F 18 4 6
## 2 GP F 17 1 6
## 3 GP F 15 1 10
## 4 GP F 15 4 15
## 5 GP F 16 3 10
## 6 GP M 16 4 15
## 7 GP M 16 2 11
## 8 GP F 17 4 6
## 9 GP M 15 3 19
## 10 GP M 15 3 15
## # ℹ 385 more rows
Gabriel Pereira (GP) okulunda olup final notu 10 ve daha yüksek olan öğrencileri filtreledim.
basarili_gp <- mat_data %>%
filter(school == "GP", G3 >= 10)
head(basarili_gp)
## # A tibble: 6 × 33
## school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason
## <chr> <chr> <dbl> <chr> <chr> <chr> <dbl> <dbl> <chr> <chr> <chr>
## 1 GP F 15 U LE3 T 1 1 at_home other other
## 2 GP F 15 U GT3 T 4 2 health servic… home
## 3 GP F 16 U GT3 T 3 3 other other home
## 4 GP M 16 U LE3 T 4 3 services other reput…
## 5 GP M 16 U LE3 T 2 2 other other home
## 6 GP M 15 U LE3 A 3 2 services other home
## # ℹ 22 more variables: guardian <chr>, traveltime <dbl>, studytime <dbl>,
## # failures <dbl>, schoolsup <chr>, famsup <chr>, paid <chr>,
## # activities <chr>, nursery <chr>, higher <chr>, internet <chr>,
## # romantic <chr>, famrel <dbl>, freetime <dbl>, goout <dbl>, Dalc <dbl>,
## # Walc <dbl>, health <dbl>, absences <dbl>, G1 <dbl>, G2 <dbl>, G3 <dbl>
1. dönem ve 2. dönem not ortalamalarını alıp ortalama_1 adında yeni bir sütun oluşturdum.
mat_data %>%
mutate((ortalama_1=(G1+G2)/2))
## # A tibble: 395 × 34
## school sex age address famsize Pstatus Medu Fedu Mjob Fjob reason
## <chr> <chr> <dbl> <chr> <chr> <chr> <dbl> <dbl> <chr> <chr> <chr>
## 1 GP F 18 U GT3 A 4 4 at_home teach… course
## 2 GP F 17 U GT3 T 1 1 at_home other course
## 3 GP F 15 U LE3 T 1 1 at_home other other
## 4 GP F 15 U GT3 T 4 2 health servi… home
## 5 GP F 16 U GT3 T 3 3 other other home
## 6 GP M 16 U LE3 T 4 3 services other reput…
## 7 GP M 16 U LE3 T 2 2 other other home
## 8 GP F 17 U GT3 A 4 4 other teach… home
## 9 GP M 15 U LE3 A 3 2 services other home
## 10 GP M 15 U GT3 T 3 4 other other home
## # ℹ 385 more rows
## # ℹ 23 more variables: guardian <chr>, traveltime <dbl>, studytime <dbl>,
## # failures <dbl>, schoolsup <chr>, famsup <chr>, paid <chr>,
## # activities <chr>, nursery <chr>, higher <chr>, internet <chr>,
## # romantic <chr>, famrel <dbl>, freetime <dbl>, goout <dbl>, Dalc <dbl>,
## # Walc <dbl>, health <dbl>, absences <dbl>, G1 <dbl>, G2 <dbl>, G3 <dbl>,
## # `(ortalama_1 = (G1 + G2)/2)` <dbl>
Öğrencileri okullarına ve cinsiyetlerine göre gruplara ayırdım. Daha sonra her bir gruptaki öğrenci sayısını ve her bir grubun final not ortalamalarını hesapladım.
mat_data %>%
group_by(school,sex) %>%
summarise(
ogrenci_sayisi=n(),
final_ortalama=mean(G3)
)
## `summarise()` has grouped output by 'school'. You can override using the
## `.groups` argument.
## # A tibble: 4 × 4
## # Groups: school [2]
## school sex ogrenci_sayisi final_ortalama
## <chr> <chr> <int> <dbl>
## 1 GP F 183 9.97
## 2 GP M 166 11.1
## 3 MS F 25 9.92
## 4 MS M 21 9.76
Öğrencileri önce ders çalışma sürelerine göre grupladım. Daha sonra her bir grubu final notu en yüksekten düşüğe göre sıraladım. Daha sonra kolay okumak için üzerinde çalıştığım bu iki sütunu seçtim.
mat_data %>%
group_by(studytime) %>%
arrange(desc(G3)) %>%
select(studytime,G3)
## # A tibble: 395 × 2
## # Groups: studytime [4]
## studytime G3
## <dbl> <dbl>
## 1 4 20
## 2 2 19
## 3 1 19
## 4 1 19
## 5 3 19
## 6 3 19
## 7 3 18
## 8 2 18
## 9 1 18
## 10 2 18
## # ℹ 385 more rows
Öğrencilerin okula devam etmedikleri gün sayısının histogramı grafiğini yaptım. Aralık olarak 10 gün belirledim. Daha sonra başlık yazdım.
mat_data %>%
ggplot(aes(x = absences)) +
geom_histogram(
binwidth = 10
) +
labs(
title = "Devamsızlık Sayılarının Dağılımı",
x = "Toplam Devamsızlık Sayısı",
y = "Ogrenci Sayısı",
) +
theme_light()
##Yorum: Grafiğe göre öğrencilerin çok büyük bir kısmı 20 gün altında devamsızlık yapmaktadır. Bu durum devamsızlığın söz konusu grup için önemli bir problem olamadığını ve öğrencilerin büyük oranda okula devam ettiğini göstermektedir.
Öğrencilerin 1. dönem notlarının histogram grafiğini yaptım. Aralık olarak 4 puan belirledim. Çubuk dolgu ve kenarlık rengi belirledim. Daha sonra başlık yazdım.
mat_data %>%
ggplot(aes(x = G1)) +
geom_histogram(binwidth =4,
fill = "#2E8B57",
color = "white")+
labs(
title = "Birinci Donem Notlarının (G1) Dagılımı",
x = "Birinci Donem Notu",
y = "Ogrenci Sayısı")
##Yorum: Grafikten notlarda çok fazla uç değer olmadığı, dağılımın normal dağılıma yakın olduğu görülmektedir. 10’dan fazla puan alan öğrenci sayısının 10’dan az puan alan öğrenci sayısından bir miktar fazla olduğu söylenebilir. Öğrenci grubunun genel olarak homojen bir başarı gösterdiği ifade edilebilir.
Anne mesleğine göre öğrencilerin ortalama final notlarını gösteren
bir bar grafiği oluşturdum. İlk olarak, X eksenine anne mesleklerini
yerleştirdim. Grafiğin, her bir meslek grubu için final notlarının
ortalamasını otomatik olarak hesaplattım. (Burada yapay zeka desteği
aldım.)Görsel ayrım sağlamak için her meslek kategorisine farklı bir
dolgu rengi atadım. Daha sonra, grafiğin ne anlama geldiğini açıklamak
için ana başlık ile X ve Y eksenlerine etiketler ekledim. Son olarak,
daha sade ve modern bir görünüm için theme_minimal
temasını
seçtim.
mat_data %>%
ggplot(aes(x = reorder(Mjob, G3), y = G3, fill = Mjob)) +
stat_summary(fun = "mean", geom = "bar") +
labs(
title = "Anne Mesleğine Gore Ogrencilerin Ortalama Basarısı",
x = "Annenin Mesleği",
y = "Ortalama Final Notu (G3)"
) +
theme_minimal()
##Yorum: Yukarıdaki grafik öğrencilerin matematik dersi final
puanlarının annlerinin mesleklerine göre ortalamalarını gösteriyor.
Grafiğe göre en yüksek akademik başarı, annesi sağlık
(health
) sektöründe çalışan öğrencilerde görülürken, onları
annesi öğretmen (teacher
) olan öğrenciler yakından takip
etmektedir. Diğer meslek grupları (services
,
other
) orta sıralarda yer alırken, en düşük not ortalaması
annesi ev hanımı (at_home
) olan öğrenci grubuna aittir.
Hafta içi alkol tüketim düzeyine (Dalc) göre öğrencilerin ortalama
final notlarını gösteren bir bar grafiği oluşturdum. İlk olarak, X
eksenine alkol tüketim düzeylerini, Y eksenine ise final notlarını (G3)
yerleştirdim. Her bir çubuğun dolgu rengini de (fill
), ait
olduğu tüketim düzeyine göre belirledim. Grafiğin daha anlaşılır olması
için X eksenindeki “1”, “2” gibi sayısal etiketleri “Cok Az”, “Az”,
“Orta”, “Fazla” ve “Cok Fazla” gibi açıklayıcı metinlerle değiştirdim.
Daha sade bir görünüm için theme_minimal temasını kullandım ve gereksiz
olduğu için renk göstergesini kaldırdım. Son olarak, grafiğin ne
hakkında olduğunu anlatan bir ana başlık ile X ve Y eksenlerine
başlıklar ekledim.
mat_data %>%
ggplot(aes(x=factor(Dalc), y=G3, fill = factor(Dalc))) +
stat_summary(fun="mean", geom = "bar")+
scale_x_discrete(labels = c(
"1" = "Cok Az",
"2" = "Az",
"3" = "Orta",
"4" = "Fazla",
"5" = "Cok Fazla"))+
theme_minimal() +
theme(
legend.position = "none"
)+
labs(
title = "HAlkol Tuketimine Gore Ortalama Basarı",
x = "Alkol Tuketim Duzeyi",
y = "Ortalama Final Notu"
)
##Yorum: Yukarıdaki grafik hafta içi alkol türketim sıklığına göre öğrencilerin matematik puanlarının ortalamalarını göstermektedir. Grafikte görüleceği üzere alkol kullanma sıklığına göre öğrencileri grupladığımızda grupların matematik final notları arasında önemli bir farklılık gözükmemektedir.
Anaokuluna gitme durumunun öğrencilerin final notu başarısı ile
ilişkisini karşılaştırmak için bir kutu grafiği (oluşturdum. x eksenine
anaokuluna gitme durumunu, y eksenine ise öğrencilerin final notlarını
yerleştirdim. Her bir kategoriyi görsel olarak ayırmak için
fill
estetiğini kullanarak kutuları farklı renklerle
doldurdum ve son olarak geom_boxplot()
komutuyla grafiği
çizdirdim.
mat_data %>%
ggplot(aes(x=nursery, y=G3, fill = nursery))+
geom_boxplot()
##Yorum: Bu grafik anaokuluna giden ve gitmeyen öğrencilerin matematik dersi final başarılarının dağılımını göstermektedir. Grafiğe göre her iki grubun ortalaması oldukça yakındır. Ancak anaokuluna giden öğrencilerin puanları daha geniş bir dağılım göstermektedir.
Evde internet erişimi olup olmamasının öğrencilerin final notu
başarısı ile ilişkisini karşılaştırmak için bir kutu grafiği oluşturdum.
X eksenine internet erişimi olup olmama durumunu, y eksenine ise
öğrencilerin final notlarını yerleştirdim. Her bir kategoriyi görsel
olarak ayırmak için fill
fonksiyonunu kullanarak kutuları
farklı renklerle doldurdum ve son olarak geom_boxplot()
komutuyla grafiği çizdirdim. Uç değerleri kırmızı nokta ile gösterip
arka planı beyaz yaptım.
mat_data %>%
ggplot(aes(x=internet, y=G3, fill = internet))+
geom_boxplot(
outlier.colour = "red")+
theme_bw()
##Yorum: Bu grafikte öğrencilerin matematik final notu dağılımları evde internet erişimi olup olmama durumuna göre gösterilmiştir. Genel olarak evde internet erişimi olan öğrencilerin puanlarının daha yüksek olduğu görülmektedir. Her iki grupta birer uç değer olmakla birlikte evde internet erişimi olan öğrencilerin puanlarının ranjı daha büyüktür.
Öğrencilerin birinci dönem notları ile final notları arasındaki
ilişkiyi görselleştirmek için bir saçılım diyagramı (scatter plot)
oluşturdum. X eksenine birinci dönem notunu, Y eksenine ise final notunu
yerleştirdim. Son olarak, veri setindeki her bir öğrenciyi X ve Y
eksenlerindeki notlarına karşılık gelen bir nokta olarak çizdirmek için
geom_point()
komutunu kullandım.
mat_data %>%
ggplot(aes(x=G1, y=G3))+
geom_point()
##Yorum: Diyagrama göre birinci dönem notları ile final notları arasında çok güçlü, pozitif ve doğrusal bir ilişki olduğu anlaşılmaktadır. X eksenindeki G1 notu arttıkça, Y eksenindeki G3 notu da tutarlı bir şekilde artma eğilimi göstermektedir. Ayrıca, ilk dönemde geçer not almış bazı öğrencilerin final notunun sıfır olması, bu öğrencilerin dersi bırakmış olabileceğine işaret etmektedir.
Devamsızlık sayısı ile öğrencilerin final notları arasındaki ilişkiyi
incelemek için bir serpilme diyagramı oluşturdum. X eksenine devamsızlık
sayısını, y eksenine ise final notlarını atadım. Bu ilişkinin iki farklı
okul için nasıl değiştiğini görmek amacıyla, noktaların rengini
color
fonksiyonu ile okula göre ayarladım. Her bir
öğrenciyi geom_point()
komutuyla renkli bir nokta olarak
çizdirdim ve son olarak theme_bw()
komutuyla grafiğe temiz
bir görünüm verdim.
mat_data %>%
ggplot(aes(x=absences, y=G3, color=school))+
geom_point()+
theme_bw()
##Yorum: Bu diyagram, devamsızlık sayısı ile akademik başarı arasında gözle görülür negatif bir ilişki olduğunu ortaya koymaktadır. Grafikteki en çarpıcı bulgu, en yüksek notlara (G3 > 15) sahip öğrencilerin tamamının çok az devamsızlık yapmış (10 günden az) olmasıdır. Tersine, devamsızlık sayısı arttıkça yüksek not alan öğrenci sayısı neredeyse sıfıra inmektedir. Noktaların okula göre renklendirilmesi, bu negatif eğilimin her iki okuldaki öğrenciler için de geçerli olduğunu göstermektedir.