Mata Kuliah: Analisis Data Kategori — Universitas Padjadjaran, FMIPA, Program Studi Statistika, Angkatan 2024
| Dataset | Tipe Regresi | Sumber |
|---|---|---|
| Breast Cancer Wisconsin | Biner | UCI Machine Learning Repository |
| Glass Identification | Multinomial | UCI Machine Learning Repository |
| Automobile | Ordinal | UCI Machine Learning Repository |
| Seoul Bike Sharing | Poisson | UCI Machine Learning Repository |
Analisis regresi merupakan salah satu metode statistika yang digunakan untuk menjelaskan hubungan antara variabel respon dengan satu atau lebih variabel prediktor. Pemilihan model regresi harus disesuaikan dengan karakteristik variabel respon yang digunakan. Apabila variabel respon bersifat kategorik biner, digunakan regresi logistik biner; apabila nominal dengan lebih dari dua kategori, digunakan regresi logistik multinomial.
Pada laporan ini, kedua pendekatan tersebut diterapkan pada dataset yang berbeda — masing-masing bersumber dari UCI Machine Learning Repository — dengan tujuan analisis yang spesifik. Masing-masing model dievaluasi dari sisi kesesuaian data, signifikansi prediktor, ukuran efek, serta kelayakan model secara keseluruhan.
Regresi logistik biner digunakan ketika variabel respon memiliki dua kategori (0 = tidak terjadi, 1 = terjadi). Model ini menghubungkan log-odds kejadian dengan kombinasi linear prediktor melalui fungsi logit:
log( p / (1−p) ) = β₀ + β₁X₁ + β₂X₂ + ⋯ + βₖXₖ
dengan p adalah probabilitas kejadian kategori 1 (Malignant). Parameter model diestimasi menggunakan metode Maximum Likelihood Estimation (MLE). Ukuran efek yang digunakan adalah Odds Ratio (OR) yang diperoleh dari eksponensial koefisien, yaitu OR = eβ̂.
Mengidentifikasi fitur morfologi sel tumor yang secara signifikan memengaruhi probabilitas suatu tumor payudara terdiagnosis sebagai ganas (Malignant) dibandingkan jinak (Benign), berdasarkan hasil komputasi citra fine needle aspirate (FNA).
Dataset yang digunakan adalah Breast Cancer Wisconsin (Diagnostic) — UCI Machine Learning Repository (ID: 17). Dataset ini memuat hasil komputasi inti sel dari citra FNA jaringan payudara untuk 569 pasien. Setiap sampel dideskripsikan oleh 30 fitur numerik yang merupakan perhitungan mean, standard error, dan nilai worst (terburuk) dari 10 karakteristik sel berikut:
| Karakteristik | Deskripsi | Kelompok Fitur |
|---|---|---|
radius |
Rerata jarak dari pusat ke titik-titik tepi inti sel | _mean _se _worst |
texture |
Standar deviasi nilai skala abu-abu | |
perimeter |
Keliling inti sel | |
area |
Luas inti sel | |
smoothness |
Variasi lokal panjang radius | |
compactness |
perimeter² / area − 1.0 | |
concavity |
Keparahan cekungan kontur sel | |
concave points |
Jumlah bagian cekung kontur | |
symmetry |
Simetri inti sel | |
fractal_dimension |
“Coastline approximation” − 1 |
Variabel respon adalah diagnosis: M
(Malignant/ganas, dikode 1) dan B
(Benign/jinak, dikode 0).
# Import data mentah UCI (wdbc.data) - file ini TIDAK punya header,
# sehingga nama kolom perlu didefinisikan secara manual sesuai dokumentasi UCI
feature_names <- c("radius", "texture", "perimeter", "area", "smoothness",
"compactness", "concavity", "concave_points",
"symmetry", "fractal_dimension")
col_names_bc <- c("id", "diagnosis",
paste0(feature_names, "_mean"),
paste0(feature_names, "_se"),
paste0(feature_names, "_worst"))
bc <- read.csv("data/wdbc.data", header = FALSE, col.names = col_names_bc)
bc$diagnosis <- factor(bc$diagnosis, levels = c("B", "M"))
bc$y <- as.integer(bc$diagnosis == "M")
bc <- bc[, !names(bc) %in% c("id", "diagnosis")]
str(bc)
summary(bc[, c("radius_mean", "texture_mean", "area_mean", "y")])## 'data.frame': 569 obs. of 31 variables:
## $ radius_mean : num 17.99 20.57 19.69 11.42 20.29 ...
## $ texture_mean : num 10.38 17.77 21.25 20.38 14.34 ...
## $ perimeter_mean : num 122.8 132.9 130 77.58 135.1 ...
## $ area_mean : num 1001 1326 1203 386.1 1297 ...
## [... 30 variabel numerik ...]
## $ y : int 1 1 1 0 0 ...
## Benign (y=0): 357 | Malignant (y=1): 212
## Proporsi — Benign: 0.6274 | Malignant: 0.3726
Tabel statistik deskriptif beberapa fitur kunci dikelompokkan berdasarkan diagnosis:
| Fitur | Malignant (n=212) Mean ± SD | Benign (n=357) Mean ± SD |
|---|---|---|
radius_mean |
17.463 ± 3.204 | 12.147 ± 1.781 |
texture_mean |
21.605 ± 3.780 | 17.915 ± 3.995 |
area_mean |
978.38 ± 367.94 | 462.79 ± 134.29 |
concavity_mean |
0.161 ± 0.075 | 0.046 ± 0.043 |
ℹ️ Info
Terlihat perbedaan substansial antara kelompok: sel tumor ganas memiliki radius, luas, dan cekungan yang jauh lebih besar dibandingkan sel jinak — konsisten dengan biologi tumor ganas yang tumbuh agresif.
# Standarisasi prediktor
X_scaled <- scale(bc[, -which(names(bc)=="y")])
# Model regresi logistik biner
model_bin <- glm(y ~ ., family = binomial,
data = data.frame(X_scaled, y = bc$y))
summary(model_bin)## Call:
## glm(formula = y ~ ., family = binomial, data = ...)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -3.4016 -0.0870 -0.0156 0.0307 2.8296
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.2209 0.2067 -1.069 0.2851
## radius_mean +0.3755 ...
## texture_mean +0.3820 ...
## ...
## texture_worst +1.3206 ... ***
## radius_se +1.2893 ... ***
## ...
## AIC: 89.45
Model regresi logistik biner diestimasi menggunakan seluruh 30 variabel prediktor yang telah distandarisasi (Z-score standardization). Nilai AIC digunakan sebagai salah satu indikator kualitas model.
Tabel berikut menyajikan seluruh koefisien beserta Odds Ratio untuk 30 fitur prediktor (diurutkan berdasarkan besaran |β|):
| Fitur | Koefisien (β) | OR = eβ | Arah |
|---|---|---|---|
texture_worst |
+1.3206 | 3.745 | ↑ Risiko |
radius_se |
+1.2893 | 3.630 | ↑ Risiko |
radius_worst |
+1.0266 | 2.792 | ↑ Risiko |
area_se |
+0.9989 | 2.715 | ↑ Risiko |
area_worst |
+0.9947 | 2.704 | ↑ Risiko |
concave points_mean |
+0.9628 | 2.619 | ↑ Risiko |
concave points_worst |
+0.9252 | 2.522 | ↑ Risiko |
symmetry_worst |
+0.8887 | 2.432 | ↑ Risiko |
concavity_worst |
+0.8802 | 2.411 | ↑ Risiko |
concavity_mean |
+0.8553 | 2.352 | ↑ Risiko |
perimeter_se |
+0.6719 | 1.958 | ↑ Risiko |
smoothness_worst |
+0.6658 | 1.946 | ↑ Risiko |
fractal_dimension_se |
−0.6817 | 0.506 | ↓ Protektif |
compactness_se |
−0.7441 | 0.475 | ↓ Protektif |
perimeter_worst |
+0.8204 | 2.271 | ↑ Risiko |
area_mean |
+0.4395 | 1.552 | ↑ Risiko |
fractal_dimension_worst |
+0.4870 | 1.627 | ↑ Risiko |
texture_mean |
+0.3820 | 1.465 | ↑ Risiko |
radius_mean |
+0.3755 | 1.456 | ↑ Risiko |
perimeter_mean |
+0.3609 | 1.435 | ↑ Risiko |
concave points_se |
+0.3231 | 1.381 | ↑ Risiko |
fractal_dimension_mean |
−0.3285 | 0.720 | ↓ Protektif |
symmetry_se |
−0.2950 | 0.744 | ↓ Protektif |
smoothness_se |
+0.2795 | 1.322 | ↑ Risiko |
Si (Si) |
— | — | — |
texture_se |
−0.2651 | 0.767 | ↓ Protektif |
compactness_mean |
−0.5607 | 0.571 | ↓ Protektif |
concavity_se |
−0.1012 | 0.904 | ↓ Protektif |
symmetry_mean |
−0.0763 | 0.927 | ↓ Protektif |
compactness_worst |
−0.0511 | 0.950 | ↓ Protektif |
smoothness_mean |
+0.1674 | 1.182 | ↑ Risiko |
Baris berwarna kuning = 10 fitur dengan |β| terbesar (pengaruh terkuat). OR dihitung dari prediktor terstandarisasi sehingga dapat dibandingkan secara langsung antar fitur.
# Prediksi dan confusion matrix
prob <- predict(model_bin, type = "response")
pred <- factor(ifelse(prob > 0.5, 1, 0))
confusionMatrix(pred, factor(bc$y))
# Kurva ROC dan AUC
roc_obj <- roc(bc$y, prob)
cat("AUC: ", auc(roc_obj))Confusion Matrix (threshold = 0.5):
Confusion Matrix:
| Pred: Benign | Pred: Malignant | |
|---|---|---|
| Aktual: Benign | 355 TN | 2 FP |
| Aktual: Malignant | 5 FN | 207 TP |
98.77% — Accuracy
99.74% — AUC-ROC
97.64% — Sensitivity
99.44% — Specificity
99.04% — PPV
98.61% — NPV
(Grafik: Kurva ROC — Regresi Logistik Biner (AUC = 0.9974) — silakan buat visualisasi menggunakan kode R di atas)
Berdasarkan hasil model, terdapat beberapa fitur yang menunjukkan pengaruh terkuat (OR tertinggi) terhadap probabilitas diagnosis Malignant. Interpretasi dilakukan melalui nilai Odds Ratio dari prediktor terstandarisasi:
1. texture_worst (OR = 3.745)
Fitur tekstur terburuk memiliki pengaruh terkuat. Setiap kenaikan 1 standar deviasi pada nilai tekstur terburuk meningkatkan odds terdiagnosis Malignant sebesar 3.745 kali, dengan asumsi variabel lain konstan. Tumor ganas menunjukkan heterogenitas sel yang ekstrem — tekstur inti sangat kasar karena pembelahan sel tidak terkontrol — sehingga nilai terburuknya sangat diskriminatif.
2. radius_se (OR = 3.630)
Standar error radius yang besar menunjukkan variasi ukuran inti sel yang signifikan antar sel dalam satu tumor. OR = 3.630 mengindikasikan bahwa variasi radius yang tinggi sangat kuat mengindikasikan keganasan, konsisten dengan sifat sel kanker yang heterogen dalam populasinya.
3. radius_worst dan area_worst (OR
~2.79 dan ~2.70)
Ukuran inti sel terbesar (kondisi terburuk) merefleksikan kemampuan tumor ganas untuk membentuk sel raksasa (giant cells). Nilai worst lebih informatif dari rata-rata karena menangkap ekspresi fenotip tumor yang paling agresif.
4. concave_points_mean dan
concave_points_worst (OR 2.619 dan 2.522)
Banyaknya cekungan pada kontur sel mencerminkan ketidaknormalan membran inti yang khas pada sel kanker. Sel ganas sering menginvasi jaringan sekitar dan menunjukkan tonjolan serta cekungan kontur yang tidak beraturan.
5. Fitur dengan Koefisien Negatif (OR < 1)
Beberapa fitur seperti compactness_se (OR = 0.475) dan
fractal_dimension_se (OR = 0.506) memiliki OR < 1. Nilai
ini menunjukkan efek protektif — namun ini perlu diinterpretasikan
secara hati-hati karena kemungkinan merupakan artefak dari
multikolinearitas yang sangat tinggi di antara 30 fitur yang
saling berkorelasi.
✅ Catatan
Performa sangat baik: Hanya 7 dari 569 observasi yang salah diklasifikasi (2 FP + 5 FN). Dari perspektif klinis, false negative (tumor ganas yang diprediksi jinak) lebih berbahaya — dan hanya 5 kasus FN menunjukkan model ini sangat sensitif untuk mendeteksi keganasan.
Model regresi logistik biner pada dataset Breast Cancer Wisconsin (569 observasi, 30 prediktor) berhasil membangun model prediksi diagnosis tumor yang sangat akurat. Hasil utama:
texture_worst,
radius_worst, area_worst — memiliki pengaruh
terkuat, dengan OR 2.7–3.7.radius_se,
area_se) merupakan prediktor kuat kedua, merefleksikan
heterogenitas tumor ganas.concave_points,
concavity) secara konsisten meningkatkan odds
keganasan.Regresi logistik multinomial merupakan perluasan dari regresi logistik biner untuk kasus di mana variabel respon berskala nominal dengan lebih dari dua kategori. Model ini memperkirakan log-odds setiap kategori relatif terhadap satu kategori referensi:
log( P(Y = j) / P(Y = ref) ) = β₀ⱼ + β₁ⱼX₁ + ⋯ + βₖⱼXₖ, j = 2, 3, …, J
dengan kategori referensi sebagai pembanding. Untuk setiap prediktor, terdapat J−1 set koefisien yang diestimasi secara simultan menggunakan MLE. Uji signifikansi parameter menggunakan uji Wald berdasarkan statistik-z.
Menganalisis komposisi kimiawi kaca untuk mengidentifikasi faktor-faktor yang membedakan tipe kaca — relevan dalam konteks forensik di mana identifikasi jenis kaca dari pecahan kriminalistik dapat mendukung penyelidikan.
Dataset yang digunakan adalah Glass Identification — UCI Machine Learning Repository (ID: 42). Dataset ini memuat hasil analisis kimia 214 sampel kaca dari berbagai penggunaan, dengan 9 prediktor kimiawi (% berat oksida) dan 1 variabel respon kategori tipe kaca.
| Variabel Prediktor | Keterangan | Satuan |
|---|---|---|
RI |
Refractive Index — indeks bias kaca | — |
Na |
Sodium — natrium oksida | % berat |
Mg |
Magnesium — magnesium oksida | % berat |
Al |
Aluminum — aluminium oksida | % berat |
Si |
Silicon — silikon dioksida (komponen utama) | % berat |
K |
Potassium — kalium oksida | % berat |
Ca |
Calcium — kalsium oksida | % berat |
Ba |
Barium — barium oksida | % berat |
Fe |
Iron — besi oksida | % berat |
Variabel respon adalah type dengan 6 kategori nominal
(tidak ada tipe 4 dalam dataset):
| Kode | Tipe Kaca | n | Proporsi |
|---|---|---|---|
| 2 | Building Non-Float glass (Referensi) | 76 | 35.5% |
| 1 | Building Float glass | 70 | 32.7% |
| 7 | Headlamps (lampu kendaraan) | 29 | 13.6% |
| 3 | Vehicle Float glass | 17 | 7.9% |
| 5 | Containers (kaca wadah/botol) | 13 | 6.1% |
| 6 | Tableware (peralatan makan) | 9 | 4.2% |
library(nnet)
# Import data mentah UCI (glass.data) - tanpa header
col_names_glass <- c("Id", "RI", "Na", "Mg", "Al", "Si", "K", "Ca", "Ba", "Fe", "type")
glass <- read.csv("data/glass.data", header = FALSE, col.names = col_names_glass)
glass <- glass[, -which(names(glass) == "Id")]
type_labels <- c(`1`="Building Float", `2`="Building Non-Float",
`3`="Vehicle Float", `5`="Containers",
`6`="Tableware", `7`="Headlamps")
glass$Type_label <- factor(type_labels[as.character(glass$type)],
levels = type_labels)
str(glass)
summary(glass[, c("Mg","Al","Na","Ba","RI")])## 'data.frame': 214 obs. of 11 variables:
## $ RI : num 1.521 1.518 1.516 ...
## $ Na : num 13.64 13.89 13.53 ...
## $ Mg : num 4.49 3.60 3.55 ...
## $ Al : num 1.10 1.36 1.54 ...
## [... 5 kolom lainnya ...]
## $ Type_label: Factor w/ 6 levels "Building Float","Building Non-Float",..
table(glass$Type_label)
# Rerata komponen per tipe kaca
aggregate(. ~ Type_label, data = glass[,c("Mg","Al","Na","Ba","RI","Type_label")],
FUN = mean)Tabel rerata komponen kimia per tipe kaca menunjukkan perbedaan yang substansial, terutama untuk Mg, Al, Na, dan Ba:
| Tipe Kaca | RI | Na | Mg | Al | Ba |
|---|---|---|---|---|---|
| Building Float | 1.5187 | 13.242 | 3.552 | 1.164 | 0.013 |
| Building Non-Float (Ref) | 1.5186 | 13.112 | 3.002 | 1.408 | 0.050 |
| Vehicle Float | 1.5180 | 13.437 | 3.544 | 1.201 | 0.009 |
| Containers | 1.5189 | 12.828 | 0.774 | 2.034 | 0.188 |
| Tableware | 1.5175 | 14.647 | 1.306 | 1.367 | 0.000 |
| Headlamps | 1.5171 | 14.442 | 0.538 | 2.123 | 1.040 |
(Grafik: Distribusi Frekuensi Tipe Kaca — silakan buat visualisasi menggunakan kode R di atas)
# Standarisasi prediktor
X_scaled <- scale(glass[, c("RI","Na","Mg","Al","Si","K","Ca","Ba","Fe")])
glass_scaled <- data.frame(X_scaled, Type = glass$Type_label)
# Kategori referensi: Building Non-Float (paling banyak)
glass_scaled$Type <- relevel(glass_scaled$Type, ref = "Building Non-Float")
# Model regresi multinomial
model_multi <- multinom(Type ~ ., data = glass_scaled, MaxNWts = 2000, maxit = 500)
summary(model_multi)## Call:
## multinom(formula = Type ~ ., data = glass_scaled, ...)
##
## Coefficients:
## RI Na Mg Al Si K Ca Ba Fe
## Building Float 0.432 -0.578 1.654 -1.600 0.276 0.128 -0.202 0.317 0.245
## Containers -0.270 -0.834 -1.017 1.586 -0.187 0.799 0.582 -0.140 0.201
## Headlamps 1.084 0.998 -1.107 1.092 1.016 0.769 -0.746 0.887 -0.351
## Tableware -0.171 1.404 -0.228 0.405 0.382 -1.446 0.269 -0.930 -0.815
## Vehicle Float -1.320 -0.274 0.855 -1.317 -1.078 -0.539 0.465 -0.156 0.238
##
## Residual Deviance: 256.47
## AIC: 356.47
Model menghasilkan 5 persamaan logit (J−1 = 6−1 = 5) dengan kategori referensi Building Non-Float. Masing-masing persamaan membandingkan probabilitas suatu tipe kaca terhadap referensi.
Tabel OR lengkap untuk setiap tipe kaca dibandingkan terhadap Building Non-Float (referensi):
a) Building Float vs. Building Non-Float:
| Komponen | β | OR = eβ | Interpretasi |
|---|---|---|---|
Mg |
+1.654 | 5.229 | Mg tinggi → odds BF vs BNF naik 5.2× |
RI |
+0.432 | 1.540 | RI tinggi → sedikit menaikkan odds BF |
Ba |
+0.317 | 1.373 | Ba lebih tinggi di BF vs BNF |
Al |
−1.600 | 0.202 | Al tinggi → odds BF vs BNF turun 80% |
Na |
−0.578 | 0.561 | Na lebih rendah di BF |
b) Containers vs. Building Non-Float:
| Komponen | β | OR | Interpretasi |
|---|---|---|---|
Al |
+1.586 | 4.885 | Al tinggi → odds Containers vs BNF naik 4.9× |
K |
+0.799 | 2.224 | K lebih tinggi di kaca wadah |
Ca |
+0.582 | 1.790 | Ca lebih tinggi di kaca wadah |
Na |
−0.834 | 0.434 | Na rendah → odds Containers naik (relatif) |
Mg |
−1.017 | 0.362 | Mg rendah — ciri khas kaca wadah industri |
c) Headlamps vs. Building Non-Float:
| Komponen | β | OR | Interpretasi |
|---|---|---|---|
RI |
+1.084 | 2.957 | RI tinggi — kaca optik lampu punya n tinggi |
Al |
+1.092 | 2.981 | Al tinggi — kaca borosilikat Al-enriched |
Ba |
+0.887 | 2.428 | Ba tinggi — ciri khas kaca optik Barium |
Na |
+0.998 | 2.713 | Na lebih tinggi di headlamps |
Mg |
−1.107 | 0.331 | Mg rendah di kaca lampu |
d) Tableware vs. Building Non-Float:
| Komponen | β | OR | Interpretasi |
|---|---|---|---|
Na |
+1.404 | 4.071 | Na sangat tinggi — kaca soda-lime peralatan makan |
Al |
+0.405 | 1.499 | Al sedikit lebih tinggi |
K |
−1.446 | 0.236 | K sangat rendah — khas kaca meja transparan |
Ba |
−0.930 | 0.395 | Ba sangat rendah di tableware |
Fe |
−0.815 | 0.443 | Fe rendah — kaca transparan minim warna |
e) Vehicle Float vs. Building Non-Float:
| Komponen | β | OR | Interpretasi |
|---|---|---|---|
RI |
−1.320 | 0.267 | RI jauh lebih rendah di kaca kendaraan |
Al |
−1.317 | 0.268 | Al sangat rendah — kaca kendaraan lebih murni |
Si |
−1.078 | 0.340 | Si relatif rendah dibanding referensi |
Mg |
+0.855 | 2.351 | Mg lebih tinggi — mirip kaca bangunan float |
(Grafik: Heatmap OR — Komponen Kimia × Tipe Kaca (vs. Building Non-Float) — silakan buat visualisasi menggunakan kode R di atas)
# Prediksi dan confusion matrix
pred_class <- predict(model_multi, type = "class")
confusionMatrix(pred_class, glass_scaled$Type)## Confusion Matrix and Statistics:
##
## Reference
## Prediction Building Float Building Non-Float Containers Headlamps Tableware Vehicle Float
## Building Float 52 18 0 1 0 10
## Building Non-Float 17 55 5 1 1 7
## Containers 0 1 7 0 0 0
## Headlamps 1 0 0 27 0 0
## Tableware 0 2 0 0 8 0
## Vehicle Float 0 0 1 0 0 0
##
## Overall Accuracy: 0.6963
## Macro-avg F1: 0.64
| Tipe Kaca | n | Precision | Recall | F1-Score |
|---|---|---|---|---|
| Building Float | 70 | 0.640 | 0.743 | 0.688 |
| Building Non-Float | 76 | 0.638 | 0.724 | 0.678 |
| Containers | 13 | 0.875 | 0.538 | 0.667 |
| Headlamps | 29 | 0.964 | 0.931 | 0.947 |
| Tableware | 9 | 0.800 | 0.889 | 0.842 |
| Vehicle Float | 17 | 0.000 | 0.000 | 0.000 |
| Overall | 214 | 0.653 | 0.638 | 0.696 |
⚠️ Peringatan
Vehicle Float tidak terklasifikasi sama sekali (precision dan recall = 0). Dari 17 sampel Vehicle Float, seluruhnya diprediksi sebagai Building Float atau Building Non-Float. Ini disebabkan oleh komposisi kimia yang sangat mirip antara kaca kendaraan float dan kaca bangunan float (Mg ~3.54 vs ~3.55), serta jumlah sampel yang sangat sedikit (17 dari 214).
1. Magnesium (Mg) — Pembeda Utama Kaca Float vs. Non-Float
Mg merupakan komponen kimia paling diskriminatif antara kaca float dan non-float, baik untuk bangunan maupun kendaraan. Kaca Building Float memiliki OR = 5.23 untuk Mg — artinya setiap kenaikan 1 SD kadar Mg meningkatkan odds menjadi Building Float (vs. Non-Float) sebesar 5.23 kali. Kaca float diproduksi dengan metode mengambang di atas timah cair pada suhu tinggi, yang memerlukan komposisi kimia spesifik termasuk kadar Mg yang lebih tinggi untuk kestabilan termal.
2. Aluminium (Al) — Penanda Kaca Industri dan Optik
Al sangat tinggi di Containers (OR = 4.885) dan Headlamps (OR = 2.981). Penambahan alumina (Al₂O₃) dalam produksi kaca meningkatkan ketahanan kimia, mekanik, dan termal — sangat penting untuk kaca botol dan kaca lampu kendaraan yang beroperasi pada suhu tinggi. Sebaliknya, Al sangat rendah di Building Float (OR = 0.202) yang mengutamakan transparansi tinggi.
3. Barium (Ba) — Penanda Khas Headlamps
Rata-rata kandungan Ba pada Headlamps (1.040) jauh melampaui semua tipe lain (< 0.19). OR = 2.428 dikonfirmasi oleh data deskriptif. Kaca barium digunakan pada lensa optik dan lampu kendaraan karena memberikan indeks bias tinggi — mendukung fokus cahaya yang optimal. Ini menjadikan Ba sebagai chemical fingerprint terkuat untuk kelas Headlamps.
4. Sodium (Na) — Penanda Tableware dan Headlamps
Tableware memiliki OR Na = 4.071, tertinggi di antara semua tipe. Kaca peralatan makan menggunakan kaca soda-lime dengan Na tinggi karena Na₂O berfungsi sebagai network modifier yang menurunkan titik leleh, memudahkan pembentukan, dan meningkatkan transparansi optik. Headlamps juga menunjukkan Na tinggi (OR = 2.713).
5. Vehicle Float — Tantangan Klasifikasi
Kaca kendaraan float memiliki komposisi yang sangat mirip dengan kaca bangunan float (keduanya menggunakan proses float), sehingga model gagal membedakannya. Dari perspektif kimia, perbedaan utama antara keduanya lebih terletak pada ketebalan dan proses pelapisan (coating) daripada komposisi dasar — yang tidak tercakup dalam 9 fitur kimia yang tersedia.
Model regresi logistik multinomial pada dataset Glass Identification (214 observasi, 6 kelas, 9 prediktor kimia) menghasilkan temuan utama:
Regresi logistik ordinal (proportional odds model) digunakan ketika variabel respon berskala ordinal — memiliki urutan kategori yang bermakna namun jarak antar kategori tidak diketahui. Model ini memperkirakan cumulative log-odds:
log( P(Y ≤ j) / P(Y > j) ) = αj − (β₁X₁ + β₂X₂ + ⋯ + βₖXₖ), j = 1, 2, …, J−1
dengan αj adalah threshold (intercept) spesifik untuk setiap batas kategori, dan β merepresentasikan efek prediktor yang bersifat konstan di seluruh batas. Asumsi utama model ini adalah proportional odds — pengaruh prediktor terhadap log-odds bersifat konstan di seluruh batas kategori, diuji dengan Brant test. Ukuran efek yang digunakan adalah Odds Ratio (OR) = eβ.
Menganalisis faktor-faktor teknis dan fisik kendaraan yang memengaruhi tingkat risiko asuransi (symboling) pada berbagai model mobil, serta mengidentifikasi prediktor yang secara signifikan mendorong kendaraan ke kategori risiko yang lebih tinggi.
Dataset yang digunakan adalah Automobile Data Set
dari UCI Machine Learning Repository. Dataset ini memuat spesifikasi
teknis dan harga 205 model kendaraan dari berbagai merek, lengkap dengan
penilaian risiko asuransi. Terdapat 59 observasi dengan nilai
hilang pada beberapa variabel (dihapus menggunakan
na.omit), menghasilkan 195 observasi
valid.
Variabel respon adalah symboling — penilaian risiko
asuransi dengan skala ordinal:
| Nilai | Interpretasi | n (setelah cleaning) |
|---|---|---|
| −2 | Sangat aman (risiko sangat rendah) | 3 |
| −1 | Aman | 22 |
| 0 | Netral | 64 |
| 1 | Berisiko ringan | 52 |
| 2 | Berisiko | 31 |
| 3 | Sangat berisiko | 27 |
Variabel prediktor yang digunakan dalam model:
| Variabel | Keterangan | Tipe |
|---|---|---|
wheel-base |
Jarak sumbu roda (inci) | Numerik |
length |
Panjang kendaraan (inci) | Numerik |
width |
Lebar kendaraan (inci) | Numerik |
height |
Tinggi kendaraan (inci) | Numerik |
curb-weight |
Berat kendaraan kosong (lbs) | Numerik |
engine-size |
Kapasitas mesin (cc) | Numerik |
horsepower |
Tenaga kuda mesin | Numerik |
city-mpg |
Konsumsi bahan bakar kota (mpg) | Numerik |
price |
Harga kendaraan (USD) | Numerik |
fuel-type |
Jenis bahan bakar (gas/diesel) | Kategorikal |
aspiration |
Sistem induksi (std/turbo) | Kategorikal |
# Import data dan preprocessing
library(MASS) # polr()
library(brant) # Brant test proportional odds
col_names <- c("symboling", "normalized-losses", "make", "fuel-type",
"aspiration", "num-of-doors", "body-style", "drive-wheels",
"engine-location", "wheel-base", "length", "width",
"height", "curb-weight", "engine-type", "num-of-cylinders",
"engine-size", "fuel-system", "bore", "stroke",
"compression-ratio", "horsepower", "peak-rpm",
"city-mpg", "highway-mpg", "price")
# File mentah UCI (imports-85.data) TIDAK punya baris header
auto <- read.csv("data/imports-85.data", header = FALSE,
na.strings = "?", col.names = col_names)
# Konversi variabel respon menjadi ordered factor
auto$symboling <- ordered(auto$symboling, levels = c(-2,-1,0,1,2,3))
auto$fuel.type <- factor(auto$fuel.type)
auto$aspiration <- factor(auto$aspiration)
# Hapus missing values
auto_clean <- na.omit(auto[, c("symboling", "wheel.base", "length",
"width", "height", "curb.weight",
"engine.size", "horsepower", "city.mpg",
"price", "fuel.type", "aspiration")])
cat("Observasi valid:", nrow(auto_clean), "\n")## Observasi valid: 195
## symboling
## -2 -1 0 1 2 3
## 3 22 64 52 31 27
##
## symboling
## -2 -1 0 1 2 3
## 0.0154 0.1128 0.3282 0.2667 0.1590 0.1385
Distribusi variabel respon menunjukkan bahwa mayoritas kendaraan berada pada kategori risiko netral (symboling = 0), sebesar 32,8%. Kendaraan yang sangat aman (symboling = −2) hanya berjumlah 3 unit — kategori ini sangat jarang, yang dapat mempengaruhi estimasi threshold model.
(Grafik: Distribusi Symboling (Tingkat Risiko Asuransi) — silakan buat visualisasi menggunakan kode R di atas)
Rerata beberapa prediktor per kategori symboling menunjukkan pola yang menarik:
| Symboling | wheel-base (mean) | length (mean) | height (mean) | curb-weight (mean) | price (mean) |
|---|---|---|---|---|---|
| −2 (paling aman) | 106.63 | 186.73 | 56.70 | 2964 | 15,782 |
| −1 | 103.39 | 183.45 | 55.43 | 2961 | 17,331 |
| 0 | 99.11 | 175.77 | 54.34 | 2718 | 14,477 |
| 1 | 93.56 | 167.77 | 52.48 | 2213 | 9,649 |
| 2 | 94.61 | 168.15 | 52.48 | 2330 | 10,116 |
| 3 (paling berisiko) | 95.48 | 170.41 | 51.11 | 2718 | 17,221 |
ℹ️ Info
Pola deskriptif: Kendaraan dengan symboling rendah (aman) cenderung memiliki wheel-base, panjang, tinggi, dan curb-weight yang lebih besar — konsisten dengan intuisi bahwa kendaraan besar (SUV, sedan mewah) dinilai lebih aman dibandingkan kendaraan kecil/sporty yang kompak.
# Model proportional odds
model_ord <- polr(
symboling ~ wheel.base + length + width + height +
curb.weight + engine.size + horsepower +
city.mpg + price + fuel.type + aspiration,
data = auto_clean,
Hess = TRUE
)
summary(model_ord)## Call:
## polr(formula = symboling ~ wheel.base + length + width + height +
## curb.weight + engine.size + horsepower + city.mpg + price +
## fuel.type + aspiration, data = auto_clean, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## wheel.base -0.1973 0.05241 -3.7651
## length -0.0513 0.02381 -2.1543
## width -0.0862 0.08103 -1.0638
## height -0.3341 0.06712 -4.9775
## curb.weight 0.0017 0.00123 1.3821
## engine.size 0.0019 0.00793 0.2395
## horsepower 0.0054 0.00867 0.6230
## city.mpg 0.0381 0.02886 1.3204
## price 0.0000 0.0000 0.5178
## fuel.typegas -0.7143 0.44512 -1.6049
## aspirationturbo 0.6129 0.30872 1.9857
##
## Intercepts:
## Value Std. Error t value
## -2|-1 -22.7854 2.2907 -9.9467
## -1|0 -19.9891 2.1371 -9.3534
## 0|1 -17.7461 2.0776 -8.5418
## 1|2 -16.2688 2.0519 -7.9286
## 2|3 -15.2091 2.0378 -7.4635
##
## Residual Deviance: 481.3462
## AIC: 511.3462
# Uji signifikansi dengan p-value dari distribusi normal
ctable <- coef(summary(model_ord))
p_val <- pnorm(abs(ctable[, 3]), lower.tail = FALSE) * 2
hasil_ord <- cbind(ctable, p.value = round(p_val, 4))
hasil_ord## Value Std. Error t value p.value
## wheel.base -0.1973 0.0524 -3.7651 0.0002 ***
## length -0.0513 0.0238 -2.1543 0.0312 *
## width -0.0862 0.0810 -1.0638 0.2874
## height -0.3341 0.0671 -4.9775 0.0000 ***
## curb.weight 0.0017 0.0012 1.3821 0.1670
## engine.size 0.0019 0.0079 0.2395 0.8107
## horsepower 0.0054 0.0087 0.6230 0.5333
## city.mpg 0.0381 0.0289 1.3204 0.1867
## price 0.0000 0.0000 0.5178 0.6046
## fuel.typegas -0.7143 0.4451 -1.6049 0.1085
## aspirationturbo 0.6129 0.3087 1.9857 0.0470 *
## -2|-1 -22.7854 2.2907 -9.9467 0.0000
## -1|0 -19.9891 2.1371 -9.3534 0.0000
## 0|1 -17.7461 2.0776 -8.5418 0.0000
## 1|2 -16.2688 2.0519 -7.9286 0.0000
## 2|3 -15.2091 2.0378 -7.4635 0.0000
## wheel.base length width height curb.weight engine.size
## 0.8210 0.9500 0.9174 0.7161 1.0017 1.0019
##
## horsepower city.mpg price fuel.typegas aspirationturbo
## 1.0054 1.0388 1.0000 0.4897 1.8461
Tabel lengkap Odds Ratio beserta signifikansinya:
| Prediktor | β | OR = eβ | Arah | p-value | Signifikan? |
|---|---|---|---|---|---|
wheel.base |
−0.1973 | 0.8210 | ↓ | 0.0002 | [***] |
height |
−0.3341 | 0.7161 | ↓ | 0.0000 | [***] |
length |
−0.0513 | 0.9500 | ↓ | 0.0312 | [*] |
aspirationturbo |
+0.6129 | 1.8461 | ↑ | 0.0470 | [*] |
width |
−0.0862 | 0.9174 | ↓ | 0.2874 | [ns] |
curb.weight |
+0.0017 | 1.0017 | ↑ | 0.1670 | [ns] |
engine.size |
+0.0019 | 1.0019 | ↑ | 0.8107 | [ns] |
horsepower |
+0.0054 | 1.0054 | ↑ | 0.5333 | [ns] |
city.mpg |
+0.0381 | 1.0388 | ↑ | 0.1867 | [ns] |
price |
≈0.000 | 1.0000 | — | 0.6046 | [ns] |
fuel.typegas |
−0.7143 | 0.4897 | ↓ | 0.1085 | [ns] |
## ----------------------------------------
## Test for X2 df probability
## ----------------------------------------
## Omnibus 53.82 44 0.147
## wheel.base 4.97 4 0.290
## length 5.12 4 0.275
## width 3.28 4 0.512
## height 7.41 4 0.116
## curb.weight 5.09 4 0.278
## engine.size 2.19 4 0.701
## horsepower 3.84 4 0.428
## city.mpg 4.41 4 0.354
## price 2.56 4 0.634
## fuel.typegas 3.50 4 0.478
## aspirationturbo 4.22 4 0.377
## ----------------------------------------
## H'0: Parallel Regression Assumption holds
✅ Catatan
Asumsi terpenuhi: Brant test omnibus menghasilkan p-value = 0.147 > 0.05, sehingga asumsi proportional odds (regresi paralel) tidak dapat ditolak pada taraf signifikansi 5%. Model ordinal dapat digunakan dengan valid.
Berdasarkan model proportional odds yang diestimasi
menggunakan polr(), interpretasi mengacu pada koefisien dan
p-value dari hasil uji Wald. Koefisien negatif berarti
prediktor tersebut menurunkan odds kendaraan berada di kategori
symboling yang lebih tinggi (lebih berisiko), dan sebaliknya. Empat
variabel terbukti signifikan secara statistis (p < 0.05):
wheel.base) — OR = 0.821, p =
0.0002 (*)**Variabel dengan signifikansi tertinggi. Setiap pertambahan 1 inci
jarak sumbu roda menurunkan odds berada di kategori risiko yang lebih
tinggi sebesar 17,9%. Secara substantif, kendaraan
dengan wheelbase panjang umumnya adalah sedan, SUV, atau minivan yang
memiliki stabilitas lebih tinggi, pusat gravitasi lebih rendah, dan
footprint yang lebih lebar — karakteristik yang berkorelasi kuat dengan
keselamatan kendaraan di jalan raya. 2. Tinggi kendaraan
(height) — OR = 0.716, p < 0.0001 (*)**
Prediktor paling kuat berdasarkan besar |β|. Setiap pertambahan 1
inci tinggi kendaraan menurunkan odds masuk ke kategori risiko lebih
tinggi sebesar 28,4%. Kendaraan tinggi (wagon, SUV,
MPV) dinilai lebih aman oleh underwriter asuransi karena ruang kabin
yang luas memberikan zona deformasi lebih baik dan perlindungan
penumpang yang lebih memadai. 3. **Panjang kendaraan
(length) — OR = 0.950, p = 0.0312 (*)**
Setiap pertambahan 1 inci panjang kendaraan menurunkan odds berada di
kategori risiko lebih tinggi sebesar 5,0%. Kendaraan
yang lebih panjang umumnya memiliki crumple zone yang lebih
besar, sehingga menyerap energi benturan lebih baik. 4. **Turbocharger
(aspirationturbo) — OR = 1.846, p = 0.0470 (*)**
Kendaraan dengan mesin turbo memiliki odds berada di kategori risiko lebih tinggi 1.846 kali dibandingkan kendaraan non-turbo. Mesin turbo menghasilkan tenaga yang lebih besar dari volume mesin yang sama, memungkinkan akselerasi lebih agresif — faktor yang dinilai lebih berisiko oleh perusahaan asuransi karena potensi perilaku mengemudi yang lebih cepat dan agresif.
⚠️ Peringatan
Variabel tidak signifikan:
width,curb-weight,engine-size,horsepower,city-mpg,price, danfuel-typetidak menunjukkan pengaruh signifikan (p > 0.05) setelah mengontrol variabel lainnya. Ini kemungkinan disebabkan oleh multikolinearitas yang tinggi antar dimensi fisik kendaraan (panjang, lebar, tinggi, dan berat saling berkorelasi kuat).
Model regresi logistik ordinal pada dataset Automobile (195 observasi valid, 11 prediktor, 6 kategori ordinal) berhasil mengidentifikasi empat prediktor signifikan yang memengaruhi tingkat risiko asuransi kendaraan:
wheel.base — Wheelbase panjang menurunkan risiko (OR =
0.821, ***)height — Kendaraan tinggi menurunkan risiko (OR =
0.716, ***)length — Kendaraan panjang menurunkan risiko (OR =
0.950, *)aspirationturbo — Mesin turbo meningkatkan risiko (OR =
1.846, *)Asumsi proportional odds terpenuhi berdasarkan Brant test omnibus (p = 0.147). Model memiliki AIC = 511.3, dan secara keseluruhan menunjukkan bahwa dimensi fisik kendaraan (khususnya panjang sumbu roda dan tinggi badan) merupakan faktor paling menentukan dalam penilaian risiko asuransi, jauh lebih dominan dibanding tenaga mesin atau harga kendaraan.
Regresi Poisson digunakan untuk memodelkan variabel respon berupa data cacahan (count data) yang mengikuti distribusi Poisson. Model ini menggunakan fungsi link logaritmik:
log(μᵢ) = β₀ + β₁Xi1 + β₂Xi2 + ⋯ + βₖXik
dengan μᵢ = E(Yᵢ) adalah nilai harapan cacahan. Asumsi dasar distribusi Poisson adalah equidispersion: rata-rata sama dengan variansi (E(Y) = Var(Y) = μ). Apabila variansi melebihi rata-rata (overdispersion), model alternatif seperti Negative Binomial lebih sesuai. Ukuran efek yang digunakan adalah Incidence Rate Ratio (IRR) = eβ̂.
Menganalisis faktor-faktor meteorologi dan temporal yang memengaruhi jumlah peminjaman sepeda per jam (Rented Bike Count) di kota Seoul, Korea Selatan, serta mengevaluasi kesesuaian model Poisson versus Negative Binomial akibat kemungkinan overdispersion.
Dataset yang digunakan adalah Seoul Bike Sharing Demand yang tersedia di UCI Machine Learning Repository. Dataset ini memuat data per jam selama satu tahun penuh (2017–2018) di kota Seoul, mencakup 8.760 observasi dengan informasi meteorologi lengkap. Tidak terdapat missing values.
Variabel respon adalah Rented Bike Count — jumlah sepeda
yang disewa per jam (data cacahan non-negatif).
Variabel prediktor yang digunakan:
| Variabel | Keterangan | Tipe |
|---|---|---|
Hour |
Jam pengamatan (0–23) | Numerik |
Temperature |
Suhu udara (°C) | Numerik |
Humidity |
Kelembaban udara (%) | Numerik |
Wind.speed |
Kecepatan angin (m/s) | Numerik |
Visibility |
Jarak pandang (10m) | Numerik |
Solar.Radiation |
Radiasi matahari (MJ/m²) | Numerik |
Rainfall |
Curah hujan (mm) | Numerik |
Snowfall |
Salju (cm) | Numerik |
Seasons |
Musim (Spring/Summer/Autumn/Winter) | Kategorikal |
Holiday |
Status hari libur (Holiday/No Holiday) | Kategorikal |
Functioning.Day |
Hari operasional sistem (Yes/No) | Kategorikal (filter) |
# Import data
bike <- read.csv("data/SeoulBikeData.csv", fileEncoding = "latin1")
# Rename kolom untuk kemudahan
names(bike) <- c("Date", "Count", "Hour", "Temp", "Humidity",
"WindSpeed", "Visibility", "DewPoint",
"SolarRad", "Rainfall", "Snowfall",
"Seasons", "Holiday", "FuncDay")
# Filter: hanya hari operasional
bike_func <- subset(bike, FuncDay == "Yes")
bike_func$Seasons <- factor(bike_func$Seasons)
bike_func$Holiday <- factor(bike_func$Holiday)
cat("Total observasi (hari operasional):", nrow(bike_func), "\n")
cat("Missing values:", sum(is.na(bike_func)), "\n")## Total observasi (hari operasional): 8465
## Missing values: 0
cat("Mean Count:", round(mean(bike_func$Count), 4), "\n")
cat("Var Count:", round(var(bike_func$Count), 4), "\n")
cat("Var/Mean :", round(var(bike_func$Count)/mean(bike_func$Count), 4), "\n")
# Rata-rata per musim
tapply(bike_func$Count, bike_func$Seasons, mean)## Mean Count: 729.1570
## Var Count: 412615.0206
## Var/Mean : 565.8795
##
## Autumn Spring Summer Winter
## 924.11 746.25 1034.07 225.54
⚠️ Perhatian
Overdispersion sangat ekstrem: Rasio Var/Mean = 565.9 — jauh melampaui ambang Poisson (= 1). Ini merupakan indikasi sangat kuat bahwa model Negative Binomial akan jauh lebih sesuai dibanding model Poisson dasar.
(Grafik: Rata-rata Peminjaman Sepeda per Jam menurut Musim — silakan buat visualisasi menggunakan kode R di atas)
model_pois <- glm(
Count ~ Hour + Temp + Humidity + WindSpeed +
Visibility + SolarRad + Rainfall + Snowfall +
Seasons + Holiday,
family = poisson(link = "log"),
data = bike_func
)
summary(model_pois)## Call:
## glm(formula = Count ~ Hour + Temp + Humidity + WindSpeed +
## Visibility + SolarRad + Rainfall + Snowfall + Seasons + Holiday,
## family = poisson(link = "log"), data = bike_func)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 5.285829 0.015694 336.80 <2e-16 ***
## Hour 0.041261 0.000410 100.59 <2e-16 ***
## Temp 0.021389 0.000398 53.74 <2e-16 ***
## Humidity -0.006908 0.000134 -51.53 <2e-16 ***
## WindSpeed 0.021019 0.001110 18.93 <2e-16 ***
## Visibility 0.000087 0.000005 17.40 <2e-16 ***
## SolarRad 0.132847 0.004261 31.18 <2e-16 ***
## Rainfall -0.095213 0.003010 -31.63 <2e-16 ***
## Snowfall -0.135401 0.009052 -14.96 <2e-16 ***
## SeasonsSpring 0.493815 0.007261 68.02 <2e-16 ***
## SeasonsSummer 0.547302 0.007528 72.70 <2e-16 ***
## SeasonsWinter -0.556804 0.008143 -68.37 <2e-16 ***
## HolidayNo Holiday 0.217631 0.006258 34.78 <2e-16 ***
##
## Residual Deviance: 530241 on 8452 degrees of freedom
## AIC: 603083
## IRR 2.5 % 97.5 %
## (Intercept) 197.09 191.02 203.35
## Hour 1.0422 1.0413 1.0430
## Temp 1.0216 1.0208 1.0224
## Humidity 0.9931 0.9928 0.9934
## WindSpeed 1.0212 1.0190 1.0234
## Visibility 1.0001 1.0001 1.0001
## SolarRad 1.1421 1.1332 1.1511
## Rainfall 0.9092 0.9035 0.9150
## Snowfall 0.8733 0.8567 0.8901
## SeasonsSpring 1.6386 1.6148 1.6629
## SeasonsSummer 1.7284 1.6999 1.7573
## SeasonsWinter 0.5727 0.5640 0.5816
## HolidayNo Holiday 1.2432 1.2282 1.2584
| Prediktor | IRR | Arah | Interpretasi Singkat |
|---|---|---|---|
SeasonsSummer |
1.7284 | ↑ +72.8% | Musim panas: peminjaman terbanyak vs. Autumn |
SeasonsSpring |
1.6386 | ↑ +63.9% | Musim semi: jauh lebih tinggi dari Autumn |
HolidayNo Holiday |
1.2432 | ↑ +24.3% | Hari kerja lebih tinggi dari hari libur |
SolarRad |
1.1421 | ↑ +14.2% | Radiasi matahari tinggi → lebih banyak bersepeda |
Hour |
1.0422 | ↑ per jam | Setiap jam bertambah → peminjaman naik 4.2% |
Temp |
1.0216 | ↑ per °C | Suhu lebih hangat → lebih banyak bersepeda |
WindSpeed |
1.0212 | ↑ per m/s | Angin sedang → sedikit meningkatkan peminjaman |
SeasonsWinter |
0.5727 | ↓ −42.7% | Musim dingin: peminjaman terendah |
Snowfall |
0.8733 | ↓ −12.7% | Salju: menghalangi aktivitas bersepeda |
Rainfall |
0.9092 | ↓ −9.1% | Hujan: mengurangi peminjaman per mm |
Humidity |
0.9931 | ↓ per % | Kelembaban tinggi → sedikit mengurangi peminjaman |
# Hitung rasio dispersi Pearson
phi <- sum(residuals(model_pois, type = "pearson")^2) / model_pois$df.residual
cat("Rasio Dispersi (φ̂ = χ²_P / df):", round(phi, 4), "\n")
if(phi > 1.5){
cat("→ OVERDISPERSION terdeteksi. Model Negative Binomial direkomendasikan.\n")
}## Rasio Dispersi (φ̂ = χ²_P / df): 312.47
## → OVERDISPERSION terdeteksi. Model Negative Binomial direkomendasikan.
⚠️ Perhatian
Overdispersion ekstrem: φ̂ = 312.47 — variansi aktual adalah 312 kali lebih besar dari yang diasumsikan model Poisson. Standard error dari model Poisson sangat underestimated, sehingga semua prediktor tampak sangat signifikan (z-value sangat besar). Inferensi dari model Poisson tidak dapat diandalkan.
library(MASS)
model_nb <- glm.nb(
Count ~ Hour + Temp + Humidity + WindSpeed +
Visibility + SolarRad + Rainfall + Snowfall +
Seasons + Holiday,
data = bike_func
)
summary(model_nb)
cat("\nPerbandingan AIC:\n")
AIC(model_pois, model_nb)## Call:
## glm.nb(formula = Count ~ Hour + Temp + Humidity + WindSpeed +
## Visibility + SolarRad + Rainfall + Snowfall + Seasons + Holiday,
## data = bike_func, init.theta = 1.497)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 5.42504 0.17208 31.528 <2e-16 ***
## Hour 0.04146 0.00454 9.133 <2e-16 ***
## Temp 0.02175 0.00455 4.780 1.76e-06 ***
## Humidity -0.00690 0.00157 -4.395 1.11e-05 ***
## WindSpeed 0.01983 0.01235 1.605 0.1084
## Visibility 0.00009 0.00005 1.648 0.0996
## SolarRad 0.13311 0.04843 2.749 0.0060 **
## Rainfall -0.10258 0.03497 -2.933 0.0034 **
## Snowfall -0.11894 0.08571 -1.388 0.1652
## SeasonsSpring 0.49617 0.08182 6.064 1.33e-09 ***
## SeasonsSummer 0.55203 0.08684 6.357 2.07e-10 ***
## SeasonsWinter -0.54743 0.09082 -6.027 1.67e-09 ***
## HolidayNo Holiday 0.21481 0.07117 3.019 0.0025 **
##
## Theta: 1.4972
## Residual Deviance: 9671.9 on 8452 df
## AIC: 112041
##
## Perbandingan AIC:
## df AIC
## model_pois 13 603083
## model_nb 14 112041
✅ Catatan
Model NB jauh lebih baik: AIC model Negative Binomial (112.041) jauh lebih kecil dari model Poisson (603.083) — selisih >490.000 poin AIC. Model NB memberikan estimasi standard error yang lebih konservatif dan inferensi yang jauh lebih dapat diandalkan. Parameter dispersi θ = 1.497 (α = 1/θ ≈ 0.668) mengkonfirmasi overdispersion substansial.
(Grafik: Perbandingan AIC — Poisson vs. Negative Binomial — silakan buat visualisasi menggunakan kode R di atas)
Berdasarkan model Negative Binomial yang dipilih sebagai model final karena menangani overdispersion dengan lebih baik, berikut interpretasi prediktor berdasarkan IRR = exp(β):
SeasonsSummer) — IRR = 1.728, p
< 0.001Faktor musim paling dominan. Dibandingkan musim gugur (referensi),
jam-jam di musim panas menghasilkan rata-rata peminjaman 72,8%
lebih tinggi. Cuaca hangat, siang hari yang panjang, dan
kondisi jalan kering mendorong penggunaan sepeda secara masif sebagai
moda transportasi maupun rekreasi. 2. Musim Semi
(SeasonsSpring) — IRR = 1.639, p < 0.001
Musim semi memberikan kondisi ideal bersepeda: suhu sedang dan
vegetasi mekar. Peminjaman 63,9% lebih tinggi dari
musim gugur — menunjukkan bahwa musim panas dan semi secara bersama-sama
merupakan puncak penggunaan sistem bike-sharing. 3. Musim Dingin
(SeasonsWinter) — IRR = 0.573, p < 0.001
Sebaliknya, musim dingin menurunkan peminjaman sebesar
42,7% dibanding musim gugur. Suhu di bawah nol, salju,
dan jalan licin membuat bersepeda tidak praktis dan berbahaya. 4.
Hari Kerja (HolidayNo Holiday) — IRR = 1.215, p =
0.0025
Hari kerja menghasilkan peminjaman 21,5% lebih
tinggi dari hari libur. Ini mengindikasikan bahwa sepeda
digunakan secara signifikan sebagai moda komuter harian
(bukan sekadar rekreasi akhir pekan) oleh warga Seoul. 5. Jam
(Hour) — IRR = 1.042, p < 0.001
Setiap pertambahan 1 jam (dari tengah malam ke tengah malam
berikutnya secara linear) meningkatkan peminjaman ~4.2%. Efek ini
mencerminkan pola rush hour pagi dan sore sebagai puncak
penggunaan komuter. 6. Suhu (Temp) — IRR = 1.022, p
< 0.001
Setiap kenaikan 1°C meningkatkan rata-rata peminjaman sebesar 2.2%.
Suhu nyaman (10–25°C) sangat mendorong aktivitas bersepeda. 7.
Curah Hujan (Rainfall) — IRR = 0.909, p =
0.0034
Setiap mm hujan menurunkan peminjaman sekitar 9.1%. Hujan merupakan
hambatan signifikan — namun efeknya relatif moderat per mm, menunjukkan
bahwa gerimis ringan belum sepenuhnya menghentikan penggunaan sepeda. 8.
Kelembaban (Humidity) — IRR = 0.993, p <
0.001
Setiap kenaikan 1% kelembaban menurunkan peminjaman sekitar 0.7%. Efek per unit kecil, namun dengan rentang kelembaban 0–100%, efek kumulatifnya cukup bermakna.
⚠️ Peringatan
Variabel tidak signifikan dalam model NB:
WindSpeed(p = 0.1084),Visibility(p = 0.0996), danSnowfall(p = 0.1652) tidak terbukti signifikan pada taraf 5% dalam model NB — berbeda dari model Poisson yang menunjukkan semua variabel signifikan akibat underestimasi SE. Ini menunjukkan pentingnya mengoreksi overdispersion sebelum membuat inferensi.
Analisis regresi Poisson pada data Seoul Bike Sharing (8.465 observasi operasional) mengidentifikasi bahwa jumlah peminjaman sepeda per jam dipengaruhi secara signifikan oleh faktor musim, kondisi cuaca, dan pola temporal. Namun, uji overdispersion mengungkap φ̂ = 312.47 — jauh di atas ambang equidispersion — sehingga model Negative Binomial dipilih sebagai model final (AIC = 112.041 vs. Poisson: 603.083).
Dari model NB final, prediktor signifikan (p < 0.05) adalah:
Hour, Temp, Humidity,
SolarRad, Rainfall — faktor meteorologi dan
temporalSeasonsSpring, SeasonsSummer,
SeasonsWinter — musim sebagai faktor terdominanHolidayNo Holiday — hari kerja menghasilkan permintaan
lebih tinggi, mengkonfirmasi fungsi komuterTemuan ini relevan untuk kebijakan manajemen fleet: armada sepeda perlu diperbesar di musim panas dan jam sibuk, serta perlu ada mekanisme redistribusi cepat saat hujan turun. Musim dingin Seoul yang ekstrem membuat permintaan turun drastis — operator dapat memanfaatkan periode ini untuk pemeliharaan armada.
Keempat model regresi yang digunakan dalam laporan ini dipilih berdasarkan karakteristik variabel respon masing-masing dataset. Tabel berikut merangkum perbandingan antar model:
| Model | Jenis Respon | Dataset | Var. Respon | Ukuran Efek | Keterangan |
|---|---|---|---|---|---|
| Logistik Biner | Kategorik 2 kelas | Breast Cancer Wisconsin | diagnosis (M/B) | Odds Ratio (OR) | AUC = 0.9974, akurasi 98.77% |
| Multinomial | Nominal > 2 kelas | Glass Identification | type (6 kelas) | Odds Ratio (OR) | Referensi = Building Non-Float |
| Ordinal | Ordinal bertingkat | Automobile | symboling (−2 s.d. 3) | Odds Ratio (OR) | Asumsi proportional odds terpenuhi |
| Poisson | Count data | Seoul Bike Sharing | Rented Bike Count | IRR | Overdispersion → NB lebih baik |
Laporan ini mendemonstrasikan penerapan empat model regresi yang berbeda sesuai dengan karakteristik variabel respon masing-masing. Pemilihan model yang tepat merupakan langkah kritis dalam analisis statistika karena penggunaan model yang tidak sesuai dapat menghasilkan estimasi yang bias, standard error yang keliru, dan inferensi yang menyesatkan.
Beberapa poin penting yang dapat disimpulkan dari keseluruhan analisis: