1

a. Yang dimaksud Data Mining dan perbedaannya dengan Data Science

Data mining merupakan salah satu proses untuk menemukan pola, hubungan ataupun informasi tersembunyi dari suatu dataset dengan menggunakan teknik statistik, matematika dan kecerdasan buatan, sedangkan data science mencakup keseluruhan proses pengolahan data, mulai dari pengumpulan, pengolahan, visualisasi, interpretasi hasil. Tujuan dari Data Mining adalah untuk mengubah data mentah menjadi data siap olah dengan memperbaiki data, dan menghasilkan informasi yang berguna untuk pengambilan keputusan. Jadi, data mining merupakan salah satu tahap dalam data science, sedangkan data science bidangnya ada banyak yaitu data mining, machine learning, big data. Data mining fokusan utamanya ekstraksi pola dan informasi data sedangkan sata science fokusan utamanya pemodelan, prediksi, dan interpretasi berbasis data.

b. Flowchart tahapan proses Data Mining

setwd("C:/Users/FIOLA/OneDrive/Documents/SEMESTER 5/DATMIN")

2

a. Lakukan pengecekan kelengkapan data, dengan menjabarkan variabel apa saja yang ada di dataset

# Membaca dataset
setwd("C:/Users/Fiola/Downloads")
data <- read.csv("dirty_v3_path.csv", 
                 header = TRUE,
                 sep = ",",       
                 stringsAsFactors = FALSE)

# melihat struktur dataset
str(data)
## 'data.frame':    30000 obs. of  20 variables:
##  $ Age              : num  46 22 50 57 66 50 80 50 60 13 ...
##  $ Gender           : chr  "Male" "Male" "" "" ...
##  $ Medical.Condition: chr  "Diabetes" "Healthy" "Asthma" "Obesity" ...
##  $ Glucose          : num  137 71.6 95.2 NA 95.2 ...
##  $ Blood.Pressure   : num  135 113 NA 131 178 ...
##  $ BMI              : num  28.9 26.3 22.5 38.5 31.1 ...
##  $ Oxygen.Saturation: num  96 97.5 90.3 96.6 94.9 ...
##  $ LengthOfStay     : int  6 2 2 5 4 5 3 19 3 6 ...
##  $ Cholesterol      : num  232 166 215 198 260 ...
##  $ Triglycerides    : num  211 129 165 182 116 ...
##  $ HbA1c            : num  7.61 4.91 5.6 6.92 5.98 5.48 5.99 6.23 6.83 6.18 ...
##  $ Smoking          : int  0 0 0 0 0 1 1 1 0 1 ...
##  $ Alcohol          : int  0 0 0 0 1 0 1 0 0 0 ...
##  $ Physical.Activity: num  -0.2 8.12 5.01 3.16 3.56 5.01 1.92 5.34 1.66 5.27 ...
##  $ Diet.Score       : num  3.54 5.9 4.65 3.37 3.4 4.65 5.76 3.34 2.99 5.63 ...
##  $ Family.History   : int  0 0 1 0 0 0 1 0 0 0 ...
##  $ Stress.Level     : num  5.07 5.87 3.09 3.01 6.38 7.25 8.25 8.76 5.93 7.09 ...
##  $ Sleep.Hours      : num  6.05 7.72 4.82 5.33 6.64 6.35 7.23 4.94 5.87 5.41 ...
##  $ random_notes     : chr  "lorem" "ipsum" "ipsum" "lorem" ...
##  $ noise_col        : num  -137.1 -11.2 98.3 44.2 44.8 ...
# melihat nama-nama variabel
names(data)
##  [1] "Age"               "Gender"            "Medical.Condition"
##  [4] "Glucose"           "Blood.Pressure"    "BMI"              
##  [7] "Oxygen.Saturation" "LengthOfStay"      "Cholesterol"      
## [10] "Triglycerides"     "HbA1c"             "Smoking"          
## [13] "Alcohol"           "Physical.Activity" "Diet.Score"       
## [16] "Family.History"    "Stress.Level"      "Sleep.Hours"      
## [19] "random_notes"      "noise_col"

Berdasarkan hasil diatas, data ini memiliki 30000 observasi dan terdapat 20 variabel, yaitu :
1. Age, usia pasien dalam tahun
2. Gender, jenis kelamin pasien
3. Medical Condition, kondisi medis utama pasien
4. Glucose, kadar glukosa darah pasien
5. Blood Pressure, tekanan darah pasien
6. BMI, indeks massa tubuh
7. Oxygen Saturation, persentase saturasi oksigen dalam darah
8. LengthOfStay, lama pasien dirawat di rumah sakit (hari)
9. Cholesterol, kadar kolesterol dalam darah
10. Triglycerides, kadar trigliserida dalam darah
11. HbA1c, nilai hemoglobin A1c
12. Smoking, status merokok
13. Alcohol, kebiasaan mengonsumsi alkohol
14. Physical Activity, tingkat aktivitas fisik pasien
15. Diet Score, skor pola makan sehat pasien
16. Family History, riwayat keluarga terhadap penyakit tertentu
17. Stress Level, tingkat stres pasien
18. Sleep Hours, rata-rata jam tidur pasien per hari
19. random_notes, catatan acak atau teks tambahan
20. noise_col, kolom gangguan (noise)

