data<- read.csv("C:/Users/Lenovo/Downloads/PSD/Expanded_data_with_more_features.csv") # Membaca data
head(data, 10) # Menampilkan 10 baris pertama dari 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
## 7 6 female group B some college standard completed
## 8 7 male group B some college free/reduced none
## 9 8 male group D high school free/reduced completed
## 10 9 female group B high school free/reduced 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
## 7 widowed never no 1 private
## 8 married sometimes yes 1 private
## 9 single sometimes no 3 private
## 10 married regularly yes NA private
## WklyStudyHours MathScore ReadingScore WritingScore
## 1 < 5 71 71 74
## 2 10-May 69 90 88
## 3 < 5 87 93 91
## 4 10-May 45 56 42
## 5 10-May 76 78 75
## 6 10-May 73 84 79
## 7 10-May 85 93 89
## 8 > 10 41 43 39
## 9 > 10 65 64 68
## 10 < 5 37 59 50
str(data) # Melihat struktur 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" "10-May" "< 5" "10-May" ...
## $ 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 ...
Periksa distribusi dari variabel math, reading dan writing score, cek apakah ada outlier ?
Jawab :
# Load library
library(ggplot2) # Digunakan untuk visualisasi data dengan cara yang kuat & fleksibel.
## Warning: package 'ggplot2' was built under R version 4.4.3
library(dplyr) # Digunakan untuk manipulasi data (membersihkan, merangkum, memfilter, dll).
## Warning: package 'dplyr' was built under R version 4.4.3
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Summary, digunakan untuk melihat ringkasan statistik dari data : min, max, median, mean, dan quartiles.
summary(data$MathScore)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 56.00 67.00 66.56 78.00 100.00
summary(data$ReadingScore)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.00 59.00 70.00 69.38 80.00 100.00
summary(data$WritingScore)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 4.00 58.00 69.00 68.42 79.00 100.00
- Interpretasi summary :
MathScore memiliki nilai minimum 0, kuartil pertama (Q1) di 56, median 67, rata-rata 66.56, kuartil ketiga (Q3) di 78, dan maksimum 100. Hal ini menunjukkan bahwa sebagian besar siswa memiliki skor matematika di kisaran 56-78 , dengan beberapa siswa yang sangat rendah (skor 0) dan beberapa yang mencapai skor sempurna.
ReadingScore memiliki nilai minimum 10, Q1 di 59, median 70, rata-rata 69.38, Q3 di 80, dan maksimum 100. Skor membaca cenderung lebih tinggi dibandingkan matematika, dengan distribusi yang lebih terpusat di kisaran 59-80 , menunjukkan kemampuan membaca siswa secara umum lebih baik daripada matematika.
WritingScore memiliki nilai minimum 4, Q1 di 58, median 69, rata-rata 68.42, Q3 di 79, dan maksimum 100. Skor menulis menunjukkan pola yang mirip dengan membaca, dengan distribusi utama di kisaran 58-79 , menunjukkan bahwa kemampuan menulis siswa juga relatif baik, meskipun ada beberapa siswa dengan skor sangat rendah.
# Menggunakan ggplot
ggplot(data, aes(x = MathScore)) +
geom_boxplot(fill = "lightpink2") +
labs(title = "Boxplot Math Score")
ggplot(data, aes(x = ReadingScore)) +
geom_boxplot(fill = "olivedrab1") +
labs(title = "Boxplot Reading Score")
ggplot(data, aes(x = WritingScore)) +
geom_boxplot(fill = "thistle2") +
labs(title = "Boxplot Writing Score")
atau bisa menggunakan :
# Membuat boxplot untuk melihat outlier
boxplot(data$MathScore, main = "Boxplot Math Score", ylab = "Skor Matematika")
boxplot(data$ReadingScore, main = "Boxplot Reading Score", ylab = "Skor Baca")
boxplot(data$WritingScore, main = "Boxplot Writing Score", ylab = "Skor Menulis")
- Interpretasi visualisasi ggplot/boxplot :
Skor matematika siswa memiliki median sekitar 70-75, dengan 25% siswa di bawah 60-65 dan 75% di bawah 80-85, serta beberapa outlier di bawah 40 yang menunjukkan adanya siswa dengan performa sangat rendah.
Skor membaca dan menulis siswa memiliki distribusi yang relatif simetris dengan median di kisaran 70-75, rentang data yang luas (dari sekitar 40 hingga 100), serta beberapa outlier rendah yang menunjukkan adanya siswa dengan performa sangat rendah dibandingkan kebanyakan siswa lainnya.
Skor menulis siswa memiliki distribusi yang relatif simetris dengan median di sekitar 70-75, rentang data yang luas (dari sekitar 40 hingga 100), dan beberapa outlier rendah yang menunjukkan adanya siswa dengan performa sangat rendah dibandingkan kebanyakan siswa lainnya.
# Memeriksa distribusi variabel MathScore, ReadingScore, dan WritingScore
par(mfrow = c(1, 3))
hist(data$MathScore, main = "Distribusi Math Score", xlab = "Skor Matematika")
hist(data$ReadingScore, main = "Distribusi Reading Score", xlab = "Skor Baca")
hist(data$WritingScore, main = "Distribusi Writing Score", xlab = "Skor Menulis")
- Interpretasi visualisasi histogram :
Distribusi skor matematika, membaca, dan menulis menunjukkan pola yang relatif simetris dengan puncak frekuensi terkonsentrasi di kisaran nilai 60–80, tetapi memiliki ekor panjang ke arah nilai rendah (skor < 40), yang menunjukkan adanya beberapa siswa dengan performa sangat rendah dibandingkan mayoritas siswa lainnya.
Apa yang dimaksud dengan oulier? jelaskan cara memeriksa dan menanggulanginya ?
Jawab : Outlier adalah nilai yang jauh berbeda dari sebagian besar data lainnya atau bisa dikatan nilai yang berada di luar distribusi data normal. Dalam konteks statistik, outlier sering kali diidentifikasi menggunakan metode IQR (Interquartile Range).
Jam belajar manakah per minggu yang paling banyak dilakukan oleh student ?
Jawab :
# Menampilkan visualisasi distribusi jam belajar per minggu dengan ggplot
ggplot(data, aes(x = WklyStudyHours)) +
geom_bar(fill = "lightskyblue") +
labs(title = "Distribusi Jam Belajar Per Minggu",
x = "Jam Belajar Per Minggu",
y = "Jumlah Siswa")
atau bisa menggunakan sintax alternatif sebagai berikut :
# mengurutkan level yang jam
data$WklyStudyHours <- factor(data$WklyStudyHours,
levels = c("< 5", "> 10", "10-May"),
labels = c("<5 jam",">10 jam", "10-May"))
# Menampilkan visualisasi
ggplot(data, aes(x = WklyStudyHours)) +
geom_bar(fill = "mediumvioletred", color = "black") +
labs(
title = "Distribusi Jam Belajar per Minggu",
x = "Jam Belajar/Minggu",
y = "Jumlah Siswa"
) +
theme_light() # Tema visual, menampilkan visual dengan versi lebih modern
Interpretasi :
Distribusi jam belajar per minggu menunjukkan bahwa siswa cenderung menghabiskan waktu belajar lebih banyak > 10 jam (10-May), dengan proporsi yang lebih kecil terfokus pada rentang 5–10 jam atau < 5 jam. Hal ini dapat menjadi gambaran bahwa siswa secara umum memprioritaskan waktu belajar untuk mencapai hasil akademik yang baik.
Catatan : Kategori “NA”: Ada beberapa siswa yang tidak melaporkan jam belajar mereka (kategori “NA”), meskipun jumlahnya relatif kecil.
Periksa perbedaan nilai student (math, writing, reading) per ethnic !
Jawab :
# Boxplot untuk membandingkan skor berdasarkan ethnic group
#Math
ggplot(data, aes(x = EthnicGroup, y = MathScore, fill = EthnicGroup)) +
geom_boxplot() +
labs(title = "Perbedaan Skor Matematika Berdasarkan Etnis",
x = "Kelompok Etnis",
y = "Skor Matematika") +
theme_minimal()
Interpretasi :
Boxplot menunjukkan bahwa skor matematika siswa berbeda secara signifikan antar kelompok etnis, dengan group E memiliki median tertinggi dan rentang data yang lebih luas, sementara group A memiliki median terendah dan beberapa outlier rendah.
#Reading
ggplot(data, aes(x = EthnicGroup, y = ReadingScore, fill = EthnicGroup)) +
geom_boxplot() +
labs(title = "Perbedaan Skor Baca Berdasarkan Etnis",
x = "Kelompok Etnis",
y = "Skor Baca") +
theme_minimal()
Interpretasi : Boxplot menunjukkan bahwa skor baca siswa berbeda secara signifikan antar kelompok etnis, dengan group E memiliki median tertinggi dan rentang data yang lebih luas, sementara group A memiliki median terendah dan beberapa outlier rendah.
#Wwriting
ggplot(data, aes(x = EthnicGroup, y = WritingScore, fill = EthnicGroup)) +
geom_boxplot() +
labs(title = "Perbedaan Skor Menulis Berdasarkan Etnis",
x = "Kelompok Etnis",
y = "Skor Menulis") +
theme_minimal()
Interpretasi : Boxplot menunjukkan bahwa skor menulis siswa berbeda secara signifikan antar kelompok etnis, dengan group E memiliki median tertinggi dan rentang data yang lebih luas, sementara group A memiliki median terendah dan beberapa outlier rendah.
Cek korelasi antar variabel math, reading, and writing score menggunakan corelation heatmap !
Jawab :
# Menghitung matriks korelasi
cor_matrix <- cor(data[, c("MathScore", "ReadingScore", "WritingScore")])
# Heatmap untuk matriks korelasi
library(corrplot) # Menampilkan visualisasi matriks korelasi (correlation matrix) dalam bentuk heatmap atau diagram lain yang memudahkan untuk melihat hubungan antar variabel.
## Warning: package 'corrplot' was built under R version 4.4.3
## corrplot 0.95 loaded
corrplot(cor_matrix, method = "color", type = "upper",
tl.col = "black", tl.srt = 45,
addCoef.col = "black",# Menambahkan nilai korelasi di dalam kotak
title = "Heatmap Korelasi Antara Skor Matematika, Baca, dan Menulis",
mar = c(0, 0, 3, 0) # ← ini bikin ruang margin atas buat title, karena sebelumnya judul kepotong
)
Interpretasi :
Heatmap menunjukkan bahwa skor matematika, membaca, dan menulis memiliki korelasi positif yang kuat, dengan koefisien korelasi antara skor membaca dan menulis mencapai 0.95, serta skor matematika memiliki korelasi tinggi dengan kedua variabel lainnya (0.82 dengan membaca dan 0.81 dengan menulis).
Periksa perbedaan antara nilai student per PracticeSport. Apakah rata-rata math score pada siswa menunjukkan nilai yang tinggi pada student yang sering berolahraga ?
Jawab :
# Boxplot untuk membandingkan skor matematika berdasarkan frekuensi olahraga
ggplot(data, aes(x = PracticeSport, y = MathScore, fill = PracticeSport)) +
geom_boxplot() +
labs(title = "Perbedaan Skor Matematika Berdasarkan Frekuensi Olahraga",
x = "Frekuensi Olahraga",
y = "Skor Matematika") +
theme_minimal()
Uji statistik : apakah perbedaan signifikan ?
anova_result <- aov(MathScore ~ PracticeSport, data = data)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## PracticeSport 3 41751 13917 59.31 <2e-16 ***
## Residuals 30637 7188652 235
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretasi :
Boxplot menunjukkan bahwa siswa yang berolahraga secara teratur (“regularly”) memiliki skor matematika tertinggi dan paling konsisten, diikuti oleh siswa yang sekali-sekali berolahraga (“sometimes”), sementara siswa yang tidak pernah berolahraga (“never”) cenderung memiliki skor matematika lebih rendah dengan variasi yang lebih besar.
Hasil uji ANOVA menunjukkan bahwa : perbedaan skor matematika antar kelompok berdasarkan frekuensi olahraga (“PracticeSport”) adalah signifikan, dengan nilai p -value sangat rendah (< 2e-16), yang mengindikasikan bahwa frekuensi olahraga memiliki dampak nyata terhadap prestasi matematika siswa.