Anggota :

Link Dataset : https://www.kaggle.com/datasets/williamsewell/manufacturing-dataset

Load Library and Dataset

  1. Load Library
library(readr)
library(psych)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
require(dplyr)
library(car)
## Warning: package 'car' was built under R version 4.5.3
## Loading required package: carData
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following object is masked from 'package:psych':
## 
##     logit
library(MVN)
## Warning: package 'MVN' was built under R version 4.5.3
## 
## Attaching package: 'MVN'
## The following object is masked from 'package:psych':
## 
##     mardia
library(biotools)
## Warning: package 'biotools' was built under R version 4.5.3
## Loading required package: MASS
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
## ---
## biotools version 4.3
library(heplots)
## Warning: package 'heplots' was built under R version 4.5.3
## Loading required package: broom
## 
## Attaching package: 'heplots'
## The following object is masked from 'package:biotools':
## 
##     boxM
library(nortest)
library(knitr)
  1. Load Dataset
data <- read_csv("manufacturing_iot_quality_10000.csv")
## Rows: 10000 Columns: 20
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (6): plant, line_id, machine_id, shift, material_batch, defect_type
## dbl (14): record_id, operator_experience_years, ambient_temp_c, ambient_humi...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
kable(head(data, 10), caption = "Manufacturing_Dataset", align = "l")
Manufacturing_Dataset
record_id plant line_id machine_id shift operator_experience_years material_batch ambient_temp_c ambient_humidity_pct vibration_rms pressure_bar feed_rate_mm_s laser_power_w coolant_flow_l_min thickness_mm tensile_strength_mpa surface_roughness_um defect_flag defect_type rework_needed
1 Plant_A L3 M07 evening 5.27 B090 23.74 67.9 0.981 5.078 19.46 303.8 7.63 1.216 516.53 2.680 0 none 0
2 Plant_A L1 M18 night 1.61 B122 19.00 34.8 1.290 4.800 26.58 376.6 6.53 1.285 537.07 2.814 0 none 0
3 Plant_A L4 M10 evening 8.35 B071 19.85 50.4 0.871 5.642 23.92 328.9 6.22 1.220 539.20 2.139 0 none 0
4 Plant_C L3 M01 evening 4.66 B069 21.32 34.8 0.995 5.282 21.41 323.1 7.47 1.204 541.54 2.197 0 none 0
5 Plant_A L1 M08 evening 6.77 B141 24.88 32.7 0.697 5.048 14.98 341.2 4.32 1.216 594.15 1.339 0 none 0
6 Plant_C L3 M13 day 0.00 B049 20.53 90.0 1.279 4.019 23.57 384.1 5.75 1.146 511.26 2.555 0 none 0
7 Plant_A L2 M15 evening 9.39 B056 23.92 48.0 1.528 4.427 23.27 350.1 6.70 1.217 559.73 2.597 0 none 0
8 Plant_A L1 M14 day 7.05 B052 28.65 55.1 1.353 6.313 26.27 340.1 6.62 1.228 530.13 2.734 1 warp 1
9 Plant_B L3 M06 night 7.68 B051 19.41 41.9 0.845 5.887 30.45 307.2 8.89 1.090 543.20 1.670 0 none 0
10 Plant_B L1 M07 evening 1.80 B017 23.24 44.7 2.688 4.792 24.39 327.3 8.05 1.104 513.36 3.533 0 none 0
  1. Cek Struktur Data