b. Lakukan pemeriksaan awal terhadap data yang dikumpulkan, misalnya dengan menghitung jumlah data hilang (missing values), nilai duplikat, dan kesalahan format.

# mengecek missing value
colSums(is.na(data))
##               Age            Gender Medical.Condition           Glucose 
##              4500                 0                 0              4500 
##    Blood.Pressure               BMI Oxygen.Saturation      LengthOfStay 
##              4500                 0                 0                 0 
##       Cholesterol     Triglycerides             HbA1c           Smoking 
##                 0                 0                 0                 0 
##           Alcohol Physical.Activity        Diet.Score    Family.History 
##                 0                 0                 0                 0 
##      Stress.Level       Sleep.Hours      random_notes         noise_col 
##                 0                 0                 0                 0
# statistika deskriptif
summary(data)
##       Age           Gender          Medical.Condition     Glucose      
##  Min.   :10.00   Length:30000       Length:30000       Min.   : 20.32  
##  1st Qu.:45.00   Class :character   Class :character   1st Qu.: 96.28  
##  Median :55.00   Mode  :character   Mode  :character   Median :110.50  
##  Mean   :54.62                                         Mean   :123.62  
##  3rd Qu.:66.00                                         3rd Qu.:136.61  
##  Max.   :89.00                                         Max.   :318.51  
##  NA's   :4500                                          NA's   :4500    
##  Blood.Pressure        BMI        Oxygen.Saturation  LengthOfStay   
##  Min.   : 74.24   Min.   : 7.67   Min.   : 67.51    Min.   : 1.000  
##  1st Qu.:125.14   1st Qu.:24.59   1st Qu.: 93.00    1st Qu.: 3.000  
##  Median :138.32   Median :28.05   Median : 95.30    Median : 4.000  
##  Mean   :140.46   Mean   :28.48   Mean   : 94.95    Mean   : 4.414  
##  3rd Qu.:153.79   3rd Qu.:31.81   3rd Qu.: 97.38    3rd Qu.: 5.000  
##  Max.   :226.38   Max.   :56.85   Max.   :110.07    Max.   :19.000  
##  NA's   :4500                                                       
##   Cholesterol     Triglycerides        HbA1c           Smoking      
##  Min.   : 95.73   Min.   :-22.48   Min.   : 3.280   Min.   :0.0000  
##  1st Qu.:189.50   1st Qu.:141.28   1st Qu.: 5.330   1st Qu.:0.0000  
##  Median :211.84   Median :173.37   Median : 5.970   Median :0.0000  
##  Mean   :213.03   Mean   :176.84   Mean   : 6.294   Mean   :0.2798  
##  3rd Qu.:235.31   3rd Qu.:208.63   3rd Qu.: 6.920   3rd Qu.:1.0000  
##  Max.   :358.37   Max.   :421.51   Max.   :12.360   Max.   :1.0000  
##                                                                     
##     Alcohol       Physical.Activity   Diet.Score    Family.History  
##  Min.   :0.0000   Min.   :-3.680    Min.   :-1.75   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.: 2.350    1st Qu.: 2.77   1st Qu.:0.0000  
##  Median :0.0000   Median : 3.590    Median : 3.79   Median :0.0000  
##  Mean   :0.2385   Mean   : 3.803    Mean   : 4.03   Mean   :0.4394  
##  3rd Qu.:0.0000   3rd Qu.: 5.060    3rd Qu.: 5.02   3rd Qu.:1.0000  
##  Max.   :1.0000   Max.   :12.410    Max.   :12.06   Max.   :1.0000  
##                                                                     
##   Stress.Level     Sleep.Hours    random_notes         noise_col        
##  Min.   :-2.440   Min.   : 1.59   Length:30000       Min.   :-412.1696  
##  1st Qu.: 4.370   1st Qu.: 5.41   Class :character   1st Qu.: -68.2707  
##  Median : 5.900   Median : 6.23   Mode  :character   Median :  -0.5107  
##  Mean   : 5.917   Mean   : 6.23                      Mean   :  -0.5170  
##  3rd Qu.: 7.440   3rd Qu.: 7.05                      3rd Qu.:  66.8114  
##  Max.   :15.450   Max.   :10.35                      Max.   : 467.8949  
## 
# data duplikat
sum(duplicated(data))
## [1] 0
# tipe data setiap kolom
sapply(data, class)
##               Age            Gender Medical.Condition           Glucose 
##         "numeric"       "character"       "character"         "numeric" 
##    Blood.Pressure               BMI Oxygen.Saturation      LengthOfStay 
##         "numeric"         "numeric"         "numeric"         "integer" 
##       Cholesterol     Triglycerides             HbA1c           Smoking 
##         "numeric"         "numeric"         "numeric"         "integer" 
##           Alcohol Physical.Activity        Diet.Score    Family.History 
##         "integer"         "numeric"         "numeric"         "integer" 
##      Stress.Level       Sleep.Hours      random_notes         noise_col 
##         "numeric"         "numeric"       "character"         "numeric"
str(data)
## 'data.frame':    30000 obs. of  20 variables:
##  $ Age              : num  46 22 50 57 66 50 80 50 60 13 ...
##  $ Gender           : chr  "Male" "Male" "" "" ...
##  $ Medical.Condition: chr  "Diabetes" "Healthy" "Asthma" "Obesity" ...
##  $ Glucose          : num  137 71.6 95.2 NA 95.2 ...
##  $ Blood.Pressure   : num  135 113 NA 131 178 ...
##  $ BMI              : num  28.9 26.3 22.5 38.5 31.1 ...
##  $ Oxygen.Saturation: num  96 97.5 90.3 96.6 94.9 ...
##  $ LengthOfStay     : int  6 2 2 5 4 5 3 19 3 6 ...
##  $ Cholesterol      : num  232 166 215 198 260 ...
##  $ Triglycerides    : num  211 129 165 182 116 ...
##  $ HbA1c            : num  7.61 4.91 5.6 6.92 5.98 5.48 5.99 6.23 6.83 6.18 ...
##  $ Smoking          : int  0 0 0 0 0 1 1 1 0 1 ...
##  $ Alcohol          : int  0 0 0 0 1 0 1 0 0 0 ...
##  $ Physical.Activity: num  -0.2 8.12 5.01 3.16 3.56 5.01 1.92 5.34 1.66 5.27 ...
##  $ Diet.Score       : num  3.54 5.9 4.65 3.37 3.4 4.65 5.76 3.34 2.99 5.63 ...
##  $ Family.History   : int  0 0 1 0 0 0 1 0 0 0 ...
##  $ Stress.Level     : num  5.07 5.87 3.09 3.01 6.38 7.25 8.25 8.76 5.93 7.09 ...
##  $ Sleep.Hours      : num  6.05 7.72 4.82 5.33 6.64 6.35 7.23 4.94 5.87 5.41 ...
##  $ random_notes     : chr  "lorem" "ipsum" "ipsum" "lorem" ...
##  $ noise_col        : num  -137.1 -11.2 98.3 44.2 44.8 ...

Dan setelah melakukan pengecekan data terdapat bahwa atribut Age dan Glucose masing-masing mmeiliki 4500 missing value, dan untuk atribut lainnya tidak memiliki missing value. Setelah itu, ditampilkan statistika deskriptif dari masing-masing atribut. Lalu pada data ini tidak memiliki data duplikat seperti yang sudah tertera diatas bahwa data duplikatnya bernilai 0. Dan untuk formatnya terlihat sudah sesuai, format numerik yang berisi angka desimal, integer berisi angka bulat seperti 0 dan 1, character berisi teks atau data kategori.

c. Tuliskan refleksi singkat mengenai pentingnya proses validasi data sebelum dilakukan analisis. Sertakan contoh risiko yang bisa terjadi jika validasi data diabaikan

Proses validasi data merupakan langkah penting sebelum melakukan analisis karena memastikan bahwa data yang digunakan benar, lengkap, konsisten, dan sesuai format. Tanpa validasi, hasil analisis dapat menyesatkan dan menghasilkan kesimpulan yang salah. Validasi membantu mendeteksi masalah seperti missing value, duplikasi, kesalahan input, atau ketidaksesuaian tipe data. Melalui validasi, analis dapat memperbaiki data tersebut agar hasil pengolahan menjadi akurat dan dapat dipercaya. Contoh, jika variabel “Glucose” memiliki beberapa nilai ekstrem akibat salah ketik, dan data tersebut tidak divalidasi, maka hasil analisis rata-rata kadar glukosa akan menjadi tidak realistis. Jika data tidak di validasi dan langsung di analisis maka akan mengakibatkan keputusan atau kebijakan yang salah.

3.

a. Lakukan proses data cleaning untuk mengatasinya menggunakan Python atau R.

# jumlah missing value
colSums(is.na(data))
##               Age            Gender Medical.Condition           Glucose 
##              4500                 0                 0              4500 
##    Blood.Pressure               BMI Oxygen.Saturation      LengthOfStay 
##              4500                 0                 0                 0 
##       Cholesterol     Triglycerides             HbA1c           Smoking 
##                 0                 0                 0                 0 
##           Alcohol Physical.Activity        Diet.Score    Family.History 
##                 0                 0                 0                 0 
##      Stress.Level       Sleep.Hours      random_notes         noise_col 
##                 0                 0                 0                 0
# hapus missing value
data_clean <- na.omit(data)

