Introducción

En el siguiente informe se va a estudiar el análisis de datos a la información extraída del archivo test_linnear_regression.csv. teniendo en cuenta esto para este propósito, procederemos a emplear herramientas o métodos gráficos como gráficas de dispersión, diagramas de caja y bigote, gráficas de tendencia real vs predicción, gráficas de residuos vs ajustes, gráficos Q-Q normal, gráficas de escala-ubicación, etc. Todos estos métodos mencionados anteriormente, nos ayudarán a apreciar la información con una mayor claridad, facilitar su comprensión y concluir de manera precisa.

library(readr)

El análisis exploratorio de datos o “AED” es un primer paso crítico en el análisis de los datos de un experimento. Estas son algunas de las principales razones por las que se usa AED:

Detección de errores, verificación de supuestos, selección preliminar de modelos apropiados, determinar las relaciones entre las variables explicativas, y evaluar la dirección y el tamaño aproximado de las relaciones entre explicaciones y variables de resultado.

################# Análisis Exploratorio de Datos (AED) ###############

############ Carga y limpieza de datos 
# Leer archivos separados por comas en la memoria


#Con ayuda del comando "file.choose" se busca la dirección del archivo a utilizar para los datos, en este caso en formato .csv nombrado "test_linear_regression"

data <- read.csv("C:\\Users\\Jose Daniel\\Downloads\\test_linear_regression.csv")

Análisis de variables

Exploración de los datos

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.

"dim"(data)
## [1] 300   2
"str"(data)
## 'data.frame':    300 obs. of  2 variables:
##  $ x: int  77 21 22 20 36 15 62 95 20 5 ...
##  $ y: num  79.8 23.2 25.6 17.9 41.8 ...
"summary"(data)
##        x                y          
##  Min.   :  0.00   Min.   : -3.468  
##  1st Qu.: 27.00   1st Qu.: 25.677  
##  Median : 53.00   Median : 52.171  
##  Mean   : 50.94   Mean   : 51.205  
##  3rd Qu.: 73.00   3rd Qu.: 74.303  
##  Max.   :100.00   Max.   :105.592
head(data)
##    x         y
## 1 77 79.775152
## 2 21 23.177279
## 3 22 25.609262
## 4 20 17.857388
## 5 36 41.849864
## 6 15  9.805235
############ Control de calidad de datos - Comprobación de valores nulos
sapply(data, function(x)(sum(is.na(x))))
## x y 
## 0 0

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.

###### Gráfica básica de dispersión
library(ggplot2)
ggplot(data, aes(x=x, y=y)) + geom_point(color='darkblue')

##### Diagrama de caja y bigote - Buscar valores atípicos

par(mfrow=c(1, 2)) #Divide el área gráfica en 2 columnas
boxplot(data$x, main="X", sub=paste("Outlier rows: ", boxplot.stats(data$s)$out))  # Diagrama de caja y bigote para la 'velocidad'
boxplot(data$y, main="Y", sub=paste("Outlier rows: ", boxplot.stats(data$y)$out))  # Diagrama de caja y bigote para 'distancia'

Modelo de regresión

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.

Matriz de correlació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 correlación

library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 4.1.3
cor(data[,c("x","y")], use="complete")
##           x         y
## x 1.0000000 0.9945453
## y 0.9945453 1.0000000
###### Crear datos de entrenamiento y prueba
set.seed(100) #Establecimeinto de semillas para reproducir los resultados del muestreo aleatorio
trainingRowIndex <- sample(1:nrow(data), 0.8*nrow(data)) #Índices de filas para datos de entrenamiento
training <- data[trainingRowIndex, ] #Datos de entrenamiento del modelo
test  <- data[-trainingRowIndex, ]# Datos de prueba
dim(training)
## [1] 240   2
dim(test)
## [1] 60  2

Modelo lineal

Los modelos lineales describen una variable de respuesta continua como una función de una o más variables predictoras. Pueden ayudarlo a comprender y predecir el comportamiento de sistemas complejos o analizar datos experimentales, financieros y biológicos.

