#Tugas Visualisasi #Import Data #Diberi data dari kaggle sebagai berikut : #Student exam scores [Extended Data] ( https://www.kaggle.com/datasets/desalegngeb/students-exam-scores?resource=download )

chooseCRANmirror(graphics = FALSE, ind = 1)  
install.packages("tidyverse")
## package 'tidyverse' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\AJENG\AppData\Local\Temp\RtmpY7G2Pv\downloaded_packages
install.packages("ggplot2")
## package 'ggplot2' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\AJENG\AppData\Local\Temp\RtmpY7G2Pv\downloaded_packages
install.packages("dplyr")
## package 'dplyr' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\AJENG\AppData\Local\Temp\RtmpY7G2Pv\downloaded_packages
install.packages("rmarkdown")
## package 'rmarkdown' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\AJENG\AppData\Local\Temp\RtmpY7G2Pv\downloaded_packages
install.packages("knitr")
## package 'knitr' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\AJENG\AppData\Local\Temp\RtmpY7G2Pv\downloaded_packages
install.packages("DT")
## package 'DT' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\AJENG\AppData\Local\Temp\RtmpY7G2Pv\downloaded_packages
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'ggplot2' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'purrr' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
## Warning: package 'stringr' was built under R version 4.3.3
## Warning: package 'forcats' was built under R version 4.3.3
## Warning: package 'lubridate' was built under R version 4.3.3
## ── 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
library(ggplot2)
library(dplyr)
library(rmarkdown)
## Warning: package 'rmarkdown' was built under R version 4.3.3
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
library(DT)
## Warning: package 'DT' was built under R version 4.3.3
data <- read.csv("C:\\Users\\AJENG\\Downloads\\TUGAS PSD RMD\\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

#Ekplorasi data

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 ...
summary(data)
##        X            Gender          EthnicGroup         ParentEduc       
##  Min.   :  0.0   Length:30641       Length:30641       Length:30641      
##  1st Qu.:249.0   Class :character   Class :character   Class :character  
##  Median :500.0   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :499.6                                                           
##  3rd Qu.:750.0                                                           
##  Max.   :999.0                                                           
##                                                                          
##   LunchType           TestPrep         ParentMaritalStatus PracticeSport     
##  Length:30641       Length:30641       Length:30641        Length:30641      
##  Class :character   Class :character   Class :character    Class :character  
##  Mode  :character   Mode  :character   Mode  :character    Mode  :character  
##                                                                              
##                                                                              
##                                                                              
##                                                                              
##  IsFirstChild         NrSiblings    TransportMeans     WklyStudyHours    
##  Length:30641       Min.   :0.000   Length:30641       Length:30641      
##  Class :character   1st Qu.:1.000   Class :character   Class :character  
##  Mode  :character   Median :2.000   Mode  :character   Mode  :character  
##                     Mean   :2.146                                        
##                     3rd Qu.:3.000                                        
##                     Max.   :7.000                                        
##                     NA's   :1572                                         
##    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  
## 
sum(is.na(data))
## [1] 1572
colSums(is.na(data))
##                   X              Gender         EthnicGroup          ParentEduc 
##                   0                   0                   0                   0 
##           LunchType            TestPrep ParentMaritalStatus       PracticeSport 
##                   0                   0                   0                   0 
##        IsFirstChild          NrSiblings      TransportMeans      WklyStudyHours 
##                   0                1572                   0                   0 
##           MathScore        ReadingScore        WritingScore 
##                   0                   0                   0

JAWABAN

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

#Memeriksa distribusi dari variabel math, reading dan writing score
par(mfrow = c(1, 3))  # Membagi tampilan menjadi 3 grafik
hist(data$MathScore, main = "Distribusi Skor Matematika", xlab = "Skor Matematika", col = "pink", border = "maroon")
hist(data$ReadingScore, main = "Distribusi Skor Membaca", xlab = "Skor Membaca", col = "pink", border = "maroon")
hist(data$WritingScore, main = "Distribusi Skor Menulis", xlab = "Skor Menulis", col = "pink", border = "maroon")

#Pengecekan apakah ada outlier
par(mfrow = c(1, 3))
boxplot(data$MathScore, main = "Outlier Skor Matematika", col = "maroon")
boxplot(data$ReadingScore, main = "Outlier Skor Membaca", col = "maroon")
boxplot(data$WritingScore, main = "Outlier Skor Menulis", col = "maroon")


INTEPRETASI
Berdasarkan kedua gambar di atas, analisis dapat dilakukan terhadap distribusi nilai dan keberadaan outlier pada skor matematika, membaca, dan menulis siswa.
Gambar pertama menunjukkan histogram distribusi skor matematika, membaca, dan menulis. Dari histogram tersebut, terlihat bahwa distribusi nilai cenderung mengikuti pola distribusi normal dengan puncak yang berada pada rentang skor 60-80. Skor matematika, membaca, dan menulis memiliki pola yang mirip, dengan mayoritas siswa mendapatkan nilai di sekitar nilai rata-rata dan jumlah siswa yang mendapatkan skor sangat rendah atau sangat tinggi lebih sedikit. Ini menunjukkan bahwa secara umum, skor siswa tidak terlalu bervariasi secara ekstrem.

Gambar kedua menunjukkan boxplot dari skor matematika dan membaca untuk mendeteksi keberadaan outlier. Dari boxplot ini, terlihat bahwa terdapat beberapa nilai yang jatuh di luar whisker, yang ditandai dengan titik-titik di bawah boxplot. Nilai-nilai ini dapat dikategorikan sebagai outlier, yang menunjukkan adanya siswa yang memiliki skor jauh lebih rendah dibandingkan mayoritas siswa lainnya. Outlier ini perlu dianalisis lebih lanjut apakah disebabkan oleh faktor eksternal seperti kesalahan pengisian data atau memang merupakan representasi dari siswa dengan kemampuan yang jauh lebih rendah dibandingkan lainnya.

Secara keseluruhan, analisis ini menunjukkan bahwa distribusi nilai siswa cenderung normal dengan beberapa siswa yang memiliki skor jauh lebih rendah dibandingkan mayoritas. Outlier yang ditemukan perlu diperiksa lebih lanjut untuk menentukan apakah perlu dilakukan penanganan seperti normalisasi data atau dibiarkan sebagai bagian dari variasi alami dalam performa akademik siswa.

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

Outliner adalah data yang memiliki nilai ekstrem dan jauh berbeda dari mayoritas data lainnya dalam suatu dataset. Outlier bisa muncul karena berbagai alasan, seperti kesalahan input data, variasi alami, atau adanya kondisi khusus yang memengaruhi data tersebut. Misalnya, dalam data nilai ujian siswa, jika sebagian besar siswa mendapatkan nilai antara 80 hingga 100, tetapi ada satu siswa yang mendapatkan nilai 30, maka nilai 30 tersebut dianggap sebagai outlier karena sangat berbeda dari nilai lainnya.
Outlier dapat memengaruhi hasil analisis statistik karena dapat menyebabkan rata-rata menjadi bias atau distribusi data menjadi tidak normal. Oleh karena itu, penting untuk mendeteksi outlier dengan metode seperti boxplot, Interquartile Range (IQR), atau Z-score. Setelah outlier ditemukan, langkah selanjutnya adalah menganalisis apakah data tersebut memang valid atau hanya merupakan kesalahan. Jika merupakan kesalahan input, outlier bisa diperbaiki atau dihapus, tetapi jika memang valid, maka bisa dilakukan transformasi data atau pendekatan lain untuk mengurangi dampaknya dalam analisis.

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

table(data$WklyStudyHours)
## 
##           < 5   > 10 5 - 10 
##    955   8238   5202  16246
ggplot(data, aes(x = WklyStudyHours)) +
  geom_bar(fill = "maroon") +
  labs(title = "Distribusi Jam Belajar", x = "Jam Belajar per Minggu", y = "Jumlah Siswa")

INTEPRETASI
Gambar di atas menunjukkan distribusi jumlah siswa berdasarkan jam belajar per minggu. Dari diagram batang tersebut, terlihat bahwa mayoritas siswa menghabiskan waktu belajar antara 5 hingga 10 jam per minggu, dengan jumlah siswa dalam kategori ini jauh lebih banyak dibandingkan kategori lainnya.

Kategori “< 5 jam” juga memiliki jumlah siswa yang cukup signifikan, meskipun lebih sedikit dibandingkan kategori “5 - 10 jam”. Sementara itu, kategori “> 10 jam” memiliki jumlah siswa yang lebih sedikit dibandingkan kategori lainnya, yang menunjukkan bahwa hanya sedikit siswa yang belajar lebih dari 10 jam dalam seminggu.

Dari hasil ini, dapat disimpulkan bahwa sebagian besar siswa belajar dalam rentang waktu yang moderat, yaitu 5 - 10 jam per minggu. Hal ini mungkin mencerminkan kebiasaan belajar yang cukup seimbang antara kegiatan akademik dan non-akademik. Siswa yang belajar kurang dari 5 jam per minggu kemungkinan memiliki risiko yang lebih tinggi dalam pencapaian akademik yang rendah, sedangkan siswa yang belajar lebih dari 10 jam per minggu mungkin lebih fokus pada akademik tetapi jumlahnya relatif sedikit.

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

data %>%
  group_by(EthnicGroup) %>%
  summarise(MeanMath = mean(MathScore, na.rm = TRUE),
            MeanReading = mean(ReadingScore, na.rm = TRUE),
            MeanWriting = mean(WritingScore, na.rm = TRUE)) %>%
  pivot_longer(cols = -EthnicGroup, names_to = "Subject", values_to = "Score") %>%
  ggplot(aes(x = EthnicGroup, y = Score, fill = Subject)) +
  geom_bar(stat = "identity", position = "dodge") 

  labs(title = "Rata-rata Skor Berdasarkan Ethnic", x = "Ethnic", y = "Rata-rata Skor")
## $x
## [1] "Ethnic"
## 
## $y
## [1] "Rata-rata Skor"
## 
## $title
## [1] "Rata-rata Skor Berdasarkan Ethnic"
## 
## attr(,"class")
## [1] "labels"

INTEPRETASI
Gambar di atas menunjukkan perbandingan rata-rata skor matematika, membaca, dan menulis berdasarkan kelompok etnis. Tiga warna dalam diagram batang merepresentasikan mata pelajaran yang berbeda: merah untuk matematika (MeanMath), hijau untuk membaca (MeanReading), dan biru untuk menulis (MeanWriting).
Dari grafik, terlihat bahwa setiap kelompok etnis memiliki pola yang relatif mirip, di mana skor membaca dan menulis cenderung lebih tinggi dibandingkan dengan skor matematika. Secara umum, kelompok E memiliki rata-rata skor tertinggi di semua mata pelajaran dibandingkan kelompok etnis lainnya, sedangkan kelompok A memiliki rata-rata skor terendah.

Perbedaan antar kelompok etnis ini dapat mencerminkan berbagai faktor seperti akses terhadap pendidikan, lingkungan belajar, atau kebiasaan akademik yang berbeda di antara kelompok tersebut. Namun, perbedaan ini tidak terlalu ekstrem, menunjukkan bahwa mayoritas siswa dari berbagai kelompok memiliki kemampuan yang relatif seimbang dalam ketiga mata pelajaran tersebut.

Kesimpulannya, kelompok etnis berperan dalam distribusi skor akademik, dengan kelompok E unggul dalam semua mata pelajaran, sementara kelompok A memiliki rata-rata skor yang lebih rendah. Analisis lebih lanjut dapat dilakukan untuk memahami faktor-faktor yang memengaruhi perbedaan ini, seperti latar belakang sosial-ekonomi atau akses ke sumber daya pendidikan.

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

library(tidyverse)

corr_matrix <- cor(data[, c("MathScore", "ReadingScore", "WritingScore")], use = "complete.obs")

corr_long <- as.data.frame(as.table(corr_matrix))

# Membuat heatmap korelasi
ggplot(corr_long, aes(Var1, Var2, fill = Freq)) +
  geom_tile() +
  geom_text(aes(label = round(Freq, 2)), color = "white", size = 5) +
  scale_fill_gradient2(low = "blue", mid = "white", high = "red", midpoint = 0) +
  labs(title = "Correlation Heatmap", x = "", y = "") +
  theme_minimal()

INTEPRETASI
Gambar di atas merupakan heatmap korelasi yang menunjukkan hubungan antara tiga variabel akademik yaitu: MathScore (Skor Matematika), ReadingScore (Skor Membaca), dan WritingScore (Skor Menulis).

Dari heatmap ini, terlihat bahwa semua korelasi bernilai positif dan cukup tinggi, yang berarti bahwa jika nilai dalam satu mata pelajaran tinggi, maka nilai dalam mata pelajaran lain juga cenderung tinggi.

- Korelasi tertinggi terdapat antara ReadingScore dan WritingScore (0.95), menunjukkan bahwa siswa yang memiliki kemampuan membaca yang baik biasanya juga memiliki kemampuan menulis yang baik.
- Korelasi antara MathScore dan ReadingScore adalah 0.82, yang juga cukup tinggi, tetapi tidak sekuat hubungan antara membaca dan menulis. Ini menunjukkan bahwa kemampuan membaca bisa sedikit mempengaruhi performa dalam matematika.
- Korelasi antara MathScore dan WritingScore adalah 0.81, yang berarti bahwa meskipun ada hubungan antara keterampilan matematika dan menulis, hubungan ini lebih lemah dibandingkan dengan korelasi membaca-menulis.

Dari hasil ini, dapat disimpulkan bahwa ada hubungan yang kuat antara keterampilan membaca dan menulis, yang mungkin disebabkan oleh keterampilan linguistik yang sama. Sementara itu, keterampilan matematika juga berkorelasi dengan keduanya, tetapi dengan tingkat hubungan yang sedikit lebih rendah.Hal ini dapat digunakan dalam strategi pendidikan, misalnya dengan menekankan pembelajaran membaca untuk membantu meningkatkan keterampilan menulis siswa. Namun, matematika tetap memiliki karakteristik yang berbeda meskipun berkorelasi dengan dua keterampilan lainnya.

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

ggplot(data, aes(x = PracticeSport, y = MathScore, fill = PracticeSport)) +
  geom_boxplot() +
  labs(tittle = "Hubungan Olahraga dan Skor Matematika", x = "Frekuensi Olahraga", y = "Skor Matematika")

INTEPRETASI
Gambar di atas adalah boxplot yang menunjukkan distribusi Skor Matematika berdasarkan frekuensi olahraga siswa (PracticeSport), yang terdiri dari tiga kategori: never (tidak pernah), regularly (rutin), dan sometimes (kadang-kadang).
Dari boxplot ini, beberapa hal yang dapat diinterpretasikan adalah:
1. Nilai Tengah (Median):
- Siswa yang rutin berolahraga (regularly) memiliki median skor matematika yang lebih tinggi dibandingkan dengan siswa yang tidak pernah atau hanya kadang-kadang berolahraga. Ini menunjukkan adanya indikasi bahwa olahraga secara teratur mungkin berhubungan dengan performa akademik yang lebih baik dalam matematika.
2. Sebaran Data:
Ketiga kelompok memiliki rentang skor yang mirip, dengan nilai maksimum mendekati 100 dan nilai minimum mendekati 0. Namun, kelompok yang kadang-kadang berolahraga (sometimes) memiliki lebih banyak outlier (titik data di luar batas normal), yang menunjukkan adanya beberapa siswa dengan skor yang jauh lebih rendah dibandingkan mayoritas siswa lain dalam kelompok ini.
3. Outlier: Semua kelompok memiliki beberapa siswa dengan skor matematika yang jauh lebih rendah dari distribusi utama. Kelompok yang tidak pernah berolahraga (never) juga memiliki sejumlah outlier, tetapi tidak sebanyak kelompok kadang-kadang berolahraga (sometimes).
Kesimpulannya dari boxplot ini dapat dilihat bahwa, siswa yang rutin berolahraga cenderung memiliki skor matematika yang lebih tinggi dibandingkan dengan siswa yang tidak pernah atau hanya kadang-kadang berolahraga. Meskipun tidak bisa langsung disimpulkan bahwa olahraga menyebabkan peningkatan performa akademik, hasil ini menunjukkan adanya kemungkinan hubungan positif antara aktivitas fisik yang teratur dan hasil akademik yang lebih baik dalam matematika.