Eksplorasi Data

Pada bagian ini akan dilakukan persiapan awal analisis data, mulai dari instalasi package, pemanggilan library, hingga memuat dataset yang akan digunakan pada proses pemodelan.

Dataset yang digunakan adalah “AI Impact on Students” yang berasal dari survei dan sistem informasi akademik selama satu semester penuh. Dataset ini berisi informasi yang mencakup profil akademik, perilaku penggunaan AI, kebiasaan belajar, kebijakan institusi, dan indikator kesehatan mental.

Install packages yang dibutuhkan

Jalankan instalasi package berikut apabila package belum tersedia pada perangkat masing-masing. Instalasi package cukup dilakukan satu kali saja.

Memanggil library yang digunakan

Library berikut digunakan untuk membantu proses eksplorasi data, visualisasi, analisis regresi, serta evaluasi model.

library(readr)
library(dplyr)
library(DataExplorer)
library(skimr)
library(ggplot2)
library(tidyr)

Modul 2: Mengumpulkan Data

  1. Dokumentasi Sumber Data Dataset “AI student Impact dataset” diimport dari komputer dengan menggunankan library ‘readr’ menggunakan syntax read.csv(“lokasi data”) dan akan digunakan pada seluruh proses analisis berikutnya.
data<-read.csv("E:/Learning/Pelatihan Data Analyst/Data Analyst/Ai_student_impact_dataset (1).csv",header = TRUE)

Eksplorasi awal dataset

Tahap eksplorasi data dilakukan untuk memahami karakteristik awal dataset sebelum dilakukan pemodelan. Pada tahap ini, dilakukan pengecekan struktur data, tipe variabel, jumlah observasi, missing value, serta ringkasan statistik deskriptif dari masing-masing variabel.

