Midterm Exam

Group 7 - Education Dataset

Logo

1. Persiapan Data

library(readxl)
library(dplyr)
library(reactable)
library(htmltools)

# Import dataset
data_raw <- read.csv("EDUCATION DATASET.csv")

# Clean and prepare data
data_clean <- data_raw %>%
  rename_with(~ gsub("\\s+", "_", .x)) %>%
  mutate(across(where(is.character), trimws)) %>%
  mutate(
   
  )

# Create interactive table with dropdown + animated pagination
htmltools::browsable(
  htmltools::tagList(
    
    # Dropdown control for entries per page
    tags$div(
      style = "display:flex; align-items:center; gap:6px; margin-bottom:10px; font-size:14px;",
      tags$span("Showing"),
      tags$select(
        id = "pageSizeSelect",
        style = "padding:3px 6px; border-radius:4px; border:1px solid #ccc; font-size:14px;",
        tags$option(value = 10, "10"),
        tags$option(value = 25, "25"),
        tags$option(value = 50, "50"),
        tags$option(value = 100, "100")
      ),
      tags$span("entries")
    ),
    
    # Reactable table
    reactable(
      data_clean,
      elementId = "myTable",
      searchable = TRUE,
      bordered = TRUE,
      striped = TRUE,
      highlight = TRUE,
      resizable = TRUE,
      defaultPageSize = 10,
      wrap = FALSE,
      fullWidth = TRUE,
      defaultColDef = colDef(align = "center"),
      
      theme = reactableTheme(
        headerStyle = list(
          background = "#f7f7f7",
          fontWeight = "bold",
          borderBottom = "2px solid #ddd"
        ),
        
        # Pagination area (clear background)
        paginationStyle = list(
          background = "transparent",
          borderTop = "1px solid #ddd",
          padding = "8px 0"
        ),
        
        # Pagination buttons with animation
        pageButtonStyle = list(
          background = "#ffffff",
          border = "1px solid #90CAF9",
          color = "#0D47A1",
          borderRadius = "6px",
          padding = "4px 10px",
          margin = "0 3px",
          transition = "all 0.2s ease-in-out",
          boxShadow = "0 1px 3px rgba(0,0,0,0.1)",
          fontWeight = "500"
        ),
        pageButtonHoverStyle = list(
          background = "#E3F2FD",
          border = "1px solid #42A5F5",
          transform = "scale(1.05)"
        ),
        pageButtonActiveStyle = list(
          background = "#1E88E5",
          color = "white",
          transform = "scale(1.05)"
        )
      )
    ),
    
    # JavaScript to change number of entries dynamically
    tags$script(HTML("
      document.getElementById('pageSizeSelect').addEventListener('change', function() {
        const newSize = parseInt(this.value);
        const tbl = window.reactable.getInstance('myTable');
        if (tbl) tbl.setPageSize(newSize);
      });
    "))
  )
)
Showing entries

2. Deskripsi Dataset

Kinerja akademik siswa dipengaruhi oleh berbagai faktor yang mencakup karakteristik pribadi, keluarga, dan kelembagaan. Variabel seperti jam belajar, pengalaman guru, ukuran kelas, dukungan orang tua, dan motivasi siswa memainkan peran penting dalam membentuk pembelajaran hasil. Selain itu, faktor-faktor seperti tingkat kehadiran, akses ke sumber belajar, partisipasi dalam kegiatan ekstrakurikuler, dan prestasi akademik sebelumnya semakin berkontribusi terhadap variasi kinerja antar siswa.

Variabel target, Kinerja Akademik, mencerminkan keseluruhan prestasi siswa pada skala 0-100.

Dengan menerapkan statistik deskriptif, analis dapat meringkas dataset menggunakan ukuran kecenderungan pusat (mean, median, mode) untuk memahami karakteristik khas siswa dan ukuran dispersi (rentang, varians, standar deviasi, rentang interkuartil) untuk mengevaluasi variabilitas di antara siswa.

Teknik visualisasi data seperti histogram, boxplots, scatterplots, dan grafik batang memberikan wawasan yang jelas tentang distribusi, pola, korelasi, dan outlier. Visualisasi ini membantu pendidik dan pembuat kebijakan mengidentifikasi tren, menilai dampak dari berbagai faktor, dan membuat keputusan yang tepat untuk meningkatkan strategi pengajaran, alokasi sumber daya, dan program dukungan siswa.

# Load Library
library(knitr)

# Data kategori variabel 
variable_info <- data.frame(
  Variable = c("SchoolType", "GradeLevel", "Region", "TeachingMethod",
               "StudyHours", "TeacherExperience", "ClassSize",
               "ParentalSupport", "StudentMotivation", "AttendanceRate",
               "HomeworkCompletion", "ExtracurricularHours", "TechUsage",
               "AcademicPerformance"),
  
  Data_Type = c("Categorical", "Categorical", "Categorical", "Categorical",
                "Numeric", "Numeric", "Numeric", 
                "Numeric", "Numeric", "Numeric",
                "Numeric", "Numeric", "Numeric", "Numeric"),
  
  Scale = c("Nominal", "Ordinal", "Nominal", "Nominal",
            "Continuous", "Continuous", "Discrete",
            "Continuous", "Discrete", "Continuous",
            "Continuous", "Continuous", "Continuous", "Discrete")
)

# Tampilkan tabel 
kable(variable_info, caption = "Tabel Kategori Variabel Dataset Pendidikan")
Tabel Kategori Variabel Dataset Pendidikan
Variable Data_Type Scale
SchoolType Categorical Nominal
GradeLevel Categorical Ordinal
Region Categorical Nominal
TeachingMethod Categorical Nominal
StudyHours Numeric Continuous
TeacherExperience Numeric Continuous
ClassSize Numeric Discrete
ParentalSupport Numeric Continuous
StudentMotivation Numeric Discrete
AttendanceRate Numeric Continuous
HomeworkCompletion Numeric Continuous
ExtracurricularHours Numeric Continuous
TechUsage Numeric Continuous
AcademicPerformance Numeric Discrete

3. Visualisasi Data

3.1 Bar Chart

Bar Chart adalah jenis visualisasi data yang digunakan untuk merepresentasikan data kategorikal menggunakan batang persegi panjang. Tinggi (atau panjang) setiap batang sesuai dengan nilai atau frekuensi dari suatu kategori, sehingga memudahkan perbandingan antar kelompok.

Bar chart cocok untuk:

  • Data numerik diskrit = angka yang hanya dapat mengambil nilai tertentu (misalnya: jumlah siswa per kelas).

  • Data kategorikal ordinal = kategori dengan urutan alami (misalnya: tingkat pendidikan: SD, SMP, SMA, Universitas).

Dalam dataset ini, Bar Chart dapat digunakan untuk menampilkan Total siswa berdasarkan Tipe Sekolah (SchoolType). Hal ini memungkinkan kita dengan cepat mengidentifikasi Tipe Sekolah mana yang memiliki total siswa dengan jumlah tertinggi.

library(ggplot2)
library(dplyr)
library(plotly)

# Load data
data <- read.csv("C:/Users/nulin/OneDrive/Desktop/MIDTERM EXAM/EDUCATION DATASET.csv")

# Hitung frekuensi & urutkan
data_summary <- data %>%
  count(SchoolType) %>%
  arrange(n) %>%
  mutate(SchoolType = factor(SchoolType, levels = SchoolType))

# Warna Bar
pastel_colors <- c("skyblue", "lavender", "pink")

# Plot ggplot 
p <- ggplot(data_summary, aes(x = SchoolType, y = n, fill = SchoolType)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = n), nudge_y = 10, size = 4) +
  scale_fill_manual(values = pastel_colors) +
  labs(
    title = "School Type Distribution",
    x = "School Type",
    y = "Jumlah Siswa",
    fill = "Kategori School Type"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14)
  )
