Import Data

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 ...

Memeriksa distribusi dari variabel math, reading dan writing score serta outliernya

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()

Kesimpulan

a. Semua variabel memiliki outlier di sisi bawah, artinya ada siswa-siswa dengan nilai yang jauh lebih rendah dari mayoritas.
b. Tidak ada outlier di sisi atas (nilai tinggi), menandakan bahwa nilai-nilai tinggi masih dalam rentang yang dianggap normal secara statistik.
c. Bisa disimpulkan bahwa kelompok siswa dengan nilai rendah lebih bervariasi dan mencolok dibanding kelompok siswa dengan nilai tinggi.
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()

Kesimpulan

a. MathScore menunjukkan distribusi yang paling tidak simetris dengan lebih banyak nilai rendah (left-skewed) → menunjukkan adanya tantangan dalam pelajaran Matematika.
b. ReadingScore dan WritingScore memiliki distribusi yang lebih simetris dan normal, menunjukkan stabilitas performa siswa dalam dua aspek tersebut.
c. Hal ini juga mendukung temuan dari boxplot sebelumnya bahwa nilai rendah yang ekstrem (outlier) lebih dominan di Matematika.

Pengertian outlier serta cara memeriksa dan menanggulanginya

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

Jam belajar yang paling banyak dilakukan siswa per minggu

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()

Kesimpulan:

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).

Perbedaan nilai student per ethnic

# 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))

Interpretasi

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.

Korelasi variabel MathScore, RadingScore, dan WritingScore dengan heatmap

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")

Interpretasi

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.

Perbedaan antara nilai student per PracticeSport

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()

Kesimpulan

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.