# clear-up the environment
rm(list = ls())

# chunk options
knitr::opts_chunk$set(
  message = FALSE,
  warning = FALSE,
  fig.align = "center",
  comment = "#>"
)

# scientific notation
options(scipen = 9999)

1 Introduction to Machine Learning

Tujuan dari machine learning adalah membuat mesin yang dapat belajar sendiri dalam memahami pola data hingga mengestimasi apa yang akan terjadi di masa depan.

1.1 Supervised dan Unsupervised Learning

  1. Supervised Learning: memiliki target variable, yaitu nilai yang ingin diprediksi
  • Regression: target variable nya numerik
  • Classification: target variable nya kategorik
  1. Unsupervised Learning: tidak memiliki target variable
  • Clustering
  • Dimensionality Reduction

2 Supervised Learning - Linear Regression

Regresi adalah salah satu algoritma supervised learning dimana kita akan memprediksi nilai target variabel (y) yang memiliki tipe numerik berdasarkan variabel prediktor (x) yang dapat memiliki tipe numerik atau kategorikal.

Dalam memilih variabel target atau prediktor biasanya dikaitkan dengan masalah bisnis yang akan diselesaikan.

Formula model regresi:

\[ \hat{y}=\beta_0+\beta_1.x_1+...+\beta_n.x_n \]

Keterangan:

  • \(\hat{y}\) adalah variable target
  • \(\beta_0\) adalah intercept (nilai titik potong sumbu y)
  • \(\beta_1, ..., \beta_n\) adalah coefficient dari prediktor (slope atau kemiringan garis)
  • \(x_1, ..., x_n\) adalah nilai dari prediktor

2.1 Regression Modeling Workflow

Berikut adalah runtutan workflow yang akan kita coba ikuti:

  • Mempersiapkan data
  • Exploratory Data Analysis (EDA)
  • Membuat model regresi & interpretasi
  • Melakukan prediksi pada data masa depan
  • Evaluasi error
  • Pengecekan asumsi (Akan dibahas pada hari Kamis)

Untuk lebih memahami mengenai setiap bagian workflow linear regression, mari kita langsung membahas sebuah kasus.

2.2 Case 1: Profit Prediction

Dalam perkenalan dengan Regression Models, kita akan menggunakan data copiers.csv. Dari data tersebut kita akan mencoba untuk memprediksi profit yang kiranya berhasil didapatkan berdasarkan data sales.

2.2.1 Mempersiapkan data

  • Import Library
# Please run the code down below
library(dplyr)
library(lubridate)
  • Membaca data
# Please run the code down below
copiers <- read.csv("data_input/copiers.csv", 
                    stringsAsFactors = T) # mengubah semua tipe data string menjadi factor
head(copiers)

Deskripsi kolom:

  • Row.ID = Nomer baris
  • Order.ID = Unique ID pemesanan
  • Order.Date = Tanggal pemesanan
  • Ship.Date = Tanggal pengiriman barang
  • Ship.Mode = Jenis pengiriman yang dipilih customer
  • Customer.ID = Unique ID customer
  • Segment = Segmentasi/kategori custoemr
  • Product.ID = Unique ID barang
  • Category = Kateogri barang
  • Sub.Category = Sub Kategori barang
  • Product.Name = Nama produk barang
  • Sales = Total sales dari barang yang dibeli oleh customer
  • Quantity = Total barang yang dibeli oleh customer
  • Discount = Total diskon yang diberikan kepada customer
  • Profit = Total keuntungan yang didapatkan oleh perusahaan

2.2.2 Exploratory Data Analysis (EDA)

  • Cek struktur data