#eksplorasi data
skim_without_charts(data)
Data summary
Name data
Number of rows 50000
Number of columns 16
_______________________
Column type frequency:
character 8
numeric 8
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Student_ID 0 1 6 108 0 50000 0
Major_Category 0 1 0 10 2 6 0
Year_of_Study 0 1 0 9 2 7 0
Primary_Use_Case 0 1 0 25 2 6 0
Prompt_Engineering_Skill 0 1 0 12 2 4 0
Paid_Subscription 0 1 0 5 2 3 0
Institutional_Policy 0 1 0 21 2 4 0
Burnout_Risk_Level 0 1 0 6 2 4 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100
Pre_Semester_GPA 2 1 3.15 0.48 1.18 2.83 3.21 3.52 12.25
Weekly_GenAI_Hours 2 1 8.43 8.27 0.00 2.39 5.80 11.72 40.00
Tool_Diversity 2 1 2.80 1.19 1.00 2.00 3.00 4.00 18.00
Traditional_Study_Hours 2 1 11.21 5.16 1.00 7.56 11.18 14.71 35.86
Perceived_AI_Dependency 2 1 3.51 1.82 1.00 2.00 3.00 5.00 10.00
Anxiety_Level_During_Exams 2 1 4.27 2.14 1.00 3.00 4.00 6.00 10.00
Post_Semester_GPA 2 1 3.35 0.50 1.00 3.02 3.42 3.75 10.39
Skill_Retention_Score 2 1 75.80 13.28 10.78 66.82 76.00 85.19 100.00
str(data)
## 'data.frame':    50000 obs. of  16 variables:
##  $ Student_ID                : chr  "100001" "100002" "100003" "100004" ...
##  $ Major_Category            : chr  "Humanities" "Medical" "Business" "Business" ...
##  $ Year_of_Study             : chr  "Senior" "Junior" "Freshman" "Senior" ...
##  $ Pre_Semester_GPA          : num  2.42 3.82 3.4 3.79 3.63 ...
##  $ Weekly_GenAI_Hours        : num  23.31 1.12 21.26 1.82 9.29 ...
##  $ Primary_Use_Case          : chr  "Copywriting/Drafting" "Ideation" "Summarizing_Reading" "Copywriting/Drafting" ...
##  $ Prompt_Engineering_Skill  : chr  "Beginner" "Advanced" "Beginner" "Intermediate" ...
##  $ Tool_Diversity            : int  1 5 2 4 4 1 5 3 2 2 ...
##  $ Paid_Subscription         : chr  "True" "False" "False" "False" ...
##  $ Traditional_Study_Hours   : num  8.13 16.65 10.35 15.23 12.55 ...
##  $ Perceived_AI_Dependency   : int  5 3 5 2 4 4 8 2 1 3 ...
##  $ Institutional_Policy      : chr  "Allowed_With_Citation" "Allowed_With_Citation" "Strict_Ban" "Allowed_With_Citation" ...
##  $ Anxiety_Level_During_Exams: int  6 9 9 2 4 5 7 1 5 8 ...
##  $ Post_Semester_GPA         : num  2.39 3.7 3.5 4 3.8 ...
##  $ Skill_Retention_Score     : num  86.4 69.4 73.9 63.6 100 ...
##  $ Burnout_Risk_Level        : chr  "High" "Low" "Medium" "Medium" ...
data$Major_Category <- as.factor(data$Major_Category)
data$Year_of_Study <- as.factor(data$Year_of_Study)
data$Prompt_Engineering_Skill <- as.factor(data$Prompt_Engineering_Skill)
data$Paid_Subscription <- as.factor(data$Paid_Subscription)
data$Burnout_Risk_Level <- factor(
  data$Burnout_Risk_Level,
  levels = c("Low", "Medium", "High"),
  ordered = TRUE
)
data$Institutional_Policy <- as.factor(data$Institutional_Policy)
str(data)
## 'data.frame':    50000 obs. of  16 variables:
##  $ Student_ID                : chr  "100001" "100002" "100003" "100004" ...
##  $ Major_Category            : Factor w/ 6 levels "","Arts","Business",..: 4 5 3 3 6 6 6 2 3 3 ...
##  $ Year_of_Study             : Factor w/ 7 levels "","123","Freshman",..: 6 5 3 6 7 5 3 5 7 7 ...
##  $ Pre_Semester_GPA          : num  2.42 3.82 3.4 3.79 3.63 ...
##  $ Weekly_GenAI_Hours        : num  23.31 1.12 21.26 1.82 9.29 ...
##  $ Primary_Use_Case          : chr  "Copywriting/Drafting" "Ideation" "Summarizing_Reading" "Copywriting/Drafting" ...
##  $ Prompt_Engineering_Skill  : Factor w/ 4 levels "","Advanced",..: 3 2 3 4 2 3 2 4 3 4 ...
##  $ Tool_Diversity            : int  1 5 2 4 4 1 5 3 2 2 ...
##  $ Paid_Subscription         : Factor w/ 3 levels "","False","True": 3 2 2 2 2 2 3 2 3 3 ...
##  $ Traditional_Study_Hours   : num  8.13 16.65 10.35 15.23 12.55 ...
##  $ Perceived_AI_Dependency   : int  5 3 5 2 4 4 8 2 1 3 ...
##  $ Institutional_Policy      : Factor w/ 4 levels "","Actively_Encouraged",..: 3 3 4 3 3 3 3 2 4 4 ...
##  $ Anxiety_Level_During_Exams: int  6 9 9 2 4 5 7 1 5 8 ...
##  $ Post_Semester_GPA         : num  2.39 3.7 3.5 4 3.8 ...
##  $ Skill_Retention_Score     : num  86.4 69.4 73.9 63.6 100 ...
##  $ Burnout_Risk_Level        : Ord.factor w/ 3 levels "Low"<"Medium"<..: 3 1 2 2 2 3 2 2 2 3 ...

Interpretasi hasil eksplorasi data

Berdasarkan hasil eksplorasi awal, dataset terdiri dari 50.000 observasi dan 16 variabel. Variabel pada dataset terdiri dari kombinasi data numerik dan kategorik (factor)

