data <- read.csv("Expanded data with more features.csv", stringsAsFactors = FALSE)
colnames(data)[colnames(data) == "MathScore"] <- "math"
colnames(data)[colnames(data) == "ReadingScore"] <- "reading"
colnames(data)[colnames(data) == "WritingScore"] <- "writing"
data$math <- as.numeric(data$math)
data$reading <- as.numeric(data$reading)
data$writing <- as.numeric(data$writing)
boxplot(data$math, main = "Boxplot Math Score", col = "pink")
boxplot(data$reading, main = "Boxplot Reading Score", col = "red")
boxplot(data$writing, main = "Boxplot Writing Score", col = "brown")
Outlier data adalah nilai yang berbeda jauh dari mayoritas data lainnya dalam suatu set. Data outlier dapat muncul karena kesalahan pengukuran, kesalahan input data, atau karena adanya anomali dalam data yang diukur.
Outlier dapat diperiksa dengan boxplot (visualisasi yang memperlihatkan nilai pencilan) dan Statistik IQR (Dengan menemukan quartil pertama dan ketiga (Q1&Q3) kemudian menghitung nilai IQR nya dengan mengurangi Q1 dan Q3).
boxplot(data$math, main = "Boxplot Math Score", col = "maroon")
boxplot(data$reading, main = "Boxplot Reading Score", col = "red")
boxplot(data$writing, main = "Boxplot Writing Score", co = "pink")
## Cara mengulangi 1. Hapus jika dianggap data error 2. Transformasi
data 3. Analisis terpisah 4. Imputasi diganti dengan nilai median atau
rata-rata
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.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
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
# Lihat jumlah masing-masing kategori
table(data$WklyStudyHours)
##
## < 5 > 10 5 - 10
## 955 8238 5202 16246
# Buat tabel frekuensi dan visualisasinya
studytime_freq <- data %>%
count(WklyStudyHours) %>%
arrange(desc(n))
ggplot(studytime_freq, aes(x = WklyStudyHours, y = n)) +
geom_bar(stat = "identity", fill = "steelblue") +
labs(title = "Distribusi Jam Belajar per Minggu",
x = "Jam Belajar (self-study)",
y = "Jumlah Siswa") +
theme_minimal()
# Boxplot untuk nilai Math per Ethnic
boxplot(math ~ EthnicGroup, data = data,
main = "Math Score per Ethnic", col = "blue",
xlab = "Ethnic Group", ylab = "Math Score")
# Boxplot untuk nilai Reading per Ethnic
boxplot(reading ~ EthnicGroup, data = data,
main = "Reading Score per Ethnic", col = "green",
xlab = "Ethnic Group", ylab = "Reading Score")
# Boxplot untuk nilai Writing per Ethnic
boxplot(writing ~ EthnicGroup, data = data,
main = "Writing Score per Ethnic", col = "pink",
xlab = "Ethnic Group", ylab = "Writing Score")
library(ggplot2)
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.3.3
nilai <- data[, c("math", "reading", "writing")]
cor_matrix <- cor(nilai, use = "complete.obs")
cor_long <- melt(cor_matrix)
ggplot(cor_long, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "white") +
geom_text(aes(label = round(value, 2)), size = 5) +
scale_fill_gradient2(low = "red", high = "blue", mid = "white", midpoint = 0.5) +
theme_minimal() +
labs(title = "Heatmap Korelasi Nilai", x = "", y = "") +
theme(axis.text = element_text(size = 12))
library(dplyr)
library(ggplot2)
# Visualisasi boxplot
boxplot(math ~ PracticeSport, data = data, main = "Math Score vs PracticeSport", col = "lightblue")
# Rata-rata Math Score berdasarkan kategori PracticeSport
data %>%
group_by(PracticeSport) %>%
summarise(Mean_Math = mean(math, na.rm = TRUE),
SD_Math = sd(math, na.rm = TRUE),
Count = n())
## # A tibble: 4 × 4
## PracticeSport Mean_Math SD_Math Count
## <chr> <dbl> <dbl> <int>
## 1 "" 66.6 14.9 631
## 2 "never" 64.2 14.9 4004
## 3 "regularly" 67.8 15.6 10793
## 4 "sometimes" 66.3 15.2 15213
# ANOVA
anova_result <- aov(math ~ 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
# Visualisasi
avg_math <- data %>%
group_by(PracticeSport) %>%
summarise(mean = mean(math, na.rm = TRUE),
sd = sd(math, na.rm = TRUE))
ggplot(avg_math, aes(x = PracticeSport, y = mean, fill = PracticeSport)) +
geom_bar(stat = "identity", width = 0.5) +
geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd), width = 0.2) +
labs(title = "Rata-rata Math Score Berdasarkan PracticeSport",
y = "Mean Math Score", x = "Practice Sport") +
theme_minimal()
##Interpretasi
Distribusi data (Math Score)
Nilai median berada disekitar angka 66-67
Nilai IQR berada sekitar 55-78, hal ini menunjukkan bahwa 50% dari nilai math terkonsentrasi di rentang tersebut.
Outlier
Terlihat cukup banyak outlier di bawah whisker bawah
Nilai terkecil berada sangat jauh dari kotak, menandakan adanya nilai yang jauh lebih rendah dari mayoritas data.
Mayoritas siswa memiliki skor matematika sedang hingga tinggi, tetapi ada sejumlah siswa dengan nilai yang sangat rendah yang menjadi outlier. Ini bisa menunjukkan adanya perbedaan kemampuan yang signifikan atau masalah dalam pembelajaran matematika bagi sebagian siswa.
Distribusi data (Reading Score)
Nilai median berada disekitar angka 70
Nilai IQR berada di sekitar angka 60-80, agak mirip dengan skor math tetapi sedikit lebih tinggi
Outlier
Banyak outlier ditemukan dibawah
Tidak ada outlier yang menonjol seperti pada math
Skor membaca terlihat cukup baik, tetapi masih terdapat siswa dengan kemampuan membaca yang jauh di bawah rata rata, meski tidak semenonjol skor math.
Distribusi (Writing)
Nilai median berada sedikit lebih rendah dari reading, sekitar 68-69
Nilai IQR sekitar 58-78
Outlier
Nilai outlier terlihat cukup banyak
Distribusi mirip dengan math, namun dengan rentang bawah yang lebih panjang
Skor menulis memperlihatkan sebaran yang lebih luas, dan lebih banyak siswa dengan nilai rendah. Ini bisa menjadi indikasi bahwa kemampuan menulis merupakan tantangan bagi sebagian besar siswa dibanding membaca.
Mayoritas siswa menghabiskan waktu belajar mandiri sekitar 5 hingga 10 jam setiap minggu, menunjukkan bahwa ini adalah durasi yang paling umum dan mungkin dianggap cukup seimbang oleh para siswa.
Kelompok etnis E memiliki nilai median tertinggi pada semua mata pelajaran (matematika, membaca, dan menulis), menunjukkan performa akademik terbaik. Sebaliknya, kelompok B dan C cenderung memiliki nilai median lebih rendah. Outlier dengan nilai rendah paling banyak ditemukan pada kelompok C dan D, terutama pada mata pelajaran membaca dan menulis.
Berdasarkan heatmap korelasi, ketiga nilai (math, reading, dan writing) memiliki hubungan positif yang kuat. Korelasi tertinggi terdapat antara nilai reading dan writing (0.95), menunjukkan bahwa siswa dengan kemampuan membaca yang baik cenderung juga memiliki kemampuan menulis yang baik. Korelasi antara math dengan reading (0.82) dan math dengan writing (0.81) juga cukup tinggi, menandakan hubungan yang erat antar ketiganya, meskipun sedikit lebih lemah dibandingkan reading-writing.
Dari kedua grafik terlihat bahwa siswa yang berolahraga secara rutin (regularly) memiliki rata-rata nilai matematika yang sedikit lebih tinggi dibandingkan dengan siswa yang tidak pernah atau hanya kadang-kadang berolahraga. Median dan rata-rata nilai matematika pada kelompok ini sedikit lebih unggul, seperti terlihat pada boxplot dan bar chart. Meskipun begitu, selisih antar kelompok tidak terlalu besar dan terdapat tumpang tindih pada rentang nilai, yang ditunjukkan oleh error bar dan sebaran nilai. Hal ini menunjukkan bahwa meskipun ada kecenderungan positif antara kebiasaan berolahraga dan nilai matematika, perbedaannya tidak terlalu mencolok secara visual.