# Please type your code
glimpse(copiers)
#> Rows: 62
#> Columns: 15
#> $ Row.ID       <int> 336, 393, 407, 516, 596, 754, 1151, 1234, 1550, 1645, 198…
#> $ Order.ID     <fct> CA-2015-137946, US-2014-135972, CA-2017-117457, CA-2017-1…
#> $ Order.Date   <fct> 9/1/15, 9/21/14, 12/8/17, 1/22/17, 8/8/14, 4/7/16, 4/4/15…
#> $ Ship.Date    <fct> 9/4/15, 9/23/14, 12/12/17, 1/27/17, 8/15/14, 4/9/16, 4/4/…
#> $ Ship.Mode    <fct> Second Class, Second Class, Standard Class, Standard Clas…
#> $ Customer.ID  <fct> DB-13615, JG-15115, KH-16510, AD-10180, LR-16915, YC-2189…
#> $ Segment      <fct> Consumer, Consumer, Consumer, Home Office, Consumer, Corp…
#> $ Product.ID   <fct> TEC-CO-10001449, TEC-CO-10002313, TEC-CO-10004115, TEC-CO…
#> $ Category     <fct> Technology, Technology, Technology, Technology, Technolog…
#> $ Sub.Category <fct> Copiers, Copiers, Copiers, Copiers, Copiers, Copiers, Cop…
#> $ Product.Name <fct> Hewlett Packard LaserJet 3310 Copier, Canon PC1080F Perso…
#> $ Sales        <dbl> 959.984, 1799.970, 1199.976, 2999.950, 1199.976, 1199.976…
#> $ Quantity     <int> 2, 3, 3, 5, 3, 3, 2, 2, 1, 7, 4, 2, 2, 4, 2, 5, 6, 1, 3, …
#> $ Discount     <dbl> 0.2, 0.0, 0.2, 0.0, 0.2, 0.2, 0.0, 0.4, 0.2, 0.0, 0.4, 0.…
#> $ Profit       <dbl> 335.9944, 701.9883, 434.9913, 1379.9770, 434.9913, 374.99…

Apakah terdapat kolom yang tipe datanya belum sesuai?

  • Order.Date -> Date
  • Ship.Date -> Date
# Please type your code
copiers_clean <- copiers %>% 
  mutate_at(.vars = c("Order.Date", "Ship.Date"), .funs = mdy)
  • Analisa data 1: Mengetahui target & prediktor

Dari pertanyaan bisnis yang diajukan, kita ingin melakukan prediksi profit berdasarkan data sales, mari kita coba tentukan kolom apa yang akan menjadi target dan prediktor?

  • Target:

  • Prediktor:

  • Analisa data 2: Mencari tahu hubungan antara target & prediktor

Untuk mencari tahu hubungan/korelasi antara dua variable numerik, kita bisa memanfaatkan bantuan visualisasi base/scatter plot.

# Please type your code
plot(x = copiers_clean$Sales,
     y = copiers_clean$Profit)

Optional:

# nilai korelasi
cor(x = copiers$Sales, y = copiers$Profit)
#> [1] 0.9395785

Insight:

  • Bagaimana korelasi dari kedua variable tersebut?
    • Korelasi antara target & prediktor positif kuat.

Additional Notes: Pada saat kita membuat Regresi Model, kita harus menggunakan prediktor yang memiliki korelasi kuat karena:

  • Ketika kita membuat Regresi Model, model tersebut akan membuat garis lurus yang bisa menangkap pola data kita (prediktor & target).

  • Semakin kuat korelasi antara target & prediktor maka garis regresi yang akan dibuat akan semakin akurat.

  • Apakah ada outlier?

    • Ada outlier di bagian profit > 2000 dan Sales mendekati 5000

Additonal Notes: Kita perlu mengetahui outlier karena jika terdapat outlier pada data kita, outlier tersebut sedikit banyak akan mempengaruhi model kita.

2.2.3 Membuat model regresi & interpretasi

2.2.3.1 Model Tanpa Prediktor

Sebelum kita membuat model dengan prediktor, mari kita lihat model apa yang terbentuk apabila kita tidak menggunakan prediktor.

Bentuk model regresi tanpa prediktor adalah sebagai berikut \[\hat{y}=\beta_0\]

Pertama, kita akan coba prediksi nilai Profit terhadap dirinya sendiri. Untuk membuat model regresi, dimana kita hanya memprediksi menggunakan satu variabel saja, kita bisa gunakan fungsi lm(). Berikut parameter yang akan digunakan:

  • formula: dituliskan dengan y ~ x
  • data: objek dataframe

