By :

1. Read Data

# Membaca data epoxy
data_epoxy <- read.csv("epoxylaminate.csv")

# Merapikan nama kolom variabel x dan y
colnames(data_epoxy) <- c("Stress", "Cycles", "Status")

head(data_epoxy)
##   Stress Cycles Status
## 1    380   34.2 Failed
## 2    380   37.7 Failed
## 3    380   42.0 Failed
## 4    380   42.3 Failed
## 5    380   48.2 Failed
## 6    380   52.5 Failed

2. Trial & Error Model

Plot Linear - Linear

ggplot(data_epoxy, aes(x = Stress, y = Cycles)) +
  geom_point(color = "black", size = 2) +
  labs(
    title = "Scatter Plot of Cycles vs Stress", 
    subtitle = "Linear - Linear Scale",
    x = "Stress (MPa)", 
    y = "Cycles (Ribuan Jam)"
  ) +
  theme_bw() + 
  theme(
    axis.title.x = element_text(margin = margin(t = 15), size = 10),  
    axis.title.y = element_text(margin = margin(r = 15), size = 10),  
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    axis.line = element_line(color = "black")
  )

Plot Log - Linear

ggplot(data_epoxy, aes(x = log(Stress), y = Cycles)) +
  geom_point(color = "black", size = 2) +
  labs(
    title = "Scatter Plot of Cycles vs Stress", 
    subtitle = "Log (X) - Linear (Y) Scale",
    x = "Log (Stress)", 
    y = "Cycles (Ribuan Jam)"
  ) +
  theme_bw() + 
  theme(
    axis.title.x = element_text(margin = margin(t = 15), size = 10),  
    axis.title.y = element_text(margin = margin(r = 15), size = 10),  
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    axis.line = element_line(color = "black")
  )

Plot Linear - Log

ggplot(data_epoxy, aes(x = Stress, y = log(Cycles))) +
  geom_point(color = "black", size = 2) +
  labs(
    title = "Scatter Plot of Cycles vs Stress", 
    subtitle = "Linear (X) - Log (Y) Scale",
    x = "Stress (MPa)", 
    y = "Log (Cycles)"
  ) +
  theme_bw() + 
  theme(
    axis.title.x = element_text(margin = margin(t = 15), size = 10),  
    axis.title.y = element_text(margin = margin(r = 15), size = 10),  
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    axis.line = element_line(color = "black")
  )

Plot Log - Log

ggplot(data_epoxy, aes(x = log(Stress), y = log(Cycles))) +
  geom_point(color = "black", size = 2) +
  labs(
    title = "Scatter Plot of Cycles vs Stress", 
    subtitle = "Log - Log Scale",
    x = "Log (Stress)", 
    y = "Log (Cycles)"
  ) +
  theme_bw() + 
  theme(
    axis.title.x = element_text(margin = margin(t = 15), size = 10),  
    axis.title.y = element_text(margin = margin(r = 15), size = 10),  
    panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(),
    panel.border = element_blank(),
    axis.line = element_line(color = "black")
  )

3. Pemilihan Model Terbaik

Berdasarkan Visualisasi Plot

Berdasarkan keempat scatter plot, plot Log-Log menunjukkan pola yang paling mendekati garis lurus dibandingkan skala lainnya. Plot Linear-Linear, Log-Linear, dan Linear-Log masih menunjukkan pola yang cukup melengkung, sedangkan pada plot Log-Log titik-titik data terlihat lebih linear. Hal ini menunjukkan bahwa transformasi logaritma pada kedua variabel lebih sesuai untuk menggambarkan hubungan antara stress dan cycles, yang juga sejalan dengan hubungan power-law pada data kelelahan material.

Berdasarkan Nilai R-squared dan RSE

# Fit semua model
fit_linlin <- lm(Cycles      ~ Stress,      data = data_epoxy)
fit_loglin <- lm(Cycles      ~ log(Stress), data = data_epoxy)
fit_linlog <- lm(log(Cycles) ~ Stress,      data = data_epoxy)
fit_loglog <- lm(log(Cycles) ~ log(Stress), data = data_epoxy)

# Tabel perbandingan
model_comparison <- data.frame(
  Model     = c("Linear-Linear", "Log-Linear", "Linear-Log", "Log-Log"),
  R_squared = round(c(
    summary(fit_linlin)$r.squared,
    summary(fit_loglin)$r.squared,
    summary(fit_linlog)$r.squared,
    summary(fit_loglog)$r.squared), 4),
  RSE       = round(c(
    summary(fit_linlin)$sigma,
    summary(fit_loglin)$sigma,
    summary(fit_linlog)$sigma,
    summary(fit_loglog)$sigma), 4)
)

model_comparison
##           Model R_squared       RSE
## 1 Linear-Linear    0.5257 4789.1729
## 2    Log-Linear    0.5547 4640.3936
## 3    Linear-Log    0.9354    0.5304
## 4       Log-Log    0.9443    0.4926