ggplotly(p) %>%
  layout(showlegend = FALSE)

Interpretasi

  • Grafik menunjukkan bahwa sekolah swasta (Private) memiliki jumlah siswa terbanyak (528 siswa), diikuti oleh Charter (489 siswa) dan Public (483 siswa). Perbedaannya tidak terlalu besar, menandakan distribusi jumlah siswa antar tipe sekolah relatif seimbang.

  • Secara keseluruhan, sekolah swasta sedikit lebih dominan, namun ketiga tipe sekolah memiliki representasi yang cukup merata, sehingga dapat mendukung analisis data yang seimbang.

3.2 Histogram

Histogram adalah representasi grafis dari distribusi data numerik. Histogram membagi data ke dalam interval-interval (disebut bin) dan menampilkan frekuensi data dalam setiap interval. Visualisasi ini membantu mengidentifikasi pola seperti kecenderungan pusat, sebaran, kemencengan, dan adanya modus ganda dalam data.

Histogram efektif untuk:

  • Melihat Distribusi Data = Memberikan gambaran jelas bagaimana data tersebar dalam rentang nilai tertentu, misalnya apakah distribusinya normal, menceng, atau bimodal.

  • Mengidentifikasi Kecenderungan Pusat dan Sebaran = Puncak histogram menunjukkan nilai yang paling sering muncul, sedangkan lebarnya menunjukkan variasi data.

  • Mendeteksi Kemencengan = Asimetri histogram menunjukkan apakah data condong ke kiri (negatif) atau kanan (positif).

  • Mengenali Modus Ganda = Adanya lebih dari satu puncak mengindikasikan kemungkinan adanya subkelompok dalam data.

Dalam dataset pendidikan ini, histogram dapat digunakan untuk mengeksplorasi distribusi dari variabel numerik seperti StudyHours.

library(ggplot2)
library(dplyr)
library(plotly)

# Load data
data <- read.csv("C:/Users/nulin/OneDrive/Desktop/MIDTERM EXAM/EDUCATION DATASET.csv")

# Pilih variabel numerik StudyHours
df <- data.frame(StudyHours = data$StudyHours)

# Histogram untuk StudyHours
p <- ggplot(df, aes(x = StudyHours)) +
  geom_histogram(bins = 15, fill = "#F7C8E0", color = "white", alpha = 0.85) +
  labs(
    title = "Histogram of Study Hours ",
    x = "StudyHours",
    y = "Frekuensi"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text = element_text(size = 11),
    axis.title = element_text(size = 12)
  )

# Interaktif
ggplotly(p)

Interpretasi

  • Grafik menunjukkan distribusi waktu belajar (StudyHours) mahasiswa. Bentuk histogram tampak simetris dan menyerupai distribusi normal, dengan puncak frekuensi berada di sekitar 10 jam belajar.

  • Artinya, sebagian besar mahasiswa memiliki waktu belajar sekitar 8–12 jam, sedangkan yang belajar sangat sedikit (<5 jam) atau sangat banyak (>15 jam) jumlahnya relatif sedikit.

3.3 Boxplot

Boxplot adalah jenis visualisasi data yang digunakan untuk merepresentasikan distribusi data numerik melalui statistik ringkasan. Setiap boxplot menampilkan kuartil (Q1, median, Q3), range, dan outlier dari data, sehingga memudahkan analisis sebaran data antar kelompok.

Boxplot efektif untuk:

Data numerik kontinu = angka yang dapat mengambil berbagai nilai dalam rentang tertentu (misalnya: pengalaman guru, jam belajar, nilai akademik).

Perbandingan distribusi antar kategori = membandingkan sebaran data across kelompok yang berbeda.

Dalam dataset ini, Boxplot dapat digunakan untuk menampilkan Distribusi Academic Performance berdasarkan Tipe Sekolah (SchoolType).

library(ggplot2)
library(dplyr)
library(plotly)

# Load data
data <- read.csv("C:/Users/nulin/OneDrive/Desktop/MIDTERM EXAM/EDUCATION DATASET.csv")

# Boxplot Academic Performance per SchoolType
p <- ggplot(data, aes(x = SchoolType, y = AcademicPerformance, fill = SchoolType)) +
  geom_boxplot(alpha = 0.8) +
  scale_fill_brewer(palette = "Pastel2") +
  labs(
    title = "Distribution of Academic Performance by School Type",
    x = "School Type",
    y = "Academic Performance(1-100)"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text = element_text(size = 11),
    axis.title = element_text(size = 12),
    legend.position = "none"
  )

# Interaktif
ggplotly(p)

Interpretasi

  • Grafik menampilkan Academic Performance (1–100) berdasarkan School Type (Charter, Private, Public).

  • Semua tipe sekolah memiliki nilai Academic Performance = 100 tanpa variasi.

  • Boxplot tampak berupa garis datar tunggal, menandakan tidak ada perbedaan maupun sebaran nilai antar sekolah. Nilai akademik siswa di ketiga jenis sekolah sama-sama maksimal (100) dan tidak menunjukkan variasi dalam performa akademik.

3.4 Pie Chart

Pie Chart adalah grafik statistik berbentuk lingkaran yang dibagi menjadi beberapa bagian untuk menggambarkan proporsi numerik dalam dataset. Setiap bagian lingkaran mewakili kontribusi kategori terhadap keseluruhan, sehingga ideal untuk menampilkan hubungan bagian-ke-keseluruhan.

Pie Chart paling efektif digunakan ketika:

  • Dataset berisi sejumlah kecil kategori.

  • Ingin menekankan proporsi relatif atau persentase.

  • Total keseluruhan mencapai 100% dari dataset.

Namun, Pie Chart kurang efektif jika terdapat terlalu banyak kategori atau ketika perbedaan antar bagian kecil - dalam kasus seperti ini, bar chart biasanya lebih sesuai.

Dalam dataset pendidikan ini, Pie Chart dapat digunakan untuk menampilkan Distribusi Metode Pengajaran (TeachingMethod).

library(dplyr)
library(plotly)

# Load data
data <- read.csv("C:/Users/nulin/OneDrive/Desktop/MIDTERM EXAM/EDUCATION DATASET.csv")

# Hitung proporsi TeachingMethod
teach_prop <- data %>%
  count(TeachingMethod) %>%
  mutate(percentage = round(n / sum(n) * 100, 1))

# Pie Chart Interaktif 
plot_ly(
  teach_prop,
  labels = ~TeachingMethod,
  values = ~percentage,
  type = "pie",
  textinfo = "label+percent",
  insidetextorientation = "radial",
  marker = list(colors = c("#FFC8DD", "#BDE0FE", "#CDEAC0")),
  hole = 0.50,
  textposition = "outside"
) %>%
  layout(
    title = list(
      text = "<b>Percentage of Teaching Method</b>",  # teks tebal
      x = 0.5,
      y = 1.18,
      font = list(size = 16)  # ukuran font
    ),
    showlegend = FALSE  # hilangkan legenda
  )

Interpretasi

  • Grafik menunjukkan persentase penggunaan metode pembelajaran (Teaching Method).

  • Metode pembelajaran Online memiliki proporsi tertinggi yaitu 35,1%, diikuti Traditional sebesar 32,5%, dan Blended sebesar 32,4%.

  • Perbedaan antar ketiga metode relatif kecil, menandakan distribusi yang cukup seimbang.

  • Kesimpulannya ketiga metode pembelajaran digunakan dengan proporsi hampir sama, namun metode Online sedikit lebih dominan dibandingkan metode lainnya.

3.5 Scatter Plot