Contoh syntax: lm(formula = nama_kolom_target ~ 1, data = nama_df)

  • Model Dengan Prediktor
# Please type your code

model_wo_predictor <- lm(formula = Profit ~ 1, data = copiers)

Untuk melihat hasil dari model yang sudah dibuat, kita bisa menggunakan fungsi summary().

# Please type your code
summary(model_wo_predictor)
#> 
#> Call:
#> lm(formula = Profit ~ 1, data = copiers)
#> 
#> Residuals:
#>    Min     1Q Median     3Q    Max 
#> -388.8 -286.8 -135.3  162.4 1854.2 
#> 
#> Coefficients:
#>             Estimate Std. Error t value        Pr(>|t|)    
#> (Intercept)   448.81      55.24   8.124 0.0000000000269 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 435 on 61 degrees of freedom

Hanya terdapat 1 coefficient pada model yaitu untuk intercept. Intercept adalah titik dimana garis regresi bersinggungan dengan sumbu y.

Bonus Question: Apakah ada yang tau, nilai intercept yang dimunculkan pada hasil summary berasal dari perhitungan apa? Berdasarkan nilai mean dari kolom profit.

Additional Notes: Ketika tidak memiliki prediktor, nilai mean yang akan digunakan karena nilai mean adalah nilai yang memiliki error yang paling kecil terhadarp nilai sekitarnya dan model regresi akan selalu mencari nilai error yang paling kecil.

# Please run the code down below
plot(copiers$Profit)
abline(model_wo_predictor, col = "red")

2.2.3.2 Model Dengan Prediktor/Simple Linear Regression

Pada bagian ini, kita akan membuat model regresi dengan satu buah variabel prediktor. Formula untuk simple linear regression adalah

\[ \hat{y} = \beta_0 + \beta_1*x_1\]

Contoh syntax: lm(formula = nama_kolom_target ~ nama_kolom_prediktor, data = nama_df)

# Please type your code
model_with_predictor <- lm(formula = Profit ~ Sales, data = copiers)
summary(model_with_predictor)
#> 
#> Call:
#> lm(formula = Profit ~ Sales, data = copiers)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -407.07  -70.08   22.95   76.56  345.05 
#> 
#> Coefficients:
#>               Estimate Std. Error t value             Pr(>|t|)    
#> (Intercept) -114.06251   32.62743  -3.496             0.000895 ***
#> Sales          0.42286    0.01989  21.260 < 0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 150.1 on 60 degrees of freedom
#> Multiple R-squared:  0.8828, Adjusted R-squared:  0.8809 
#> F-statistic:   452 on 1 and 60 DF,  p-value: < 0.00000000000000022

Interpretasi Model

  1. Mengetahui pengaruh prediktor melalui koefisien model:

Dari model di atas diperoleh bahwa intercept = -114.06251 dan koefisien Sales = 0.42286 sehingga dapat diperoleh formula model regresinya adalah

\[ Profit = -114.06251 + 0.42286*Sales\]

Nilai Intercept:

  • Nilai intercepet merupakan nilai target variabel ketika nilai prediktornya 0 (Sales = 0).
    • Sehingga ketika Sales = 0, makan Profit dari perusahaan tersebut -114.06 (rugi).

Nilai Prediktor/Slope:

  • Pengaruh prediktor yang digunakan, pada kasus ini adalah kolom Sales
    • Setiap kenaikan Sales akan meningkatkan Profit
    • Setiap kenaikan Sales sebesar 1 USD akan mengakibatkan Profit meningkat sebesar 0.42286 USD
  • Pengaruh prediktor akan berdasarkan nilai positif ataupun nilai negatif dari kolom prediktor.
    • Jika prediktornya memiliki nilai positif, makan hubungan antara target dan prediktor adalah positif/meningkatkan value target Jika prediktornya memiliki nilai negatif, makan hubungan antara target dan prediktor adalah negatif/menurunkan value target
# Plot persamaan garis beserta diagram pencar
plot(copiers_clean$Sales, copiers_clean$Profit)
abline(model_with_predictor, col = "red")

