Data yang digunakan di tugas ini adalah https://www.kaggle.com/datasets/desalegngeb/students-exam-scores?resource=download
data<- read.csv("C:/Users/LENOVO/Downloads/archive/Expanded_data_with_more_features.csv")
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 ...
#Boxplotnya say
boxplot(data$MathScore, main = "Boxplot Math Score", col = "orange")
boxplot(data$ReadingScore, main = "Boxplot Reading Score", col = "darkgray")
boxplot(data$WritingScore, main = "Boxplot Writing Score", col = "lightyellow")
#Fungsi untuk mencari outlier
get_outliers <- function(x) {
Q1 <- quantile(x, 0.25)
Q3 <- quantile(x, 0.75)
IQR <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
return(x[x < lower_bound | x > upper_bound])
}
#Cek outlier
get_outliers(data$MathScore)
## [1] 18 0 21 18 8 21 22 17 20 16 21 21 22 19 22 22 22 17 20 15 15 18 18 11 19
## [26] 12 12 13 18 22 17 19 21 21 9 18 21 22 10 7 22 21 17 22 10 22 14 14 19 19
## [51] 11 9 10 13 18 20 21 16 13 22 13 22 10 16 21 21 16 18 20 19 9 19 11 9 21
## [76] 19
get_outliers(data$ReadingScore)
## [1] 17 25 23 24 24 26 23 21 18 25 15 23 24 11 17 24 23 26 24 17 20 24 24 25 19
## [26] 25 16 20 22 26 22 27 27 23 22 23 19 23 24 11 27 24 26 22 27 23 17 23 12 12
## [51] 18 23 16 27 23 23 21 20 20 26 26 21 23 26 27 24 27 16 23 24 23 12 26 15 21
## [76] 27 17 25 18 19 10 25 23 25 25 26 18 14 25 19
get_outliers(data$WritingScore)
## [1] 10 21 19 26 15 23 17 25 26 24 15 20 21 25 24 23 6 17 24 22 22 21 25 14 26
## [26] 25 18 16 19 23 26 19 24 14 17 26 24 24 21 24 23 15 26 24 18 19 20 21 24 15
## [51] 24 12 22 25 18 16 24 26 17 19 24 18 9 19 20 25 18 21 23 19 16 18 25 23 20
## [76] 20 20 22 26 26 26 24 26 25 18 20 23 24 23 17 15 21 12 25 16 25 20 18 13 26
## [101] 20 23 21 26 26 22 4 20 24
Dari tampilan diatas dapat disimpulkan bahwa dari ketiga variabel memiliki banyak outlier. ## MathScore Dari MathScore terdapat beberapa nilai dibawah batas IQR/Outlier, misalnya 8, 9, 10, dst. Artinya terdapat cukup banyak siswa yang memiliki nilai matematika jauh lebih rendah jika dibandingkan mayoritas siswa lainnya.
Dari ReadingScore ada beberapa nilai dibawah juga seperti MathScore, seperti 11, 12, 13, dst. Artinya distribusi nilai membaca para siswa memiliki beberapa nilai rendah jika dibandingkan mayoritas siswa lainnya.
Dari WritingScore juga ada nilai dibawah seperti ReadingScore & MathScore, seperti 6, 9, 10, dst. Artinya nilai menulis para siswa memiliki beberapa yang nilainya jauh lebih rendah jika dibandingkan mayoritas siswa yang lainnya.
Outlier adalah nilai yang menyimpang jauh dari mayoritas data lainnya. Biasanya, outlier muncul sebagai nilai yang terlalu kecil atau terlalu besar, sehingga dapat mempengaruhi hasil analisis statistik, seperti rata-rata dan regresi.
Untuk memeriksa outlier kita dapat menggunakan:
Untuk memeriksa secara visual, dimana titik-titik diluar garis itu dianggap sebagai outlier.
Untuk menanggulanginya kita dapat membiarkannya, menghapusnya(jika kesalahan input/nilainya mengganggu analisis), ditransformasi(log atau sejenisnya), diimputasi(digantikan dengan nilai median, mean, atau prediksi dari model jika perlu.)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
ggplot(data, aes(x = WklyStudyHours)) +
geom_bar(fill = "blue") +
labs(title = "Frekuensi Jam Belajar per Minggu",
x = "Jam Belajar per Minggu",
y = "Jumlah Siswa")
Dari visualisasi di atas, dapat disimpulkan bahwa durasi jam belajar yang paling banyak digunakan oleh para siswa adalah diantara 5-10 jam perminggu.
library(ggplot2)
#Nilai Matematika
ggplot(data, aes(x = EthnicGroup, y = MathScore)) +
geom_boxplot(fill = "lightgreen") +
labs(title = "Math Score per Ethnic Group")
#Nilai Membaca
ggplot(data, aes(x = EthnicGroup, y = ReadingScore)) +
geom_boxplot(fill = "pink") +
labs(title = "Reading Score per Ethnic Group")
#Nilai Menulis
ggplot(data, aes(x = EthnicGroup, y = WritingScore)) +
geom_boxplot(fill = "lightblue") +
labs(title = "Writing Score per Ethnic Group")
aggregate(MathScore ~ EthnicGroup, data = data, FUN = mean)
## EthnicGroup MathScore
## 1 66.18587
## 2 group A 62.99189
## 3 group B 63.49022
## 4 group C 64.69572
## 5 group D 67.66640
## 6 group E 75.29894
aggregate(ReadingScore ~ EthnicGroup, data = data, FUN = mean)
## EthnicGroup ReadingScore
## 1 68.91576
## 2 group A 66.78774
## 3 group B 67.32046
## 4 group C 68.43823
## 5 group D 70.38225
## 6 group E 74.25142
aggregate(WritingScore ~ EthnicGroup, data = data, FUN = mean)
## EthnicGroup WritingScore
## 1 67.90054
## 2 group A 65.25192
## 3 group B 65.89513
## 4 group C 66.99924
## 5 group D 70.89084
## 6 group E 72.67706
Dari hasil analisis, didapatkan bahwa Group E memiliki nilai rata-rata matematika tertinggi, sementara Group A terendah.
Dari hasil analisis, didapatkan bahwa Group E memiliki nilai rata-rata membaca tertinggi, sementara Group A terendah.
Dari hasil analisis, didapatkan bahwa Group E memiliki nilai rata-rata menulis tertinggi, sementara Group A terendah
Ini menunjukkan bahwa perbedaan etnis berkorelasi dengan perbedaan performa akademik dalam data yang digunakan.
cor(data[, c("MathScore", "ReadingScore", "WritingScore")])
## MathScore ReadingScore WritingScore
## MathScore 1.0000000 0.8178249 0.8071182
## ReadingScore 0.8178249 1.0000000 0.9525844
## WritingScore 0.8071182 0.9525844 1.0000000
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.4.3
## corrplot 0.95 loaded
corr_matrix <- cor(data[, c("MathScore", "ReadingScore", "WritingScore")])
corrplot(corr_matrix, method = "color", addCoef.col = "white", number.cex = 0.8)
Ketiga variabel (MathScore, ReadingScore, dan WritingScore) memiliki hubungan positif yang kuat. Ini menunjukkan bahwa kemampuan akademik siswa cenderung seimbang di ketiga bidang ini. Hasil ini juga memperkuat kemungkinan bahwa intervensi belajar di satu bidang bisa berdampak pada bidang lainnya. Terutama dengan korelasi Reading–Writing dimana korelasinya paling kuat yaitu sebesar 0.95, yang menunjukkan hubungan sangat erat.