Scatter plot adalah grafik yang menampilkan titik-titik data dibidang koordinat (X dan Y). Setiap titik menunjukkan dua nilai — satu untuk sumbu X dan satu untuk sumbu Y. Diagram ini dipakai untuk melihat hubungan atau pola antara dua variable.

Kelebihan Scatter plot dapat efektif dirasakan ketika:

  1. Bisa menunjukkan hubungan atau korelasi antara dua variabel dengan jelas.
  2. Mudah melihat pola — apakah data naik bersama, turun bersama, atau tidak berhubungan sama sekali.
  3. Dapat membantu mendeteksi outlier (data yang jauh dari pola umum).
  4. Cocok untuk analisis awal (eksplorasi data) sebelum melakukan perhitungan statistik.
  5. Bisa memperlihatkan kekuatan dan arah hubungan antara dua variabel.

Dari dataset, visualisasi ini membantu mengidentifikasi apakah investasi waktu belajar berkorelasi dengan pencapaian akademik, dan bagaimana pola tersebut berbeda antara ketiga tipe sekolah.

# Load Library 
library(readr)
library(plotly)
library(dplyr)

# Baca Data 
data <- read_csv("EDUCATION DATASET.csv")

# Scatter Plot Interaktif 
fig <- plot_ly(
  data = data,
  x = ~StudyHours,
  y = ~AcademicPerformance,   # Ganti variabel ke Academic Performance
  type = "scatter",
  mode = "markers",
  color = ~SchoolType,       # Warna per kategori SchoolType
  colors = c("#A7BED3", "#FFDAC1", "#B5EAD7"),  # palet pastel lembut
  marker = list(size = 10, opacity = 0.8),
  text = ~paste(
    "<b>School Type:</b>", SchoolType,
    "<br><b>Study Hours:</b>", StudyHours,
    "<br><b>Academic Performance:</b>", AcademicPerformance
  ),
  hoverinfo = "text"
)

# Tambah Judul, Label, dan Legenda 
fig <- fig %>%
  layout(
    title = list(
      text = "<b>Study Hours vs Academic Performance by School Type</b>",
      x = 0.5,   # Tengah
      xanchor = "center",
      font = list(size = 18)   
       
    ),
    xaxis = list(
      title = "Study Hours per Week",
      titlefont = list(size = 16)
    ),
    yaxis = list(
      title = "Academic Performance",
      titlefont = list(size = 16)
    ),
    legend = list(
      title = list(text = "<b>School Type</b>"),
      orientation = "v",
      x = 1.05,
      y = 0.8
    )
  )

# Tampilkan Plot 
fig

Interpretasi

  • Grafik menunjukkan hubungan antara Study Hours per Week dan Academic Performance berdasarkan School Type (Charter, Private, Public).

  • Seluruh titik data memiliki nilai Academic Performance yang sama (100), meskipun jam belajar berbeda-beda.

  • Titik-titik tersebar mendatar di satu garis, menandakan tidak ada variasi pada nilai akademik antar tipe sekolah.

  • Kesimpulannya tidak terdapat hubungan antara jumlah jam belajar dan performa akademik, karena semua siswa dari berbagai jenis sekolah memiliki nilai akademik yang seragam.

3.6 Density Plot

Density Plot adalah alat visualisasi data yang menunjukkan distribusi dan kepadatan suatu variabel numerik. Grafik ini menggunakan kurva mulus untuk memperkirakan fungsi kepadatan probabilitas dari data, sehingga ideal untuk memahami distribusi yang mendasari dan melihat konsentrasi nilai.

Density Plot sangat berguna untuk:

  • Melihat Bentuk Distribusi – Mengidentifikasi modus, skewness, dan kerapatan data
  • Membandingkan Beberapa Distribusi – Overlay beberapa density plot untuk perbandingan visual
  • Mengenali Pola Konsentrasi – Melihat di mana nilai-nilai paling terkonsentrasi

Dalam dataset pendidikan ini, kita dapat menggunakan Density Plot untuk menunjukkan Distribusi StudyHours berdasarkan TeachingMethod.

# Load Library 
library(readr)
library(dplyr)
library(plotly)

# Import Dataset 
data <- read_csv("EDUCATION DATASET.csv")

# Buat Density Plot per Teaching Method 
methods <- unique(data$TeachingMethod)

# Warna 
colors <- c("skyblue","violet","navy")

# Buat Plot Kosong 
fig <- plot_ly()

# Loop Setiap Metode dan Tambahkan Garis Density 
for (i in seq_along(methods)) {
  subset_data <- data %>% filter(TeachingMethod == methods[i])
  
  # hitung density
  d <- density(subset_data$StudyHours, na.rm = TRUE)
  
  # Hitung modus (nilai yang paling sering muncul)
  mode_value <- subset_data %>%
    count(StudyHours) %>%
    filter(n == max(n)) %>%
    pull(StudyHours) %>%
    unique()
  
  # tambahkan trace ke fig
  fig <- fig %>%
    add_trace(
      x = d$x,
      y = d$y,
      type = "scatter",
      mode = "lines",
      name = methods[i],
      line = list(color = colors[(i %% length(colors)) + 1], width = 3)
    )
  
}

# Tata Letak Akhir
fig <- fig %>%
  layout(
    title = list(
      text = "<b>Density Plot of Study Hours by Teaching Method<b>",
      x = 0.5,  # judul di tengah
      xanchor = "center",
      font = list(size = 18)
    ),
    xaxis = list(title = "Study Hours", titlefont = list(size = 16)),
    yaxis = list(title = "Density", titlefont = list(size = 16)),
    legend = list(
      title = list(text = "<b>Teaching Method</b>"),
      orientation = "v",
      x = 1.05,
      y = 0.9
    )
  )

# Tampilkan Plot 
fig

Interpretasi

  • Menampilkan distribusi Study Hours berdasarkan Teaching Method (Traditional, Online, Blended).

  • Ketiga metode menunjukkan sebaran yang hampir simetris dan mendekati bentuk normal.

  • Metode Blended memiliki puncak density tertinggi, menunjukkan konsistensi jam belajar yang lebih seragam.

  • Metode Traditional memiliki sebaran yang lebih lebar, artinya jam belajar siswa lebih bervariasi.

  • Kesimpulannya rata-rata jam belajar berada di kisaran 8–10 jam per minggu dengan pola distribusi yang relatif mirip antar metode pengajaran.

4. Central Tendency Analysis

Central Tendency adalah ukuran statistik yang merepresentasikan nilai tipikal atau sentral dari suatu kumpulan data. Ukuran ini bertujuan untuk memberikan satu nilai yang paling mewakili keseluruhan data, sehingga memungkinkan kita memahami di mana sebagian besar nilai data terkonsentrasi. Tiga ukuran tendensi sentral yang paling umum adalah: Mean, Median, dan Modus.

  • Mean

    Rata-rata diperoleh dengan membagi jumlah semua nilai data dengan jumlah total observasi. Nilai ini cocok untuk tipe data interval dan rasio.

\[ \bar{X} = \frac{\sum_{i=1}^{n} X_i}{n} \] Di mana:

  • \(\bar{X}\) = rata-rata

  • \(X_i\) = setiap nilai data

  • \(n\) = jumlah pengamatan

  • Median

    Median adalah nilai tengah dari kumpulan data yang diurutkan. Median cocok untuk data ordinal, interval, dan rasio. Langkah-langkah untuk Mencari Median:

  1. Susunlah data dalam urutan menaik.

  2. Jika jumlah titik datan ganjil berada pada posisi \(\frac{n+1}{2}\)

  3. Jika genap, median adalah rata-rata dari dua nilai tengah.

  • Modus

    Modus adalah nilai yang paling sering muncul dalam suatu dataset. Modus dapat digunakan untuk data nominal, ordinal, interval, atau rasio.