#Realizar Modelo Lineal
Model1 <- lm(y~x, data=training)
summary(Model1)
## 
## Call:
## lm(formula = y ~ x, data = training)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -10.7494  -1.9605  -0.2619   1.9625   7.8877 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -0.371984   0.392800  -0.947    0.345    
## x            1.014567   0.006651 152.543   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.983 on 238 degrees of freedom
## Multiple R-squared:  0.9899, Adjusted R-squared:  0.9898 
## F-statistic: 2.327e+04 on 1 and 238 DF,  p-value: < 2.2e-16
##### Línea de ajuste del modelo
ggplot()+geom_point(aes(x=training$x,y=training$y),colour='blue')+
  geom_line(aes(x=training$x,y=predict(Model1,newdata=training)),
            colour='black')+
  ggtitle('X vs Y(Training set)')+
  xlab('X')+
  ylab('Y')

AIC(Model1) ##AIC
## [1] 1209.711
BIC(Model1) ##BIC
## [1] 1220.153
#########################Predicción sobre datos de prueba #########################
ypred <- predict(Model1, test)

Precisión de la predicción y Tasas de error

Tasa de error: qué porcentaje de nuestra predicción es incorrecta.

Precisión: qué porcentaje de nuestras predicciones son correctas.

#########Cálculo de la precisión de la predicción y las tasas de error
actuals_preds <- data.frame(cbind(actuals=test$y, predicteds=ypred)) #hacer marco de datos actuals_predicteds.
correlation_accuracy <- cor(actuals_preds)
correlation_accuracy
##             actuals predicteds
## actuals    1.000000   0.992782
## predicteds 0.992782   1.000000
head(actuals_preds)
##      actuals predicteds
## 6   9.805235  14.846527
## 10  8.746748   4.700853
## 17 66.958069  65.574895
## 18 16.635080  13.831959
## 21 92.119063  89.924512
## 22 46.913877  51.370952

Gráfica real vs predicción

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.

#Gráfica real vs predicción
ggplot(test, aes(x = x, y = y)) +
  geom_segment(aes(xend = x, yend = ypred)) +
  geom_point(color='blue') +
  geom_point(aes(y = ypred), shape = 1)

######### Calcular la precisión Min Max y MAPE
min_max_accuracy <- mean(apply(actuals_preds, 1, min) / apply(actuals_preds, 1, max))
min_max_accuracy*100
## [1] 79.94807
mape <- mean(abs((actuals_preds$predicteds - actuals_preds$actuals))/actuals_preds$actuals)  
mape*100
## [1] 3.538944

Diagnóstico de regresión lineal

Las gráficas utilizadas son:

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.

### 1. La media de los residuos es 0.
mean(Model1$residuals)
## [1] 8.303441e-17
### 2. Normalidad de los residuos
par(mfrow=c(2,2))
plot(Model1)

### 3.Pruebas estadísticas de heterocedasticidad - Prueba de Breusch-Pagan
lmtest::bptest(Model1) # Breusch-Pagan test
## 
##  studentized Breusch-Pagan test
## 
## data:  Model1
## BP = 0.045773, df = 1, p-value = 0.8306
### NCV test
car::ncvTest(Model1)
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 0.05178837, Df = 1, p = 0.81998
### 4. No autocorrelación de residuos 

## Prueba de Durbin-Watson
lmtest::dwtest(Model1)
## 
##  Durbin-Watson test
## 
## data:  Model1
## DW = 2.034, p-value = 0.6047
## alternative hypothesis: true autocorrelation is greater than 0
######## Comprobar supuestos automáticamente
library(gvlma)
par(mfrow=c(2,2))  # Dibujar 4 gráficas en la misma ventana
gvlma::gvlma(Model1)
## 
## Call:
## lm(formula = y ~ x, data = training)
## 
## Coefficients:
## (Intercept)            x  
##      -0.372        1.015  
## 
## 
## 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        1.202531  0.8777 Assumptions acceptable.
## Skewness           0.296360  0.5862 Assumptions acceptable.
## Kurtosis           0.690827  0.4059 Assumptions acceptable.
## Link Function      0.205615  0.6502 Assumptions acceptable.
## Heteroscedasticity 0.009729  0.9214 Assumptions acceptable.

Conclusión:

El modelo predictivo de Krushna Agulla obtuvo un puntaje de 98.9