By :
# 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
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")
)
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")
)
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")
)
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")
)
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.
# 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.
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} \]
# 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)} \]
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\).
# 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.
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.
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.
Berdasarkan analisis yang telah dilakukan pada data epoxy laminate, diperoleh beberapa kesimpulan sebagai berikut.
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}\)
Nilai beta1 negatif menunjukkan bahwa semakin tinggi stress yang diterima komponen, semakin pendek umur kelelahan materialnya.
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.
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.