Hasil eksplorasi menunjukkan bahwa seluruh variabel memilikin_missing-2 atau secara persentase complete_rate = 0.99996 , yang berarti terdapat 2 missing value pada dataset. Meskipun terdapat missing value, Kondisi ini dapat dikatakan sangat baik untuk proses pemodelan karena hanya terdapat 2 dari 50.000 nilai yang hilang.Penanganan missing value yang akan dilakukan pada analisis ini adalah dengan penghapusan data.

Pada variabel kategorik (factor), terlihat beberapa variabel penting seperti: - Year_of_Study - Institutonal_Policy - Burnout_Risk_Level - Prompt_Engineering_Skill - Paid_Subscription - Primary_Use_Case

Variabel-variabel tersebut berpotensi memengaruhiPost_Semester_GPA sehingga dapat digunakan sebagai prediktor dalam proses pemodelan.

Untuk variabel numerik, diperoleh beberapa informasi penting: - Rata-rata Post Semester GPA (Post_Semester_GPA) sebesar 3,34 dengan maksimum mencapai 10,38.Hal ini mengindikasikan adanya data yanng inkonsisten mengingat rentang GPA seharusnya dari 0,00-4,00. -Variabel Tool_Diversityjuga terindikasi mengandung data yang inkonsisten karena nilai maksimumnya 18 sedangkan rentang nilainya adalah 1-5 - Variabel Anxiety_Level_During_Exams, Skill_Retention_Score, Perceived_AI_Dependency dengan rentang 1-10, distribusinya cenderung tidak simetris (skewed).

Secara umum, hasil eksplorasi awal menunjukkan bahwa dataset masih memerlukan penanganan missing value dan validasi data sebelum digunakan untuk proses analisis lanjutan dan pemodelan statistik maupun machine learning.

Visualisasi EDA yang membantu pertanyaan bisnis

data_long <- data %>%
  pivot_longer(
    cols = c(Pre_Semester_GPA,
             Post_Semester_GPA),
    names_to = "Periode",
    values_to = "GPA"
  )

ggplot(data_long,
       aes(x = Major_Category,
           y = GPA,
           fill = Periode)) +
  geom_boxplot() +
  theme_minimal()
## Warning: Removed 4 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

ggplot(data,
       aes(Weekly_GenAI_Hours,
           Post_Semester_GPA)) +
  geom_point(alpha=0.3) +
  geom_smooth(method="lm")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_smooth()`).
## Warning: Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).

ggplot(data,
       aes(Weekly_GenAI_Hours,
           Skill_Retention_Score)) +
  geom_point(alpha=0.3) +
  geom_smooth(method="lm")
## `geom_smooth()` using formula = 'y ~ x'
## Warning: Removed 2 rows containing non-finite outside the scale range (`stat_smooth()`).
## Removed 2 rows containing missing values or values outside the scale range
## (`geom_point()`).

cor(
  data$Weekly_GenAI_Hours,
  data$Post_Semester_GPA
)
## [1] NA

###Distribusi Burnout_risk_level per kebijakan institusi

ggplot(data,
       aes(x = Institutional_Policy,
           fill = Burnout_Risk_Level)) +
  geom_bar() +
  labs(
    title = "Distribusi Burnout Risk Level per Kebijakan Institusi",
    x = "Kebijakan Institusi",
    y = "Jumlah Mahasiswa",
    fill = "Burnout Risk Level"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

table(data$Institutional_Policy,
      data$Burnout_Risk_Level)
##                        
##                           Low Medium  High
##                             0      0     0
##   Actively_Encouraged    5079   6346  3562
##   Allowed_With_Citation  8320  10892  6011
##   Strict_Ban             2970   3905  2913
rata_ai <- data %>%
  group_by(Year_of_Study) %>%
  summarise(
    Mean_AI_Hours = mean(Weekly_GenAI_Hours, na.rm = TRUE)
  )

ggplot(rata_ai,
       aes(x = Year_of_Study,
           y = Mean_AI_Hours,
           group = 1)) +
  geom_line() +
  geom_point(size = 3) +
  labs(
    title = "Rata-rata Penggunaan AI per Jenjang Studi",
    x = "Year of Study",
    y = "Rata-rata Jam AI per Minggu"
  ) +
  theme_minimal()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_point()`).

