data <- read.csv ("C:/Users/user/Downloads/Expanded_data_with_more_features.csv/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 ...
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.4.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
data_long <- data %>%
pivot_longer(cols = c("MathScore", "ReadingScore", "WritingScore"),
names_to = "variable",
values_to = "value")
ggplot(data_long, aes(x = variable, y = value, fill = variable)) +
geom_boxplot() +
labs(title = "Boxplot untuk Mendeteksi Outlier", x = "Variabel", y = "Nilai") +
theme_minimal()
data_long <- data %>%
pivot_longer(cols = c("MathScore", "ReadingScore", "WritingScore"),
names_to = "variable",
values_to = "value")
ggplot(data_long, aes(x = value, fill = variable)) +
geom_histogram(bins = 20, alpha = 0.6, position = "identity") +
facet_wrap(~variable, scales = "free") +
labs(title = "Histogram untuk Distribusi Data", x = "Nilai", y = "Frekuensi") +
theme_minimal()
Outlier atau pencilan adalah objek data yang menyimpang secara signifikan dari objek lainnya dalam suatu kelompok data. Adanya outlier dapat menyebabkan analisis data menggunakan metode statistik standar menjadi bias. Mengatasi outlier adalah langkah penting dalam analisis data yang bertujuan untuk meningkatkan akurasi dan validitas model. Outlier adalah nilai yang secara signifikan berbeda dari nilai lain dalam dataset, yang dapat disebabkan oleh kesalahan pengukuran, variasi alami, atau faktor eksternal. Jika tidak ditangani dengan baik, outlier dapat memengaruhi hasil analisis dan memberikan gambaran yang salah tentang pola dalam data.
Salah satu metode yang umum digunakan untuk mengidentifikasi outlier adalah menggunakan teknik visualisasi, seperti box plot atau scatter plot. Box plot, misalnya, dapat dengan jelas menunjukkan nilai-nilai yang berada di luar rentang interquartile (IQR). Dengan visualisasi ini, analis dapat dengan mudah melihat titik data yang mencolok dan memutuskan apakah mereka perlu ditangani lebih lanjut. Ini merupakan langkah awal yang penting sebelum memutuskan bagaimana cara menangani outlier.
Setelah outlier teridentifikasi, langkah selanjutnya adalah menentukan apakah outlier tersebut valid atau perlu dihapus. Jika outlier muncul akibat kesalahan pengukuran atau data yang tidak valid, maka penghapusan entri tersebut adalah solusi yang tepat. Namun, jika outlier mencerminkan variasi yang sebenarnya dalam data, mereka sebaiknya tidak dihapus karena bisa memberikan wawasan yang berharga. Dalam hal ini, pemahaman konteks data sangat penting untuk membuat keputusan yang tepat.
Metode lain untuk menangani outlier adalah dengan melakukan transformasi data. Misalnya, menggunakan transformasi logaritmik dapat membantu mereduksi dampak outlier pada distribusi data dan membuat data lebih mendekati distribusi normal. Ini memungkinkan model untuk berfungsi dengan lebih baik dan menghasilkan analisis yang lebih akurat. Selain itu, penggunaan teknik robust statistical methods yang kurang terpengaruh oleh outlier, seperti median atau kuartil, juga bisa menjadi solusi yang efektif
library(ggplot2)
library(dplyr)
##
## 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
# Menghitung frekuensi jam belajar (ganti StudyHours dengan nama kolom yang sesuai)
most_common_hours <- data %>%
group_by(WklyStudyHours) %>%
summarise(Frequency = n()) %>%
arrange(desc(Frequency))
# Menampilkan jam belajar paling umum
most_common_hours[1, ]
## # A tibble: 1 × 2
## WklyStudyHours Frequency
## <chr> <int>
## 1 5 - 10 16246
# Visualisasi distribusi jam belajar
ggplot(most_common_hours, aes(x = factor(WklyStudyHours), y = Frequency)) +
geom_bar(stat = "identity", fill = "lightblue") +
labs(title = "Frekuensi Jam Belajar per Minggu",
x = "Jam Belajar per Minggu",
y = "Jumlah Siswa") +
theme_minimal()
Mayoritas siswa menghabiskan waktu belajar antara 5 hingga 10 jam per minggu. Relatif sedikit siswa yang belajar lebih dari 10 jam per minggu atau kurang dari 5 jam.Data ini menunjukkan bahwa waktu belajar siswa secara umum terkonsentrasi di kisaran menengah, bukan di ekstrem bawah (malas belajar) atau ekstrem atas (sangat rajin).
# Hitung rata-rata nilai Math, Reading, Writing berdasarkan Ethnicity
summary_scores <- 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)
)
# Tampilkdata_long# Tampilkan hasil
print(summary_scores)
## # 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
# Ubah data ke format long agar bisa diplot lebih mudah
library(tidyr)
data_long <- data %>%
pivot_longer(cols = c(MathScore, ReadingScore, WritingScore),
names_to = "Subject",
values_to = "Score")
# Plot boxplot
ggplot(data_long, aes(x = EthnicGroup, y = Score, fill = Subject)) +
geom_boxplot(alpha = 0.7) +
labs(title = "Distribusi Nilai Berdasarkan EthnicGroup",
x = "Ethnicity",
y = "Score") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Perbandingan antar Ethnic Group: Group E menunjukkan skor tertinggi secara konsisten pada semua mata pelajaran (Math, Reading, dan Writing). Group A dan B cenderung memiliki skor yang lebih rendah dibandingkan kelompok lainnya. Group C dan D berada di tengah-tengah, dengan sebaran skor yang relatif stabil. Reading adalah subjek dengan performa tertinggi lintas kelompok etnis, sedangkan Math adalah yang terendah.
library(ggplot2)
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.4.3
##
## Attaching package: 'reshape2'
## The following object is masked from 'package:tidyr':
##
## smiths
# Hitung korelasi
cor_matrix <- cor(data[, c("MathScore", "ReadingScore", "WritingScore")], use = "complete.obs")
# Ubah format ke long untuk ggplot
cor_melt <- melt(cor_matrix)
# Buat heatmap dengan ggplot2
ggplot(cor_melt, aes(x = Var1, y = Var2, fill = value)) +
geom_tile(color = "white") +
scale_fill_gradient2(low = "lightblue", high = "lightgreen", mid = "white",
midpoint = 0.5, limit = c(0, 1), space = "Lab",
name = "Korelasi") +
geom_text(aes(label = round(value, 2)), size = 5) +
theme_minimal() +
labs(title = "Correlation Heatmap",
x = "Variabel", y = "Variabel")
Semua skor memiliki hubungan positif dan kuat satu sama lain. ReadingScore dan WritingScore memiliki hubungan paling kuat (0.95), menunjukkan bahwa siswa yang pandai membaca cenderung juga pandai menulis. Korelasi MathScore dengan ReadingScore dan WritingScore juga cukup kuat (0.81–0.82), namun sedikit lebih rendah dibanding pasangan lainnya.
library(ggplot2)
library(dplyr)
# Hitung rata-rata MathScore per kategori PracticeSport
avg_math_sport <- data %>%
group_by(PracticeSport) %>%
summarise(RataRata_MathScore = mean(MathScore, na.rm = TRUE),
Jumlah_Siswa = n())
# Tampilkan rata-rata
print(avg_math_sport)
## # A tibble: 4 × 3
## PracticeSport RataRata_MathScore Jumlah_Siswa
## <chr> <dbl> <int>
## 1 "" 66.6 631
## 2 "never" 64.2 4004
## 3 "regularly" 67.8 10793
## 4 "sometimes" 66.3 15213
# Visualisasi rata-rata MathScore per kelompok olahraga
ggplot(avg_math_sport, aes(x = PracticeSport, y = RataRata_MathScore, fill = PracticeSport)) +
geom_col(width = 0.6) +
labs(title = "Rata-rata Math Score berdasarkan Frekuensi Olahraga",
x = "Frekuensi Olahraga (PracticeSport)",
y = "Rata-rata Math Score") +
theme_minimal()
Siswa yang berolahraga secara rutin (regularly) memiliki rata-rata nilai Matematika tertinggi di antara tiga kelompok. Nilai ini lebih tinggi dibandingkan siswa yang “never” dan “sometimes” berolahraga. Selisih nilai rata-rata antara kelompok “regularly” dan “never” kira-kira 4 poin, yang bisa dianggap cukup berarti dalam konteks akademik. Rata-rata Math Score pada siswa menunjukkan nilai yang lebih tinggi pada student yang sering berolahraga dibandingkan mereka yang jarang atau tidak pernah berolahraga. Hal ini mengindikasikan adanya kemungkinan hubungan positif antara kebiasaan berolahraga secara rutin dengan performa akademik di bidang Matematika.