Densidade em função da Resistência e Rigidez
Instalação do pacote e verificação se todos estão instalados. O Comando abaixo ajuda a verificar se os pacotes estão instalados, ou se necessitam ser instalados e habilitados.
pacotes <- c("tidyverse", "readxl", "ggpubr", "kableExtra",
"PerformanceAnalytics", "scatterplot3d", "MASS",
"gridExtra", "car", "lmtest", "plyr", "knitr", "dplyr")
if(sum(as.numeric(!pacotes %in% installed.packages())) != 0){
instalador <- pacotes[!pacotes %in% installed.packages()]
for(i in 1:length(instalador)) {
install.packages(instalador, dependencies = T)
break()}
sapply(pacotes, require, character = T)
} else {
sapply(pacotes, require, character = T)
}## tidyverse readxl ggpubr
## TRUE TRUE TRUE
## kableExtra PerformanceAnalytics scatterplot3d
## TRUE TRUE TRUE
## MASS gridExtra car
## TRUE TRUE TRUE
## lmtest plyr knitr
## TRUE TRUE TRUE
## dplyr
## TRUE
A densidade se refere a quantidade de combustível por unidade de volume. O objetivo principal dessa modelagem é verificar se a Densidade tem correlação com as propriedades mecânicas do combustível (resistência e rigidez). Caso haja associação entre essas variáveis, interpretar a modelagem estatística realizada e a influência de cada variável no valor da densidade, por meio da comparação da magnitude dos betas da equação de regressão ajustada. Adicionalmente, avaliar a qualidade dos dados experimentais por meio das seguintes estatísticas descritivas: média, desvio padrão, coeficiente de variação e score z. Como referência para a Área de Tecnologia da Madeira, nas disciplinas ministradas pela professora Gilmara, deve-se considerar dados de excelente qualidade se o Coeficiente de variação tiver valor de até 10%, de 10 a 20% dados bons, de 20 a 30 % dados ruins e acima de 30% dados péssimos. Também, no que se refere ao score Z, valores em módulo acima de 2 serão considerados como outliers (pontos atípicos). Os outliers também serão identificados por meio de gráficos box plot das variáveis do modelo.
tabela1 <- read_excel("Dados.xlsx",
sheet = "Densidade")tabela1 %>%
kbl(caption = "Tabela dos Dados", align = 'cc') %>%
kable_classic(full_width = F, html_font = "Times", font_size = 12)%>%
scroll_box(width = "400px", height = "300px")| Densidade | Resistencia | Rigidez |
|---|---|---|
| 688 | 50.5 | 12876 |
| 1170 | 79.5 | 20827 |
| 694 | 59.8 | 12912 |
| 1170 | 76.7 | 16694 |
| 803 | 48.1 | 13481 |
| 677 | 59.1 | 14098 |
| 871 | 52.0 | 14613 |
| 801 | 56.0 | 16224 |
| 759 | 54.8 | 11105 |
| 504 | 39.0 | 9839 |
| 500 | 31.5 | 8058 |
| 1090 | 93.2 | 23002 |
| 838 | 54.4 | 13627 |
| 1221 | 83.8 | 19426 |
| 705 | 47.3 | 13409 |
| 899 | 48.0 | 13286 |
| 999 | 62.0 | 18421 |
| 822 | 51.8 | 13963 |
| 690 | 48.9 | 18029 |
| 640 | 40.3 | 12813 |
| 931 | 63.5 | 18099 |
| 924 | 48.3 | 14431 |
| 929 | 54.9 | 16782 |
| 1087 | 72.7 | 19881 |
| 952 | 51.6 | 15561 |
| 948 | 78.5 | 19360 |
| 731 | 46.8 | 14933 |
| 899 | 57.7 | 17198 |
| 755 | 53.9 | 14617 |
| 889 | 42.7 | 14577 |
| 739 | 46.0 | 13166 |
| 892 | 78.4 | 18359 |
| 825 | 71.4 | 14624 |
| 919 | 62.4 | 17212 |
| 1068 | 76.0 | 18011 |
| 1074 | 93.3 | 23607 |
| 684 | 56.5 | 14185 |
| 1143 | 82.9 | 22733 |
| 856 | 71.4 | 18971 |
| 756 | 69.9 | 14719 |
| 544 | 37.8 | 9067 |
| 1106 | 95.2 | 21724 |
| 940 | 79.5 | 19583 |
| 580 | 40.9 | 15225 |
| 579 | 35.4 | 8431 |
| 537 | 32.6 | 7110 |
| 535 | 42.3 | 9868 |
| 560 | 40.4 | 11889 |
| 538 | 43.6 | 10904 |
| 645 | 44.4 | 13304 |
# Densidade
y <- tabela1$Densidade
mean_and_sd <- function(y) {
m <- mean(y) # média
s <- sd(y) # desvio padrão
# sprintf("%0.3f U00B1 %0.3f", m, s)
sprintf("%0.0f $\\pm$ %0.2f", m, s)}
Med_e_sd<- mean_and_sd(y)
cv <- function(y) {100 * sd(y)/mean(y)}
Coef_de_Variacao<-cv(y) # coeficiente de variação
Coef_de_Variacao<-round(Coef_de_Variacao, 2)
Densidade<-data.frame(Med_e_sd, Coef_de_Variacao)
# Resistencia
y <- tabela1$Resistencia
mean_and_sd <- function(y) {
m <- mean(y) # média
s <- sd(y) # desvio padrão
# sprintf("%0.3f U00B1 %0.3f", m, s)
sprintf("%0.0f $\\pm$ %0.2f", m, s)}
Med_e_sd<- mean_and_sd(y)
cv <- function(y) {100 * sd(y)/mean(y)}
Coef_de_Variacao<-cv(y) # coeficiente de variação
Coef_de_Variacao<-round(Coef_de_Variacao, 2)
Resistencia<-data.frame(Med_e_sd, Coef_de_Variacao)
#Rigidez
y <- tabela1$Rigidez
mean_and_sd <- function(y) {
m <- mean(y) # média
s <- sd(y) # desvio padrão
# sprintf("%0.3f U00B1 %0.3f", m, s)
sprintf("%0.0f $\\pm$ %0.2f", m, s)}
Med_e_sd<- mean_and_sd(y)
cv <- function(y) {100 * sd(y)/mean(y)}
Coef_de_Variacao<-cv(y) # coeficiente de variação
Coef_de_Variacao<-round(Coef_de_Variacao, 2)
Rigidez<-data.frame(Med_e_sd, Coef_de_Variacao)
# Junção dos data.frame
dados<-rbind(Densidade,Resistencia)
dados<-rbind(dados, Rigidez)
# Criar uma coluna com o nome das variáveis
dados<-mutate(dados,
Variaveis=c("Densidade (g/cm$^{3}$)", "Resistência (MPa)", "Rigidez (MPa)"))
dados<-data.frame(dados)
#Organizar as colunas no data.frame
date<-dplyr::select(dados, Variaveis, Med_e_sd, Coef_de_Variacao)
# Criar da Tabela Descritiva
knitr::kable(date, align = 'cc', caption = "Tabela Descritiva",
col.names = c("Variáveis", "Média $\\pm$ sd", " CV(%)")) %>%
kable_classic(full_width = F, html_font = "Times", font_size = 16)| Variáveis | Média \(\pm\) sd | CV(%) |
|---|---|---|
| Densidade (g/cm\(^{3}\)) | 822 \(\pm\) 197.37 | 24.01 |
| Resistência (MPa) | 58 \(\pm\) 16.77 | 28.83 |
| Rigidez (MPa) | 15297 \(\pm\) 3930.17 | 25.69 |
y <- tabela1$Densidade
scale(y) # padronização da variável ## [,1]
## [1,] -0.6795386825
## [2,] 1.7625851242
## [3,] -0.6491388010
## [4,] 1.7625851242
## [5,] -0.0968742888
## [6,] -0.7352717984
## [7,] 0.2476577006
## [8,] -0.1070075826
## [9,] -0.3198067524
## [10,] -1.6118017124
## [11,] -1.6320683000
## [12,] 1.3572533720
## [13,] 0.0804583528
## [14,] 2.0209841161
## [15,] -0.5934056851
## [16,] 0.3895238138
## [17,] 0.8961885040
## [18,] -0.0006079976
## [19,] -0.6694053886
## [20,] -0.9227377337
## [21,] 0.5516565147
## [22,] 0.5161899863
## [23,] 0.5415232208
## [24,] 1.3420534313
## [25,] 0.6580560996
## [26,] 0.6377895120
## [27,] -0.4616728657
## [28,] 0.3895238138
## [29,] -0.3400733400
## [30,] 0.3388573448
## [31,] -0.4211396905
## [32,] 0.3540572855
## [33,] 0.0145919431
## [34,] 0.4908567518
## [35,] 1.2457871402
## [36,] 1.2761870216
## [37,] -0.6998052701
## [38,] 1.6257856578
## [39,] 0.1716579970
## [40,] -0.3350066931
## [41,] -1.4091358363
## [42,] 1.4383197224
## [43,] 0.5972563368
## [44,] -1.2267365478
## [45,] -1.2318031947
## [46,] -1.4446023646
## [47,] -1.4547356584
## [48,] -1.3280694859
## [49,] -1.4395357177
## [50,] -0.8974044992
## attr(,"scaled:center")
## [1] 822.12
## attr(,"scaled:scale")
## [1] 197.3692
score_z <- function(y, media = NULL, despad = NULL) {if (is.null(media)) {
media <- mean(y)}
if (is.null(despad)) {despad <- sd(y)}
(y - media)/despad}
status <- ifelse(abs(score_z(y)) > 2, "outlier", "tipical") # ocorrência de outlier
table(status)## status
## outlier tipical
## 1 49
y <- tabela1$Resistencia
scale(y) # padronização da variável ## [,1]
## [1,] -0.45634808
## [2,] 1.27314673
## [3,] 0.09828302
## [4,] 1.10616103
## [5,] -0.59947868
## [6,] 0.05653659
## [7,] -0.36689145
## [8,] -0.12834044
## [9,] -0.19990575
## [10,] -1.14218223
## [11,] -1.58946537
## [12,] 2.09018394
## [13,] -0.22376085
## [14,] 1.52958907
## [15,] -0.64718889
## [16,] -0.60544246
## [17,] 0.22948607
## [18,] -0.37881900
## [19,] -0.55176848
## [20,] -1.06465315
## [21,] 0.31894270
## [22,] -0.58755113
## [23,] -0.19394197
## [24,] 0.86761002
## [25,] -0.39074655
## [26,] 1.21350898
## [27,] -0.67700776
## [28,] -0.02695626
## [29,] -0.25357972
## [30,] -0.92152255
## [31,] -0.72471796
## [32,] 1.20754521
## [33,] 0.79008094
## [34,] 0.25334117
## [35,] 1.06441460
## [36,] 2.09614771
## [37,] -0.09852157
## [38,] 1.47591509
## [39,] 0.79008094
## [40,] 0.70062431
## [41,] -1.21374753
## [42,] 2.20945944
## [43,] 1.27314673
## [44,] -1.02887050
## [45,] -1.35687814
## [46,] -1.52386384
## [47,] -0.94537765
## [48,] -1.05868938
## [49,] -0.86784857
## [50,] -0.82013837
## attr(,"scaled:center")
## [1] 58.152
## attr(,"scaled:scale")
## [1] 16.7679
score_z <- function(y, media = NULL, despad = NULL) {if (is.null(media)) {
media <- mean(y)}
if (is.null(despad)) {despad <- sd(y)}
(y - media)/despad}
status <- ifelse(abs(score_z(y)) > 2, "outlier", "tipical") # ocorrência de outlier
table(status)## status
## outlier tipical
## 3 47
y <- tabela1$Rigidez
scale(y) # padronização da variável ## [,1]
## [1,] -0.61592270
## [2,] 1.40714577
## [3,] -0.60676279
## [4,] 0.35553692
## [5,] -0.46198528
## [6,] -0.30499456
## [7,] -0.17395692
## [8,] 0.23594917
## [9,] -1.06653951
## [10,] -1.38866311
## [11,] -1.84182434
## [12,] 1.96055716
## [13,] -0.42483675
## [14,] 1.05067251
## [15,] -0.48030511
## [16,] -0.51160147
## [17,] 0.79495828
## [18,] -0.33934423
## [19,] 0.69521701
## [20,] -0.63195255
## [21,] 0.71302795
## [22,] -0.22026537
## [23,] 0.37792782
## [24,] 1.16644363
## [25,] 0.06725411
## [26,] 1.03387934
## [27,] -0.09253547
## [28,] 0.48377570
## [29,] -0.17293915
## [30,] -0.18311683
## [31,] -0.54213452
## [32,] 0.77918288
## [33,] -0.17115806
## [34,] 0.48733788
## [35,] 0.69063705
## [36,] 2.11449458
## [37,] -0.28285810
## [38,] 1.89211226
## [39,] 0.93490139
## [40,] -0.14698606
## [41,] -1.58509234
## [42,] 1.63538026
## [43,] 1.09061990
## [44,] -0.01823840
## [45,] -1.74691747
## [46,] -2.08303537
## [47,] -1.38128429
## [48,] -0.86705697
## [49,] -1.11768236
## [50,] -0.50702152
## attr(,"scaled:center")
## [1] 15296.68
## attr(,"scaled:scale")
## [1] 3930.169
score_z <- function(y, media = NULL, despad = NULL) {if (is.null(media)) {
media <- mean(y)}
if (is.null(despad)) {despad <- sd(y)}
(y - media)/despad}
status <- ifelse(abs(score_z(y)) > 2, "outlier", "tipical") # ocorrência de outlier
table(status)## status
## outlier tipical
## 2 48
par(mfrow=c(1,3))
boxplot(tabela1$Densidade, col="blue", main="Box Plot",
ylab= "Densidade (g/cm³)", adj=0.5, ylim= c(400,1200))
boxplot(tabela1$Resistencia, col="purple",main="Box Plot",
ylab= "Resistência (MPa)", adj=0.5, ylim= c(30,100))
boxplot(tabela1$Rigidez,col="green2",main="Box Plot", ylab= "Rigidez (MPa)",
adj=0.5, ylim= c(1000,30000)) chart.Correlation(tabela1, histogram =TRUE)# Ajuste do modelo
modelo1<-lm(formula =Densidade~Resistencia+Rigidez,
data=tabela1); modelo1##
## Call:
## lm(formula = Densidade ~ Resistencia + Rigidez, data = tabela1)
##
## Coefficients:
## (Intercept) Resistencia Rigidez
## 164.91421 4.26645 0.02674
# Estatísticas das estimativas dos paramentros do modelo
summary(modelo1)##
## Call:
## lm(formula = Densidade ~ Resistencia + Rigidez, data = tabela1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -166.60 -84.37 -22.51 75.49 231.38
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.649e+02 5.712e+01 2.887 0.00586 **
## Resistencia 4.266e+00 1.809e+00 2.359 0.02253 *
## Rigidez 2.675e-02 7.716e-03 3.466 0.00114 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 99.55 on 47 degrees of freedom
## Multiple R-squared: 0.756, Adjusted R-squared: 0.7456
## F-statistic: 72.8 on 2 and 47 DF, p-value: 4.022e-15
# Anova da regressão do modelo
anova(modelo1)## Analysis of Variance Table
##
## Response: Densidade
## Df Sum Sq Mean Sq F value Pr(>F)
## Resistencia 1 1323934 1323934 133.593 2.442e-15 ***
## Rigidez 1 119063 119063 12.014 0.001139 **
## Residuals 47 465778 9910
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Densidade_est<-predict.lm(modelo1)
newdata1 = data.frame(tabela1, Densidade_est)
Res<-(((newdata1$Densidade-newdata1$Densidade_est)/(newdata1$Densidade))*100)
newdata1 = data.frame(tabela1, Densidade_est,Res)
resid<-(newdata1$Densidade-newdata1$Densidade_est)
Res2<-resid^2
SQResiduo<- sum(Res2)
SQTotal<-var(newdata1$Densidade)*((length(newdata1$Densidade))-1)
R2<-(1-(SQResiduo/SQTotal))
a<-(length(newdata1$Densidade)-1)/(length(newdata1$Densidade)-2)
R2adj<-(1-(a*(1-R2)))
Syx<-sqrt(SQResiduo/((length(newdata1$Densidade))-2))
Syx_Porc<-(Syx/(mean(newdata1$Densidade)))*100
R2<-round(R2, 2)
R2adj<-round(R2adj,2)
Syx<-round(Syx,2)
Syx_Porc<-round(Syx_Porc, 2)
newdata11 = data.frame(R2,R2adj,Syx,Syx_Porc)
# Criar da Tabela Descritiva
knitr::kable(newdata11, align = 'cc',
caption = "Medidas de Precisão do Modelo",
col.names = c("R$^{2}$", "R$_{adj}^{2}$", "S$_{yx}$", "S$_{yx}$%")) %>%
kable_classic(full_width = F, html_font = "Times", font_size = 16)| R\(^{2}\) | R\(_{adj}^{2}\) | S\(_{yx}\) | S\(_{yx}\)% |
|---|---|---|---|
| 0.76 | 0.75 | 98.51 | 11.98 |
newdatas<-data.frame(Resistencia= c(50),Rigidez= c(12876))
Densidade_estimado1 = predict(modelo1, newdatas, interval = "confidence");
Densidade_estimado1 # Valores do limite de confiança dos valores preditos## fit lwr upr
## 1 722.5998 689.0572 756.1425
NORMALIDADE:
Ho: resíduos seguem distribuição normal;
Hi: resíduos não seguem distribuição normal
Resultado:
Valor de p > 0.05, não rejeita Ho para alfa=5%.
## Normalidade dos Resíduos
shapiro.test(modelo1$residuals)##
## Shapiro-Wilk normality test
##
## data: modelo1$residuals
## W = 0.96394, p-value = 0.13
ks.test(modelo1$residuals, "pnorm")##
## Exact one-sample Kolmogorov-Smirnov test
##
## data: modelo1$residuals
## D = 0.54, p-value = 3.642e-14
## alternative hypothesis: two-sided
INDEPENDÊNCIA DOS RESÍDUOS:
Ho: resíduos são independentes;
Hi: resíduos não são independentes
Resultado:
Valor de p > 0.05, não rejeita Ho para alfa=5%.
## Independencia dos Resíduos (Durbin-Watson)
durbinWatsonTest(modelo1)## lag Autocorrelation D-W Statistic p-value
## 1 0.1013323 1.785325 0.388
## Alternative hypothesis: rho != 0
HOMOSCEDASTICIDADE DOS RESÍDUOS:
Ho: resíduos são homogênios;
Hi: resíduos não são homogênios;
Resultado:
Valor de p > 0.05, não rejeita Ho para alfa=5%.
## Homocedasticidade (Breusch-Pagan)
bptest(modelo1)##
## studentized Breusch-Pagan test
##
## data: modelo1
## BP = 1.6976, df = 2, p-value = 0.4279
ncvTest(modelo1)## Non-constant Variance Score Test
## Variance formula: ~ fitted.values
## Chisquare = 0.9172137, Df = 1, p = 0.33821
Valores em vermelho estimados; valores em azul observados.
G1<-ggplot(newdata1) +
geom_point(size=2, aes(x=Densidade, y=Densidade_est), color="red2")+
geom_abline(intercept = 0, slope = 1, color = "black")+
geom_point(size=2, aes(x=Densidade_est, y=Densidade), color="blue2")+
theme_classic()+ # aparencia clean do gráfico
labs(x = "Densidade Observada (g/cm³)",
y = "Densidade Estimada (g/cm³)",
title = "Gráfico 1:1")+ # legendas
theme( plot.title = element_text(hjust = 0.5),
legend.title = element_text(hjust = 0.5))+ # centralizar títulos
theme(plot.title = element_text(size = 13, face = "bold"),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10)) # negrito nos títulos
G2<-ggplot(newdata1) +
geom_point(size=2, aes(x=Densidade, y=Res)
,color="black")+ # gráfico de pontos
theme_classic()+ # aparencia clean do gráfico
labs(x = "Densidade Observada (g/cm³)",
y = "Resíduo (%)",
title = "Gráfico de Resíduos")+ # legendas
scale_x_continuous(breaks = seq(450, 1250, 250), limits= c(450,1250)) + # eixo x
scale_y_continuous(breaks = seq(-30, 30, 10), limits= c(-30,30)) + # eixo y
theme( plot.title = element_text(hjust = 0.5),
legend.title = element_text(hjust = 0.5))+ # centralizar títulos
theme(plot.title = element_text(size = 13, face = "bold"),
axis.title = element_text(size = 12),
axis.text = element_text(size = 10))+
# negrito nos títulos
geom_hline(yintercept = 0, color="black")+ # linha no 0 do eixo y
theme(axis.title.y = element_text(angle = 90))
grid.arrange(G1,G2, ncol=1) graph<-scatterplot3d(tabela1$Densidade~tabela1$Resistencia+tabela1$Rigidez,
pch=16, angle=45,color="blue", box=FALSE,
xlab="Resistência (MPa)", ylab="Rigidez (Mpa)", zlab = "Densidade (g/cm³)")
# previsão do modelo: Quando o modelo é apropriado todos os pontos ficam dentro
#do plano.
graph$plane3d(modelo1, col="black", draw_polygon=TRUE) De acordo com GROLEMUND (2018), a ciência de dados é uma área em crescimento.
A regressão não linear geralmente possui parâmetros interpretáveis (ROSSE; VENCOVSKY, 2000). Para CHEN et al. (2021), a análise multivariada é a melhor opção.