data<- read.csv("C:/Users/User/Downloads/Expanded_Data.csv")
#Menampilkan 6 baris pertama dari data set
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         10-May        69           90           88
## 3            < 5        87           93           91
## 4         10-May        45           56           42
## 5         10-May        76           78           75
## 6         10-May        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" "10-May" "< 5" "10-May" ...
##  $ 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 ...

1. Periksa distribusi dari variabel math, reading dan writing score, cek apakah ada outlier

# Load library
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.4     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
# Ubah format wide ke long menggunakan pivot_longer()
data_long <- data %>%
  pivot_longer(cols = c(MathScore, ReadingScore, WritingScore),
               names_to = "variable",
               values_to = "value")

# Boxplot dengan outlier berwarna merah
ggplot(data_long, aes(x = variable, y = value, fill = variable)) +
  geom_boxplot(outlier.color = "red", outlier.shape = 16, outlier.size = 1.5) +  # Outlier lebih terlihat
  theme_minimal() +
  labs(title = "Boxplot untuk Deteksi Outlier")

Intrepertasi nya

Boxplot menunjukkan distribusi nilai MathScore, ReadingScore, dan WritingScore, serta mendeteksi outlier yang ditandai dengan titik merah. Terlihat banyak outlier di bagian bawah, yang berarti ada cukup banyak siswa dengan nilai jauh lebih rendah dibanding mayoritas. Banyaknya outlier ini bisa disebabkan oleh beberapa faktor, seperti kemampuan akademik yang beragam, kurangnya waktu belajar, atau faktor eksternal seperti kondisi sosial ekonomi. Secara statistik, outlier muncul jika data memiliki distribusi yang miring (skewed), di mana sebagian kecil siswa memiliki skor sangat rendah dibandingkan rata-rata. Outlier dalam boxplot ini ditentukan berdasarkan metode Interquartile Range (IQR), di mana nilai yang terlalu jauh dari rentang normal dianggap sebagai outlier.

2. Apa yang dimaksud dengan oulier? jelaskan cara memeriksa dan menanggulanginya?

A. Outlier adalah nilai yang jauh berbeda dari data lainnya. Bisa dibilang, ini adalah angka yang terlalu kecil atau terlalu besar dibandingkan nilai normal dalam dataset.

B. cara memeriksa Outlier

C. Cara Menanggulanginya

3. Jam belajar manakah per minggu yang paling banyak dilakukan oleh student

# Jam Belajar per Minggu yang Paling Sering Dilakukan
# Load library
library(tidyverse)
# Cek distribusi jam belajar per minggu
ggplot(data, aes(x = WklyStudyHours)) +
  geom_bar(fill = "steelblue", color = "black") +
  theme_minimal() +
  labs(title = "Distribusi Jam Belajar Per Minggu",
       x = "Jam Belajar per Minggu",
       y = "Jumlah Siswa")

# Cek jam belajar yang paling sering dilakukan
most_common_study_hours <- data %>%
  count(WklyStudyHours) %>%
  arrange(desc(n)) %>%
  head(1)
print(most_common_study_hours)
##   WklyStudyHours     n
## 1         10-May 16246

Intrepertasi nya

Grafik distribusi menunjukkan bahwa mayoritas siswa memiliki jam belajar dalam kategori 10-May, menjadikannya sebagai modus dari distribusi ini. Kategori <5 memiliki jumlah siswa lebih banyak dibandingkan >10, tetapi tetap jauh lebih rendah dibandingkan kategori 10-May. Pola ini menunjukkan bahwa sebagian besar siswa menghabiskan waktu belajar dalam rentang 10-May, sementara siswa yang belajar lebih dari 10 jam merupakan kelompok dengan jumlah lebih sedikit.

4. Periksa perbedaan nilai student (math, writing, reading) per ethnic

# Load library
library(tidyverse)

# ANOVA untuk Math Score
anova_math <- aov(MathScore ~ EthnicGroup, data = data)
summary(anova_math)
##                Df  Sum Sq Mean Sq F value Pr(>F)    
## EthnicGroup     5  433219   86644   390.5 <2e-16 ***
## Residuals   30635 6797185     222                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# ANOVA untuk Reading Score
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 untuk Writing Score
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