data %>%
  group_by(Year_of_Study) %>%
  summarise(
    Jumlah = n(),
    Mean = mean(Weekly_GenAI_Hours),
    Median = median(Weekly_GenAI_Hours),
    SD = sd(Weekly_GenAI_Hours)
  )
data$Burnout_Risk_Level <- factor(
  data$Burnout_Risk_Level,
  levels = c("Low", "Medium", "High")
)

ggplot(data,
       aes(x = Burnout_Risk_Level,
           y = Perceived_AI_Dependency,
           fill = Burnout_Risk_Level)) +
  geom_boxplot() +
  labs(
    title = "Perceived AI Dependency berdasarkan Burnout Risk Level",
    x = "Burnout Risk Level",
    y = "Perceived AI Dependency"
  ) +
  theme_minimal()
## Warning: Removed 2 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

### Penanganan Missing Value Dataset mengandung sejumlah kecil missing value. Karena proporsi missing value sangat rendah dibandingkan total observasi, penanganan dilakukan dengan metode listwise deletion (menghapus observasi yang mengandung missing value). Setelah proses pembersihan data, tidak terdapat lagi nilai yang hilang pada dataset yang digunakan untuk analisis

missing_summary <- data.frame(
  Variabel = names(data),
  Jumlah_Missing = colSums(is.na(data)),
  Persentase_Missing = colSums(is.na(data))/nrow(data)*100
)

missing_summary
data<-data[complete.cases(data), ]
skim(data)
## Warning: There was 1 warning in `dplyr::summarize()`.
## ℹ In argument: `dplyr::across(tidyselect::any_of(variable_names),
##   mangled_skimmers$funs)`.
## ℹ In group 0: .
## Caused by warning:
## ! There were 5 warnings in `dplyr::summarize()`.
## The first warning was:
## ℹ In argument: `dplyr::across(tidyselect::any_of(variable_names),
##   mangled_skimmers$funs)`.
## Caused by warning in `sorted_count()`:
## ! Variable contains value(s) of "" that have been converted to "empty".
## ℹ Run `dplyr::last_dplyr_warnings()` to see the 4 remaining warnings.
Data summary
Name data
Number of rows 49998
Number of columns 16
_______________________
Column type frequency:
character 2
factor 6
numeric 8
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Student_ID 0 1 6 6 0 49998 0
Primary_Use_Case 0 1 8 25 0 5 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
Major_Category 0 1 FALSE 5 STE: 15059, Bus: 12537, Hum: 9994, Med: 6475
Year_of_Study 0 1 FALSE 6 Jun: 11043, Fre: 11030, Sen: 10634, Sop: 9860
Prompt_Engineering_Skill 0 1 FALSE 3 Beg: 18494, Int: 17696, Adv: 13808, emp: 0
Paid_Subscription 0 1 FALSE 2 Fal: 28845, Tru: 21153, emp: 0
Institutional_Policy 0 1 FALSE 3 All: 25223, Act: 14987, Str: 9788, emp: 0
Burnout_Risk_Level 0 1 TRUE 3 Med: 21143, Low: 16369, Hig: 12486

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
Pre_Semester_GPA 0 1 3.15 0.48 1.18 2.83 3.21 3.52 12.25 ▇▅▁▁▁
Weekly_GenAI_Hours 0 1 8.43 8.27 0.00 2.39 5.80 11.72 40.00 ▇▃▁▁▁
Tool_Diversity 0 1 2.80 1.19 1.00 2.00 3.00 4.00 18.00 ▇▁▁▁▁
Traditional_Study_Hours 0 1 11.21 5.16 1.00 7.56 11.18 14.71 35.86 ▅▇▃▁▁
Perceived_AI_Dependency 0 1 3.51 1.82 1.00 2.00 3.00 5.00 10.00 ▆▇▅▁▁
Anxiety_Level_During_Exams 0 1 4.27 2.14 1.00 3.00 4.00 6.00 10.00 ▆▇▇▃▁
Post_Semester_GPA 0 1 3.35 0.50 1.00 3.02 3.42 3.75 10.39 ▂▇▁▁▁
Skill_Retention_Score 0 1 75.80 13.28 10.78 66.82 76.00 85.19 100.00 ▁▁▃▇▆

