Aquí tienes una tabla de contenido con una breve explicación para cada paso de la tarea:
shapiro.test() o
ks.test() para evaluar la normalidad de las variables en el
dataset.chart.Correlation() del paquete
PerformanceAnalytics para realizar un análisis completo de correlación
entre las variables del dataset.dwtest() del paquete lmtest
para realizar pruebas de autocorrelación en los residuos de los modelos
de regresión.nls() en R y la función curve_fit() del
paquete scipy en Python.lm() en R.stepAIC() del paquete MASS para
realizar la selección automática de variables en modelos de regresión
lineal múltiple.Esta tabla de contenido proporciona una guía estructurada para la tarea, detallando cada paso y la acción a realizar en cada sección.
Aplicar técnicas de análisis de datos, pruebas de correlación, regresiones y visualización para evaluar la relación entre variables en el dataset [Nombre del Dataset].
options(warn = -1)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(PerformanceAnalytics)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
##
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
##
##
## ######################### Warning from 'xts' package ##########################
## # #
## # The dplyr lag() function breaks how base R's lag() function is supposed to #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or #
## # source() into this session won't work correctly. #
## # #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop #
## # dplyr from breaking base R's lag() function. #
## # #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning. #
## # #
## ###############################################################################
##
## Attaching package: 'xts'
##
## The following objects are masked from 'package:dplyr':
##
## first, last
##
##
## Attaching package: 'PerformanceAnalytics'
##
## The following object is masked from 'package:graphics':
##
## legend
library(lmtest)
El marco de datos de Boston tiene 506 filas y 14 columnas. dis: media ponderada de distancias a cinco centros de empleo de Boston.
La función str() en R se utiliza para mostrar la
estructura interna de un objeto de datos de una manera compacta y
legible. Esta función es muy útil para obtener una visión rápida del
tipo de datos, la dimensión y el contenido de un objeto, especialmente
cuando se trabaja con estructuras de datos complejas como data frames,
listas y matrices.
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
str(Boston)
## 'data.frame': 506 obs. of 14 variables:
## $ crim : num 0.00632 0.02731 0.02729 0.03237 0.06905 ...
## $ zn : num 18 0 0 0 0 0 12.5 12.5 12.5 12.5 ...
## $ indus : num 2.31 7.07 7.07 2.18 2.18 2.18 7.87 7.87 7.87 7.87 ...
## $ chas : int 0 0 0 0 0 0 0 0 0 0 ...
## $ nox : num 0.538 0.469 0.469 0.458 0.458 0.458 0.524 0.524 0.524 0.524 ...
## $ rm : num 6.58 6.42 7.18 7 7.15 ...
## $ age : num 65.2 78.9 61.1 45.8 54.2 58.7 66.6 96.1 100 85.9 ...
## $ dis : num 4.09 4.97 4.97 6.06 6.06 ...
## $ rad : int 1 2 2 3 3 3 5 5 5 5 ...
## $ tax : num 296 242 242 222 222 222 311 311 311 311 ...
## $ ptratio: num 15.3 17.8 17.8 18.7 18.7 18.7 15.2 15.2 15.2 15.2 ...
## $ black : num 397 397 393 395 397 ...
## $ lstat : num 4.98 9.14 4.03 2.94 5.33 ...
## $ medv : num 24 21.6 34.7 33.4 36.2 28.7 22.9 27.1 16.5 18.9 ...
Boston[ ,c("rad", "tax", "ptratio", "lstat", "medv", "dis")]
se utilizó el test de “Kolmogorov-Smirnov” para evaluar la normalidad de las variables. El test de “Kolmogorov-Smirnov” es una prueba estadística no paramétrica adecuada para muestras grandes (generalmente más de 50 observaciones). Esta prueba compara la función de distribución acumulativa de una muestra de datos con la función de distribución acumulativa de una distribución teórica específica, como la distribución normal.
Ho: SI ES Normal Ha: NO ES Normal
# Espacio para el código de verificación de normalidad}
ks.test(Boston$rad, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: Boston$rad
## D = 0.93772, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(Boston$tax, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: Boston$tax
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(Boston$ptratio, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: Boston$ptratio
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(Boston$lstat, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: Boston$lstat
## D = 0.99004, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(Boston$dis, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: Boston$dis
## D = 0.89213, p-value < 2.2e-16
## alternative hypothesis: two-sided
ks.test(Boston$medv, "pnorm")
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: Boston$medv
## D = 1, p-value < 2.2e-16
## alternative hypothesis: two-sided
Si hay normalidad, usar las pruebas de correlación con el test de
pearson, si falla la normalidad usar el test de spearman. Utilice la
función chart.Correlation() del paquete PerformanceAnalytics. El
siguiente es un ejemplo de cómo usar la función con el test de spearman:
chart.Correlation(Boston, method = "spearman"). Si no se
especifica el method, la prueba es de pearson y supone normalidad.
Puede utilizar visualizaciones y pruebas para pares de variables
utilizando la función with().
se utilizó el método de correlación de Spearman para evaluar las relaciones entre las variables. Este método es adecuado cuando las variables no siguen una distribución normal, como fue identificado previamente con el test de Kolmogorov-Smirnov.
# Espacio para el código de pruebas de correlación (Pearson, Spearman o Kendall)
# Configurar la supresión de warnings
options(warn=-1)
library(PerformanceAnalytics)
chart.Correlation(Boston)
chart.Correlation(
R = Boston[,c("rad", "tax", "ptratio", "lstat", "medv", "dis")],
histogram = TRUE,
method = "spearman"
)
Realice regresiones lineales simples y luego verifique la
autocorrelación de los residuos con el test de Durbin-Watson, con la
función dwtest() del paquete lmtest.
Estadístico Durbin-Watson – Es una medida de la correlación serial en los residuos. Si los residuos varían aleatoriamente, éste valor puede ser cercano a 2. Un pequeño P-Value indica una tendencia no aleatoria en los residuos. Para unos datos que corren sobre el tiempo, un pequeño P-value podría indicar que alguna tendencia en el tiempo no ha sido tomada en cuenta. Para datos registrados en el tiempo, un valor-P pequeño podría indicar que alguna tendencia en el tiempo no ha sido explicada. (Statgraphics).
Si falla la No Autocorrelación, proceda a realizar regresión
no lineal con la función nls() y decida cual
modelo no lineal que considere de acuerdo a la visualización de R.
Funciones no Lineales mas Comunes
lm().# Espacio para el código de regresiones lineales y prueba de autocorrelación
modelo1 <- lm(dis ~ rad, data = Boston)
summary(modelo1)
##
## Call:
## lm(formula = dis ~ rad, data = Boston)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.0194 -1.2028 -0.2158 0.9328 7.7873
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.937229 0.120937 40.83 <2e-16 ***
## rad -0.119608 0.009362 -12.78 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.832 on 504 degrees of freedom
## Multiple R-squared: 0.2446, Adjusted R-squared: 0.2431
## F-statistic: 163.2 on 1 and 504 DF, p-value: < 2.2e-16
plot(Boston$rad, Boston$dis)
abline(modelo1)
library(ggplot2)
ggplot(
data = Boston,
mapping = aes(x=rad, y=dis)
) +
geom_point() +
geom_smooth(method = "lm")
## `geom_smooth()` using formula = 'y ~ x'
library(ggplot2)
ggplot(
data = Boston,
mapping = aes(x=rad, y=dis)
) +
geom_point() +
geom_smooth()
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Estadístico Durbin-Watson El estadístico de Durbin-Watson es una medida utilizada en la estadística y la econometría para detectar la presencia de autocorrelación en los residuos de una regresión lineal. La autocorrelación indica que los errores (residuos) en un modelo de regresión no son independientes entre sí, lo que puede invalidar las inferencias estadísticas realizadas a partir del modelo.
library(lmtest)
dwtest(modelo1)
##
## Durbin-Watson test
##
## data: modelo1
## DW = 0.10853, p-value < 2.2e-16
## alternative hypothesis: true autocorrelation is greater than 0
nls()modelo2 <- nls(dis ~ a * exp(b*rad), data = Boston, start = list(a = 0.1, b = 0.1))
summary(modelo2)
##
## Formula: dis ~ a * exp(b * rad)
##
## Parameters:
## Estimate Std. Error t value Pr(>|t|)
## a 5.194532 0.156502 33.191 <2e-16 ***
## b -0.037898 0.003838 -9.874 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.832 on 504 degrees of freedom
##
## Number of iterations to convergence: 7
## Achieved convergence tolerance: 2.224e-06
dis_estimado <- predict(modelo2)
library(ggplot2)
ggplot(
data = Boston,
mapping = aes(x = rad, y = dis)
) +
geom_point() +
geom_smooth() +
geom_line(aes(x = rad, y = dis_estimado))
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
library(MASS)
write.csv(x = Boston[,c ("rad", "tax", "ptratio", "lstat", "medv", "dis")],file = "Boston.csv")
La función curve_fit() se utiliza para ajustar una función modelo a datos experimentales, lo que implica encontrar los parámetros óptimos de la función que minimizan la diferencia entre los datos reales y los valores predichos por el modelo. Esto es especialmente útil en regresiones no lineales, donde la relación entre las variables no puede expresarse de manera lineal.
Pueden consultar el notebook: Regresión no Lineal.ipynb.
Se deberán instalar lo siguiente: 1. El paquete de R llamado “reticulate” 2. Todos los módulos de Python que se usen, se deben instalar en la Terminal 3. por ejemplo: matplotlib: lanzando: pip install matplotlib
Inserte a continuación un fragmento de código de Python y espere que Posit Cloud reacciones para instalar los requerimientos. A continuación se transcribe el código de Python del documento RMarkdown “2_Regresión Lineal y no Lineal”:
El código en Python es el siguiente:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
import os
os.getcwd()
## '/cloud/project'
Boston = pd.read_csv("/cloud/project/Boston.csv")
Boston.info()
## <class 'pandas.core.frame.DataFrame'>
## RangeIndex: 506 entries, 0 to 505
## Data columns (total 7 columns):
## # Column Non-Null Count Dtype
## --- ------ -------------- -----
## 0 Unnamed: 0 506 non-null int64
## 1 rad 506 non-null int64
## 2 tax 506 non-null int64
## 3 ptratio 506 non-null float64
## 4 lstat 506 non-null float64
## 5 medv 506 non-null float64
## 6 dis 506 non-null float64
## dtypes: float64(4), int64(3)
## memory usage: 27.8 KB
Boston["rad"]
## 0 1
## 1 2
## 2 2
## 3 3
## 4 3
## ..
## 501 1
## 502 1
## 503 1
## 504 1
## 505 1
## Name: rad, Length: 506, dtype: int64
Boston["dis"]
## 0 4.0900
## 1 4.9671
## 2 4.9671
## 3 6.0622
## 4 6.0622
## ...
## 501 2.4786
## 502 2.2875
## 503 2.1675
## 504 2.3889
## 505 2.5050
## Name: dis, Length: 506, dtype: float64
def f(x, a, b):
return a*np.exp(b*(x))
x = Boston["rad"]
y = Boston["dis"]
res,cov = curve_fit(f,x,y)
# res son los coeficientes a y b
print(res)
## [ 5.19452461 -0.03789824]
print(cov)
## [[ 2.44927753e-02 -4.36543372e-04]
## [-4.36543372e-04 1.47311554e-05]]
# xx = np.linspace(8,40,50)
# fig,axes=plt.subplots()
# axes.scatter(x,y)
#
# axes.plot(xx,f(xx,5.19452461,-0.03789824))
Utilice ggplot() del paquete ggplot2, de acuerdo al capítulo 1: 1 Data visualization
# Espacio para el código de visualización de resultados y posibles fallas
library(ggplot2)
ggplot(
data = Boston,
mapping = aes(x = rad, y = dis)
) +
geom_point(colour = "orange") +
geom_smooth(colour = "green")
## `geom_smooth()` using method = 'loess' and formula = 'y ~ x'
La Regresión Lineal Múltiple es una técnica estadística utilizada para modelar la relación entre una variable de respuesta (también llamada variable dependiente) y dos o más variables predictoras (variables independientes). A diferencia de la Regresión Lineal Simple, que utiliza una sola variable predictora, la Regresión Lineal Múltiple permite analizar cómo múltiples variables predictoras afectan a la variable de respuesta.
# Espacio para el código de Regresión Lineal Múltiple Manual
library(MASS)
# Boston[,c ("rad", "tax", "ptratio", "lstat", "medv", "dis")]
modelo3 <- lm(dis ~ ., data = Boston)
summary(modelo3)
##
## Call:
## lm(formula = dis ~ ., data = Boston)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.5462 -0.6364 -0.0463 0.5347 4.3103
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 10.6670771 1.0442339 10.215 < 2e-16 ***
## crim -0.0246488 0.0070367 -3.503 0.000502 ***
## zn 0.0280890 0.0026948 10.424 < 2e-16 ***
## indus -0.0571758 0.0129331 -4.421 1.21e-05 ***
## chas 0.1209801 0.1864785 0.649 0.516795
## nox -6.0641064 0.7909332 -7.667 9.48e-14 ***
## rm 0.0066286 0.0968849 0.068 0.945481
## age -0.0173148 0.0027228 -6.359 4.64e-10 ***
## rad 0.0160172 0.0145126 1.104 0.270271
## tax -0.0005065 0.0008148 -0.622 0.534469
## ptratio -0.0093794 0.0295223 -0.318 0.750843
## black 0.0003656 0.0005827 0.627 0.530708
## lstat -0.0268033 0.0119385 -2.245 0.025203 *
## medv -0.0678417 0.0091703 -7.398 6.01e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.017 on 492 degrees of freedom
## Multiple R-squared: 0.7725, Adjusted R-squared: 0.7665
## F-statistic: 128.5 on 13 and 492 DF, p-value: < 2.2e-16
modelo4 <- lm(dis ~ .,data = Boston[,c ("rad", "tax", "ptratio", "lstat", "medv", "dis")])
summary(modelo4)
##
## Call:
## lm(formula = dis ~ ., data = Boston[, c("rad", "tax", "ptratio",
## "lstat", "medv", "dis")])
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.4114 -1.1107 -0.1508 0.7119 6.4946
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.964804 1.036555 9.613 < 2e-16 ***
## rad 0.006332 0.020997 0.302 0.763
## tax -0.005262 0.001114 -4.724 3.01e-06 ***
## ptratio -0.024946 0.042249 -0.590 0.555
## lstat -0.151704 0.016343 -9.283 < 2e-16 ***
## medv -0.075541 0.013015 -5.804 1.15e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.651 on 500 degrees of freedom
## Multiple R-squared: 0.3913, Adjusted R-squared: 0.3852
## F-statistic: 64.29 on 5 and 500 DF, p-value: < 2.2e-16
# Espacio para el código de Selección Automática de Variables con stepAIC()
library(MASS)
mejor_modelo <- stepAIC(modelo4)
## Start: AIC=513.37
## dis ~ rad + tax + ptratio + lstat + medv
##
## Df Sum of Sq RSS AIC
## - rad 1 0.248 1363.2 511.47
## - ptratio 1 0.950 1363.9 511.73
## <none> 1362.9 513.37
## - tax 1 60.834 1423.8 533.47
## - medv 1 91.824 1454.8 544.37
## - lstat 1 234.882 1597.8 591.83
##
## Step: AIC=511.47
## dis ~ tax + ptratio + lstat + medv
##
## Df Sum of Sq RSS AIC
## - ptratio 1 0.802 1364.0 509.76
## <none> 1363.2 511.47
## - medv 1 93.841 1457.0 543.15
## - tax 1 222.176 1585.4 585.87
## - lstat 1 235.834 1599.0 590.21
##
## Step: AIC=509.76
## dis ~ tax + lstat + medv
##
## Df Sum of Sq RSS AIC
## <none> 1364.0 509.76
## - medv 1 100.33 1464.3 543.68
## - lstat 1 235.65 1599.6 588.40
## - tax 1 255.23 1619.2 594.56
summary(mejor_modelo)
##
## Call:
## lm(formula = dis ~ tax + lstat + medv, data = Boston[, c("rad",
## "tax", "ptratio", "lstat", "medv", "dis")])
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.4605 -1.1355 -0.1807 0.7053 6.5336
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.3917578 0.4693187 20.011 < 2e-16 ***
## tax -0.0050628 0.0005224 -9.692 < 2e-16 ***
## lstat -0.1502321 0.0161318 -9.313 < 2e-16 ***
## medv -0.0722935 0.0118967 -6.077 2.43e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.648 on 502 degrees of freedom
## Multiple R-squared: 0.3909, Adjusted R-squared: 0.3872
## F-statistic: 107.4 on 3 and 502 DF, p-value: < 2.2e-16
En este análisis del dataset Boston, se realizaron diversos procedimientos estadísticos para comprender mejor las relaciones entre las variables y ajustar modelos de regresión tanto lineales como no lineales. A continuación se presentan las principales conclusiones obtenidas:
rad, tax,
ptratio, lstat, medv,
dis) sigue una distribución normal. Este hallazgo justifica
el uso de métodos no paramétricos en el análisis de correlación.dis y rad, y se realizaron pruebas de
autocorrelación en los residuos utilizando el test de Durbin-Watson. Los
resultados indicaron que había autocorrelación en los residuos,
sugiriendo que los modelos lineales simples no capturaban completamente
la relación entre las variables.nls()
en R y curve_fit() en Python para ajustar un modelo
exponencial a los datos, lo que proporcionó un mejor ajuste para la
relación entre dis y rad.dis. Se utilizaron tanto
métodos manuales como automáticos (con stepAIC()) para
seleccionar el mejor modelo. El modelo resultante ayudó a identificar
las variables más importantes y relevantes para predecir
dis.En resumen, el análisis reveló que las relaciones entre las variables del dataset Boston son complejas y no pueden ser capturadas completamente por modelos lineales simples. Los modelos no lineales y la regresión lineal múltiple proporcionaron una mejor comprensión y predicción de las variables de interés, destacando la importancia de considerar múltiples enfoques y técnicas en el análisis de datos.