Berdasarkan tabel perbandingan di atas, model Log-Log menghasilkan nilai R² tertinggi dan RSE terendah di antara model-model yang memiliki skala respons yang sama (log(Cycles)). Artinya, model Log-Log mampu menjelaskan variasi data paling baik sekaligus menghasilkan simpangan prediksi yang paling kecil.

Kesimpulan Pemilihan Model

Berdasarkan hasil visualisasi scatter plot, perbandingan nilai R² dan RSE, dapat disimpulkan bahwa model Log-Log merupakan model yang paling sesuai untuk menggambarkan hubungan antara stress dan fatigue life pada epoxy laminate. Model tersebut dapat dituliskan sebagai berikut:

\[ \log(\text{y}) = \beta_0 + \beta_1 \cdot \log(\text{X}) + \varepsilon, \quad \varepsilon \sim N(0, \sigma^2)\\ dimana, \\ \text {X = Stress} \\ \text {y = Cycles} \] atau bisa ditulis: \[ \text{y} = e^{\beta_0} \cdot \text{X}^{\beta_1} \]

4. Estimasi Parameter Model Terbaik

# Model : Log-Log
beta0 <- coef(fit_loglog)[1]
beta1 <- coef(fit_loglog)[2]
sigma <- summary(fit_loglog)$sigma

cat("=== Parameter Model Log-Log ===\n")
## === Parameter Model Log-Log ===
cat(sprintf("beta0 (intercept) : %.6f\n", beta0))
## beta0 (intercept) : 98.259567
cat(sprintf("beta1 (slope)     : %.6f\n", beta1))
## beta1 (slope)     : -15.863197
cat(sprintf("sigma (RSE)       : %.6f\n", sigma))
## sigma (RSE)       : 0.492619

Berdasarkan output di atas, diperoleh nilai parameter model yang terdiri dari beta0, beta1, dan sigma. Nilai beta1 negatif menunjukkan hubungan invers antara stress dan cycles, sedangkan sigma digunakan sebagai komponen dispersi dalam perhitungan quantile.

summary(fit_loglog)
## 
## Call:
## lm(formula = log(Cycles) ~ log(Stress), data = data_epoxy)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.00891 -0.39980  0.04588  0.38779  1.06445 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  98.2596     1.9954   49.24   <2e-16 ***
## log(Stress) -15.8632     0.3475  -45.65   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4926 on 123 degrees of freedom
## Multiple R-squared:  0.9443, Adjusted R-squared:  0.9438 
## F-statistic:  2084 on 1 and 123 DF,  p-value: < 2.2e-16

Sehingga, model dapat dituliskan sebagai berikut : \[ \log(\text{y}) = 98.26 - 15.86 \cdot \log(\text{X})\\ \text{atau}\\ \hat y = e^{98.26} \cdot \text{X}^{(-15.86)} \]

5. Konstruksi Quantile

Dasar Teori

Pada model Log-Log, \(\log(\text{y})\) mengikuti distribusi normal dengan mean \(\beta_0 + \beta_1 \cdot \log(\text{X})\) dan simpangan baku \(\sigma\). Sehingga quantile ke-\(p\) dari Cycles pada nilai stress tertentu \(x\) adalah:

\[t_p = \exp\left(\beta_0 + \beta_1 \cdot \log(x) + \sigma \cdot z_p\right)\]

di mana \(z_p = \Phi^{-1}(p)\) adalah quantile distribusi normal standar pada level \(p\).

1st Quantile (p = 0.01)

# Fungsi quantile
quantile_cycles <- function(p, stress, b0, b1, sig) {
  zp     <- qnorm(p)
  log_tp <- b0 + b1 * log(stress) + sig * zp
  return(exp(log_tp))
}

# Hitung Q1 untuk setiap level stress
stress_levels <- sort(unique(data_epoxy$Stress))

q01 <- sapply(stress_levels, function(s)
  quantile_cycles(0.01, s, beta0, beta1, sigma))

hasil_q01 <- data.frame(
  Stress_MPa          = stress_levels,
  Q1_thousand_cycles  = round(q01, 2)
)

hasil_q01
##   Stress_MPa Q1_thousand_cycles
## 1        270            4042.79
## 2        280            2270.56
## 3        300             760.01
## 4        340             104.36
## 5        380              17.88

Nilai 1st quantile (\(t_{0.01}\)) menyatakan batas waktu di mana 1% dari seluruh komponen sayap pesawat yang diproduksi diperkirakan sudah mengalami kegagalan (misalnya retak). PLevel 1% dipilih karena dalam konteks penerbangan, kegagalan sekecil apapun menyangkut keselamatan jiwa. Semakin tinggi stress, semakin kecil t0.01t_{0.01} \(t_{0.01}\), artinya kegagalan terjadi lebih awal.

Quantile Plot + Interpretasi

stress_seq <- seq(265, 385, length.out = 300)

