1 Business Problem

Sebagai seorang yang menjalankan bisnis peternak kepiting, mengetahui usia kepiting yang tepat dapat membantu dalam memutuskan apakah dan kapan harus memanen kepiting. Di luar usia tertentu, ada pertumbuhan karakteristik fisik kepiting yang dapat diabaikan dan karenanya, penting untuk mengatur waktu panen untuk mengurangi biaya dan meningkatkan keuntungan. Dataset ini berisi informasi atribut fisik yang diduga dapat digunakan untuk memperkirakan usia kepiting.

berdasarkan

  • target: usia kepiting
  • prediktor: seluruh variabel terkecuali usia kepiting

2 Data Wrangling & EDA

1. Read data house_data.csv

crab <- read.csv("data_input/CrabAgePrediction.csv") 
head(crab)
knitr::include_graphics("data_input/ukuran_kepiting.png")

Deskripsi data crab:

  • Sex: Jenis kelamin kepiting
    • F (female): Betina
    • M (male): Jantan
    • I (Indeterminate): tak tentu
  • Length: Panjang cangkang kepiting (foot)
  • Diameter: Lebar cangkang kepiting (foot)
  • Height: Tebal cangkang kepiting (foot)
  • Weight: Berat kepiting (ons)
  • Shucked.Weight: Berat kepiting tanpa cangkang (ons)
  • Viscera.Weight: Berat jeroan kepiting (ons)
  • Shell.Weight: Berat cangkang kepiting (ons)
  • Age: Usia kepiting (month)

2. Cek struktur data

glimpse(crab)
#> Rows: 3,893
#> Columns: 9
#> $ Sex            <chr> "F", "M", "I", "F", "I", "F", "F", "M", "I", "I", "M", …
#> $ Length         <dbl> 1.4375, 0.8875, 1.0375, 1.1750, 0.8875, 1.5500, 1.3000,…
#> $ Diameter       <dbl> 1.1750, 0.6500, 0.7750, 0.8875, 0.6625, 1.1625, 1.0000,…
#> $ Height         <dbl> 0.4125, 0.2125, 0.2500, 0.2500, 0.2125, 0.3500, 0.3250,…
#> $ Weight         <dbl> 24.635715, 5.400580, 7.952035, 13.480187, 6.903103, 28.…
#> $ Shucked.Weight <dbl> 12.332033, 2.296310, 3.231843, 4.748541, 3.458639, 13.5…
#> $ Viscera.Weight <dbl> 5.5848515, 1.3749507, 1.6017467, 2.2821347, 1.4883488, …
#> $ Shell.Weight   <dbl> 6.7471810, 1.5592225, 2.7640763, 5.2446575, 1.7009700, …
#> $ Age            <int> 9, 6, 6, 10, 6, 8, 15, 10, 13, 7, 6, 10, 9, 10, 11, 12,…

💡 Hasil pemeriksaan struktur data: variabel Sex harus dirubah menjadi Kategori menggunakan fungsi as.factor

3. Cleansing Data

#penyesuaian tipe data
crab$Sex <- as.factor(crab$Sex)

glimpse(crab)
#> Rows: 3,893
#> Columns: 9
#> $ Sex            <fct> F, M, I, F, I, F, F, M, I, I, M, F, M, I, I, F, M, I, M…
#> $ Length         <dbl> 1.4375, 0.8875, 1.0375, 1.1750, 0.8875, 1.5500, 1.3000,…
#> $ Diameter       <dbl> 1.1750, 0.6500, 0.7750, 0.8875, 0.6625, 1.1625, 1.0000,…
#> $ Height         <dbl> 0.4125, 0.2125, 0.2500, 0.2500, 0.2125, 0.3500, 0.3250,…
#> $ Weight         <dbl> 24.635715, 5.400580, 7.952035, 13.480187, 6.903103, 28.…
#> $ Shucked.Weight <dbl> 12.332033, 2.296310, 3.231843, 4.748541, 3.458639, 13.5…
#> $ Viscera.Weight <dbl> 5.5848515, 1.3749507, 1.6017467, 2.2821347, 1.4883488, …
#> $ Shell.Weight   <dbl> 6.7471810, 1.5592225, 2.7640763, 5.2446575, 1.7009700, …
#> $ Age            <int> 9, 6, 6, 10, 6, 8, 15, 10, 13, 7, 6, 10, 9, 10, 11, 12,…

3. EDA

#persebaran data target
boxplot(crab$Age)

💡 Insight: -

#korelasi dengan menggunakan ggcorr
library(GGally)
ggcorr(crab,label = TRUE )

💡 Insight: - variabel prediktor yang berkorelasi erat dengan Age (>= 0.5) adalah Shell.Weight, Height, Diameter dan Length

3 Modeling

Buatlah model regresi berdasarkan ketentuan berikut: 1. model berdasarkan Weight 2. model all predictor 3. model selection berdasarkan nilai korelasi >= 0.5 3. model selection hasil stepwise (backward/forward/both)

#predictor = weight
model_weight <- lm(formula = Age ~ Weight,
                   data = crab)
  