Bonus Question: Agar perusahaan kita tidak rugi, berapakan minimal nilai Sales yang harus diperoleh?…

  1. Goodnes of Fit (Kebaikan Model)
# summary 
summary(model_with_predictor)
#> 
#> Call:
#> lm(formula = Profit ~ Sales, data = copiers)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -407.07  -70.08   22.95   76.56  345.05 
#> 
#> Coefficients:
#>               Estimate Std. Error t value             Pr(>|t|)    
#> (Intercept) -114.06251   32.62743  -3.496             0.000895 ***
#> Sales          0.42286    0.01989  21.260 < 0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 150.1 on 60 degrees of freedom
#> Multiple R-squared:  0.8828, Adjusted R-squared:  0.8809 
#> F-statistic:   452 on 1 and 60 DF,  p-value: < 0.00000000000000022
  • p-values: merupakan nilai p-values untuk melihat apakah variabel prediktor berpengaruh cukup signifikan terhadap variabel target. Variabel prediktor(x) dapat dikatakan signifikan jika \(p-values < 0.05\).

Hipotesis: - \(H_0\) : Prediktor tidak memengaruhi Target - \(H_1\) : Prediktor memengaruhi Target

Bonus Question 1: Apakah variabel Sales secara signifikan mempengaruhi target Profit? …

Bonus Question 2: Kalau ada prediktor yang secara literatur/pertimbangan/pengalaman bisnis penting/harusnya berpengaruh pada target, namun ketika dibuatkan model, dia tidak berpengaruh signifikan. Apakah kita akan mempertahankan variable tersebut atau tidak kita buang?

  • R-squared: seberapa baik prediktor dapat menjelaskan keberagaman kelas target. Ukuran yang bisa kita gunakan untuk mengukur kebaikan model.

Range dari R-Squared adalah 0-1 atau 0-100%, dimana:

  • Semakin mendekati 0, maka model yang diperoleh masih kurang terjelaskan menggunakan prediktor yang ada (poor fit)

  • Semakin mendekati 1, maka model yang diperoleh sudah dapat terjelaskan dengan baik menggunakan prediktor yang ada

Formula R-Squared

\[ R^2 = 1 - \frac{\sum(y_i - \hat y_i)^2}{\sum(y_i - \overline y)^2} \]

Interpretasi r-squared model_with_predictor: Nilai R-squared = 0.8828. Artinya model regresi kita mampu menjelaskan variansi dari variabel profit sebesar 88.28%. Sisa 11.72% dijelaskan oleh faktor lain diluar model.

note: apakah ada batasan baik/buruk dari r-squared? tidak ada. - untuk ranah yg butuh ketepatan tinggi r-squared dituntut untuk lebih tinggi (medikal/research) - untuk ranah sosial r-square bisa lebih rendah (cth: 0.75) - dikembalikan ke user

2.2.4 Melakukan prediksi pada data masa depan

Sebenarnya kita bisa memprediksi manual lewat formula regresi.

Profit = -114.06 + 0.42286*Sales

Misal ada data baru, dengan Sales: 400

# prediksi manual
-114.06  + 0.42286*400
#> [1] 55.084

Untuk memprediksi nilai Profit jika diketahui nilai Sales, dapat menggunakan fungsi predict() dengan parameter:

  • object: model regresi yang digunakan
  • newdata: data yang akan diprediksi (harus berupa data frame dan tersedia nama kolom prediktor yang sama persis dengan prediktor pada model)
# contoh data
sales_new <- data.frame(Sales = c(300,290,320,450)) # 4 baris data baru
sales_new
# Please type your code
sales_new$profit_prediction <- predict(model_with_predictor, newdata = sales_new)
sales_new

Note: Tahapan evaluasi hasil prediksi dan pengecekan asumsi tidak akan kita lakukan sekarang.

2.3 Leverage & Influence

Leverage adalah nilai yang jauh dari kerumunan datanya, sering disebut sebagai outlier. Nilai leverage dapat mempengaruhi model linier regresi atau pun tidak.

