Melakukan import data yang berasal dari kaggle, didapatkan seperti dibawah ini:
#Import data
data <- read.csv("C:/Users/LENOVO/Documents/PSD/Expanded_data_with_more_features.csv", header = TRUE, sep =";")
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 ...
SOAL
JAWABAN
No.1
Untuk memeriksa apakah terdapat outliers, dapat menggunakan visualisasi yaitu boxplot pada masing-masing variabel math, reading, dan writing score
#outliers math score
boxplot_math <- boxplot(data$MathScore, main = "Boxplot Math Score", col = "pink")
boxplot_reading <- boxplot(data$ReadingScore, main ="Boxplot Reading Score", col = "skyblue")
boxplot_writing <- boxplot(data$WritingScore, main = "Boxplot Writing Score", col = "lightgreen")
Dari visualisasi di atas, diketahui bahwa terdapat ouliers dari setiap variabel. Variabel Math Score terdapat oulier yang sangat jauh dari rentang batasnya, dapat dilihat dari 1 titik yang memiliki jarak paling jauh dibandingkan titik lainnya. Sedangkan untuk outlier yang di reading score memiliki jarak yang lumayan sama dan untuk writing score terdapat 2 titik atau 2 nilai yang memiliki perbedaan lumayan jauh denagn batas bawah dan outlier lainnya.
No.2
Outlier adalah data observasi yang berbeda secara signifikan dari sebagian besar nilai lain dalam kelompoknya.
Untuk mengetahui apakah terdapat outliers, dapat dilihat dengan menggunakan visualisasi seperti boxplot di atas. outliers berupa titik-titik di luar rentang boxplot atau batas atas dan bawah.Tidak hanya itu, untuk mendeteksi apakah terdapat outlier juga bisa menggunakan histogram. Dan jika ingin menghitung secara manual dapat menggunakan rumus yaitu:
Batas bawah : Q1 - (1.5 x IQR)
Batas atas : Q3 + (1.5 x IQR)
Untuk mengatasinya yaitu :
No.3
Untuk mengetahui jam belajar per minggu siswa yang paling banyak dengan menggunakan bar chart.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.2
data$WklyStudyHours <- ifelse(grepl("<", data$WklyStudyHours), "<5 Jam",
ifelse(grepl("5 -- 10", data$WklyStudyHours), "5-10 Jam",
ifelse(grepl(">", data$WklyStudyHours), ">10 Jam", "Unknown")))
# Menghitung jumlah siswa per kategori
study_counts <- as.data.frame(table(data$WklyStudyHours))
names(study_counts) <- c("Kategori", "Jumlah_Siswa")
study_counts <- study_counts[order(-study_counts$Jumlah_Siswa), ]
ggplot(study_counts, aes(x = reorder(Kategori, -Jumlah_Siswa), y = Jumlah_Siswa, fill = "darkgrey")) +
geom_bar(stat = "identity", show.legend = FALSE) +
geom_text(aes(label = Jumlah_Siswa), vjust = -0.5) +
scale_fill_identity() +
labs(title = "Jumlah Siswa Berdasarkan Jam Belajar", x = "Kategori Jam Belajar", y = "Jumlah Siswa") +
theme_minimal()
Dari bar chart di atas, diketahui bahwa jam belajar siswa per minggu terbanyak di 5-10 jam dengan jumlah 16246 siswa. Lalu jumlah siswa sebanyak 8238 untuk kurang dari 5 jam per minggunya. Sebanyak 5202 untuk lebih dari 10 jam dan sisanya yaitu 955 untuk jam belajar siswa yang tidak diketahui.
No.4
Perbandingan nilai siswa per ethnic berdasarkan nilai math, reading dan writing menggunakan rata-rata nilainya untuk mengetahui perbandingannya.
library(ggplot2)
transpose_data <- reshape2::melt(data, id.vars = "EthnicGroup", measure.vars = c("MathScore", "ReadingScore", "WritingScore")) #menggunakan reshape2::melt untuk mengubah bentuk data yang awalnya per baris, menjadi perkolom
ggplot(transpose_data, aes(x = EthnicGroup, y = value, fill = variable)) +
geom_bar(stat = "summary", fun = "mean", position = "dodge") +
labs(title = "Rata-rata Nilai Siswa berdasarkan Etnis", x = "Etnis", y = "Rata-rata Nilai") +
theme_minimal() +
scale_fill_manual(values = c("MathScore" = "skyblue", "ReadingScore" = "blue", "WritingScore" = "navy"))
Dari 5 grup A, B, C, D, E dan tidak diketahui, math score rata-rata tertinggi berada di grup E dan rata-rata terendah berada di grup A, Reading score rata-rata tertinggi berada di grup E dan rata-rata terendah berada di grup A Sedangkan writing score rata-rata tertinggi berada di Grup E dan rata-rata terendah berada di grup A. Sehingga untuk rata-rata tertinggi keseluruhan berada di grup E dan rata-rata terendah berada di grup A.
No. 5
Korelasi antar variabel math score, reading score dan writing score dengan menggunakan heatmap
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.3
## corrplot 0.95 loaded
nilai <- data[, c("MathScore", "ReadingScore", "WritingScore")]
korelasi_matrix <- cor(nilai, use = "complete.obs")
corrplot(korelasi_matrix, method = "color", type = "lower", tl.col = "black", tl.srt = 40, addCoef.col = "white", number.cex = 0.9)
Dari heatmap korelasi di atas, diketahui bahwa korelasi terbesar maka berwarna semakin biru. Korelasi antara reading score dan math score sebesar 0.82 yang berarti memiliki korelasi yang tinggi dan memiliki warna biru yang sedikit gelap. Korelasi Writing Score dengan Math Score sebesar 0.81 yang artinya bahwa memiliki hubungan yang kuat antar variabel dan memiliki warna biru yang sedikit gelap tetapi tidak segelap korelasi antara Reading Score dan Math Score. Dan korelasi Writing Score dengan Reading Score sebesar 0.95 yang artinya mendekati sempurna bahwa terdapat hubungan yang sangat kuat antar 2 variabel dan memiliki warna biru yang gelap.
No. 6
Untuk mengetahui apakah siswa yang sering berolahraga mempengaruhi nilai matematika siswa. maka dibuarkan barchart untuk mengetahui itu
library(ggplot2)
ggplot(data, aes(x= PracticeSport, y= MathScore))+
geom_bar(stat = "summary", fun = "mean")+
geom_text(stat = "summary", fun = "mean", aes(label = round(..y.., 1)), vjust = -0.5, size = 4) +
labs(title = "Rata-rata nilai matematika berdasarkan kebiasaan olahraga", x = "Kebiasaan olahraga", y ="rata-rata nilai matematika")+
theme_minimal()
## Warning: The dot-dot notation (`..y..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(y)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Dari visualisasi di atas, diketahui bahwa kebiasaan olahraga tidak mempengaruhi nilai Matematika dibuktikan dengan siswa yang tidak berolahraga memiliki rata-rata math score yang rendah dibandingkan dengan rata-rata math score siswa yang sering berolahraga.