str(data)
## spc_tbl_ [10,000 × 20] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ record_id                : num [1:10000] 1 2 3 4 5 6 7 8 9 10 ...
##  $ plant                    : chr [1:10000] "Plant_A" "Plant_A" "Plant_A" "Plant_C" ...
##  $ line_id                  : chr [1:10000] "L3" "L1" "L4" "L3" ...
##  $ machine_id               : chr [1:10000] "M07" "M18" "M10" "M01" ...
##  $ shift                    : chr [1:10000] "evening" "night" "evening" "evening" ...
##  $ operator_experience_years: num [1:10000] 5.27 1.61 8.35 4.66 6.77 0 9.39 7.05 7.68 1.8 ...
##  $ material_batch           : chr [1:10000] "B090" "B122" "B071" "B069" ...
##  $ ambient_temp_c           : num [1:10000] 23.7 19 19.9 21.3 24.9 ...
##  $ ambient_humidity_pct     : num [1:10000] 67.9 34.8 50.4 34.8 32.7 90 48 55.1 41.9 44.7 ...
##  $ vibration_rms            : num [1:10000] 0.981 1.29 0.871 0.995 0.697 ...
##  $ pressure_bar             : num [1:10000] 5.08 4.8 5.64 5.28 5.05 ...
##  $ feed_rate_mm_s           : num [1:10000] 19.5 26.6 23.9 21.4 15 ...
##  $ laser_power_w            : num [1:10000] 304 377 329 323 341 ...
##  $ coolant_flow_l_min       : num [1:10000] 7.63 6.53 6.22 7.47 4.32 5.75 6.7 6.62 8.89 8.05 ...
##  $ thickness_mm             : num [1:10000] 1.22 1.28 1.22 1.2 1.22 ...
##  $ tensile_strength_mpa     : num [1:10000] 517 537 539 542 594 ...
##  $ surface_roughness_um     : num [1:10000] 2.68 2.81 2.14 2.2 1.34 ...
##  $ defect_flag              : num [1:10000] 0 0 0 0 0 0 0 1 0 0 ...
##  $ defect_type              : chr [1:10000] "none" "none" "none" "none" ...
##  $ rework_needed            : num [1:10000] 0 0 0 0 0 0 0 1 0 0 ...
##  - attr(*, "spec")=
##   .. cols(
##   ..   record_id = col_double(),
##   ..   plant = col_character(),
##   ..   line_id = col_character(),
##   ..   machine_id = col_character(),
##   ..   shift = col_character(),
##   ..   operator_experience_years = col_double(),
##   ..   material_batch = col_character(),
##   ..   ambient_temp_c = col_double(),
##   ..   ambient_humidity_pct = col_double(),
##   ..   vibration_rms = col_double(),
##   ..   pressure_bar = col_double(),
##   ..   feed_rate_mm_s = col_double(),
##   ..   laser_power_w = col_double(),
##   ..   coolant_flow_l_min = col_double(),
##   ..   thickness_mm = col_double(),
##   ..   tensile_strength_mpa = col_double(),
##   ..   surface_roughness_um = col_double(),
##   ..   defect_flag = col_double(),
##   ..   defect_type = col_character(),
##   ..   rework_needed = col_double()
##   .. )
##  - attr(*, "problems")=<externalptr>
  1. Statistika Deskriptif

Data Numerik