Nilai leverage bisa mempengaruhi model secara signifikan atau pun tidak.

  • Ketika leverage mempengaruhi model secara signifikan : high influence
    • Impact yang akan terjadi adalah menurunkan nilai R-Squared secara signifikan
    • Pendekatan yang dapat kita lakukan ketika menemui kasus seperti ini adalah membuang nilai leverage/outlier tersebut.
  • Ketika leverage tidak mempengaruhi model secara signifikan : low influence
    • Impact yang akan terjadi adalah tidak menurunkan nilai R-Squared secara signifikan
    • Pendekatan yang dapat kita lakukan ketika menemui kasus seperti ini adalah membiarkan nilai leverage/outlier tersebut.

2.3.1 Workflow Pengecekan Leverage & Influence

Berikut tahapan dalam mengecek apakah outlier pada data kita memiliki high influence atau tidak:

  • Step 1. Buat model dengan keseluruhan data (melibatkan outlier)
  • Step 2. Cek performa model (misal dari R-squared)
  • Step 3. Buat model dengan meng-handle outlier (misal dibuang)
  • Step 4. Cek performa model lagi:
    • Apabila outlier tidak mengubah R-squared, sebaiknya data outlier dipertahankan saja (gunakan keseluruhan data)
    • Apabila ternyata outlier malah menurunkan R-squared, sebaiknya dibuang.

2.3.1.1 Implementasi Workflow

  • Step 1 & 2: Melihat R-Squared dari model yang sudah kita buat model_with_predictor
# Please run the code down below
summary(model_with_predictor)
#> 
#> Call:
#> lm(formula = Profit ~ Sales, data = copiers)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -407.07  -70.08   22.95   76.56  345.05 
#> 
#> Coefficients:
#>               Estimate Std. Error t value             Pr(>|t|)    
#> (Intercept) -114.06251   32.62743  -3.496             0.000895 ***
#> Sales          0.42286    0.01989  21.260 < 0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 150.1 on 60 degrees of freedom
#> Multiple R-squared:  0.8828, Adjusted R-squared:  0.8809 
#> F-statistic:   452 on 1 and 60 DF,  p-value: < 0.00000000000000022

Nilai R-Squared: …

  • Step 3: Membuat ulang model tanpa adanya outlier

Untuk mengetahui nilai outlier kita dapat memanfaatkan visualisasi boxplot()

# Please type your code
boxplot(copiers_clean$Sales)

(opsional) Mencari nilai Outlier

box_out <- boxplot(copiers$Sales)

box_out$out
#> [1] 4899.93

Setelah mengetahui nilai outliers kita bisa mengeluarkannya

# Please type your code
copiers_no_outlier <- copiers_clean %>% 
  filter(Sales < 4000)

range(copiers_no_outlier$Sales)
#> [1]  299.990 3359.952

Buatlah model linear regression dengan data copiers_no_outlier:

# Please type your code
model_no_outlier <- lm(Profit ~ Sales, data = copiers_no_outlier)
summary(model_no_outlier)
#> 
#> Call:
#> lm(formula = Profit ~ Sales, data = copiers_no_outlier)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -386.43  -66.78   18.00   66.44  340.24 
#> 
#> Coefficients:
#>              Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept) -83.54810   32.82978  -2.545              0.0136 *  
#> Sales         0.39444    0.02146  18.384 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 142.4 on 59 degrees of freedom
#> Multiple R-squared:  0.8514, Adjusted R-squared:  0.8489 
#> F-statistic:   338 on 1 and 59 DF,  p-value: < 0.00000000000000022
  • Step 4: Bandingkan hasil model

  • Step 4.1:Membandingkan dengan cara visualisasi:

# Please run the code down below
plot(copiers$Sales, copiers$Profit)
abline(model_with_predictor, col = "red")
abline(model_no_outlier, col = "green")

Insight: Titik data outlier tersebut high leverage dan (low) influence

  • Step 4.2:Membandingkan nilai R-Squared:

Agar lebih objektif, mari bandingkan pula nilai goodness of fit (R-squared) nya:

# Please type your code
summary(model_with_predictor)$r.squared
#> [1] 0.8828077
summary(model_no_outlier)$r.squared
#> [1] 0.8513778

