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

1. Pendahuluan

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.


2. Regresi Logistik Biner — Breast Cancer Wisconsin Diagnostic

2.1 Landasan Teori

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β̂.

2.2 Tujuan Analisis

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).

2.3 Deskripsi Data

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).

2.4 Import dan Eksplorasi Data

# 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 ...

2.5 Statistik Deskriptif

table(bc$y)
round(prop.table(table(bc$y)), 4)
## Benign (y=0): 357  |  Malignant (y=1): 212
## Proporsi — Benign: 0.6274  |  Malignant: 0.3726
  • 569 — Total Observasi
  • 212 — Malignant (37.3%)
  • 357 — Benign (62.7%)
  • 30 — Prediktor
  • 0 — Missing Values

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.

2.6 Pemodelan

# 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.

2.7 Odds Ratio

exp(cbind(OR = coef(model_bin), confint(model_bin)))

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.

2.8 Evaluasi Model

# 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)

2.9 Interpretasi

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.

2.10 Kesimpulan

Model regresi logistik biner pada dataset Breast Cancer Wisconsin (569 observasi, 30 prediktor) berhasil membangun model prediksi diagnosis tumor yang sangat akurat. Hasil utama:

  1. Fitur morfologi dari kelompok worst (nilai terburuk sel) — terutama texture_worst, radius_worst, area_worst — memiliki pengaruh terkuat, dengan OR 2.7–3.7.
  2. Fitur variabilitas ukuran sel (radius_se, area_se) merupakan prediktor kuat kedua, merefleksikan heterogenitas tumor ganas.
  3. Fitur geometri kontur (concave_points, concavity) secara konsisten meningkatkan odds keganasan.
  4. Model mencapai AUC = 0.9974, akurasi 98.77%, sensitivitas 97.64%, dan spesifisitas 99.44% — performa luar biasa yang menjanjikan sebagai alat bantu diagnostik otomatis.

3. Regresi Logistik Multinomial — Glass Identification

3.1 Landasan Teori

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.

3.2 Tujuan Analisis

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.

3.3 Deskripsi Data

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%

3.4 Import dan Eksplorasi Data

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",..

3.5 Statistik Deskriptif

table(glass$Type_label)
# Rerata komponen per tipe kaca
aggregate(. ~ Type_label, data = glass[,c("Mg","Al","Na","Ba","RI","Type_label")],
          FUN = mean)
  • 214 — Total Observasi
  • 6 — Kategori
  • 9 — Prediktor
  • 69.6% — Akurasi Model

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)

3.6 Pemodelan

# 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.

3.7 Odds Ratio

exp(coef(model_multi))

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)

3.8 Evaluasi Model

# 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).

3.9 Interpretasi

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.

3.10 Kesimpulan

Model regresi logistik multinomial pada dataset Glass Identification (214 observasi, 6 kelas, 9 prediktor kimia) menghasilkan temuan utama:

  1. Mg dan Al adalah komponen kimia paling diskriminatif antar tipe kaca, dengan OR tertinggi di beberapa persamaan logit.
  2. Ba menjadi penanda unik Headlamps — nilai OR dan rata-rata Ba yang jauh di atas tipe lain menjadikannya chemical fingerprint kategori ini.
  3. Na tinggi mengidentifikasi Tableware (kaca soda-lime) dan Headlamps; Na rendah mengidentifikasi Containers.
  4. Model mencapai akurasi keseluruhan 69.6% dengan performa terbaik pada Headlamps (F1 = 0.947) dan Tableware (F1 = 0.842), namun gagal mengklasifikasikan Vehicle Float akibat kemiripan komposisi dengan Building Float dan jumlah sampel yang terlalu sedikit.
  5. Untuk meningkatkan performa, diperlukan tambahan data pada kelas minoritas (Vehicle Float, Tableware, Containers) dan kemungkinan penambahan fitur seperti ketebalan kaca atau metode produksi.

4. Regresi Logistik Ordinal — Automobile Risk Rating

4.1 Landasan Teori

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β.

4.2 Tujuan Analisis

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.

4.3 Deskripsi Data

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

4.4 Import & Eksplorasi Data

# 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

4.5 Statistik Deskriptif

table(auto_clean$symboling)
round(prop.table(table(auto_clean$symboling)), 4)
## 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
  • 195 — Obs Valid
  • 6 — Kategori Ordinal
  • 11 — Prediktor
  • 10 — Missing (dihapus)

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.

4.6 Pemodelan

# 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

4.7 Odds Ratio

round(exp(coef(model_ord)), 4)
##  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]

4.8 Uji Asumsi Proportional Odds (Brant Test)

# Brant test: H0 = asumsi proportional odds terpenuhi
library(brant)
brant(model_ord)
## ----------------------------------------
## 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.

4.9 Interpretasi

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):

  1. Wheel-base (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, dan fuel-type tidak 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).

4.10 Kesimpulan

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.


5. Regresi Poisson — Seoul Bike Sharing

5.1 Landasan Teori

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β̂.

5.2 Tujuan Analisis

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.

5.3 Deskripsi Data

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)

5.4 Import & Eksplorasi Data

# 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

5.5 Statistik Deskriptif

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
  • 8,465 — Observasi
  • 729.2 — Mean Count/jam
  • 565.9× — Var/Mean Ratio
  • 3,556 — Max Count

⚠️ 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)

5.6 Model Poisson

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

5.7 Incidence Rate Ratio (IRR)

round(exp(cbind(IRR = coef(model_pois), confint(model_pois))), 4)
##                        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

5.8 Uji Overdispersion

# 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.

5.9 Model Negative Binomial

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)

5.10 Interpretasi (Model Final: Negative Binomial)

Berdasarkan model Negative Binomial yang dipilih sebagai model final karena menangani overdispersion dengan lebih baik, berikut interpretasi prediktor berdasarkan IRR = exp(β):

  1. Musim Panas (SeasonsSummer) — IRR = 1.728, p < 0.001

Faktor 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), dan Snowfall (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.

5.11 Kesimpulan

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 temporal
  • SeasonsSpring, SeasonsSummer, SeasonsWinter — musim sebagai faktor terdominan
  • HolidayNo Holiday — hari kerja menghasilkan permintaan lebih tinggi, mengkonfirmasi fungsi komuter

Temuan 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.


6. Perbandingan Model

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

7. Penutup

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:

  • Kesesuaian model dengan tipe data adalah prasyarat utama: biner untuk dua kategori, multinomial untuk nominal lebih dari dua, ordinal untuk kategori berurutan, dan Poisson (atau Negative Binomial) untuk data cacahan.
  • Uji asumsi seperti overdispersion (Poisson) dan proportional odds (ordinal) harus selalu dilakukan untuk memvalidasi pilihan model sebelum menarik kesimpulan.
  • Odds Ratio dan Incidence Rate Ratio adalah ukuran efek yang lebih mudah diinterpretasikan secara substantif dibandingkan koefisien mentah (log-odds atau log-skala).
  • Faktor-faktor yang teridentifikasi dari keempat dataset memiliki konsistensi yang kuat dengan temuan-temuan dalam literatur ilmiah yang relevan.