Importa los datos de la hoja Ejemplo1
de la hoja de
cálculo https://personales.unican.es/rasillad/docencia/G14/TEMA_3/ejercicios_regresion_2023.xlsx.
#if(!require("readxl")) install.packages("readxl")
library(readxl)
download.file("https://personales.unican.es/rasillad/docencia/G14/TEMA_3/ejercicios_regresion_2023.xlsx",
destfile = "regresion.xlsx",
mode="wb")
<- read_excel("regresion.xlsx", sheet = "Ejemplo1")
ejercicio1 ejercicio1
## # A tibble: 30 × 2
## x y
## <dbl> <dbl>
## 1 6.81 9.85
## 2 9.84 11.2
## 3 4.98 5.12
## 4 5 8.11
## 5 3.5 3.56
## 6 3.64 1.99
## 7 7.87 15.5
## 8 5.14 7.52
## 9 8.39 14.0
## 10 6.82 7.52
## # ℹ 20 more rows
Determina si existe una relación lineal entre las variables y si las variables cumplen con el supuesto de normalidad. La relación lineal podemos observarla mediante un gráfico
plot(ejercicio1$x, ejercicio1$x)
Una posibilidad para evaluar el supuesto de normalidad es aplicar el test de Shapiro-Wilks.
Hipótesis H0: La variable presenta una distribución normal -> cuando p-value es mayor que alpha = 0,05 -> No rechazar H0 (sigue una distribución normal).
Hipótesis H1: La variable presenta una distribución no normal -> cuando p-value es menor que alpha = 0,05 -> Rechazar H0 (la distribución no es normal)
shapiro.test(ejercicio1$x)
##
## Shapiro-Wilk normality test
##
## data: ejercicio1$x
## W = 0.95504, p-value = 0.2302
shapiro.test(ejercicio1$y)
##
## Shapiro-Wilk normality test
##
## data: ejercicio1$y
## W = 0.95114, p-value = 0.1814
De acuerdo con lo mencionado anteriormente, ambas variables presentan una distribución normal.
Calcula los coeficientes de correlación de Pearson y Spearman y determina si existe una relación estadísticamente significativa entre las variables.
cor.test(ejercicio1$x,ejercicio1$y)
##
## Pearson's product-moment correlation
##
## data: ejercicio1$x and ejercicio1$y
## t = 19.184, df = 28, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.9249788 0.9829075
## sample estimates:
## cor
## 0.9640025
El coeficiente de correlación de Pearson es 0.96. El p-value es 0.00000000000000022, inferior al nivel de significación de 0.05. Es significativa
cor.test(ejercicio1$x,ejercicio1$y, method = "spearman")
## Warning in cor.test.default(ejercicio1$x, ejercicio1$y, method = "spearman"):
## Cannot compute exact p-value with ties
##
## Spearman's rank correlation rho
##
## data: ejercicio1$x and ejercicio1$y
## S = 234.53, p-value = 1.969e-15
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## 0.9478251
El coeficiente de correlación de Spearman es 0.95. El p-value es 0.0000000000000001969, inferior al nivel de significación de 0.05. Es significativa.
Importa los datos de la hoja Ejemplo2
de la hoja de
cálculo https://personales.unican.es/rasillad/docencia/G14/TEMA_3/ejercicios_regresion_2023.xlsx.
A partir de ella:
<- read_excel("regresion.xlsx", sheet = "Ejemplo2")
ejercicio2 ejercicio2
## # A tibble: 25 × 3
## peso edad grasas
## <dbl> <dbl> <dbl>
## 1 84 46 354
## 2 73 20 190
## 3 65 52 405
## 4 70 30 263
## 5 76 57 451
## 6 69 25 302
## 7 63 28 288
## 8 72 36 385
## 9 79 57 402
## 10 75 44 365
## # ℹ 15 more rows
Elabora una matriz de correlaciones entre las diferentes variables.
round(cor(ejercicio2),2)
## peso edad grasas
## peso 1.00 0.24 0.27
## edad 0.24 1.00 0.84
## grasas 0.27 0.84 1.00
Exporta tanto la matriz de correlaciones como la matriz de p-values a Excel.
library("Hmisc")
##
## Attaching package: 'Hmisc'
## The following objects are masked from 'package:base':
##
## format.pval, units
<- rcorr(as.matrix(ejercicio2)) # devuelve los coeficientes de correlación y p-value de los pares de columnas.
matriz.corr.ejercicio2 $r matriz.corr.ejercicio2
## peso edad grasas
## peso 1.0000000 0.2400133 0.2652935
## edad 0.2400133 1.0000000 0.8373534
## grasas 0.2652935 0.8373534 1.0000000
$P matriz.corr.ejercicio2
## peso edad grasas
## peso NA 2.478378e-01 1.999585e-01
## edad 0.2478378 NA 1.794101e-07
## grasas 0.1999585 1.794101e-07 NA
Exportar la matriz de correlaciones
if(!require("xlsx")) install.packages("xlsx")
library(xlsx)
write.xlsx(matriz.corr.ejercicio2$r, # Data frame a ser exportado
file = "D:/resultados_ejercicio2", # Ruta completa
sheetName = "matriz_correlaciones", # Nombre de la hoja de Excel
col.names = TRUE, # Incluir los nombres de las columnas (TRUE) o no (FALSE)
row.names = TRUE, # Incluir los nombres de las filas (TRUE) o no (FALSE)
append = FALSE, # Agregar a un archivo existente (TRUE) o no (FALSE)
showNA = TRUE) # Si TRUE, los NA serán celdas vacías
Exportar la matriz de p-values
write.xlsx(matriz.corr.ejercicio2$P, # Data frame a ser exportado
file = "D:/resultados_ejercicio2", # Ruta completa
sheetName = "matriz_p_values", # Nombre de la hoja de Excel
col.names = TRUE, # Incluir los nombres de las columnas (TRUE) o no (FALSE)
row.names = TRUE, # Incluir los nombres de las filas (TRUE) o no (FALSE)
append = FALSE, # Agregar a un archivo existente (TRUE) o no (FALSE)
showNA = TRUE) # Si TRUE, los NA serán celdas vacías
Representa esa matriz gráficamente con un correlograma, utilizando para ello los números correspondientes a los coeficientes de correlación de Pearson.
library(corrplot)
## corrplot 0.92 loaded
corrplot(cor(ejercicio2), # Matriz de correlación que va a ser representada gráficamente
method = "number", # Simbología: “circle”, “square”, “ellipse”, “number”, “shade”, “color”, “pie”)
type = "upper", # Visualización. Muestra únicamente la diagonal (triángulo) superior de la matriz.
order = "hclust", # Reordena la matriz según el coeficiente de correlación.
tl.col = "black", # Color de las etiquetas
tl.srt = 45, # Ángulo de rotación de las etiquetas.
addCoef.col = "black", # Añade el valor del coeficiente de correlación
diag = FALSE)
Importa los datos de la hoja Ejemplo3
de la hoja de
cálculo https://personales.unican.es/rasillad/docencia/G14/TEMA_3/ejercicios_regresion_2023.xlsx.
A partir de ella:
<- read_excel("regresion.xlsx", sheet = "Ejemplo3")
ejercicio3 ejercicio3
## # A tibble: 30 × 6
## y1 y2 y3 y4 y5 y6
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 6.81 6.84 6.85 6.86 6.75 6.64
## 2 9.84 8.66 8.07 7.71 12.2 16.9
## 3 4.98 4.81 4.73 4.68 5.30 5.96
## 4 5.00 5.53 5.79 5.95 3.95 1.85
## 5 3.50 3.71 3.81 3.88 3.09 2.26
## 6 3.64 3.41 3.30 3.23 4.10 5.03
## 7 7.87 8.70 9.12 9.37 6.21 2.89
## 8 5.14 5.46 5.62 5.71 4.51 3.25
## 9 8.39 8.61 8.72 8.78 7.95 7.08
## 10 6.82 6.30 6.04 5.88 7.86 9.95
## # ℹ 20 more rows
Elabora una matriz de correlaciones entre las diferentes variables.
round(cor(ejercicio3),2)
## y1 y2 y3 y4 y5 y6
## y1 1.00 0.99 0.98 0.97 0.97 0.84
## y2 0.99 1.00 1.00 0.99 0.93 0.77
## y3 0.98 1.00 1.00 1.00 0.91 0.72
## y4 0.97 0.99 1.00 1.00 0.89 0.69
## y5 0.97 0.93 0.91 0.89 1.00 0.95
## y6 0.84 0.77 0.72 0.69 0.95 1.00
Exporta tanto la matriz de correlaciones como la matriz de p-values a Excel.
<- rcorr(as.matrix(ejercicio3)) # devuelve los coeficientes de correlación y p-value de los pares de columnas.
matriz.corr.ejercicio3 $r matriz.corr.ejercicio3
## y1 y2 y3 y4 y5 y6
## y1 1.0000000 0.9912975 0.9800280 0.9709934 0.9725387 0.8444700
## y2 0.9912975 1.0000000 0.9976773 0.9940195 0.9334369 0.7666139
## y3 0.9800280 0.9976773 1.0000000 0.9991493 0.9068323 0.7210946
## y4 0.9709934 0.9940195 0.9991493 1.0000000 0.8886788 0.6919090
## y5 0.9725387 0.9334369 0.9068323 0.8886788 1.0000000 0.9459367
## y6 0.8444700 0.7666139 0.7210946 0.6919090 0.9459367 1.0000000
$P matriz.corr.ejercicio3
## y1 y2 y3 y4 y5
## y1 NA 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00
## y2 0.000000e+00 NA 0.000000e+00 0.000000e+00 5.462297e-14
## y3 0.000000e+00 0.000000e+00 NA 0.000000e+00 5.104805e-12
## y4 0.000000e+00 0.000000e+00 0.000000e+00 NA 5.498779e-11
## y5 0.000000e+00 5.462297e-14 5.104805e-12 5.498779e-11 NA
## y6 4.465265e-09 7.821403e-07 6.944397e-06 2.283546e-05 3.108624e-15
## y6
## y1 4.465265e-09
## y2 7.821403e-07
## y3 6.944397e-06
## y4 2.283546e-05
## y5 3.108624e-15
## y6 NA
Representa esa matriz gráficamente con un correlograma, utilizando para ello los números correspondientes a los coeficientes de correlación de Pearson.
corrplot(cor(ejercicio3), # Matriz de correlación que va a ser representada gráficamente
method = "number", # Simbología: “circle”, “square”, “ellipse”, “number”, “shade”, “color”, “pie”)
type = "upper", # Visualización. Muestra únicamente la diagonal (triángulo) superior de la matriz.
order = "hclust", # Reordena la matriz según el coeficiente de correlación.
tl.col = "black", # Color de las etiquetas
tl.srt = 45, # Ángulo de rotación de las etiquetas.
addCoef.col = "black", # Añade el valor del coeficiente de correlación
diag = FALSE)
A partir de la hoja Ejemplo2
presente en la hoja de
cálculo https://personales.unican.es/rasillad/docencia/G14/evaluacion_continua/ejercicios_regresion_2022.xlsx,
realiza los siguientes cálculos:
Representación gráfica de la relación entre cada una de las variables (peso, edad y grasas) con las restantes, para determinar si existe una relación lineal entre ellas. La relación lineal podemos observarla mediante un gráfico
# dos filas, dos columnas
par(mfrow = c(3, 1))
# Los siguientes gráficos se combinarán
plot(ejercicio2$peso, ejercicio2$edad, xlim = c(50,90)) # Arriba izquierda
plot(ejercicio2$peso, ejercicio2$grasas, xlim = c(50,90)) # Arriba derecha
plot(ejercicio2$edad, ejercicio2$grasas) # Abajo izquierda
# Volvemos al estado original
par(mfrow = c(1, 1))
Comprueba si esas variables cumplen en supuesto de normalidad.
shapiro.test(ejercicio2$peso)
##
## Shapiro-Wilk normality test
##
## data: ejercicio2$peso
## W = 0.91311, p-value = 0.03579
shapiro.test(ejercicio2$edad)
##
## Shapiro-Wilk normality test
##
## data: ejercicio2$edad
## W = 0.94403, p-value = 0.1833
shapiro.test(ejercicio2$grasas)
##
## Shapiro-Wilk normality test
##
## data: ejercicio2$grasas
## W = 0.96764, p-value = 0.5861
Teniendo en cuenta que el contenido en grasas puede considerarse dependiente de la edad y el peso, identifica cuál está mejor correlacionada con las grasas y desarrolla un modelo de regresión lineal.
round(cor(ejercicio2),2)
## peso edad grasas
## peso 1.00 0.24 0.27
## edad 0.24 1.00 0.84
## grasas 0.27 0.84 1.00
lm(grasas ~ edad, # Variable dependiente ~ Variable independiente
data = ejercicio2)
##
## Call:
## lm(formula = grasas ~ edad, data = ejercicio2)
##
## Coefficients:
## (Intercept) edad
## 102.575 5.321
A partir de la hoja difusión presente en la hoja de cálculo https://personales.unican.es/rasillad/docencia/G14/TEMA_3/ejercicios_regresion_2023.xlsx, realiza los siguientes cálculos:
Crea un data frame que almacene los datos del ejemplo propuesto.
<- read_excel("regresion.xlsx", sheet = "difusion")
ejercicio5 ejercicio5
## # A tibble: 200 × 4
## youtube facebook periódicos ventas
## <dbl> <dbl> <dbl> <dbl>
## 1 276. 45.4 83.0 26.5
## 2 53.4 47.2 54.1 12.5
## 3 20.6 55.1 83.2 11.2
## 4 182. 49.6 70.2 22.2
## 5 217. 13.0 70.1 15.5
## 6 10.4 58.7 90 8.64
## 7 69 39.4 28.2 14.2
## 8 144. 23.5 13.9 15.8
## 9 10.3 2.52 1.2 5.76
## 10 240. 3.12 25.4 12.7
## # ℹ 190 more rows
Representa gráficamente la relación entre la variable ventas y las restantes variables, para determinar si existe una relación lineal entre ellas.
# dos filas, dos columnas
par(mfrow = c(3, 3))
# Los siguientes gráficos se combinarán
plot(ejercicio5$youtube, ejercicio5$facebook) # Arriba izquierda
plot(ejercicio5$youtube, ejercicio5$periódicos) # Arriba derecha
plot(ejercicio5$youtube, ejercicio5$ventas) # Abajo izquierda
plot(ejercicio5$facebook, ejercicio5$periódicos) # Arriba derecha
plot(ejercicio5$facebook, ejercicio5$ventas) # Abajo izquierda
plot(ejercicio5$periódicos, ejercicio5$ventas) # Abajo izquierda
# Volvemos al estado original
par(mfrow = c(1, 1))
Tres variables parecen mostrar una relación lineal: youtube con ventas, y facebook con ventas.
Comprueba si todas las variables cumplen en supuesto de normalidad.
shapiro.test(ejercicio5$youtube)
##
## Shapiro-Wilk normality test
##
## data: ejercicio5$youtube
## W = 0.94951, p-value = 1.693e-06
shapiro.test(ejercicio5$facebook)
##
## Shapiro-Wilk normality test
##
## data: ejercicio5$facebook
## W = 0.94401, p-value = 5.198e-07
shapiro.test(ejercicio5$ventas)
##
## Shapiro-Wilk normality test
##
## data: ejercicio5$ventas
## W = 0.97603, p-value = 0.001683
shapiro.test(ejercicio5$periódicos)
##
## Shapiro-Wilk normality test
##
## data: ejercicio5$periódicos
## W = 0.9364, p-value = 1.127e-07
Calcula una matriz de correlación entre esas variables y represéntalas gráficamente mediante un correlograma.
round(cor(ejercicio5),2)
## youtube facebook periódicos ventas
## youtube 1.00 0.05 0.06 0.78
## facebook 0.05 1.00 0.35 0.58
## periódicos 0.06 0.35 1.00 0.23
## ventas 0.78 0.58 0.23 1.00
corrplot(cor(ejercicio5), # Matriz de correlación que va a ser representada gráficamente
method = "number", # Simbología: “circle”, “square”, “ellipse”, “number”, “shade”, “color”, “pie”)
type = "upper", # Visualización. Muestra únicamente la diagonal (triángulo) superior de la matriz.
order = "hclust", # Reordena la matriz según el coeficiente de correlación.
tl.col = "black", # Color de las etiquetas
tl.srt = 45, # Ángulo de rotación de las etiquetas.
addCoef.col = "black", # Añade el valor del coeficiente de correlación
diag=FALSE)
Si la variable ventas puede considerarse la variable dependiente, identifica con qué variable está mejor correlacionada y desarrolla un modelo de regresión lineal. La variable ventas está correlacionada con youtube.
<- lm(ventas ~ youtube, # Variable dependiente ~ Variable independiente
regresion.ventas.youtube data = ejercicio5)
Interpreta los parámetros de esa recta ¿son significativos estos parámetros? ¿Qué puede decirse del ajuste del modelo a los datos?
summary(regresion.ventas.youtube)
##
## Call:
## lm(formula = ventas ~ youtube, data = ejercicio5)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.0632 -2.3454 -0.2295 2.4805 8.6548
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.439112 0.549412 15.36 <2e-16 ***
## youtube 0.047537 0.002691 17.67 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.91 on 198 degrees of freedom
## Multiple R-squared: 0.6119, Adjusted R-squared: 0.6099
## F-statistic: 312.1 on 1 and 198 DF, p-value: < 2.2e-16
Si para el mes que viene quisiéramos elevar nuestras ventas a 25 millones de euros, ¿cuál sería el valor de la variable independiente que nos permitiría alcanzar este valor?
$coefficients regresion.ventas.youtube
## (Intercept) youtube
## 8.43911226 0.04753664
0.0475*25 + 8.43
## [1] 9.6175
A partir de la hoja clima_madrid
presente en la hoja de
cálculo https://personales.unican.es/rasillad/docencia/G14/TEMA_3/ejercicios_regresion_2023.xlsx,
realiza los siguientes cálculos:
Crea un data frame que almacene los datos del ejemplo propuesto.
<- read_excel("regresion.xlsx", sheet = "clima_madrid")
ejercicio6 ejercicio6
## # A tibble: 27 × 5
## estacion alt pp tene tjul
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 PANTANO EL VADO 980 784. 4.8 22
## 2 PRESA DE PUENTES VIEJ 960 632. 3.9 21.1
## 3 PRESA DE RIO SEQUILLO 1000 664. 4.2 20.4
## 4 PRESA DEL ATAZAR 960 592. 4.5 23.2
## 5 RASCAFRIA 'EL PAULAR' 1159 1009 3.1 18.6
## 6 NAVACERRADA 'PUERTO' 1890 1440 -0.6 16
## 7 TALAMANCA DEL JARAMA 654 495. 4.9 24.2
## 8 PRESA DE MANZANARES E 908 755. 4.8 24
## 9 VILLALBA 917 655. 5.2 24.3
## 10 ALCALA HENARES 'ENCIN 610 417. 5.2 23.2
## # ℹ 17 more rows
Representa gráficamente la relación entre las variables alt, pp, tene y tjul, para determinar si existe una relación lineal entre ellas.
# dos filas, dos columnas
par(mfrow = c(2, 2))
# Los siguientes gráficos se combinarán
plot(ejercicio6$pp, ejercicio6$alt) # Arriba izquierda
plot(ejercicio6$tene, ejercicio6$alt) # Arriba derecha
plot(ejercicio6$tjul, ejercicio6$alt) # Abajo izquierda
plot(ejercicio6$tene, ejercicio6$pp)
# Volvemos al estado original
par(mfrow = c(1, 1))
Comprueba si esas variables cumplen en supuesto de normalidad. Existen diferentes posibilidades. Una de ellas es el gráfico Q-Q.
qqnorm(ejercicio6$pp, # Gráfico Q-Q
pch = 1,
frame = FALSE)
qqline(ejercicio6$pp, # Línea recta de referencia añadida
col = "steelblue", # Color de la línea
lwd = 2)
Otra posibilidad es el test de Shapiro-Wilks
shapiro.test(ejercicio6$tene)
##
## Shapiro-Wilk normality test
##
## data: ejercicio6$tene
## W = 0.76456, p-value = 3.532e-05
shapiro.test(ejercicio6$tjul)
##
## Shapiro-Wilk normality test
##
## data: ejercicio6$tjul
## W = 0.82669, p-value = 0.0004118
Calcula una matriz de correlación entre todas las variables y elabora al menos dos gráficos que te permitan observar de manera global el grado de relación entre todas esas variables.
round(cor(ejercicio6[ , c(2:5)]),2)
## alt pp tene tjul
## alt 1.00 0.94 -0.86 -0.86
## pp 0.94 1.00 -0.82 -0.81
## tene -0.86 -0.82 1.00 0.90
## tjul -0.86 -0.81 0.90 1.00
pairs(ejercicio6[ , c(2:5)])
corrplot(cor(ejercicio6[ , c(2:5)]), # Matriz de correlación que va a ser representada gráficamente
method = "number", # Simbología: “circle”, “square”, “ellipse”, “number”, “shade”, “color”, “pie”)
type = "upper", # Visualización. Muestra únicamente la diagonal (triángulo) superior de la matriz.
order = "hclust", # Reordena la matriz según el coeficiente de correlación.
tl.col = "black", # Color de las etiquetas
tl.srt = 45, # Ángulo de rotación de las etiquetas.
addCoef.col = "black", # Añade el valor del coeficiente de correlación
diag=FALSE)
Teniendo en cuenta que la altitud es una variable geográfica que genera alteraciones importantes en la distribución espacial de las variables climáticas, identifica cuál está mejor correlacionada con la altitud y desarrolla un modelo de regresión lineal.
<- lm(pp ~ alt, # Variable dependiente ~ Variable independiente
regresion.alt.pp data = ejercicio6)
plot(ejercicio6$pp ~ ejercicio6$alt,
data = ejercicio6,
pch = 19,
col = "darkblue") # Creamos el gráfico
abline(regresion.alt.pp, col = "red", lwd = 3) # Línea de regresión
text(paste("Correlación:", round(cor(ejercicio6$alt, ejercicio6$pp), 2)),
x = 1600, # Posición etiqueta: sobre el valor 30 de x
y = 600) # Posición etiqueta: sobre el valor 5 de y
Interpreta los parámetros de esa recta ¿son significativos estos parámetros? ¿Qué puede decirse del ajuste del modelo a los datos?
summary(regresion.alt.pp)
##
## Call:
## lm(formula = pp ~ alt, data = ejercicio6)
##
## Residuals:
## Min 1Q Median 3Q Max
## -131.04 -54.00 -20.32 57.87 140.07
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 20.46750 43.49576 0.471 0.642
## alt 0.73206 0.05345 13.695 4.02e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 77.21 on 25 degrees of freedom
## Multiple R-squared: 0.8824, Adjusted R-squared: 0.8777
## F-statistic: 187.6 on 1 and 25 DF, p-value: 4.023e-13
Queremos trasladarnos a una vivienda que estará situada en el Puerto de Somosierra a 1480 metros de altitud. ¿Qué precipitación registraremos?
$coefficients regresion.alt.pp
## (Intercept) alt
## 20.4674973 0.7320601
0.7320601*1480 + 20.4674973
## [1] 1103.916
El dataset “Air quality” contiene los valores diarios de las siguientes variables ambientales entre el 1 de mayo y el 30 de septiembre de 1973. Se puede acceder al mismo desde R con los siguientes comandos:
data(airquality)
str(airquality)
## 'data.frame': 153 obs. of 6 variables:
## $ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ...
## $ Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
## $ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
## $ Temp : int 67 72 74 62 56 66 65 59 61 69 ...
## $ Month : int 5 5 5 5 5 5 5 5 5 5 ...
## $ Day : int 1 2 3 4 5 6 7 8 9 10 ...
Las variables de ese conjunto de datos son las siguientes:
• Month: mes.
• Day: día.
• Ozone: media diaria del ozono (en partes por millón) entre las 13 y las 15 horas
• Solar.R: radiación solar (en Langleys) entre las 08 y las 12 horas.
• Wind: velocidad media del viento (en millas por hora) entre las 07 y las 10.
• Temp: temperatura máxima diaria en ºF.
Cambia el nombre de las variables originales por los siguientes nombres: mes, día, ozono, radiación.solar, viento, temperatura.máxima.
names(airquality) <- c("ozono", "radiacion.solar", "viento", "temperatura.maxima", "mes", "dia")
Transforma los valores de la temperatura máxima y viento en unidades del sistema métrico decimal. Para ello:
$temperatura.maxima <- airquality$temperatura.maxima * 0.5556 - 32 airquality
$viento <- airquality$viento * 0.44704 airquality
$dia <- as.factor(airquality$dia)
airquality$mes <- as.factor(airquality$mes) airquality
TAREA 2. Elabora un análisis exploratorio de las variables ozono, radiación.solar, viento y temperatura.máxima en el que analiza cómo varían esos valores a lo largo de los meses analizados. Utiliza las herramientas que consideres más oportunas. Comenta brevemente los resultados.
# dos filas, dos columnas
par(mfrow = c(2, 2))
# Los siguientes gráficos se combinarán
boxplot(ozono ~ mes, airquality, xlab = "Mes", ylab = "ozono (ppb)")
boxplot(temperatura.maxima ~ mes, airquality, xlab = "Mes", ylab = "temperatura máxima (ºC)")
boxplot(radiacion.solar ~ mes, airquality, xlab = "Mes", ylab = "radiacion (wm^2)")
boxplot(viento ~ mes, airquality, xlab = "Mes", ylab = "viento (m/s)")
# Volvemos al estado original
par(mfrow = c(1, 1))
El ozono y la temperatura máxima siguen un ciclo mensual con máximos en verano, contrario al del viento (valores mínimos en julio y agosto). Los valores medios de radiación solar también siguen un ciclo similar, pero su variabilidad, medida por el ancho de las bajas y de los bigotes es muy superior a las restantes variables.
TAREA 3. Analiza si las variables ozono, radiación.solar, viento y temperatura máxima tienen una distribución normal por los métodos que consideres oportunos o si presentan algún tipo de sesgo. Si existiera alguna variable que no sigue una distribución normal, transfórmala elevando sus valores originales al cuadrado y repite el análisis para comprobar si la distribución ha cambiado.
library("car")
## Loading required package: carData
# dos filas, dos columnas
par(mfrow = c(2, 2))
# Los siguientes gráficos se combinarán
qqPlot(airquality$radiacion.solar)
## [1] 82 21
qqPlot(airquality$ozono)
## [1] 117 62
qqPlot(airquality$viento)
## [1] 48 9
qqPlot(airquality$temperatura.maxima)
## [1] 5 18
# Volvemos al estado original
par(mfrow = c(1, 1))
shapiro.test(airquality$ozono)
##
## Shapiro-Wilk normality test
##
## data: airquality$ozono
## W = 0.87867, p-value = 2.79e-08
shapiro.test(airquality$viento)
##
## Shapiro-Wilk normality test
##
## data: airquality$viento
## W = 0.98575, p-value = 0.1178
shapiro.test(airquality$radiacion.solar)
##
## Shapiro-Wilk normality test
##
## data: airquality$radiacion.solar
## W = 0.94183, p-value = 9.492e-06
shapiro.test(airquality$temperatura.maxima)
##
## Shapiro-Wilk normality test
##
## data: airquality$temperatura.maxima
## W = 0.97617, p-value = 0.009319
Las variables temperatura.máxima, radiación.solar y ozono poseen una distribución que no es normal. Como ejemplo, se podría transforma la radiación.solar
<- (airquality$radiacion.solar)^(2)
radiacion.transformada
# dos filas, dos columnas
par(mfrow = c(1, 2))
# Los siguientes gráficos se combinarán
hist(airquality$radiacion.solar)
hist(radiacion.transformada)
# Volvemos al estado original
par(mfrow = c(1, 1))
TAREA 4. Identifica que parejas de variables poseen un valor del coeficiente de correlación.
round(cor(airquality[ , c(1:4)],
use = "complete.obs"), # Evita el efecto perturbador de los NA.
2)
## ozono radiacion.solar viento temperatura.maxima
## ozono 1.00 0.35 -0.61 0.70
## radiacion.solar 0.35 1.00 -0.13 0.29
## viento -0.61 -0.13 1.00 -0.50
## temperatura.maxima 0.70 0.29 -0.50 1.00
Las dos parejas son el ozono con la temperatura.maxima y con el viento.
TAREA 5. Teniendo en cuenta que consideramos la variable ozono como variable dependiente, elabora un diagrama de puntos que muestre la relación entre el ozono y la variable independiente mejor correlacionada.
plot(airquality$temperatura.maxima,airquality$ozono,
pch = 19,
col = "black")
TAREA 6. Elabora un modelo de regresión entre el ozono como variable dependiente y la variable independiente mejor correlacionada.
<- lm(ozono ~ temperatura.maxima, # Variable dependiente ~ Variable independiente
regresion.ozono.tmax data = airquality)
print(regresion.ozono.tmax)
##
## Call:
## lm(formula = ozono ~ temperatura.maxima, data = airquality)
##
## Coefficients:
## (Intercept) temperatura.maxima
## -7.113 4.371
El fichero https://personales.unican.es/rasillad/docencia/G14/TEMA_3/datos_inmobiliaria_2023.csv contiene información sobre las viviendas disponibles para el alquiler o la venta en una inmobiliaria.
<- "https://personales.unican.es/rasillad/docencia/G14/TEMA_3/datos_inmobiliaria_2023.csv"
url <- read.csv2(url) inmobiliaria
TAREA 1. Elabora una matriz de correlación, utilizando la correlación de Spearman, entre las variables precio, superficie, comunidad y valor. Analiza la significación estadística de las correlaciones calculadas y determina cuál es la pareja de variables con una relación más estrecha, y cuál es la pareja con una relación más débil.
cor(inmobiliaria[ , c(2,3,9,10)])
## precio superficie comunidad valor
## precio 1.0000000 0.8582595 0.7526343 0.7897345
## superficie 0.8582595 1.0000000 0.7744593 0.7530059
## comunidad 0.7526343 0.7744593 1.0000000 0.7001731
## valor 0.7897345 0.7530059 0.7001731 1.0000000
La pareja con la relación más estrecha es el prcio y la superficie (0.85). La pareja con la relación más débil es el valor con la comunidad (0.70).
TAREA 2. Elabora sendos modelos de regresión que relacionen las siguientes variables: superficie (variable independiente) con el precio (variable dependiente), y precio (variable independiente) con valor (variable dependiente).
Analiza inicialmente si dichas variables cumplen con el requisito de normalidad.
shapiro.test(inmobiliaria$valor)
##
## Shapiro-Wilk normality test
##
## data: inmobiliaria$valor
## W = 0.75923, p-value < 2.2e-16
shapiro.test(inmobiliaria$precio)
##
## Shapiro-Wilk normality test
##
## data: inmobiliaria$precio
## W = 0.7606, p-value < 2.2e-16
shapiro.test(inmobiliaria$superficie)
##
## Shapiro-Wilk normality test
##
## data: inmobiliaria$superficie
## W = 0.81054, p-value < 2.2e-16
De nuevo, ninguna de las variables cumple el criterio de normalidad.
<- lm(precio ~ superficie, # Variable dependiente ~ Variable independiente
regresion.precio.superficie data = inmobiliaria)
print(regresion.precio.superficie)
##
## Call:
## lm(formula = precio ~ superficie, data = inmobiliaria)
##
## Coefficients:
## (Intercept) superficie
## -57942 6259
<- lm(valor ~ superficie, # Variable dependiente ~ Variable independiente
regresion.valor.superficie data = inmobiliaria)
print(regresion.valor.superficie)
##
## Call:
## lm(formula = valor ~ superficie, data = inmobiliaria)
##
## Coefficients:
## (Intercept) superficie
## -51419 3749
plot(precio ~ superficie,
data = inmobiliaria,
pch = 19,
col = "darkblue") # Creamos el gráfico
abline(regresion.precio.superficie, col = "green", lwd = 3) # Línea de regresión
text(paste("Correlación:", round(cor(inmobiliaria$precio, inmobiliaria$superficie), 2)),
x = 100, # Posición etiqueta: sobre el valor 30 de x
y = 3000000) # Posición etiqueta: sobre el valor 5 de y
plot(valor ~ superficie,
data = inmobiliaria,
pch = 19,
col = "darkblue") # Creamos el gráfico
abline(regresion.valor.superficie, col = "green", lwd = 3) # Línea de regresión
text(paste("Correlación:", round(cor(inmobiliaria$valor, inmobiliaria$superficie), 2)),
x = 400, # Posición etiqueta: sobre el valor 30 de x
y = 2700000) # Posición etiqueta: sobre el valor 5 de y
De acuerdo con los modelos anteriores, calcula qué precio y qué valor catastral tendrían los siguientes pisos de nueva construcción. Se crea un dataframe con la superficie de los pisos nuevos
<- c(37.5, 42.8, 55.7, 62.1, 83.9, 99.8, 107.9, 124.9)
superficie <- data.frame(superficie)
pisos.nuevos pisos.nuevos
## superficie
## 1 37.5
## 2 42.8
## 3 55.7
## 4 62.1
## 5 83.9
## 6 99.8
## 7 107.9
## 8 124.9
Se elaboran las predicciones y se añaden al dataframe con los nuevos precios
<- predict(regresion.precio.superficie,
prediccion.precio
pisos.nuevos)
<- predict(regresion.valor.superficie,
prediccion.valor
pisos.nuevos)
<- cbind(pisos.nuevos, prediccion.precio, prediccion.valor) pisos.nuevos