Insight: R-squared untuk model_sales (lebih baik) daripada model_no_outlier, sehingga akan lebih baik kalau outlier tidak dibuang/tetap diikutsertakan.

2.4 Dive Deeper 1

Dengan menggunakan data copiers, buatlah model untuk memprediksi Profit berdasarkan informasi Quantity, simpan model dalam objek model_quantity.

# buat model
model_quantity <- lm(Profit ~ Quantity, data = copiers)
# cek summary
summary(model_quantity)
#> 
#> Call:
#> lm(formula = Profit ~ Quantity, data = copiers)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -665.76 -167.44   27.27  149.11 1228.33 
#> 
#> Coefficients:
#>             Estimate Std. Error t value      Pr(>|t|)    
#> (Intercept)  -111.43      86.76  -1.284         0.204    
#> Quantity      169.44      23.20   7.303 0.00000000076 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 319.1 on 60 degrees of freedom
#> Multiple R-squared:  0.4706, Adjusted R-squared:  0.4618 
#> F-statistic: 53.33 on 1 and 60 DF,  p-value: 0.0000000007604

Kemudian analisis summary modelnya dengan menulis laporan terkait:

  1. Tuliskan formula model

-111.43 + 169.44*Quantity

  1. Analisis apakah quantity signifikan mempengaruhi profit?

Signifikan, dilihat dari jumlah bintang pada prediktor tersebut adalah 3 buah

  1. Interpretasi nilai koefisien model (intercept dan slope)
  • intercept: Ketika tidak ada 1 buah pun penjualan (quantity) maka perusahaan rugi 111.43 USD
  • slope (Quantity):
    • quantity meningkatkan profit
    • setiap kenaikan quantity sebesar 1 buah (1 poin) akan mengakibatkan profit meningkat sebesar 169.44 USD
  1. Analisis nilai r-squared

Nilai R-squared: 0.4706 -> masih kurang baik, hanya bisa menjelaskan 47,06% variansi target (bahkan kurang dari 50% variansi target yg bisa dijelaskan, dimana seharusnya yg paling baik bisa menjelaskan 100% variansi target)

  1. Berapa nilai profit yang diperoleh jika di masa depan ada transaksi dengan jumlah quantity 9?
-111.43 + 169.44*9
#> [1] 1413.53

2.5 Model Dengan >1 Prediktor/Multiple Linear Regression

Linear regression dengan lebih dari satu prediktor harapannya bisa meningkatkan performa model karena lebih banyak informasi yang dapat menjelaskan target.

Formula multiple linear regression:

\[\hat{y}=\beta_0 + \beta_1*x_1 + \beta_2*x_2 + ... \beta_n*x_n\]

Keterangan: \(\hat{y}\) : Prediksi target variabel \(\beta_0\) : Intercept/konstanta \(\beta_i\) : Slope/Gradien/Koefisien prediktor ke-i \(x_i\) : Prediktor ke-i

2.5.1 Membuat Model > 1 Prediktor

Selain menggunakan prediktor Sales saja, kita akan menambakan 2 prediktor lagi, yaitu prediktor Quantity & Segment.

Contoh syntax: lm(formula = nama_kolom_target ~ nama_prediktor1 + nama_prediktor2 + dst, data = nama_df)

# Please type your code
model_sqs <- lm(formula = Profit ~ Sales + Quantity + Segment, data = copiers)

Setelah membuat model tersebut, mari kita coba lihat hasil summary.

# Please run the code down below
summary(model_sqs)
#> 
#> Call:
#> lm(formula = Profit ~ Sales + Quantity + Segment, data = copiers)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -351.95  -60.95   13.48   68.94  374.59 
#> 
#> Coefficients:
#>                     Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept)        -69.71409   44.79957  -1.556              0.1252    
#> Sales                0.47777    0.03389  14.097 <0.0000000000000002 ***
#> Quantity           -39.66313   18.28978  -2.169              0.0343 *  
#> SegmentCorporate    25.27540   43.80999   0.577              0.5663    
#> SegmentHome Office  33.57559   52.99929   0.634              0.5289    
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 145.8 on 57 degrees of freedom
#> Multiple R-squared:  0.895,  Adjusted R-squared:  0.8876 
#> F-statistic: 121.5 on 4 and 57 DF,  p-value: < 0.00000000000000022