summary(data)
##    record_id        plant             line_id           machine_id       
##  Min.   :    1   Length:10000       Length:10000       Length:10000      
##  1st Qu.: 2501   Class :character   Class :character   Class :character  
##  Median : 5000   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 5000                                                           
##  3rd Qu.: 7500                                                           
##  Max.   :10000                                                           
##     shift           operator_experience_years material_batch    
##  Length:10000       Min.   : 0.000            Length:10000      
##  Class :character   1st Qu.: 3.300            Class :character  
##  Mode  :character   Median : 5.460            Mode  :character  
##                     Mean   : 5.542                              
##                     3rd Qu.: 7.660                              
##                     Max.   :20.090                              
##  ambient_temp_c  ambient_humidity_pct vibration_rms     pressure_bar  
##  Min.   :10.00   Min.   :15.00        Min.   :0.2390   Min.   :3.500  
##  1st Qu.:19.06   1st Qu.:41.00        1st Qu.:0.7350   1st Qu.:4.860  
##  Median :21.74   Median :49.10        Median :0.9295   Median :5.260  
##  Mean   :21.78   Mean   :49.24        Mean   :0.9886   Mean   :5.266  
##  3rd Qu.:24.53   3rd Qu.:57.50        3rd Qu.:1.1790   3rd Qu.:5.677  
##  Max.   :35.00   Max.   :90.00        Max.   :3.7060   Max.   :7.500  
##  feed_rate_mm_s  laser_power_w   coolant_flow_l_min  thickness_mm  
##  Min.   :10.00   Min.   :250.0   Min.   : 3.000     Min.   :0.911  
##  1st Qu.:19.16   1st Qu.:328.6   1st Qu.: 7.110     1st Qu.:1.147  
##  Median :22.23   Median :351.7   Median : 8.010     Median :1.200  
##  Mean   :22.23   Mean   :352.2   Mean   : 8.018     Mean   :1.200  
##  3rd Qu.:25.32   3rd Qu.:375.5   3rd Qu.: 8.910     3rd Qu.:1.254  
##  Max.   :40.00   Max.   :480.0   Max.   :13.040     Max.   :1.536  
##  tensile_strength_mpa surface_roughness_um  defect_flag     defect_type       
##  Min.   :432.6        Min.   :0.600        Min.   :0.0000   Length:10000      
##  1st Qu.:530.7        1st Qu.:1.879        1st Qu.:0.0000   Class :character  
##  Median :553.1        Median :2.152        Median :0.0000   Mode  :character  
##  Mean   :553.3        Mean   :2.157        Mean   :0.0146                     
##  3rd Qu.:576.2        3rd Qu.:2.436        3rd Qu.:0.0000                     
##  Max.   :680.7        Max.   :3.961        Max.   :1.0000                     
##  rework_needed   
##  Min.   :0.0000  
##  1st Qu.:0.0000  
##  Median :0.0000  
##  Mean   :0.0108  
##  3rd Qu.:0.0000  
##  Max.   :1.0000

Data Kategorik Shift

freq_shift <- table(data$shift)

persen_shift <- prop.table(freq_shift) * 100

tabel_shift <- data.frame(
  Kategori = names(freq_shift),
  Frekuensi = as.vector(freq_shift),
  Persentase = round(as.vector(persen_shift), 2)
)
  1. Cek Missing Value
colSums(is.na(data))
##                 record_id                     plant                   line_id 
##                         0                         0                         0 
##                machine_id                     shift operator_experience_years 
##                         0                         0                         0 
##            material_batch            ambient_temp_c      ambient_humidity_pct 
##                         0                         0                         0 
##             vibration_rms              pressure_bar            feed_rate_mm_s 
##                         0                         0                         0 
##             laser_power_w        coolant_flow_l_min              thickness_mm 
##                         0                         0                         0 
##      tensile_strength_mpa      surface_roughness_um               defect_flag 
##                         0                         0                         0 
##               defect_type             rework_needed 
##                         0                         0
  1. Boxplot
numeric_data <- data[, sapply(data, is.numeric)]
numeric_data <- numeric_data[, !(names(numeric_data) %in% c("record id"))]
boxplot(numeric_data, las = 2, col = "lightblue", main = "Boxplot Manufacturing Dataset")

Berdasarkan hasil eksplorasi awal menggunakan fungsi str() dan head(), dataset memiliki 20 variabel dan 10.000 observasi yang merepresentasikan data proses manufaktur. Dataset terdiri dari variabel numerik dan kategorik.Selain itu, tidak terdapat missing value sehingga data siap digunakan untuk analisis.

Preprocessing Data

  1. Hapus missing value
data <- na.omit(data)
  1. Ubah ke kategorik
data$shift <- as.factor(data$shift)
names(data)
##  [1] "record_id"                 "plant"                    
##  [3] "line_id"                   "machine_id"               
##  [5] "shift"                     "operator_experience_years"
##  [7] "material_batch"            "ambient_temp_c"           
##  [9] "ambient_humidity_pct"      "vibration_rms"            
## [11] "pressure_bar"              "feed_rate_mm_s"           
## [13] "laser_power_w"             "coolant_flow_l_min"       
## [15] "thickness_mm"              "tensile_strength_mpa"     
## [17] "surface_roughness_um"      "defect_flag"              
## [19] "defect_type"               "rework_needed"
  1. Ubah ke numerik
data$tensile_strength_mpa <- as.numeric(data$tensile_strength_mpa)
data$surface_roughness_um <- as.numeric(data$surface_roughness_um)
data$ambient_humidity_pct <- as.numeric(data$ambient_humidity_pct)
  1. Data Bersih