df_quantiles <- data.frame(
  stress  = rep(stress_seq, 3),
  cycles  = c(
    sapply(stress_seq, function(s) quantile_cycles(0.01, s, beta0, beta1, sigma)),
    sapply(stress_seq, function(s) quantile_cycles(0.10, s, beta0, beta1, sigma)),
    sapply(stress_seq, function(s) quantile_cycles(0.50, s, beta0, beta1, sigma))
  ),
  level = rep(c("Q1 (1%)", "Q10 (10%)", "Q50 (50%)"), each = length(stress_seq))
)

ggplot() +
  geom_point(data = data_epoxy,
             aes(x = log(Stress), y = log(Cycles)),
             color = "gray50", size = 2, alpha = 0.6) +
  geom_line(data = df_quantiles,
            aes(x = log(stress), y = log(cycles),
                color = level, linetype = level),
            linewidth = 1.2) +
  scale_color_manual(values = c("Q1 (1%)"   = "red",
                                 "Q10 (10%)" = "orange",
                                 "Q50 (50%)" = "steelblue")) +
  labs(
    title    = "Quantile Lines terhadap Data Observasi",
    subtitle = "Skala Log - Log",
    x        = "Log (Stress)",
    y        = "Log (Cycles)",
    color    = "Level Quantile",
    linetype = "Level Quantile"
  ) +
  theme_bw() +
  theme(
    axis.title.x       = element_text(margin = margin(t = 15), size = 10),
    axis.title.y       = element_text(margin = margin(r = 15), size = 10),
    panel.grid.major   = element_blank(),
    panel.grid.minor   = element_blank(),
    panel.border       = element_blank(),
    axis.line          = element_line(color = "black")     
  )

Berdasarkan plot di atas, garis merah (Q1 = 1%) berada paling bawah, yang menunjukkan bahwa hanya sekitar 1% komponen yang diperkirakan mengalami kegagalan sebelum mencapai jumlah cycles pada garis tersebut. Garis biru (Q50 = 50%) merupakan nilai median, sehingga sekitar setengah komponen diperkirakan masih berfungsi dan setengah lainnya sudah mengalami kegagalan pada tingkat cycles tersebut. Terlihat bahwa semua garis quantile cenderung menurun ketika nilai stress meningkat. Hal ini menunjukkan bahwa semakin besar beban yang diberikan, semakin pendek umur kelelahan (fatigue life) komponen.

6. Quantile Level Pilihan

Kami memilih level quantile p = 0.05 sebagai estimasi tambahan. Level p = 0.05 dipilih sebagai batas peringatan dini (early warning) sebelum zona kritis 1% tercapai.”

p_choice <- 0.05

q05 <- sapply(stress_levels, function(s)
  quantile_cycles(p_choice, s, beta0, beta1, sigma))

hasil_q05 <- data.frame(
  Stress_MPa         = stress_levels,
  Q5_thousand_cycles = round(q05, 2)
)

hasil_q05
##   Stress_MPa Q5_thousand_cycles
## 1        270            5655.63
## 2        280            3176.39
## 3        300            1063.21
## 4        340             145.99
## 5        380              25.01

Nilai \(t_{0.05}\) pada setiap level stress menunjukkan jumlah cycles saat sekitar 5% komponen epoxy laminate diperkirakan telah mengalami kegagalan. Terlihat bahwa semakin tinggi nilai stress, nilai \(t_{0.05}\) semakin kecil. Hal ini menunjukkan bahwa beban yang lebih besar dapat mempercepat kegagalan material. Oleh karena itu, nilai \(t_{0.05}\) dapat digunakan sebagai acuan dalam menentukan waktu inspeksi sebelum risiko kegagalan meningkat.

7. Kesimpulan

Berdasarkan analisis yang telah dilakukan pada data epoxy laminate, diperoleh beberapa kesimpulan sebagai berikut.

  1. Model terbaik yang dipilih adalah model Log-Log berdasarkan pola scatter plot yang paling linear, nilai R² tertinggi, dan RSE terendah. Model ini mencerminkan hubungan power-law antara stress dan fatigue life, yaitu \(\\ \text{y} = e^{\beta_0} \cdot \text{X}^{\beta_1}\)

  2. Nilai beta1 negatif menunjukkan bahwa semakin tinggi stress yang diterima komponen, semakin pendek umur kelelahan materialnya.

  3. 1st quantile (\(t_{0.01}\)) menunjukkan batas cycles di mana 1% komponen sayap pesawat diperkirakan sudah gagal. Nilai ini semakin kecil seiring meningkatnya stress, sehingga menjadi acuan kritis dalam perancangan keselamatan komponen pesawat.

  4. 5th quantile (\(t_{0.05}\)) dipilih sebagai batas peringatan dini, menunjukkan bahwa 5% komponen diperkirakan gagal sebelum mencapai jumlah cycles tersebut dan dapat dijadikan acuan jadwal inspeksi komponen.