Intrepertasinya

Hasil uji ANOVA menunjukkan bahwa terdapat perbedaan yang signifikan dalam skor Matematika, Membaca, dan Menulis berdasarkan kelompok etnis. Untuk skor Matematika, nilai F sebesar 390.5 dengan p-value < 2e-16 menunjukkan bahwa perbedaan antar kelompok sangat signifikan. Hal serupa terjadi pada skor Membaca dengan nilai F sebesar 142.4 dan skor Menulis dengan nilai F sebesar 170.2, yang keduanya juga memiliki p-value < 2e-16. Karena semua p-value jauh di bawah 0.05, kita dapat menyimpulkan bahwa kelompok etnis memiliki pengaruh signifikan terhadap ketiga jenis skor tersebut.

5. cek korelasi antar variabel math, reading, and writing score menggunakan corelation heatmap

# Load library
library(tidyverse)
library(ggcorrplot) 

# Ambil kolom yang dibutuhkan
nilai <- data %>% select(MathScore, ReadingScore, WritingScore)

# Hitung matriks korelasi
cor_matrix <- cor(nilai, use = "complete.obs")

# Tampilkan heatmap korelasi
ggcorrplot(cor_matrix,
           method = "circle", 
           lab = TRUE, 
           type = "lower", 
           title = "Heatmap Korelasi Antar Nilai Math, Reading, dan Writing")

Intrepertasi nya

Heatmap korelasi ini menunjukkan hubungan antara nilai Matematika (MathScore), Membaca (ReadingScore), dan Menulis (WritingScore). Korelasi yang ditunjukkan semuanya positif, dengan nilai yang cukup tinggi, yang mengindikasikan hubungan yang kuat antara ketiga variabel tersebut.

Secara keseluruhan, ketiga skor ini memiliki korelasi yang kuat satu sama lain, yang dapat menunjukkan bahwa kemampuan akademik di satu bidang cenderung berkaitan dengan bidang lainnya.

6. Periksa perbedaan antara nilai student per PracticeSport. Apakah rata-rata math score pada siswa menunjukkan nilai yang tinggi pada student yang sering berolahraga

# Load library
library(tidyverse)

# Lihat ringkasan rata-rata nilai Math berdasarkan frekuensi olahraga
data %>%
  group_by(PracticeSport) %>%
  summarise(RataRata_Math = mean(MathScore, na.rm = TRUE),
            Jumlah_Siswa = n())
## # A tibble: 4 × 3
##   PracticeSport RataRata_Math 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 boxplot Math Score berdasarkan kategori PracticeSport
ggplot(data, aes(x = PracticeSport, y = MathScore, fill = PracticeSport)) +
  geom_boxplot() +
  theme_minimal() +
  labs(title = "Perbandingan Math Score berdasarkan Frekuensi Olahraga",
       x = "Frekuensi Olahraga (PracticeSport)",
       y = "Math Score")

# Uji ANOVA untuk melihat perbedaan signifikan
anova_sport <- aov(MathScore ~ PracticeSport, data = data)
summary(anova_sport)
##                  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
# Jika signifikan, lakukan uji post-hoc Tukey
TukeyHSD(anova_sport)
##   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

Intrepertasinya

Hasil analisis menunjukkan bahwa frekuensi olahraga berpengaruh signifikan terhadap nilai matematika siswa. Dari hasil perhitungan rata-rata, siswa yang berolahraga secara teratur memiliki nilai matematika tertinggi (67,8), diikuti oleh mereka yang berolahraga sesekali (66,3), dan yang tidak pernah berolahraga memiliki nilai terendah (64,2). Uji ANOVA mengonfirmasi bahwa perbedaan ini signifikan (F = 59,31, p < 0,001). Uji post-hoc Tukey juga menunjukkan bahwa siswa yang berolahraga secara teratur memiliki perbedaan signifikan dibandingkan dengan siswa yang tidak pernah berolahraga (p < 0,001). Ini menunjukkan bahwa semakin sering siswa berolahraga, semakin tinggi kecenderungan mereka untuk mendapatkan nilai matematika yang lebih baik.