data_clean <- data[complete.cases(data), ]
head(data_clean)
## # A tibble: 6 × 20
##   record_id plant line_id machine_id shift operator_experience_…¹ material_batch
##       <dbl> <chr> <chr>   <chr>      <fct>                  <dbl> <chr>         
## 1         1 Plan… L3      M07        even…                   5.27 B090          
## 2         2 Plan… L1      M18        night                   1.61 B122          
## 3         3 Plan… L4      M10        even…                   8.35 B071          
## 4         4 Plan… L3      M01        even…                   4.66 B069          
## 5         5 Plan… L1      M08        even…                   6.77 B141          
## 6         6 Plan… L3      M13        day                     0    B049          
## # ℹ abbreviated name: ¹​operator_experience_years
## # ℹ 13 more variables: ambient_temp_c <dbl>, ambient_humidity_pct <dbl>,
## #   vibration_rms <dbl>, pressure_bar <dbl>, feed_rate_mm_s <dbl>,
## #   laser_power_w <dbl>, coolant_flow_l_min <dbl>, thickness_mm <dbl>,
## #   tensile_strength_mpa <dbl>, surface_roughness_um <dbl>, defect_flag <dbl>,
## #   defect_type <chr>, rework_needed <dbl>

Pada tahap preprocessing, data dibersihkan dari missing value menggunakan na.omit(). Variabel shift diubah menjadi kategorik, sedangkan ‘tensile_strength_mpa’, ‘surface_roughness_um’, dan ‘ambient_humidity_pct’ dikonversi ke numerik. Data kemudian dipastikan bebas nilai kosong dengan complete.cases() sehingga siap untuk analisis.

Pemilihan Variabel

  1. Variabel Dependen
X1 <- data_clean$tensile_strength_mpa
X2 <- data_clean$surface_roughness_um
  1. Variabel Independen
data_clean$X3 <- as.factor(data_clean$shift)
  1. Kovarian
X4 <- data_clean$ambient_humidity_pct
Y <- cbind(X1, X2)

dt <- data.frame(
  X3 = data_clean$X3,
  X1 = X1,
  X2 = X2,
  X4 = X4
)

knitr::kable(head(dt, 10), 
             caption = "Manufacturing Dataset", 
             align = "l")
Manufacturing Dataset
X3 X1 X2 X4
evening 516.53 2.680 67.9
night 537.07 2.814 34.8
evening 539.20 2.139 50.4
evening 541.54 2.197 34.8
evening 594.15 1.339 32.7
day 511.26 2.555 90.0
evening 559.73 2.597 48.0
day 530.13 2.734 55.1
night 543.20 1.670 41.9
evening 513.36 3.533 44.7

Variabel ‘tensile_strength_mpa’ dan ‘surface_roughness_um’ digunakan sebagai variabel dependen, ‘shift’ sebagai variabel independen, dan ‘ambient_humidity_pct’ sebagai kovariat. Variabel ‘record_id’ hanya sebagai identitas dan tidak digunakan dalam analisis.

Uji Asumsi Manova, Ancova, dan Mancova

Dilakukan uji asumsi untuk melakukan model Manova, Ancova, dan Mancova.

a. Uji Normalitas Univariat dengan Anderson-Darling

ad.test(data_clean$tensile_strength_mpa)
## 
##  Anderson-Darling normality test
## 
## data:  data_clean$tensile_strength_mpa
## A = 0.27246, p-value = 0.6695
ad.test(data_clean$surface_roughness_um)
## 
##  Anderson-Darling normality test
## 
## data:  data_clean$surface_roughness_um
## A = 0.719, p-value = 0.0607

Berdasarkan hasil uji Anderson-Darling pada variabel ‘tensile_strength_mpa’ memiliki p-value sebesar 0.6695 dan variabel ‘surface_roughness_um’ memiliki p-value sebesar 0.0607 yang hasilnya sama-sama menunjukkan lebih dari 0.05.

