Import Data

Pada mata kuliah Pengantar Sains Data Kelas A Pekan ke-6, data yang diolah berasal dari Kagle pada link yaitu https://www.kaggle.com/datasets/desalegngeb/students-exam-scores?resource=download, dimana variabelnya adalah sebagai berikut:

Kamus Data (deskripsi kolom)

data<- read.csv("D:\\KAMPUS MBA\\PSD\\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 ...

Menjawab Pertanyaan

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

# Cek ringkasan statistik
summary(data[, c("MathScore", "ReadingScore", "WritingScore")])
##    MathScore       ReadingScore     WritingScore   
##  Min.   :  0.00   Min.   : 10.00   Min.   :  4.00  
##  1st Qu.: 56.00   1st Qu.: 59.00   1st Qu.: 58.00  
##  Median : 67.00   Median : 70.00   Median : 69.00  
##  Mean   : 66.56   Mean   : 69.38   Mean   : 68.42  
##  3rd Qu.: 78.00   3rd Qu.: 80.00   3rd Qu.: 79.00  
##  Max.   :100.00   Max.   :100.00   Max.   :100.00
# Deteksi outlier dengan boxplot
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
ggplot(data, aes(y = MathScore)) + 
  geom_boxplot(fill = "lightpink", alpha = 0.5) + 
  theme_minimal() + ggtitle("Boxplot Math Score")

ggplot(data, aes(y = ReadingScore)) + 
  geom_boxplot(fill = "darkseagreen1", alpha = 0.5) + 
  theme_minimal() + ggtitle("Boxplot Reading Score")

ggplot(data, aes(y = WritingScore)) + 
  geom_boxplot(fill = "skyblue", alpha = 0.5) + 
  theme_minimal() + ggtitle("Boxplot Writing Score")

Terdapat beberapa outlier pada variabel Math Score, Reading Score, dan Writing Score yang ditandai dengan titik-titik di bawah whisker bagian bawah. Outlier ini menunjukkan nilai yang jauh lebih rendah dibandingkan mayoritas data.

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

Outlier adalah data yang memiliki nilai sangat berbeda atau menyimpang jauh dari sebagian besar data lainnya dalam suatu dataset. Keberadaannya dapat disebabkan oleh kesalahan pencatatan, pengukuran, atau memang merupakan fenomena unik dalam data.

Cara Memeriksa Outlier:

  • Metode statistik dengan menggunakan Interquartile Range (IQR), dimana data dianggap outlier jika berada di bawah Q1-1,5 IQR atau di atas Q3+1.5 IQR. Dapat juga menggunakan Z-score, dimana data dengan nilai lebih dari 3 atau kurang dari -3 dianggap sebagai outlier.

  • Metode visualisasi seperti boxplot membantu memeriksa outlier dengan menampilkan titik-titik yang berada di luar whisker.Selain itu, histogram dan scatter plot juga dapat digunakan untuk melihat pola distribusi data.

Cara Menanggulangi Outlier:

  • Memeriksa sumber data untuk memastikan apakah outlier berasal dari kesalahan pencatatan

  • Menghapusnya jika terbukti sebagai kesalahan

  • Mentransformasi data menggunakan metode seperti logaritma atau normalisasi untuk mengurangi pengaruh outlier.

  • Menggunakan metode statistik yang lebih tahan terhadap outlier, misalnya memilih median daripada mean untuk analisis.

  • Jika outlier memiliki makna penting dalam analisis, seperti dalam data keuangan atau medis, sebaiknya dianalisis lebih lanjut untuk memahami penyebabnya.

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

dengan menggunakan fungsi table() untuk menghitung frekuensi dan which.max() untuk menemukan nilai tertinggi.

# Menghitung frekuensi setiap kategori jam belajar
table(data$WklyStudyHours)
## 
##           < 5   > 10 5 - 10 
##    955   8238   5202  16246
# Menampilkan kategori jam belajar yang paling banyak dilakukan
names(which.max(table(data$WklyStudyHours)))
## [1] "5 - 10"

Jam belajar per minggu yang paling banyak dilakukan oleh student adalah 5 - 10 jam sebanyak 16.246 siswa.

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

# Load library yang diperlukan
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
# Memperbaiki kategori kosong ("" NA atau sesuatu yang aneh
data <- data[!(data$EthnicGroup == "" | is.na(data$EthnicGroup)), ]

# Menghitung rata-rata nilai Math, Reading, dan Writing berdasarkan etnis
data %>%
  group_by(EthnicGroup) %>%
  summarise(
    AvgMath = mean(MathScore, na.rm = TRUE),
    AvgReading = mean(ReadingScore, na.rm = TRUE),
    AvgWriting = mean(WritingScore, na.rm = TRUE)
  )
## # A tibble: 5 × 4
##   EthnicGroup AvgMath AvgReading AvgWriting
##   <chr>         <dbl>      <dbl>      <dbl>
## 1 group A        63.0       66.8       65.3
## 2 group B        63.5       67.3       65.9
## 3 group C        64.7       68.4       67.0
## 4 group D        67.7       70.4       70.9
## 5 group E        75.3       74.3       72.7
# Definisikan warna untuk setiap kelompok etnis
warna_etnis <- c("group A" = "darkolivegreen1", 
                 "group B" = "darkolivegreen2", 
                 "group C" = "darkolivegreen3", 
                 "group D" = "darkolivegreen4", 
                 "group E" = "darkolivegreen")

# Visualisasi perbedaan nilai menggunakan boxplot
ggplot(data, aes(x = EthnicGroup, y = MathScore, fill = EthnicGroup)) +
  geom_boxplot() +
  scale_fill_manual(values = warna_etnis) +
  theme_minimal() + 
  ggtitle("Distribusi Nilai Math Berdasarkan Etnis")

ggplot(data, aes(x = EthnicGroup, y = ReadingScore, fill = EthnicGroup)) +
  geom_boxplot() + 
  scale_fill_manual(values = warna_etnis) +
  theme_minimal() + 
  ggtitle("Distribusi Nilai Reading Berdasarkan Etnis")

ggplot(data, aes(x = EthnicGroup, y = WritingScore, fill = EthnicGroup)) +
  geom_boxplot() + 
  scale_fill_manual(values = warna_etnis) +
  theme_minimal() + 
  ggtitle("Distribusi Nilai Writing Berdasarkan Etnis")

Kelompok E dan D memiliki nilai tertinggi dalam Math, Reading, dan Writing, dengan median yang lebih tinggi dibandingkan kelompok lainnya, sementara kelompok A cenderung memiliki median terendah. Kelompok B dan C berada di tengah dengan variasi nilai yang cukup besar termasuk beberapa siswa dengan nilai rendah (outlier). Meskipun terdapat perbedaan antar kelompok, pola distribusinya relatif mirip, dengan kelompok D dan E lebih stabil dalam pencapaian nilai.

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

# Load library yang diperlukan
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.3.3
# Pastikan hanya kolom Math, Reading, dan Writing yang digunakan
data_subset <- data[, c("MathScore", "ReadingScore", "WritingScore")]

# Hitung korelasi antar variabel
cor_matrix <- cor(data_subset, use = "complete.obs")

# Ubah ke format long untuk ggplot
melted_cor <- melt(cor_matrix)

# Plot heatmap korelasi
ggplot(melted_cor, aes(Var1, Var2, fill = value)) +
  geom_tile() +
  geom_text(aes(label = round(value, 2)), color = "white", size = 5) +
  scale_fill_gradient2(low = "pink", mid = "white", high = "skyblue", midpoint = 0) +
  theme_minimal() +
  labs(title = "Heatmap Korelasi Nilai", x = "Variabel", y = "Variabel")

Terdapat hubungan positif yang kuat antara nilai Math, Reading, dan Writing. Korelasi tertinggi terjadi antara Reading Score dan Writing Score (0.95) menunjukkan bahwa siswa yang memiliki nilai tinggi dalam Reading cenderung memiliki nilai tinggi dalam Writing juga. Sedangkan, Math Score memiliki korelasi yang lebih rendah dengan Reading Score (0.82) dan Writing Score (0.81) menunjukkan bahwa kemampuan matematika tetap berhubungan dengan kedua aspek literasi, tetapi tidak sekuat hubungan antara Reading dan Writing. Hal ini menjelaskan bahwa keterampilan membaca dan menulis lebih saling berkaitan dibandingkan dengan keterampilan matematika.

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

# Memperbaiki kategori kosong ("" NA atau sesuatu yang aneh)
data <- data[!(data$PracticeSport == "" | is.na(data$PracticeSport)), ]

# Tampilkan ringkasan data
summary(data)
##        X            Gender          EthnicGroup         ParentEduc       
##  Min.   :  0.0   Length:28218       Length:28218       Length:28218      
##  1st Qu.:249.0   Class :character   Class :character   Class :character  
##  Median :499.0   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :498.9                                                           
##  3rd Qu.:749.0                                                           
##  Max.   :999.0                                                           
##                                                                          
##   LunchType           TestPrep         ParentMaritalStatus PracticeSport     
##  Length:28218       Length:28218       Length:28218        Length:28218      
##  Class :character   Class :character   Class :character    Class :character  
##  Mode  :character   Mode  :character   Mode  :character    Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##                                                                              
##  IsFirstChild         NrSiblings   TransportMeans     WklyStudyHours    
##  Length:28218       Min.   :0.00   Length:28218       Length:28218      
##  Class :character   1st Qu.:1.00   Class :character   Class :character  
##  Mode  :character   Median :2.00   Mode  :character   Mode  :character  
##                     Mean   :2.15                                        
##                     3rd Qu.:3.00                                        
##                     Max.   :7.00                                        
##                     NA's   :1437                                        
##    MathScore       ReadingScore    WritingScore   
##  Min.   :  0.00   Min.   : 10.0   Min.   :  4.00  
##  1st Qu.: 56.00   1st Qu.: 59.0   1st Qu.: 58.00  
##  Median : 67.00   Median : 70.0   Median : 69.00  
##  Mean   : 66.58   Mean   : 69.4   Mean   : 68.44  
##  3rd Qu.: 78.00   3rd Qu.: 80.0   3rd Qu.: 79.00  
##  Max.   :100.00   Max.   :100.0   Max.   :100.00  
## 
# Hitung rata-rata MathScore berdasarkan PracticeSport
avg_math_score <- data %>%
  group_by(PracticeSport) %>%
  summarise(MeanMathScore = mean(MathScore, na.rm = TRUE))

print(avg_math_score)
## # A tibble: 3 × 2
##   PracticeSport MeanMathScore
##   <chr>                 <dbl>
## 1 never                  64.2
## 2 regularly              67.8
## 3 sometimes              66.3
# Visualisasi dengan boxplot
ggplot(data, aes(x = PracticeSport, y = MathScore, fill = PracticeSport)) +
  geom_boxplot() +
  scale_fill_manual(values = c("maroon", "maroon3", "maroon2")) +
  labs(title = "Distribusi Math Score Berdasarkan Kebiasaan Berolahraga",
       x = "Practice Sport",
       y = "Math Score") +
  theme_minimal()

Distribusi Math Score relatif serupa antara siswa yang never (tidak pernah), regularly (rutin), dan sometimes (kadang-kadang) berolahraga. Median nilai matematika tidak menunjukkan perbedaan yang signifikan diantara ketiga kelompok tersebut. Rentang interkuartil juga cukup mirip, meski terdapat beberapa outliers di skor rendah. Hal ini menunjukkan bahwa kebiasaan berolahraga mungkin tidak memiliki dampak yang signifikan terhadap nilai matematika siswa, atau ada faktor lain yang lebih dominan dalam menentukan skor matematika mereka.