4.1 Menghitung Central Tencdency

Berikut adalah ringkasan Central Tendency mulai dari Mean(rata-rata), Median (nilai tenggah), dan Modus (nilai yang paling sering muncul) untuk setiap kolom/variabel numerik.

# Import Library 
library(readr)
library(dplyr)
library(tidyr)
library(knitr)
library(kableExtra)

# Baca Data 
data <- read_csv("EDUCATION DATASET.csv")

# Pilih Kolom Numerik 
numeric_cols <- c("StudyHours", "TeacherExperience", "ClassSize", 
                  "ParentalSupport", "StudentMotivation", "AttendanceRate",
                  "HomeworkCompletion", "ExtracurricularHours", 
                  "TechUsage", "AcademicPerformance")

# Hitung Mean, Median, dan Mode
central_tendency <- data %>%
  select(all_of(numeric_cols)) %>%
  summarise(across(everything(),
                   list(
                     Mean = ~round(mean(., na.rm = TRUE), 2),
                     Median = ~round(median(., na.rm = TRUE), 2),
                     Mode = ~as.numeric(names(sort(table(.), decreasing = TRUE)[1]))
                   )))

# Tampilan Tabel
central_tendency_long <- central_tendency %>%
  pivot_longer(cols = everything(),
               names_to = c("Variable", ".value"),
               names_sep = "_")

central_tendency_long %>%
  kbl(caption = "<b>Ukuran Pemusatan (Central Tendency) Variabel Numerik<b>") %>%
  kable_styling(full_width = FALSE,
                bootstrap_options = c("striped", "hover", "condensed"))
Ukuran Pemusatan (Central Tendency) Variabel Numerik
Variable Mean Median Mode
StudyHours 9.92 9.90 10.9
TeacherExperience 10.64 10.75 5.5
ClassSize 25.17 25.00 25.0
ParentalSupport 5.50 5.40 1.9
StudentMotivation 75.29 75.00 76.0
AttendanceRate 84.98 85.10 70.2
HomeworkCompletion 79.96 80.00 78.3
ExtracurricularHours 3.01 3.05 4.2
TechUsage 5.00 5.00 5.6
AcademicPerformance 100.00 100.00 100.0

4.2 Membandingkan dan Interpretasi Distribusi Data

Analisis ini bertujuan untuk membandingkan AcademicPerformance dengan dua variabel penting, yaitu StudyHours dan TeacherExperience. Visualisasi menggunakan boxplot interaktif untuk menampilkan perbedaan nilai tengah, sebaran data, serta mendeteksi adanya outlier dari masing-masing kelompok.

4.2.1 Boxplots of Academic Performance by Teacher Experience vs Study Hours

library(readr)
library(dplyr)
library(ggplot2)
library(plotly)

# Load data
data <- read_csv("EDUCATION DATASET.csv")

# Fungsi boxplot interaktif dengan garis CT
create_box_interactive <- function(data, xvar, breaks, labels, title){
  df <- data %>% mutate(Group = cut({{xvar}}, breaks=breaks, labels=labels, include.lowest=TRUE))
  
  # Central Tendency
  ct <- data.frame(
    Type = c("Mean","Median","Mode"),
    y = c(mean(df$AcademicPerformance, na.rm=TRUE),
          median(df$AcademicPerformance, na.rm=TRUE),
          as.numeric(names(sort(table(df$AcademicPerformance), decreasing=TRUE)[1])))
  )
  
  p <- ggplot(df, aes(x=Group, y=AcademicPerformance)) +
    geom_boxplot(fill="#3E7BFA", alpha=0.6, outlier.color="red") +
    geom_hline(data=ct, aes(yintercept=y, color=Type, linetype=Type), size=1) +
    scale_color_manual(values=c("Mean"="green","Median"="black","Mode"="orange")) +
    scale_linetype_manual(values=c("Mean"="solid","Median"="dotted","Mode"="dashed")) +
    labs(title=title, x=NULL, y="Academic Performance") +
    theme_minimal() +
    theme(axis.text.x=element_text(angle=45, hjust=1), legend.title=element_blank())
  
  ggplotly(p)
}

# Buat dua grafik
p1 <- create_box_interactive(data, TeacherExperience,
                             c(0,5,10,15,20,25,Inf),
                             c("<5 Tahun","5–10 Tahun","10–15 Tahun","15–20 Tahun","20–25 Tahun",">25 Tahun"),
                             "Teacher Experience")

p2 <- create_box_interactive(data, StudyHours,
                             c(0,2,4,6,8,10,Inf),
                             c("<2 Jam","2–4 Jam","4–6 Jam","6–8 Jam","8–10 Jam",">10 Jam"),
                             "Study Hours")


for(i in seq_along(p2$x$data)) p2$x$data[[i]]$showlegend <- FALSE

# Gabungkan kedua grafik
combined <- subplot(p1, p2, nrows=1, shareY=TRUE, widths=c(0.5,0.5)) %>%
  layout(
    title=list(text="<b>Boxplots of Academic Performance by Teacher Experience vs Study Hours</b>",
               x=0.5, y=0.95, xanchor="center", yanchor="top", font=list(size=14)),
    legend=list(orientation="h", x=0.5, y=-0.45, xanchor="center"),
    margin=list(t=80, b=140, l=60, r=40),
    annotations=list(
      list(x=0.25, y=-0.43, text="Teacher Experience", showarrow=FALSE,
           xref="paper", yref="paper", xanchor="center", font=list(size=12)),
      list(x=0.75, y=-0.43, text="Study Hours", showarrow=FALSE,
           xref="paper", yref="paper", xanchor="center", font=list(size=12))
    )
  )

combined

Interpretasi

Nilai Academic Performance seluruhnya berada di sekitar 100 tanpa variasi. Garis mean, median, dan mode menumpuk pada titik yang sama, menunjukkan distribusi data sangat seragam dan simetris. Dengan demikian, baik pengalaman guru maupun lama belajar siswa tidak memengaruhi hasil akademik dalam dataset ini.

4.2.2 Boxplots of Study Hours vs Teacher Experienc

library(readr)
library(dplyr)
library(ggplot2)
library(plotly)

# Read Data
data <- read_csv("EDUCATION DATASET.csv")

create_box_CT <- function(df, var, x_label){
  
  vals <- df[[var]]
  
  # Central Tendency
  mean_v   <- mean(vals, na.rm = TRUE)
  median_v <- median(vals, na.rm = TRUE)
  mode_v   <- as.numeric(names(sort(table(vals), decreasing = TRUE)[1]))
  
  ct <- data.frame(
    Type = c("Mean","Median","Mode"),
    y = c(mean_v, median_v, mode_v)
  )
  
  # Buat dataframe 
  df_plot <- data.frame(x = x_label, y = vals)
  
  p <- ggplot(df_plot, aes(x = x, y = y)) +
    geom_boxplot(fill="#3E7BFA", alpha = 0.6, outlier.color = "red") +
    geom_hline(data = ct,
               aes(yintercept = y, color = Type, linetype = Type),
               size = 1.2) +
    scale_color_manual(values = c("Mean"="green","Median"="black","Mode"="orange")) +
    scale_linetype_manual(values = c("Mean"="solid","Median"="dotted","Mode"="dashed")) +
    labs(
      x = x_label,   
      y = "Frekuensi"
    ) +
    theme_minimal(base_size = 16) +
    theme(
      legend.title = element_blank()
    )
  
  ggplotly(p)
}

# Buat dua grafik
p1 <- create_box_CT(data, "StudyHours", "Study Hours")
p2 <- create_box_CT(data, "TeacherExperience", "Teacher Experience")