Sehingga dapat disimpulkan bahwa kedua variabel dependen berdistribusi normal, sehingga asumsi normalitas univariat terpenuhi.

Normalitas Residual

residu <- aov(tensile_strength_mpa ~ shift + ambient_humidity_pct, data = data_clean)

par(mfrow = c(1,1))
qqnorm(residuals(residu),
       main = "Q-Q Plot Residual ANCOVA")
qqline(residuals(residu), col = "red")

Berdasarkan Q-Q plot, residual mengikuti garis diagonal sehingga asumsi normalitas terpenuhi.

b. Uji Normalitas Multivariat

library(MVN)

Y <- data_clean[, c("tensile_strength_mpa",
                    "surface_roughness_um")]

mvn_result <- mvn(
  data = Y,
  mvn_test = "mardia"
)

hasil_mvn <- mvn_result$multivariate_normality

hasil_mvn$MVN <- ifelse(hasil_mvn$p.value > 0.05,
                        "Normal",
                        "Tidak Normal")

print(hasil_mvn)
##              Test Statistic p.value     Method    MVN
## 1 Mardia Skewness     7.448   0.114 asymptotic Normal
## 2 Mardia Kurtosis     0.920   0.358 asymptotic Normal

Hasil uji Mardia menunjukkan Skewness memiliki p-value 0.114 dan Kurtosis memiliki p-value 0.358 yang hasilnya menunjukkan lebih dari 0.05.

Artinya, data berdistribusi normal secara multivariat, sehingga asumsi normalitas multivariat pada MANOVA dan MANCOVA terpenuhi.

c. Homogenitas Matriks Kovarians

1. Box’s M Test

boxM(Y, data_clean$shift)
## 
##  Box's M-test for Homogeneity of Covariance Matrices 
## 
## data:  Y by data_clean$shift 
## Chi-Sq (approx.) = 3.3034, df = 6, p-value = 0.7699

Hasil uji Box’s M, p-value = 0.7699 yang artinya lebih dari 0.05.

Menunjukkan bahwa tidak terdapat perbedaan matriks kovarians antar kelompok shift, sehingga asumsi homogenitas kovarians terpenuhi.

d. Homogenitas Varians

leveneTest(tensile_strength_mpa ~ shift, data = data_clean)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value Pr(>F)
## group    2  0.1823 0.8333
##       9997
leveneTest(surface_roughness_um ~ shift, data = data_clean)
## Levene's Test for Homogeneity of Variance (center = median)
##         Df F value Pr(>F)
## group    2  1.8579  0.156
##       9997

Hasil uji Levene pada variabel ‘tensile_strength_mpa’ memiliki p-value 0.8333 dan varibel ‘surface_roughness_um’ memiliki p-value 0.156 yang menunjukkan hasilnya lebih dari 0.05.

Artinya, varians antar kelompok homogen.

e. Uji Linieritas

lin1 <- lm(tensile_strength_mpa ~ ambient_humidity_pct,
           data=data_clean)

summary(lin1)
## 
## Call:
## lm(formula = tensile_strength_mpa ~ ambient_humidity_pct, data = data_clean)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -120.127  -22.244   -0.288   21.999  114.059 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          580.44356    1.37562  421.95   <2e-16 ***
## ambient_humidity_pct  -0.55031    0.02713  -20.28   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 32.77 on 9998 degrees of freedom
## Multiple R-squared:  0.03951,    Adjusted R-squared:  0.03942 
## F-statistic: 411.3 on 1 and 9998 DF,  p-value: < 2.2e-16

Terdapat hubungan linier signifikan antara ambient humidity dan tensile strength (p-value < 0,05) dengan arah negatif, di mana kenaikan kelembaban menurunkan tensile strength. Namun, pengaruhnya lemah (R² ≈ 3,95%).

lin2 <- lm(surface_roughness_um ~ ambient_humidity_pct,
           data=data_clean)

