Data mahasiswa merupakan salah satu sumber informasi yang sangat berguna bagi institusi pendidikan. Melalui data tersebut, berbagai karakteristik mahasiswa dapat digambarkan, mulai dari identitas dasar seperti jenis kelamin, umur, dan asal kota, hingga kebiasaan sehari-hari seperti lama belajar, lama penggunaan internet, dan lama tidur, serta capaian akademik seperti kehadiran, nilai tugas, nilai ujian, dan nilai akhir. Informasi-informasi ini dapat dimanfaatkan untuk memahami pola perilaku mahasiswa dan mendukung pengambilan keputusan yang lebih tepat.
Meskipun demikian, data yang dikumpulkan dalam kehidupan nyata hampir tidak pernah dalam kondisi yang sempurna. Data sering kali dicatat oleh banyak pihak dengan cara yang berbeda-beda, dimasukkan secara manual, digabungkan dari beberapa sumber, atau mengalami kesalahan saat proses pencatatan. Akibatnya, muncul berbagai masalah seperti data yang kosong (missing value), penulisan yang tidak seragam (inkonsistensi), baris yang tercatat lebih dari sekali (duplikat), dan nilai yang tidak masuk akal (noisy data). Apabila masalah tersebut dibiarkan, hasil analisis yang diperoleh dapat menyesatkan, karena analisis yang baik hanya dapat dihasilkan dari data yang berkualitas.
Oleh karena itu, sebelum data digunakan untuk analisis lebih lanjut, perlu dilakukan eksplorasi dan pemeriksaan kualitas data. Pada laporan ini, eksplorasi dilakukan terhadap dataset mahasiswa untuk mengidentifikasi berbagai permasalahan yang terdapat di dalam data, kemudian permasalahan tersebut ditangani melalui proses pembersihan (data cleaning) atau yang juga disebut data wrangling. Setelah data bersih, dilakukan analisis regresi untuk melihat hubungan antara jam belajar, jam penggunaan internet, dan jam tidur mahasiswa, serta proses integrasi dan encoding data.
Berdasarkan latar belakang tersebut, rumusan masalah dalam laporan ini adalah sebagai berikut.
Proses pembersihan data dilakukan dengan tujuan-tujuan berikut.
Jumlah data : 1.215 baris
Jumlah variabel : 15 kolom
Objek data : Mahasiswa
Setiap baris mewakili satu catatan mahasiswa, sedangkan setiap kolom mewakili satu variabel atau karakteristik yang dicatat. Pada kondisi awal, jumlah baris (1.215) masih lebih banyak daripada jumlah mahasiswa yang sebenarnya karena adanya baris duplikat. Jumlah baris yang tersisa setelah pembersihan akan ditampilkan pada bagian hasil akhir.
Dataset terdiri dari 15 Variabel sebagai berikut
| No | Variabel |
|---|---|
| 1 | ID_Mahasiswa |
| 2 | Nama |
| 3 | Gender |
| 4 | Umur |
| 5 | Semester |
| 6 | Program_Studi |
| 7 | Kota_Asal |
| 8 | Jam_Belajar_Per_Minggu |
| 9 | Kehadiran_Persen |
| 10 | Nilai_Tugas |
| 11 | Nilai_Ujian |
| 12 | Nilai_Akhir |
| 13 | Jam_Internet_Per_Hari |
| 14 | Jam_Tidur_Per_Hari |
| 15 | Kepuasan_Kuliah |
Dataset ini termasuk data eksternal, artinya data berasal dari pihak lain di luar kelompok kami. Dataset ini berasal dari salah satu dosen di Jurusan S-1 Statistika Universitas Riau. Dataset ini memang ditujukan untuk latihan pembersihan dan pengolahan data (dirty data).
Selain itu, data ini termasuk data sekunder, karena tidak diambil langsung dari subjek aslinya (mahasiswa) oleh peneliti sendiri, melainkan diperoleh dari pihak lain yang telah mengumpulkannya lebih dahulu. Konsekuensinya, peneliti tidak dapat memastikan bagaimana data dikumpulkan, sehingga pemeriksaan kualitas data menjadi langkah yang wajib dilakukan.
Dataset ini merupakan data terstruktur. Data tersusun dalam bentuk baris dan kolom (1.215 × 15) sehingga terbaca jelas di dalam Excel. Data juga memiliki skema yang jelas, terlihat dari nama-nama variabel yang tegas, dan karena itu mudah untuk diolah serta dipresentasikan. Bentuk data seperti ini berbeda dengan data tidak terstruktur (misalnya teks bebas, gambar, atau rekaman suara) yang memerlukan pengolahan tambahan sebelum dianalisis.
df <- read_excel("D:/TUGAS SAYA/shared Dataset_Simulasi_Data_Cleaning_1200x15 - Copy.xlsx")
# Cek struktur awal data
summary(df)
## ID_Mahasiswa Nama Gender Umur
## Min. :100001 Length:1215 Length:1215 Min. : -3.00
## 1st Qu.:100302 Class :character Class :character 1st Qu.: 20.00
## Median :100601 Mode :character Mode :character Median : 21.00
## Mean :100601 Mean : 20.69
## 3rd Qu.:100901 3rd Qu.: 22.00
## Max. :101200 Max. :150.00
##
## Semester Program_Studi Kota_Asal Jam_Belajar_per_Minggu
## Min. :3.000 Length:1215 Length:1215 Min. : 2.00
## 1st Qu.:3.000 Class :character Class :character 1st Qu.:10.50
## Median :3.000 Mode :character Mode :character Median :13.90
## Mean :3.375 Mean :13.85
## 3rd Qu.:4.000 3rd Qu.:17.20
## Max. :5.000 Max. :29.60
## NA's :12
## Kehadiran_Persen Nilai_Tugas Nilai_Ujian Nilai_Akhir
## Min. :-10.00 Length:1215 Length:1215 Min. : -8.00
## 1st Qu.: 82.90 Class :character Class :character 1st Qu.: 81.80
## Median : 87.70 Mode :character Mode :character Median : 86.10
## Mean : 87.69 Mean : 85.48
## 3rd Qu.: 93.00 3rd Qu.: 89.80
## Max. :125.00 Max. :120.00
## NA's :10
## Jam_Internet_per_Hari Jam_Tidur_per_Hari Kepuasan_Kuliah
## Min. :-1.000 Min. : 1.000 Min. :0.00
## 1st Qu.: 3.400 1st Qu.: 6.000 1st Qu.:3.00
## Median : 4.500 Median : 6.700 Median :4.00
## Mean : 4.552 Mean : 6.724 Mean :3.62
## 3rd Qu.: 5.700 3rd Qu.: 7.400 3rd Qu.:4.00
## Max. :30.000 Max. :20.000 Max. :8.00
## NA's :8
Variabel yang seharusnya berupa angka terkadang terbaca sebagai teks
(character) karena adanya karakter yang tidak diharapkan,
misalnya tanda persen (“100%”), spasi tambahan, atau tulisan lain. Jika
dibiarkan, variabel tersebut tidak dapat dihitung rata-rata, median,
ataupun dimasukkan ke dalam model regresi. Untuk itu, sepuluh kolom yang
seharusnya numerik dikonversi menggunakan as.numeric().
Bentuk as.numeric(as.character(.x)) digunakan agar konversi
berjalan aman meskipun kolom awalnya bertipe faktor atau teks.
kolom_harus_numerik <- c("Umur", "Semester", "Jam_Belajar_per_Minggu",
"Kehadiran_Persen", "Nilai_Tugas", "Nilai_Ujian",
"Nilai_Akhir", "Jam_Internet_per_Hari",
"Jam_Tidur_per_Hari", "Kepuasan_Kuliah")
df <- df %>%
mutate(across(all_of(kolom_harus_numerik), ~ as.numeric(as.character(.x))))
# Jumlah NA setelah konversi (jika bertambah banyak, berarti ada teks/format aneh)
colSums(is.na(df[kolom_harus_numerik]))
## Umur Semester Jam_Belajar_per_Minggu
## 0 0 12
## Kehadiran_Persen Nilai_Tugas Nilai_Ujian
## 10 8 8
## Nilai_Akhir Jam_Internet_per_Hari Jam_Tidur_per_Hari
## 0 0 0
## Kepuasan_Kuliah
## 8
Hasil eksplorasi menunjukkan empat permasalahan utama pada dataset, yaitu missing value, inkonsistensi data, duplikasi data, dan data noisy.
Missing value adalah sel data yang tidak berisi nilai
(kosong, atau NA di R). Data kosong dapat muncul karena
responden tidak mengisi, terjadi kesalahan input, atau data hilang saat
proses penggabungan. Keberadaan missing value berbahaya karena
banyak fungsi statistik menghasilkan NA atau menghapus
baris secara diam-diam bila menemukan sel kosong, sehingga jumlah data
yang benar-benar dianalisis menjadi berkurang dan hasil bisa menjadi
bias.
colSums(is.na(df[kolom_harus_numerik]))
## Umur Semester Jam_Belajar_per_Minggu
## 0 0 12
## Kehadiran_Persen Nilai_Tugas Nilai_Ujian
## 10 8 8
## Nilai_Akhir Jam_Internet_per_Hari Jam_Tidur_per_Hari
## 0 0 0
## Kepuasan_Kuliah
## 8
Hasil eksplorasi menunjukkan terdapat beberapa data yang kosong (missing value) pada beberapa variabel, yaitu jam_Belajar_per_Minggu (12 data), Kehadiran_Persen (10 data), Nilai_Tugas (8 data), Nilai_Ujian (8 data), dan Kepuasan_Kuliah (8 data). Sehingga total missing value adalah 46 data.
Inkonsistensi data terjadi ketika satu makna yang sama dituliskan dalam bentuk yang berbeda-beda. Bagi manusia, “Male” dan “Laki-laki” jelas bermakna sama, tetapi bagi komputer keduanya adalah dua teks yang berbeda. Akibatnya, saat data dikelompokkan atau dihitung frekuensinya, satu kategori yang sama akan terpecah menjadi beberapa kategori sehingga hasil analisis menjadi keliru.
3.2.1 Inkonsistensi Gender Pada variabel Gender ditemukan penulisan yang beragam meskipun memiliki arti yang sama
table(df$Gender, useNA = "ifany")
##
## Female L Laki-laki Male P Perempuan Pria Wanita
## 6 2 539 4 8 646 3 7
3.2.2 Inkonsistensi Kota_Asal Pada variabel Kota_Asal ditemukan penulisan besar kecil huruf yang berbeda
table(df$Kota_Asal, useNA = "ifany")
##
## Dumai DUMAI jambi Jambi JAMBI Medan MEDAN padang
## 133 3 4 121 4 179 1 6
## Padang PADANG pekanbaru Pekanbaru PEKANBARU
## 206 2 7 546 3
Duplikasi data berarti ada baris yang muncul lebih dari sekali. Duplikasi dapat disebabkan oleh input ganda, kesalahan saat menggabungkan beberapa file, atau proses penyalinan data. Ditemukan adanya duplikasi data pada dataset mahasiswa, dengan rincian:
# Jumlah baris yang identik
sum(duplicated(df))
## [1] 14
# ID_Mahasiswa yang muncul lebih dari satu kali
df %>% count(ID_Mahasiswa) %>% filter(n > 1)
## # A tibble: 15 × 2
## ID_Mahasiswa n
## <dbl> <int>
## 1 100032 2
## 2 100096 2
## 3 100213 2
## 4 100425 2
## 5 100435 2
## 6 100443 2
## 7 100557 2
## 8 100761 2
## 9 100769 2
## 10 100844 2
## 11 100866 2
## 12 100947 2
## 13 100994 2
## 14 101011 2
## 15 101086 2
Selisih antara 15 ID berulang dan 14 baris identik menunjukkan bahwa ada kasus di mana ID yang sama muncul dengan isi kolom yang sedikit berbeda, sehingga tidak terdeteksi sebagai duplikat identik. Hal ini perlu ditangani dengan aturan berdasarkan ID. Duplikat berbahaya karena dapat menyebabkan mahasiswa terhitung lebih dari satu kali dan berpotensi memengaruhi hasil analisis, misalnya rata-rata menjadi condong ke arah mahasiswa yang tercatat ganda.
Data Noisy adalah data yang berisi nilai tidak wajar, tidak logis, atau berada di luar batas yang seharusnya. Nilai seperti ini biasanya muncul akibat salah ketik (misalnya 150 seharusnya 15) atau kesalahan alat ukur. Berbeda dengan missing value yang terlihat kosong, noisy data tampak seperti data normal sehingga lebih sulit disadari bila tidak dicek dengan aturan batas nilai. Berikut temuan pada setiap variabel.
summary(df[, c("Umur", "Kehadiran_Persen", "Nilai_Tugas", "Nilai_Ujian",
"Nilai_Akhir", "Jam_Internet_per_Hari", "Kepuasan_Kuliah")])
## Umur Kehadiran_Persen Nilai_Tugas Nilai_Ujian
## Min. : -3.00 Min. :-10.00 Min. : -5.00 Min. : -2.00
## 1st Qu.: 20.00 1st Qu.: 82.90 1st Qu.: 62.60 1st Qu.: 92.00
## Median : 21.00 Median : 87.70 Median : 69.70 Median : 98.00
## Mean : 20.69 Mean : 87.69 Mean : 69.62 Mean : 95.43
## 3rd Qu.: 22.00 3rd Qu.: 93.00 3rd Qu.: 76.60 3rd Qu.:100.00
## Max. :150.00 Max. :125.00 Max. :105.00 Max. :150.00
## NA's :10 NA's :8 NA's :8
## Nilai_Akhir Jam_Internet_per_Hari Kepuasan_Kuliah
## Min. : -8.00 Min. :-1.000 Min. :0.00
## 1st Qu.: 81.80 1st Qu.: 3.400 1st Qu.:3.00
## Median : 86.10 Median : 4.500 Median :4.00
## Mean : 85.48 Mean : 4.552 Mean :3.62
## 3rd Qu.: 89.80 3rd Qu.: 5.700 3rd Qu.:4.00
## Max. :120.00 Max. :30.000 Max. :8.00
## NA's :8
1. Umur. Ditemukan nilai umur yang tidak wajar, yaitu -3 hingga 150 tahun. Umur -3 tahun tidak mungkin secara logis, sedangkan umur 150 tahun tidak wajar untuk karakteristik data mahasiswa.
2. Kehadiran_Persen. Ditemukan nilai kehadiran yang berada di luar rentang yang seharusnya, yaitu -10% hingga 125%. Persentase kehadiran seharusnya berada pada rentang 0% - 100%. Nilai negatif maupun nilai di atas 100% menunjukkan adanya data tidak valid.
3. Nilai (Nilai_Tugas, Nilai_Ujian, Nilai_Akhir). Ditemukan beberapa nilai akademik yang berada di luar rentang, yaitu -2, -5, -8, 105, 120, dan 150. Karena skala nilai yang digunakan adalah 0–100, nilai-nilai tersebut termasuk data tidak valid.
4. Kepuasan_Kuliah. Variabel ini menggunakan skala 1 sampai 5. Namun, ditemukan nilai 0 dan 8 yang berada di luar rentang skala kepuasan yang telah ditentukan. Hal ini menunjukkan adanya data tidak valid pada variabel tersebut.
5. Jam_Internet_per_Hari. Ditemukan nilai yang tidak logis, yaitu -1 jam dan 30 jam. Dalam satu hari terdapat maksimal 24 jam, sehingga nilai -1 jam tidak mungkin terjadi, dan nilai 30 jam melebihi waktu yang tersedia dalam satu hari.
Data wrangling adalah rangkaian proses mengubah data mentah menjadi data yang rapi, bersih, dan siap dianalisis. Secara umum prosesnya meliputi discovering (mengenali data), structuring (menyusun struktur), cleaning (membersihkan), enriching (memperkaya), validating (memvalidasi), dan publishing (menyajikan hasil). Pada laporan ini, urutan pembersihan yang dijalankan adalah sebagai berikut
NA.Duplikat dihapus lebih dulu agar perhitungan median tidak terpengaruh
baris ganda. Penulisan kategori diseragamkan sebelum dihitung. Nilai
tidak wajar diubah menjadi NA sebelum pengisian, sehingga
nilai kosong asli dan nilai tidak wajar dapat diisi bersama-sama dalam
satu langkah, dan median dihitung hanya dari nilai-nilai yang valid.
Langkah di Excel: Berikut adalah cara menghapus data yang duplikat di dalam Excel
Langkah di R:
Dilakukan dua tahap. Tahap pertama menghapus baris yang identik
seluruhnya menggunakan distinct(). Tahap kedua menghapus
baris yang memiliki ID_Mahasiswa sama dengan mempertahankan kemunculan
pertama saja (.keep_all = TRUE berarti seluruh kolom lain
tetap dibawa).
# Hapus baris yang duplikat sepenuhnya
df <- df %>% distinct()
# Hapus duplikat berdasarkan ID_Mahasiswa
df <- df %>% distinct(ID_Mahasiswa, .keep_all = TRUE)
Langkah di Excel: Berikut adalah cara menseragamkan tulisan dan menyamakan kapitalisasi huruf di Excel
Kapital huruf: buat kolom baru di samping kolom yang ingin
diperbaiki, lalu tuliskan rumus =PROPER(sel) dan tekan
Enter. Fungsi PROPER mengubah huruf pertama tiap
kata menjadi huruf kapital dan sisanya kecil. Tarik tombol di kanan
bawah sel agar rumus berlaku ke seluruh kolom.
Gender: blok kolom Gender, tekan CTRL + H. Pada Find what ketik Male/Pria/L dan pada Replace with ketik Laki-laki, lalu Replace All. Ulangi untuk Female/Wanita/P menjadi Perempuan. Khusus “L” dan “P”, klik Options dan centang “Match Entire Cell Contents” agar huruf L atau P di dalam kata lain (misalnya “Perempuan”) tidak ikut terganti.
Langkah di R:
Gender diseragamkan dengan case_when(), yang bekerja
seperti rangkaian aturan “jika-maka”. Spasi berlebih dibersihkan dengan
str_trim(). Nilai yang tidak dikenali akan menjadi
NA (TRUE ~ NA_character_), sehingga tidak ada
kategori asing yang lolos. Untuk Kota_Asal dan Program_Studi,
str_to_title() mengubah setiap kata menjadi berawalan huruf
kapital, sehingga “PEKANBARU”, “pekanbaru”, dan “Pekanbaru” sama-sama
menjadi “Pekanbaru”.
#Standarisasi Gender
df <- df %>%
mutate(Gender = str_trim(Gender),
Gender = case_when(
Gender %in% c("L", "Laki-laki", "Male", "Pria") ~ "Laki-laki",
Gender %in% c("P", "Perempuan", "Female", "Wanita") ~ "Perempuan",
TRUE ~ NA_character_))
# Standarisasi Kota_Asal (samakan kapitalisasi & hapus spasi berlebih)
df <- df %>%
mutate(Kota_Asal = str_trim(Kota_Asal),
Kota_Asal = str_to_title(Kota_Asal))
# Standarisasi Program_Studi
df <- df %>%
mutate(Program_Studi = str_trim(Program_Studi),
Program_Studi = str_to_title(Program_Studi))
Nilai yang berada di luar batas wajar tidak dihapus barisnya,
melainkan hanya nilainya yang diubah menjadi NA. Cara ini
dipilih agar informasi lain pada baris yang sama (misalnya jam tidur
atau jam belajar mahasiswa tersebut) tidak ikut hilang. Setelah itu,
NA yang terbentuk diisi dengan median pada langkah
berikutnya.
Langkah di Excel: Berikut adalah langkah menghilangkan data yang nilainya tidak masuk akal di Excel
Langkah di R:
Fungsi ifelse(kondisi, NA, nilai_asli) memeriksa setiap
nilai; jika berada di luar batas, hasilnya NA, jika tidak,
nilai asli dipertahankan.
# Ubah nilai yang di luar batas wajar menjadi NA terlebih dahulu,
# setelah itu diisi dengan median bersama missing value lainnya.
df <- df %>%
mutate(
Umur = ifelse(Umur < 15 | Umur > 60, NA, Umur),
Kehadiran_Persen = ifelse(Kehadiran_Persen < 0 | Kehadiran_Persen > 100, NA, Kehadiran_Persen),
Nilai_Tugas = ifelse(Nilai_Tugas < 0 | Nilai_Tugas > 100, NA, Nilai_Tugas),
Nilai_Ujian = ifelse(Nilai_Ujian < 0 | Nilai_Ujian > 100, NA, Nilai_Ujian),
Nilai_Akhir = ifelse(Nilai_Akhir < 0 | Nilai_Akhir > 100, NA, Nilai_Akhir),
Jam_Internet_per_Hari = ifelse(Jam_Internet_per_Hari < 0 | Jam_Internet_per_Hari > 24, NA, Jam_Internet_per_Hari),
Kepuasan_Kuliah = ifelse(Kepuasan_Kuliah < 1 | Kepuasan_Kuliah > 5, NA, Kepuasan_Kuliah)
)
Setelah tahap sebelumnya, sel kosong terdiri dari dua jenis:
missing value asli dan nilai tidak wajar yang telah diubah
menjadi NA. Keduanya diisi dengan median masing-masing
kolom. Median dipilih dibandingkan rata-rata karena median adalah nilai
tengah yang tidak terpengaruh oleh nilai ekstrem. Rata-rata dapat
tergeser jauh oleh satu nilai yang sangat besar atau sangat kecil,
sedangkan median tetap stabil, sehingga lebih aman untuk data yang masih
mungkin mengandung pencilan.
Langkah di Excel: Langkah-langkah mengisi nilai yang kosong di dalam Excel adalah sebagai berikut
=MEDIAN((Huruf sel)2:(Huruf sel)1201), lalu tekan
Enter.Langkah di R: seluruh kolom numerik dipilih otomatis
dengan where(is.numeric), kemudian dilakukan perulangan
(loop). Untuk setiap kolom, median dihitung dengan
na.rm = TRUE (mengabaikan NA), lalu semua
NA pada kolom tersebut diganti dengan median itu.
# Ambil semua kolom numerik lalu isi NA dengan median masing-masing kolom
kolom_numerik <- df %>%
select(where(is.numeric)) %>%
names()
for (kolom in kolom_numerik) {
median_val <- median(df[[kolom]], na.rm = TRUE)
df[[kolom]][is.na(df[[kolom]])] <- median_val
}
Pemeriksaan akhir dilakukan untuk memastikan seluruh masalah telah tertangani: tidak ada lagi sel kosong, tidak ada baris duplikat, dan jumlah baris sesuai harapan.
cat("Jumlah missing value per kolom setelah cleaning:\n")
## Jumlah missing value per kolom setelah cleaning:
print(colSums(is.na(df)))
## ID_Mahasiswa Nama Gender
## 0 0 0
## Umur Semester Program_Studi
## 0 0 0
## Kota_Asal Jam_Belajar_per_Minggu Kehadiran_Persen
## 0 0 0
## Nilai_Tugas Nilai_Ujian Nilai_Akhir
## 0 0 0
## Jam_Internet_per_Hari Jam_Tidur_per_Hari Kepuasan_Kuliah
## 0 0 0
cat("\nJumlah baris duplikat setelah cleaning:", sum(duplicated(df)), "\n")
##
## Jumlah baris duplikat setelah cleaning: 0
Setelah data bersih, analisis bertujuan mengidentifikasi pengaruh jam belajar per minggu dan jam internet per hari terhadap jam tidur mahasiswa. Dengan melihat hubungan antarvariabel tersebut, dapat diketahui apakah durasi penggunaan internet per hari dan waktu belajar per minggu berkaitan dengan pola jam tidur mahasiswa per hari.
Pertanyaan ini relevan karena tidur yang cukup merupakan faktor penting bagi kesehatan dan konsentrasi belajar. Secara teori, penggunaan internet yang panjang (terutama malam hari) dan beban belajar yang tinggi dapat mengurangi waktu tidur, tetapi apakah hal itu benar terjadi pada data ini perlu dibuktikan secara statistik. Dalam model yang dibangun:
Sebelum membentuk model, data perlu divalidasi untuk memastikan bahwa data benar-benar layak dipakai. Validasi data dilakukan melalui langkah-langkah berikut.
model <- lm(Jam_Tidur_per_Hari ~ Jam_Internet_per_Hari +
Jam_Belajar_per_Minggu, data = df)
summary(model)
##
## Call:
## lm(formula = Jam_Tidur_per_Hari ~ Jam_Internet_per_Hari + Jam_Belajar_per_Minggu,
## data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.7468 -0.6773 -0.0123 0.6585 13.2195
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.477673 0.122042 53.078 <2e-16 ***
## Jam_Internet_per_Hari 0.011610 0.017832 0.651 0.5151
## Jam_Belajar_per_Minggu 0.013990 0.006252 2.238 0.0254 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.078 on 1197 degrees of freedom
## Multiple R-squared: 0.004534, Adjusted R-squared: 0.002871
## F-statistic: 2.726 on 2 and 1197 DF, p-value: 0.06588
residu <- residuals(model)
Tujuan: Menguji apakah residual model regresi berdistribusi normal. Asumsi ini penting terutama agar uji t dan uji F pada regresi dapat diandalkan.
Hipotesis.
Pengujian menggunakan uji Kolmogorov-Smirnov yang membandingkan sebaran residual dengan sebaran normal teoretis (dengan rata-rata dan simpangan baku yang sama dengan residual). Semakin kecil selisih keduanya, semakin besar p-value.
# Uji Kolmogorov-Smirnov
ks.test(residu, "pnorm",
mean = mean(residu),
sd = sd(residu))
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: residu
## D = 0.032359, p-value = 0.162
## alternative hypothesis: two-sided
Hasil uji Hasil uji Kolmogorov-Smirnov menunjukkan p-value = 0,1845. Karena 0,1845 > 0,05, maka H0 tidak ditolak.
Kesimpulan Berdasarkan uji Kolmogorov-Smirnov diperoleh p-value sebesar 0,1845. Karena p-value > 0,05, maka H0 tidak ditolak. Dengan demikian, residual pada model regresi berdistribusi normal, sehingga asumsi normalitas terpenuhi.
Tujuan: Menguji apakah ragam residual bersifat sama (homogen) untuk semua nilai prediksi. Kondisi ini disebut homoskedastisitas. Jika ragam residual berubah-ubah (heteroskedastisitas), kesalahan baku koefisien menjadi tidak akurat sehingga uji signifikansi bisa menyesatkan.
Hipotesis
library(lmtest)
# Uji Breusch-Pagan
bptest(model)
##
## studentized Breusch-Pagan test
##
## data: model
## BP = 0.6724, df = 2, p-value = 0.7145
Hasil uji Hasil uji Breusch-Pagan menunjukkan BP = 0,66852, df = 2, dan p-value = 0,7159. Karena 0,7159 > 0,05, maka H0 tidak ditolak.
Kesimpulan Berdasarkan uji Breusch-Pagan diperoleh p-value sebesar 0,7159 > 0,05, sehingga H0 tidak ditolak. Artinya, tidak terdapat gejala heteroskedastisitas pada model, sehingga varians residual bersifat homogen.
Koefisien determinasi R² mengukur proporsi variasi total variabel terikat (Y) yang dapat dijelaskan oleh model regresi. Semakin mendekati 1, semakin besar proporsi variasi Y yang mampu dijelaskan oleh model. Karena penambahan prediktor apapun cenderung menaikkan R² meskipun prediktor tersebut tidak relevan
korelasi<- lm(df$Jam_Tidur_per_Hari ~ df$Jam_Belajar_per_Minggu + df$Jam_Internet_per_Hari, data = df)
korelasi
##
## Call:
## lm(formula = df$Jam_Tidur_per_Hari ~ df$Jam_Belajar_per_Minggu +
## df$Jam_Internet_per_Hari, data = df)
##
## Coefficients:
## (Intercept) df$Jam_Belajar_per_Minggu
## 6.47767 0.01399
## df$Jam_Internet_per_Hari
## 0.01161
summary(korelasi)
##
## Call:
## lm(formula = df$Jam_Tidur_per_Hari ~ df$Jam_Belajar_per_Minggu +
## df$Jam_Internet_per_Hari, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -5.7468 -0.6773 -0.0123 0.6585 13.2195
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.477673 0.122042 53.078 <2e-16 ***
## df$Jam_Belajar_per_Minggu 0.013990 0.006252 2.238 0.0254 *
## df$Jam_Internet_per_Hari 0.011610 0.017832 0.651 0.5151
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.078 on 1197 degrees of freedom
## Multiple R-squared: 0.004534, Adjusted R-squared: 0.002871
## F-statistic: 2.726 on 2 and 1197 DF, p-value: 0.06588
Nilai konstanta (intercept) sebesar 6,48 menunjukkan bahwa jika variabel jam belajar dan penggunaan internet bernilai nol, perkiraan rata-rata jam tidur per hari adalah sekitar 6,48 jam. Hasil uji keberartian koefisien (uji-t) menunjukkan bahwa variabel Jam Belajar per Minggu memiliki nilai koefisien positif sebesar 0,014 dengan nilai p-value = 0,0254 yang lebih kecil dari 0,05. Hal ini mengindikasikan bahwa jam belajar memiliki pengaruh yang signifikan secara statistik terhadap jam tidur per hari, di mana setiap kenaikan 1 jam belajar per minggu diasumsikan meningkatkan jam tidur sebesar 0,014 jam per hari.Sebaliknya, variabel Jam Internet per Hari memiliki koefisien sebesar 0,0116 dengan nilai p-value = 0,5151 yang mana lebih besar dari 0,05, yang berarti penggunaan internet tidak berpengaruh signifikan secara statistik terhadap jam tidur per hari.
Secara keseluruhan (uji F), model ini menghasilkan nilai F = 2,726 dengan p-value = 0,06588. Karena nilai p-value ini lebih besar dari tingkat signifikansi 0,05, dapat disimpulkan bahwa kombinasi variabel independen secara simultan tidak berpengaruh signifikan terhadap jam tidur per hari pada tingkat kepercayaan 95%.
Nilai Multiple R-squared sebesar 0,004534 dan Adjusted R-squared sebesar 0,002871 menunjukkan bahwa variabel jam belajar dan penggunaan internet secara bersama-sama hanya mampu menjelaskan sekitar 0,45% variasi dari jam tidur per hari, sementara sisanya sebesar 99,55% dijelaskan oleh faktor-faktor lain di luar model ini.
Integrasi data adalah proses menggabungkan dua atau lebih sumber data menjadi satu kesatuan yang utuh. Dalam praktik, informasi tentang objek yang sama sering tersimpan di beberapa tabel, sehingga harus digabung agar dapat dianalisis bersama. Penggabungan dilakukan menggunakan kunci utama (Primary Key), yaitu ID_Mahasiswa.
Pada integrasi pertama, dua dataset digabungkan yaitu data 1 berisi informasi Jam_Tidur_per_Hari, Jam_Internet_per_Hari, dan Jam_Belajar_per_Minggu, sedangkan data 2 menambahkan informasi Kategori_Belajar. Penggabungan dilakukan berdasarkan ID_Mahasiswa agar setiap Kategori_Belajar terhubung dengan mahasiswa yang tepat. Sebelum penggabungan, ID_Mahasiswa perlu diperiksa untuk memastikan tidak terdapat ID yang duplikat atau tidak sesuai. Jika ada ID yang berulang, penggabungan dapat menghasilkan baris berlipat ganda; jika ID tidak cocok, informasi dapat tersambung ke mahasiswa yang salah.
Integritas data memiliki tujuan sebagai berikut
# Encoding jam belajar
df$Kategori_Belajar <- cut(
df$Jam_Belajar_per_Minggu,
breaks = c(-Inf, 10, 20, Inf),
labels = c("rendah", "sedang", "tinggi"),
right = FALSE)
# Encoding numerik
df$Kode_Belajar <- as.numeric(df$Kategori_Belajar)
# Jumlah dan persentase setiap kode
table(df$Kode_Belajar)
##
## 1 2 3
## 260 810 130
prop.table(table(df$Kategori_Belajar)) * 100
##
## rendah sedang tinggi
## 21.66667 67.50000 10.83333
Fungsi as.numeric() pada faktor mengubah kategori
menjadi kode sesuai urutan levelnya, yaitu rendah = 1, sedang = 2, dan
tinggi = 3. Pengubahan ke angka dilakukan agar variabel kategori dapat
digunakan dalam analisis statistik atau perhitungan lanjutan. Tabel dan
persentase di atas memperlihatkan berapa banyak mahasiswa pada setiap
kategori. Berikut contoh 20 baris pertama hasil encoding.
hasil_encoding <- df[, c("ID_Mahasiswa", "Jam_Belajar_per_Minggu",
"Kategori_Belajar", "Kode_Belajar")]
head(hasil_encoding, 20)
## # A tibble: 20 × 4
## ID_Mahasiswa Jam_Belajar_per_Minggu Kategori_Belajar Kode_Belajar
## <dbl> <dbl> <fct> <dbl>
## 1 100740 3.6 rendah 1
## 2 100789 13 sedang 2
## 3 100044 13.3 sedang 2
## 4 100156 11.8 sedang 2
## 5 100495 13.8 sedang 2
## 6 100971 20.1 tinggi 3
## 7 100271 7 rendah 1
## 8 100591 14.4 sedang 2
## 9 100124 10.4 sedang 2
## 10 100114 21.4 tinggi 3
## 11 100931 6.1 rendah 1
## 12 100129 13.4 sedang 2
## 13 100733 13.5 sedang 2
## 14 100479 17.8 sedang 2
## 15 100148 7 rendah 1
## 16 101006 14 sedang 2
## 17 101101 9.8 rendah 1
## 18 100175 11.1 sedang 2
## 19 100359 15 sedang 2
## 20 100221 12.2 sedang 2
library(ggplot2)
ggplot(
df,
aes(x = Kategori_Belajar)
) +
geom_bar() +
labs(
title = "Distribusi Kategori Jam Belajar Mahasiswa",
x = "Kategori Jam Belajar",
y = "Jumlah Mahasiswa"
) +
theme_minimal()
Berdasarkan grafik Distribusi Kategori Jam Belajar Mahasiswa, mayoritas mahasiswa mengalokasikan waktu belajar pada tingkat sedang, yang mendominasi secara signifikan dengan jumlah mencapai lebih dari 800 mahasiswa. Sementara itu, kelompok dengan kategori jam belajar rendah menempati posisi kedua terbanyak dengan jumlah sekitar 250 hingga 260 mahasiswa. Sebaliknya, mahasiswa yang memiliki alokasi waktu belajar tinggi mencatatkan proporsi paling sedikit, yaitu hanya sekitar 130 hingga 140 mahasiswa. Secara keseluruhan, distribusi ini menunjukkan bahwa sebagian besar mahasiswa cenderung belajar dalam intensitas rata-rata, dengan jumlah mahasiswa yang belajar dalam durasi rendah masih lebih banyak dibandingkan mereka yang belajar dengan intensitas tinggi.
Data 1 dan Data 2 digabung menggunakan ID_Mahasiswa sebagai kunci utama, sehingga informasi Kategori_Belajar dapat ditambahkan ke Data 1 tanpa menghilangkan informasi yang sudah ada.
data_gabungan <- df %>%
select(
ID_Mahasiswa,
Jam_Tidur_per_Hari,
Jam_Belajar_per_Minggu,
Jam_Internet_per_Hari,
Kategori_Belajar,
Kode_Belajar)
print(data_gabungan,width=Inf)
## # A tibble: 1,200 × 6
## ID_Mahasiswa Jam_Tidur_per_Hari Jam_Belajar_per_Minggu Jam_Internet_per_Hari
## <dbl> <dbl> <dbl> <dbl>
## 1 100740 4.9 3.6 5.8
## 2 100789 7.7 13 3.4
## 3 100044 5.6 13.3 4.4
## 4 100156 7.5 11.8 4.6
## 5 100495 6.3 13.8 5.6
## 6 100971 6.3 20.1 5.9
## 7 100271 7 7 2.1
## 8 100591 7.1 14.4 5.3
## 9 100124 6.1 10.4 7.4
## 10 100114 5.5 21.4 7.3
## Kategori_Belajar Kode_Belajar
## <fct> <dbl>
## 1 rendah 1
## 2 sedang 2
## 3 sedang 2
## 4 sedang 2
## 5 sedang 2
## 6 tinggi 3
## 7 rendah 1
## 8 sedang 2
## 9 sedang 2
## 10 tinggi 3
## # ℹ 1,190 more rows
Integrasi kedua menggabungkan dua dataset lain yang juga berisi informasi terkait mahasiswa. Data 1 digunakan sebagai data utama, yaitu data sebelum encoding, sedangkan data 2 digunakan sebagai data tambahan yang berisi hasil encoding variabel Jam_Belajar_per_Minggu. Penggabungan kedua data dilakukan menggunakan ID_Mahasiswa sebagai kunci utama (key) agar informasi hasil encoding terhubung dengan mahasiswa yang sesuai.
Jam belajar dikelompokkan menjadi Rendah (< 10 jam), Sedang (10–20 jam), dan Tinggi (> 20 jam), kemudian setiap kategori diberi kode 1, 2, dan 3. Pada integrasi II ini dilakukan encoding menggunakan faktor.
df$Jam_Belajar_Factor <- factor(
ifelse(df$Jam_Belajar_per_Minggu < 10, "Rendah",
ifelse(df$Jam_Belajar_per_Minggu <= 20, "Sedang", "Tinggi")),
levels = c("Rendah", "Sedang", "Tinggi"),
ordered = TRUE)
df$Jam_Belajar_Code <- as.numeric(df$Jam_Belajar_Factor)
head(data.frame(df$ID_Mahasiswa,
Jam_Belajar = df$Jam_Belajar_Factor,
Jam_Belajar_Code = df$Jam_Belajar_Code),20)
## df.ID_Mahasiswa Jam_Belajar Jam_Belajar_Code
## 1 100740 Rendah 1
## 2 100789 Sedang 2
## 3 100044 Sedang 2
## 4 100156 Sedang 2
## 5 100495 Sedang 2
## 6 100971 Tinggi 3
## 7 100271 Rendah 1
## 8 100591 Sedang 2
## 9 100124 Sedang 2
## 10 100114 Tinggi 3
## 11 100931 Rendah 1
## 12 100129 Sedang 2
## 13 100733 Sedang 2
## 14 100479 Sedang 2
## 15 100148 Rendah 1
## 16 101006 Sedang 2
## 17 101101 Rendah 1
## 18 100175 Sedang 2
## 19 100359 Sedang 2
## 20 100221 Sedang 2
Fungsi ifelse() yang bersarang bekerja bertahap, jika
jam belajar kurang dari 10 maka “Rendah”. jika tidak, dicek lagi apakah
kurang dari atau sama dengan 20 maka “Sedang”. selain itu “Tinggi”.
Kemudian factor(..., ordered = TRUE) menetapkan urutan
tingkatan, dan as.numeric() menghasilkan kode 1, 2, 3.
Data 1 merupakan data awal yang berisi ID_Mahasiswa dan variabel Jam_Belajar_per_Minggu. ID_Mahasiswa digunakan sebagai identitas mahasiswa, sedangkan Jam_Belajar_per_Minggu menunjukkan jumlah waktu belajar mahasiswa dalam satu minggu.
Data 2 merupakan data hasil encoding variabel Jam_Belajar_per_Minggu. Data ini berisi ID_Mahasiswa, Jam_Belajar_Factor, dan Jam_Belajar_Code. Jam belajar dikategorikan menjadi Rendah, Sedang, dan Tinggi, kemudian masing-masing kategori diberi kode 1, 2, dan 3.
data1_b <- df %>% select(ID_Mahasiswa, Jam_Belajar_per_Minggu)
data2_b <- df %>% select(ID_Mahasiswa, Jam_Belajar_Factor, Jam_Belajar_Code)
head(data1_b)
## # A tibble: 6 × 2
## ID_Mahasiswa Jam_Belajar_per_Minggu
## <dbl> <dbl>
## 1 100740 3.6
## 2 100789 13
## 3 100044 13.3
## 4 100156 11.8
## 5 100495 13.8
## 6 100971 20.1
head(data2_b)
## # A tibble: 6 × 3
## ID_Mahasiswa Jam_Belajar_Factor Jam_Belajar_Code
## <dbl> <ord> <dbl>
## 1 100740 Rendah 1
## 2 100789 Sedang 2
## 3 100044 Sedang 2
## 4 100156 Sedang 2
## 5 100495 Sedang 2
## 6 100971 Tinggi 3
Data gabungan merupakan hasil penggabungan Data 1 dan Data 2 berdasarkan ID_Mahasiswa sebagai kunci pencocokan. Data ini menggabungkan informasi Jam_Internet_per_Hari dari Data 1 dengan hasil encoding Jam_Belajar_per_Minggu dari Data 2.
data_gabungan_2 <- data1_b %>%
left_join(data2_b, by = "ID_Mahasiswa")
head(data_gabungan_2, 20)
## # A tibble: 20 × 4
## ID_Mahasiswa Jam_Belajar_per_Minggu Jam_Belajar_Factor Jam_Belajar_Code
## <dbl> <dbl> <ord> <dbl>
## 1 100740 3.6 Rendah 1
## 2 100789 13 Sedang 2
## 3 100044 13.3 Sedang 2
## 4 100156 11.8 Sedang 2
## 5 100495 13.8 Sedang 2
## 6 100971 20.1 Tinggi 3
## 7 100271 7 Rendah 1
## 8 100591 14.4 Sedang 2
## 9 100124 10.4 Sedang 2
## 10 100114 21.4 Tinggi 3
## 11 100931 6.1 Rendah 1
## 12 100129 13.4 Sedang 2
## 13 100733 13.5 Sedang 2
## 14 100479 17.8 Sedang 2
## 15 100148 7 Rendah 1
## 16 101006 14 Sedang 2
## 17 101101 9.8 Rendah 1
## 18 100175 11.1 Sedang 2
## 19 100359 15 Sedang 2
## 20 100221 12.2 Sedang 2
Berdasarkan seluruh proses yang telah dilakukan, dapat disimpulkan hal-hal berikut. 1. Kondisi data awal Dataset mahasiswa yang dianalisis berukuran 1.215 baris dan 15 kolom. Data berasal dari sumber eksternal yang tidak dapat diverifikasi, bersifat sekunder karena tidak diambil langsung dari mahasiswa, dan berbentuk data terstruktur (baris dan kolom) sehingga mudah dibaca dan diolah. Pada kondisi awal, kualitas data ternyata belum layak untuk langsung dianalisis.
Permasalahan data Eksplorasi menemukan empat kelompok masalah. Missing value berjumlah 46 data pada lima variabel, yaitu Jam_Belajar_per_Minggu (12), Kehadiran_Persen (10), serta Nilai_Tugas, Nilai_Ujian, dan Kepuasan_Kuliah (masing-masing 8). Inkonsistensi penulisan ditemukan pada Gender (Laki-laki/Male/Pria/L dan Perempuan/Female/Wanita/P) serta pada Kota_Asal (perbedaan huruf besar dan kecil). Duplikasi data terjadi pada 15 ID_Mahasiswa dengan 14 baris duplikat identik. Data noisy ditemukan pada Umur, Kehadiran_Persen, Nilai, Kepuasan_Kuliah, dan Jam_Internet_per_Hari karena nilainya berada di luar batas yang logis.
Hasil pembersihan data Seluruh masalah ditangani secara
berurutan: duplikat dihapus sehingga tersisa 1.200 baris, penulisan
Gender dan Kota_Asal diseragamkan, nilai tidak wajar diubah menjadi
NA, kemudian semua nilai kosong diisi dengan median
masing-masing kolom. Median dipilih karena tidak terpengaruh nilai
ekstrem. Langkah tersebut dapat dilakukan baik di Excel maupun di R dan
menghasilkan data yang bersih, tanpa sel kosong dan tanpa baris
duplikat, sehingga siap digunakan untuk analisis.
Hasil uji asumsi Pada model regresi dengan Jam_Tidur_per_Hari sebagai variabel terikat serta Jam_Internet_per_Hari dan Jam_Belajar_per_Minggu sebagai variabel bebas, uji Kolmogorov-Smirnov menghasilkan p-value sebesar 0,1845 (> 0,05), sehingga residual berdistribusi normal. Uji Breusch-Pagan menghasilkan p-value sebesar 0,7159 (> 0,05), sehingga tidak terdapat heteroskedastisitas dan varians residual bersifat homogen. Dengan terpenuhinya kedua asumsi tersebut, model regresi dinilai layak dipakai untuk melihat hubungan antara jam belajar, jam internet, dan jam tidur mahasiswa.
Encoding dan sebaran jam belajar Variabel Jam_Belajar_per_Minggu berhasil diubah menjadi tiga kategori (rendah, sedang, tinggi) dengan kode numerik 1, 2, dan 3. Berdasarkan diagram batang, mayoritas mahasiswa berada pada kategori sedang (lebih dari 800 mahasiswa), diikuti kategori rendah (sekitar 250 sampai 260 mahasiswa), sedangkan kategori tinggi paling sedikit (sekitar 130 sampai 140 mahasiswa). Artinya, sebagian besar mahasiswa belajar dengan intensitas rata-rata, dan mahasiswa yang belajar dengan durasi rendah masih lebih banyak daripada yang belajar dengan durasi tinggi.
Integrasi data Penggabungan dua dataset menggunakan ID_Mahasiswa sebagai kunci utama berhasil menambahkan informasi Kategori_Belajar dan hasil encoding ke data utama tanpa menghilangkan informasi yang sudah ada. Pemeriksaan ID sebelum penggabungan memastikan setiap mahasiswa terhubung dengan pasangan data yang tepat, sehingga data gabungan tetap lengkap dan dapat digunakan untuk analisis lanjutan.
Mengacu pada hasil pembahasan dan kesimpulan di atas, beberapa rekomendasi yang dapat diajukan adalah sebagai berikut