Data yang digunakan : kaggle
Expanded_data_with_more_features <- read.csv("C:/Users/User/Downloads/Expanded_data_with_more_features.csv/Expanded_data_with_more_features.csv")
#menampilkan struktur data
str(Expanded_data_with_more_features)
## '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 ...
#menampilkan 6 baris pertama data
head(Expanded_data_with_more_features)
## 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
1.Periksa distribusi dari variabel math, reading dan writing score, cek apakah ada outlier
2.Apa yang dimaksud dengan outlier? jelaskan cara memeriksa dan menanggulanginya?
3.Jam belajar manakah per minggu yang paling banyak dilakukan oleh student
4.Periksa perbedaan nilai student (math, writing, reading) per ethnic
5.cek korelasi antar variabel math, reading, and writing score menggunakan corelation heatmap
6.Periksa perbedaan antara nilai student per PracticeSport. Apakah rata-rata math score pada siswa menunjukkan nilai yang tinggi pada student yang sering berolahraga
# Load library yang dibutuhkan
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.3.3
# Baca data
df <- read.csv("Expanded_data_with_more_features.csv")
df_long <- df %>%
pivot_longer(cols = c(MathScore, ReadingScore, WritingScore),
names_to = "Subject", values_to = "Score")
# Buat boxplot
ggplot(df_long, aes(x = Subject, y = Score, fill = Subject)) +
geom_boxplot() +
theme_minimal() +
ggtitle("Boxplot Nilai Ujian: Math, Reading, Writing") +
ylab("Score") +
xlab("Subject") +
theme(legend.position = "none")
1. Math Score (Merah)
Median (garis tengah kotak): sekitar 65–70, artinya setengah siswa mendapat nilai di atas dan setengahnya di bawah nilai itu.
Sebaran nilai (box dan whiskers): cukup lebar → menunjukkan variasi nilai yang tinggi antar siswa.
Banyak outlier di bawah (titik-titik hitam): menandakan ada banyak siswa yang nilainya rendah sekali (bahkan ada yang 0).
Insight: Mata pelajaran matematika punya penyebaran nilai paling luas dan banyak siswa dengan nilai sangat rendah.
2. Reading Score (Hijau)
Median: sekitar 70–75, sedikit lebih tinggi dari Math → artinya siswa secara umum lebih baik dalam membaca.
Whiskers lebih panjang ke bawah tapi ada lebih sedikit outlier dibanding Math → artinya masih ada nilai rendah, tapi tidak seekstrem Math.
Insight: Kemampuan membaca siswa cukup bagus secara umum, meskipun tetap ada sebagian kecil yang tertinggal.
3. Writing Score (Biru)
Median: sekitar 70, mirip dengan Reading.
Box mirip dengan Reading tapi jumlah outliernya hampir sama dengan Math → ada banyak siswa yang kesulitan menulis.
Insight: Nilai menulis cenderung lebih stabil dari Math, tapi jumlah siswa dengan nilai sangat rendah tetap tinggi.
Outlier adalah nilai yang sangat berbeda atau jauh dari mayoritas data lainnya.
Cara memeriksa outlier
Dengan Visualisasi (Boxplot) Boxplot itu seperti grafik kotak yang nunjukin sebaran data. Titik-titik di luar garis (disebut “whiskers”) biasanya adalah outlier.
Dengan Statistik (IQR) Data dibagi menjadi 4 bagian (kuartil). Nilai yang jauh di bawah atau di atas dari kebanyakan data dianggap outlier. Biasanya, jika nilainya lebih kecil dari batas bawah atau lebih besar dari batas atas, itu outlier.
Cara Menanggulangi
# Load library
library(ggplot2)
# Baca file CSV
data <- read.csv("Expanded_data_with_more_features.csv")
# Hitung jumlah siswa berdasarkan kategori WklyStudyHours tanpa dplyr
jam_belajar_table <- table(data$WklyStudyHours)
jam_belajar_df <- as.data.frame(jam_belajar_table)
colnames(jam_belajar_df) <- c("WklyStudyHours", "Jumlah_Siswa")
# Urutkan dari jumlah siswa terbanyak
jam_belajar_df <- jam_belajar_df[order(-jam_belajar_df$Jumlah_Siswa), ]
# Tampilkan hasil
print(jam_belajar_df)
## WklyStudyHours Jumlah_Siswa
## 4 5 - 10 16246
## 2 < 5 8238
## 3 > 10 5202
## 1 955
# Visualisasikan dengan bar chart
ggplot(jam_belajar_df, aes(x = WklyStudyHours, y = Jumlah_Siswa, fill = WklyStudyHours)) +
geom_bar(stat = "identity", width = 0.6) +
labs(
title = "Kategori Jam Belajar Siswa per Minggu",
x = "Jam Belajar per Minggu",
y = "Jumlah Siswa"
) +
theme_minimal() +
theme(legend.position = "none")
Grafik tersebut menunjukkan jumlah siswa dalam tiga kategori waktu belajar per minggu:
< 5 jam/minggu Jumlah siswa yang belajar kurang dari 5 jam adalah paling sedikit. Ini menunjukkan hanya sebagian kecil siswa yang belajar sangat minim dalam seminggu.
5 - 10 jam/minggu Ini adalah kategori terbanyak, jumlah siswanya jauh lebih tinggi dibandingkan dua kategori lainnya. Artinya, mayoritas siswa berada di kelompok ini, yang artinya mereka memiliki kebiasaan belajar moderat, tidak terlalu sedikit, juga belum sangat intensif.
lebih dari 10 jam/minggu Jumlah siswa yang belajar lebih dari 10 jam perminggu cukup banyak, tapi masih lebih sedikit dari yang 5- 10 jam. Menunjukkan bahwa sebagian siswa memang punya waktu belajar tinggi, tapi bukan mayoritas.
# Load library ggplot2 saja
library(ggplot2)
# Baca data
data <- read.csv("Expanded_data_with_more_features.csv")
# Ubah nama kolom jadi EthnicGroup
colnames(data)[colnames(data) == "race.ethnicity"] <- "EthnicGroup"
# Plot Math Score per Ethnic Group
ggplot(data, aes(x = EthnicGroup, y = MathScore)) +
geom_boxplot(fill = "skyblue") +
labs(title = "Math Score per Ethnic Group", x = "Ethnic Group", y = "Math Score") +
theme_minimal()
# Plot Reading Score per Ethnic Group
ggplot(data, aes(x = EthnicGroup, y = ReadingScore)) +
geom_boxplot(fill = "lightgreen") +
labs(title = "Reading Score per Ethnic Group", x = "Ethnic Group", y = "Reading Score") +
theme_minimal()
# Plot Writing Score per Ethnic Group
ggplot(data, aes(x = EthnicGroup, y = WritingScore)) +
geom_boxplot(fill = "plum") +
labs(title = "Writing Score per Ethnic Group", x = "Ethnic Group", y = "Writing Score") +
theme_minimal()
- Intrepetasi Math Score
Berdasarkan boxplot Math Score per Ethnic Group pada gambar, dapat disimpulkan bahwa Group E memiliki nilai matematika tertinggi secara keseluruhan dibanding kelompok etnis lainnya, terlihat dari median (garis tengah boxplot) yang paling tinggi dan distribusi nilai yang cenderung lebih tinggi juga. Sementara itu, Group B dan Group C memiliki median nilai matematika yang lebih rendah, menunjukkan bahwa siswa dari kelompok ini cenderung memiliki performa yang lebih rendah dalam matematika dibanding kelompok lain. Selain itu, semua kelompok memiliki outlier di sisi bawah, artinya ada beberapa siswa di setiap kelompok yang nilainya jauh lebih rendah dari mayoritas. Namun secara keseluruhan, distribusi nilai cukup merata, dengan Group E unggul dan Group B/C agak tertinggal dari segi performa matematika.
- Intrepetasi Reading Score
Berdasarkan boxplot Reading Score per Ethnic Group, terlihat bahwa Group E kembali memiliki nilai membaca tertinggi secara keseluruhan, ditandai dengan median yang paling tinggi di antara semua kelompok etnis. Disusul oleh Group D dan Group A yang juga memiliki distribusi nilai membaca yang cukup baik. Sebaliknya, Group B dan Group C memiliki median yang paling rendah, menunjukkan bahwa rata-rata siswa dari kelompok ini memiliki performa membaca yang lebih rendah. Meskipun terdapat outlier (nilai sangat rendah) di semua kelompok, persebaran nilai secara umum menunjukkan tren serupa dengan skor matematika, yaitu Group E unggul, sementara Group B dan C cenderung tertinggal.
- Intrepetasi Writing Score
Berdasarkan boxplot Writing Score per Ethnic Group, terlihat bahwa Group E konsisten memiliki nilai tertinggi, dengan median skor menulis yang paling tinggi dibanding kelompok lain. Group D dan Group A juga menunjukkan performa menulis yang baik, meskipun sedikit di bawah Group E. Sementara itu, Group B dan Group C kembali menjadi kelompok dengan skor menulis terendah, dengan median yang paling rendah. Outlier masih muncul di semua kelompok, namun secara umum pola persebaran nilai menulis ini serupa dengan pola pada skor matematika dan membaca. Hal ini menunjukkan bahwa perbedaan performa antar kelompok etnis cukup konsisten di seluruh aspek akademik.
# Install dan load ggplot2
if (!require("ggplot2")) install.packages("ggplot2", dependencies = TRUE)
library(ggplot2)
# Baca data dari CSV
data <- read.csv("Expanded_data_with_more_features.csv")
# Ambil kolom nilai
scores <- data[, c("MathScore", "ReadingScore", "WritingScore")]
# Hitung matriks korelasi
cor_matrix <- cor(scores)
# Konversi ke data frame untuk visualisasi
cor_df <- as.data.frame(as.table(cor_matrix)) # dari matriks ke data frame
# Plot heatmap korelasi pakai ggplot2
ggplot(cor_df, aes(Var1, Var2, fill = Freq)) +
geom_tile(color = "white") +
scale_fill_gradient2(low = "#6D9EC1", high = "#E46726", mid = "white",
midpoint = 0, limit = c(-1,1), space = "Lab",
name = "Correlation") +
geom_text(aes(label = round(Freq, 2)), color = "black", size = 5) +
theme_minimal() +
labs(title = "Correlation Heatmap of Exam Scores",
x = "", y = "") +
theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))
Intrepetasi
Berdasarkan heatmap korelasi antara MathScore, ReadingScore, dan WritingScore, terlihat bahwa terdapat hubungan yang sangat kuat antara ReadingScore dan WritingScore dengan nilai korelasi sebesar 0.95, menunjukkan bahwa siswa yang memiliki kemampuan membaca yang baik cenderung juga memiliki kemampuan menulis yang tinggi. Selain itu, MathScore juga menunjukkan korelasi yang cukup kuat dengan ReadingScore (0.82) dan WritingScore (0.81), yang mengindikasikan bahwa meskipun keterampilan matematika berhubungan dengan kemampuan bahasa, kaitannya tidak sekuat antara membaca dan menulis. Secara keseluruhan, korelasi yang tinggi antar ketiga skor ini menunjukkan bahwa siswa yang unggul dalam satu bidang umumnya juga unggul dalam bidang lainnya, dan hal ini dapat dimanfaatkan untuk merancang intervensi pendidikan yang terintegrasi.
# Load library
library(ggplot2)
# Baca file
data <- read.csv("Expanded_data_with_more_features.csv")
# Hitung rata-rata MathScore per PracticeSport tanpa dplyr
mean_math <- aggregate(MathScore ~ PracticeSport, data = data, FUN = mean)
# Tambahkan jumlah siswa per kategori juga (opsional, untuk info tambahan)
count_students <- as.data.frame(table(data$PracticeSport))
colnames(count_students) <- c("PracticeSport", "Jumlah_Siswa")
# Gabungkan ke satu data frame
summary_data <- merge(mean_math, count_students, by = "PracticeSport")
# Cetak tabel
print(summary_data)
## PracticeSport MathScore Jumlah_Siswa
## 1 66.63708 631
## 2 never 64.17108 4004
## 3 regularly 67.83916 10793
## 4 sometimes 66.27483 15213
# Visualisasi rata-rata MathScore per kategori PracticeSport
ggplot(summary_data, aes(x = PracticeSport, y = MathScore, fill = PracticeSport)) +
geom_bar(stat = "identity", width = 0.6) +
labs(
title = "Rata-rata Nilai Matematika Berdasarkan Frekuensi Olahraga",
x = "Frekuensi Olahraga",
y = "Rata-rata Math Score"
) +
theme_minimal() +
theme(legend.position = "none")
Intrepetasi
Berdasarkan visualisasi di atas, dapat dilihat bahwa rata-rata nilai matematika (Math Score) siswa bervariasi tergantung pada frekuensi olahraga mereka. Siswa yang berolahraga secara teratur (regularly) memiliki rata-rata nilai matematika tertinggi dibandingkan dengan siswa yang hanya kadang-kadang (sometimes) atau tidak pernah berolahraga (never). Sementara itu, siswa yang tidak pernah berolahraga justru memiliki rata-rata nilai matematika yang sedikit lebih tinggi dari yang hanya kadang-kadang berolahraga, namun tetap lebih rendah dibandingkan mereka yang rutin berolahraga. Hal ini menunjukkan adanya indikasi bahwa kebiasaan olahraga secara rutin mungkin berkaitan positif dengan performa akademik, khususnya dalam mata pelajaran matematika. Namun, untuk memastikan apakah perbedaan ini signifikan secara statistik, perlu dilakukan uji lebih lanjut seperti ANOVA.