summary(lin2)
## 
## Call:
## lm(formula = surface_roughness_um ~ ambient_humidity_pct, data = data_clean)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.46895 -0.27683 -0.00346  0.27317  1.67110 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          1.7730421  0.0171901  103.14   <2e-16 ***
## ambient_humidity_pct 0.0078075  0.0003391   23.03   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4095 on 9998 degrees of freedom
## Multiple R-squared:  0.05036,    Adjusted R-squared:  0.05027 
## F-statistic: 530.2 on 1 and 9998 DF,  p-value: < 2.2e-16

Terdapat hubungan linier signifikan antara ambient humidity dan surface roughness (p-value < 0,05) dengan arah positif, di mana peningkatan kelembaban meningkatkan surface roughness. Namun, pengaruhnya lemah (R² ≈ 5,03%).

plot(data_clean$ambient_humidity_pct,
     data_clean$tensile_strength_mpa)

plot(data_clean$ambient_humidity_pct,
     data_clean$surface_roughness_um)

Berdasarkan scatter plot uji linieritas antara variabel ‘ambient_humidity_pct’ dengan ‘tensile_strength_mpa’ dan ‘ambient_humidity_pct’ dengan ‘surface_roughness_um’ terlihat adanya pola hubungan linier (tidak acak), sehingga asumsi linearitas terpenuhi.

f. Multikolinieritas

cor(data_clean[, c("tensile_strength_mpa",
                   "surface_roughness_um",
                   "ambient_humidity_pct")])
##                      tensile_strength_mpa surface_roughness_um
## tensile_strength_mpa           1.00000000          -0.05067843
## surface_roughness_um          -0.05067843           1.00000000
## ambient_humidity_pct          -0.19878308           0.22441043
##                      ambient_humidity_pct
## tensile_strength_mpa           -0.1987831
## surface_roughness_um            0.2244104
## ambient_humidity_pct            1.0000000

Hasil korelasi menunjukkan bahwa tidak ada nilai korelasi yang mendekati ±0.9 dan nilai tertingginya hanya sekitar 0.22.

Sehingga dapat disimpulkan bahwa tidak terjadi multikolinearitas, dan variabel aman digunakan bersama dalam model.

Uji Korelasi Antar Variabel Dependen (Bartlett)

cor_matrix <- cor(data_clean[, c(
  "tensile_strength_mpa",
  "surface_roughness_um"
)])

cortest.bartlett(cor_matrix, n = nrow(data_clean))
## $chisq
## [1] 25.70964
## 
## $p.value
## [1] 3.968393e-07
## 
## $df
## [1] 1

Hasil uji Bartlett menunjukkan p-value < 0,05, sehingga terdapat korelasi signifikan antar variabel dependen dan asumsi untuk MANOVA terpenuhi.

g. Homogenitas Slope

model_interaksi <- manova(
  cbind(tensile_strength_mpa,
        surface_roughness_um) ~ 
    shift * ambient_humidity_pct,
  data = data_clean
)

summary(model_interaksi, test = "Pillai")
##                              Df   Pillai approx F num Df den Df    Pr(>F)    
## shift                         2 0.007491    18.79      4  19988 1.986e-15 ***
## ambient_humidity_pct          1 0.086232   471.52      2   9993 < 2.2e-16 ***
## shift:ambient_humidity_pct    2 0.000673     1.68      4  19988    0.1512    
## Residuals                  9994                                              
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hasil uji interaksi variabel ‘ambient_humidity_pct’ memiliki p-value 0.1512 yang nilainya > 0.05.

Artinya, tidak terdapat interaksi signifikan antara variabel independen dan kovariat. Sehingga asumsi homogenitas slope terpenuhi.

h. Independensi Observasi

Asumsi independensi observasi menyatakan bahwa setiap pengamatan bersifat bebas satu sama lain. Dalam penelitian ini, setiap baris data merepresentasikan satu kejadian produksi yang berbeda pada sistem manufaktur berbasis IoT. Data tidak memiliki struktur pengukuran berulang atau keterkaitan langsung antar observasi dalam analisis, sehingga setiap pengamatan diperlakukan sebagai independen. Oleh karena itu, asumsi independensi observasi dianggap terpenuhi.

Kesimpulan Uji Asumsi