2.5.1.1 Multiple Linear Regression Interpretation: R-Squared vs Adj R-Squared

Interpretasi multiple linear regression dengan simple linear regression kurang lebih sama, hanya berbeda di bagian r-squared:

  • multiple r-squared: untuk 1 prediktor
  • adj r-squared: untuk >1 prediktor
    • memiliki rumus dengan penambahan penalty untuk banyak prediktor yang kita gunakan

Intuisi - Mengapa adjusted r-squared digunakan?

Secara umum, penambahan prediktor akan menambahkan informasi pada model yang menyebabkan peningkatan R-squared. Padahal belum tentu prediktor tersebut berpengaruh signifikan pada model, bisa saja hanya sebatas random data.

Maka dari itu pada rumus Adjusted R Squared, terdapat perbedaan dengan rumus R Squared biasa

\[ Adjusted\ R^2 = 1 - \frac{(1-R^2)(n-1)}{n-k-1} \] Keterangan:

  • n: Jumlah data

  • k: Jumlah variabel prediktor

  • \(R^2\): Nilai \(R^2\)

  • multiple r-squared: semakin meningkat prediktor, pasti semakin tinggi r-squared

  • adjusted r-squared: nilainya hanya meningkat ketika prediktor yang ditambahkan memang signifikan memberikan pengaruh pada target

Bandingkan nilai R-Squared dari model-model yang telah dibuat

# cek dari model dasar
summary(model_wo_predictor)$r.squared
#> [1] 0
summary(model_with_predictor)$r.squared
#> [1] 0.8828077
summary(model_sqs)$r.squared
#> [1] 0.8949936

Bandingkan nilai Adjusted R-Squared dari model-model yang telah dibuat

# cek adjusted r-squared
summary(model_wo_predictor)$adj.r.squared
#> [1] 0
summary(model_with_predictor)$adj.r.squared
#> [1] 0.8808545
summary(model_sqs)$adj.r.squared
#> [1] 0.8876247

2.5.1.2 Multiple Linear Regression Interpretation: Dummy Variable

  • Setiap nilai dari kolom kategorik akan dijadikan dummy variable

  • Sebuah variabel dengan kategori sebanyak k akan membutuhkan seperangkat k–1 variabel dummy untuk menjangkau semua informasi yang terkandung didalamnya.

  • Interpretasi untuk dummy variabel (hanya untuk variabel prediktor bertipe kategorik) :

    • Kategori dengan level terendah (dari sisi alfabetikal) tidak masuk sebagai prediktor, artinya dijadikan basis
    • Nilai slope menunjukkan peningkatan/penurunan nilai target apabila kategori tersebut dibandingkan dengan kategori basisnya. Dengan catatan, nilai prediktor lainnya juga tetap.

2.5.2 Model Evaluation

Salah satu tujuan dari suatu pemodelan prediktif adalah melakukan prediksi untuk data yang belum dimiliki. Setelah melakukan prediksi dari data, kita harus mengetahui apakah model machine learning yang sudah dibuat cukup baik dengan melihat apakah hasil prediksi tersebut sudah menghasilkan error yang paling kecil. Untuk melakukan model evaluation pada regression model ada beberapa cara :

  • menggunakan nilai R-Squared dan Adj R-Squared
    • untuk menentukan seberapa baik model dalam menjelaskan variansi dari target variabel
  • menggunakan nilai error
    • untuk melihat apakah prediksi yang dibuat menghasilkan nilai error terkecil

Beberapa nilai error yang ada :

  • Sum of Squared Error (SSE)
  • Mean Squared Error (MSE)
  • Root Mean Squared Error (RMSE)
  • Mean Absolute Error (MAE)
  • Mean Absolute Percentage Error (MAPE)

2.5.2.1 Error/Residual

Error/residual adalah selisih antara hasil prediksi dengan nilai aktual.

