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.
setwd("C:/Users/FIOLA/OneDrive/Documents/SEMESTER 5/DATMIN")
# 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)
# 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.
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.
# 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.
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
# 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.
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.
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.