1.Pendahuluan

1.1 Latar Belakang

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.

1.2 Rumusan Masalah

Berdasarkan latar belakang tersebut, rumusan masalah dalam laporan ini adalah sebagai berikut.

  1. Permasalahan kualitas data apa saja yang terdapat di dalam dataset mahasiswa?
  2. Bagaimana cara menangani permasalahan tersebut, baik menggunakan Excel maupun R?
  3. Apakah lama belajar per minggu dan lama penggunaan internet per hari berkaitan dengan lama tidur mahasiswa per hari?
  4. Bagaimana data dari dua sumber dapat digabungkan dan variabel jam belajar dapat diubah ke bentuk kategori dan kode numerik?

1.3 Tujuan Membersihkan Data

Proses pembersihan data dilakukan dengan tujuan-tujuan berikut.

  1. Mengetahui kondisi dan gambaran umum dari data mahasiswa, misalnya jumlah baris, jumlah kolom, tipe data, dan ringkasan statistik setiap variabel.
  2. Mencari tahu apakah ada data yang kosong, duplikat, tidak konsisten, atau tidak wajar, sehingga seluruh masalah dapat didata secara jelas.
  3. Menemukan masalah-masalah yang ada dalam dataset sebelum data digunakan untuk analisis lebih lanjut, karena masalah yang ditemukan lebih awal jauh lebih mudah diperbaiki.
  4. Membersihkan dan merapikan data supaya lebih siap digunakan untuk pengolahan dan analisis, sehingga hasil yang diperoleh dapat dipercaya.

2. Gambaran Dataset

2.1 Informasi Dataset

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

2.2 Sumber Data

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.

2.3 Jenis Data

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.

2.4 Import Data

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

3 Permasalahan Data

Hasil eksplorasi menunjukkan empat permasalahan utama pada dataset, yaitu missing value, inkonsistensi data, duplikasi data, dan data noisy.

3.1 Missing Value

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.

3.2 Inkonsistensi 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

  1. Laki-laki ditulis sebagai Laki-laki, Male, Pria, L
  2. Perempuan ditulis sebagai Perempuan, Female, Wanita, P
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

  1. Pekanbaru: Pekanbaru, pekanbaru, PEKANBARU
  2. Padang: Padang, padang, PADANG
  3. Jambi: Jambi, jambi, JAMBI
  4. Dumai: Dumai, DUMAI
  5. Medan: Medan, MEDAN
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

3.3 Duplikasi Data

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
  1. Terdapat 15 ID_Mahasiswa yang muncul lebih dari satu kali
  2. Terdapat 14 baris yang merupakan duplikat identik, yaitu seluruh kolomnya sama persis dengan baris lain
  3. Salah satu contoh ID yang muncul lebih dari satu kali adalah Mahasiswa_0866

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.

3.4 Data Noisy

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.

4. Data Wrangling

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

  1. Menghapus data duplikat.
  2. Menyeragamkan penulisan kolom kategorik (Gender, Kota_Asal, Program_Studi).
  3. Mengubah nilai tidak wajar (noisy) menjadi NA.
  4. Mengisi seluruh nilai kosong dengan median.

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.

4.1 Menghapus Duplikat

Langkah di Excel: Berikut adalah cara menghapus data yang duplikat di dalam Excel

  1. Tekan CTRL + A untuk memblok seluruh data.
  2. Buka tab Data, pilih Remove Duplicates, centang “My data has headers”, centang semua kolom, lalu klik OK.
  3. Tekan CTRL + F, cari 101011, lalu cari baris yang nilai Jam_Internet_per_Hari-nya 30. Hapus sel tersebut dengan memblok sel lalu menekan Delete.
  4. Setelah proses ini, tersisa 1.200 baris data.

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)

4.2 Standardisasi Data

Langkah di Excel: Berikut adalah cara menseragamkan tulisan dan menyamakan kapitalisasi huruf di Excel

  1. 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.

  2. 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))

4.3 Menghapus Data Noisy

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

  1. Tekan CTRL + SHIFT + L sehingga muncul tanda panah ke bawah pada setiap judul kolom (filter).
  2. Klik tanda panah, lalu matikan Select All.
  3. Centang nilai yang tergolong noisy saja.
  4. Hapus nilainya dengan menekan Delete pada sel-sel tersebut sehingga menjadi sel kosong.
  5. Ulangi langkah yang sama untuk setiap kolom.

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)
  )