for(i in seq_along(p2$x$data)) p2$x$data[[i]]$showlegend <- FALSE

# Gabungkan grafik
subplot(p1, p2, nrows = 1, shareY = TRUE) %>%
  layout(
    title = list(text="<b>Boxplots of Study Hours vs Teacher Experience </b>", x=0.5, font=list(size=20)),
    legend = list(orientation="h", x=0.5, y=-0.25, xanchor="center"),
    margin = list(t=100, b=60)
  )

Interpretasi

  • Study Hours, Box-nya lebih kecil (IQR sempit), tapi ada banyak outlier di bawah dan atas. Artinya sebagian besar nilai berkumpul di tengah, namun ada beberapa nilai ekstrem.

  • Teacher Experience, Box-nya lebih tinggi (IQR lebar) tanpa outlier, berarti variasinya lebih besar dan merata.

  • Garis mean (hijau) dan median (hitam) hampir sejajar, menandakan distribusi seimbang tanpa kecondongan yang kuat.

4.3 Mengidentifikasi Kecondongan Data

Analisis ini bertujuan untuk mengidentifikasi kecondongan data berdasarkan hubungan antara mean, median, dan mode melalui histogram pada tiga variabel utama: AcademicPerformance, StudyHours, dan TeacherExperience.

4.3.1 AcademicPerformance

# Library yang Dibutuhkan 
library(readr)
library(dplyr)
library(plotly)

# Load Dataset 
data <- read_csv("EDUCATION DATASET.csv")

# Fungsi: Histogram + Density + Central Tendency 
create_density_plot <- function(.data, col_name, show_legend = TRUE) {
  
  x <- .data[[col_name]]
  x <- x[!is.na(x)]  
  
  # Hitung ukuran pemusatan
  mean_val <- mean(x)
  median_val <- median(x)
  mode_val <- as.numeric(names(sort(table(x), decreasing = TRUE)[1]))
  
  # Hitung density
  dens <- density(x)
  
  plot_ly() %>%
    
    # Histogram 
    add_histogram(
      x = x,
      nbinsx = 20,
      opacity = 0.6,
      marker = list(
        color = "#7CC8FF",              
        line = list(color = "white", width = 1) 
      ),
      histnorm = "probability density",
      name = "Histogram",
      showlegend = show_legend
    ) %>%
    
    # Density Curve
    add_lines(
      x = dens$x,
      y = dens$y,
      name = "Density Curve",
      line = list(width = 3, color = "#0B3C5D"),
      showlegend = show_legend
    ) %>%
    
    # Mean Line
    add_segments(
      x = mean_val, xend = mean_val,
      y = 0, yend = max(dens$y),
      name = "Mean",
      line = list(color = "red", width = 3),
      showlegend = show_legend
    ) %>%
    
    # Median Line
    add_segments(
      x = median_val, xend = median_val,
      y = 0, yend = max(dens$y),
      name = "Median",
      line = list(color = "green", width = 3, dash = "dash"),
      showlegend = show_legend
    ) %>%
    
    # Mode Line
    add_segments(
      x = mode_val, xend = mode_val,
      y = 0, yend = max(dens$y),
      name = "Mode",
      line = list(color = "blue", width = 3, dash = "dot"),
      showlegend = show_legend
    ) %>%
    
    # Layout 
    layout(
      title = list(
        text = paste("<b>AcademicPerformance Distribution<b> "),
        x = 0.5, xanchor = "center",
        font = list(size = 20)
      ),
      xaxis = list(title = col_name),
      yaxis = list(title = "Density"),
      legend = list(orientation = "h", y = -0.25),
      margin = list(t = 80, b = 70),
      bargap = 0.2  
    )
}

# Panggil Fungsi untuk Variabel AcademicPerformance
create_density_plot(data, "AcademicPerformance", TRUE)

Interpretasi

  • Kesamaan nilai mean, median, dan mode yaitu 100 menunjukkan distribusi AcademicPerformance yang simetris dan seimbang.
  • Tidak tampak perbedaan mencolok di antara ketiganya, sehingga tidak ada kecondongan (skewness) yang berarti.
  • Hal ini mengindikasikan bahwa sebagian besar siswa memiliki performa akademik yang seragam, dengan sedikit variasi ekstrem.
  • Distribusi data cenderung normal, tanpa adanya outlier yang signifikan.

4.3.2 StudyHours

# Library yang Dibutuhkan
library(readr)
library(dplyr)
library(plotly)

# Load Dataset 
data <- read_csv("EDUCATION DATASET.csv")

# Fungsi: Histogram + Density + Central Tendency 
create_density_plot <- function(.data, col_name, show_legend = TRUE) {
  
  x <- .data[[col_name]]
  x <- x[!is.na(x)]  
  
  # Hitung ukuran pemusatan
  mean_val <- mean(x)
  median_val <- median(x)
  mode_val <- as.numeric(names(sort(table(x), decreasing = TRUE)[1]))
  
  # Hitung density
  dens <- density(x)
  
  plot_ly() %>%
    
    # Histogram 
    add_histogram(
      x = x,
      nbinsx = 20,
      opacity = 0.6,
      marker = list(color = "#6FB7FF"),
      histnorm = "probability density",
      name = "Histogram",
      showlegend = show_legend
    ) %>%
    
    # Density Curve
    add_lines(
      x = dens$x,
      y = dens$y,
      name = "Density Curve",
      line = list(width = 3, color = "#0B3C5D"),
      showlegend = show_legend
    ) %>%
    
    # Mean Line
    add_segments(
      x = mean_val, xend = mean_val,
      y = 0, yend = max(dens$y),
      name = "Mean",
      line = list(color = "red", width = 3),
      showlegend = show_legend
    ) %>%
    
    # Median Line
    add_segments(
      x = median_val, xend = median_val,
      y = 0, yend = max(dens$y),
      name = "Median",
      line = list(color = "green", width = 3, dash = "dash"),
      showlegend = show_legend
    ) %>%
    
    # Mode Line
    add_segments(
      x = mode_val, xend = mode_val,
      y = 0, yend = max(dens$y),
      name = "Mode",
      line = list(color = "blue", width = 3, dash = "dot"),
      showlegend = show_legend
    ) %>%
    
    # Layout 
    layout(
      title = list(
        text = paste("<b>StudyHours Distribution<b>"),
        x = 0.5, xanchor = "center",
        font = list(size = 20)
      ),
      xaxis = list(title = col_name),
      yaxis = list(title = "Density"),
      legend = list(orientation = "h", y = -0.25),
      margin = list(t = 80, b = 70), 
      bargap = 0.2  
    )
}

# Panggil Fungsi untuk Variabel StudyHours 
create_density_plot(data, "StudyHours", TRUE)

Interpretasi

  • Nilai mean, median, dan mode berada sangat berdekatan, menandakan distribusi StudyHours bersifat simetris dan normal.
  • Bentuk kurva menyerupai lonceng (bell-shaped) khas distribusi normal, artinya sebagian besar siswa belajar pada durasi rata-rata yang sama.
  • Tidak terdapat skewness (kemencengan) signifikan — waktu belajar tersebar merata di sekitar nilai tengah.
  • Hal ini menunjukkan konsistensi pola belajar siswa, di mana sebagian besar memiliki kebiasaan belajar yang stabil dan tidak ekstrem.

4.3.3 TeacherExperience

# Library yang Dibutuhkan 
library(readr)
library(dplyr)
library(plotly)

# Load Dataset 
data <- read_csv("EDUCATION DATASET.csv")

