Tugas Visualisasi

Import Data

Diberikan data dari Kaggle yaitu: Students Exam Scores Extended Data

data <- read.csv("C:/Users/USER/Downloads/Expanded_Data.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 ...

Jawaban

1. Periksa distribusi dari variabel math, reading dan writing score, apakah terdapat outlier?

Untuk distribusi dapat menggunakan visualisasi Histogram dan untuk memeriksa outlier dapat menggunakan Boxplot

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
#Histogram
ggplot(data, aes(x = MathScore )) + 
  geom_histogram(bins = 30, fill = "#D2E0D3", alpha = 0.5) +
  labs(title = "Distribusi Math Score", x = "Math Score", y = "Frekuensi") +
  theme_minimal()

Histogram menunjukkan distribusi Math Score, mayoritas siswa berada dalam rentang 50 hingga 80, dengan frekuensi tertinggi sekitar 70. Bentuk distribusinya tampak mendekati normal, meskipun terdapat beberapa lonjakan di bagian atas distribusi. Selain itu, terlihat sedikit skwness ke kiri, yang mengindikasikan bahwa lebih banyak siswa mendapatkan nilai tinggi dibandingkan nilai rendah.

ggplot(data, aes(x = ReadingScore)) + 
  geom_histogram(bins = 30, fill = "#97B3AE", alpha = 0.5) +
  labs(title = "Distribusi Reading Score", x = "Reading Score", y = "Frekuensi") +
  theme_minimal()

Histogram menunjukkan distribusi Reading Score, mayoritas siswa mendapatkan nilai antara 50 dan 80 dengan puncak distribusi di sekitar 75. Bentuknya hampir simetris yang menunjukkan bahwa Reading Score tersebar cukup merata tanpa adanya kecenderungan ekstrem ke arah nilai yang sangat rendah atau sanggat tinggi.

ggplot(data, aes(x = WritingScore)) + 
  geom_histogram(bins = 30, fill = "#F0DDD6", alpha = 0.5) +
  labs(title = "Distribusi Writing Score", x = "Writing Score", y = "Frekuensi") + 
  theme_minimal()

Histogram menunjukkan distribusi Writing Score, mayoritas siswa memiliki nilai dalam rentang 50 hingga 80, dengan puncak di sekitar 70-85. Pola distribusinya mirip dengan distribusi Reading Score yang artinya terdapat korelasi antara kemampuan membaca dan menulis

ggplot(data, aes(y = MathScore)) + 
  geom_boxplot(fill = "#D2E0D3") + 
  labs(title = "Boxplot Math Score") + theme_minimal()

Pada Boxplot Math Score menunjukkan bahwa outlier terlihat di bagian bawah distribusi, dengan beberapa titik data yang jauh lebih rendah dari batas bawah whisker.

ggplot(data, aes(y = ReadingScore)) + 
  geom_boxplot(fill = "#97B3AE") + 
  labs(title = "Boxplot Reading Score") + theme_minimal()

Pada Boxplot Reading Score menunjukkan bahwa outlier terlihat di bagian bawah, dengan distribusi yang mirip dengan Math Score.

ggplot(data, aes(y = WritingScore)) + 
  geom_boxplot(fill = "#F0DDD6") + 
  labs(title = "Boxplot Writing Score") + theme_minimal()

Pada Boxplot Writing Score menunjukkan jumlah outlier yang lebih banyak dibandingkan dua variabel sebelumnya, yang artinya ada lebih banyak siswa dengan nilai menulis yang jauh lebih rendah dari distribusi utama.

2. Apakah yang dimaksud dengan outlier? Jelaskan cara memeriksa dan menanggulanginya!

2.1 Outlier merupakan nilai yang jauh lebih besar atau lebih kecil dibandingkan dnegan mayoritas data yang disebabkan oleh kesalahan pencatatan, variabilitas alami, atau kondisi khusus dalam data.

2.2 Cara memeriksa outlier:

  • Menggunakan Boxplot
    Boxplot dapat digunakan untuk mendeteksi outlier dengan melihat titik-titik yang berada di luar whiskers Contoh:
library(ggplot2)
ggplot(data, aes(y = MathScore)) +
  geom_boxplot(fill = "#D2E0D3") +
  labs(title = "Boxplot Math Score", y = "Math Score") + theme_minimal()

  • Menggunakan IQR (Interquartile Range)
    Metode ini digunakan untuk mendeteksi outlier berdasarkan kuartil data
Q1 <- quantile(data$MathScore, 0.25)
Q3 <- quantile(data$MathScore, 0.75)
IQR_value <- Q3 - Q1

# Batas bawah dan atas
lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value

# Nilai outlier
outliers <- data$MathScore[data$MathScore < lower_bound | data$MathScore > upper_bound]
outliers
##  [1] 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
## [26] 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
## [51] 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
## [76] 19

2.3 Cara menanggulangi Outlier

  • Menghapus Outlier
data_clean <- data[data$MathScore >= lower_bound & data$MathScore <= upper_bound, ]
  • Mengganti dengan Median
    Jika outlier penting, bisa diganti dengan Median
data$MathScore[data$MathScore < lower_bound | data$MathScore > upper_bound] <- median(data$MathScore)
  • Transformasi Data
    Menggunakan transformasi log atau square root dapat mengurangi dampak outlier.
data$MathScore_log <- log(data$MathScore)
3. Jam belajar manakah per minggu yang paling banyak dilakukan oleh siswa?
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
data |> 
  count(WklyStudyHours) |> 
  arrange(desc(n))
##   WklyStudyHours     n
## 1         5 - 10 16246
## 2            < 5  8238
## 3           > 10  5202
## 4                  955

Berdasarkan hasil di atas, dapat diketahui bahwa pada kategori 5-10 jam per minggu merupakan lamanya waktu jam belajar yang dilakukan oleh mayoritas siswa.

4. Periksa perbedaan nilai siswa (Math, Writing, Reading) per ethnic!
table(data$EthnicGroup)
## 
##         group A group B group C group D group E 
##    1840    2219    5826    9212    7503    4041

Dari distribusi data, terlihat bahwa jumlah siswa dalam setiap kelompok bervariasi, dengan kelompok C yang memiliki jumlah terbesar, sementara kelompok A yang paling sedikit yang menyebabkan ketidakseimbangan sehingga memengaruhi interpretasi hasil.

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)
  )