hasil_uji <- data.frame(
  Uji = c(
    "Normalitas Univariat (Tensile)",
    "Normalitas Univariat (Roughness)",
    "Normalitas Multivariat (Mardia Skewness)",
    "Normalitas Multivariat (Mardia Kurtosis)",
    "Homogenitas Kovarians (Box's M)",
    "Homogenitas Varians (Levene Tensile)",
    "Homogenitas Varians (Levene Roughness)",
    "Linieritas (Tensile vs Humidity)",
    "Linieritas (Roughness vs Humidity)",
    "Multikolinearitas",
    "Korelasi DV (Bartlett)",
    "Homogenitas Slope"
  ),
  
  p_value = c(
    0.6695,
    0.0607,
    0.114,
    0.358,
    0.7699,
    0.8333,
    0.156,
    "< 2e-16",
    "< 2e-16",
    "0.22 (corr)",
    3.968e-07,
    0.1512
  ),
  
  Keputusan = c(
    "Normal",
    "Normal",
    "Normal",
    "Normal",
    "Homogen",
    "Homogen",
    "Homogen",
    "Linier",
    "Linier",
    "Tidak ada multikolinearitas",
    "Ada korelasi",
    "Terpenuhi"
  )
)

hasil_uji
##                                         Uji     p_value
## 1            Normalitas Univariat (Tensile)      0.6695
## 2          Normalitas Univariat (Roughness)      0.0607
## 3  Normalitas Multivariat (Mardia Skewness)       0.114
## 4  Normalitas Multivariat (Mardia Kurtosis)       0.358
## 5           Homogenitas Kovarians (Box's M)      0.7699
## 6      Homogenitas Varians (Levene Tensile)      0.8333
## 7    Homogenitas Varians (Levene Roughness)       0.156
## 8          Linieritas (Tensile vs Humidity)     < 2e-16
## 9        Linieritas (Roughness vs Humidity)     < 2e-16
## 10                        Multikolinearitas 0.22 (corr)
## 11                   Korelasi DV (Bartlett)   3.968e-07
## 12                        Homogenitas Slope      0.1512
##                      Keputusan
## 1                       Normal
## 2                       Normal
## 3                       Normal
## 4                       Normal
## 5                      Homogen
## 6                      Homogen
## 7                      Homogen
## 8                       Linier
## 9                       Linier
## 10 Tidak ada multikolinearitas
## 11                Ada korelasi
## 12                   Terpenuhi

Berdasarkan hasil uji asumsi, data memenuhi normalitas, homogenitas, linearitas, serta tidak terjadi multikolinearitas maupun interaksi signifikan. Dengan demikian, asumsi MANOVA, ANCOVA, dan MANCOVA terpenuhi dan analisis dapat dilanjutkan.

Pemodelan Manova, Ancova, dan Mancova

1. Manova

manova_model <- manova(
  cbind(tensile_strength_mpa, surface_roughness_um) ~ shift,
  data = data_clean
)

summary(manova_model, test = "Wilks")
##             Df   Wilks approx F num Df den Df    Pr(>F)    
## shift        2 0.99288   17.884      4  19992 1.143e-14 ***
## Residuals 9997                                             
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary.aov(manova_model)
##  Response tensile_strength_mpa :
##               Df   Sum Sq Mean Sq F value Pr(>F)
## shift          2      375  187.33  0.1675 0.8457
## Residuals   9997 11177799 1118.12               
## 
##  Response surface_roughness_um :
##               Df  Sum Sq Mean Sq F value   Pr(>F)    
## shift          2   12.49  6.2446  35.612 3.88e-16 ***
## Residuals   9997 1753.00  0.1754                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hasil MANOVA menunjukkan nilai Wilks’ Lambda sebesar 0,99288 dengan p-value < 0,05, sehingga dapat disimpulkan bahwa variabel shift berpengaruh signifikan secara simultan terhadap variabel dependen. Namun secara uji univariat, pengaruh signifikan hanya terjadi pada surface roughness, sedangkan tensile strength tidak signifikan.

2. Ancova