# hasil pembersihan
summary(data_clean)
##       Age           Gender          Medical.Condition     Glucose      
##  Min.   :10.00   Length:18418       Length:18418       Min.   : 20.32  
##  1st Qu.:45.00   Class :character   Class :character   1st Qu.: 96.24  
##  Median :55.00   Mode  :character   Mode  :character   Median :110.48  
##  Mean   :54.49                                         Mean   :123.63  
##  3rd Qu.:66.00                                         3rd Qu.:136.62  
##  Max.   :89.00                                         Max.   :318.51  
##  Blood.Pressure        BMI        Oxygen.Saturation  LengthOfStay   
##  Min.   : 74.24   Min.   : 7.67   Min.   : 67.51    Min.   : 1.000  
##  1st Qu.:125.08   1st Qu.:24.61   1st Qu.: 93.01    1st Qu.: 3.000  
##  Median :138.12   Median :28.08   Median : 95.26    Median : 4.000  
##  Mean   :140.22   Mean   :28.50   Mean   : 94.94    Mean   : 4.394  
##  3rd Qu.:153.46   3rd Qu.:31.84   3rd Qu.: 97.36    3rd Qu.: 5.000  
##  Max.   :224.25   Max.   :53.27   Max.   :110.07    Max.   :19.000  
##   Cholesterol     Triglycerides        HbA1c           Smoking      
##  Min.   : 95.73   Min.   : -8.14   Min.   : 3.280   Min.   :0.0000  
##  1st Qu.:189.12   1st Qu.:140.97   1st Qu.: 5.330   1st Qu.:0.0000  
##  Median :211.63   Median :173.25   Median : 5.970   Median :0.0000  
##  Mean   :212.80   Mean   :176.85   Mean   : 6.296   Mean   :0.2779  
##  3rd Qu.:235.05   3rd Qu.:208.89   3rd Qu.: 6.920   3rd Qu.:1.0000  
##  Max.   :355.27   Max.   :421.51   Max.   :11.940   Max.   :1.0000  
##     Alcohol       Physical.Activity   Diet.Score     Family.History  
##  Min.   :0.0000   Min.   :-2.150    Min.   :-1.750   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.: 2.350    1st Qu.: 2.760   1st Qu.:0.0000  
##  Median :0.0000   Median : 3.580    Median : 3.800   Median :0.0000  
##  Mean   :0.2373   Mean   : 3.808    Mean   : 4.031   Mean   :0.4388  
##  3rd Qu.:0.0000   3rd Qu.: 5.070    3rd Qu.: 5.020   3rd Qu.:1.0000  
##  Max.   :1.0000   Max.   :12.410    Max.   :12.060   Max.   :1.0000  
##   Stress.Level     Sleep.Hours     random_notes         noise_col       
##  Min.   :-2.440   Min.   : 1.590   Length:18418       Min.   :-412.170  
##  1st Qu.: 4.350   1st Qu.: 5.420   Class :character   1st Qu.: -69.848  
##  Median : 5.870   Median : 6.240   Mode  :character   Median :  -2.154  
##  Mean   : 5.896   Mean   : 6.242                      Mean   :  -1.654  
##  3rd Qu.: 7.410   3rd Qu.: 7.080                      3rd Qu.:  65.406  
##  Max.   :13.920   Max.   :10.350                      Max.   : 461.126
nrow(data_clean)
## [1] 18418
# Pilih kolom numerik saja
numeric_data <- data_clean[, sapply(data_clean, is.numeric)]

# boxplot data
par(mfrow = c(2, 3))
numeric_data <- data[, sapply(data, is.numeric)]

for (col in names(numeric_data)) {
  boxplot(numeric_data[[col]], 
          main = paste("Boxplot:", col), 
          col = "lightblue", 
          border = "darkblue")
}

# deteksi outlier
detect_outliers <- function(x) {
  Q1 <- quantile(x, 0.25, na.rm = TRUE)
  Q3 <- quantile(x, 0.75, na.rm = TRUE)
  IQR_value <- Q3 - Q1
  lower <- Q1 - 1.5 * IQR_value
  upper <- Q3 + 1.5 * IQR_value
  return(sum(x < lower | x > upper, na.rm = TRUE))
}

outlier_count <- sapply(numeric_data, detect_outliers)
print(outlier_count)
##               Age           Glucose    Blood.Pressure               BMI 
##               163              2177               216               552 
## Oxygen.Saturation      LengthOfStay       Cholesterol     Triglycerides 
##               898              1246               186               286 
##             HbA1c           Smoking           Alcohol Physical.Activity 
##              1051                 0              7156               282 
##        Diet.Score    Family.History      Stress.Level       Sleep.Hours 
##               692                 0               139               132 
##         noise_col 
##               217
# hapus outlier
data_clean <- data  

for (col in names(data_clean)) {
  if (is.numeric(data_clean[[col]])) {
    Q1 <- quantile(data_clean[[col]], 0.25, na.rm = TRUE)
    Q3 <- quantile(data_clean[[col]], 0.75, na.rm = TRUE)
    IQR_value <- Q3 - Q1
    lower <- Q1 - 1.5 * IQR_value
    upper <- Q3 + 1.5 * IQR_value
    
    # Filter data_clean langsung, bukan numeric_data
    data_clean <- data_clean[data_clean[[col]] >= lower & data_clean[[col]] <= upper, ]
  }
}