## # A tibble: 6 × 4
##   EthnicGroup Mean_Math Mean_Reading Mean_Writing
##   <chr>           <dbl>        <dbl>        <dbl>
## 1 ""               66.3         68.9         67.9
## 2 "group A"        63.1         66.8         65.3
## 3 "group B"        63.7         67.3         65.9
## 4 "group C"        64.9         68.4         67.0
## 5 "group D"        67.7         70.4         70.9
## 6 "group E"        75.3         74.3         72.7

Dari rata-rata nilai, kelompok E konsisten memiliki skor tertinggi dalam semua kategori, dengan MathScore rata-rata 75.3, ReadingScore 74.3, dan WritingScore 72.7. Sebaliknya, kelompok A memiliki skor terendah dengan MathScore rata-rata 63.1, Reading 66.8, dan Writing 65.3.

ggplot(data, aes(x = EthnicGroup, y = MathScore)) +
  geom_boxplot(fill = "#D2E0D3") +
  labs(title = "Math Score per Ethnic Group", x = "Ethnic Group", y = "Math Score") +
  theme_minimal()

ggplot(data, aes(x = EthnicGroup, y = ReadingScore)) +
  geom_boxplot(fill = "#97B3AE") +
  labs(title = "Reading Score per Ethnic Group", x = "Ethnic Group", y = "Reading Score") + theme_minimal()

ggplot(data, aes(x = EthnicGroup, y = WritingScore)) +
  geom_boxplot(fill = "#F0DDD6") +
  labs(title = "Writing Score per Ethnic Group", x = "Ethnic Group", y = "Writing Score") +theme_minimal()

Visualisasi boxplot menunjukkan bahwa kelompok E memiliki median yang lebih tinggi dibandingkan dengan kelompok lain, sementara kelompok A, B, dan C cenderung memiliki distribusi yang lebih mirip. Variasi dalam setiap kelompok cukup besar, terutama dalam Writing yang menunjukkan adanya outlier atau siswa dengan skor sangat tinggi maupun sangat rendah.

anova_math <- aov(MathScore ~ EthnicGroup, data = data)
summary(anova_math)
##                Df  Sum Sq Mean Sq F value Pr(>F)    
## EthnicGroup     5  418937   83787   387.6 <2e-16 ***
## Residuals   30635 6621616     216                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
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_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