# Fungsi: Histogram + Density + Central Tendency (Density Axis) 
create_density_plot <- function(.data, col_name, show_legend = TRUE) {
  
  x <- .data[[col_name]]
  x <- x[!is.na(x)]  
  
  # Hitung ukuran pemusatan
  mean_val <- mean(x)
  median_val <- median(x)
  mode_val <- as.numeric(names(sort(table(x), decreasing = TRUE)[1]))
  
  # Hitung density
  dens <- density(x)
  
  plot_ly() %>%
    # Histogram (density)
    add_histogram(
      x = x,
      nbinsx = 20,
      opacity = 0.6,
      marker = list(color = "#6FB7FF"),
      histnorm = "probability density",
      name = "Histogram",
      showlegend = show_legend
    ) %>%
    
    # Density curve
    add_lines(
      x = dens$x, y = dens$y,
      name = "Density Curve",
      line = list(width = 3, color = "#0B3C5D"),
      showlegend = show_legend
    ) %>%
    
    # Mean
    add_segments(
      x = mean_val, xend = mean_val,
      y = 0, yend = max(dens$y),
      name = "Mean",
      line = list(color = "red", width = 3),
      showlegend = show_legend
    ) %>%
    
    # Median
    add_segments(
      x = median_val, xend = median_val,
      y = 0, yend = max(dens$y),
      name = "Median",
      line = list(color = "green", width = 3, dash = "dash"),
      showlegend = show_legend
    ) %>%
    
    # Mode
    add_segments(
      x = mode_val, xend = mode_val,
      y = 0, yend = max(dens$y),
      name = "Mode",
      line = list(color = "blue", width = 3, dash = "dot"),
      showlegend = show_legend
    ) %>%
    
    # Layout
    layout(
      title = list(
        text = paste("<b>Teacher Experience Distribution </b>"),
        x = 0.5, xanchor = "center",
        font = list(size = 20)
      ),
      xaxis = list(title = "Teacher Experience (Years)"),
      yaxis = list(title = "Density"),
      legend = list(orientation = "h", y = -0.25),
      margin = list(t = 80, b = 70),
      bargap = 0.2  
    )
}

# Panggil Fungsi untuk Variabel TeacherExperience 
create_density_plot(data, "TeacherExperience", TRUE)

Interpretasi

  • Mean dan median hampir berdekatan, menandakan distribusi pengalaman guru relatif seimbang (simetris).
  • Mode sedikit bergeser ke kiri, menunjukkan ada lebih banyak guru dengan pengalaman rendah hingga menengah dibanding yang sangat berpengalaman.
  • Kurva menunjukkan bentuk yang agak rata (flatter) — menandakan variasi pengalaman cukup tinggi di antara guru.
  • Secara keseluruhan, data ini menggambarkan komposisi guru yang beragam, namun sebagian besar memiliki pengalaman sedang (5–15 tahun) yang mendominasi distribusi.

5. Dispersion

  • Pengertian

    Measures of Dispersion/Variability menggambarkan seberapa luas penyebaran nilai-nilai di sekitar pusat tersebut. dengan kata lain, Dispersion mengukur tingkat variabilitas atau keragaman dalam data.

  • Range

    Rentang adalah ukuran dispersi yang paling sederhana, yang mewakili selisih antara observasi terbesar dan terkecil dalam suatu kumpulan data.

    Rumus : Range = Xmax - Xmin

  • Varians

    Varians mengukur rata-rata deviasi kuadrat dari rata-rata.Varians mengkuantifikasi seberapa besar setiap titik data berbeda dari rata-rata, yang mencerminkan tingkat penyebaran dalam kumpulan data.

    Rumus untuk suatu populasi :

\[ \sigma^2 = \frac{\sum_{i=1}^{N} (X_i - \mu)^2}{N} \]

Rumus untuk contoh (sample):

\[ s^2 = \frac{\sum_{i=1}^{n} (X_i - \bar{X})^2}{n - 1} \]

  • Deviasi Standar

    Simpangan baku (SD) adalah akar kuadrat dari varians.SD mengukur jarak rata-rata setiap titik data dari rata-rata setiap titik data dari rata-rata dan dinyatakan dalam satuan yang sama dengan data asli.

    Rumus untuk suatu populasi: \[ \sigma = \sqrt{\frac{\sum_{i=1}^{N}(X_i - \mu)^2}{N}} \]

    Rumus untuk contoh: \[ s = \sqrt{\frac{\sum_{i=1}^{n}(X_i - \bar{X})^2}{n - 1}} \]

5.1 Menghitung Dispersion Variabel Numerik

Analisis ini bertujuan untuk menghitung ukuran penyebaran data berupa rentang, varians, standar deviasi, dan IQR untuk variabel Academic Performance, Study Hours, dan Teacher Experience guna melihat tingkat variasi dan persebaran nilai pada masing-masing variabel.

# Library 
library(readr)
library(dplyr)
library(knitr)
library(kableExtra)

# Load Dataset 
data <- read_csv("EDUCATION DATASET.csv")

# Pilih variabel numerik 
num_vars <- data %>%
  select(StudyHours, TeacherExperience, AcademicPerformance)

# Hitung Ukuran Dispersi 
dispersi_summary <- num_vars %>%
  summarise(
    across(
      everything(),
      list(
        Rentang = ~max(., na.rm = TRUE) - min(., na.rm = TRUE),
        Varians = ~var(., na.rm = TRUE),
        SD = ~sd(., na.rm = TRUE),
        IQR = ~IQR(., na.rm = TRUE)
      ),
      .names = "{.col}_{.fn}"
    )
  ) %>%
  tidyr::pivot_longer(
    cols = everything(),
    names_to = c("Variabel", "Ukuran"),
    names_sep = "_",
    values_to = "Nilai"
  ) %>%
  tidyr::pivot_wider(names_from = Ukuran, values_from = Nilai)

# Tampilkan tabel 
kable(
  dispersi_summary,
  caption = "<b>Tabel Ukuran Dispersi Variabel Numerik<b>",
  position = "center",
  font_size = 20,
  align = "c",     
  digits = 2
) %>%
  kable_styling(
    full_width = FALSE,
    position = "center",
    font_size = 20
  ) %>%
  row_spec(0, bold = TRUE, align = "center")   
Tabel Ukuran Dispersi Variabel Numerik
Variabel Rentang Varians SD IQR
StudyHours 19.5 9.39 3.06 4.2
TeacherExperience 19.0 30.39 5.51 9.7
AcademicPerformance 0.0 0.00 0.00 0.0

Interpretasi

  • StudyHours

    Memiliki rentang 19.5 dan standar deviasi 3.06, menunjukkan variasi waktu belajar antar siswa cukup moderat. Artinya, ada perbedaan durasi belajar, tetapi masih relatif terkonsentrasi di sekitar rata-rata.

  • TeacherExperience

    Menunjukkan rentang 19.0 dan standar deviasi 5.51, yang berarti pengalaman guru bervariasi cukup luas antar individu. Ini mengindikasikan adanya keberagaman tingkat pengalaman mengajar di antara guru.

  • AcademicPerformance

    Seluruh nilai ukuran dispersi bernilai 0.0, menandakan tidak ada variasi dalam performa akademik siswa. Semua siswa memiliki nilai akademik yang sama, sehingga distribusinya benar-benar homogen.

5.2 Menafsirkan Spread atau Variabilitas dataset

Berdasarkan hasil perhitungan rentang, varians, standar deviasi, dan IQR pada variabel Academic Performance, Study Hours, dan Teacher Experience, dapat diketahui sejauh mana data dalam ketiga variabel tersebut menyebar di sekitar nilai rata-ratanya.

5.2.1 Boxplot

  • Boxplots of Academic Performance by Study Hours vs Teacher Experience
# Library 
library(readr)
library(dplyr)
library(tidyr)
library(plotly)

# Load Dataset
data <- read_csv("EDUCATION DATASET.csv")

