En el siguiente informe se va a estudiar el análisis de datos a la información extraída del archivo T3312.xlsx teniendo en cuenta esto, usamos herramientas como gráficas de dispersión, etc. Estas graficas nos ayudarán a entender la información con una mayor claridad, facilitar su comprensión y concluir de una manera más precisa.
library(readr)
El objetivo del momento de exploración de los datos es familiarizarnos con la estructura de los datos, y transformarlos para poder realizar nuestros análisis. Por lo general, aquí se empiezan a decidir las tareas de limpieza.
Lo primero que vamos a hacer es ver el tamaño de la tabla con dim(), y los primeros registros con head().
Esto nos va a permitir saber:
la cantidad de registros y columnas; los nombres de las columnas y su tipo de dato; el contenido de los primeros registros.
data <- read_delim("T3312.csv", delim = ";",
escape_double = FALSE, trim_ws = TRUE)
## Rows: 200 Columns: 10
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ";"
## chr (2): EXT, ESFUERZO
## dbl (2): TESTNUM, POINTNUM
## num (3): TIME, POSIT, FORCE
## lgl (3): CH6, CH7, CH8
##
## ℹ 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.
head(data)
## # A tibble: 6 × 10
## TESTNUM POINTNUM TIME POSIT FORCE EXT ESFUERZO CH6 CH7 CH8
## <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr> <lgl> <lgl> <lgl>
## 1 3312 1 14605 2413812876 1008229637 -28,5… 0,07515… NA NA NA
## 2 3312 2 14742 242905283 1021120739 0,001… 0,06927… NA NA NA
## 3 3312 3 14841 2440431833 1030956459 0,002… 0,06993… NA NA NA
## 4 3312 4 14941 2457500935 1040792084 0,003… 0,07060… NA NA NA
## 5 3312 5 15141 2470708847 1053683186 0,004… 0,07147… NA NA NA
## 6 3312 6 15241 250078249 1076887131 0,006… 0,07305… NA NA NA
data <- data[, !names(data) %in% c("TESTNUM", "POINTNUM" , "POSIT" , "EXT" , "FORCE")]
dim(data)
## [1] 200 5
data$ESFUERZO <- gsub(",", ".", data$ESFUERZO)
data$ESFUERZO <- as.numeric(data$ESFUERZO)
str(data)
## tibble [200 × 5] (S3: tbl_df/tbl/data.frame)
## $ TIME : num [1:200] 14605 14742 14841 14941 15141 ...
## $ ESFUERZO: num [1:200] 0.0752 0.0693 0.0699 0.0706 0.0715 ...
## $ CH6 : logi [1:200] NA NA NA NA NA NA ...
## $ CH7 : logi [1:200] NA NA NA NA NA NA ...
## $ CH8 : logi [1:200] NA NA NA NA NA NA ...
summary(data)
## TIME ESFUERZO CH6 CH7 CH8
## Min. : 1554 Min. :0.06927 Mode:logical Mode:logical Mode:logical
## 1st Qu.:17092 1st Qu.:0.11632 NA's:200 NA's:200 NA's:200
## Median :22892 Median :0.16839
## Mean :30725 Mean :0.15149
## 3rd Qu.:39117 3rd Qu.:0.18653
## Max. :77441 Max. :0.20187
head(data)
## # A tibble: 6 × 5
## TIME ESFUERZO CH6 CH7 CH8
## <dbl> <dbl> <lgl> <lgl> <lgl>
## 1 14605 0.0752 NA NA NA
## 2 14742 0.0693 NA NA NA
## 3 14841 0.0699 NA NA NA
## 4 14941 0.0706 NA NA NA
## 5 15141 0.0715 NA NA NA
## 6 15241 0.0731 NA NA NA
sapply(data, function(x)(sum(is.na(x))))
## TIME ESFUERZO CH6 CH7 CH8
## 0 0 200 200 200
En ggplot2 se inicia una gráfica con la instrucción “ggplot()”, debemos especificar explicitamente que base de datos usamos, este es el primer argumento en la función ggplot. Una vez que creamos la base añadimos capas, y dentro de aes() escribimos las variables que queremos graficar y el atributo de la gráfica al que queremos mapearlas. La función geom_point() añade una capa de puntos, hay muchas funciones geometrías incluídas en ggplot2: geom_line(), geom_boxplot(), geom_histogram,… Cada una acepta distintos argumentos para mapear las variables en los datos a características estéticas de la gráfica. En el ejemplo de arriba mapeamos displ al eje x, hwy al eje y, pero geom_point() nos permite representar más variables usando la forma, color y/o tamaño del punto.
#Linealidad
plot(ESFUERZO~TIME, data=data)
library(ggplot2)
ggplot(data, aes(x=TIME, y=ESFUERZO)) + geom_point(color='red')
par(mfrow = c(1, 2))
box_time <- boxplot(data$TIME, main = "TIME",
sub = paste("Outlier values:", paste(boxplot(data$TIME, plot = FALSE)$out, collapse = ", ")))
box_esfuerzo <- boxplot(data$ESFUERZO, main = "ESFUERZO",
sub = paste("Outlier values:", paste(boxplot(data$ESFUERZO, plot = FALSE)$out, collapse = ", ")))
Un modelo de regresión proporciona una función que describe la relación entre una o más variables independientes y una variable de respuesta, dependiente o objetivo. En este caso correspondiente a un modelo de regresión lineal y como sabemos una regresión lineal es un modelo donde la relación entre entradas y salidas es una línea recta. Este es el más fácil de conceptualizar e incluso observar en el mundo real. Incluso cuando una relación no es muy lineal, nuestros cerebros intentan ver el patrón y adjuntar un modelo lineal rudimentario a esa relación.
Una matriz de correlación es simplemente una tabla que muestra los coeficientes de correlación para diferentes variables. La matriz representa la correlación entre todos los posibles pares de valores en una tabla. Es una herramienta poderosa para resumir un gran conjunto de datos y para identificar y visualizar patrones en los datos dados.
#MATRIZ DE CORRELACION
library(ggcorrplot)
cor(data[,c("TIME","ESFUERZO")], use="complete")
## TIME ESFUERZO
## TIME 1.0000000 0.5335497
## ESFUERZO 0.5335497 1.0000000
#crear datos de entrenamiento y prueba
set.seed(80) #particion de datos de manera aleatoria para reproducibilidad del modelo
trainingRowIndex <- sample(1:nrow(data), 0.8*nrow(data))
training <- data[trainingRowIndex, ]
test <- data[-trainingRowIndex, ]
dim(training)
## [1] 160 5
dim(test)
## [1] 40 5
Modelo lineal
En este modelo líneal estaremos comparando como se comporta nuestra variable x (tiempo), frente a nuestra variable respuesta y (esfuerzo); de este modo, a medida que el tiempo aumenta, el esfuerzo de manera directamente proporcional tambien aumenta, teniendo en cuenta que el esfuerzo tiene un limite elastico antes de su respectiva fractura. Por lo tanto, la ecuación que representa el modelo es: y= (9.789e-07)x + 1.232e-01 .
De esta misma forma, el modelo puede predecir en un 29% aproximadamente con respecto al R-cuadrado.
#MODELO LINEAL
model1 <- lm(ESFUERZO~TIME, data=training)
summary(model1)
##
## Call:
## lm(formula = ESFUERZO ~ TIME, data = training)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.067777 -0.024444 0.000981 0.028479 0.073196
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.232e-01 4.769e-03 25.833 < 2e-16 ***
## TIME 9.789e-07 1.217e-07 8.041 1.96e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.03468 on 158 degrees of freedom
## Multiple R-squared: 0.2904, Adjusted R-squared: 0.2859
## F-statistic: 64.67 on 1 and 158 DF, p-value: 1.965e-13
graphics.off()
ggplot()+geom_point(aes(x=training$TIME,y=training$ESFUERZO),colour='purple')+
geom_line(aes(x=training$TIME,y=predict(model1,newdata=training)),
colour='black')+
ggtitle('TIME vs ESFUERZO(Training set)')+
xlab('TIME')+
ylab('ESFUERZO')
AIC(model1)
## [1] -617.6619
BIC(model1)
## [1] -608.4364
ypred <- predict(model1, test)
Tasa de error: qué porcentaje de nuestra predicción es incorrecta.
Precisión: qué porcentaje de nuestras predicciones son correctas.
#PRESICION DE LA PREDICCION Y TASAS DE ERROR
actuals_preds <- data.frame(cbind(actuals=test$ESFUERZO, predicteds=ypred))
correlation_accuracy <- cor(actuals_preds)
correlation_accuracy
## actuals predicteds
## actuals 1.0000000 0.4629766
## predicteds 0.4629766 1.0000000
head(actuals_preds)
## actuals predicteds
## 1 0.06927032 0.1376177
## 2 0.07790526 0.1386935
## 3 0.07881218 0.1387924
## 4 0.08057414 0.1389871
## 5 0.08579518 0.1394766
## 6 0.08844458 0.1397702
Las gráficas Real vs Predicción son una de las formas más ricas de visualización de datos. Puedes decir casi todo de él. Idealmente, todos sus puntos deberían estar cerca de una línea diagonal regresiva. Entonces, si el Actual es 5, su predicción debería estar razonablemente cerca de 5 a. Si el real es 30, su predicción también debería estar razonablemente cerca de 30. Entonces, simplemente dibuje una línea diagonal dentro de su gráfico y verifique dónde se encuentran los puntos.
#GRAFICA REAL VS PREDICCION
ggplot(test, aes(x = TIME, y= ESFUERZO))+
geom_segment(aes(xend = TIME, yend = ESFUERZO)) +
geom_point(color='orange') +
geom_point(aes(y = ypred), shape = 1)
#Calcular la presicion min, max
min_max_accuracy <- mean(apply(actuals_preds, 1, min) / apply(actuals_preds, 1, max))
min_max_accuracy*100
## [1] 80.86791
mape <- mean(abs((actuals_preds$predicteds - actuals_preds$actuals))/actuals_preds$actuals)
mape*100
## [1] 25.92878
Residuals vs Fitted: Es un diagrama de dispersión de residuos en el eje y y valores ajustados (respuestas estimadas) en el eje x . El gráfico se utiliza para detectar no linealidad, varianzas de error desiguales y valores atípicos. Teniendo en cuenta esto: Los residuos “rebotan aleatoriamente” alrededor de la línea 0. Esto sugiere que la suposición de que la relación es lineal es razonable. Los residuos forman aproximadamente una “banda horizontal” alrededor de la línea 0. Esto sugiere que las varianzas de los términos de error son iguales. Ningún residuo “destaca” del patrón aleatorio básico de residuos. Esto sugiere que no hay valores atípicos.
Normal Q-Q: Este tipo de gráfico Q-Q (“Q” viene de cuantil) es un método gráfico para el diagnóstico de diferencias entre la distribución de probabilidad de una población de la que se ha extraído una muestra aleatoria y una distribución usada para la comparación. Si los datos se distribuyen normalmente, los puntos caerán en la línea de referencia de 45 grados. Si los datos no se distribuyen normalmente, los puntos se desviarán de la línea de referencia.
Scale-Location: Este es un tipo de gráfica que muestra los valores ajustados de un modelo de regresión a lo largo del eje x y la raíz cuadrada de los residuos estandarizados a lo largo del eje y. Si la línea roja es aproximadamente horizontal a lo largo del gráfico, es probable que se satisfaga el supuesto de homocedasticidad para un modelo de regresión dado. Es decir, la dispersión de los residuos es aproximadamente igual en todos los valores ajustados y los residuos deben dispersarse aleatoriamente alrededor de la línea roja con una variabilidad aproximadamente igual en todos los valores ajustados.
Residuals vs Leverage: Esta tipo de gráfica nos permite identificar observaciones influyentes en un modelo de regresión. Cada observación del conjunto de datos se muestra como un único punto dentro de la gráfica. El eje x muestra el apalancamiento de cada punto y el eje y muestra el residual estandarizado de cada punto. El apalancamiento (Leverage) se refiere a la medida en que los coeficientes en el modelo de regresión cambiarían si se eliminara una observación particular del conjunto de datos y los residuos estandarizados se refieren a la diferencia estandarizada entre un valor predicho para una observación y el valor real de la observación.
Boxplot o caja y bigotes: El boxplot o diagrama de caja y bigotes es una herramienta gráfica que resume la distribución de un conjunto de datos mostrando la mediana, el rango intercuartílico (IQR) y posibles valores atípicos; si la mediana está centrada y los bigotes son simétricos, se sugiere una distribución equilibrada, y la ausencua de puntos fuera de los bigites indica que no hay vlores atípicos significativos.
#DIAGNÓSTICO DE REGRESION LINEAL
mean(model1$residuals)
## [1] -1.986345e-19
par(mfrow=c(2,2))
plot(model1)
lmtest::bptest(model1)
##
## studentized Breusch-Pagan test
##
## data: model1
## BP = 41.698, df = 1, p-value = 1.065e-10
car::ncvTest(model1)
## Non-constant Variance Score Test
## Variance formula: ~ fitted.values
## Chisquare = 27.60713, Df = 1, p = 1.4863e-07
lmtest::dwtest(model1)
##
## Durbin-Watson test
##
## data: model1
## DW = 1.9678, p-value = 0.4221
## alternative hypothesis: true autocorrelation is greater than 0
library(gvlma)
par(mfrow=c(2,2))
gvlma::gvlma(model1)
##
## Call:
## lm(formula = ESFUERZO ~ TIME, data = training)
##
## Coefficients:
## (Intercept) TIME
## 1.232e-01 9.789e-07
##
##
## ASSESSMENT OF THE LINEAR MODEL ASSUMPTIONS
## USING THE GLOBAL TEST ON 4 DEGREES-OF-FREEDOM:
## Level of Significance = 0.05
##
## Call:
## gvlma::gvlma(x = model1)
##
## Value p-value Decision
## Global Stat 8.43597 0.07685 Assumptions acceptable.
## Skewness 0.21100 0.64598 Assumptions acceptable.
## Kurtosis 3.04526 0.08097 Assumptions acceptable.
## Link Function 5.13645 0.02343 Assumptions NOT satisfied!
## Heteroscedasticity 0.04327 0.83523 Assumptions acceptable.
Para concluir, los modelos de regresión lineal son relativamente sencillos, ya que proporcionan una fórmula matemática fácil de interpretar que puede crear predicciones, estos modelos se utilizan en todo, desde ciencias biológicas, ambientales y sociales, hasta en los negocios. Los modelos de regresión lineal se han convertido en una forma comprobada de predecir el futuro de forma científica y confiable, pues como la regresión lineal es un procedimiento estadístico establecido hace mucho tiempo se conocen bien y puede aprenderse muy rápido.Por otro lado los datos presentados no pueden ser estudiados por modelo de regresión líneal sino que puede ser estudiado por otros modelos como el modelo de regresión exponencial o de regresión logarítmico debido a que como se evidencia en el modelo los datos no se pueden ajustar a este.