Data Science Programming
Pertemuan 9
Transformasi Data
1.Temporal Transformation
1.1 Lag, diff, rolling
Lagging adalah teknik yang digunakan untuk menggeser data ke belakang dalam satuan waktu tertentu. Ini sangat berguna dalam analisis deret waktu untuk memahami keterkaitan antara nilai saat ini dan masa lalu.
Teknik ini sering digunakan dalam model prediktif seperti ARIMA dan regresi deret waktu. Dengan menerapkan lagging, kita dapat melihat pola pergerakan suatu variabel terhadap waktu, yang memungkinkan analisis yang lebih mendalam.
Kelebihan:
Membantu memahami hubungan temporal antara variabel.
Berguna dalam pemodelan prediktif berbasis deret waktu.
Membantu dalam pembuatan fitur baru untuk model machine learning berbasis deret waktu.
Kekurangan:
Dapat menyebabkan kehilangan data pada awal periode.
Jika lag terlalu besar, informasi yang relevan bisa hilang.
Tidak selalu efektif jika pola hubungan antarwaktu tidak konsisten.
Penjelasan Fungsi
Fungsi | Tujuan |
---|---|
arrange(Patient_ID, Date) | Mengurutkan data berdasarkan pasien dan tanggal untuk memastikan kronologi. |
group_by(Patient_ID) | Agar transformasi dilakukan per individu, bukan seluruh dataset. |
lag(Blood_Pressure) | Mengambil tekanan darah sebelumnya untuk masing-masing pasien. |
Diff_BP | Selisih antara nilai sekarang dan nilai sebelumnya — digunakan untuk mendeteksi tren naik/turun. |
rollapply(…, width = 3) | Rata-rata dari 3 nilai terakhir untuk membantu melihat tren yang lebih stabil (rolling mean). |
Interpretasi Kesehatan
Fitur Transformasi | Arti & Manfaat |
---|---|
Lag_BP | Melihat efek masa lalu terhadap kondisi saat ini. Penting untuk model prediksi. |
Diff_BP | Mengindikasikan peningkatan atau penurunan tekanan darah. Bisa menandakan kondisi stabil atau memburuk. |
RollingMean_BP_3 | Membantu memfilter fluktuasi jangka pendek. Jika nilai saat ini jauh di atas rata-rata, bisa jadi alarm anomali. |
Hasil Transformasi
## Warning: package 'zoo' was built under R version 4.4.3
LDR <- health_data %>%
arrange(Date) %>%
mutate(
Lag_Blood_Pressure = lag(Blood_Pressure, default = NA),
Lag_Cholesterol = lag(Cholesterol, default = NA),
Lag_Glucose = lag(Glucose, default = NA),
Lag_Heart_Rate = lag(Heart_Rate, default = NA),
Diff_Blood_Pressure = Blood_Pressure - Lag_Blood_Pressure,
Diff_Cholesterol = Cholesterol - Lag_Cholesterol,
Diff_Glucose = Glucose - Lag_Glucose,
Diff_Heart_Rate = Heart_Rate - Lag_Heart_Rate,
Mean_BP = round(zoo::rollapply(Blood_Pressure, width = 3, FUN = mean, fill = NA, align = "right"), 1),
Mean_CT = round(zoo::rollapply(Cholesterol, width = 3, FUN = mean, fill = NA, align = "right"), 1)
) %>%
ungroup()
datatable(LDR, options = list(pageLength = 5))
Kesimpulan Transformasi Temporal:
Dataset dalam sub bab ini berisi informasi Kesehatan pasien, termasuk variabel variabel seperti Blood_Pressure, Cholesterol, Glucose, Heart_Rate, serta metadata seperti Date, Location, dan Health_Condition. Transformasi temporal ini diterapkan untuk memperkaya dan analisis yang lebih mendalam terkait pola Waktu. Berikut adalah kesimpulan dari masing-masing transformasi:
- Lag, Difference, dan Rolling
- Lag: Menangkap nilai sebelumnya dari parameter kesehatan (Blood_Pressure, Cholesterol, Glucose, Heart_Rate) untuk membandingkan perubahan antar waktu.
- Difference: Mengukur perubahan langsung (selisih) antara nilai saat ini dan nilai sebelumnya untuk melihat fluktuasi harian.
- Rolling: Menghitung rata-rata bergerak (moving average) untuk mengidentifikasi tren jangka pendek dalam parameter kesehatan.
Hasil: - Lag: Lag itu mengambil data dari data sebelumnya, contohnya pasien 1 tidak bisa mengambil data dari data sebelumnya itu kenapa?, karena data sebelumnya itu tidak ada, jadi jika mau muncul nilainya harus dimulai dari pasien 2, karena pasien 2 mempunyai pasien sebelumnya seperti pasien 1, ini berlaku untuk semua pasien, jika ingin mengambil data pasien 3 berarti dari nilai sebelumnya yaitu pasien 2 dst.
Diff: sementara kalau diff, dia tuh mengambil data sekarang dan data sebelumnya kemudian di kurangi
Mean: Minimal ada 3 data untuk diambil rata ratanya yaitu data sekarang, data sebelumnya, dan data 2 hari yang lalu, baru bisa mendapatkan hasilnya di data pasien 3, berlaku untuk seterusnya. satu contoh lagi jika ingin mengambil data pasien 4 harus mengambil data sekarang(data pasien 4), data sebelumnya(data pasien 3), dan data 2 hari yang lalu(data pasien 2), dst.
1.2 Extract Hour, Day, Month, Year
Ekstraksi waktu adalah proses mengambil bagian spesifik dari
timestamp, seperti jam, hari, bulan, atau tahun.
Ini berguna untuk analisis musiman atau pola perilaku pengguna
berdasarkan waktu.
Kelebihan:
- Membantu menemukan pola berdasarkan waktu (contoh: pembelian lebih banyak di akhir pekan).
- Memungkinkan pembuatan fitur baru dari data waktu.
Kekurangan:
- Jika tidak relevan dengan analisis, fitur ini bisa menjadi noise.
- Membutuhkan format tanggal/waktu yang benar.
Penjelasan Fungsi
Fungsi | Tujuan |
---|---|
weekdays(Date) | Menentukan nama hari berdasarkan tanggal (misalnya Senin, Selasa, dll.). |
month(Date, label = TRUE) | Mengambil bulan dari tanggal dan memberi label (contoh: Jan, Feb, dst.). |
year(Date) | Mengambil tahun dari tanggal untuk analisis musiman atau tahunan. |
ifelse(Day_of_Week %in% c(“Saturday”, “Sunday”), 1, 0) | Menentukan apakah tanggal tersebut jatuh pada akhir pekan (Sabtu/Minggu). |
as.factor(Location) | Mengubah lokasi menjadi variabel kategori. |
as.factor(Health_Condition) | Mengubah kondisi kesehatan menjadi variabel kategori. |
model.matrix(~ Location - 1) | Menggunakan one-hot encoding untuk mengonversi lokasi menjadi kolom-kolom biner. |
model.matrix(~ Health_Condition - 1) | Menggunakan one-hot encoding untuk mengonversi kondisi kesehatan menjadi kolom-kolom biner. |
Interpretasi Kesehatan:
Fitur Transformasi | Arti & Manfaat |
---|---|
Day_of_Week | Menyediakan informasi hari dalam minggu. Berguna untuk mendeteksi pola harian, misalnya apakah ada lebih banyak kunjungan rumah sakit di akhir pekan. |
Month | Menyediakan informasi tentang bulan. Dapat digunakan untuk mendeteksi pola musiman dalam data, seperti peningkatan kasus penyakit tertentu di bulan tertentu. |
Year | Memberikan informasi tahunan. Berguna untuk analisis jangka panjang dan tren tahunan, seperti peningkatan atau penurunan kesehatan masyarakat dari tahun ke tahun. |
Is_Weekend | Menunjukkan apakah data berasal dari akhir pekan atau tidak. Bisa menjadi fitur untuk melihat perilaku atau pola yang terjadi pada hari-hari tertentu. |
Location (One-hot) | Mengonversi lokasi menjadi variabel biner. Dapat digunakan untuk menganalisis apakah lokasi tertentu berhubungan dengan kondisi kesehatan tertentu. |
Health_Condition (One-hot) | Mengonversi kondisi kesehatan menjadi variabel biner. Membantu dalam analisis terkait dengan jenis kondisi kesehatan dan pengaruhnya terhadap variabel lainnya. |
Hasil Transformasi
Dari hasil transformasi data yang melibatkan ekstraksi informasi waktu dan encoding untuk lokasi serta kondisi kesehatan pasien, berikut adalah contoh tampilan data yang diperoleh:
extract <- health_data %>%
arrange(Date) %>%
mutate(
Year = year(Date),
Month = month(Date, label = TRUE),
Day_of_Week = weekdays(Date),
Is_Weekend = ifelse(Day_of_Week %in% c("Saturday", "Sunday"), 1, 0)
)
datatable(extract, options = list(pageLength = 5))
Mengekstrak komponen tanggal dari variabel Date(tahun, bulan, hari dalam seminggu, status akhir pekan) untuk analisis berbasis Waktu, seperti pola musiman atau perbedaan antara weekdays or weekend
Kalo yang di soal itu kita menentukan antara weekdays or weekend, jadi kalo hari yang kita tentukan itu weekend angka muncul angka 1(True), sebaliknya jika weekdays maka akan muncul angka 0(False)
Kesimpulan
- Ekstraksi Waktu: Data berhasil diubah dengan
mengekstraksi elemen-elemen waktu seperti Hari dalam Minggu,
Bulan, dan Tahun, yang memungkinkan analisis lebih lanjut
terkait dengan pola musiman dan perilaku berdasarkan waktu.
- Is_Weekend dihasilkan dengan memberikan nilai 1 jika hari tersebut adalah akhir pekan (Sabtu atau Minggu) dan 0 untuk hari lainnya, memungkinkan identifikasi tren berdasarkan akhir pekan atau hari kerja.
- Location & Health Condition Encoding: Lokasi
dan kondisi kesehatan pasien telah diubah menjadi **variabel biner*
untuk memudahkan analisis statistik dan pemodelan prediktif.
- Variabel lokasi seperti Location_Jakarta, Location_Bandung, dan Location_Surabaya diubah menjadi indikator biner untuk setiap lokasi.
- Kondisi kesehatan pasien, seperti Health_Condition_Healthy, Health_Condition_Hypertension, dan Health_Condition_Diabetes, juga dipetakan dalam bentuk variabel biner yang menggambarkan kondisi medis setiap individu.
1.3 Cumulative Sum/Mean/Count
Teknik kumulatif menghitung total berjalan (running total), jumlah kemunculan, atau rata-rata kumulatif dari data berdasarkan waktu.
Kelebihan:
- Sangat berguna untuk melihat pertumbuhan akumulatif.
- Membantu dalam memodelkan perilaku jangka panjang.
Kekurangan:
Hasil kumulatif bisa mengaburkan perubahan lokal kecil.
Bisa mempengaruhi distribusi data menjadi lebih smooth (terlalu halus).
Contoh Penggunaan dalam R:
Temporal3 <- health_data %>%
group_by(Patient_ID) %>%
mutate(
Cumulative_BP = cumsum(Blood_Pressure),
Cumulative_Glucose = cumsum(Glucose),
Cumulative_AvgHR = cummean(Heart_Rate)
) %>%
ungroup()
Penjelasan Fungsi
Fungsi | Tujuan |
---|---|
cumsum(Blood_Pressure) | Menghitung jumlah kumulatif tekanan darah sepanjang waktu. |
cumsum(Glucose) | Menghitung jumlah kumulatif kadar glukosa sepanjang waktu. |
cummean(Heart_Rate) | Menghitung rata-rata kumulatif detak jantung sepanjang waktu. |
Interpretasi Kesehatan:
Fitur Transformasi | Arti & Manfaat |
---|---|
Cumulative_BP | Menyediakan total kumulatif dari tekanan darah pasien sepanjang waktu. Ini bisa memberikan gambaran mengenai peningkatan atau penurunan kondisi kesehatan secara keseluruhan, misalnya dalam kasus hipertensi. |
Cumulative_Glucose | Menyediakan total kumulatif kadar glukosa pasien. Ini dapat membantu memantau fluktuasi kadar glukosa sepanjang waktu dan memberikan gambaran tentang kestabilan kondisi pasien dengan diabetes. |
Cumulative_AvgHR | Menyediakan rata-rata kumulatif detak jantung pasien. Ini dapat membantu melihat tren detak jantung pasien dari waktu ke waktu, apakah terjadi peningkatan atau penurunan yang signifikan. |
Hasil Transformasi
cumva <- health_data %>%
arrange(Date) %>%
mutate(
Cum_Blood_Pressure = cumsum(Blood_Pressure),
Cum_Cholesterol = cumsum(Cholesterol),
Cum_Glucose = cumsum(Glucose),
Cum_Heart_Rate = cumsum(Heart_Rate)
) %>%
ungroup()
datatable(cumva, options = list(pageLength = 5))
Menghitung nilai kumulatif dari parameter kesehatan (Blood_Pressure, Cholesterol, Glucose, Heart_Rate) secara global (berdasarkan urutan tanggal) untuk melacak total akumulasi seiring waktu.
contoh nya: Kita ambil yang BP(Blood Pressure), untuk pasien 1 data BP itu 104.07, jika kita masuk ke Cum BP hasilnya akan tetap menjadi 104.07, kenapa?, karena belum ada data sebelumnya jadi belum bisa ditambah oleh data lain, selanjutnya untuk pasien 2 data BP nya adalah 125.4, jika kita masuk ke Cum BP hasilnya akan menjadi 230.1, kenapa naik?, karena ini adalah gabungan antara data sekarang dan data sebelumnya, jadi kalau jumlah pasiennya ada 500, kita akan tambah tambah terus, cara nambahnya gimana?, yaitu dengan cara Cum BP + BP = New Cum BP
Kesimpulan:
Cumulative Sum (cumsum) digunakan untuk mengukur total kumulatif dari variabel tertentu (seperti tekanan darah atau kadar glukosa) dari waktu ke waktu. Teknik ini sangat berguna untuk memahami bagaimana suatu kondisi berkembang dalam jangka panjang.
Cumulative Mean (cummean) digunakan untuk melihat tren rata-rata jangka panjang, seperti detak jantung. Ini dapat membantu dalam memantau kestabilan kondisi kesehatan pasien.
Kelemahan teknik kumulatif: Hasil kumulatif bisa mempengaruhi distribusi data, membuat data terlihat lebih smooth dan dapat mengaburkan perubahan lokal kecil yang mungkin signifikan. Oleh karena itu, harus digunakan dengan hati-hati tergantung pada tujuan analisis.
2.Transformasi Distribusi
2.1 Log Transform
Penjelasan Fungsi
Fungsi | Tujuan |
---|---|
min(health_data\(Glucose[health_data\)Glucose > 0]) | Mencari nilai glukosa positif terkecil, untuk menggantikan nilai nol atau negatif. |
ifelse(Glucose <= 0, min_positive, Glucose) | Mengganti nilai glukosa nol atau negatif dengan nilai glukosa positif terkecil agar aman untuk transformasi logaritma. |
log1p(Safe_Glucose) | Menghitung logaritma natural dari (glukosa + 1), agar distribusi data lebih normal dan menghindari log(0). |
Interpretasi Kesehatan
Fitur Transformasi | Arti & Manfaat |
---|---|
Safe_Glucose | Menjamin semua nilai glukosa bernilai positif sebelum transformasi logaritma. Ini penting karena log(0) tidak terdefinisi, dan nilai nol bisa muncul akibat kesalahan pencatatan atau alat medis. |
Log_Glucose | Transformasi logaritma membuat distribusi glukosa yang awalnya miring (skewed) menjadi lebih normal. Ini membantu meningkatkan performa model prediktif dan analisis statistik. |
Hasil Transformasi
Kesimpulan
2.1 Transformasi log: > Mengurangi Skewness (kemencengan distribusi) atau kemiringan ke kanan. Dipake agar distribusinya lebih simetris.
Menstabilkan Varians, kalau varians meningkat seiring dg mean, log transform bantu kurangin ketimpangan antar kelompok
Data kadar glukosa suka miring ke kanan krn sebagian kecil padien kadar tinggi, transform log yg bakal ringankan dampak outlier ekstrim.
min(health_data\(Glucose[health_data\)Glucose > 0]): > Fungsi: cari nilai min dari data glukosa yang lebih dr 0 (positif)
Tujuan: dapetin nilai positif terkecil utk gantiin nilai glukosa nol/negatif
Note: gabakal error meskipun ada NA krn [ ] bakal filter dan hanya ambil nilai yg lebih dr 0. Kalo nilai glukosa <= 0 / NA semua maka hasil adalah numeric(0) tetep bisa error
Mengapa penting? 1. Karena log(0) dan log(negatif) gak terdefinisi yg berakibat menghasilkan NaN/error
- Menganti nilai nol/negatif dg nilai positif terkecil memungkinkan smua data bisa di log transform tanpa error
ifelese(glucose <= 0, min_positive, Glucose)
Fungsi: cek nilai glukosa kurang dari/sama dg nol. Kalo iya diganti dg min_positive, kalo gak tetep sesuai aslinya
Tujuan: bersihin data dr nilai yg gabisa di transform scr logaritmik. Supaya smua nilai pada variavel glukosa positif dan valid utk transformasi.
Note: kalo nilainya NA dr awal, tetep bakal NA.
log1p(Safe_Glucose) > Fungsi: menghitung logaritma natural dari x + 1 utk setiap nilai Safe_Glucose
Tujuan: normalin distribusi data glukosa yg cenderung miring kanan.
Note: Pake ini krn dia bisa dimodel terus aman utk nilai mendekati nol atau hasil dari min_positive
2.2 Box-Cox
Box_Cox <- health_data %>%
mutate(
YeoJ_BP = bestNormalize(Blood_Pressure)$x.t,
YeoJ_Chol = bestNormalize(Cholesterol)$x.t
)
Penjelasan Fungsi
Fungsi | Tujuan |
---|---|
bestNormalize(Blood_Pressure)x.t | Menerapkan transformasi normalisasi terbaik (seperti Yeo-Johnson) ke variabel tekanan darah untuk membuat distribusinya lebih mendekati normal. |
bestNormalize(Cholesterol)x.t | Menerapkan transformasi normalisasi terbaik ke variabel kolesterol agar distribusinya lebih simetris dan cocok untuk analisis statistik atau machine learning. |
Interpretasi Kesehatan
Fitur Transformasi | Arti & Manfaat |
---|---|
YeoJ_BP | Menghasilkan versi transformasi dari Blood_Pressure yang sudah dinormalisasi menggunakan metode Yeo-Johnson atau metode terbaik lainnya. Ini penting untuk analisis statistik yang mengasumsikan distribusi normal, seperti regresi linier. |
YeoJ_Chol | Menghasilkan versi transformasi dari Cholesterol yang telah dinormalisasi. Ini berguna untuk mengurangi pengaruh outlier dan membuat data lebih cocok untuk pemodelan. |
Hasil Transformasi
Kesimpulan
Menormalkan distribusi data
Penting utk cek validitas uji spt; estimasi parameter, signifikansi, confidence interval
Mencari transformasi terbaik dr suatu variavel agar distribusinya mendekati normal
Yeo-J utk menangani nilai nol/negatif yang sering muncul akibat kesalahan alat/pencatatan.
bestNormalize: memilih auto utk transform terbaik buat distribusi data jadi mendekati normal. Yg diuji termasuk: yeo-j(handle data negatif), box cox(hny utk data positif), log, square root, arcinh
2.3 Variance Stabilization
Variance_Stab <- health_data %>%
mutate(
Sqrt_Cholesterol = sqrt(Cholesterol),
Sqrt_BMI = sqrt(BMI)
)
Penjelasan Fungsi
Fungsi | Tujuan |
---|---|
sqrt(Cholesterol) | Mentransformasi kolesterol dengan akar kuadrat untuk menstabilkan variansi. |
sqrt(BMI) | Mentransformasi indeks massa tubuh (BMI) dengan akar kuadrat agar distribusinya lebih normal dan mengurangi efek outlier. |
Interpretasi Kesehatan
Fitur Transformasi | Arti & Manfaat |
---|---|
Sqrt_Cholesterol | Mengurangi sebaran ekstrem pada nilai kolesterol tinggi. Ini membantu dalam analisis regresi atau machine learning agar model tidak terlalu dipengaruhi oleh outlier. |
Sqrt_BMI | Membantu menstabilkan varians BMI dan mendekatkan distribusi ke bentuk normal. Ini penting jika data akan digunakan dalam model statistik yang mengasumsikan distribusi normal. |
Hasil Interpretasi
Kesimpulan
Stabilkan Varians antar observasi/kelompok
Menekan efek outlier yang verat supaya model lebih seimbang, analisis regresi dan klasifikasinya akurat krn modelnya ga ketarik oleh nilai ekstrim.
Pasien dg kolestrol ekstrim akan diberikan nilai transformasi jauh lebih kecul dr aslinya shg pengaruh oulier berkurang drastis (meminimalisir bias akibat outlier)
sqrt() :stabilkan varians pada data yg skewed, memperbaiki asumsi normalitas dalam data numerik yang akan digunakan
3. Scaling & Normalization
3.1 Standardization (Z-score)
Proses mengubah variabel numerik yang memiliki skala berbeda menjadi skala yang sama dengan rata-rata 0 dan deviasi standar 1.
# Z-score Normalization
Z_score <- health_data %>%
mutate(
Age_Z = scale(age),
BMI_Z = scale(bmi),
Blood_Pressure_Z = scale(blood_pressure),
Cholesterol_Z = scale(cholesterol),
Glucose_Z = scale(glucose)
)
Penjelasan Kode
Fungsi | Tujuan |
---|---|
scale(Age) | Menstandarkan usia agar berada dalam skala satuan. |
scale(BMI) | Menstandarkan nilai indeks massa tubuh (IMT). |
scale(Blood_Pressure) | Menstandarkan tekanan darah agar tidak dominan karena skalanya besar. |
scale(Cholesterol) | Menstandarkan kolesterol agar setara dengan fitur lain. |
scale(Glucose) | Menstandarkan glukosa agar adil dalam model prediksi. |
scale(Heart_Rate) | Menstandarkan detak jantung agar memiliki skala yang sama. |
Interpretasi Kesehatan
Fitur Transformasi | Arti & Manfaat |
---|---|
Age_std | Membantu melihat pengaruh usia tanpa dipengaruhi oleh rentang besar pada data usia. |
BMI_Std | Membantu mendeteksi pasien dengan risiko obesitas yang memengaruhi tekanan darah. |
bloodpreasure_Std | Membuat tekanan darah menjadi fitur yang sebanding untuk prediksi atau klasifikasi. |
kolestrol_std | Menyetarakan pengaruh kolesterol dalam model prediksi hipertensi. |
Glukosa_std | Memungkinkan pengaruh glukosa diamati secara proporsional tanpa bias skala. |
Heartrate_std | Mempermudah analisis tren detak jantung terhadap kondisi lain secara setara. |
Hasil Transformasi
Kesimpulan
Proses mengubah variabel numerik yang memiliki skala berbeda menjadi skala yang sama sehingga nilai-nilai tersebut memiliki rata-rata 0 dan deviasi standar 1. Penskalaan ini bisa membantu model machine learning untuk tidak cenderung menganggap satu fitur lebih penting daripada yang lain hanya karena memiliki rentang yang lebih besar.
Dalam mendeteksi pasien yang memiliki faktor risiko dalam mempengaruhi tekanan darah yang akan mengakibatkan hipertensi bisa diliat dari nilai BMI, kolestrol dan glukosa. ketiga fitur itu memiliki rentang skala yang berbeda beda ada yang di puluhan ataupun ratusan. Model mechine learning akan memberi bobot pada fitur kolestrol karena memiliki rentang yang besar. Setelah di skala ketiga fitur itu ada di skala yang sama . Disini model bisa menilai dari ketiga fitur tersebut apakah bisa mempengaruhi tekanan darah tinggi atau tidak yang akan mengakibatkan hipertensi.
3.2 Robust Scaler
Proses merubah variabel numerik yang memiliki skala berbeda menjadi skala yang sama dalam dataset dan tahan terhadap outlier. Namun, masih terpengaruhi oleh nilai yang sangat ekstrim. Penskalaan ini diperkuat dengan median dan IQR dari tiap fitur.
# RobustScaler
Robust <- health_data %>%
mutate(
Age_robust = (age - median(age)) / IQR(age),
BMI_robust = (bmi - median(bmi)) / IQR(bmi),
BloodPressure_robust = (blood_pressure - median(blood_pressure)) / IQR(blood_pressure),
Cholesterol_robust = (cholesterol - median(cholesterol)) / IQR(cholesterol),
Glucose_robust = (glucose - median(glucose)) / IQR(glucose),
HeartRate_robust = (heart_rate - median(heart_rate)) / IQR(heart_rate)
)
Penjelasan Kode
Fungsi Transformasi | Tujuan |
---|---|
(age - median(age)) / IQR(age) | Menstandarkan usia berdasarkan median dan IQR agar tidak dipengaruhi outlier. |
(bmi - median(bmi)) / IQR(bmi) | Menyesuaikan nilai BMI ke skala yang lebih netral terhadap nilai ekstrem. |
(blood_pressure - median(…)) / IQR(…) | Mengubah tekanan darah ke skala yang stabil dan tahan terhadap lonjakan nilai. |
(cholesterol - median(…)) / IQR(…) | Mengatur kolesterol agar setara skalanya dengan fitur lain meskipun outlier ada. |
(glucose - median(…)) / IQR(…) | Menormalkan kadar gula darah agar tidak didominasi oleh nilai ekstrem. |
(heart_rate - median(…)) / IQR(…) | Menstabilkan nilai detak jantung untuk analisis komparatif antar pasien. |
Interpretasi Kesehatan
Fitur Transformasi | Arti & Manfaat |
---|---|
Age_robust | Usia pasien kini distandarisasi tanpa dipengaruhi ekstrem umur yang terlalu muda atau tua. Berguna untuk model prediktif yang sensitif terhadap variasi usia. |
BMI_robust | Menilai risiko kelebihan berat badan terhadap hipertensi secara adil dan netral. |
BloodPressure_robust | Memberi gambaran tekanan darah yang adil saat dibandingkan antar pasien dengan data bervariasi. |
Cholesterol_robust | Menghindari bias model terhadap pasien dengan kadar kolesterol sangat tinggi. |
Glucose_robust | Memastikan model melihat pola kadar glukosa tanpa tertipu nilai yang terlalu ekstrem. |
HeartRate_robust | Menjadikan detak jantung setara secara skala dengan fitur lain untuk analisis prediksi kesehatan jantung. |
Hasil Transformasi
Kesimpulan
Sama halnya dengan z-score. robust scaller ini mengubah skala yang berbeda menjadi skala yang sama tapi dia pakai median untuk nilai pusat data dari kolom dan juga pakai IQR untuk membagi sebaran data dengan membatasi kuartil, jadi outlier ga akan terpengaruh pada saat penskalaan.
Misal, untuk yang deteksi kaya di z score, 3 kolom itukan beda beda dan pasti ada nilai yang jauh banget itu bisa dibilang outliuer kan nah itu butuh pakai robust scaler untuk nyamain skala di 3 kolom ini dengan menekan kan nilai yang sangat jauh dari mayoritas data jadi skala nya ada di lebih dekat dengan sebaran data. jadi model nya bisa analisis dengan seimbang
3.3 Normalization
Proses merubah skala dalam rentang tertentu umumnya 0-1 dengan menggunakan nilai minimum dan maksimum yang menghasilkan keseimbangan data. Normalisasi ini akan sangat terpengaruh oleh nilai ekstrem.
# Min-Max Normalization
Min_Max <- health_data %>%
mutate(
Age_Norm = (Age - min(Age, na.rm = TRUE)) / (max(Age, na.rm = TRUE) - min(Age, na.rm = TRUE)),
BMI_Norm = (BMI - min(BMI, na.rm = TRUE)) / (max(BMI, na.rm = TRUE) - min(BMI, na.rm = TRUE)),
Blood_Pressure_Norm = (Blood_Pressure - min(Blood_Pressure, na.rm = TRUE)) / (max(Blood_Pressure, na.rm = TRUE) - min(Blood_Pressure, na.rm = TRUE)),
Cholesterol_Norm = (Cholesterol - min(Cholesterol, na.rm = TRUE)) / (max(Cholesterol, na.rm = TRUE) - min(Cholesterol, na.rm = TRUE)),
Glucose_Norm = (Glucose - min(Glucose, na.rm = TRUE)) / (max(Glucose, na.rm = TRUE) - min(Glucose, na.rm = TRUE))
)
Penjelasan Kode
Fungsi | Tujuan |
---|---|
(x - min(x)) / (max(x) - min(x)) | Mengubah skala data agar berada dalam rentang 0 hingga 1, tanpa mengubah bentuk distribusi aslinya. Berguna untuk algoritma machine learning yang sensitif terhadap skala, seperti KNN dan SVM. |
na.rm = TRUE | Mengabaikan nilai missing agar proses normalisasi tetap berjalan tanpa error. |
Interpretasi Kesehatan
Fitur Ternormalisasi | Arti & Manfaat |
---|---|
Age_Norm | Mengonversi umur pasien ke skala 0–1 untuk memastikan model tidak bias terhadap rentang usia yang luas. |
BMI_Norm | Memastikan nilai indeks massa tubuh dibandingkan secara adil dengan fitur lain. |
Blood_Pressure_Norm | Menstandarkan tekanan darah agar bisa dibandingkan langsung dengan variabel lain dalam model prediktif. |
Cholesterol_Norm | Membuat kadar kolesterol dapat diinterpretasikan dalam skala seragam. |
Glucose_Norm | Membantu dalam menyeimbangkan fitur glukosa dengan fitur lainnya tanpa memperbesar bobotnya. |
Hasil Transformasi
Kesimpulan
proses mengubah data menjadi skala yang sama menggunakan nilai min max untuk membatasi hasil normalisasi jadi ada di rentang 0 -1. Normalisasi ini kao banyak outlier di data akan sangat terpengaruh apalagi kalao digunakan dengan model untuk prediksi penyakit jadi leih baik ake robust scaller.
4. Kategorial Encoding
4.1 One-Hot Encoding
One-Hot Encoding bertujuan untuk mengubah data kategorik menjadi bentuk numerik agar bisa digunakan dalam analisis statistik atau algoritma machine learning. Sebab, sebagian besar algoritma tidak bisa langsung memproses data dalam bentuk teks.
Dengan one-hot encoding: - Setiap kategori diubah menjadi kolom baru berisi nilai biner (0 atau 1). - Nilai “1” menunjukkan bahwa observasi termasuk dalam kategori tersebut. - Nilai “0” berarti tidak termasuk dalam kategori tersebut.
Kelebihan:
- Menghilangkan makna ordinal dari kategori (tidak mengasumsikan urutan).
- Cocok untuk algoritma yang tidak bisa menangani data kategorik secara langsung.
Kekurangan:
- Menambah jumlah fitur secara signifikan (terutama jika kategori banyak).
- Bisa menyebabkan curse of dimensionality.
Berikut adalah versi penjelasan One-Hot Encoding yang diperbarui dengan 5 kota: *Medan, Surabaya, Jakarta, Bandung, Makassar, serta 4 kondisi kesehatan: **Diabetes, Sehat, Hipertensi, Obesitas*.
One-Hot Encoding dengan Banyak Kategori
1. Maksud dan Tujuan
One-hot encoding mengubah data kategorik menjadi bentuk numerik biner, di mana setiap kategori akan diwakili oleh satu kolom berisi nilai 0 dan 1. Tujuannya agar data tersebut bisa digunakan oleh algoritma statistik/machine learning yang hanya menerima input numerik.
2. Contoh Data Awal
ID | Location | Health_Condition |
---|---|---|
1 | Medan | Diabetes |
2 | Surabaya | Sehat |
3 | Jakarta | Hipertensi |
4 | Bandung | Obesitas |
5 | Makassar | Diabetes |
6 | Surabaya | Sehat |
3. Kode R untuk One-Hot Encoding
lcategorical_cols <- c("location", "health_condition")
one_hot <- dummy_cols(
health_data,
select_columns = categorical_cols,
remove_first_dummy = TRUE,
remove_selected_columns = TRUE
)
DT::datatable(one_hot, caption = "Hasil One-Hot Encoding (5 Kota, 4 Kondisi Kesehatan)")
4. Hasil Output
Dengan remove_first_dummy = TRUE, maka: - Kategori pertama dari setiap kolom tidak dibuatkan dummy (misalnya: Location_Medan dan Health_Condition_Diabetes tidak muncul). - Informasi kategori pertama tetap dapat diketahui saat semua kolom dummy lainnya bernilai 0.
ID | Location_Surabaya | Location_Jakarta | Location_Bandung | Location_Makassar | Health_Condition_Sehat | Health_Condition_Hipertensi | Health_Condition_Obesitas |
---|---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
3 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
4 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
5 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
6 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
5. Interpretasi
- Baris 1: Semua dummy 0 → berarti Location = Medan, Health_Condition = Diabetes (kategori pertama).
- Baris 4: Lokasi Bandung (Location_Bandung = 1), Kondisi Obesitas (Health_Condition_Obesitas = 1).
Kesimpulan
- One-hot encoding bisa digunakan untuk berapa pun jumlah kategori, tidak terbatas 2 saja.
- remove_first_dummy = TRUE menghindari redundansi (dummy trap), tapi tidak menghilangkan informasi.
- Cocok digunakan untuk model klasifikasi dan regresi agar tidak salah menangkap hubungan antar kategori.
Contoh Penggunaan dalam R:
{}
categorical_cols <- names(health_data)[sapply(health_data, function(x) is.factor(x) || is.character(x))] one_hot <- dummy_cols( health_data, select_columns = categorical_cols, remove_first_dummy = TRUE, remove_selected_columns = TRUE )
Penjelasan Fungsi
Fungsi | Tujuan |
---|---|
dummy_cols() | Membuat kolom dummy dari data kategorik. |
remove_first_dummy = TRUE | Menghindari dummy variable trap (multikolinearitas) dengan menghapus satu kategori. |
remove_selected_columns = TRUE | Menghapus kolom kategorik asli dari dataset. |
Interpretasi Kesehatan:
Fitur One-Hot | Makna |
---|---|
Location_Bandung = 1 | Pasien berasal dari Bandung. |
Health_Condition_Diabetes = 1 | Pasien memiliki kondisi diabetes. |
Hasil Transformasi
Kesimpulan:
Transformasi ini mempermudah penggunaan data kategorik dalam model prediksi dan analisis statistik.
Menghindari kesalahan interpretasi urutan pada variabel kategorik.
Cocok digunakan bersama metode statistik dan machine learning modern.
Pengerjaan ini bertujuan menyiapkan data kategorik agar kompatibel dengan model statistik dan machine learning. Hasilnya berupa fitur biner yang merepresentasikan tiap kategori tanpa mengasumsikan urutan atau nilai tertentu — memastikan model tidak salah mengartikan makna kategorik.
4.2 Label Encoding
Label Encoding adalah teknik konversi data kategorikal menjadi nilai numerik dengan memberi label (angka) untuk setiap kategori unik. Ini penting agar model machine learning dapat memproses data tersebut, karena sebagian besar algoritma hanya menerima input numerik.
Tujuan:
Mengubah kolom kategorikal seperti year, location, dan health_condition menjadi bentuk numerik dengan cara sederhana dan efisien atau mengubah data kategorikal (teks) menjadi data numerik dalam bentuk label angka, agar bisa digunakan dalam model machine learning atau analisis statistik yang tidak bisa membaca data teks langsung.
Contoh:
Kategori “Jakarta”, “Bandung”, “Surabaya” akan diubah menjadi angka 0, 1, dan 2.
## # A tibble: 500 × 13
## patient_id date age bmi blood_pressure cholesterol glucose
## <chr> <date> <int> <dbl> <dbl> <dbl> <dbl>
## 1 SLy5n7T2vCfd 2021-07-14 27 31.5 123. 132. 77.7
## 2 SS9WdTh6Gp9l 2020-11-16 63 26.9 120. 213. 128.
## 3 5PBRrmglA03t 2023-03-22 72 18.2 146 158. 100.
## 4 0cAGgC7hcyxq 2023-01-02 60 19.9 121. 221. 103.
## 5 0KSEA9pnVHdd 2023-06-05 40 32.5 109. 230. 91.9
## 6 Zba4dbAEtGwn 2023-03-15 71 27.4 126. 209. 102
## 7 R8Qx2GZT0XQT 2021-09-25 74 17.1 111. 118. 104.
## 8 4CDiQyhVv9KV 2020-02-18 44 25.3 109. 140. 78.8
## 9 PPPsJBNOlqxa 2023-02-25 51 18.2 91.4 285 73.6
## 10 wsS2iEHE4Sh6 2023-08-19 33 17.6 125. 265 77.5
## # ℹ 490 more rows
## # ℹ 6 more variables: heart_rate <dbl>, location <chr>, health_condition <chr>,
## # season <chr>, location_label <dbl>, health_condition_label <dbl>
Kode dan Penjelasannya
library(dplyr)
library(DT)
## Fungsi label encoding
label_enc <- function(col) {
as.numeric(factor(col)) - 1
}
- label_enc: Fungsi ini mengubah input kategorikal
menjadi angka.
- factor(col): Mengubah kolom menjadi tipe faktor (kategori).
- as.numeric(…): Mengubah setiap level menjadi angka (mulai dari 1).
- Dikurangi 1 agar mulai dari 0.
{r} # Pastikan semua nama kolom lowercase colnames(health_data) <- tolower(colnames(health_data))
- Ini bertujuan untuk menyamakan format nama kolom, agar pencocokan nama kolom tidak gagal karena huruf besar/kecil.
{r} # Kolom target untuk encoding target_cols <- c(“year”, “location”, “health_condition”) available_cols <- intersect(target_cols, colnames(health_data))
- target_cols: Kolom-kolom yang ingin diencoding.
- intersect(…): Mengecek apakah ketiga kolom di atas benar-benar ada dalam dataset health_data.
{r} # Terapkan encoding ke kolom yang tersedia Label_Encoded <- health_data %>% mutate(across(all_of(available_cols), ~ label_enc(.), .names = “{.col}_label”))
- mutate(across(…)): Untuk setiap kolom dalam available_cols, lakukan label encoding menggunakan fungsi label_enc.
- **.names = “{.col}_label”**: Menambahkan suffix _label pada kolom hasil encoding, agar tidak menimpa kolom aslinya.
{r} # Tampilkan data hasil encoding DT::datatable(head(Label_Encoded), caption = “Label Encoded Columns”)
- Menampilkan 6 baris pertama dari hasil encoding menggunakan tabel interaktif.
year_label:karena factor(c(2020, 2021, 2022)) → 2020 = 1, 2021 = 2, 2022 = 3 → setelah -1 jadi 0,1,2.
contoh isi kolom location adalah:
“Jakarta”, “Bandung”, “Medan”
dan kamu menerapkan fungsi label_enc() seperti ini:
label_enc <- function(col) { as.numeric(factor(col)) - 1 }
Langkah Pengerjaan location_label
1. Buat factor
factor(c(“Jakarta”, “Bandung”, “Medan”))
Secara *default, R akan mengurutkan levelnya secara **alfabetis*:
Levels: Bandung Jakarta Medan
Jadi: - Bandung → level ke-1 - Jakarta → level ke-2 - Medan → level ke-3
2. Ubah ke numeric
as.numeric(factor(…))
Hasil: - Jakarta → 2
- Bandung → 1
- Medan → 3
3. Kurangi 1 agar mulai dari 0
as.numeric(factor(…)) - 1
Maka hasil encoding adalah: - Jakarta → 1 - Bandung → 0 - Medan → 2
Hasil Akhir location_label
location | location_label |
---|---|
Jakarta | 1 |
Bandung | 0 |
Medan | 2 |
Catatan Penting
Urutan angka *tidak mencerminkan urutan geografis atau logis, hanya
**urutan alfabet*: - Bandung = 0
- Jakarta = 1
- Medan = 2
Kalau kamu ingin mengatur urutannya secara manual (misalnya Medan = 0, Jakarta = 1, Bandung = 2), kamu bisa tulis:
factor(location, levels = c(“Medan”, “Jakarta”, “Bandung”))
Baik! Sekarang kita bahas langkah pengerjaan health_condition_label jika datanya berisi:
“Hypertension”, “Diabetes”, “Healthy”, “Obesity”
dan kamu gunakan fungsi:
label_enc <- function(col) { as.numeric(factor(col)) - 1 }
Langkah Pengerjaan health_condition_label
1. Buat factor
factor(c(“Hypertension”, “Diabetes”, “Healthy”, “Obesity”))
Secara *default, R akan mengurutkan level **secara alfabet*:
Levels: Diabetes Healthy Hypertension Obesity
Jadi urutannya: - Diabetes → level 1
- Healthy → level 2
- Hypertension → level 3
- Obesity → level 4
2. Ubah ke numeric
as.numeric(factor(…))
Hasilnya: - Hypertension → 3
- Diabetes → 1
- Healthy → 2
- Obesity → 4
3. Kurangi 1
as.numeric(factor(…)) - 1
Hasil akhir: - Hypertension → 2
- Diabetes → 0
- Healthy → 1
- Obesity → 3
Hasil Akhir health_condition_label
health_condition | health_condition_label |
---|---|
Hypertension | 2 |
Diabetes | 0 |
Healthy | 1 |
Obesity | 3 |
Kesimpulan
- Urutan label ditentukan oleh urutan alfabet kategori.
- Fungsi factor() akan otomatis mengurutkan: Diabetes < Healthy < Hypertension < Obesity.
Kalau kamu ingin urutan label berdasarkan logika kesehatan (misalnya: Healthy = 0, Diabetes = 1, Hypertension = 2, Obesity = 3), maka kamu atur level secara manual seperti ini:
factor(col, levels = c(“Healthy”, “Diabetes”, “Hypertension”, “Obesity”))
Kelebihan Label Encoding
- Cepat dan efisien: Ideal untuk dataset besar tanpa menambah jumlah kolom.
- Cocok untuk data ordinal (ada urutan), seperti rendah, sedang, tinggi.
Kekurangan Label Encoding
- *Urutan numerik bisa menyesatkan: Untuk data **nominal* (seperti location), angka bisa disalahartikan oleh model sebagai data berurutan.
- Bisa menyebabkan bias pada model regresi atau model yang sensitif terhadap skala nilai.
Tips Praktis
Gunakan Label Encoding untuk: - Data ordinal: Ada urutan logis → cocok. - Data *nominal: Hindari, atau gunakan **One-Hot Encoding* untuk menghindari asumsi urutan.
Kesimpulan:
Label Encoding merupakan metode sederhana dan efisien untuk mengubah variabel kategorikal menjadi numerik. Namun, penggunaannya harus hati-hati tergantung pada sifat data—apakah data tersebut memiliki urutan logis atau tidak.
4.3 Frequency Encoding
bagian ini melakukan frequency encoding terhadap kolom kategorik seperti year, location, dan health_condition. Proses ini mengubah kategori menjadi nilai proporsi frekuensi (antara 0 dan 1) berdasarkan seberapa sering kategori itu muncul dalam dataset.
Kelebihan:
Tidak menambah dimensi seperti one-hot encoding.
Menyimpan informasi distribusi kategori.
Efisien untuk dataset dengan banyak kategori unik.
Kekurangan:
Tidak cocok jika kategori dengan frekuensi yang sama memiliki makna berbeda.
Bisa memunculkan data leakage jika tidak dilakukan dengan hati-hati (misalnya saat digunakan sebelum data split).
Contoh Penggunaan dalam R:
{}
Fungsi frequency encoding
freq_enc <- function(col) { tab <- table(col) return(as.numeric(tab[col]) / length(col)) }
Pastikan kolom lowercase
colnames(health_data) <- tolower(colnames(health_data))
Kolom yang ingin di-encode
target_cols <- c(“year”, “location”, “health_condition”) available_cols <- intersect(target_cols, colnames(health_data))
Encoding frekuensi
Frequency <- health_data %>% mutate(across(all_of(available_cols), ~ freq_enc(.), .names = “{.col}_freq”))
Penjelasan Fungsi
Fungsi | Tujuan |
---|---|
table(col) | Menghitung jumlah kemunculan tiap kategori. |
as.numeric(tab[col]) / length(col) | Mengubah nilai kategori menjadi proporsi kemunculannya. |
across(…, .names = “{.col}_freq”) | Menambahkan nama kolom hasil encoding. |
Interpretasi Kesehatan:
Fitur Encoded | Makna |
---|---|
location_freq = 0.30 | Lokasi tersebut muncul sebanyak 30% dari total data. |
health_condition_freq = 0.10 | Kondisi kesehatan tersebut hanya muncul di 10% data. |
Hasil Output:
DT::datatable(Frequency, caption = “Frequency Encoding”)
Setelah encoding, dataset akan memiliki kolom baru, misalnya location_freq, health_condition_freq, dan year_freq, yang berisi proporsi kemunculan masing-masing kategori. Sebagai contoh, jika lokasi Bandung muncul pada 30% dari data, maka location_freq akan bernilai 0.30.
\[ \textbf{Frekuensi Relatif} = \frac{\text{Jumlah Kemunculan Kategori}}{\text{Total Baris Data}} \]
Langkah Pengerjaan Frequency Encoding:
*Tujuan: Mengubah kategori menjadi nilai numerik berdasarkan **frekuensi relatif kemunculannya* dalam dataset.
1. Kolom year
Data awal untuk year bisa saja berupa kategori seperti 2022, 2023, dsb. Untuk setiap nilai tahun, kita akan menghitung berapa kali masing-masing tahun muncul dalam dataset.
Misalnya, data year sebagai berikut:
year |
---|
2022 |
2022 |
2023 |
2022 |
2023 |
2023 |
- Jumlah total baris = 6
- 2022 muncul 3 kali, jadi frekuensi relatif = \(\frac{3}{6} = 0.5\)
- 2023 muncul 3 kali, jadi frekuensi relatif = \(\frac{3}{6} = 0.5\)
Output year_freq untuk setiap baris: | year | year_freq | |——|———–| | 2022 | 0.5 | | 2022 | 0.5 | | 2023 | 0.5 | | 2022 | 0.5 | | 2023 | 0.5 | | 2023 | 0.5 |
2. Kolom location
Untuk location, kita akan menghitung berapa kali masing-masing lokasi muncul dalam dataset. Data location bisa berupa kategori seperti Jakarta, Bandung, dan Medan.
Misalnya data location sebagai berikut:
location |
---|
Jakarta |
Bandung |
Medan |
Jakarta |
Medan |
Medan |
- Jumlah total baris = 6
- Jakarta muncul 2 kali, jadi frekuensi relatif = \(\frac{2}{6} \approx 0.333\)
- Bandung muncul 1 kali, jadi frekuensi relatif = \(\frac{1}{6} \approx 0.167\)
- Medan muncul 3 kali, jadi frekuensi relatif = \(\frac{3}{6} = 0.5\)
Output location_freq untuk setiap baris: | location | location_freq | |———-|—————| | Jakarta | 0.333 | | Bandung | 0.167 | | Medan | 0.5 | | Jakarta | 0.333 | | Medan | 0.5 | | Medan | 0.5 |
3. Kolom health_condition
Sekarang kita lakukan hal yang sama untuk kolom health_condition, yang bisa berisi kategori seperti *Hypertension, Diabetes, Healthy, dan **Obesity*.
Misalnya data health_condition sebagai berikut:
health_condition |
---|
Hypertension |
Diabetes |
Healthy |
Diabetes |
Healthy |
Obesity |
- Jumlah total baris = 6
- Hypertension muncul 1 kali, jadi frekuensi relatif = \(\frac{1}{6} \approx 0.167\)
- Diabetes muncul 2 kali, jadi frekuensi relatif = \(\frac{2}{6} \approx 0.333\)
- Healthy muncul 2 kali, jadi frekuensi relatif = \(\frac{2}{6} \approx 0.333\)
- Obesity muncul 1 kali, jadi frekuensi relatif = \(\frac{1}{6} \approx 0.167\)
Output health_condition_freq untuk setiap baris: | health_condition | health_condition_freq | |——————|———————–| | Hypertension | 0.167 | | Diabetes | 0.333 | | Healthy | 0.333 | | Diabetes | 0.333 | | Healthy | 0.333 | | Obesity | 0.167 |
Ringkasan Tabel Output Setelah Frequency Encoding
year | location | health_condition | year_freq | location_freq | health_condition_freq |
---|---|---|---|---|---|
2022 | Jakarta | Hypertension | 0.5 | 0.333 | 0.167 |
2022 | Bandung | Diabetes | 0.5 | 0.167 | 0.333 |
2023 | Medan | Healthy | 0.5 | 0.5 | 0.333 |
2022 | Jakarta | Diabetes | 0.5 | 0.333 | 0.333 |
2023 | Medan | Healthy | 0.5 | 0.5 | 0.333 |
2023 | Medan | Obesity | 0.5 | 0.5 | 0.167 |
Penjelasan Hasil
- year_freq: Semua nilai tahun memiliki frekuensi yang sama (0.5) karena 2022 dan 2023 masing-masing muncul 3 kali dari 6 total baris.
- **location_freq*: **Medan* muncul paling banyak, yaitu 3 kali (50% dari dataset), sedangkan Jakarta muncul 2 kali (33.3%), dan Bandung hanya muncul 1 kali (16.7%).
- **health_condition_freq*: **Diabetes* dan Healthy masing-masing muncul 2 kali (33.3%), sementara Hypertension dan Obesity masing-masing muncul 1 kali (16.7%).
Kesimpulan
- Frequency encoding mengubah kategori menjadi frekuensi relatif yang menggambarkan proporsi kemunculan masing-masing kategori.
- Ini bisa sangat berguna untuk model yang menggunakan nilai numerik dan lebih efisien daripada one-hot encoding, karena tidak menambah dimensi baru ke dalam dataset.
Hasil Transformasi
Kesimpulan:
Frequency encoding memberikan bobot proporsional terhadap kemunculan kategori.
Lebih ringan secara komputasi dibanding one-hot encoding, namun tetap menyimpan makna statistik dari data kategorik.
Cocok digunakan dalam model linear dan tree-based seperti Random Forest dan XGBoost.
5. Feature Engineering
Feature engineering adalah proses menciptakan fitur-fitur baru dari data yang ada untuk meningkatkan performa model machine learning. Salah satu teknik yang sering digunakan adalah interaction features, yaitu menggabungkan dua atau lebih fitur untuk membentuk fitur baru yang bisa menangkap hubungan nonlinier antar variabel.
5.1 Interaction Features
Interaction features dibuat dengan mengalikan atau menggabungkan dua fitur untuk merepresentasikan hubungan antara keduanya. Dalam kasus ini, dibuat fitur interaksi antara umur (age) dan BMI (Body Mass Index) untuk melihat dampak gabungan usia dan berat badan terhadap kesehatan.
Kegunaan:
Membantu model menangkap efek gabungan antar
Berguna dalam model linear yang tidak secara eksplisit menangkap interaksi antar fitur.
Contoh Kode R:
# Simpan nama kolom BMI ke variabel
bmi_col <- grep("bmi|imt", colnames(health_data), value = TRUE)[1]
# Buat interaksi antara age dan BMI
data_interaction <- health_data %>%
mutate(
Age_BMI_Impact = age * .data[[bmi_col]]
)
Penjelasan Fungsi
Langkah | Penjelasan |
---|---|
grep(“bmi | imt”, …) |
age * .data[[bmi_col]] | Mengalikan umur dan BMI untuk membuat fitur baru Age_BMI_Impact. |
mutate() | Menambahkan fitur baru ke dalam data. |
Interpretasi Kesehatan:
Fitur Age_BMI_Impact akan bernilai tinggi jika seseorang memiliki usia dan BMI yang sama-sama tinggi.
Dapat menunjukkan risiko kesehatan gabungan akibat usia lanjut dan berat badan berlebih.
Hasil Transformasi
Kesimpulan:
- Fitur interaksi berguna untuk mengungkap relasi tersembunyi antar variabel.
- Dalam kasus data kesehatan, interaksi antara usia dan BMI bisa menjadi indikator penting terhadap risiko penyakit kronis.
5.2 Ratio Features
Ratio features adalah fitur yang dibentuk dari perbandingan dua variabel numerik. Teknik ini sering digunakan untuk menormalkan data, menyoroti ketidakseimbangan, atau menangkap hubungan proporsional antar variabel.
Contoh Kasus:
Dalam data kesehatan, membandingkan kadar kolesterol terhadap kadar glukosa dapat memberikan insight tambahan tentang profil metabolik seseorang. Maka dibuat fitur baru: Cholesterol to Glucose Ratio.
Contoh Kode R:
data_ratio <- health_data %>%
mutate(
Cholesterol_Glucose_Ratio = cholesterol / (glucose + 1e-5)
)
Penjelasan Fungsi
Langkah | Penjelasan |
---|---|
cholesterol / (glucose + 1e-5) | Rasio antara kolesterol dan glukosa; penambahan 1e-5 mencegah pembagian dengan nol. |
mutate() | Menambahkan fitur rasio baru ke dalam data. |
Interpretasi Kesehatan:
Rasio yang tinggi bisa menunjukkan potensi risiko gangguan metabolik.
Berguna untuk menyaring individu dengan kolesterol tinggi tetapi kadar glukosa normal atau sebaliknya.
Hasil Transformasi
Kesimpulan:
- Ratio features memperkaya dataset dengan informasi proporsional.
- Dalam konteks medis, rasio ini membantu dalam mendeteksi ketidakseimbangan biokimia yang tidak terlihat dari nilai absolut saja.
5.3 Group Aggregation
Group aggregation adalah teknik untuk menghitung ringkasan statistik berdasarkan kelompok tertentu dalam data, misalnya berdasarkan ID pasien, lokasi, atau waktu. Teknik ini berguna untuk menciptakan fitur baru yang merangkum informasi historis atau berulang.
Contoh Kasus:
Pada dataset kesehatan, satu pasien bisa memiliki beberapa entri kunjungan. Maka kita bisa menghitung rata-rata dan maksimum kadar glukosa untuk tiap patient_id, serta jumlah kunjungan sebagai fitur tambahan.
Contoh Kode R:
# Aggregate by patient
patient_glucose <- health_data %>%
group_by(patient_id) %>%
summarise(
Avg_Glucose = mean(glucose, na.rm = TRUE),
Max_Glucose = max(glucose, na.rm = TRUE),
Visits = n(),
.groups = "drop"
)
# Join with original data
health_data_joined <- left_join(health_data, patient_glucose, by = "patient_id")
Langkah | Penjelasan |
---|---|
group_by(patient_id) | Mengelompokkan data berdasarkan ID pasien. |
summarise() | Menghitung nilai rata-rata, maksimum, dan jumlah kunjungan. |
left_join() | Menggabungkan hasil agregasi kembali ke data utama. |
Manfaat dalam Konteks Medis:
Avg_Glucose dan Max_Glucose mencerminkan kontrol gula darah pasien secara longitudinal.
Visits dapat menunjukkan frekuensi kontrol atau keparahan kondisi pasien.
Hasil Transformasi
Kesimpulan:
- Group aggregation menghasilkan fitur yang memperkaya data dengan informasi ringkasan per entitas.
- Cocok untuk data yang bersifat longitudinal, seperti rekam medis atau transaksi pelanggan.
5.4 Rank Transformation
Rank transformation adalah teknik untuk mengubah nilai numerik menjadi urutan berdasarkan posisi relatifnya dalam dataset. Ini berguna untuk mengidentifikasi posisi atau peringkat suatu entitas berdasarkan variabel tertentu tanpa memerlukan distribusi data yang spesifik.
Contoh Kasus:
Dalam dataset kesehatan, kita dapat mengurutkan kadar glukosa pasien dan memberi peringkat kepada mereka berdasarkan level glukosa, dengan pasien yang memiliki kadar glukosa tertinggi mendapat peringkat teratas.
Contoh Kode R:
data_ranked <- health_data %>%
mutate(
Glucose_Rank = rank(-glucose)
)
Penjelasan Fungsi
Langkah | Penjelasan |
---|---|
rank(-glucose) | Menghitung peringkat berdasarkan kadar glukosa, dengan tanda minus - untuk memberikan peringkat tertinggi pada nilai terbesar. |
Manfaat dalam Konteks Medis:
- Glucose_Rank memberikan gambaran tentang posisi relatif pasien berdasarkan kadar glukosa mereka. Ini berguna untuk memahami siapa yang berada dalam kelompok dengan kadar glukosa tertinggi atau terendah.
Hasil Transformasi
Kesimpulan:
Rank transformation cocok untuk analisis yang mengutamakan urutan daripada nilai absolut, seperti identifikasi pasien dengan kondisi paling kritis berdasarkan peringkat.
5.5 Text Cleaning & Feature Creation
Text cleaning dan pembuatan fitur dari teks adalah langkah penting dalam proses pembersihan data, khususnya ketika kita bekerja dengan data yang mengandung informasi dalam format teks yang tidak terstruktur. Salah satu langkah penting adalah mengekstraksi informasi relevan dari teks, seperti angka atau kata-kata kunci, untuk digunakan dalam analisis lebih lanjut.
Contoh Kasus:
Dalam dataset kesehatan, kolom patient_id mungkin mengandung angka dan karakter lain, yang mana kita bisa mengekstraksi angka saja untuk membuat fitur baru.
Contoh Kode R:
data_text <- health_data %>%
arrange(date) %>% # urutkan berdasarkan tanggal
mutate(
Patient_Num = row_number() # beri nomor urut 1 sampai 500 sesuai urutan tanggal
)
Penjelasan Fungsi
Memanggil paket dplyr yang digunakan untuk manipulasi data seperti menyaring (filter()), mengurutkan (arrange()), menambahkan kolom (mutate()), dsb.
Memanggil paket DT, yang memungkinkan Anda menampilkan data dalam bentuk tabel interaktif di R (misalnya untuk ditampilkan di R Markdown, Shiny, atau Viewer).
Menggunakan operator pipe (%>%) untuk meneruskan data health_data ke fungsi berikutnya secara berurutan. Ini membuat kode lebih mudah dibaca.
Mengurutkan seluruh baris data berdasarkan nilai dalam kolom date secara menaik (dari tanggal paling lama ke paling baru).Mengurutkan seluruh baris data berdasarkan nilai dalam kolom date secara menaik (dari tanggal paling lama ke paling baru).
mutate(): Menambahkan kolom baru ke dalam dataset.
row_number(): Memberi nomor urut 1 hingga n (dalam kasus ini 1 sampai 500) sesuai urutan baris saat ini (yang sudah diurutkan berdasarkan tanggal).
Hasilnya: Kolom baru Patient_Num muncul sebagai nomor pasien urut berdasarkan tanggal kunjungan.
Manfaat dalam Konteks Medis:
- Patient_Num memberikan nomor pasien dalam format numerik yang bisa digunakan untuk analisis lebih lanjut, seperti pengelompokan atau identifikasi pasien berdasarkan ID numerik.
Hasil Transformasi
Kesimpulan:
Langkah pembersihan teks ini membantu mengubah ID pasien yang mengandung karakter menjadi format yang lebih mudah untuk dianalisis, terutama saat ID pasien diperlukan dalam analisis statistik atau pembelajaran mesin.
5.6 Cumulative Features
Cumulative features mengacu pada fitur yang dihitung secara berurutan berdasarkan data yang terurut, seperti akumulasi nilai dari variabel tertentu sepanjang waktu. Cumulative features sering digunakan dalam analisis time series atau data yang bersifat kronologis, seperti penghitungan jumlah kumulatif dari suatu parameter kesehatan.
Contoh Kasus:
Dalam dataset kesehatan, kita dapat menghitung jumlah kumulatif kadar glukosa dari waktu ke waktu untuk setiap pasien, yang memberikan gambaran tentang perubahan tingkat glukosa sepanjang waktu.
Contoh Kode R:
# Pastikan kolom date dalam format Date
health_data$date <- as.Date(health_data$date)
# Tambahkan kolom Tahun
health_data <- health_data %>%
mutate(Year = year(date))
# Hitung glukosa kumulatif per pasien
data_cumulative <- health_data %>%
arrange(patient_id, date) %>%
group_by(patient_id) %>%
mutate(Cumulative_Glucose = cumsum(glucose)) %>%
ungroup()
# Kelompok umur
data_cumulative <- data_cumulative %>%
mutate(Age_Group = case_when(
age < 30 ~ "Muda",
age >= 30 & age < 59 ~ "Paruh Baya",
age >= 60 ~ "Lansia"
))
# Ambil nilai kumulatif terakhir per pasien + tahun terakhir
cumulative_by_patient <- data_cumulative %>%
group_by(patient_id) %>%
slice_tail(n = 1) %>%
ungroup() %>%
mutate(
Diabetes_Indicator = case_when(
Cumulative_Glucose > 600 & grepl("diabetes|glucose", tolower(health_condition)) ~ "Terindikasi Diabetes",
Cumulative_Glucose > 600 ~ "Risiko Glukosa Tinggi",
grepl("diabetes", tolower(health_condition)) ~ "Riwayat Diabetes",
TRUE ~ "Normal"
)
) %>%
select(patient_id, Year, age, Age_Group, Cumulative_Glucose, health_condition, Diabetes_Indicator) %>%
arrange(Year) # Urutkan berdasarkan tahun
# Tampilkan seluruh data (500 pasien)
datatable(cumulative_by_patient,
caption = "Analisis Risiko Diabetes 2020–2024 Berdasarkan Tahun, Usia, dan Kondisi",
Penjelasan Fungsi
as.Date()
: Mengubah data tanggal agar bisa diurutkan secara waktu.mutate(Year = year(date))
: Menambahkan kolom tahun.arrange()
dangroup_by()
: Mengelompokkan dan mengurutkan data per pasien untuk menghitung kumulatif.cumsum()
: Menghitung jumlah kumulatif glukosa per pasien.case_when()
: Mengelompokkan usia (muda, paruh baya, lansia) dan menentukan indikator risiko diabetes.slice_tail(n = 1)
: Mengambil data terakhir per pasien.datatable()
: Menampilkan tabel interaktif.
Fungsinya adalah untuk melacak perkembangan glukosa per pasien, mengelompokkan berdasarkan usia dan kondisi kesehatan, dan mengidentifikasi potensi risiko diabetes.
Manfaat dalam Konteks Medis:
- Cumulative_Glucose memberikan informasi mengenai akumulasi kadar glukosa pasien sepanjang waktu, yang bisa digunakan untuk memahami perubahan pola glukosa, mengidentifikasi tren, dan mendeteksi kemungkinan masalah kesehatan.
Hasil Transformasi
Kesimpulan Kumulatif Glukosa Pasien (2020–2024)
Mayoritas pasien menunjukkan nilai kumulatif glukosa yang berada dalam batas normal, menandakan bahwa sebagian besar populasi data tidak mengalami lonjakan signifikan kadar gula darah dalam kurun waktu yang dianalisis.
Indikasi diabetes ditemukan pada sejumlah pasien dengan kombinasi berikut:
- Cumulative Glucose > 600 mg/dL
- Diagnosis kondisi kesehatan mencakup kata kunci seperti “diabetes” atau “glucose intolerance”.
- Kelompok usia paling sering terindikasi: Paruh Baya (30–59 tahun) dan Lansia (≥ 60 tahun).
Pasien muda (< 30 tahun) meskipun memiliki nilai glukosa tinggi dalam beberapa kasus, jarang menunjukkan indikasi diabetes, kecuali jika disertai riwayat kesehatan yang mendukung (misalnya “Type 1 diabetes”).
Penyakit atau kondisi yang paling sering berkorelasi dengan glukosa kumulatif tinggi antara lain:
- Diabetes Tipe 2
- Hiperglikemia
- Metabolic syndrome
Tren tahunan (2020–2024) menunjukkan bahwa kasus dengan kumulatif glukosa tinggi tidak terbatas pada satu tahun tertentu, namun konsisten muncul di setiap tahun, menandakan pentingnya pemantauan kadar glukosa jangka panjang, terutama pada pasien usia menengah dan lanjut.
Rekomendasi Awal Berdasarkan Temuan
Screening rutin glukosa sangat penting untuk pasien berusia 30 tahun ke atas.
Pasien dengan riwayat keluarga diabetes atau peningkatan bertahap kumulatif glukosa perlu mendapat perhatian lebih lanjut, meskipun belum terdiagnosis secara formal.
Integrasi analisis usia + glukosa + kondisi kesehatan sangat membantu dalam membentuk peta risiko individual terhadap diabetes.
6. Outlier Handling
Dalam analisis data, outlier atau data yang menyimpang jauh dari pola umum dapat mempengaruhi hasil analisis dan model. Oleh karena itu, penting untuk mendeteksi dan menangani outlier dengan tepat. Beberapa metode yang umum digunakan untuk mendeteksi outlier antara lain Z-score dan Interquartile Range (IQR).
Contoh Kasus:
Pada dataset kesehatan ini, kita akan menggunakan dua metode untuk mendeteksi dan menangani outlier:
Z-score untuk mendeteksi outlier pada kadar glukosa.
IQR untuk mendeteksi outlier pada indeks massa tubuh (BMI).
Contoh Kode R:
# Ensure all column names are lowercase
colnames(health_data) <- tolower(colnames(health_data))
# Get the exact name of glucose and BMI columns
glucose_col <- grep("glukosa|glucose", colnames(health_data), value = TRUE)[1]
bmi_col <- grep("imt|bmi", colnames(health_data), value = TRUE)[1]
# Z-score method for outlier detection (using Glucose)
z_scores <- scale(health_data[[glucose_col]])
data_outliers <- health_data %>%
mutate(
Outlier_Flag = ifelse(abs(z_scores) > 3, "Outlier", "Normal")
)
# IQR method for outlier removal (using BMI)
Q1 <- quantile(health_data[[bmi_col]], 0.25, na.rm = TRUE)
Q3 <- quantile(health_data[[bmi_col]], 0.75, na.rm = TRUE)
IQR_val <- Q3 - Q1
data_outliers_IQR <- health_data %>%
filter(
.data[[bmi_col]] > (Q1 - 1.5 * IQR_val) &
.data[[bmi_col]] < (Q3 + 1.5 * IQR_val)
)
Metode Z-Score untuk Deteksi Outlier:
Z-score digunakan untuk mendeteksi seberapa jauh suatu nilai dari rata-rata dalam satuan deviasi standar. Dalam kasus ini, kita menghitung Z-score untuk kadar glukosa, dan jika Z-score lebih besar dari 3 atau lebih kecil dari -3, nilai tersebut dianggap sebagai outlier.
Langkah | Penjelasan |
---|---|
scale(health_data[[glucose_col]]) | Menghitung Z-score untuk kadar glukosa. |
ifelse(abs(z_scores) > 3, “Outlier”, “Normal”) | Menandai nilai yang memiliki Z-score lebih dari 3 atau kurang dari -3 sebagai outlier. |
Metode IQR untuk Penghapusan Outlier:
Metode IQR menghitung rentang interkuartil (IQR) yang merupakan selisih antara kuartil ketiga (Q3) dan kuartil pertama (Q1). Nilai yang berada di luar rentang [Q1 - 1.5 IQR, Q3 + 1.5 IQR] dianggap sebagai outlier.
Langkah | Penjelasan |
---|---|
quantile(health_data[[bmi_col]], 0.25) | Menghitung kuartil pertama (Q1) dari data BMI. |
quantile(health_data[[bmi_col]], 0.75) | Menghitung kuartil ketiga (Q3) dari data BMI. |
filter(.data[[bmi_col]] > (Q1 - 1.5 * IQR_val) & .data[[bmi_col]] < (Q3 + 1.5 * IQR_val)) | Menyaring data BMI untuk menghapus nilai-nilai outlier di luar rentang IQR. |
Manfaat Mengelola Outlier:
- Deteksi Dini: Mengidentifikasi outlier dengan metode yang tepat memungkinkan pemahaman yang lebih baik tentang data dan membantu mendeteksi masalah dalam pengukuran atau kondisi yang tidak biasa.
- Modeling: Menghapus atau menangani outlier dapat meningkatkan kinerja model prediktif dengan menghindari distorsi yang dapat disebabkan oleh data yang ekstrem.
Hasil Transformasi
Kesimpulan:
- Dengan menggunakan metode Z-score dan IQR, kita dapat mendeteksi dan menangani outlier pada data kesehatan untuk memastikan bahwa analisis dan model yang dibangun lebih akurat dan representatif terhadap data asli.
7. Discretization
Discretization adalah proses mengubah variabel kontinu menjadi kategori atau interval. Hal ini sering dilakukan untuk meningkatkan pemahaman atau interpretasi data, serta memudahkan penerapan model klasifikasi. Salah satu contoh yang umum adalah mengubah usia menjadi kategori seperti “Muda”, “Paruh Baya”, dan “Tua”.
Contoh Kasus:
Pada dataset kesehatan ini, kita akan mendiskretisasikan kolom usia menjadi tiga kategori: 1. Young (Muda) 2. Middle-aged (Paruh Baya) 3. Old (Tua)
Kategori ini akan didasarkan pada pembagian kuantil data usia.
Contoh Kode R:
Penjelasan:
cut(age, breaks = quantile(age, probs = c(0, 0.33, 0.66, 1), na.rm = TRUE)) digunakan untuk membagi usia berdasarkan kuantil.
0-33% usia pertama akan digolongkan ke dalam kategori “Young” (Muda).
34-66% usia kedua akan digolongkan ke dalam kategori “Middle-aged” (Paruh Baya).
67-100% usia ketiga akan digolongkan ke dalam kategori “Old” (Tua).
Fungsi cut() ini juga memberikan label pada setiap kategori, sehingga memudahkan interpretasi data.
Manfaat Discretization:
- Penyederhanaan Model: Dengan mengubah variabel kontinu menjadi kategori, kita dapat mengurangi kompleksitas model dan memudahkan interpretasi.
- Memperbaiki Model Klasifikasi: Kategorisasi dapat meningkatkan kinerja model klasifikasi, terutama jika data kontinu memiliki distribusi yang sangat miring atau tidak normal.
Hasil Transformasi
library(dplyr)
library(DT)
# Make sure column names are lowercase
colnames(health_data) <- tolower(colnames(health_data))
# Convert 'age' to numeric (if not already)
health_data <- health_data %>%
mutate(usia = as.numeric(age))
# Binning 'age' into age categories
binning <- health_data %>%
mutate(
age_level = cut(
age,
breaks = quantile(age, probs = c(0, 0.33, 0.66, 1), na.rm = TRUE),
labels = c("Young", "Middle-aged", "Old"),
include.lowest = TRUE
)
)
# Show results in a datatable
DT::datatable(binning, caption = "Binning Age into Categories")
Distribusi Hasil Discretization
Setelah membagi kolom usia menjadi tiga kategori menggunakan kuantil (0–33%, 34–66%, 67–100%), didapatkan distribusi sebagai berikut:
- Young: 173 orang
- Middle-aged: 168 orang
- Old: 159 orang
Ini menunjukkan bahwa pembagian berdasarkan kuantil menghasilkan kelompok yang relatif seimbang secara jumlah.
{r, echo=FALSE, message=FALSE, warning=FALSE} # Hitung kuantil dan jumlah kategori usia breaks <- quantile(health_data$Age, probs = c(0, 0.33, 0.66, 1), na.rm = TRUE) health_data <- health_data %>% mutate( age_level = cut( Age, breaks = breaks, labels = c(“Young”, “Middle-aged”, “Old”), include.lowest = TRUE ) )
Hitung jumlah per kategori
table(health_data$age_level)
Kesimpulan:
Discretization dapat bermanfaat untuk mempermudah pemahaman dan analisis data, terutama dalam kasus di mana hubungan antara variabel kontinu dan hasil yang diinginkan tidak linier atau sulit untuk dimodelkan secara langsung.
8. Seasonality
Seasonality atau musiman adalah pola yang muncul secara periodik dalam data yang terkait dengan waktu, seperti pola tahunan, bulanan, atau mingguan. Fitur seasonality sangat penting dalam analisis data time series untuk memahami fluktuasi yang terkait dengan perubahan musiman dalam tahun.
Pada dataset ini, kita akan membuat fitur musiman berdasarkan informasi tanggal untuk menangkap pola tahunan.
Contoh Kasus:
Untuk memodelkan seasonality dalam dataset kesehatan ini, kita akan menambahkan fitur-fitur berikut: - Tahun (Year)
Hari dalam Tahun (Day of Year)
Fungsi Sinus dan Cosinus untuk mengubah data musiman ke dalam format numerik yang dapat digunakan oleh model machine learning.
Contoh Kode R:
Penjelasan:
Tahun (Year): Menyimpan informasi tahun dari kolom tanggal.
Hari dalam Tahun (Day of Year): Menghitung hari ke-berapa dalam tahun tersebut.
Sinus dan Cosinus (sin_year dan cos_year): Mengonversi hari dalam tahun menjadi nilai sinus dan cosinus untuk menangkap sifat musiman dalam bentuk numerik. Ini adalah teknik umum untuk menghindari masalah dengan model yang tidak dapat menangani data musiman yang bersifat siklis.
Manfaat Seasonality:
- Memahami Pola Musiman: Fitur musiman dapat membantu dalam memprediksi pola yang berulang, seperti fluktuasi kesehatan pada periode tertentu dalam setahun.
- Peningkatan Akurasi Model: Dengan memasukkan informasi musiman dalam model, kita dapat meningkatkan kemampuan prediksi terutama untuk data time series.
Hasil Transformasi
library(dplyr)
library(lubridate)
library(DT)
# Ensure lowercase column names
colnames(health_data) <- tolower(colnames(health_data))
# Try to find the column that represents the date
date_col <- grep("tanggal|date", colnames(health_data), value = TRUE)[1]
# Convert the column to Date type if not already
health_data[[date_col]] <- as.Date(health_data[[date_col]])
# Create seasonality features
seasonality <- health_data %>%
mutate(
year = year(.data[[date_col]]),
day_of_year = yday(.data[[date_col]]),
days_in_year = if_else(leap_year(.data[[date_col]]), 366, 365),
sin_year = sin(2 * pi * day_of_year / days_in_year),
cos_year = cos(2 * pi * day_of_year / days_in_year)
)
# Display the result
DT::datatable(seasonality, caption = "Seasonality Features Based on Date", options = list(pageLength = 10))
Kesimpulan:
Fitur seasonality sangat berguna dalam dataset dengan komponen waktu yang mempengaruhi hasil, seperti kesehatan yang dapat dipengaruhi oleh perubahan musiman. Dengan menggunakan fitur-fitur musiman, seperti sin dan cos agar model machine learning bisa memahami bahwa tanggal 31 Desember dan 1 Januari itu dekat meskipun secara numerik jauh.jadi, model dapat lebih efektif dalam menangkap pola yang terkait dengan perubahan musiman dan meningkatkan akurasi prediksi.