1 EJERCICIO 1.

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")
ejercicio1 <- read_excel("regresion.xlsx", sheet = "Ejemplo1")
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.

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.

2 EJERCICIO 2.

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:

ejercicio2 <- read_excel("regresion.xlsx", sheet = "Ejemplo2")
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
matriz.corr.ejercicio2 <- rcorr(as.matrix(ejercicio2))        # devuelve los coeficientes de correlación y p-value de los pares de columnas.
matriz.corr.ejercicio2$r 
##             peso      edad    grasas
## peso   1.0000000 0.2400133 0.2652935
## edad   0.2400133 1.0000000 0.8373534
## grasas 0.2652935 0.8373534 1.0000000
matriz.corr.ejercicio2$P 
##             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)       

3 EJERCICIO 3.

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:

ejercicio3 <- read_excel("regresion.xlsx", sheet = "Ejemplo3")
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.

matriz.corr.ejercicio3 <- rcorr(as.matrix(ejercicio3))        # devuelve los coeficientes de correlación y p-value de los pares de columnas.
matriz.corr.ejercicio3$r 
##           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
matriz.corr.ejercicio3$P 
##              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)       

4 EJERCICIO 4.

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

5 EJERCICIO 5.

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.

ejercicio5 <- read_excel("regresion.xlsx", sheet = "difusion")
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.

regresion.ventas.youtube <- lm(ventas ~ youtube,                          # Variable dependiente ~ Variable independiente
                         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?

regresion.ventas.youtube$coefficients
## (Intercept)     youtube 
##  8.43911226  0.04753664
0.0475*25 + 8.43
## [1] 9.6175

6 EJERCICIO 6.

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.

ejercicio6 <- read_excel("regresion.xlsx", sheet = "clima_madrid")
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.

regresion.alt.pp <- lm(pp ~ alt,                          # Variable dependiente ~ Variable independiente
                         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?

regresion.alt.pp$coefficients
## (Intercept)         alt 
##  20.4674973   0.7320601
0.7320601*1480 + 20.4674973
## [1] 1103.916

7 EJERCICIO 6

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:

airquality$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)

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

radiacion.transformada <- (airquality$radiacion.solar)^(2)

# 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.

regresion.ozono.tmax <- lm(ozono ~ temperatura.maxima,                          # Variable dependiente ~ Variable independiente
                         data = airquality)                                         
print(regresion.ozono.tmax)      
## 
## Call:
## lm(formula = ozono ~ temperatura.maxima, data = airquality)
## 
## Coefficients:
##        (Intercept)  temperatura.maxima  
##             -7.113               4.371

8 EJERCICIO 7.

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.

url <- "https://personales.unican.es/rasillad/docencia/G14/TEMA_3/datos_inmobiliaria_2023.csv"
inmobiliaria <- read.csv2(url)

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.

regresion.precio.superficie <- lm(precio ~ superficie,                          # Variable dependiente ~ Variable independiente
                         data = inmobiliaria)                                         
print(regresion.precio.superficie)      
## 
## Call:
## lm(formula = precio ~ superficie, data = inmobiliaria)
## 
## Coefficients:
## (Intercept)   superficie  
##      -57942         6259
regresion.valor.superficie <- lm(valor ~ superficie,                          # Variable dependiente ~ Variable independiente
                         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

superficie <- c(37.5, 42.8, 55.7, 62.1, 83.9, 99.8, 107.9, 124.9)
pisos.nuevos <- data.frame(superficie)
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

prediccion.precio <- predict(regresion.precio.superficie, 
                             pisos.nuevos)

prediccion.valor <- predict(regresion.valor.superficie,
                            pisos.nuevos)

pisos.nuevos <- cbind(pisos.nuevos, prediccion.precio, prediccion.valor)