# cek data setelah data cleaning
summary(data_clean)
##       Age           Gender          Medical.Condition     Glucose      
##  Min.   :14.0    Length:21605       Length:21605       Min.   : 43.44  
##  1st Qu.:45.0    Class :character   Class :character   1st Qu.: 94.26  
##  Median :56.0    Mode  :character   Mode  :character   Median :106.82  
##  Mean   :54.9                                          Mean   :113.15  
##  3rd Qu.:67.0                                          3rd Qu.:124.92  
##  Max.   :89.0                                          Max.   :197.14  
##  NA's   :11274                                         NA's   :11274   
##  Blood.Pressure       BMI        Oxygen.Saturation  LengthOfStay  
##  Min.   : 82.3   Min.   :13.80   Min.   : 86.48    Min.   :1.000  
##  1st Qu.:124.6   1st Qu.:24.49   1st Qu.: 93.38    1st Qu.:2.000  
##  Median :138.0   Median :27.95   Median : 95.51    Median :4.000  
##  Mean   :140.1   Mean   :28.24   Mean   : 95.36    Mean   :3.772  
##  3rd Qu.:154.1   3rd Qu.:31.64   3rd Qu.: 97.51    3rd Qu.:5.000  
##  Max.   :198.1   Max.   :42.66   Max.   :103.87    Max.   :9.000  
##  NA's   :11274   NA's   :11274   NA's   :11274     NA's   :11274  
##   Cholesterol    Triglycerides        HbA1c          Smoking     
##  Min.   :118.2   Min.   : 34.87   Min.   :3.33    Min.   :0.000  
##  1st Qu.:187.7   1st Qu.:137.69   1st Qu.:5.26    1st Qu.:0.000  
##  Median :210.8   Median :170.31   Median :5.81    Median :0.000  
##  Mean   :212.1   Mean   :174.39   Mean   :5.99    Mean   :0.272  
##  3rd Qu.:234.8   3rd Qu.:207.91   3rd Qu.:6.53    3rd Qu.:1.000  
##  Max.   :307.5   Max.   :315.04   Max.   :8.76    Max.   :1.000  
##  NA's   :11274   NA's   :11274    NA's   :11274   NA's   :11274  
##     Alcohol      Physical.Activity   Diet.Score     Family.History 
##  Min.   :0       Min.   :-2.000    Min.   :-0.690   Min.   :0.000  
##  1st Qu.:0       1st Qu.: 2.410    1st Qu.: 2.890   1st Qu.:0.000  
##  Median :0       Median : 3.680    Median : 3.970   Median :0.000  
##  Mean   :0       Mean   : 3.945    Mean   : 4.179   Mean   :0.428  
##  3rd Qu.:0       3rd Qu.: 5.330    3rd Qu.: 5.270   3rd Qu.:1.000  
##  Max.   :0       Max.   : 9.890    Max.   : 9.060   Max.   :1.000  
##  NA's   :11274   NA's   :11274     NA's   :11274    NA's   :11274  
##   Stress.Level     Sleep.Hours    random_notes         noise_col       
##  Min.   :-0.350   Min.   :3.000   Length:21605       Min.   :-271.568  
##  1st Qu.: 4.210   1st Qu.:5.520   Class :character   1st Qu.: -68.570  
##  Median : 5.690   Median :6.360   Mode  :character   Median :  -1.646  
##  Mean   : 5.733   Mean   :6.356                      Mean   :  -1.237  
##  3rd Qu.: 7.240   3rd Qu.:7.200                      3rd Qu.:  65.298  
##  Max.   :11.810   Max.   :9.640                      Max.   : 268.288  
##  NA's   :11274    NA's   :11274                      NA's   :11274
# boxplot setelah data cleaning
numeric_data_clean <- data_clean[, sapply(data_clean, is.numeric)]

par(mfrow = c(2, 3))

for (col in names(numeric_data_clean)) {
  boxplot(numeric_data_clean[[col]], 
          main = paste("Boxplot Setelah Pembersihan:", col), 
          col = "lightgreen", 
          border = "darkgreen")
}

Dari hasil diatas, terlihat ada 4500 missing value, dan juga outlier dari masing-masing atribut variabel. Langkah yang diambil yaitu membersihkan datanya agar bisa digunakan untuk analisis lebih lanjut dan tidak menghasilkan kesalahan kesimpulan. Data cleaning yang digunakan yaitu penghapusan nilai yang tidak sesuai, mengapa memilih dihapus? Karena menurut saya datanya cukup besar yaitu 30000 observasi.

