Diberikan data dari Kaggle yaitu: Students Exam Scores Extended Data
data <- read.csv("C:/Users/USER/Downloads/Expanded_Data.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 ...
Untuk distribusi dapat menggunakan visualisasi Histogram dan untuk memeriksa outlier dapat menggunakan Boxplot
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
#Histogram
ggplot(data, aes(x = MathScore )) +
geom_histogram(bins = 30, fill = "#D2E0D3", alpha = 0.5) +
labs(title = "Distribusi Math Score", x = "Math Score", y = "Frekuensi") +
theme_minimal()
Histogram menunjukkan distribusi Math Score, mayoritas siswa berada dalam rentang 50 hingga 80, dengan frekuensi tertinggi sekitar 70. Bentuk distribusinya tampak mendekati normal, meskipun terdapat beberapa lonjakan di bagian atas distribusi. Selain itu, terlihat sedikit skwness ke kiri, yang mengindikasikan bahwa lebih banyak siswa mendapatkan nilai tinggi dibandingkan nilai rendah.
ggplot(data, aes(x = ReadingScore)) +
geom_histogram(bins = 30, fill = "#97B3AE", alpha = 0.5) +
labs(title = "Distribusi Reading Score", x = "Reading Score", y = "Frekuensi") +
theme_minimal()
Histogram menunjukkan distribusi Reading Score, mayoritas siswa mendapatkan nilai antara 50 dan 80 dengan puncak distribusi di sekitar 75. Bentuknya hampir simetris yang menunjukkan bahwa Reading Score tersebar cukup merata tanpa adanya kecenderungan ekstrem ke arah nilai yang sangat rendah atau sanggat tinggi.
ggplot(data, aes(x = WritingScore)) +
geom_histogram(bins = 30, fill = "#F0DDD6", alpha = 0.5) +
labs(title = "Distribusi Writing Score", x = "Writing Score", y = "Frekuensi") +
theme_minimal()
Histogram menunjukkan distribusi Writing Score, mayoritas siswa memiliki nilai dalam rentang 50 hingga 80, dengan puncak di sekitar 70-85. Pola distribusinya mirip dengan distribusi Reading Score yang artinya terdapat korelasi antara kemampuan membaca dan menulis
ggplot(data, aes(y = MathScore)) +
geom_boxplot(fill = "#D2E0D3") +
labs(title = "Boxplot Math Score") + theme_minimal()
Pada Boxplot Math Score menunjukkan bahwa outlier terlihat di bagian bawah distribusi, dengan beberapa titik data yang jauh lebih rendah dari batas bawah whisker.
ggplot(data, aes(y = ReadingScore)) +
geom_boxplot(fill = "#97B3AE") +
labs(title = "Boxplot Reading Score") + theme_minimal()
Pada Boxplot Reading Score menunjukkan bahwa outlier terlihat di bagian bawah, dengan distribusi yang mirip dengan Math Score.
ggplot(data, aes(y = WritingScore)) +
geom_boxplot(fill = "#F0DDD6") +
labs(title = "Boxplot Writing Score") + theme_minimal()
Pada Boxplot Writing Score menunjukkan jumlah outlier yang lebih banyak dibandingkan dua variabel sebelumnya, yang artinya ada lebih banyak siswa dengan nilai menulis yang jauh lebih rendah dari distribusi utama.
2.1 Outlier merupakan nilai yang jauh lebih besar atau lebih kecil dibandingkan dnegan mayoritas data yang disebabkan oleh kesalahan pencatatan, variabilitas alami, atau kondisi khusus dalam data.
2.2 Cara memeriksa outlier:
library(ggplot2)
ggplot(data, aes(y = MathScore)) +
geom_boxplot(fill = "#D2E0D3") +
labs(title = "Boxplot Math Score", y = "Math Score") + theme_minimal()
Q1 <- quantile(data$MathScore, 0.25)
Q3 <- quantile(data$MathScore, 0.75)
IQR_value <- Q3 - Q1
# Batas bawah dan atas
lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value
# Nilai outlier
outliers <- data$MathScore[data$MathScore < lower_bound | data$MathScore > upper_bound]
outliers
## [1] 18 0 21 18 8 21 22 17 20 16 21 21 22 19 22 22 22 17 20 15 15 18 18 11 19
## [26] 12 12 13 18 22 17 19 21 21 9 18 21 22 10 7 22 21 17 22 10 22 14 14 19 19
## [51] 11 9 10 13 18 20 21 16 13 22 13 22 10 16 21 21 16 18 20 19 9 19 11 9 21
## [76] 19
2.3 Cara menanggulangi Outlier
data_clean <- data[data$MathScore >= lower_bound & data$MathScore <= upper_bound, ]
data$MathScore[data$MathScore < lower_bound | data$MathScore > upper_bound] <- median(data$MathScore)
data$MathScore_log <- log(data$MathScore)
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
data |>
count(WklyStudyHours) |>
arrange(desc(n))
## WklyStudyHours n
## 1 5 - 10 16246
## 2 < 5 8238
## 3 > 10 5202
## 4 955
Berdasarkan hasil di atas, dapat diketahui bahwa pada kategori 5-10 jam per minggu merupakan lamanya waktu jam belajar yang dilakukan oleh mayoritas siswa.
table(data$EthnicGroup)
##
## group A group B group C group D group E
## 1840 2219 5826 9212 7503 4041
Dari distribusi data, terlihat bahwa jumlah siswa dalam setiap kelompok bervariasi, dengan kelompok C yang memiliki jumlah terbesar, sementara kelompok A yang paling sedikit yang menyebabkan ketidakseimbangan sehingga memengaruhi interpretasi hasil.
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.3 68.9 67.9
## 2 "group A" 63.1 66.8 65.3
## 3 "group B" 63.7 67.3 65.9
## 4 "group C" 64.9 68.4 67.0
## 5 "group D" 67.7 70.4 70.9
## 6 "group E" 75.3 74.3 72.7
Dari rata-rata nilai, kelompok E konsisten memiliki skor tertinggi dalam semua kategori, dengan MathScore rata-rata 75.3, ReadingScore 74.3, dan WritingScore 72.7. Sebaliknya, kelompok A memiliki skor terendah dengan MathScore rata-rata 63.1, Reading 66.8, dan Writing 65.3.
ggplot(data, aes(x = EthnicGroup, y = MathScore)) +
geom_boxplot(fill = "#D2E0D3") +
labs(title = "Math Score per Ethnic Group", x = "Ethnic Group", y = "Math Score") +
theme_minimal()
ggplot(data, aes(x = EthnicGroup, y = ReadingScore)) +
geom_boxplot(fill = "#97B3AE") +
labs(title = "Reading Score per Ethnic Group", x = "Ethnic Group", y = "Reading Score") + theme_minimal()
ggplot(data, aes(x = EthnicGroup, y = WritingScore)) +
geom_boxplot(fill = "#F0DDD6") +
labs(title = "Writing Score per Ethnic Group", x = "Ethnic Group", y = "Writing Score") +theme_minimal()
Visualisasi boxplot menunjukkan bahwa kelompok E memiliki median yang lebih tinggi dibandingkan dengan kelompok lain, sementara kelompok A, B, dan C cenderung memiliki distribusi yang lebih mirip. Variasi dalam setiap kelompok cukup besar, terutama dalam Writing yang menunjukkan adanya outlier atau siswa dengan skor sangat tinggi maupun sangat rendah.
anova_math <- aov(MathScore ~ EthnicGroup, data = data)
summary(anova_math)
## Df Sum Sq Mean Sq F value Pr(>F)
## EthnicGroup 5 418937 83787 387.6 <2e-16 ***
## Residuals 30635 6621616 216
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova_reading <- aov(ReadingScore ~ EthnicGroup, data = data)
summary(anova_reading)
## Df Sum Sq Mean Sq F value Pr(>F)
## EthnicGroup 5 151623 30325 142.4 <2e-16 ***
## Residuals 30635 6522586 213
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
anova_writing <- aov(WritingScore ~ EthnicGroup, data = data)
summary(anova_writing)
## Df Sum Sq Mean Sq F value Pr(>F)
## EthnicGroup 5 197543 39509 170.2 <2e-16 ***
## Residuals 30635 7110172 232
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Hasil uji ANOVA menunjukkan bahwa perbedaan nilai antar kelompok etnis kemungkinan besar signifikan secara statistik. Dengan demikian, dapat disimpulkan bahwa faktor etnis memiliki pengaruh terhadap perbedaan skor akademik siswa, terutama dengan kelompok E yang unggul secara konsisten dan kelompok A yang memiliki performa lebih rendah.
library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 4.3.3
library(ggplot2)
# Buat subset data hanya dengan variabel yang diinginkan
data_subset <- data[, c("MathScore", "ReadingScore", "WritingScore")]
# Hitung korelasi
cor_matrix <- cor(data_subset, use = "complete.obs")
# Tampilkan korelasi dalam bentuk heatmap
ggcorrplot(cor_matrix,
method = "square",
type = "lower",
lab = TRUE,
colors = c("#97B3AE", "#D2E0D3", "#F0DDD6"))
Berdasarkan hasil analisis korelasi anntara MathScore, ReadingScore, dan WritingScore dapat diketahui bahwa terdapat hubungan yang kuat diantara ketiga variabel tersebut. Korelasi tertinggi atau sangat kuat terajdi antara ReadingScore dan WritingScore dengan nilai 0.95 yang menunjukkan bahwa siswa yang memiliki kemampuan membaca yang baik cenderung memiliki kemampuan menulis yang tinggi juga. Sementara itu, MathScore memiliki korelasi sebesar 0.81 dengan ReadingScore dan 0.80 dengan WritingScore yang mengindikasikan bahwa siswa dengan kemampuan matematika yang baik cenderung memiliki keterampilan literasi yang tinggi juga, meskipun hubungan ini tidka sekuat antara Membaca dan Menulis.