#predictor = all
model_all <- lm(formula = Age ~ .,
                   data = crab)

#model korelasi
model_cor <- lm(formula = Age ~ . - Shucked.Weight,
                data = crab)

#model stepwise
model_none <- lm(formula = Age ~ 1,
                 data = crab)

model_step <- step(object = model_none,
                   direction = "forward",
                   scope = list(upper = model_all),
                   trace = F)

4 Evaluasi model

Berdasarkan RMSE model regresi manakah yang terbaik? gunakan perbandingan menggunakan fungsi compare_performance dari package performance

library(performance)
comparison <- compare_performance(model_weight, model_all, model_cor, model_step)

as.data.frame(comparison)
#menampilkan rentang dari usia kepiting
range(crab$Age)
#> [1]  1 29

💡 Kesimpulan : model_step (forward) merupakan model terbaik dalam melakukan prediksi usia dari kepiting karena memiliki nilai AIC yang paling rendah, nilai RMSE yang relatif kecil dan R-squared relatif besar dari ke-empat model yang telah dibuat.

5 Interpretasi Model Terbaik:

summary(model_step)
#> 
#> Call:
#> lm(formula = Age ~ Shell.Weight + Shucked.Weight + Diameter + 
#>     Weight + Sex + Viscera.Weight + Height, data = crab)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -9.9650 -1.3134 -0.3386  0.8572 13.9761 
#> 
#> Coefficients:
#>                Estimate Std. Error t value             Pr(>|t|)    
#> (Intercept)     3.85202    0.28556  13.489 < 0.0000000000000002 ***
#> Shell.Weight    0.29775    0.04091   7.279  0.00000000000040584 ***
#> Shucked.Weight -0.70163    0.02950 -23.782 < 0.0000000000000002 ***
#> Diameter        4.38843    0.41087  10.681 < 0.0000000000000002 ***
#> Weight          0.31734    0.02617  12.125 < 0.0000000000000002 ***
#> SexI           -0.84230    0.10612  -7.938  0.00000000000000268 ***
#> SexM            0.05896    0.08607   0.685                0.493    
#> Viscera.Weight -0.37064    0.04663  -7.949  0.00000000000000244 ***
#> Height          4.09559    0.62503   6.553  0.00000000006393881 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 2.195 on 3884 degrees of freedom
#> Multiple R-squared:  0.5365, Adjusted R-squared:  0.5355 
#> F-statistic: 561.9 on 8 and 3884 DF,  p-value: < 0.00000000000000022

1. Interpretasi coefficient untuk Intercept:

  • Intercept : Nilai Age akan sebesar 3.85202 month apabila jenis kelamin kepiting bukan Betina dan tidak terdapat informasi lainnya [seluruh variabel prediktor = 0]

2. Interpretasi coefficient untuk prediktor kategorik:

  • SexF = 0 menjadi basis
  • SexI = Nilai Age akan menurun sebesar 0.84230 month apabila jenis kelamin kepiting Tidak Tentu/Tidak Jelas dan variabel prediktor lainnya bernilai tetap.
  • SexM = Nilai Age akan meningkat sebesar 0.05896 month apabila Jenis Kelamin Kepiting Laki-Laki dan variabel prediktor lainnya bernilai tetap.

3. Interpretasi coefficient untuk prediktor numerik:

  • Shell.Weight : Nilai Age akan meningkat sebesar 0.29775 month apabila nilai Shell.Weight (Berat cangkang kepiting) naik 1 ons dan variabel prediktor lainnya bernilai tetap.

  • Shucked.Weight : Nilai Age akan menurun sebesar 0.70163 month apabila nilai Shucked.Weight (Berat kepiting tanpa cangkang) naik 1 ons dan variabel prediktor lainnya bernilai tetap.

  • Diameter : Nilai Age akan meningkat sebesar 4.38843 month apabila nilai Diameter (Lebar cangkang kepiting) naik 1 foot dan variabel prediktor lainnya bernilai tetap.

  • Weight : Nilai Age akan meningkat sebesar 0.31734 month apabila nilai Weight (Berat kepiting) naik 1 ons dan variabel prediktor lainnya bernilai tetap.

  • Viscera.Weight : Nilai Age akan menurun sebesar 0.37064 month apabila nilai Viscera.Weight (Berat Jeroan Kepiting) naik 1 ons dan variabel prediktor lainnya bernilai tetap.

  • Height : Nilai Age akan meningkat sebesar 4.09559 month apabila nilai Height (Tebal cangkang kepiting) naik 1 foot dan variabel prediktor lainnya bernilai tetap.

4. Signifikansi prediktor:

  • Variabel prediktor yang signifikan mempengaruhi nilai Age adalah Shell.Weight, Shucked.Weight, Diameter, Weight, SexI, Viscera.Weight dan Height.

5. Adjusted R Squared:

  • model bisa menjelaskan Age dengan baik sebesar 53,55%

#Prediksi

coba lakukan prediksi untuk 10 data terakhir :

#mengambil 10 data terakhir
crab10 <- tail(crab, 10)

#melakukan prediksi
predictions <- predict(model_step, newdata = crab10)

crab10
as.data.frame(predictions)