Kebakaran hutan terjadi secara tidak terencana dan tidak terkendali dan dapat terjadi oleh petir atau kelalaian manusia di hutan, padang rumput, atau semak-semak (Government of Canada, 2020). Sebagian besar kebakaran hutan disebabkan oleh manusia, namun iklim kering, suhu panas, petir, dan letusan gunung berapi juga dapat menyebabkan kejadian tersebut (National Park Service, 2018). Dekade terakhir perubahan iklim hanya memperparah jumlah kebakaran hutan, menyebabkan kejadian yang lebih sering dan ekstrem.
Badan penanggulangan kebakaran hutan menggunakan banyak variabel untuk menunjukkan kebakaran hutan yang akan terjadi dan evolusi dari machine learning telah memberikan kita kemampuan untuk memprediksi kejadian masa depan dengan menganalisis variabel-variabel ini. Oleh karena itu, dengan mengajukan pertanyaan prediktif: apakah variabel tertentu memungkinkan kita untuk menentukan apakah kebakaran hutan telah atau akan terjadi dan jika ya, seberapa akurat mereka akan terjadi?
Untuk mendukung hipotesis tersebut, saya menggunakan dataset tentang Kebakaran Hutan Algeria dari UCI dataset. Dataset ini berisi kumpulan observasi kebakaran hutan dan data di dua wilayah Algeria: wilayah Bejaia dan wilayah Sidi Bel-Abbes. Rentang waktu dataset ini adalah dari Juni 2012 hingga September 2012 (Tanggal: (DD/MM/YYYY) Hari, bulan (‘juni’ hingga ‘september’), tahun (2012)).
Dalam proyek ini, saya berfokus pada apakah karakteristik cuaca tertentu dapat memprediksi kebakaran hutan di wilayah-wilayah ini menggunakan algoritma Klasifikasi berbagai macam metode pohon keputusan dan kemudian, saya mengevaluasi akurasi modelnya.
#> Reading layer `algeria-with-regions_1411' from data source
#> `C:\Users\irvan\OneDrive\Desktop\Algoritma\Project\Rpart_DT_forest_fire\algeria_administrative\algeria-with-regions_1411.geojson'
#> using driver `GeoJSON'
#> Simple feature collection with 58 features and 1 field
#> Geometry type: MULTIPOLYGON
#> Dimension: XY
#> Bounding box: xmin: -8.668908 ymin: 18.96815 xmax: 11.99734 ymax: 37.08985
#> Geodetic CRS: WGS 84
Algeria: wilayah Bejaia dan wilayah Sidi Bel-Abbes
#> [1] "أدرار" "الشلف" "الأغواط" "أم البواقي"
#> [5] "باتنة" "بجاية" "بسكرة" "بشار"
#> [9] "البليدة" "البويرة" "تمنراست" "تبسة"
#> [13] "تلمسان" "تيارت" "تيزي وزو" "الجزائر"
#> [17] "الجلفة" "جيجل" "سطيف" "سعيدة"
#> [21] "سكيكدة" "سيدي بلعباس" "عنابة" "قالمة"
#> [25] "قسنطينة" "المدية" "مستغانم" "المسيلة"
#> [29] "معسكر" "ورقلة" "وهران" "البيض"
#> [33] "اليزي" "برج بوعريريج" "بومرداس" "الطارف"
#> [37] "تندوف" "تسمسيلت" "الوادي" "خنشلة"
#> [41] "سوق أهراس" "تيبازة" "ميلة" "عين الدفلى"
#> [45] "النعامة" "عين تموشنت" "غرداية" "غليزان"
#> [49] "المغير" "المنيعة" "أولاد جلال" "برج باجي مختار"
#> [53] "بني عباس" "تيميمون" "تقرت" "جانت"
#> [57] "عين صالح" "عين قزّام"
Dari daftar yang diberikan, “بجاية” adalah Bejaia dan “سيدي بلعباس” adalah Sidi Bel-Abbes.
Disini saya menggunakan beragam pustaka dalam bahasa pemrograman R untuk melakukan analisis dan pemodelan data untuk menjawab permasalahan yang ada. Menitikberatkan perbandingan antara berbagai library yang berbeda dalam proyek berbasis Decision Tree ini memiliki beberapa alasan yang mendasar:
Perbandingan Performa: Setiap library atau paket memiliki keunggulan dan kelemahan tersendiri dalam implementasi algoritma Decision Tree. Melakukan perbandingan akan membantu kita memahami mana yang lebih cocok untuk kasus tertentu, serta melihat performa relatif dari masing-masing library.
Kemampuan dan Fitur Tambahan: Beberapa library mungkin memiliki fitur tambahan atau pendekatan yang unik dalam membangun pohon keputusan. Melalui perbandingan, kita dapat mengeksplorasi fitur-fitur tambahan ini dan menentukan apakah itu relevan atau tidak dengan kebutuhan proyek.
Ketersediaan dan Dukungan: Ketersediaan library dan tingkat dukungan komunitasnya juga merupakan faktor penting. Library yang lebih populer atau aktif dikembangkan mungkin memiliki dokumentasi yang lebih baik, pembaruan terkini, dan komunitas yang lebih besar untuk mendukung pemecahan masalah.
Konteks Proyek: Tidak ada satu ukuran yang cocok untuk semua dalam pemodelan data. Konteks proyek, karakteristik data, dan tujuan analisis dapat mempengaruhi pilihan library yang paling sesuai. Melalui perbandingan, kita dapat menyesuaikan pilihan dengan kebutuhan spesifik proyek.
Pemahaman Algoritma: Melakukan perbandingan antara library juga membantu dalam pemahaman yang lebih baik tentang algoritma Decision Tree itu sendiri. Membandingkan implementasi yang berbeda dapat membantu kita memahami detail dan mekanisme di balik algoritma tersebut.
Dengan mempertimbangkan semua faktor ini, melakukan perbandingan antara berbagai library dalam proyek Decision Tree dapat membantu dalam membuat keputusan yang lebih terinformasi dan memastikan bahwa kita memanfaatkan alat yang paling efektif dan efisien untuk tujuan analisis data yang spesifik.
Berikut adalah perbandingan antara beberapa algoritma pohon keputusan
yang umum digunakan dalam lingkungan R, yaitu rpart,
party, C5.0, dan caret:
rpart adalah salah satu paket yang sering digunakan
dalam R untuk membuat model pohon keputusan.party menyediakan algoritma pohon keputusan lain
dalam lingkungan R.C5.0 adalah algoritma pembelajaran mesin yang
dikembangkan oleh Ross Quinlan.C50 yang menawarkan antarmuka ke algoritma C5.0. link.caret (Classification And REgression
Training) menyediakan antarmuka yang seragam untuk berbagai
algoritma pembelajaran mesin, termasuk pohon keputusan.Pemilihan algoritma pohon keputusan yang tepat tergantung pada karakteristik data, seperti jenis variabel, kompleksitas interaksi antar variabel, dan tujuan analisis (klasifikasi atau regresi).
# Pengolahan data dan pemodelan
library(dplyr)
library(tidyverse)
library(rsample)
# Pemodelan
library(rpart)
library(rpart.plot)
library(C50)
# Evaluasi model
library(caret)
library(MLmetrics)
library(tidymodels)
# Visualisasi Data
library(ggplot2)
library(GGally)
library(cowplot)
library(repr)
library(rattle)
library(rpart.plot)
library(inspectdf) # for EDA
set.seed(123)Dataset Kebakaran Hutan Algeria dibaca menggunakan fungsi
read_csv.
rawdata <- read.csv('https://archive.ics.uci.edu/ml/machine-learning-databases/00547/Algerian_forest_fires_dataset_UPDATE.csv', skip = 1)
rawdataDalam proyek yang saya lakukan ini, saya menggunakan dataset yang merupakan gabungan dari dua wilayah yang berbeda. Pada file CSV dataset ini, kolom-kolomnya sudah dibedakan berdasarkan wilayahnya. Namun, terdapat redundansi dalam judul kolom pada dataset kedua, yang sebenarnya menyebabkan duplikasi informasi. Untuk menghindari kebingungan dan mempermudah analisis, saya memutuskan untuk menghapus judul kolom pada dataset kedua dan menggabungkan dataset tersebut menjadi satu kesatuan.
Dengan menghapus judul kolom yang redundan, saya dapat menyederhanakan struktur dataset dan membuatnya lebih mudah dipahami. Langkah ini juga akan membantu saya dalam proses analisis data karena saya akan memiliki satu set data yang lebih bersih dan konsisten. Dengan demikian, langkah ini akan mempermudah proses pengolahan dan interpretasi data secara keseluruhan, serta meminimalkan kemungkinan kesalahan yang terjadi akibat duplikasi informasi.
Tabel 1: Tabel Kebakaran Hutan di Aljazair (sebelum cleansing)
Dalam proses pembuatan klasifikasi untuk memprediksi kebakaran atau
tidak, keberadaan variabel tanggal seperti kolom day,
month, year tidak selalu diperlukan secara
langsung untuk tujuan prediksi. Variabel tanggal umumnya tidak
memberikan informasi langsung tentang apakah kebakaran akan terjadi atau
tidak, kecuali jika terdapat hubungan temporal yang sangat spesifik
antara waktu dan kejadian kebakaran.
Namun demikian, variabel tanggal mungkin dapat memberikan informasi tambahan yang berguna melalui fitur rekayasa (feature engineering). Misalnya, variabel tanggal dapat diubah menjadi fitur tambahan seperti musim atau waktu dalam bentuk tertentu yang dapat mempengaruhi kemungkinan kebakaran, seperti musim panas atau musim hujan.
Sebelum menghapus variabel tanggal sepenuhnya, penting untuk melakukan analisis lebih lanjut atau eksplorasi data untuk memastikan apakah informasi apa pun dari tanggal dapat digunakan untuk meningkatkan kinerja model prediksi. Namun, dalam banyak kasus, variabel tanggal tidak secara langsung berkontribusi terhadap prediksi kebakaran dan mungkin tidak diperlukan dalam model klasifikasi tersebut. Sehingga saya memutuskan untuk tidak mengikutsertakannya, kembali lagi ketujuan awal saya yang ingin memprediksi kebakaran atau tidak berdasarkan murni dari faktor karakteristik cuaca.
#> day month year Temperature RH Ws
#> 0 0 0 0 0 0
#> Rain FFMC DMC DC ISI BUI
#> 0 0 0 0 0 0
#> FWI Classes
#> 0 0
Tidak terdapat nilai missing pada setiap kolom
#> Rows: 244
#> Columns: 14
#> $ day <chr> "01", "02", "03", "04", "05", "06", "07", "08", "09", "10"…
#> $ month <chr> "06", "06", "06", "06", "06", "06", "06", "06", "06", "06"…
#> $ year <chr> "2012", "2012", "2012", "2012", "2012", "2012", "2012", "2…
#> $ Temperature <chr> "29", "29", "26", "25", "27", "31", "33", "30", "25", "28"…
#> $ RH <chr> "57", "61", "82", "89", "77", "67", "54", "73", "88", "79"…
#> $ Ws <chr> "18", "13", "22", "13", "16", "14", "13", "15", "13", "12"…
#> $ Rain <chr> "0", "1.3", "13.1", "2.5", "0", "0", "0", "0", "0.2", "0",…
#> $ FFMC <chr> "65.7", "64.4", "47.1", "28.6", "64.8", "82.6", "88.2", "8…
#> $ DMC <chr> "3.4", "4.1", "2.5", "1.3", "3", "5.8", "9.9", "12.1", "7.…
#> $ DC <chr> "7.6", "7.6", "7.1", "6.9", "14.2", "22.2", "30.5", "38.3"…
#> $ ISI <chr> "1.3", "1", "0.3", "0", "1.2", "3.1", "6.4", "5.6", "0.4",…
#> $ BUI <chr> "3.4", "3.9", "2.7", "1.7", "3.9", "7", "10.9", "13.5", "1…
#> $ FWI <chr> "0.5", "0.4", "0.1", "0", "0.5", "2.5", "7.2", "7.1", "0.3…
#> $ Classes <chr> "not fire ", "not fire ", "not fire ", "not fire "…
Karakteristik cuaca pada dataset:
Temperature (Suhu): Merupakan suhu maksimum pada siang
hari dalam derajat Celsius, dengan rentang nilai antara 22 hingga 42.
Suhu ini menggambarkan tingkat panas yang dapat mempengaruhi potensi
kebakaran hutan.RH (Kelembaban Relatif): Persentase kelembaban udara
relatif dalam rentang 21 hingga 90 persen. Kelembaban udara mempengaruhi
ketersediaan air dalam material pembakar dan dapat memengaruhi potensi
kebakaran hutan.Ws (Kecepatan Angin): Kecepatan angin dalam kilometer
per jam, dengan rentang dari 6 hingga 29 km/jam. Angin yang kuat dapat
mempercepat penyebaran api pada kebakaran hutan.Rain (Curah Hujan): Jumlah curah hujan dalam milimeter
selama satu hari. Curah hujan dapat mempengaruhi tingkat kelembaban dan
potensi kebakaran hutan. rentang nilai 0 - 16.8 total hujan dalam
mm.Fine Fuel Moisture Code (FFMC) (Indeks Kadar Air
Material Bakar Halus): Indeks dari sistem FWI yang mencerminkan
kekeringan dan kemampuan material bakar halus untuk terbakar. Rentang
nilainya adalah 28.6 hingga 92.5.Duff Moisture Code (DMC) (Indeks Kadar Air Lapisan
Tanduk): Indeks dari sistem FWI yang menilai kekeringan lapisan tanduk
dan kemungkinan material bakar menyerap kelembaban. Rentang nilainya
adalah 1.1 hingga 65.9.Drought Code (DC) (Indeks Kekeringan): Indeks dari
sistem FWI yang menggambarkan kekeringan permukaan tanah. Nilainya
berkisar dari 7 hingga 220.4.Initial Spread Index (ISI) (Indeks Penyebaran Awal):
Indeks dari sistem FWI yang menunjukkan kecepatan dan intensitas
penyebaran api setelah terjadi kebakaran. Rentang nilainya adalah 0
hingga 18.5.Buildup Index (BUI) (Indeks Pembangunan): Indeks dari
sistem FWI yang menggambarkan akumulasi material bakar yang tersedia
untuk terbakar. Rentang nilainya adalah 1.1 hingga 68.Fire Weather Index (FWI) (Indeks Cuaca Kebakaran):
Indeks gabungan dari sistem FWI yang mencakup faktor-faktor seperti
kekeringan, kelembaban, dan kecepatan angin yang mempengaruhi potensi
kebakaran hutan.Classes (Kelas): Terdiri dari dua kelas, yaitu
“fire” (kebakaran) dan “not fire”
(bukan kebakaran), yang merupakan target prediksi dalam analisis
kebakaran hutan.Dataset ini merupakan kumpulan data pengamatan dan informasi kebakaran hutan yang terjadi di dua wilayah di Aljazair: wilayah Bejaia dan wilayah Sidi Bel-Abbes.
Tahapan membuang kolom yang tidak digunakan dan melakukan perubahan tipedata yang sesuai.
forest_fire <- rawdata %>%
select(-day, -month, -year) %>%
mutate(across(-Classes, as.numeric),
Classes = as.factor(Classes))
forest_fire#> [1] not fire fire fire fire not fire
#> [6] not fire not fire not fire
#> 9 Levels: fire fire fire not fire not fire not fire ... not fire
Kondisi kolom target seharusnya hanya memiliki dua level (“fire” dan “not fire”), tetapi dalam kenyataannya memiliki lebih dari dua level yang ternyata saat dicek terdapat spasi pada teks.
Pada tahapan berikut, saya memastikan bahwa kolom target memiliki dua level yang diharapkan, yang akan meningkatkan keakuratan dan keandalan model klasifikasi.
forest_fire$Classes <- trimws(forest_fire$Classes)
forest_fire$Classes[grepl("^not", forest_fire$Classes)] <- "not fire"
forest_fire$Classes[grepl("^fire", forest_fire$Classes)] <- "fire"# mengambil index baris yang target kelasnya kosong/ " "
index_spasi <- which(!(forest_fire$Classes %in% c("fire", "not fire")))
forest_fire <- forest_fire[-index_spasi,]# ubah classes jadi factor
forest_fire <- forest_fire %>%
mutate(Classes = as.factor(Classes))
unique(forest_fire$Classes)#> [1] not fire fire
#> Levels: fire not fire
# Hapus baris-baris yang memiliki nilai yang hilang menggunakan
# forest_fire <- na.omit(forest_fire)
# colSums(is.na(forest_fire))#> [1] 2
#> Temperature RH Ws Rain
#> Min. :22.00 Min. :21.00 Min. : 6.00 Min. : 0.000
#> 1st Qu.:30.00 1st Qu.:52.50 1st Qu.:14.00 1st Qu.: 0.000
#> Median :32.00 Median :63.00 Median :15.00 Median : 0.000
#> Mean :32.15 Mean :62.04 Mean :15.49 Mean : 0.763
#> 3rd Qu.:35.00 3rd Qu.:73.50 3rd Qu.:17.00 3rd Qu.: 0.500
#> Max. :42.00 Max. :90.00 Max. :29.00 Max. :16.800
#> FFMC DMC DC ISI
#> Min. :28.60 Min. : 0.70 Min. : 6.90 Min. : 0.000
#> 1st Qu.:71.85 1st Qu.: 5.80 1st Qu.: 12.35 1st Qu.: 1.400
#> Median :83.30 Median :11.30 Median : 33.10 Median : 3.500
#> Mean :77.84 Mean :14.68 Mean : 49.43 Mean : 4.742
#> 3rd Qu.:88.30 3rd Qu.:20.80 3rd Qu.: 69.10 3rd Qu.: 7.250
#> Max. :96.00 Max. :65.90 Max. :220.40 Max. :19.000
#> BUI FWI Classes
#> Min. : 1.10 Min. : 0.000 fire :137
#> 1st Qu.: 6.00 1st Qu.: 0.700 not fire:106
#> Median :12.40 Median : 4.200
#> Mean :16.69 Mean : 7.035
#> 3rd Qu.:22.65 3rd Qu.:11.450
#> Max. :68.00 Max. :31.100
Tabel 2: Tabel Kebakaran Hutan di Aljazair (sesudah cleansing)
Korelasi antara variabel-variabel dalam dataset dievaluasi
menggunakan fungsi chart.Correlation untuk memahami
hubungan antara variabel-variabel dan memilih yang paling relevan untuk
analisis lebih lanjut. Meskipun Decision Tree tidak bergantung pada
asumsi korelasi linear seperti regresi, memahami korelasi antar variabel
tetap penting untuk mengevaluasi potensi korelasi yang tinggi yang dapat
mempengaruhi kinerja model secara keseluruhan.
Meskipun Decision Tree tidak terlalu bergantung pada korelasi antar-variabel seperti model lainnya, pemahaman korelasi antara variabel-variabel dapat membantu dalam pemilihan fitur dan pemahaman tentang struktur data secara keseluruhan. Dengan memilih variabel yang paling relevan, dapat meningkatkan interpretasi model dan mengurangi kompleksitasnya. Oleh karena itu, memeriksa korelasi tetap dapat menjadi langkah yang berguna dalam proses pembangunan model Decision Tree.
Berikut adalah visualisasi korelasi antar variabel menggunakan
chart.Correlation:
library(PerformanceAnalytics)
chart.Correlation(forest_fire[,-11],
histogram=TRUE,
col="grey10", pch=1)
Plot
chart.Correlation diatas merupakan representasi visual
dari matriks korelasi antar variabel (numerik) dalam dataset. Setiap sel
pada matriks menunjukkan korelasi antara dua variabel yang sesuai.
Interpretasi plot chart.Correlation diatas:
Pada chart.Correlation, tanda bintang menunjukkan
tingkat signifikansi dari korelasi antara pasangan variabel. Ini
mengindikasikan seberapa kuat hubungan antara variabel-variabel
tersebut, diukur dengan tingkat kepercayaan tertentu.
Ketika sebuah variabel memiliki tanda bintang, itu menunjukkan bahwa hubungan antara variabel tersebut dengan variabel lain dalam dataset secara signifikan berbeda dari nol pada tingkat signifikansi yang sesuai. Hal ini membantu mengidentifikasi variabel-variabel yang memiliki korelasi yang kuat dan signifikan, yang dapat menjadi penting dalam analisis data dan pemodelan.
Penggunaan chart.Correlation dan ggpairs
untuk menganalisis korelasi antar variabel dalam dataset tidak selalu
redundan, meskipun keduanya bertujuan untuk memberikan wawasan tentang
hubungan antar variabel.
Perbedaan utama antara kedua pendekatan tersebut adalah dalam gaya visualisasi dan fungsionalitas tambahan yang disediakan.
Berikut adalah perbandingan antara keduanya:
chart.Correlation biasanya menghasilkan matriks
korelasi yang berisi sel-sel warna untuk menunjukkan kekuatan dan arah
korelasi antar variabel. Ini menyediakan representasi visual yang
ringkas dan mudah dimengerti tentang korelasi dalam dataset. (cocok
sebagai tujuan eksplorasi)ggpairs, di sisi lain, menghasilkan kumpulan
scatterplots dan histogram untuk setiap pasangan variabel dalam dataset.
Ini memberikan representasi visual yang lebih terperinci tentang
hubungan antar variabel, termasuk distribusi dan pola korelasi. (cocok
sebagai tujuan eksplanasi)chart.Correlation biasanya lebih sederhana dan fokus
pada korelasi antar variabel tanpa banyak fungsionalitas tambahan.ggpairs memungkinkan pengguna untuk menyesuaikan plot
dan menambahkan lapisan visual tambahan, seperti garis regresi,
pengelompokan berdasarkan variabel kategori, dan tampilan tambahan
lainnya. Ini memberikan lebih banyak fleksibilitas dalam analisis dan
visualisasi data.ggpairs(forest_fire,
aes(color = Classes, alpha = 0.75),
lower = list(continuous = "smooth"),
progress = FALSE,
messages = FALSE,
stat_bin = 10,
bindwidth = 0.5,
bins = 5) +
theme_bw() +
labs(title = "Correlation Plot of Variance (Fire Forest)") +
theme(plot.title = element_text(
face = 'bold',
color = 'black',
hjust = 0.5,
size = 12)) Plot diatas menampilkan berbagai jenis plot statistik, termasuk:
Scatterplot: menunjukkan hubungan bivariat antara dua
variabel.
Histogram: menunjukkan distribusi marginal setiap
variabel.
temperature dan Wind Speed.Boxplot: Hubungan distribusi antara prediktor dengan
target. Contoh interpretasi: Pada variable FFMC, kelas
target fire cenderung berada pada nilai-nilai FFMC yang
tinggi dan memiliki variasi yang seragam.Pada bagian ini, tujuannya jika nantinya kita hanya ingin fokus melihat nilai korelasinya saja. Perhitungan korelasi yang digunakan pada ketiga metode ini sama, yaitu menggunakan korelasi Pearson untuk data numerik. Korelasi Pearson mengukur kekuatan dan arah hubungan linear antara dua variabel numerik.
# inspect corelation between predictors
ggcorr(forest_fire, hjust = 1, layout.exp = 2, label = T, label_size = 3, label_round = 3) +
labs(title="Correlation Plot of Variance") +
theme(plot.title = element_text(face = 'bold',
color = 'black',
hjust = 0.5,
size = 12))Berdasarkan plot diatas, nilai di dalam kotak menunjukkan koefisien korelasi Pearson dimana nilai beriksar dari -1 (korelasi negatif sempurna) hingga 1 (korelasi positif sempurna) dan Nilai 0 menunjukkan tidak ada korelasi.
Hampir semua prediktor memiliki korelasi yang tinggi antar prediktor.
seperti DMC dengan BUI yang memiliki korelasi
1 kecuali prediktor Ws (Wind speed in km/h: 6 to 29). Hal
ini dapat dijelaskan oleh beberapa faktor:
1. Sifat Faktor Cuaca:
Faktor cuaca, seperti temperatur, kelembaban, dan curah hujan, saling terkait erat. Peningkatan temperatur, misalnya, dapat menyebabkan penurunan kelembaban dan meningkatkan kemungkinan evaporasi, yang pada akhirnya dapat meningkatkan risiko kebakaran hutan.
2. Interaksi Antar Faktor:
Faktor-faktor cuaca tidak bekerja secara independen. Interaksi antar faktor dapat menghasilkan efek yang kompleks dan meningkatkan korelasi antar prediktor. Contohnya, kombinasi temperatur tinggi dan angin kencang dapat mempercepat penyebaran api dan meningkatkan intensitas kebakaran.
3. Multikolinearitas:
Ketika dua atau lebih prediktor memiliki korelasi yang tinggi, hal ini disebut multikolinearitas. Multikolinearitas dapat menyebabkan masalah dalam model prediksi, seperti inflasi varians, yang dapat membuat estimasi koefisien tidak stabil dan sulit diinterpretasikan.
4. Batasan Data:
Kualitas dan ketersediaan data dapat memengaruhi hasil analisis. Dataset yang terbatas atau tidak akurat dapat menghasilkan korelasi yang tidak realistis.
Kasus DMC dan BUI:
Korelasi 1 antara DMC (Duff Moisture Code) dan
BUI (Build-Up Index) menunjukkan hubungan yang
sangat kuat. Hal ini dapat dijelaskan karena kedua variabel tersebut
terkait erat dengan tingkat kekeringan bahan bakar hutan.
DMC mengukur kadar air di lapisan duff (lapisan organik di
atas tanah), sedangkan BUI mengukur akumulasi bahan bakar
mati yang tersedia untuk dibakar. Ketika bahan bakar hutan kering,
risiko kebakaran hutan meningkat.
Korelasi tinggi antar prediktor dalam dataset “Forest Fire” mencerminkan hubungan kompleks antar faktor cuaca dan pengaruhnya terhadap risiko kebakaran hutan. Memahami korelasi ini penting untuk membangun model prediksi yang akurat dan mengambil langkah-langkah pencegahan yang efektif.
# inspect the data distribution of numerical variables
inspect_num(forest_fire, include_int = TRUE) %>%
show_plot()
Untuk melihat lebih jelas apakah variable prediktor terdistribusi secara
normal bisa dilihat menggunakan plot historgram diatas berdasarkan
skewnessnya.
Skewness adalah ukuran dari ketidaksimetrian
sebuah distribusi. Sebuah distribusi dianggap tidak simetris ketika sisi
kiri dan kanannya tidak mencerminkan gambaran yang sama.
Sebuah distribusi bisa memiliki skewness positif (atau kanan), negatif (atau kiri), atau nol. Distribusi dengan skewness positif lebih panjang di sisi kanan puncaknya, sementara distribusi dengan skewness negatif lebih panjang di sisi kiri puncaknya.
Selain melihat analisis nilai-nilai numerik pada dataset, terdapat
analisis untuk melakukan inspeksi terhadap variable kategorikal dalam
dataset yakni dengan fungsi inspect_cat. Fungsi ini
berfungsi untuk membantu dalam memahami distribusi dan proporsi nilai
unik pada setiap variable kategorik.
#>
#> fire not fire
#> 0.563786 0.436214
Berdasarkan plot diatas, antara kelas fire dan
not fire masih cukup balance/seimbang.
Train-test split adalah teknik yang sangat umum digunakan dalam machine learning untuk membagi dataset menjadi dua bagian: satu untuk melatih model (train set) dan yang lainnya untuk menguji kinerja model (test set). Tujuannya adalah untuk mengevaluasi seberapa baik model dapat menggeneralisasi pola dari data yang telah dilihat sebelumnya ke data yang belum pernah dilihat oleh model.
Yang dilakukan dalam proyek ini adalah membagi data menjadi train dan test, test yang dibuat masih sebatas dari data historis yang sama namun hasil pembagian dari data yang tidak diikut sertakan kedalam model fitting. Sedangkan saya tidak membagi menjadi validation.
Untuk memastikan model klasifikasi akurat, saya membagi data menjadi
dua set: set pelatihan (training dataset) dan set pengujian (testing
dataset). Saya sudah mengetahui sebelumnya kelas-kelas
(Classes) untuk set pengujian, dan dengan menggunakan
informasi ini saya dapat mengevaluasi akurasi pengklasifikasi dengan
memprediksi set pelatihan dengan set pengujian, sehingga memiliki
keyakinan yang lebih baik dalam memprediksi kemungkinan kebakaran hutan
jika data baru dengan variabel serupa disajikan di masa depan.
Proporsi ditetapkan menjadi 80% karena dataset asli dinilai relatif
kecil (244 entri). Dengan membagi menjadi 80%, saya dapat memberikan
lebih banyak sampel dari data ke set pelatihan, yang menghasilkan
peningkatan akurasi untuk data pengujian saya. Variabel target saya
tetap Classes karena itulah variabel yang ingin saya
prediksi.
split <- initial_split(forest_fire,
prop = 0.80,
strata = Classes)
forest_fire_train <- training(split)
forest_fire_test <- testing(split)Kode di atas digunakan untuk membagi dataset forest_fire
menjadi dua bagian: set pelatihan (training set) dan set pengujian
(testing set):
split <- initial_split(forest_fire, prop = 0.80, strata = Classes):
Fungsi initial_split dari library rsample
digunakan untuk membagi dataset forest_fire. Parameter
prop digunakan untuk menentukan proporsi data yang akan
dialokasikan ke dalam set pelatihan. Dalam contoh ini, proporsi yang
dialokasikan adalah 80% (0.80). Parameter strata digunakan
untuk menentukan variabel yang akan dijadikan dasar bagi pembagian data,
dalam hal ini variabel Classes.
forest_fire_train <- training(split): Menggunakan
fungsi training untuk mengekstraksi set pelatihan dari
objek split yang telah dibuat sebelumnya. Data yang
diekstraksi akan disimpan dalam variabel
forest_fire_train.
forest_fire_test <- testing(split): Menggunakan
fungsi testing untuk mengekstraksi set pengujian dari objek
split. Data yang diekstraksi akan disimpan dalam variabel
forest_fire_test.
Untuk melihat jumlah baris antara set pelatihan dan set pengujian,
Anda dapat menggunakan fungsi nrow() untuk menghitung
jumlah baris (observasi) dalam setiap dataset. Berikut adalah contoh
cara melakukannya:
#> [1] 193
#> [1] 50
Disini, saya memiliki 194 baris/observasi pada data training dan 50 baris pada data test, permasing-masing baris merepresentasikan data perharinya.
#>
#> fire not fire
#> 0.5647668 0.4352332
Rpart adalah singkatan dari Recursive Partitioning
and Regression Trees. Ini adalah salah satu teknik paling populer
dalam pemodelan prediktif yang digunakan untuk membangun pohon keputusan
dalam analisis data. Pohon keputusan adalah model prediktif yang
digunakan dalam pemrosesan data dan pembelajaran mesin. Mereka membagi
populasi atau sampel menjadi beberapa sub-grup berdasarkan fitur-fitur
yang paling penting dalam klasifikasi atau prediksi variabel target.
Ada beberapa alasan mengapa saya menggunakan rpart sebagai alat pemodelan:
Kemudahan Implementasi: Rpart sangat mudah diimplementasikan dalam R. Dengan menggunakan fungsi yang sederhana, Anda dapat membuat dan menyesuaikan model pohon keputusan dengan cepat.
Interpretasi yang Mudah: Model pohon keputusan dapat dengan mudah diinterpretasikan oleh manusia. Struktur pohon yang dihasilkan mudah dipahami, sehingga hasilnya dapat dijelaskan dengan mudah kepada pemangku kepentingan non-teknis.
Tidak Memerlukan Asumsi yang Kuat: Rpart tidak memerlukan asumsi yang kuat tentang distribusi data. Ini dapat digunakan dalam berbagai situasi, termasuk ketika hubungan antara variabel independen dan dependen kompleks atau tidak linier.
Penanganan Data yang Fleksibel: Rpart dapat menangani data yang bervariasi dalam jenis dan skala dengan baik. Ini dapat bekerja dengan baik dengan data kategorikal maupun numerik.
Performa yang Baik dalam Berbagai Kasus: Rpart sering kali memberikan hasil yang baik dalam pengujian praktis di berbagai bidang, termasuk kesehatan, keuangan, dan teknologi.
Dengan demikian, penggunaan rpart dalam pemodelan memberikan alat yang kuat dan mudah dipahami untuk memprediksi variabel target dari sekumpulan fitur atau variabel independen.
Tabel 3: Tabel Kebakaran Hutan di Aljazair (Data Training)
model_rpart <- rpart(formula = Classes ~ .,
data = forest_fire_train,
control = list(minsplit = 5,
minbucket = 2),
method = "class")Berikut penjelasan setiap kode yang digunakan pada fungsi
rpart:
model_rpart <- rpart(formula = Classes ~ ., data = forest_fire_train, method = "class"):
rpart() adalah fungsi yang digunakan untuk membangun
model pohon keputusan.formula = Classes ~ . menunjukkan bahwa variabel target
yang ingin diprediksi adalah Classes, dan .
mengindikasikan semua variabel prediktor dalam dataset.data = forest_fire_train menentukan dataset yang
digunakan untuk melatih model, yaitu
forest_fire_train.method = "class" menunjukkan bahwa saya ingin membangun
model untuk klasifikasi kategori, bukan regresi.Parameter pruning pada paramater control:
#> Call:
#> rpart(formula = Classes ~ ., data = forest_fire_train, method = "class",
#> control = list(minsplit = 5, minbucket = 2))
#> n= 193
#>
#> CP nsplit rel error xerror xstd
#> 1 0.96428571 0 1.00000000 1.00000000 0.08199643
#> 2 0.01190476 1 0.03571429 0.04761905 0.02356150
#> 3 0.01000000 2 0.02380952 0.05952381 0.02627278
#>
#> Variable importance
#> FFMC ISI FWI DC BUI DMC
#> 21 20 18 14 13 13
#>
#> Node number 1: 193 observations, complexity param=0.9642857
#> predicted class=fire expected loss=0.4352332 P(node) =1
#> class counts: 109 84
#> probabilities: 0.565 0.435
#> left son=2 (112 obs) right son=3 (81 obs)
#> Primary splits:
#> FFMC < 80.15 to the right, improve=89.04154, (0 missing)
#> ISI < 2.55 to the right, improve=85.31943, (0 missing)
#> FWI < 3.5 to the right, improve=74.49211, (0 missing)
#> DC < 17.65 to the right, improve=47.00415, (0 missing)
#> BUI < 8.35 to the right, improve=46.10757, (0 missing)
#> Surrogate splits:
#> ISI < 2.45 to the right, agree=0.979, adj=0.951, (0 split)
#> FWI < 2.15 to the right, agree=0.938, adj=0.852, (0 split)
#> DC < 17.65 to the right, agree=0.855, adj=0.654, (0 split)
#> BUI < 7.75 to the right, agree=0.850, adj=0.642, (0 split)
#> DMC < 8.05 to the right, agree=0.845, adj=0.630, (0 split)
#>
#> Node number 2: 112 observations, complexity param=0.01190476
#> predicted class=fire expected loss=0.02678571 P(node) =0.5803109
#> class counts: 109 3
#> probabilities: 0.973 0.027
#> left son=4 (109 obs) right son=5 (3 obs)
#> Primary splits:
#> ISI < 2.65 to the right, improve=2.5243010, (0 missing)
#> FWI < 2.35 to the right, improve=1.8578040, (0 missing)
#> FFMC < 82.1 to the right, improve=1.6392860, (0 missing)
#> DC < 19.05 to the right, improve=0.8585165, (0 missing)
#> BUI < 8.15 to the right, improve=0.8585165, (0 missing)
#> Surrogate splits:
#> FWI < 2.35 to the right, agree=0.991, adj=0.667, (0 split)
#>
#> Node number 3: 81 observations
#> predicted class=not fire expected loss=0 P(node) =0.4196891
#> class counts: 0 81
#> probabilities: 0.000 1.000
#>
#> Node number 4: 109 observations
#> predicted class=fire expected loss=0.009174312 P(node) =0.5647668
#> class counts: 108 1
#> probabilities: 0.991 0.009
#>
#> Node number 5: 3 observations
#> predicted class=not fire expected loss=0.3333333 P(node) =0.01554404
#> class counts: 1 2
#> probabilities: 0.333 0.667
summary(model_rpart):
summary() digunakan untuk mendapatkan ringkasan
statistik dari model yang telah dibuat.model_rpart) menunjukkan beberapa informasi penting:Complexity parameter (CP): Parameter kompleksitas mengontrol kompleksitas pohon. Semakin rendah nilai CP, semakin kompleks modelnya. Dalam contoh ini, ada dua nilai CP yang ditunjukkan: 0.9529412 dan 0.01.
Variable importance: Menunjukkan pentingnya setiap variabel dalam mempengaruhi keputusan model. Variabel FFMC memiliki tingkat penting tertinggi (21), diikuti oleh ISI (20), FWI (18), BUI (14), DMC (14), dan DC (13).
Node information: Membagi node berdasarkan variabel dan nilai yang membagi data. Informasi ini mencakup jumlah observasi di setiap node, kelas yang diprediksi, dan probabilitas kelas.
Secara garis besar, pohon keputusan ini menggambarkan bagaimana data dibagi berdasarkan berbagai variabel prediktor, dan bagaimana pohon ini digunakan untuk membuat prediksi. Pohon ini memiliki dua cabang: satu untuk prediksi “fire” dan yang lainnya untuk prediksi “not fire”.
Untuk memvisualisasikan pohon keputusan ini dengan lebih mudah
dipahami, Anda dapat menggunakan paket rpart.plot yang
dapat menampilkan struktur pohon keputusan secara grafis. Dengan
demikian, Anda dapat melihat bagaimana data dibagi dan bagaimana
keputusan diambil berdasarkan variabel prediktor.
Berikut adalah penjelasan yang lebih rapi mengenai pohon keputusan:
mincriterion,
minsplit, minbucket, dan maxdepth
dapat diatur untuk mengontrol percabangan pohon.# dengan menambahkan jumlah value pada fungsi rpart.plot()
tot_count <- function(x, labs, digits, varlen)
{paste(labs, "\n\nn =", x$frame$n)}
rpart.plot(model_rpart, faclen = 0, cex = 0.8,
node.fun = tot_count)Pertama, interpretasi dimulai dengan melihat node akar (tingkat 0 dari 3, bagian atas grafik).
Di bagian atas node akar, menunjukkan probabilitas keseluruhan
untuk terjadinya kebakaran (fire). Ini menunjukkan proporsi
terjadi kebakaran atau tidak. 56 % terjadi kebakaran dan 44 % tidak
terjadi kebakaran.
Node akar kemudian mengajukan pertanyaan apakah
Fine Fuel Moisture Code (FFMC) >= 80, Jika ya, maka
diarahkan ke node anak kiri (kedalaman 2). Interpretasi menyatakan bahwa
58% FFMC yang nilainya >= 80, dengan probabilitas terjadinya
kebakaran sebesar 97% dan FFMC yang nilainya >=80 tidak terjadi
kebakaran sebesar 0.3%.
Pada node kedua, jika aturannya apakah ISI >=
2,7. Jika ya, maka peluang terjadi kebakaran jika ISI >=2,7 dan
memiliki FFMC >= 80 sebesar 99% persen.
Anda terus melanjutkan seperti itu untuk memahami fitur-fitur apa yang memengaruhi terjadinya kebakaran hutan.
Secara default, fungsi rpart() menggunakan ukuran
ketidakmurnian Gini/Gini Impurity
untuk membagi simpul/node. Semakin tinggi koefisien Gini, semakin
berbeda instansi dalam simpul tersebut. Math
behind gini impurity.
# jika fokus untuk melihat jumlah observasinya
only_count <- function(x, labs, digits, varlen)
{paste(x$frame$n)}
boxcols <- c("red",
"palegreen3")[model_rpart$frame$yval]
par(xpd=TRUE)
rpart.plot(model_rpart, faclen = 0, cex = 0.8, node.fun=only_count, box.col = boxcols)
legend("topleft", legend = c("Fire", "Not Fire"),
fill = c("red", "palegreen3"),
title = "Class")Kita dapat melakukan prediksi berdasarkan data test. Untuk melakukan
prediksi, bisa menggunakan fungsi predict(). Syntax pada R
untuk Decision Tree sebagai berikut:
predict(fitted_model, df, type = 'class')
arguments: - fitted_model: Ini adalah objek yang
disimpan setelah estimasi model. - df: Kerangka dataframe
yang digunakan untuk membuat prediksi. - type: Jenis
prediksi - ‘class’: untuk klasifikasi - ‘prob’: untuk menghitung
probabilitas dari setiap kelas - ‘vector’: Memprediksi respons rata-rata
pada tingkat node.
# prediksi kelas di data train
pred_rpart_train <- predict(object = model_rpart,
newdata = forest_fire_train,
type = "class")
# confusion matrix data train
confusionMatrix(data = pred_rpart_train,
reference = forest_fire_train$Classes,
positive = "fire")#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction fire not fire
#> fire 108 1
#> not fire 1 83
#>
#> Accuracy : 0.9896
#> 95% CI : (0.9631, 0.9987)
#> No Information Rate : 0.5648
#> P-Value [Acc > NIR] : <0.0000000000000002
#>
#> Kappa : 0.9789
#>
#> Mcnemar's Test P-Value : 1
#>
#> Sensitivity : 0.9908
#> Specificity : 0.9881
#> Pos Pred Value : 0.9908
#> Neg Pred Value : 0.9881
#> Prevalence : 0.5648
#> Detection Rate : 0.5596
#> Detection Prevalence : 0.5648
#> Balanced Accuracy : 0.9895
#>
#> 'Positive' Class : fire
#>
# prediksi kelas di data test
pred_rpart <- predict(object = model_rpart,
newdata = forest_fire_test,
type = "class")
# confusion matrix data test
cm_rpart <- confusionMatrix(data = pred_rpart,
reference = forest_fire_test$Classes,
positive = "fire")
cm_rpart#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction fire not fire
#> fire 28 0
#> not fire 0 22
#>
#> Accuracy : 1
#> 95% CI : (0.9289, 1)
#> No Information Rate : 0.56
#> P-Value [Acc > NIR] : 0.0000000000002567
#>
#> Kappa : 1
#>
#> Mcnemar's Test P-Value : NA
#>
#> Sensitivity : 1.00
#> Specificity : 1.00
#> Pos Pred Value : 1.00
#> Neg Pred Value : 1.00
#> Prevalence : 0.56
#> Detection Rate : 0.56
#> Detection Prevalence : 0.56
#> Balanced Accuracy : 1.00
#>
#> 'Positive' Class : fire
#>
Model memprediksi dari sekitar 50 kasus yang diprediksi terdapat 28 kasus diprediksi kebakaran, dan ternyata memang betul terjadi kebakaran. Sedangkan 22 kasus lainnya di prediksi tidak terjadi kebakaran, dan sebenarnya memang tidak terjadi kebakaran. Berdasarkan Confusion Matrix table diatas, kita bisa mengukur performance model dengan berbagai macam jenis perhitungan.
False Positive : ditebak sebagai Fire, ternyata No
FireFalse Negative : ditebak sebagai No Fire, ternyata
FireMeminimalisir: False Negative, karena jika terjadi kebakaran dan ditebak tidak ada kebakaran maka sulit untuk mengambil tindakan pencegahan yang tepat.
Untuk meminimalkan false negative, kita perlu fokus pada meningkatkan
sensitivitas (recall) model. Sensitivitas adalah kemampuan
model untuk mendeteksi semua kasus positif yang sebenarnya (dalam hal
ini, mendeteksi kebakaran hutan dengan benar).
Pada model diatas, jika kita fokus pada sensitivitas/recall maka nilainya sebear 100%.
Library party adalah salah satu library di R yang
menyediakan algoritma untuk membangun model pohon keputusan dan metode
analisis data lainnya.
# prediksi kelas di data train
pred_ctree_train <- predict(object = model_ctree,
newdata = forest_fire_train,
type = "response")
# confusion matrix data train
confusionMatrix(data = pred_ctree_train,
reference = forest_fire_train$Classes,
positive = "fire")#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction fire not fire
#> fire 109 3
#> not fire 0 81
#>
#> Accuracy : 0.9845
#> 95% CI : (0.9552, 0.9968)
#> No Information Rate : 0.5648
#> P-Value [Acc > NIR] : <0.0000000000000002
#>
#> Kappa : 0.9683
#>
#> Mcnemar's Test P-Value : 0.2482
#>
#> Sensitivity : 1.0000
#> Specificity : 0.9643
#> Pos Pred Value : 0.9732
#> Neg Pred Value : 1.0000
#> Prevalence : 0.5648
#> Detection Rate : 0.5648
#> Detection Prevalence : 0.5803
#> Balanced Accuracy : 0.9821
#>
#> 'Positive' Class : fire
#>
# prediksi kelas di data test
pred_ctree <- predict(object = model_ctree,
newdata = forest_fire_test,
type = "response")
# confusion matrix data test
cm_ctree <- confusionMatrix(data = pred_ctree,
reference = forest_fire_test$Classes,
positive = "fire")
cm_ctree#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction fire not fire
#> fire 28 1
#> not fire 0 21
#>
#> Accuracy : 0.98
#> 95% CI : (0.8935, 0.9995)
#> No Information Rate : 0.56
#> P-Value [Acc > NIR] : 0.00000000001034
#>
#> Kappa : 0.9592
#>
#> Mcnemar's Test P-Value : 1
#>
#> Sensitivity : 1.0000
#> Specificity : 0.9545
#> Pos Pred Value : 0.9655
#> Neg Pred Value : 1.0000
#> Prevalence : 0.5600
#> Detection Rate : 0.5600
#> Detection Prevalence : 0.5800
#> Balanced Accuracy : 0.9773
#>
#> 'Positive' Class : fire
#>
#menghasilkan dan menampilkan summary model
model_c5.0 <- C5.0(x = forest_fire_train[,-11],
y = forest_fire_train[,11])
summary(model_c5.0)#>
#> Call:
#> C5.0.default(x = forest_fire_train[, -11], y = forest_fire_train[, 11])
#>
#>
#> C5.0 [Release 2.07 GPL Edition] Wed Feb 7 15:58:20 2024
#> -------------------------------
#>
#> Class specified by attribute `outcome'
#>
#> Read 193 cases (11 attributes) from undefined.data
#>
#> Decision tree:
#>
#> FFMC <= 80.1: not fire (81)
#> FFMC > 80.1:
#> :...ISI > 3: fire (102)
#> ISI <= 3:
#> :...DC <= 20.2: not fire (2)
#> DC > 20.2: fire (8/1)
#>
#>
#> Evaluation on training data (193 cases):
#>
#> Decision Tree
#> ----------------
#> Size Errors
#>
#> 4 1( 0.5%) <<
#>
#>
#> (a) (b) <-classified as
#> ---- ----
#> 109 (a): class fire
#> 1 83 (b): class not fire
#>
#>
#> Attribute usage:
#>
#> 100.00% FFMC
#> 58.03% ISI
#> 5.18% DC
#>
#>
#> Time: 0.0 secs
Summary model diatas memberikan informasi menganai model Decision Tree yang telah dibuat menggunakan algoritma C5.0 pada dataset latih (train). Berikut adalah poin-poin hasil summary tersebut:
FFMC, ISI, dan DC sebagai
atribut pemisah.fire) atau tidak
(not fire).fire
dan 83 kasus yang diklasifikasikan sebagai not fire.FFMC digunakan dalam 100% aturan keputusan,
menunjukkan signifikansi besar dalam memprediksi kelas output.ISI digunakan dalam 58.03% aturan keputusan,
sedangkan DC hanya digunakan dalam 5.18% aturan
keputusan.Hasil ringkasan ini memberikan gambaran tentang kinerja model Decision Tree dalam memprediksi kejadian kebakaran berdasarkan atribut-atribut yang diberikan. Meskipun hasil evaluasi pada data latih menunjukkan kinerja yang baik dengan tingkat kesalahan rendah, penting untuk menguji model pada data uji yang belum pernah dilihat sebelumnya untuk memastikan bahwa model tersebut dapat digeneralisasikan dengan baik pada data baru.
Attribut yang digunakan
# prediksi kelas di data train
pred_c5.0_train <- predict(object = model_c5.0,
newdata = forest_fire_train,
type = "class")
# confusion matrix data train
confusionMatrix(data = pred_c5.0_train,
reference = forest_fire_train$Classes,
positive = "fire")#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction fire not fire
#> fire 109 1
#> not fire 0 83
#>
#> Accuracy : 0.9948
#> 95% CI : (0.9715, 0.9999)
#> No Information Rate : 0.5648
#> P-Value [Acc > NIR] : <0.0000000000000002
#>
#> Kappa : 0.9894
#>
#> Mcnemar's Test P-Value : 1
#>
#> Sensitivity : 1.0000
#> Specificity : 0.9881
#> Pos Pred Value : 0.9909
#> Neg Pred Value : 1.0000
#> Prevalence : 0.5648
#> Detection Rate : 0.5648
#> Detection Prevalence : 0.5699
#> Balanced Accuracy : 0.9940
#>
#> 'Positive' Class : fire
#>
# prediksi kelas di data test
pred_c5.0_test <- predict(object = model_c5.0,
newdata = forest_fire_test,
type = "class")
# confusion matrix data test
cm_c5.0 <- confusionMatrix(data = pred_c5.0_test,
reference = forest_fire_test$Classes,
positive = "fire")
cm_c5.0#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction fire not fire
#> fire 28 1
#> not fire 0 21
#>
#> Accuracy : 0.98
#> 95% CI : (0.8935, 0.9995)
#> No Information Rate : 0.56
#> P-Value [Acc > NIR] : 0.00000000001034
#>
#> Kappa : 0.9592
#>
#> Mcnemar's Test P-Value : 1
#>
#> Sensitivity : 1.0000
#> Specificity : 0.9545
#> Pos Pred Value : 0.9655
#> Neg Pred Value : 1.0000
#> Prevalence : 0.5600
#> Detection Rate : 0.5600
#> Detection Prevalence : 0.5800
#> Balanced Accuracy : 0.9773
#>
#> 'Positive' Class : fire
#>
library(caret)
# Membuat kontrol
ctrl <- trainControl(method = "cv", number = 10)
# Membuat model dengan caret
model_caret <- train(Classes ~ .,
data = forest_fire,
method = "ctree",
trControl = ctrl,
tuneLength = 10)
# Menampilkan ringkasan model
model_caret#> Conditional Inference Tree
#>
#> 243 samples
#> 10 predictor
#> 2 classes: 'fire', 'not fire'
#>
#> No pre-processing
#> Resampling: Cross-Validated (10 fold)
#> Summary of sample sizes: 219, 220, 218, 218, 219, 218, ...
#> Resampling results across tuning parameters:
#>
#> mincriterion Accuracy Kappa
#> 0.0100000 0.9791377 0.9568007
#> 0.1188889 0.9791377 0.9568007
#> 0.2277778 0.9791377 0.9568007
#> 0.3366667 0.9791377 0.9568007
#> 0.4455556 0.9791377 0.9568007
#> 0.5544444 0.9791377 0.9568007
#> 0.6633333 0.9791377 0.9568007
#> 0.7722222 0.9791377 0.9568007
#> 0.8811111 0.9791377 0.9568007
#> 0.9900000 0.9791377 0.9568007
#>
#> Accuracy was used to select the optimal model using the largest value.
#> The final value used for the model was mincriterion = 0.99.
Berikut adalah poin-poin hasil summary tersebut:
mincriterion.mincriterion yang diuji.mincriterion.mincriterion yang menghasilkan akurasi tertinggi
dipilih sebagai nilai optimal untuk model.mincriterion yang terpilih
sebagai model akhir adalah 0.99.Glossary kappa : Kappa adalah metrik evaluasi yang
mengukur tingkat kesepakatan/voting antara dua penilaian atau prediksi
berbeda dalam konteks klasifikasi. Rentang nilai kappa adalah dari -1
hingga 1, di mana nilai positif menunjukkan tingkat kesepakatan yang
lebih tinggi daripada yang diharapkan secara kebetulan, sementara nilai
negatif menunjukkan tingkat kesepakatan yang lebih rendah.
# prediksi kelas di data train
pred_caret_train <- predict(object = model_caret,
newdata = forest_fire_train,
type = "raw")
# confusion matrix data train
confusionMatrix(data = pred_caret_train,
reference = forest_fire_train$Classes,
positive = "fire")#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction fire not fire
#> fire 109 3
#> not fire 0 81
#>
#> Accuracy : 0.9845
#> 95% CI : (0.9552, 0.9968)
#> No Information Rate : 0.5648
#> P-Value [Acc > NIR] : <0.0000000000000002
#>
#> Kappa : 0.9683
#>
#> Mcnemar's Test P-Value : 0.2482
#>
#> Sensitivity : 1.0000
#> Specificity : 0.9643
#> Pos Pred Value : 0.9732
#> Neg Pred Value : 1.0000
#> Prevalence : 0.5648
#> Detection Rate : 0.5648
#> Detection Prevalence : 0.5803
#> Balanced Accuracy : 0.9821
#>
#> 'Positive' Class : fire
#>
# prediksi kelas di data test
pred_caret_test <- predict(object = model_caret,
newdata = forest_fire_test,
type = "raw")
# confusion matrix data test
cm_caret <- confusionMatrix(data = pred_caret_test,
reference = forest_fire_test$Classes,
positive = "fire")
cm_caret#> Confusion Matrix and Statistics
#>
#> Reference
#> Prediction fire not fire
#> fire 28 1
#> not fire 0 21
#>
#> Accuracy : 0.98
#> 95% CI : (0.8935, 0.9995)
#> No Information Rate : 0.56
#> P-Value [Acc > NIR] : 0.00000000001034
#>
#> Kappa : 0.9592
#>
#> Mcnemar's Test P-Value : 1
#>
#> Sensitivity : 1.0000
#> Specificity : 0.9545
#> Pos Pred Value : 0.9655
#> Neg Pred Value : 1.0000
#> Prevalence : 0.5600
#> Detection Rate : 0.5600
#> Detection Prevalence : 0.5800
#> Balanced Accuracy : 0.9773
#>
#> 'Positive' Class : fire
#>
Tujuan Decision Tree yaitu memisahkan data menjadi kelompok-kelompok kecil berdasarkan variable tertentu sehingga dihasilkan data yang homogen atau homogenitas tinggi. Ukuran homogenitas dapat dikuantifikasi dengan nilai entropy.
Entropy adalah ukuran ketidakteraturan (measure of disorder) dari sebuah kelompok data.
Kelompok data yang diharapkan setelah dilakukan percabangan adalah kelompok yang memiliki entropy rendah.
Untuk memilih prediktor mana yang menjadi root node, dihitunglah perubahan entropy yaitu selisih antara entropy sebelum dan sesudah dilakukan percabangan menggunakan variable predictor.
Predictor yang dipilih adalah predictor yang menghasilkan penurunan entropy paling besar, berarti membuat data setelah pemisahan semakin homogen. Perubahan entropy inilah yang disebut Information Gain.
Prediktor yang dipilih pada setiap percabangan adalah predictor yang menghasilkan information gain terbesar. Berikut adalah perbedaan dalam perhitungan metrik seperti Gini impurity atau entropy di antara keempat model pohon keputusan yang umum digunakan:
rpart menggunakan Gini impurity sebagai metrik untuk
mengukur ketidakmurnian node.party menggunakan sebuah pendekatan yang disebut
conditional inference framework.C50,
menggunakan metrik gain information atau informasi gain.caret memungkinkan pengguna untuk memilih
algoritma pohon keputusan yang berbeda, termasuk rpart,
party, dan C50.caret bergantung pada algoritma yang dipilih.Perbedaan dalam perhitungan metrik ini mempengaruhi bagaimana model memutuskan pemisahan node dan pembentukan pohon keputusan. Setiap metode memiliki kelebihan dan kelemahan tergantung pada struktur data dan tujuan pemodelan yang spesifik. Sebagai pengguna, penting untuk memahami bagaimana metrik-metrik ini berfungsi dan memilih algoritma yang sesuai dengan kebutuhan analisis Anda.
# By recall
col <- c("#ed3b3b", "#0099ff")
par(mfrow=c(1,4))
fourfoldplot(cm_rpart$table, color = col, conf.level = 0, margin = 1, main=paste("RPart (",round(cm_rpart$byClass[1]*100),"%)",sep=""))
fourfoldplot(cm_ctree$table, color = col, conf.level = 0, margin = 1, main=paste("Party (",round(cm_ctree$byClass[1]*100),"%)",sep=""))
fourfoldplot(cm_c5.0$table, color = col, conf.level = 0, margin = 1, main=paste("C5.0 (",round(cm_c5.0$byClass[1]*100),"%)",sep=""))
fourfoldplot(cm_caret$table, color = col, conf.level = 0, margin = 1, main=paste("Caret (",round(cm_c5.0$byClass[1]*100),"%)",sep=""))# By Accuray
col <- c("#ed3b3b", "#0099ff")
par(mfrow=c(1,4))
fourfoldplot(cm_rpart$table, color = col, conf.level = 0, margin = 1, main=paste("RPart (",round(cm_rpart$overall[1]*100),"%)",sep=""))
fourfoldplot(cm_ctree$table, color = col, conf.level = 0, margin = 1, main=paste("Party (",round(cm_ctree$overall[1]*100),"%)",sep=""))
fourfoldplot(cm_c5.0$table, color = col, conf.level = 0, margin = 1, main=paste("C5.0 (",round(cm_c5.0$overall[1]*100),"%)",sep=""))
fourfoldplot(cm_caret$table, color = col, conf.level = 0, margin = 1, main=paste("Caret (",round(cm_c5.0$overall[1]*100),"%)",sep=""))Best model: Model Rpart, recall 100% dan akurasi 100%
# model fitting
rpart_prob <- predict(model_rpart, forest_fire_test, type = "prob") # for the probability
# menyiapkan pred vs actual
rpart_roc <- ifelse(forest_fire_test$Classes == "fire", 1, 0)
head(rpart_roc)#> [1] 0 0 1 1 1 0
library(ROCR)
# objek prediction
roc_pred <- prediction(predictions = rpart_prob[,1], labels = rpart_roc)
# ROC curve
plot(performance(prediction.obj = roc_pred, measure = "tpr", x.measure = "fpr"))
abline(0,1, lty= 2)perf <- performance(prediction.obj = roc_pred,
measure = "tpr", #tpr = true positive rate; axis y
x.measure = "fpr") #fpr = false positive rate; axis xAUC menunjukkan luas area di bawah kurva ROC. Semakin mendekati 1,
semakin baik performa model dalam memisahkan kelas positif dan negatif.
Untuk mendapatkan nilai AUC, gunakan parameter
measure = "auc" pada fungsi performance()
kemudian ambil nilai y.values.
#> [[1]]
#> [1] 1
Pada machine learning model, terdapat trade-off antara sisi
interpretability dan performance. Performance model dapat
diunggulkan dibandingkan model yang lain, namun tidak terlalu dapat
diinterpretasi karena banyak faktor random yang terlibat. Namun
setidaknya kita dapat melihat prediktor apa saja yang paling penting
dalam pembuatan Random Forest melalui variable importancenya:
# melihat variabel yang paling penting
# Membuat data frame untuk plot
data_plot <- data.frame(variable = names(model_rpart$var),
importance = model_rpart$var)
# Mengatur label dengan dua angka desimal
data_plot$importance <- round(data_plot$importance, 2)
# Membuat plot dengan ggplot
ggplot(data = data_plot, aes(x = reorder(variable, importance), y = importance)) +
geom_bar(stat = "identity", fill = "#c7d6b0") +
geom_text(aes(label = importance), vjust = -0.3, size = 3, color = "black") +
labs(title = "Variable Importance Plot",
x = "Variables",
y = "Importance") +
coord_flip()+
theme_minimal()Pada model rpart: Fine Fuel Moisture Code (FFMC) memiliki kepentingan yang tinggi, mengapa? karena FFMC ini merupakan kode yang digunakan sebagai indikator potensi penyulutan api menjadi kebakaran. Nilai FFMC ditentukan dengan menggunakan hasil pengukuran parameter cuaca yaitu suhu udara, kelembaban udara, kecepatan angin, dan curah hujan. Dengan memanfaatkan sensor – sensor yang dapat mengukur parameter tersebut memiliki tingkat varimp paling besar karena faktor-faktor berikut:
Relevansi dalam Prediksi: FFMC adalah indikator penting dari tingkat kekeringan dan kemampuan material bakar halus untuk terbakar. Karena kekeringan sangat mempengaruhi risiko kebakaran hutan, variabel ini mungkin memiliki dampak signifikan dalam memprediksi kemungkinan terjadinya kebakaran.
Pengaruh Terhadap Hasil Model: Dalam dataset ini, FFMC mungkin menunjukkan korelasi yang kuat dengan variabel target atau kelas yang ingin diprediksi. Jika FFMC memiliki variasi yang signifikan di antara sampel-sampel, maka hal ini dapat mempengaruhi pemisahan simpul pada pohon keputusan.
Informasi yang Dapat Dipisahkan: FFMC mungkin memberikan informasi yang paling baik untuk memisahkan kelas-kelas target dalam model. Ini bisa terjadi jika FFMC memiliki tingkat varian yang tinggi di antara kelas-kelas yang berbeda, sehingga membuatnya menjadi kriteria pemisahan yang kuat dalam pohon keputusan.
Oleh karena itu, dalam konteks prediksi kebakaran hutan, FFMC mungkin menjadi salah satu variabel paling penting dalam model rpart karena perannya dalam mencerminkan kondisi kekeringan dan potensi material bakar halus untuk terbakar.
Berdasarkan tabel metrik yang dipilih berdasarkan kepentingan amatan
adalah recall. Model yang dibuat yakni dengan membandingkan
berbegai macam library yang mendukung klasifikasi untuk decision tree.
yakni rpart, party, C5.0, dan
caret.
Model prediksi yang dibangun menggunakan algoritma rpart memberikan hasil terbaik. Model tersebut memberikan recall tertinggi 100% sekaligus mempertahankan akurasi, spesifisitas, dan presisi di atas 100% untuk data test. Itu juga memberikan AUC tertinggi di 100%. Oleh karena itu model terbaik untuk memprediksi terjadi kebakaran hutan atau tidak berdasarkan karakteristik cuaca yang ada di kedua wilayah di Algerian yakni Model Rpart.
A.Pintoa, J.Espinosa-Prietoa, C. Rossaa, S.Matthewsb, C. Loureiroc, Et All. Modelling Fine Fuel Moisture Content And The Likelihood Of Fire Spread In Blue Gum (Eucalyptus Globulus) Litter. Vii International Conference On Forest Fire Research D. X. Viegas (Ed.), 2014.
Bruce, Peter, and Andrew Bruce. 2017. Practical Statistics for Data Scientists. O’Reilly Media.
James, Gareth, Daniela Witten, Trevor Hastie, and Robert Tibshirani. 2014. An Introduction to Statistical Learning: With Applications in R. Springer Publishing Company, Incorporated.
Stuart A. J. A. (2009). Fuel Moisture And Development Of Ignition And Fire Spread Thresholds In Gorse. University Of Canterbury.
Zhang, Zhongheng. 2016. “Decision Tree Modeling Using R.” Annals of Translational Medicine 4 (15).