Data yang digunakan sebagai berikut :

data <- read.csv("D:/Kuliah/Pengantar Sains Data/Expanded.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 ...

PERTANYAAN :

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

JAWABAN :

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.2
## 
## 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
cek_distribusi <- function(data, kolom) {
  p1 <- ggplot(data, aes_string(x = kolom)) +
    geom_histogram(binwidth = 5, fill = "skyblue", color = "black") +
    theme_minimal() +
    labs(title = paste("Distribusi", kolom), x = kolom, y = "Frekuensi")
  p2 <- ggplot(data, aes_string(y = kolom)) +
    geom_boxplot(fill = "tomato", color = "black") +
    theme_minimal() +
    labs(title = paste("Boxplot", kolom), y = kolom)
  
  print(p1)
  print(p2)
  

  scores <- data[[kolom]]
  Q1 <- quantile(scores, 0.25, na.rm = TRUE)
  Q3 <- quantile(scores, 0.75, na.rm = TRUE)
  IQR_value <- Q3 - Q1
  lower_bound <- Q1 - 1.5 * IQR_value
  upper_bound <- Q3 + 1.5 * IQR_value
  outliers <- scores[scores < lower_bound | scores > upper_bound]
  
  cat("\nJumlah outlier di", kolom, ":", length(outliers), "\n")
  cat("Outlier:", outliers, "\n\n")
}

cek_distribusi(data, "MathScore")
## Warning: `aes_string()` was deprecated in ggplot2 3.0.0.
## ℹ Please use tidy evaluation idioms with `aes()`.
## ℹ See also `vignette("ggplot2-in-packages")` for more information.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

## 
## Jumlah outlier di MathScore : 76 
## Outlier: 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 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 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 19
cek_distribusi(data, "ReadingScore")

## 
## Jumlah outlier di ReadingScore : 90 
## Outlier: 17 25 23 24 24 26 23 21 18 25 15 23 24 11 17 24 23 26 24 17 20 24 24 25 19 25 16 20 22 26 22 27 27 23 22 23 19 23 24 11 27 24 26 22 27 23 17 23 12 12 18 23 16 27 23 23 21 20 20 26 26 21 23 26 27 24 27 16 23 24 23 12 26 15 21 27 17 25 18 19 10 25 23 25 25 26 18 14 25 19
cek_distribusi(data, "WritingScore")

## 
## Jumlah outlier di WritingScore : 109 
## Outlier: 10 21 19 26 15 23 17 25 26 24 15 20 21 25 24 23 6 17 24 22 22 21 25 14 26 25 18 16 19 23 26 19 24 14 17 26 24 24 21 24 23 15 26 24 18 19 20 21 24 15 24 12 22 25 18 16 24 26 17 19 24 18 9 19 20 25 18 21 23 19 16 18 25 23 20 20 20 22 26 26 26 24 26 25 18 20 23 24 23 17 15 21 12 25 16 25 20 18 13 26 20 23 21 26 26 22 4 20 24

PENJELASAN : Visualisasi yang digunakan adalah Histogram untuk melihat apakah skor menyebar normal atau condong ke kiri/kanan. Boxplot untuk melihat pakah ada outlier (ditunjukkan dengan titik di luar box).

Diperoleh hasil bahwa pada Histogram istribusi pada variabel math score,Reading score,dan Writing Score memiliki distribusi yang tidak normal karna grafik lebih condong ke sekalah kanan yang bisa dinyatakan bahwa setiap variabel memiliki distrbusi tidak normal. Pada Boxplot setiap variabel Math score, reading score, dan Writing score didapatkan bahwa terdapat data-data yang berasa di outlier dan outlier didapat dilihat terdapat dibawah dari whisker menunjukkan outlier.

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

JAWABAN :

Outlier adalah data yang menyimpang jauh dari sebagian besar data lainnya dalam satu variabel. Biasanya nilai ini terlalu tinggi atau terlalu rendah dibandingkan nilai mayoritas.

Outlier dapat diperiksa melalui dua pendekatan utama, yaitu pendekatan statistik dan visualisasi data. Dalam pendekatan statistik, metode yang sering digunakan adalah IQR (Interquartile Range), di mana nilai yang berada di bawah batas bawah (Q1 - 1.5×IQR) atau di atas batas atas (Q3 + 1.5×IQR) dianggap sebagai outlier. Sedangkan dengan visualisasi data, outlier bisa dikenali melalui grafik seperti boxplot dan scatterplot, yang secara visual menunjukkan titik-titik data yang menyimpang jauh dari pola umum.

Untuk menanggulangi outlier, langkah pertama yang penting adalah memeriksa kembali data. Hal ini dilakukan untuk memastikan apakah outlier muncul karena kesalahan input atau kesalahan pengukuran. Jika ditemukan kesalahan, data tersebut dapat dikoreksi atau dihapus. Jika outlier memang disebabkan oleh kesalahan yang jelas, penghapusan bisa menjadi solusi, namun hal ini harus dilakukan dengan hati-hati, terutama jika nilai tersebut sebenarnya merupakan bagian dari variasi alami data.

Selain itu, transformasi data dapat digunakan untuk mengurangi dampak outlier, terutama jika distribusi data tidak normal. Transformasi seperti logaritma, akar kuadrat, atau Box-Cox bisa membantu menormalkan data dan menurunkan pengaruh outlier. Dalam analisis statistik, disarankan juga menggunakan metode yang robust terhadap outlier, seperti menggunakan median dan IQR dibandingkan mean dan standar deviasi, atau menerapkan algoritma seperti Regresi Robust yang lebih tahan terhadap data ekstrem. Salah satu teknik lain yang cukup efektif adalah Winsorizing, yaitu mengganti nilai outlier dengan nilai yang lebih moderat, misalnya nilai kuartil tertentu, agar dampaknya tidak terlalu memengaruhi keseluruhan analisis.

Dengan pendekatan-pendekatan tersebut, penanganan outlier dapat dilakukan secara tepat tanpa mengorbankan integritas data.

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

JAWABAN :

Kita bisa melihat nya lewat variabel WklyStudyHours (jam belajar per minggu).

study_freq <- table(data$WklyStudyHours)

most_common_study <- names(study_freq)[which.max(study_freq)]
cat("Jam belajar per minggu yang paling banyak dilakukan adalah:", most_common_study)
## Jam belajar per minggu yang paling banyak dilakukan adalah: 5 - 10

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

JAWABAN :

Untuk mengetahui perbedaan dari nilai student (math, writing, dan reading) per ethnic, dilakukan perhitungan untuk mengetahui nilai rata-rata variabel pada data dengan setiap kategori group pada variabel ethnic group.

aggregate(cbind(MathScore, ReadingScore, WritingScore) ~ EthnicGroup, data = data, FUN = mean)
##   EthnicGroup MathScore ReadingScore WritingScore
## 1              66.18587     68.91576     67.90054
## 2     group A  62.99189     66.78774     65.25192
## 3     group B  63.49022     67.32046     65.89513
## 4     group C  64.69572     68.43823     66.99924
## 5     group D  67.66640     70.38225     70.89084
## 6     group E  75.29894     74.25142     72.67706

PENJELASAN : Berdasarkan hasil pengelompokan nilai Math, Reading, dan Writing berdasarkan EthnicGroup, terlihat bahwa rata-rata nilai tertinggi dimiliki oleh kelompok Group E, sedangkan nilai terendah terdapat pada Group A dan Group B. Secara umum, terdapat kecenderungan peningkatan rata-rata nilai dari Group A menuju Group E. Hal ini menunjukkan bahwa terdapat perbedaan performa akademik antar kelompok etnis dalam data yang dianalisis. Selain itu, terdapat satu baris data dengan nilai EthnicGroup kosong namun memiliki skor cukup tinggi, yang perlu ditindaklanjuti karena dapat memengaruhi hasil analisis.

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

JAWABAN :

library(ggplot2)
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.4.3
library(RColorBrewer)

# Ambil subset data yang berisi ketiga skor
score_data <- data[, c("MathScore", "ReadingScore", "WritingScore")]

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

# Ubah ke format long agar bisa dipakai untuk heatmap
melted_cor <- melt(cor_matrix)

# Buat heatmap dengan ggplot
ggplot(melted_cor, aes(x = Var1, y = Var2, fill = value)) +
  geom_tile(color = "white") +
  scale_fill_gradient2(low = "#d73027", high = "#1a9850", mid = "white",
                       midpoint = 0.5, limit = c(0,1), space = "Lab",
                       name = "Korelasi") +
  geom_text(aes(label = round(value, 2)), size = 4) +
  theme_minimal() +
  labs(title = "Correlation Heatmap antara Math, Reading, dan Writing Score",
       x = "", y = "") +
  theme(axis.text.x = element_text(angle = 45, vjust = 1,
                                   size = 12, hjust = 1))

PENJELASAN : Semua skor menunjukkan korelasi positif yang kuat satu sama lain, namun hubungan Reading dan Writing adalah yang paling erat. Ini mengindikasikan bahwa kemampuan membaca dan menulis siswa sangat berkaitan erat, dan kemampuan matematika juga punya hubungan kuat terhadap keduanya.

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

JAWABAN : Untuk menjawab pertanyaan tersebut, kita bisa mengelompokkan data berdasarkan variabel PracticeSport lalu menghitung rata-rata nilai MathScore dari masing-masing kelompok olahraga: never, sometimes, dan regularly.

library(dplyr)

# Hitung rata-rata MathScore berdasarkan PracticeSport
sport_math <- data %>%
  group_by(PracticeSport) %>%
  summarise(AverageMath = mean(MathScore, na.rm = TRUE))

print(sport_math)
## # A tibble: 4 × 2
##   PracticeSport AverageMath
##   <chr>               <dbl>
## 1 ""                   66.6
## 2 "never"              64.2
## 3 "regularly"          67.8
## 4 "sometimes"          66.3
library(ggplot2)

ggplot(sport_math, aes(x = PracticeSport, y = AverageMath, fill = PracticeSport)) +
  geom_col() +
  labs(title = "Rata-rata Math Score berdasarkan Practice Sport",
       x = "Kebiasaan Berolahraga",
       y = "Rata-rata Nilai Matematika") +
  theme_minimal()

PENJELASAN : Meskipun ada kecenderungan bahwa siswa yang berolahraga secara rutin memiliki nilai matematika lebih tinggi, hasil ini tidak serta merta menunjukkan hubungan kausal. Bisa saja ada faktor lain yang memengaruhi seperti motivasi belajar, dukungan keluarga, atau gaya hidup sehat secara umum.