# Load library
library(tidyverse)
library(ggplot2)
library(ggcorrplot)
data<- read.csv("C:/Users/ASUS/Documents/PSD/Expanded Data.csv")
# Menampilkan 6 baris pertama dari dataset
head(data)
## X Gender EthnicGroup ParentEduc LunchType TestPrep
## 1 0 female bachelor's degree standard none
## 2 1 female group C some college standard
## 3 2 female group B master's degree standard none
## 4 3 male group A associate's degree free/reduced none
## 5 4 male group C some college standard none
## 6 5 female group B associate's degree standard none
## ParentMaritalStatus PracticeSport IsFirstChild NrSiblings TransportMeans
## 1 married regularly yes 3 school_bus
## 2 married sometimes yes 0
## 3 single sometimes yes 4 school_bus
## 4 married never no 1
## 5 married sometimes yes 0 school_bus
## 6 married regularly yes 1 school_bus
## WklyStudyHours MathScore ReadingScore WritingScore
## 1 < 5 71 71 74
## 2 5 - 10 69 90 88
## 3 < 5 87 93 91
## 4 5 - 10 45 56 42
## 5 5 - 10 76 78 75
## 6 5 - 10 73 84 79
str(data)
## 'data.frame': 30641 obs. of 15 variables:
## $ X : int 0 1 2 3 4 5 6 7 8 9 ...
## $ Gender : chr "female" "female" "female" "male" ...
## $ EthnicGroup : chr "" "group C" "group B" "group A" ...
## $ ParentEduc : chr "bachelor's degree" "some college" "master's degree" "associate's degree" ...
## $ LunchType : chr "standard" "standard" "standard" "free/reduced" ...
## $ TestPrep : chr "none" "" "none" "none" ...
## $ ParentMaritalStatus: chr "married" "married" "single" "married" ...
## $ PracticeSport : chr "regularly" "sometimes" "sometimes" "never" ...
## $ IsFirstChild : chr "yes" "yes" "yes" "no" ...
## $ NrSiblings : int 3 0 4 1 0 1 1 1 3 NA ...
## $ TransportMeans : chr "school_bus" "" "school_bus" "" ...
## $ WklyStudyHours : chr "< 5" "5 - 10" "< 5" "5 - 10" ...
## $ MathScore : int 71 69 87 45 76 73 85 41 65 37 ...
## $ ReadingScore : int 71 90 93 56 78 84 93 43 64 59 ...
## $ WritingScore : int 74 88 91 42 75 79 89 39 68 50 ...
# Boxplot
par(mfrow = c(1,3))
boxplot(data$MathScore, main = "Math Score", col = "lightblue")
boxplot(data$ReadingScore, main = "Reading Score", col = "lightgreen")
boxplot(data$WritingScore, main = "Writing Score", col = "lightyellow")
Outlier pada boxplot terlihat jelas terutama di ketiga jenis skor: Matematika, Membaca, dan Menulis. Outlier ditunjukkan oleh titik-titik di bawah garis bawah (whisker), yang berarti ada nilai-nilai yang jauh lebih rendah dibanding mayoritas data. Pada skor Matematika, jumlah outlier paling banyak dan nilainya sangat rendah bahkan ada yang hampir nol. Ini menunjukkan ada siswa yang kemampuan matematikanya jauh di bawah rata-rata. Sementara itu, pada skor Membaca dan Menulis juga ada outlier, tapi tidak sebanyak Matematika dan nilainya tidak seekstrem itu. Adanya outlier ini menandakan bahwa kemampuan siswa sangat bervariasi, dan siswa-siswa dengan nilai yang sangat rendah perlu mendapatkan perhatian dan bantuan belajar tambahan.
Outlier adalah data yang nilainya sangat berbeda dari sebagian besar data lainnya dalam suatu kumpulan data. Nilai ini bisa jauh lebih rendah atau jauh lebih tinggi dibandingkan yang lain. Kehadiran outlier bisa memengaruhi hasil analisis, karena bisa membuat rata-rata bergeser atau memberikan gambaran yang kurang akurat tentang pola data secara keseluruhan.
Beberapa cara umum untuk mendeteksi outlier:
# Tabel frekuensi
study_freq <- table(data$WklyStudyHours)
study_df <- as.data.frame(study_freq)
colnames(study_df) <- c("JamBelajar", "Jumlah")
# Pie Chart
ggplot(study_df, aes(x = "", y = Jumlah, fill = JamBelajar)) +
geom_bar(stat = "identity", width = 1) +
coord_polar("y", start = 0) +
labs(title = "Distribusi Jam Belajar per Minggu") +
theme_void() +
theme(legend.title = element_blank())
Pie chart di atas menunjukkan distribusi jam belajar siswa per minggu yang terbagi ke dalam tiga kategori: < 5 jam, 5–10 jam, dan > 10 jam. Mayoritas siswa berada pada kategori 5–10 jam per minggu, ditunjukkan oleh bagian ungu yang paling besar dari lingkaran. Selanjutnya, jumlah siswa yang belajar lebih dari 10 jam (warna hijau) juga cukup signifikan, tetapi lebih sedikit dibandingkan kategori sebelumnya. Sementara itu, proporsi siswa yang belajar kurang dari 5 jam (warna merah muda) adalah yang paling kecil. Ini mengindikasikan bahwa sebagian besar siswa mengalokasikan waktu belajar dalam rentang sedang, yaitu antara 5 hingga 10 jam per minggu.
# Korelasi
score_data <- data %>% select(MathScore, ReadingScore, WritingScore)
cor_matrix <- cor(score_data, use = "complete.obs")
# Heatmap dengan warna kustom
ggcorrplot(cor_matrix, type = "lower", colors = c("lightblue", "white", "orange"))
Berdasarkan hasil visualisasi heatmap korelasi antara variabel MathScore, ReadingScore, dan WritingScore, terlihat bahwa ketiga variabel tersebut memiliki hubungan yang sangat kuat dan positif satu sama lain. Warna oranye terang yang mendominasi heatmap menunjukkan bahwa nilai korelasi antar skor mendekati angka 1, yang menandakan korelasi positif yang tinggi. Hal ini berarti bahwa siswa yang memiliki nilai tinggi dalam matematika cenderung juga memiliki nilai yang tinggi dalam kemampuan membaca (reading) maupun menulis (writing). Korelasi paling kuat tampak antara skor Reading dan Writing, yang cukup wajar mengingat kedua kemampuan ini saling berhubungan secara langsung dalam aspek bahasa. Secara keseluruhan, temuan ini mengindikasikan bahwa peningkatan pada salah satu kemampuan akademik kemungkinan besar akan diikuti oleh peningkatan pada kemampuan lainnya. Korelasi yang kuat ini dapat menjadi dasar untuk pendekatan pembelajaran terpadu yang mengembangkan ketiga aspek secara bersamaan.