4.4 Mengisi Missing Value

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

  1. Hitung median tiap kolom numerik dengan rumus =MEDIAN((Huruf sel)2:(Huruf sel)1201), lalu tekan Enter.
  2. Blok kolom yang memiliki nilai kosong.
  3. Tekan F5, pilih Special, pilih Blanks, lalu OK. Seluruh sel kosong pada kolom itu akan terpilih.
  4. Ketik nilai median kolom tersebut (misalnya 21).
  5. Tekan CTRL + ENTER secara bersamaan agar nilai terisi ke semua sel kosong terpilih.
  6. Ulangi untuk setiap kolom yang memiliki nilai kosong.

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
}

4.5 Hasil Akhir Pembersihan

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

5. Tujuan Analisis

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:

  1. Variabel terikat (Y): Jam_Tidur_per_Hari
  2. Variabel bebas (X1): Jam_Internet_per_Hari
  3. Variabel bebas (X2): Jam_Belajar_per_Minggu

6. Validasi Data

Sebelum membentuk model, data perlu divalidasi untuk memastikan bahwa data benar-benar layak dipakai. Validasi data dilakukan melalui langkah-langkah berikut.

  1. Memastikan variabel yang digunakan sesuai dengan tujuan analisis. Hanya variabel yang relevan (jam tidur, jam internet, jam belajar) yang dimasukkan ke dalam model.
  2. Mengubah data menjadi numerik agar dapat diproses di R. Model regresi linear hanya dapat memproses variabel berupa angka, karena itu konversi ke numerik dilakukan sejak awal.
  3. Memeriksa adanya data kosong atau data yang tidak dapat digunakan. Sel kosong dan nilai tidak wajar sudah ditangani pada tahap wrangling.
  4. Memastikan nilai variabel berada pada bentuk yang sesuai, seperti Jam Internet dalam satuan jam per hari dan Jam Belajar dalam satuan jam per minggu. Kesesuaian satuan penting agar koefisien regresi dapat ditafsirkan dengan benar.
  5. Menggunakan data yang telah tervalidasi untuk membentuk model regresi.
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)

7. Uji Asumsi

7.1 Uji Normalitas

Tujuan: Menguji apakah residual model regresi berdistribusi normal. Asumsi ini penting terutama agar uji t dan uji F pada regresi dapat diandalkan.

Hipotesis.

  1. H0: residual berdistribusi normal (p-value > 0,05)
  2. H1: residual tidak berdistribusi normal (p-value < 0,05)

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.

7.2 Uji Heterokedastisitas

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

  1. H0: tidak terdapat heteroskedastisitas (ragam residual homogen) (p-value > 0,05)
  2. H1: terdapat heteroskedastisitas (p-value < 0,05)
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.

7.3 Uji Korelasi r

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.

8. Integrasi Data

8.1 Definisi Integrasi Data

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.

8.2 Tujuan Integritas Data

Integritas data memiliki tujuan sebagai berikut

  1. Memastikan ID_Mahasiswa konsisten pada kedua dataset
  2. Memastikan setiap mahasiswa pada Data 1 memiliki pasangan data yang tepat pada Data 2
  3. Menghindari duplikasi data
  4. Menghindari kesalahan pencocokan antara mahasiswa dan Kategori_Belajar
  5. Memastikan data setelah penggabungan tetap lengkap dan dapat digunakan untuk analisis

8.3 Encoding Jam_Belajar

# 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

8.4 Visualisasi

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.

8.5 Data Gabungan

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

9. Integrasi Data II

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.

9.1 Encoding Faktor

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.

9.2 Membuat Data 1 dan Data 2

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

9.3 Data Gabungan

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

10. Penutup

10.1 Kesimpulan

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

10.2 Saran

Mengacu pada hasil pembahasan dan kesimpulan di atas, beberapa rekomendasi yang dapat diajukan adalah sebagai berikut

  1. Pemeriksaan kualitas data sebaiknya dilakukan sejak awal sebelum analisis apa pun, dan aturan batas nilai (misalnya umur, skala nilai, skala kepuasan) perlu didokumentasikan agar konsisten.
  2. Untuk pengumpulan data berikutnya, disarankan memakai validasi saat input (misalnya pilihan tetap untuk Gender dan Kota_Asal) agar inkonsistensi penulisan tidak muncul kembali.
  3. Penyeragaman batas kategori jam belajar pada kedua tahap encoding perlu dilakukan agar hasil kategori tidak berbeda.
  4. Analisis lanjutan dapat menambahkan variabel lain (misalnya kehadiran, nilai akhir, atau semester) untuk memperoleh model yang lebih menjelaskan variasi jam tidur.