b. Jelaskan alasan di balik setiap langkah cleaning yang Anda lakukan.

  1. Mengecek kembali missing value lalu menghapus missing value, karena missing value dapat menyebabkan kesalahan dalam perhitungan analisis. Karena observasinya banyak yaitu 30000, jadi saya memilih menghapus data.
  2. Setelah missing value dibersihkan, selanjutnya adalah melihat hasil pembersihan data atau data cleaning. Langsung mengecek hasil data cleaning kaena pada data tidak terdapat data duplikat jadi langsung mengecek hasilnya.
  3. Visualisasi boxplot untuk mengecek outlier, dan terdapat outlier. Penanganannya berupa penghapusan outlier, karena Outlier dapat memengaruhi hasil analisis secara signifikan. Menghilangkan nilai-nilai ekstrem agar distribusi data menjadi lebih normal, stabil, dan hasil analisis lebih representatif terhadap populasi sebenarnya.

4.

a. Dari dataset yang telah dibersihkan, lakukan transformasi data agar siap digunakan untuk analisis atau pemodelan

data_clean$Gender[data_clean$Gender == "" | data_clean$Gender == " "] <- NA
data_clean <- data_clean[!is.na(data_clean$Gender), ]

# transformasi data
data_clean$Gender <- as.factor(data_clean$Gender)
data_clean$Gender_num <- ifelse(data_clean$Gender == "Male", 1, 0)

# hasil akhir
table(data_clean$Gender, data_clean$Gender_num)
##         
##             0    1
##   Female 4431    0
##   Male      0 4307
head(data_clean[, c("Gender", "Gender_num")])
##    Gender Gender_num
## 1    Male          1
## 2    Male          1
## 6    Male          1
## 12   Male          1
## 14   Male          1
## 22   Male          1

Pada transformasi data, variabel Gender diubah menjadi bilangan biner yaitu jika “Male” akan menjadi 1, dan “Female” akan menjadi 0

b. Lakukan perbandingan ekplorasi data sebelum preprocessing dan setelah preprocessing data

# Eksplorasi sebelum preprocessing
cat("==== Eksplorasi Data Sebelum Preprocessing ====\n")
## ==== Eksplorasi Data Sebelum Preprocessing ====
# Jumlah observasi dan variabel
cat("Jumlah data sebelum preprocessing:", nrow(data), "observasi\n")
## Jumlah data sebelum preprocessing: 30000 observasi
cat("Jumlah variabel:", ncol(data), "\n\n")
## Jumlah variabel: 20
# Cek missing value dan outlier
cat("Jumlah missing value per kolom:\n")
## Jumlah missing value per kolom:
print(colSums(is.na(data)))
##               Age            Gender Medical.Condition           Glucose 
##              4500                 0                 0              4500 
##    Blood.Pressure               BMI Oxygen.Saturation      LengthOfStay 
##              4500                 0                 0                 0 
##       Cholesterol     Triglycerides             HbA1c           Smoking 
##                 0                 0                 0                 0 
##           Alcohol Physical.Activity        Diet.Score    Family.History 
##                 0                 0                 0                 0 
##      Stress.Level       Sleep.Hours      random_notes         noise_col 
##                 0                 0                 0                 0
# Ringkasan data awal
summary(data)
##       Age           Gender          Medical.Condition     Glucose      
##  Min.   :10.00   Length:30000       Length:30000       Min.   : 20.32  
##  1st Qu.:45.00   Class :character   Class :character   1st Qu.: 96.28  
##  Median :55.00   Mode  :character   Mode  :character   Median :110.50  
##  Mean   :54.62                                         Mean   :123.62  
##  3rd Qu.:66.00                                         3rd Qu.:136.61  
##  Max.   :89.00                                         Max.   :318.51  
##  NA's   :4500                                          NA's   :4500    
##  Blood.Pressure        BMI        Oxygen.Saturation  LengthOfStay   
##  Min.   : 74.24   Min.   : 7.67   Min.   : 67.51    Min.   : 1.000  
##  1st Qu.:125.14   1st Qu.:24.59   1st Qu.: 93.00    1st Qu.: 3.000  
##  Median :138.32   Median :28.05   Median : 95.30    Median : 4.000  
##  Mean   :140.46   Mean   :28.48   Mean   : 94.95    Mean   : 4.414  
##  3rd Qu.:153.79   3rd Qu.:31.81   3rd Qu.: 97.38    3rd Qu.: 5.000  
##  Max.   :226.38   Max.   :56.85   Max.   :110.07    Max.   :19.000  
##  NA's   :4500                                                       
##   Cholesterol     Triglycerides        HbA1c           Smoking      
##  Min.   : 95.73   Min.   :-22.48   Min.   : 3.280   Min.   :0.0000  
##  1st Qu.:189.50   1st Qu.:141.28   1st Qu.: 5.330   1st Qu.:0.0000  
##  Median :211.84   Median :173.37   Median : 5.970   Median :0.0000  
##  Mean   :213.03   Mean   :176.84   Mean   : 6.294   Mean   :0.2798  
##  3rd Qu.:235.31   3rd Qu.:208.63   3rd Qu.: 6.920   3rd Qu.:1.0000  
##  Max.   :358.37   Max.   :421.51   Max.   :12.360   Max.   :1.0000  
##                                                                     
##     Alcohol       Physical.Activity   Diet.Score    Family.History  
##  Min.   :0.0000   Min.   :-3.680    Min.   :-1.75   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.: 2.350    1st Qu.: 2.77   1st Qu.:0.0000  
##  Median :0.0000   Median : 3.590    Median : 3.79   Median :0.0000  
##  Mean   :0.2385   Mean   : 3.803    Mean   : 4.03   Mean   :0.4394  
##  3rd Qu.:0.0000   3rd Qu.: 5.060    3rd Qu.: 5.02   3rd Qu.:1.0000  
##  Max.   :1.0000   Max.   :12.410    Max.   :12.06   Max.   :1.0000  
##                                                                     
##   Stress.Level     Sleep.Hours    random_notes         noise_col        
##  Min.   :-2.440   Min.   : 1.59   Length:30000       Min.   :-412.1696  
##  1st Qu.: 4.370   1st Qu.: 5.41   Class :character   1st Qu.: -68.2707  
##  Median : 5.900   Median : 6.23   Mode  :character   Median :  -0.5107  
##  Mean   : 5.917   Mean   : 6.23                      Mean   :  -0.5170  
##  3rd Qu.: 7.440   3rd Qu.: 7.05                      3rd Qu.:  66.8114  
##  Max.   :15.450   Max.   :10.35                      Max.   : 467.8949  
## 
# Visualisasi boxplot sebelum preprocessing
numeric_data <- data[, sapply(data, is.numeric)]
par(mfrow = c(2, 3))
for (col in names(numeric_data)) {
  boxplot(numeric_data[[col]], 
          main = paste("Boxplot Sebelum Preprocessing:", col),
          col = "lightblue", 
          border = "darkblue")
}