\[ Error/residual = prediction - actual = \hat y - y \]

pred <- predict(model_sqs, newdata = copiers) # prediksi ke data train
error <- copiers_clean$Profit - pred # selisih data aktual dengan hasil prediksi
head(error)
#>         1         2         3         4         5         6 
#>  26.38264  30.71908  50.38156 181.14331  50.38156 -34.89264

2.5.2.2 Mean Absolute Error (MAE)

Mean Absolute Error (MAE) menunjukkan rata-rata dari nilai absolut error. MAE bisa diinterpretasikan sebagai seberapa besar penyimpangan hasil prediksi terhadap nilai aktualnya.

\[ MAE = \frac{\sum |\hat y - y|}{n} \]

# Menghitung MAE menggunakan library MLmetrics
library(MLmetrics)
RMSE(y_pred = pred, y_true = copiers$Profit)
#> [1] 139.81

Notes: Untuk mengetahui apakah nilai MAE yang diperoleh cukup besar/tidak maka perlu dibandingkan dengan range dari target variabelnya.

range(copiers_clean$Profit)
#> [1]   59.998 2302.967

Jika nilai MAE relatif cukup kecil dibandingkan range data, maka model memiliki error yang cukup kecil. Sementara jika nilai MAE relatif cukup besar apabila dibandingkan dengan range data maka model memiliki error yang cukup besar.

2.5.2.3 Mean Absolute Percentage Error (MAPE)

MAPE menunjukkan seberapa besar penyimpangannya dalam bentuk persentase.

\[ MAPE = \frac{1}{n} \sum\frac{|\hat y - y|}{y} \]

# Menghitung MAPE dengan library MLmetrics
MAPE(y_pred = pred, y_true = copiers$Profit)*100
#> [1] 40.52512

MAPE memiliki range dalam bentuk persen, semakin kecil nilai MAPE, semakin bagus model yang kita miliki.

Nilai MAPE menunjukkan model kita secara rata-rata menyimpang sebesar (nilai MAPE) dari nilai aktualnya. MAE dan MAPE adalah metrik yang baik untuk interpretasi karena mudah dipahami.

2.5.2.4 Mean Squared Error (MSE)

MSE menghitung berapa selisih kuadrat dari hasil prediksi dan nilai aktual kemudian dirata-rata. MSE sensitif terhadap perubahan atau selisih hasil prediksi yang besar sehingga meskipun sulit diinterpretasikan tetapi menjadi lebih baik dalam mendeteksi selisih yang besar.

\[ MSE = \frac{1}{n} \sum (\hat y - y)^2 \]

MSE(y_pred = pred, y_true = copiers$Profit)
#> [1] 19546.82

MSE tidak dapat diinterpretasikan karena ukuran satuan datanya yang kuadrat.

2.5.2.5 Root Mean Squared Error (RMSE)

RMSE adalah bentuk akar kuadrat dari MSE. Karena sudah diakarkan, maka interpretasinya kurang lebih sama dengan MAE. RMSE dapat digunakan jika kita lebih concern dengan error yang sangat besar.

\[ RMSE = \sqrt{\frac{1}{n} \sum (\hat y - y)^2} \]

# Menghitung RMSE dari library MLmetrics
RMSE(y_pred = pred, y_true = copiers$Profit)
#> [1] 139.81

Quick Summary Error

  1. MAE (Mean Absolute Error)
  • Lebih mudah dijelaskan ke orang tanpa latar belakang statistik
  • Mengabaikan error yang besar dari outlier
  1. MAPE (Mean Absolute Percentage Error)
  • Mudah diinterpretasi
  • Tidak bisa digunakan ketika data actual ada yang bernilai 0
  1. MSE (Mean Squared Error)
  • Sensitif terhadap error yang besar (karena error dikuadratkan)
  • Tidak bisa diinterpretasi, lebih sulit dijelaskan
  1. RMSE (Root Mean Squared Error)
  • Karena asalnya dari MSE, maka sensitif terhadap error besar juga
  • Nilai bisa diinterpretasi (satuan sudah sama seperti data awal)
  • Formula lebih sulit dijelaskan.