Pada mata kuliah Pengantar Sains Data Kelas A Pekan ke-6, data yang diolah berasal dari Kagle pada link yaitu https://www.kaggle.com/datasets/desalegngeb/students-exam-scores?resource=download, dimana variabelnya adalah sebagai berikut:
Kamus Data (deskripsi kolom)
data<- read.csv("D:\\KAMPUS MBA\\PSD\\Expanded_data_with_more_features.csv")
# Menampilkan 6 baris pertama dari dataset
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 ...
# Cek ringkasan statistik
summary(data[, c("MathScore", "ReadingScore", "WritingScore")])
## MathScore ReadingScore WritingScore
## Min. : 0.00 Min. : 10.00 Min. : 4.00
## 1st Qu.: 56.00 1st Qu.: 59.00 1st Qu.: 58.00
## Median : 67.00 Median : 70.00 Median : 69.00
## Mean : 66.56 Mean : 69.38 Mean : 68.42
## 3rd Qu.: 78.00 3rd Qu.: 80.00 3rd Qu.: 79.00
## Max. :100.00 Max. :100.00 Max. :100.00
# Deteksi outlier dengan boxplot
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
ggplot(data, aes(y = MathScore)) +
geom_boxplot(fill = "lightpink", alpha = 0.5) +
theme_minimal() + ggtitle("Boxplot Math Score")
ggplot(data, aes(y = ReadingScore)) +
geom_boxplot(fill = "darkseagreen1", alpha = 0.5) +
theme_minimal() + ggtitle("Boxplot Reading Score")
ggplot(data, aes(y = WritingScore)) +
geom_boxplot(fill = "skyblue", alpha = 0.5) +
theme_minimal() + ggtitle("Boxplot Writing Score")
Terdapat beberapa outlier pada variabel Math Score, Reading Score, dan Writing Score yang ditandai dengan titik-titik di bawah whisker bagian bawah. Outlier ini menunjukkan nilai yang jauh lebih rendah dibandingkan mayoritas data.
Outlier adalah data yang memiliki nilai sangat berbeda atau menyimpang jauh dari sebagian besar data lainnya dalam suatu dataset. Keberadaannya dapat disebabkan oleh kesalahan pencatatan, pengukuran, atau memang merupakan fenomena unik dalam data.
Cara Memeriksa Outlier:
Metode statistik dengan menggunakan Interquartile Range (IQR), dimana data dianggap outlier jika berada di bawah Q1-1,5 IQR atau di atas Q3+1.5 IQR. Dapat juga menggunakan Z-score, dimana data dengan nilai lebih dari 3 atau kurang dari -3 dianggap sebagai outlier.
Metode visualisasi seperti boxplot membantu memeriksa outlier dengan menampilkan titik-titik yang berada di luar whisker.Selain itu, histogram dan scatter plot juga dapat digunakan untuk melihat pola distribusi data.
Cara Menanggulangi Outlier:
Memeriksa sumber data untuk memastikan apakah outlier berasal dari kesalahan pencatatan
Menghapusnya jika terbukti sebagai kesalahan
Mentransformasi data menggunakan metode seperti logaritma atau normalisasi untuk mengurangi pengaruh outlier.
Menggunakan metode statistik yang lebih tahan terhadap outlier, misalnya memilih median daripada mean untuk analisis.
Jika outlier memiliki makna penting dalam analisis, seperti dalam data keuangan atau medis, sebaiknya dianalisis lebih lanjut untuk memahami penyebabnya.
dengan menggunakan fungsi table() untuk menghitung frekuensi dan which.max() untuk menemukan nilai tertinggi.
# Menghitung frekuensi setiap kategori jam belajar
table(data$WklyStudyHours)
##
## < 5 > 10 5 - 10
## 955 8238 5202 16246
# Menampilkan kategori jam belajar yang paling banyak dilakukan
names(which.max(table(data$WklyStudyHours)))
## [1] "5 - 10"
Jam belajar per minggu yang paling banyak dilakukan oleh student adalah 5 - 10 jam sebanyak 16.246 siswa.
# Load library yang diperlukan
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
# Memperbaiki kategori kosong ("" NA atau sesuatu yang aneh
data <- data[!(data$EthnicGroup == "" | is.na(data$EthnicGroup)), ]
# Menghitung rata-rata nilai Math, Reading, dan Writing berdasarkan etnis
data %>%
group_by(EthnicGroup) %>%
summarise(
AvgMath = mean(MathScore, na.rm = TRUE),
AvgReading = mean(ReadingScore, na.rm = TRUE),
AvgWriting = mean(WritingScore, na.rm = TRUE)
)
## # A tibble: 5 × 4
## EthnicGroup AvgMath AvgReading AvgWriting
## <chr> <dbl> <dbl> <dbl>
## 1 group A 63.0 66.8 65.3
## 2 group B 63.5 67.3 65.9
## 3 group C 64.7 68.4 67.0
## 4 group D 67.7 70.4 70.9
## 5 group E 75.3 74.3 72.7
# Definisikan warna untuk setiap kelompok etnis
warna_etnis <- c("group A" = "darkolivegreen1",
"group B" = "darkolivegreen2",
"group C" = "darkolivegreen3",
"group D" = "darkolivegreen4",
"group E" = "darkolivegreen")
# Visualisasi perbedaan nilai menggunakan boxplot
ggplot(data, aes(x = EthnicGroup, y = MathScore, fill = EthnicGroup)) +
geom_boxplot() +
scale_fill_manual(values = warna_etnis) +
theme_minimal() +
ggtitle("Distribusi Nilai Math Berdasarkan Etnis")
ggplot(data, aes(x = EthnicGroup, y = ReadingScore, fill = EthnicGroup)) +
geom_boxplot() +
scale_fill_manual(values = warna_etnis) +
theme_minimal() +
ggtitle("Distribusi Nilai Reading Berdasarkan Etnis")
ggplot(data, aes(x = EthnicGroup, y = WritingScore, fill = EthnicGroup)) +
geom_boxplot() +
scale_fill_manual(values = warna_etnis) +
theme_minimal() +
ggtitle("Distribusi Nilai Writing Berdasarkan Etnis")
Kelompok E dan D memiliki nilai tertinggi dalam Math, Reading, dan Writing, dengan median yang lebih tinggi dibandingkan kelompok lainnya, sementara kelompok A cenderung memiliki median terendah. Kelompok B dan C berada di tengah dengan variasi nilai yang cukup besar termasuk beberapa siswa dengan nilai rendah (outlier). Meskipun terdapat perbedaan antar kelompok, pola distribusinya relatif mirip, dengan kelompok D dan E lebih stabil dalam pencapaian nilai.
# Load library yang diperlukan
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.3.3
# Pastikan hanya kolom Math, Reading, dan Writing yang digunakan
data_subset <- data[, c("MathScore", "ReadingScore", "WritingScore")]
# Hitung korelasi antar variabel
cor_matrix <- cor(data_subset, use = "complete.obs")
# Ubah ke format long untuk ggplot
melted_cor <- melt(cor_matrix)
# Plot heatmap korelasi
ggplot(melted_cor, aes(Var1, Var2, fill = value)) +
geom_tile() +
geom_text(aes(label = round(value, 2)), color = "white", size = 5) +
scale_fill_gradient2(low = "pink", mid = "white", high = "skyblue", midpoint = 0) +
theme_minimal() +
labs(title = "Heatmap Korelasi Nilai", x = "Variabel", y = "Variabel")
Terdapat hubungan positif yang kuat antara nilai Math, Reading, dan Writing. Korelasi tertinggi terjadi antara Reading Score dan Writing Score (0.95) menunjukkan bahwa siswa yang memiliki nilai tinggi dalam Reading cenderung memiliki nilai tinggi dalam Writing juga. Sedangkan, Math Score memiliki korelasi yang lebih rendah dengan Reading Score (0.82) dan Writing Score (0.81) menunjukkan bahwa kemampuan matematika tetap berhubungan dengan kedua aspek literasi, tetapi tidak sekuat hubungan antara Reading dan Writing. Hal ini menjelaskan bahwa keterampilan membaca dan menulis lebih saling berkaitan dibandingkan dengan keterampilan matematika.