berdasarkan hasil dari Skim, terlihat bahwan setelah dilakukan penghapusan Nilai Hilang jumlah amatan semula 50.000 berkurang menjadi 49.998 dan dataset tidak lagi mengandung data hilang (n_missing=0 & complete_rate=1)

###identifikasi data tidak valid

# Identifikasi data tidak valid
data %>%
  filter(!(Year_of_Study %in%
             c("Freshman",
               "Sophomore",
               "Junior",
               "Senior",
               "Graduate")))
# Menghapus data tidak valid
data <- data %>%
  filter(Year_of_Study %in%
           c("Freshman",
             "Sophomore",
             "Junior",
             "Senior",
             "Graduate"))
n_sebelum <- nrow(data)

data <- data %>%
  filter(Post_Semester_GPA <= 4)

n_sesudah <- nrow(data)

cat("Jumlah data sebelum filter:", n_sebelum, "\n")
## Jumlah data sebelum filter: 49997
cat("Jumlah data sesudah filter:", n_sesudah, "\n")
## Jumlah data sesudah filter: 49996
cat("Jumlah data yang dihapus:", n_sebelum - n_sesudah)
## Jumlah data yang dihapus: 1
data %>%
  filter(Tool_Diversity > 5)
data %>%
  filter(Tool_Diversity <= 5)
data %>%
  filter(
    Pre_Semester_GPA < 0 |
    Pre_Semester_GPA > 4
  )
data %>%
  filter(
    Post_Semester_GPA < 0 |
    Post_Semester_GPA > 4
  )
data <-data %>%
  filter(
    between(Pre_Semester_GPA, 0, 4),
    between(Post_Semester_GPA, 0, 4)
  )
data$Student_ID <- as.character(data$Student_ID)
data$Paid_Subscription <- as.factor(
  data$Paid_Subscription
)
dim(data)
## [1] 49995    16
write.csv(
  data,
  "AI_Student_Impact_Clean.csv",
  row.names = FALSE
)
str(data, ncol=2)
## 'data.frame':    49995 obs. of  16 variables:
##  $ Student_ID                : chr  "100001" "100002" "100003" "100004" ...
##  $ Major_Category            : Factor w/ 6 levels "","Arts","Business",..: 4 5 3 3 6 6 6 2 3 3 ...
##  $ Year_of_Study             : Factor w/ 7 levels "","123","Freshman",..: 6 5 3 6 7 5 3 5 7 7 ...
##  $ Pre_Semester_GPA          : num  2.42 3.82 3.4 3.79 3.63 ...
##  $ Weekly_GenAI_Hours        : num  23.31 1.12 21.26 1.82 9.29 ...
##  $ Primary_Use_Case          : chr  "Copywriting/Drafting" "Ideation" "Summarizing_Reading" "Copywriting/Drafting" ...
##  $ Prompt_Engineering_Skill  : Factor w/ 4 levels "","Advanced",..: 3 2 3 4 2 3 2 4 3 4 ...
##  $ Tool_Diversity            : int  1 5 2 4 4 1 5 3 2 2 ...
##  $ Paid_Subscription         : Factor w/ 3 levels "","False","True": 3 2 2 2 2 2 3 2 3 3 ...
##  $ Traditional_Study_Hours   : num  8.13 16.65 10.35 15.23 12.55 ...
##  $ Perceived_AI_Dependency   : int  5 3 5 2 4 4 8 2 1 3 ...
##  $ Institutional_Policy      : Factor w/ 4 levels "","Actively_Encouraged",..: 3 3 4 3 3 3 3 2 4 4 ...
##  $ Anxiety_Level_During_Exams: int  6 9 9 2 4 5 7 1 5 8 ...
##  $ Post_Semester_GPA         : num  2.39 3.7 3.5 4 3.8 ...
##  $ Skill_Retention_Score     : num  86.4 69.4 73.9 63.6 100 ...
##  $ Burnout_Risk_Level        : Ord.factor w/ 3 levels "Low"<"Medium"<..: 3 1 2 2 2 3 2 2 2 3 ...