Hasil uji ANOVA menunjukkan bahwa perbedaan nilai antar kelompok etnis kemungkinan besar signifikan secara statistik. Dengan demikian, dapat disimpulkan bahwa faktor etnis memiliki pengaruh terhadap perbedaan skor akademik siswa, terutama dengan kelompok E yang unggul secara konsisten dan kelompok A yang memiliki performa lebih rendah.

5. Cek korelasi antar variabel Math, Reading, dan Writing Score menggunakan correlation heatmap
library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 4.3.3
library(ggplot2)

# Buat subset data hanya dengan variabel yang diinginkan
data_subset <- data[, c("MathScore", "ReadingScore", "WritingScore")]

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

# Tampilkan korelasi dalam bentuk heatmap
ggcorrplot(cor_matrix, 
           method = "square", 
           type = "lower", 
           lab = TRUE, 
           colors = c("#97B3AE", "#D2E0D3", "#F0DDD6"))

Berdasarkan hasil analisis korelasi anntara MathScore, ReadingScore, dan WritingScore dapat diketahui bahwa terdapat hubungan yang kuat diantara ketiga variabel tersebut. Korelasi tertinggi atau sangat kuat terajdi antara ReadingScore dan WritingScore dengan nilai 0.95 yang menunjukkan bahwa siswa yang memiliki kemampuan membaca yang baik cenderung memiliki kemampuan menulis yang tinggi juga. Sementara itu, MathScore memiliki korelasi sebesar 0.81 dengan ReadingScore dan 0.80 dengan WritingScore yang mengindikasikan bahwa siswa dengan kemampuan matematika yang baik cenderung memiliki keterampilan literasi yang tinggi juga, meskipun hubungan ini tidka sekuat antara Membaca dan Menulis.

6. Periksa perbedaan antara nilai siswa per PracticeSport. Apakah rata-rata Math Score pada siswa menunjukkan nilai yang tinggi pada siswa yang sering berolahraga
table(data$PracticeSport)  
## 
##               never regularly sometimes 
##       631      4004     10793     15213
library(dplyr)
data |>
  group_by(PracticeSport) |>
  summarise(
    count = n(),
    mean_math = mean(MathScore, na.rm = TRUE),
    sd_math = sd(MathScore, na.rm = TRUE)
  )
## # A tibble: 4 × 4
##   PracticeSport count mean_math sd_math
##   <chr>         <int>     <dbl>   <dbl>
## 1 ""              631      66.6    14.9
## 2 "never"        4004      64.3    14.7
## 3 "regularly"   10793      68.0    15.4
## 4 "sometimes"   15213      66.4    15.0
boxplot(MathScore ~ PracticeSport, data = data,
        main = "Math Score berdasarkan Frekuensi Olahraga",
        xlab = "Frekuensi Olahraga",
        ylab = "Math Score",
        col = c("#97B3AE", "#D2E0D3", "#F0DDD6", "#d6CBBF"))

Berdasarkan hasil analisis, terlihat bahwa siswa yang berolahraga secara teratur (regularly) memiliki rata-rata MathScore tertinggi yaitu 68.0, sedangkan siswa yang tidak pernah berolahraga (never) memiliki rata-rata terendah sebesar 64.3. Siswa yang berolahraga sesekali (sometimes) memiliki rata-rata yang mendekati kelompok siswa (never) yaitu 66.4. Dari Visualisasi Boxplot, distribusi skor cukup seragam pada setiap kategori olahraga, emskipun median kelompok regularly tampak lebih tinggi dibandingkan kelompok lainnya. Selain itu, terdapat beberapa outlier pada kategori sometimes.

anova_result <- aov(MathScore ~ PracticeSport, data = data)
summary(anova_result)
##                  Df  Sum Sq Mean Sq F value Pr(>F)    
## PracticeSport     3   42016   14005   61.31 <2e-16 ***
## Residuals     30637 6998537     228                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Untuk memastikan apakah MathScore antar kelompok signifikan secara statistik, dilakukan uji ANOVA. Hasil ANOVA menunjukkan nilai F = 61.31 dengan p-value < 2e-16, yang berarti terdapat perbedaan yang sangat signifikan antara kelompok olahraga. Ini mengindikasikan bahwa olahraga memiliki pengaruh terhadap MathScore, dan perbedaannya tidak hanya terjadi secara kebetulan.