Pada tugas ini, anda diminta untuk membuat visualisasi data menggunakan data yang berasal dari Kagle pada link berikut https://www.kaggle.com/datasets/desalegngeb/students-exam-scores?resource=download
dimana variabelnya adalah sebagai berikut:
Data Dictionary (column description)
Visualisasi menggunakan R Markdown dan Rpubs, Markdown tutorial dan Rpubs dapat dilihat pada link berikut https://www.youtube.com/watch?v=K418swtFnik & https://www.youtube.com/watch?v=GJ36zamYVLg
Note: Nama File Data yang digunakan “Expanded Data”
Data <- read.csv("C:/Users/ASUS/Documents/SEMESTER 4/Pengantar Sains Data A/Expanded_data_with_more_features 22.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 ...
Periksa distribusi dari variabel math, reading dan writing score, cek apakah ada outlier
Apa yang dimaksud dengan outlier? jelaskan cara memeriksa dan menanggulanginya?
Jam belajar manakah per minggu yang paling banyak dilakukan oleh student
Periksa perbedaan nilai student (math, writing, reading) per ethnic
cek korelasi antar variabel math, reading, and writing score menggunakan corelation heatmap
Periksa perbedaan antara nilai student per PracticeSport. Apakah rata-rata math score pada siswa menunjukkan nilai yang tinggi pada student yang sering berolahraga
# Boxplot Math Score
boxplot(Data$MathScore, main = "Outlier - Math Score", col = "skyblue", horizontal = TRUE)
Berdasarkan hasil visualisasi menggunakan boxplot pada nilai Math Score, terlihat bahwa terdapat beberapa outlier yang ditunjukkan oleh titik-titik kecil di bagian kiri plot, yaitu pada rentang nilai di bawah 30. Titik-titik ini merupakan nilai ekstrem yang berada di luar batas normal (Q1 - 1.5 × IQR), sehingga secara statistik dikategorikan sebagai outlier. Mayoritas siswa memiliki nilai Math yang berada di antara 50 hingga 80, dengan median sekitar 65, namun keberadaan outlier menunjukkan bahwa ada sejumlah siswa yang mendapatkan nilai sangat rendah dibandingkan dengan siswa lainnya.
# Boxplot Reading Score
boxplot(Data$ReadingScore, main = "Outlier - Reading Score", col = "lightgreen", horizontal = TRUE)
Berdasarkan hasil visualisasi boxplot untuk Reading Score, terlihat bahwa terdapat sejumlah outlier di sisi kiri grafik, yang menunjukkan adanya siswa dengan nilai membaca yang jauh lebih rendah dari mayoritas siswa lainnya, yaitu sekitar di bawah 40. Titik-titik ini berada di luar batas bawah dari distribusi normal data (Q1 - 1.5 × IQR), sehingga secara statistik dianggap sebagai outlier. Sementara itu, mayoritas siswa memiliki nilai membaca dalam rentang sekitar 60 hingga 85, dengan nilai median di sekitar 75.
# Boxplot Writing Score
boxplot(Data$WritingScore, main = "Outlier - Writing Score", col = "lightcoral", horizontal = TRUE)
Berdasarkan visualisasi boxplot untuk Writing Score, terlihat bahwa terdapat cukup banyak outlier di sisi kiri grafik yang menandakan adanya siswa dengan nilai menulis yang sangat rendah, yaitu di bawah 30. Nilai-nilai ini berada di luar batas bawah distribusi normal (Q1 - 1.5 × IQR) dan secara statistik dianggap sebagai outlier. Sementara itu, sebagian besar siswa memiliki nilai Writing dalam rentang 60 hingga 85, dengan median sekitar 70.
Outlier adalah nilai data yang berada di luar pola keseluruhan dalam suatu kumpulan data. Outlier dapat berada di ujung ekstrem kumpulan data, baik lebih besar atau lebih kecil.
Cara memeriksanya :
Cari nilai Q1 (nilai 25%) dan Q3 (nilai 75%), lalu hitung IQR (selisih Q3 - Q1).
Hitung batas bawah = Q1 - 1.5 × IQR, Batas atas = Q3 + 1.5 × IQR
Nilai yang lebih kecil dari batas bawah atau lebih besar dari batas atas adalah outlier.
Hitung seberapa jauh nilai dari rata-rata.
Kalau terlalu jauh (lebih dari 3 atau kurang dari -3), itu termasuk outlier.
Cara menanggulangi :
Dihapus, kalau nilainya terlalu aneh dan bikin data jadi kacau, bisa langsung dihapus.
Diganti (Imputasi), ganti nilai outlier dengan nilai lain yang lebih wajar, seperti:Median (nilai tengah), Rata-rata kelompok
Dikelompokkan (Binning), masukkan outlier ke kelompok tertentu, misalnya: “rendah”, “sedang”, “tinggi”.
D. Diperhalus (Winsorizing), ganti outlier ekstrem dengan nilai batas maksimal/minimal yang masih masuk akal.
Dianalisis Terpisah, kalau outlier punya arti penting (misalnya siswa absen), sebaiknya tidak dihapus, tapi dipisah dan dianalisis sendiri.
Pakai Metode Analisis yang Tahan Outlier, Gunakan metode statistik seperti:Median, Regresi robust, Decision tree / Random forest
#Frekuensi kategori jam belajar per minggu
Data <- read.csv("C:/Users/ASUS/Documents/SEMESTER 4/Pengantar Sains Data A/Expanded_data_with_more_features 22.csv")
table_study <- table(Data$WklyStudyHours)
barplot(table_study,
main = "Frekuensi Kategori Jam Belajar per Minggu",
xlab = "Kategori Jam Belajar",
ylab = "Jumlah Siswa",
col = "lightgreen",
border = "darkgreen")
Berdasarkan bar chart “Frekuensi Kategori Jam Belajar per Minggu”, dapat dilihat bahwa jam belajar yang paling banyak dilakukan oleh siswa adalah dalam kategori “5 - 10 jam” per minggu. Hal ini terlihat dari tingginya batang pada kategori tersebut dibandingkan dua kategori lainnya, yaitu “< 5 jam” dan “> 10 jam”. Artinya, sebagian besar siswa dalam data ini memilih untuk belajar mandiri antara 5 hingga 10 jam setiap minggunya. Sementara itu, hanya sedikit siswa yang belajar kurang dari 5 jam atau lebih dari 10 jam per minggu. Ini menunjukkan bahwa waktu belajar yang sedang adalah yang paling umum dilakukan oleh para siswa.
# Hitung rata-rata nilai per kelompok etnis
suppressMessages(library(dplyr))
Data %>%
group_by(EthnicGroup) %>%
summarise(
Mean_Math = mean(MathScore, na.rm = TRUE),
Mean_Reading = mean(ReadingScore, na.rm = TRUE),
Mean_Writing = mean(WritingScore, na.rm = TRUE)
)
## # A tibble: 6 × 4
## EthnicGroup Mean_Math Mean_Reading Mean_Writing
## <chr> <dbl> <dbl> <dbl>
## 1 "" 66.2 68.9 67.9
## 2 "group A" 63.0 66.8 65.3
## 3 "group B" 63.5 67.3 65.9
## 4 "group C" 64.7 68.4 67.0
## 5 "group D" 67.7 70.4 70.9
## 6 "group E" 75.3 74.3 72.7
#Visualisasi
boxplot(MathScore ~ EthnicGroup, data = Data, main = "Perbandingan Nilai Math per Ethnic Group", col = "lightblue")
Berdasarkan boxplot Perbandingan Nilai Math per Ethnic Group, terlihat bahwa Group E memiliki nilai matematika rata-rata (median) tertinggi dibandingkan kelompok etnis lainnya, sementara Group A dan B memiliki median nilai yang lebih rendah. Semua kelompok menunjukkan variasi skor yang cukup besar, ditandai dengan panjang box dan whisker yang cukup lebar. Selain itu, terdapat banyak outlier (nilai ekstrem rendah) di setiap kelompok, terutama pada bagian bawah, yang menunjukkan adanya siswa dengan skor matematika jauh di bawah rata-rata. Secara keseluruhan, Group E menunjukkan performa terbaik dalam matematika, sedangkan Group A dan B perlu mendapatkan perhatian lebih karena performa matematikanya cenderung lebih rendah.
#Correlation Heatmap
suppressMessages(library(corrplot))
score_data <- Data[, c("MathScore", "ReadingScore", "WritingScore")]
cor_matrix <- cor(score_data, use = "complete.obs")
corrplot(cor_matrix,
method = "color",
type = "upper",
tl.col = "black",
addCoef.col = "black",
col = colorRampPalette(c("#f4a582", "#f7f7f7", "#92c5de"))(200),
title = "Correlation Heatmap",
mar = c(0, 0, 1, 0))
Berdasarkan Correlation Heatmap di atas, dapat dilihat bahwa terdapat hubungan yang kuat dan positif antara ketiga jenis nilai: MathScore, ReadingScore, dan WritingScore. Nilai korelasi antara MathScore dan ReadingScore adalah 0.82, sedangkan antara MathScore dan WritingScore sebesar 0.81. Hal ini menunjukkan bahwa siswa yang memiliki nilai matematika yang tinggi cenderung juga memiliki nilai membaca dan menulis yang tinggi.
Korelasi paling tinggi terlihat antara ReadingScore dan WritingScore, yaitu sebesar 0.95, yang berarti hubungan antar keduanya sangat kuat. Ini mengindikasikan bahwa kemampuan membaca dan menulis saling berkaitan erat, kemungkinan karena kedua keterampilan tersebut saling mendukung secara langsung.
Secara umum, tidak ada korelasi negatif dalam data ini, yang artinya semakin tinggi satu nilai, maka cenderung semakin tinggi pula nilai lainnya. Hal ini menunjukkan bahwa peningkatan performa akademik dalam satu aspek kemungkinan besar berdampak positif terhadap aspek lainnya.
#Rata-rata MathScore berdasarkan PracticeSport
aggregate(MathScore ~ PracticeSport, data = Data, FUN = mean)
## PracticeSport MathScore
## 1 66.63708
## 2 never 64.17108
## 3 regularly 67.83916
## 4 sometimes 66.27483
#Visualisasi
boxplot(MathScore ~ PracticeSport, data = Data,
col = c("#A8DADC", "#FDCBBA", "#FFE066"),
main = "Perbandingan Math Score berdasarkan Frekuensi Olahraga",
ylab = "Math Score",
xlab = "Practice Sport")
Berdasarkan boxplot yang membandingkan nilai Math Score berdasarkan frekuensi olahraga siswa, terlihat bahwa siswa yang sering berolahraga (regularly) memiliki median nilai matematika yang lebih tinggi dibandingkan mereka yang jarang (sometimes) atau tidak pernah berolahraga (never). Sebaran nilai cukup luas pada ketiga kelompok, namun kelompok yang tidak pernah berolahraga menunjukkan lebih banyak nilai rendah (outlier). Hal ini mengindikasikan bahwa semakin sering siswa berolahraga, semakin tinggi kecenderungan nilai matematikanya.
#Uji statistik – ANOVA
anova_result <- aov(MathScore ~ 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
Berdasarkan hasil uji ANOVA, diperoleh nilai F = 59.31 dengan p-value < 2e-16, yang berarti jauh lebih kecil dari 0.05. Hal ini menunjukkan bahwa terdapat perbedaan yang sangat signifikan secara statistik dalam nilai Math Score berdasarkan kategori frekuensi olahraga siswa (PracticeSport). Dengan demikian, hasil ini mendukung temuan visual sebelumnya bahwa frekuensi olahraga berpengaruh terhadap rata-rata nilai matematika siswa. Siswa yang lebih sering berolahraga cenderung memiliki nilai matematika yang lebih tinggi dibandingkan siswa yang jarang atau tidak pernah berolahraga.
#Uji Lanjutan
TukeyHSD(anova_result)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = MathScore ~ PracticeSport, data = Data)
##
## $PracticeSport
## diff lwr upr p adj
## never- -2.4660051 -4.1515225 -0.7804876 0.0009815
## regularly- 1.2020710 -0.4096632 2.8138052 0.2211943
## sometimes- -0.3622533 -1.9610027 1.2364962 0.9375003
## regularly-never 3.6680761 2.9398960 4.3962562 0.0000000
## sometimes-never 2.1037518 1.4047820 2.8027216 0.0000000
## sometimes-regularly -1.5643243 -2.0595787 -1.0690699 0.0000000
Berdasarkan hasil uji lanjutan Tukey HSD, terlihat bahwa terdapat beberapa perbedaan rata-rata nilai matematika yang signifikan antar kelompok frekuensi olahraga. Perbandingan antara siswa yang tidak pernah olahraga dengan yang sering olahraga (regularly) menunjukkan perbedaan signifikan (p-value < 0.001), begitu juga antara kelompok never vs sometimes dan sometimes vs regularly, yang semuanya memiliki p-value < 0.05. Hal ini menunjukkan bahwa frekuensi olahraga secara nyata memengaruhi nilai matematika siswa, dengan siswa yang sering berolahraga memiliki rata-rata nilai lebih tinggi. Namun, perbandingan antara never vs sometimes dan sometimes vs regularly menunjukkan ada kelompok yang perbedaannya tidak signifikan, seperti regularly vs sometimes (p = 0.221) dan sometimes vs never (p = 0.9375), yang mengindikasikan bahwa perbedaan di antaranya tidak terlalu kuat. Kesimpulannya, frekuensi olahraga yang konsisten (regular) berkorelasi positif dengan pencapaian nilai matematika yang lebih tinggi.