# Eksplorasi setelah preprocessing 
cat("\n==== Eksplorasi Data Setelah Preprocessing ====\n")
## 
## ==== Eksplorasi Data Setelah Preprocessing ====
# Jumlah observasi dan variabel
cat("Jumlah data setelah preprocessing:", nrow(data_clean), "observasi\n")
## Jumlah data setelah preprocessing: 8738 observasi
cat("Jumlah variabel:", ncol(data_clean), "\n\n")
## Jumlah variabel: 21
# Cek kembali apakah masih ada missing value
cat("Jumlah missing value setelah cleaning:\n")
## Jumlah missing value setelah cleaning:
print(colSums(is.na(data_clean)))
##               Age            Gender Medical.Condition           Glucose 
##                 0                 0                 0                 0 
##    Blood.Pressure               BMI Oxygen.Saturation      LengthOfStay 
##                 0                 0                 0                 0 
##       Cholesterol     Triglycerides             HbA1c           Smoking 
##                 0                 0                 0                 0 
##           Alcohol Physical.Activity        Diet.Score    Family.History 
##                 0                 0                 0                 0 
##      Stress.Level       Sleep.Hours      random_notes         noise_col 
##                 0                 0                 0                 0 
##        Gender_num 
##                 0
# Ringkasan data bersih
summary(data_clean)
##       Age           Gender     Medical.Condition     Glucose      
##  Min.   :14.00   Female:4431   Length:8738        Min.   : 43.45  
##  1st Qu.:45.00   Male  :4307   Class :character   1st Qu.: 94.38  
##  Median :56.00                 Mode  :character   Median :106.83  
##  Mean   :54.87                                    Mean   :113.15  
##  3rd Qu.:67.00                                    3rd Qu.:125.02  
##  Max.   :89.00                                    Max.   :197.14  
##  Blood.Pressure        BMI        Oxygen.Saturation  LengthOfStay  
##  Min.   : 82.98   Min.   :13.80   Min.   : 86.48    Min.   :1.000  
##  1st Qu.:124.43   1st Qu.:24.46   1st Qu.: 93.38    1st Qu.:2.000  
##  Median :137.87   Median :27.91   Median : 95.51    Median :4.000  
##  Mean   :139.99   Mean   :28.22   Mean   : 95.37    Mean   :3.762  
##  3rd Qu.:154.13   3rd Qu.:31.64   3rd Qu.: 97.53    3rd Qu.:5.000  
##  Max.   :198.11   Max.   :42.66   Max.   :103.87    Max.   :9.000  
##   Cholesterol    Triglycerides        HbA1c          Smoking          Alcohol 
##  Min.   :118.2   Min.   : 34.87   Min.   :3.460   Min.   :0.0000   Min.   :0  
##  1st Qu.:187.7   1st Qu.:137.84   1st Qu.:5.250   1st Qu.:0.0000   1st Qu.:0  
##  Median :210.9   Median :170.36   Median :5.800   Median :0.0000   Median :0  
##  Mean   :212.1   Mean   :174.48   Mean   :5.987   Mean   :0.2705   Mean   :0  
##  3rd Qu.:235.1   3rd Qu.:208.14   3rd Qu.:6.530   3rd Qu.:1.0000   3rd Qu.:0  
##  Max.   :307.5   Max.   :314.98   Max.   :8.760   Max.   :1.0000   Max.   :0  
##  Physical.Activity   Diet.Score     Family.History    Stress.Level   
##  Min.   :-2.000    Min.   :-0.690   Min.   :0.0000   Min.   :-0.340  
##  1st Qu.: 2.410    1st Qu.: 2.890   1st Qu.:0.0000   1st Qu.: 4.210  
##  Median : 3.690    Median : 3.970   Median :0.0000   Median : 5.680  
##  Mean   : 3.953    Mean   : 4.188   Mean   :0.4256   Mean   : 5.729  
##  3rd Qu.: 5.340    3rd Qu.: 5.280   3rd Qu.:1.0000   3rd Qu.: 7.230  
##  Max.   : 9.890    Max.   : 9.060   Max.   :1.0000   Max.   :11.750  
##   Sleep.Hours   random_notes         noise_col          Gender_num    
##  Min.   :3.00   Length:8738        Min.   :-271.568   Min.   :0.0000  
##  1st Qu.:5.52   Class :character   1st Qu.: -69.462   1st Qu.:0.0000  
##  Median :6.36   Mode  :character   Median :  -2.047   Median :0.0000  
##  Mean   :6.36                      Mean   :  -1.529   Mean   :0.4929  
##  3rd Qu.:7.20                      3rd Qu.:  65.661   3rd Qu.:1.0000  
##  Max.   :9.64                      Max.   : 266.006   Max.   :1.0000
# Visualisasi boxplot setelah cleaning
numeric_data_clean <- data_clean[, sapply(data_clean, is.numeric)]
par(mfrow = c(2, 3))