ancova_model <- aov(
  tensile_strength_mpa ~ shift + ambient_humidity_pct,
  data = data_clean
)
summary(ancova_model)
##                        Df   Sum Sq Mean Sq F value Pr(>F)    
## shift                   2      375     187   0.174   0.84    
## ambient_humidity_pct    1   441559  441559 411.115 <2e-16 ***
## Residuals            9996 10736240    1074                   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hasil ANCOVA menunjukkan bahwa variabel shift memiliki p-value sebesar 0,84 (> 0,05), sehingga dapat disimpulkan bahwa shift tidak berpengaruh signifikan terhadap tensile strength setelah dikontrol oleh kovariat. Sementara itu, variabel ambient_humidity_pct memiliki p-value < 0,05, yang berarti berpengaruh signifikan terhadap tensile strength. Dengan demikian, dapat disimpulkan bahwa variasi tensile strength lebih dipengaruhi oleh faktor kelembaban lingkungan dibandingkan oleh perbedaan shift kerja.

3. Mancova

mancova_model <- manova(
  cbind(tensile_strength_mpa, surface_roughness_um) ~ 
    shift + ambient_humidity_pct,
  data = data_clean
)

summary(mancova_model, test = "Pillai")
##                        Df   Pillai approx F num Df den Df    Pr(>F)    
## shift                   2 0.007486    18.78      4  19992 2.019e-15 ***
## ambient_humidity_pct    1 0.086195   471.39      2   9995 < 2.2e-16 ***
## Residuals            9996                                              
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
summary.aov(mancova_model)
##  Response tensile_strength_mpa :
##                        Df   Sum Sq Mean Sq  F value Pr(>F)    
## shift                   2      375     187   0.1744   0.84    
## ambient_humidity_pct    1   441559  441559 411.1148 <2e-16 ***
## Residuals            9996 10736240    1074                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
##  Response surface_roughness_um :
##                        Df  Sum Sq Mean Sq F value    Pr(>F)    
## shift                   2   12.49   6.245  37.523 < 2.2e-16 ***
## ambient_humidity_pct    1   89.45  89.455 537.521 < 2.2e-16 ***
## Residuals            9996 1663.54   0.166                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Hasil MANCOVA menunjukkan bahwa variabel shift memiliki nilai Pillai’s Trace = 0.007486 dengan p-value = 2.019 × 10⁻15 (< 0,05), sehingga berpengaruh signifikan secara simultan terhadap variabel dependen tensile_strength_mpa dan surface_roughness_um. Sementara itu, ambient_humidity_pct memiliki nilai Pillai’s Trace = 0.086195 dengan p-value < 2.2 × 10⁻16, sehingga juga berpengaruh signifikan secara simultan terhadap variabel dependen.

Kesimpulan

Secara keseluruhan, ketiga analisis menunjukkan hasil yang tidak sepenuhnya konsisten pada semua variabel dependen. Hasil MANOVA dan MANCOVA menunjukkan bahwa variabel shift kerja berpengaruh signifikan secara simultan terhadap kombinasi tensile strength dan surface roughness. Namun, berdasarkan uji univariat dan hasil ANCOVA, pengaruh tersebut tidak terjadi pada semua aspek, di mana shift kerja tidak berpengaruh signifikan terhadap tensile strength.

Di sisi lain, variabel ambient humidity terbukti memiliki pengaruh signifikan terhadap tensile strength setelah dikontrol dalam model ANCOVA, serta berpengaruh signifikan secara simultan dalam model MANCOVA. Hal ini menunjukkan bahwa faktor lingkungan memiliki peran penting dalam memengaruhi kualitas material, khususnya kekuatan tarik.

Temuan ini mengindikasikan bahwa variasi kualitas produk dalam proses manufaktur tidak hanya dipengaruhi oleh perbedaan shift kerja, tetapi juga sangat dipengaruhi oleh kondisi lingkungan. Selain itu, pengaruh shift kerja cenderung lebih terlihat pada aspek surface roughness dibandingkan tensile strength. Oleh karena itu, pengendalian kondisi lingkungan, khususnya kelembaban udara, serta evaluasi proses kerja pada setiap shift menjadi hal yang penting untuk menjaga konsistensi kualitas produk secara keseluruhan.