# Pilih variabel numerik 
num_vars <- data %>%
  select(StudyHours, TeacherExperience, AcademicPerformance)

#  Boxplot 
num_vars_long <- num_vars %>%
  pivot_longer(cols = c(StudyHours, TeacherExperience),
               names_to = "Variabel_X",
               values_to = "Nilai_X")

plot_ly(
  data = num_vars_long,
  x = ~Variabel_X,
  y = ~AcademicPerformance,
  color = ~Variabel_X,
  type = "box",
  boxmean = TRUE,  # tampilkan mean
  colors = c("#6FB7FF", "#FFA07A")
) %>%
  layout(
    title = list(
      text = "<b>Boxplots of Academic Performance by Study Hours vs Teacher Experience</b>",
      x = 0.5, xanchor = "center",
      font = list(size = 13)
    ),
    xaxis = list(title = "Variabel Numerik (StudyHours & TeacherExperience)"),
    yaxis = list(title = "Academic Performance"),
    showlegend = FALSE
  )

Interpretasi

  • Nilai Academic Performance sama pada semua kategori StudyHours dan TeacherExperience.

  • Kedua boxplot berbentuk garis datar, menandakan tidak ada variasi data.

  • Artinya, lama belajar dan pengalaman guru tidak memengaruhi performa akademik siswa dalam dataset ini.

  • Boxplots of Study Hours vs Teacher Experience

library(readr)
library(dplyr)
library(ggplot2)
library(plotly)

# Load data
data <- read_csv("EDUCATION DATASET.csv")

# dispersion boxplot interaktif
create_dispersion_box <- function(data, xvar, breaks, labels, x_main_label){
  df <- data %>% mutate(Group = cut({{xvar}}, breaks=breaks, labels=labels, include.lowest=TRUE))
  
  p <- ggplot(df, aes(x=Group, y={{xvar}})) +
    geom_boxplot(fill="#FFA07A", alpha=0.6, outlier.color="red") +
    labs(x=NULL, y="frekuensi") +
    theme_minimal() +
    theme(axis.text.x=element_text(angle=45, hjust=1))
  
  ggplotly(p)
}

# Boxplot StudyHours
p1 <- create_dispersion_box(data, StudyHours,
                            c(0,2,4,6,8,10,Inf),
                            c("<2 Jam","2–4 Jam","4–6 Jam","6–8 Jam","8–10 Jam",">10 Jam"),
                            "Study Hours")

# Boxplot TeacherExperience
p2 <- create_dispersion_box(data, TeacherExperience,
                            c(0,5,10,15,20,25,Inf),
                            c("<5 Tahun","5–10 Tahun","10–15 Tahun","15–20 Tahun","20–25 Tahun",">25 Tahun"),
                            "Teacher Experience")

# Gabungkan kedua grafik
combined <- subplot(p1, p2, nrows=1, shareY=TRUE, widths=c(0.5,0.5)) %>%
  layout(
    title=list(text="<b>Boxplots of Study Hours vs Teacher Experience</b>",
               x=0.5, y=0.95, xanchor="center", yanchor="top", font=list(size=14)),
    margin=list(t=100, b=140, l=60, r=40),
    annotations=list(
      list(x=0.25, y=-0.45, text="Study Hours", showarrow=FALSE,
           xref="paper", yref="paper", xanchor="center", font=list(size=12)),
      list(x=0.75, y=-0.45, text="Teacher Experience", showarrow=FALSE,
           xref="paper", yref="paper", xanchor="center", font=list(size=12))
    )
  )

combined

Interpretasi

  • Study Hours: Semakin lama waktu belajar, frekuensi meningkat dengan beberapa outlier pada kategori >10 jam.

  • Teacher Experience: Semakin tinggi pengalaman, frekuensi juga meningkat dan sebaran makin luas.

  • Kesimpulan: Keduanya menunjukkan tren meningkat dengan variasi lebih besar pada kategori tinggi.

5.2.2 Histogram

library(readr)
library(dplyr)
library(plotly)

data <- read_csv("EDUCATION DATASET.csv")

create_hist_density <- function(data, var, fill_col, line_col, show_legend = TRUE){
  x <- data[[var]]
  dens <- density(x, na.rm = TRUE)
  mean_x <- mean(x, na.rm = TRUE)
  median_x <- median(x, na.rm = TRUE)
  
  plot_ly() %>%
    add_histogram(x = x, nbinsx = 20, histnorm = "probability density",
                  opacity = 0.6, marker = list(color = fill_col), showlegend = FALSE) %>%
    add_lines(x = dens$x, y = dens$y, line = list(color = line_col, width = 3), showlegend = FALSE) %>%
    add_lines(x = c(mean_x, mean_x), y = c(0, max(dens$y)*1.05),
              name = "Mean", line = list(color="red", dash="dash", width=2), showlegend = show_legend) %>%
    add_lines(x = c(median_x, median_x), y = c(0, max(dens$y)*1.05),
              name = "Median", line = list(color="black", dash="dot", width=2), showlegend = show_legend) %>%
    layout(xaxis = list(title = var),
           yaxis = list(title = "Density"))
}

p1 <- create_hist_density(data, "StudyHours", "#6FB7FF", "#0B3C5D", show_legend=TRUE)
p2 <- create_hist_density(data, "TeacherExperience", "#FFA07A", "#8B0000", show_legend=FALSE)
p3 <- create_hist_density(data, "AcademicPerformance", "#90EE90", "#006400", show_legend=FALSE)

# Gabungkan subplot
subplot(p1, p2, p3, nrows=1, shareY=TRUE, titleX=TRUE, titleY=TRUE) %>%
  layout(
    title = list(text="<b>Histogram Variabel Numerik</b>",
                 x=0.5, xanchor="center", font=list(size=18)),
    margin = list(t=100),
    legend = list(orientation="h", x=0.5, y=-0.25, xanchor="center")
  )

Interpretasi

  • StudyHours

    Distribusi menunjukkan pola yang mendekati normal, dengan sebagian besar siswa memiliki waktu belajar di kisaran menengah (sekitar 8–12 jam per minggu). Nilai density yang menurun di kedua sisi menandakan ada sedikit siswa dengan waktu belajar terlalu sedikit atau terlalu banyak. Ini menunjukkan sebaran data cukup seimbang dengan variasi moderat.

  • TeacherExperience

    Distribusi terlihat cukup merata (flat), menandakan bahwa pengalaman guru tersebar relatif seimbang di berbagai rentang tahun pengalaman. Tidak ada puncak dominan, artinya guru dengan pengalaman rendah maupun tinggi memiliki proporsi yang hampir sama.

  • AcademicPerformance

    Grafik menunjukkan satu garis tipis tanpa penyebaran berarti, mengindikasikan bahwa seluruh nilai performa akademik siswa berada pada satu titik (konstan). Tidak ada variasi antar individu, yang memperkuat hasil dari tabel dan boxplot bahwa variabel ini tidak memiliki dispersi sama sekali.

5.2.3 Scetter Plot

  • Scatter Plot Dispersion Academic Performance by Study Hours vs Teacher Experience
# Library 
library(readr)
library(dplyr)
library(plotly)

# Load Dataset 
data <- read_csv("EDUCATION DATASET.csv")

# Scatter Plot 1: StudyHours vs AcademicPerformance 
scatter1 <- plot_ly(
  data,
  x = ~StudyHours,
  y = ~AcademicPerformance,
  type = "scatter",
  mode = "markers",
  marker = list(size = 8, color = "#6FB7FF", opacity = 0.7),
  showlegend = FALSE
)

# Scatter Plot 2: TeacherExperience vs AcademicPerformance 
scatter2 <- plot_ly(
  data,
  x = ~TeacherExperience,
  y = ~AcademicPerformance,
  type = "scatter",
  mode = "markers",
  marker = list(size = 8, color = "#FFA07A", opacity = 0.7),
  showlegend = FALSE
)