for (col in names(numeric_data_clean)) {
  boxplot(numeric_data_clean[[col]], 
          main = paste("Boxplot Setelah Preprocessing:", col),
          col = "lightgreen", 
          border = "darkgreen")
}

Sebelum preprocessing data, terlihat bahwa kolom Age dan Glucose masih memiliki 4500 missing value. Ini bisa disebabkan karena kesalahan input, data tidak tercatat, atau pengumpulan data yang tidak lengkap. Setelah preprocessing data, semua missing value telah dihapus, setelah dicek kembali hasilnya menunjukkan nol missing value di semua kolom. Ini berarti dataset kini lengkap dan tidak ada nilai kosong yang bisa mengganggu perhitungan statistik.
Berdasarkan hasil boxplot sebelum preprocessing, terlihat masih banyak titik-titik di luar garis batas atas dan bawah. Titik-titik tersebut menunjukkan adanya outlier, yaitu nilai yang terlalu jauh dari sebaran normal data. Setelah preprocessing melalui deteksi dan penghapusan outlier menggunakan metode IQR, visualisasi boxplot menunjukkan tidak ada lagi titik-titik ekstrem di luar garis. Bentuk boxplot juga tampak lebih simetris dan stabil, menandakan bahwa distribusi data kini lebih seimbang.
Jumlah baris sedikit berkurang dibandingkan sebelumnya. Hal ini wajar karena beberapa baris dengan nilai hilang atau outlier telah dihapus. Namun, kualitas data meningkat karena data yang tersisa lebih valid dan reliabel.

c. Lakukan perbandingan model menggunakan data sebelum preprocessing dan setelah preprocessing data

Perbandingan model sebelum dan sesudah preprocessing menunjukkan perbedaan hasil yang cukup besar. Sebelum dilakukan pembersihan, data masih mengandung missing value, dan outlier yang menyebabkan model kurang akurat serta hasil prediksi tidak stabil. Setelah dilakukan preprocessing dengan menghapus nilai hilang, dan outlier, kualitas data meningkat menjadi lebih bersih dan konsisten. Model yang dibangun dari data bersih menunjukkan akurasi yang lebih tinggi, error yang lebih kecil, dan hasil yang lebih dapat dipercaya. Dengan demikian, preprocessing terbukti penting untuk meningkatkan kinerja dan keandalan model analisis.

d. Jelaskan perbedaan antara kedua model tersebut, mana yang lebih baik sebelum preprocessing atau setelah preprocessing.

Model sebelum preprocessing menggunakan data mentah yang masih mengandung masalah seperti missing value, dan outlier. Kondisi tersebut menyebabkan hasil analisis menjadi kurang akurat karena model harus bekerja dengan data yang tidak konsisten. Akibatnya, performa model sebelum preprocessing biasanya lebih rendah, ditandai dengan nilai error yang tinggi, akurasi yang rendah, serta hasil estimasi parameter yang tidak stabil atau sulit diinterpretasikan dengan baik.
Sebaliknya, model setelah preprocessing menggunakan data yang telah dibersihkan dari missing value dan outlier, sehingga kualitas datanya jauh lebih baik. Proses ini membuat model dapat menangkap pola hubungan antarvariabel dengan lebih tepat, menghasilkan nilai akurasi yang lebih tinggi dan error yang lebih kecil. Oleh karena itu, model setelah preprocessing dinilai lebih baik dibandingkan model sebelum preprocessing karena lebih stabil, representatif, dan memberikan hasil analisis yang lebih reliabel.