Statistics Analysis

model_gpa <- lm(
  Post_Semester_GPA ~
    Pre_Semester_GPA +
    Weekly_GenAI_Hours +
    Traditional_Study_Hours +
    Perceived_AI_Dependency +
    Anxiety_Level_During_Exams +
    Tool_Diversity,
  data = data
)

summary(model_gpa)
## 
## Call:
## lm(formula = Post_Semester_GPA ~ Pre_Semester_GPA + Weekly_GenAI_Hours + 
##     Traditional_Study_Hours + Perceived_AI_Dependency + Anxiety_Level_During_Exams + 
##     Tool_Diversity, data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.07992 -0.10663  0.00165  0.11146  0.75263 
## 
## Coefficients:
##                              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 0.1492288  0.0060232  24.776  < 2e-16 ***
## Pre_Semester_GPA            0.9601959  0.0016031 598.968  < 2e-16 ***
## Weekly_GenAI_Hours          0.0005988  0.0001258   4.760 1.94e-06 ***
## Traditional_Study_Hours     0.0137049  0.0001508  90.911  < 2e-16 ***
## Perceived_AI_Dependency    -0.0009816  0.0005741  -1.710   0.0873 .  
## Anxiety_Level_During_Exams -0.0025748  0.0003778  -6.815 9.56e-12 ***
## Tool_Diversity              0.0124875  0.0006451  19.356  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1716 on 49988 degrees of freedom
## Multiple R-squared:  0.8801, Adjusted R-squared:  0.8801 
## F-statistic: 6.116e+04 on 6 and 49988 DF,  p-value: < 2.2e-16

Berdasarkan hasil regresi linear berganda, model yang dibangun signifikan secara statistik dengan nilai F = 61160 dan p-value < 0,001, sehingga dapat disimpulkan bahwa variabel Pre_Semester_GPA, Weekly_GenAI_Hours, Traditional_Study_Hours, Perceived_AI_Dependency, Anxiety_Level_During_Exams, dan Tool_Diversity secara simultan berpengaruh terhadap Post_Semester_GPA. Nilai Adjusted R-squared sebesar 0,8801 menunjukkan bahwa sekitar 88,01% variasi IPK setelah semester (Post_Semester_GPA) dapat dijelaskan oleh variabel-variabel dalam model,sedangkan sisanya sebesar 11,99% dijelaskan oleh faktor lain di luar model. Secara parsial, Pre_Semester_GPA memiliki pengaruh positif dan signifikan (β = 0,9602; p < 0,001), yang menunjukkan bahwa mahasiswa dengan IPK awal yang lebih tinggi cenderung memiliki IPK akhir yang lebih tinggi. Traditional_Study_Hours (β = 0,0137; p < 0,001) dan Tool_Diversity (β = 0,0125; p< 0,001) juga berpengaruh positif signifikan terhadap IPK, yang mengindikasikan bahwa semakin banyak waktu belajar mandiri dan semakin beragam alat AI yang digunakan, maka prestasi akademik cenderung meningkat.

Weekly_GenAI_Hours memiliki pengaruh positif yang signifikan (β = 0,0006; p < 0,001), meskipun besarnya pengaruh relatif kecil. Sebaliknya, Anxiety_Level_During_Exams berpengaruh negatif signifikan (β = -0,0026; p < 0,001), yang menunjukkan bahwa peningkatan tingkat kecemasan saat ujian cenderung menurunkan IPK mahasiswa. Sementara itu, Perceived_AI_Dependency memiliki koefisien negatif (β = -0,0010), namun tidak signifikan pada taraf nyata 5% (p = 0,087), sehingga belum terdapat bukti yang cukup untuk menyatakan bahwa persepsi ketergantungan terhadap AI berpengaruh terhadap IPK setelah semester.