subplot(scatter1, scatter2, nrows = 1, shareY = TRUE) %>%
  layout(
    title = list(
      text = "<b>Scatter Plot Dispersion Academic Performance by Study Hours vs Teacher Experience</b>",
      x = 0.5, xanchor = "center",
      font = list(size = 15)
    ),
    xaxis = list(title = "Study Hours"),
    xaxis2 = list(title = "Teacher Experience"),
    yaxis = list(title = "Academic Performance"),
    margin = list(t = 80)
  )

Interpretasi

  • Study Hours: Nilai Academic Performance tetap 100 meskipun waktu belajar berbeda, menunjukkan tidak ada pengaruh lama belajar terhadap performa akademik.

  • Teacher Experience: Polanya sama, nilai tetap 100 di semua tingkat pengalaman guru.

  • Kesimpulan: Academic Performance bersifat konstan, sehingga tidak ada hubungan atau korelasi dengan variabel lain.

  • Scatter Plot Dispersion Study Hours vs Teacher Experience

library(readr)
library(dplyr)
library(ggplot2)
library(plotly)

# Load data
data <- read_csv("EDUCATION DATASET.csv")

# Fungsi scatter sederhana (X = variabel, Y = variabel yang sama)
create_self_scatter <- function(data, var, label_x) {
  p <- ggplot(data, aes(x = {{var}}, y = {{var}})) +
    geom_point(color = "#FFA07A", size = 2, alpha = 0.7) +
    geom_line(aes(x = sort({{var}}), y = sort({{var}})),
              color = "#FF6347", linewidth = 1) + # garis naik ke atas
    labs(x = label_x, y = "Frekuensi", title = paste("Scatter Plot:", label_x)) +
    theme_minimal() +
    theme(
      plot.title = element_text(hjust = 0.5, face = "bold"),
      axis.text.x = element_text(angle = 0, hjust = 0.5)
    )
  
  ggplotly(p)
}

# Scatter StudyHours
p1 <- create_self_scatter(data, StudyHours, "Study Hours")

# Scatter TeacherExperience
p2 <- create_self_scatter(data, TeacherExperience, "Teacher Experience")

# Gabungkan dua grafik
combined <- subplot(p1, p2, nrows = 1, shareY = TRUE, widths = c(0.5, 0.5)) %>%
  layout(
    title = list(
      text = "<b>Scatter Plot of Study Hours vs Teacher Experience</b>",
      x = 0.5, y = 0.95, xanchor = "center", yanchor = "top", font = list(size = 14)
    ),
    margin = list(t = 100, b = 100, l = 60, r = 40),
    annotations = list(
      list(
        x = 0.25, y = -0.2,
        text = "Study Hours", showarrow = FALSE,
        xref = "paper", yref = "paper", xanchor = "center", font = list(size = 12)
      ),
      list(
        x = 0.75, y = -0.2,
        text = "Teacher Experience", showarrow = FALSE,
        xref = "paper", yref = "paper", xanchor = "center", font = list(size = 12)
      )
    )
  )

combined

Interpretasi

Kedua scatter plot menunjukkan garis lurus naik, menandakan hubungan linear positif sempurna antara variabel dengan dirinya sendiri. Artinya, semakin tinggi Study Hours atau Teacher Experience, semakin tinggi pula frekuensinya, menggambarkan pola data yang sangat teratur dan konsisten.

5.3 Mengidentifikasi Variabel dengan Variabilitas Terbesar

Analisis ini bertujuan untuk mengidentifikasi variabel mana yang memiliki penyebaran data paling besar, serta menafsirkan kemungkinan faktor-faktor yang menyebabkan perbedaan tersebut. Berdasarkan hasil perhitungan rentang, varians, standar deviasi, dan IQR, dapat diidentifikasi bahwa tingkat variabilitas berbeda pada setiap variabel numerik.

  • Variabel dengan penyebaran data paling besar adalah TeacherExperience, ditunjukkan oleh nilai varians dan standar deviasi tertinggi. Ini berarti pengalaman guru dalam dataset sangat bervariasi, dari yang baru hingga yang berpengalaman lama.

  • StudyHours memiliki penyebaran sedang, yang menunjukkan waktu belajar siswa relatif serupa.

  • AcademicPerformance tidak memiliki variasi sama sekali (semua nilai seragam), menandakan tidak ada perbedaan performa akademik antar siswa.

  • Kondisi ini juga menunjukkan bahwa variabel StudyHours dan TeacherExperience tidak memberikan pengaruh yang signifikan terhadap nilai AcademicPerformance, karena meskipun keduanya bervariasi, nilai akademik tetap konstan.

  • Dengan demikian, dapat disimpulkan bahwa tidak terdapat hubungan yang berarti antara lama belajar maupun pengalaman guru dengan pencapaian akademik siswa dalam dataset ini.

6. Summary & Interpretation

Awalnya, analisis ini bertujuan untuk mengevaluasi hubungan antara variabel pendidikan seperti StudyHours, TeacherExperience, SchoolType, dan TeachingMethod terhadap AcademicPerformance. Namun, karena seluruh nilai AcademicPerformance konstan di angka 100, analisis hubungan tidak dapat dilakukan. Oleh sebab itu, fokus analisis dialihkan untuk mengeksplorasi karakteristik dan pola sebaran variabel lain guna memahami kondisi serta keragaman faktor pendidikan dalam dataset.

Hasil visualisasi menunjukkan bahwa StudyHours memiliki pola distribusi mendekati normal, dengan sebagian besar siswa belajar 8–12 jam per minggu, menandakan variasi yang moderat. TeacherExperience menunjukkan variasi paling besar dengan rentang pengalaman mengajar yang luas, menggambarkan keberagaman latar belakang guru. Untuk variabel kategori, seperti SchoolType dan TeachingMethod, jumlahnya terlihat cukup seimbang, meskipun sekolah swasta dan metode online tampak sedikit lebih dominan.

Namun, karena nilai AcademicPerformance identik, hubungan antara faktor-faktor tersebut dengan hasil akademik tidak dapat dievaluasi lebih lanjut. Secara keseluruhan, dataset ini memperlihatkan adanya variasi dalam faktor pendidikan, tetapi kurang mendukung analisis hubungan sebab-akibat terhadap performa belajar siswa karena homogenitas pada nilai akademik.

7. Video Explaination

Untuk memberikan pemahaman yang lebih jelas mengenai hasil analisis yang telah kami sajikan, kami mengundang Anda untuk menyaksikan video presentasi yang membahas poin-poin utama dari laporan ini.

Klik gambar untuk menonton video

References

[1] Siregar, B. (n.d.). Introduction to statistics. dsciencelabs. https://bookdown.org/dsciencelabs/intro_statistics/Preface.html

[2] Siregar, B. (n.d.). Introduction to statistics: Chapter 2 Data Exploration. dsciencelabs. https://bookdown.org/dsciencelabs/intro_statistics/02-Data_Exploration.html

[3] Siregar, B. (n.d.). Introduction to statistics: Chapter 3 Basic Data Visualizations. dsciencelabs. https://bookdown.org/dsciencelabs/intro_statistics/03-Basic_Visualizations.html

[4] Siregar, B. (n.d.). Introduction to statistics: Chapter 4 Central Tendency. dsciencelabs. https://bookdown.org/dsciencelabs/intro_statistics/04-Central_Tendency.html

[5] Siregar, B. (n.d.). Introduction to statistics: Chapter 5 Statistical Dispersion. dsciencelabs. https://bookdown.org/dsciencelabs/intro_statistics/05-Statistical_Dispersion.html [1]