0.1 Introducción

En esta actividad nos planteamos dos objetivos, uno consiste en predecir el precio de venta de una vivienda, y el otro en predecir la expectativa que una vivienda sea vendida. En ambos casos nos interesa conocer los factores influyentes.

Usaremos el fichero de datos house.csv. Cuyas variables (se mantiene el nombre original en inglés) son:

Variable Descripción
———— ——————————————————-
• price Precio de venta de una propiedad por parte del propietario
• resid_area Proporción de área residencial en la ciudad
• air_qual Calidad del aire de ese vecindario
• room_num Número medio de habitaciones en casas de esa localidad
• age Años de la construcción inmobiliaria
• dist1 Distancia del centro de empleo 1
• dist2 Distancia del centro de empleo 2
• dist3 Distancia del centro de empleo 3
• dist4 Distancia del centro de empleo 4
• teachers Número de maestros por cada mil habitantes en el municipio
• poor_prop Proporción de población pobre en la ciudad
• airport Hay un aeropuerto en la ciudad
• n_hos_beds Número de camas de hospital por mil habitantes en la ciudad
• n_hot_rooms Número de habitaciones de hotel por cada mil habitantes de la ciudad
• waterbody Qué tipo de fuente natural de agua dulce hay en la ciudad
• rainfall Precipitación media anual en centímetros
• bus_ter Hay una terminal de autobuses en la ciudad
• parks Proporción de terrenos asignados como parques y áreas verdes en la ciudad
• Sold Si la propiedad se vendió (1) o no (0)

Ref. https://www.tablesgenerator.com/

0.2 Aspectos importantes a tener en cuenta para entregar la actividad:

• Es necesario entregar el archivo Rmd y el fichero de salida (PDF o html). El archivo de salida debe incluir: el código y el resultado de la ejecución del código (paso a paso).

• Se debe respetar la misma numeración de los apartados que el enunciado.

• No se pueden realizar listados completos del conjunto de datos en la solución. Esto generaría un documento con cientos de páginas y dificulta la revisión del texto. Para comprobar las funcionalidades del código sobre los datos, se pueden usar las funciones head y tail que sólo muestran unas líneas del fichero de datos.

• El nivel de confianza por defecto es del 95 %, a no ser que se especifique un valor diferente.

• Se valora la precisión de los términos utilizados (hay que usar de manera precisa la terminología de la estadística).

• Se valora también la concisión en la respuesta. No se trata de hacer explicaciones muy largas o documentos muy extensos. Hay que explicar el resultado y argumentar la respuesta a partir de los resultados obtenidos de manera clara y concisa.

0.3 Puntuación

. Apartado 1 (10 %)

. Apartado 2.1 (10 %)

. Apartado 2.2 (10 %)

. Apartado 2.3 (20 %)

. Apartado 3.1 (10 %)

. Apartado 3.2 (10 %)

. Apartado 3.3 (20 %)

. Apartado 4 (5 %)

. Calidad del informe dinàmico (5 %)

1 Datos y Estadística descriptiva

1.1 Lectura de datos

En primer lugar, leed el fichero de datos y verificad que los tipos de datos se interpretan correctamente. Si fuera necesario, haced las oportunas conversiones de tipos.

1.1.0.1 Preparamos nuestro workspace

# Limpiamos el workspace, por si hubiera algun dataset o informacion cargada
rm(list = ls())

# Limpiamos la consola
cat("\014")
# Cambiar el directorio de trabajo
# setwd(dirname(rstudioapi::getActiveDocumentContext()$path))
getwd()
## [1] "/home/oscar/Documentos/MASTER UOC/CURSADOS/Estadística avanzada aula 2/PEC3 A3- Modelización predictiva"

1.1.0.2 Instalamos librerias

packages <- c("DT","magrittr", "funModeling", "tidyr", "dplyr", "purrr", "ggplot2", 
              "gridExtra", "skimr", "nortest", "car", "corrplot", "GGally",
              "psych")
new <- packages[!(packages %in% installed.packages()[,"Package"])]
if(length(new)) install.packages(new)
a=lapply(packages, require, character.only=TRUE)

Cargamos los datos

datos = read.csv("house.csv", sep=";")

Mostramos el tipo de datos

str(datos)
## 'data.frame':    506 obs. of  19 variables:
##  $ price      : num  5 12 14 18 19 20 20 20 21 21 ...
##  $ resid_area : num  48.1 48.1 51.9 51.9 35.2 ...
##  $ air_qual   : num  0.693 0.614 0.624 0.624 0.515 0.499 0.437 0.489 0.538 0.544 ...
##  $ room_num   : num  5.45 5.3 6.17 6.43 5.99 ...
##  $ age        : num  100 97.3 93.6 98.8 45.4 61.4 74.5 100 87.3 58.8 ...
##  $ dist1      : num  1.57 2.28 1.86 1.96 4.89 3.39 4.33 3.95 4.53 4.07 ...
##  $ dist2      : num  1.26 1.99 1.54 1.61 4.64 3.28 3.72 3.86 3.94 3.86 ...
##  $ dist3      : num  1.79 2.41 1.87 1.92 5.05 3.62 4.26 4.14 4.36 4.24 ...
##  $ dist4      : num  1.34 1.73 1.18 1.77 4.67 3.22 3.9 3.55 4.13 3.84 ...
##  $ teachers   : num  19.8 19.8 18.8 18.8 19.8 20.8 21.3 21.4 19 21.6 ...
##  $ poor_prop  : num  30.59 24.91 24.16 15.39 9.74 ...
##  $ airport    : chr  "NO" "NO" "NO" "NO" ...
##  $ n_hos_beds : num  9.3 9.34 5.68 8.16 6.38 ...
##  $ n_hot_rooms: num  13 15.1 10.1 14.1 11.2 ...
##  $ waterbody  : chr  "Lake" "Lake" "Lake" "None" ...
##  $ rainfall   : int  26 39 28 41 28 39 22 60 50 36 ...
##  $ bus_ter    : chr  "YES" "YES" "YES" "YES" ...
##  $ parks      : num  0.0653 0.0619 0.057 0.0564 0.0477 ...
##  $ Sold       : int  0 0 0 0 0 0 0 0 0 0 ...

Discretizamos las variables con pocas clases

# Convertimos las variable character en factor.
datos$Sold <- ifelse(datos$Sold == 1, "YES", "NOT")
# Convierto las ventas 1 en Si y 0 en no
# Discretizamos las variables con pocas clases
cols<-c("airport","waterbody","bus_ter", "Sold")

for (i in cols){
  datos[,i] <- as.factor(datos[,i])
}
# Otra forma de ver los datos
datatable(datos,
      options = list(scrollX = TRUE))

Mostramos valores: nan, nulos,…)

cat('Mostramos si hay na: \n')
## Mostramos si hay na:
colSums(is.na(datos))
##       price  resid_area    air_qual    room_num         age       dist1 
##           0           0           0           0           0           0 
##       dist2       dist3       dist4    teachers   poor_prop     airport 
##           0           0           0           0           0           0 
##  n_hos_beds n_hot_rooms   waterbody    rainfall     bus_ter       parks 
##           8           0           0           0           0           0 
##        Sold 
##           0
cat('Mostramos si hay null: \n')
## Mostramos si hay null:
is_null(datos)
## [1] FALSE

Hay 8 filas con NA en la columna n_hos_beds y los eliminamos

datos <- datos %>%
  drop_na()

Otra forma de ver los datos.

df_status(datos)
##       variable q_zeros p_zeros q_na p_na q_inf p_inf    type unique
## 1        price       0       0    0    0     0     0 numeric    225
## 2   resid_area       0       0    0    0     0     0 numeric     76
## 3     air_qual       0       0    0    0     0     0 numeric     81
## 4     room_num       0       0    0    0     0     0 numeric    440
## 5          age       0       0    0    0     0     0 numeric    351
## 6        dist1       0       0    0    0     0     0 numeric    336
## 7        dist2       0       0    0    0     0     0 numeric    354
## 8        dist3       0       0    0    0     0     0 numeric    337
## 9        dist4       0       0    0    0     0     0 numeric    350
## 10    teachers       0       0    0    0     0     0 numeric     46
## 11   poor_prop       0       0    0    0     0     0 numeric    448
## 12     airport       0       0    0    0     0     0  factor      2
## 13  n_hos_beds       0       0    0    0     0     0 numeric    454
## 14 n_hot_rooms       0       0    0    0     0     0 numeric    418
## 15   waterbody       0       0    0    0     0     0  factor      4
## 16    rainfall       0       0    0    0     0     0 integer     42
## 17     bus_ter       0       0    0    0     0     0  factor      1
## 18       parks       0       0    0    0     0     0 numeric    498
## 19        Sold       0       0    0    0     0     0  factor      2

Valores resumen de cada variable

summary(datos)
##      price         resid_area       air_qual         room_num    
##  Min.   : 5.00   Min.   :30.46   Min.   :0.3850   Min.   :3.561  
##  1st Qu.:17.02   1st Qu.:35.15   1st Qu.:0.4490   1st Qu.:5.886  
##  Median :21.20   Median :39.69   Median :0.5380   Median :6.210  
##  Mean   :22.58   Mean   :41.13   Mean   :0.5539   Mean   :6.287  
##  3rd Qu.:25.00   3rd Qu.:48.10   3rd Qu.:0.6240   3rd Qu.:6.623  
##  Max.   :50.00   Max.   :57.74   Max.   :0.8710   Max.   :8.780  
##       age             dist1            dist2            dist3       
##  Min.   :  2.90   Min.   : 1.130   Min.   : 0.920   Min.   : 1.150  
##  1st Qu.: 44.55   1st Qu.: 2.270   1st Qu.: 1.940   1st Qu.: 2.232  
##  Median : 77.15   Median : 3.405   Median : 3.050   Median : 3.395  
##  Mean   : 68.46   Mean   : 3.985   Mean   : 3.642   Mean   : 3.973  
##  3rd Qu.: 94.10   3rd Qu.: 5.400   3rd Qu.: 5.000   3rd Qu.: 5.418  
##  Max.   :100.00   Max.   :12.320   Max.   :11.930   Max.   :12.320  
##      dist4           teachers       poor_prop      airport     n_hos_beds    
##  Min.   : 0.730   Min.   :18.00   Min.   : 1.730   NO :227   Min.   : 5.268  
##  1st Qu.: 1.940   1st Qu.:19.80   1st Qu.: 6.905   YES:271   1st Qu.: 6.635  
##  Median : 3.105   Median :20.95   Median :11.300             Median : 7.999  
##  Mean   : 3.630   Mean   :21.54   Mean   :12.599             Mean   : 7.900  
##  3rd Qu.: 5.005   3rd Qu.:22.60   3rd Qu.:16.930             3rd Qu.: 9.088  
##  Max.   :11.940   Max.   :27.40   Max.   :37.970             Max.   :10.876  
##   n_hot_rooms              waterbody      rainfall     bus_ter  
##  Min.   : 10.11   Lake          : 94   Min.   : 3.00   YES:498  
##  1st Qu.:100.59   Lake and River: 71   1st Qu.:28.00            
##  Median :117.28   None          :155   Median :40.00            
##  Mean   : 98.77   River         :178   Mean   :39.31            
##  3rd Qu.:141.08                        3rd Qu.:50.75            
##  Max.   :153.90                        Max.   :60.00            
##      parks          Sold    
##  Min.   :0.03329   NOT:272  
##  1st Qu.:0.04640   YES:226  
##  Median :0.05346            
##  Mean   :0.05436            
##  3rd Qu.:0.06131            
##  Max.   :0.08671

Carece de valores na

Utilizamos la libreria skimr para información adicional

skim(datos)
Data summary
Name datos
Number of rows 498
Number of columns 19
_______________________
Column type frequency:
factor 4
numeric 15
________________________
Group variables None

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
airport 0 1 FALSE 2 YES: 271, NO: 227
waterbody 0 1 FALSE 4 Riv: 178, Non: 155, Lak: 94, Lak: 71
bus_ter 0 1 FALSE 1 YES: 498
Sold 0 1 FALSE 2 NOT: 272, YES: 226

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
price 0 1 22.58 9.19 5.00 17.02 21.20 25.00 50.00 ▂▇▅▁▁
resid_area 0 1 41.13 6.88 30.46 35.15 39.69 48.10 57.74 ▇▆▁▇▁
air_qual 0 1 0.55 0.12 0.38 0.45 0.54 0.62 0.87 ▇▇▆▃▁
room_num 0 1 6.29 0.70 3.56 5.89 6.21 6.62 8.78 ▁▂▇▂▁
age 0 1 68.46 28.25 2.90 44.55 77.15 94.10 100.00 ▂▂▂▃▇
dist1 0 1 3.99 2.11 1.13 2.27 3.41 5.40 12.32 ▇▅▂▁▁
dist2 0 1 3.64 2.11 0.92 1.94 3.05 5.00 11.93 ▇▅▂▁▁
dist3 0 1 3.97 2.13 1.15 2.23 3.40 5.42 12.32 ▇▅▂▁▁
dist4 0 1 3.63 2.10 0.73 1.94 3.10 5.00 11.94 ▇▅▂▁▁
teachers 0 1 21.54 2.16 18.00 19.80 20.95 22.60 27.40 ▇▅▅▃▁
poor_prop 0 1 12.60 7.15 1.73 6.91 11.30 16.93 37.97 ▇▇▅▂▁
n_hos_beds 0 1 7.90 1.48 5.27 6.63 8.00 9.09 10.88 ▇▇▇▇▅
n_hot_rooms 0 1 98.77 51.53 10.11 100.59 117.28 141.08 153.90 ▅▁▁▇▇
rainfall 0 1 39.31 12.54 3.00 28.00 40.00 50.75 60.00 ▁▅▇▇▇
parks 0 1 0.05 0.01 0.03 0.05 0.05 0.06 0.09 ▃▇▆▂▁

1.2 Descriptiva y visualización

A continuación, comenzaremos el estudio descriptivo, para caracterizar el tipo de variables, detectar posible datos faltantes, outliers, variables con varianza nula o casi nula, etc.

Visualizamos los valores numéricos.

datos %>%
  dplyr::select(c(-airport,-waterbody,-bus_ter)) %>%
  keep(is.numeric) %>% 
  gather() %>% 
  ggplot(aes(value)) +
    facet_wrap(~ key, scales = "free") +
    geom_histogram(bin=30)
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

datos %>%
  gather() %>%
  ggplot(aes(value)) + geom_density()+
  facet_wrap(~key,scales='free')+
  theme(axis.text = element_text(size = 6))

Graficamos los valores categoricos

p1 <- ggplot(datos, aes(airport)) +geom_bar() 
p2 <- ggplot(datos, aes(waterbody)) +geom_bar() 
p3 <- ggplot(datos, aes(bus_ter)) + geom_bar() 
grid.arrange(p1, p2, p3, nrow = 1)

En este apartado vemos como se distribuyen los valores categóricos

filas=dim(datos)[1]
# Ahora, podemos dividir el gráfico de Embarked por Pclass:
ggplot(data = datos[1:filas,],aes(x=airport,fill=waterbody))+
  geom_bar(position="fill")+
  facet_wrap(~bus_ter)

ggplot(data = datos[1:filas,],aes(x=bus_ter,fill=airport))+
  geom_bar(position="fill")+
  facet_wrap(~waterbody)

ggplot(data = datos[1:filas,],aes(x=waterbody,fill=bus_ter))+
  geom_bar(position="fill")+
  facet_wrap(~airport)

1.2.1 Outliers

Vamos a detectar outliers

boxplot(datos[1:10] ,las=2, horizontal = F)

boxplot(datos[11:19] ,las=2, horizontal = F)

Boxplot price con respecto al resto de variables ç

par(mfrow=c(2,2))
boxplot(datos$resid_area~datos$price)
boxplot(datos$air_qual~datos$price)
boxplot(datos$room_num~datos$price)
boxplot(datos$age~datos$price)

boxplot(datos$dist1~datos$price)
boxplot(datos$dist2~datos$price)
boxplot(datos$dist3~datos$price)
boxplot(datos$dist4~datos$price)

boxplot(datos$teachers~datos$price)
boxplot(datos$poor_prop~datos$price)
boxplot(datos$n_hos_beds~datos$price)
boxplot(datos$n_hot_rooms~datos$price)

boxplot(datos$rainfall~datos$price)
boxplot(datos$parks~datos$price)

Genero una función para eliminar los outliers.

# df es el dataFrame que recibimos (ej. datos)
# colNameData es la columna de los datos (ej. "resid_area")
# colNameBy es la columna por la que trocearemos (ej. "price")
outliersReplace <- function(df, colNameData, colNameBy){
  # creamos una nueva columna llamada igual que colNameData pero con .R
  colNameData.R <- paste(colNameData, "R", sep=".")
  df[colNameData.R] <- df[colNameData]
  
  # obtenemos los IDs por los que partir el dataframe
  IDs <- unique(df[,c(colNameBy)])
  for (id in IDs){
    data <- df[df[colNameBy] == id, c(colNameData) ]
    
    Q  <- quantile(data)
    minimo <- Q[1]    # valor minimo
    Q1     <- Q[2]    # primer cuartil
    Me     <- Q[3]    # mediana
    Q3     <- Q[4]    # tercer cuartil
    maximo <- Q[5]    # valor maximo
    IQR    <- Q3 - Q1
    
    lowLimit  <- max(minimo, Q1 - 1.5*IQR)
    highLimit <- min(maximo, Q3 + 1.5*IQR)
    
    # todos los valores donde colNameBy es igual a id
    # y el valor de colNameData es > Q3 + 1.5 * IQR
    # lo reemplazamos por la mediana
    df[df[colNameBy] == id & df[colNameData] > highLimit, c(colNameData.R)] <- Me
    
    # lo mismo para el umbral inferior
    df[df[colNameBy] == id & df[colNameData] < lowLimit, c(colNameData.R)] <- Me
    
    #cat(paste("El", colNameBy, id, "la mediana(", colNameData, ") ==", Me, "\n", sep=" " ))
    
  }
  df   # devolvemos el valor del dataFrame
}

Aplico la función

# Aplico la función
datos <- outliersReplace(datos,"resid_area","price")
datos <- outliersReplace(datos,"air_qual","price")
datos <- outliersReplace(datos,"room_num","price")
datos <- outliersReplace(datos,"age","price")
datos <- outliersReplace(datos,"dist1","price")
datos <- outliersReplace(datos,"dist2","price")
datos <- outliersReplace(datos,"dist3","price")
datos <- outliersReplace(datos,"dist4","price")
datos <- outliersReplace(datos,"teachers","price")
datos <- outliersReplace(datos,"poor_prop","price")
datos <- outliersReplace(datos,"n_hos_beds","price")
datos <- outliersReplace(datos,"n_hot_rooms","price")
datos <- outliersReplace(datos,"rainfall","price")
datos <- outliersReplace(datos,"parks","price")

Comparamos valore con y sin reemplazo.

par(mfrow = c(2,1))    # para ponerlos uno encima de otro
 
boxplot(resid_area   ~ price, data = datos, main = "Sin reemplazo")
boxplot(resid_area.R ~ price, data = datos, main = "Con reemplazo")

boxplot(room_num   ~ price, data = datos, main = "Sin reemplazo")
boxplot(room_num.R ~ price, data = datos, main = "Con reemplazo")

Muestro el nombre de todas las variables/columnas

col <- colnames(datos)
col
##  [1] "price"         "resid_area"    "air_qual"      "room_num"     
##  [5] "age"           "dist1"         "dist2"         "dist3"        
##  [9] "dist4"         "teachers"      "poor_prop"     "airport"      
## [13] "n_hos_beds"    "n_hot_rooms"   "waterbody"     "rainfall"     
## [17] "bus_ter"       "parks"         "Sold"          "resid_area.R" 
## [21] "air_qual.R"    "room_num.R"    "age.R"         "dist1.R"      
## [25] "dist2.R"       "dist3.R"       "dist4.R"       "teachers.R"   
## [29] "poor_prop.R"   "n_hos_beds.R"  "n_hot_rooms.R" "rainfall.R"   
## [33] "parks.R"

Un boxplot con las variables

datos[ , grepl( ".R" , names( datos ) ) ]%>%
  boxplot()

Creamos un nuevo dataset con los datos de reemplazo junto con las variables factor y la variable precio

datos_r <- cbind(datos$price, datos[ , grepl( ".R" , names( datos ) ) ], 
                 datos$airport, datos$waterbody, datos$bus_ter, datos$Sold)
colnames(datos_r) <-c('precio','area.resid','aire.Q','n_hab','edad','dist1',
                      'dist2','dist3','dist4','maestros','pobres','n_camas_hosp',
                      'n_hab_hotel', 'precip', 'parq', 'airp','agua_potable',
                      'term_bus', 'vendido' )
head(datos_r)

Realizamos un boxplot con el dataset con y sin reemplazo

# Realizamos un boxplot con el dataset con y sin reemplazo
boxplot(datos[1:10] ,las=2, horizontal = F)

boxplot(datos_r[1:10] ,las=2, horizontal = F)

boxplot(datos[11:19] ,las=2, horizontal = F)

boxplot(datos_r[11:18] ,las=2, horizontal = F)

Nuevos histogramas

datos_r %>%
  keep(is.numeric) %>% 
  gather() %>% 
  ggplot(aes(value)) +
    facet_wrap(~ key, scales = "free") +
    geom_histogram(bins=30)

De otra forma

# Histograma de cada atributo
datos_r %>% 
  gather(Attributes, value, 1:12) %>% 
  ggplot(aes(x=value)) + 
  geom_histogram(fill = "lightblue2", color = "black", bins=30) + 
  facet_wrap(~Attributes, scales = "free_x") +
  labs(x = "Value", y = "Frequency")

1.2.2 Correlacion entre variables.

En este apartado solo vamos a utilizar las variables que se analizarán en los ejercicios 2 y 3: price, age, teachers, poor_prop, sold,room_num, n_hos_beds, n_hot_rooms, airport

datos_atibu <- datos_r %>%
  select(precio, edad, maestros, pobres, n_hab,
         n_camas_hosp, n_hab_hotel, vendido, airp)
pairs.panels(datos_atibu, pch=21,main="Gráfico 01.6: Matriz de Dispersión, Histograma y Correlación")

Correlación de variables

corrplot(cor(datos_atibu[1:7]), method="shade",
         shade.col=NA, tl.col="black", tl.srt=45)

De otra forma.

corrplot.mixed(cor(datos_atibu[1:7]))

ggpairs(datos_atibu, 
        aes(colour = vendido, 
                     alpha = 0.2), 
        lower=list(combo=wrap("facethist",
                              binwidth=0.5)))

library(caret)
## 
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
## 
##     lift
## The following object is masked from 'package:survival':
## 
##     cluster
x <- datos_atibu[,2:6]
y <- datos_atibu[,1]
scales <- list(x=list(relation="free"), y=list(relation="free"))
featurePlot(x=x, y=y, plot="density", scales=scales)
## NULL

Correlación entre todas las variables

cor(datos_r[1:15])
##                   precio  area.resid      aire.Q       n_hab        edad
## precio        1.00000000 -0.49097333 -0.43748685  0.75463398 -0.37868710
## area.resid   -0.49097333  1.00000000  0.75400397 -0.38059213  0.64278760
## aire.Q       -0.43748685  0.75400397  1.00000000 -0.29194651  0.71652372
## n_hab         0.75463398 -0.38059213 -0.29194651  1.00000000 -0.23771230
## edad         -0.37868710  0.64278760  0.71652372 -0.23771230  1.00000000
## dist1         0.24078186 -0.69058306 -0.75153534  0.18366925 -0.72309550
## dist2         0.24049037 -0.68562684 -0.75085142  0.18386510 -0.72131465
## dist3         0.23523069 -0.68661246 -0.75075426  0.17701423 -0.71350248
## dist4         0.23067413 -0.68232797 -0.74029552  0.17963704 -0.71375714
## maestros      0.53680772 -0.43002605 -0.26920352  0.39207322 -0.30229408
## pobres       -0.76116287  0.61014647  0.60055005 -0.64284942  0.60708956
## n_camas_hosp  0.10949790  0.01664654 -0.02489997  0.05680561 -0.02072217
## n_hab_hotel  -0.18055509  0.04135793  0.03415281 -0.14229696 -0.06065494
## precip       -0.04453384  0.04882911  0.07954328 -0.05428929  0.07039116
## parq         -0.39977627  0.69999260  0.89491613 -0.27226744  0.65684599
##                    dist1       dist2       dist3       dist4     maestros
## precio        0.24078186  0.24049037  0.23523069  0.23067413  0.536807722
## area.resid   -0.69058306 -0.68562684 -0.68661246 -0.68232797 -0.430026045
## aire.Q       -0.75153534 -0.75085142 -0.75075426 -0.74029552 -0.269203519
## n_hab         0.18366925  0.18386510  0.17701423  0.17963704  0.392073221
## edad         -0.72309550 -0.72131465 -0.71350248 -0.71375714 -0.302294085
## dist1         1.00000000  0.99277405  0.98558817  0.98578906  0.281255003
## dist2         0.99277405  1.00000000  0.98631232  0.98498128  0.283052087
## dist3         0.98558817  0.98631232  1.00000000  0.98626877  0.275668643
## dist4         0.98578906  0.98498128  0.98626877  1.00000000  0.270809515
## maestros      0.28125500  0.28305209  0.27566864  0.27080952  1.000000000
## pobres       -0.48627569 -0.48212740 -0.47786982 -0.47845021 -0.434431690
## n_camas_hosp -0.03673558 -0.04039105 -0.04775124 -0.03450079 -0.004759208
## n_hab_hotel   0.02286510  0.02637406  0.02707481  0.02923365 -0.097455091
## precip       -0.02818199 -0.03499896 -0.04993250 -0.03609924 -0.082484005
## parq         -0.67945930 -0.68006090 -0.68132462 -0.67286036 -0.271279900
##                   pobres n_camas_hosp n_hab_hotel      precip        parq
## precio       -0.76116287  0.109497895 -0.18055509 -0.04453384 -0.39977627
## area.resid    0.61014647  0.016646536  0.04135793  0.04882911  0.69999260
## aire.Q        0.60055005 -0.024899972  0.03415281  0.07954328  0.89491613
## n_hab        -0.64284942  0.056805615 -0.14229696 -0.05428929 -0.27226744
## edad          0.60708956 -0.020722170 -0.06065494  0.07039116  0.65684599
## dist1        -0.48627569 -0.036735584  0.02286510 -0.02818199 -0.67945930
## dist2        -0.48212740 -0.040391051  0.02637406 -0.03499896 -0.68006090
## dist3        -0.47786982 -0.047751244  0.02707481 -0.04993250 -0.68132462
## dist4        -0.47845021 -0.034500787  0.02923365 -0.03609924 -0.67286036
## maestros     -0.43443169 -0.004759208 -0.09745509 -0.08248400 -0.27127990
## pobres        1.00000000 -0.057433286  0.10704646  0.06639028  0.55103114
## n_camas_hosp -0.05743329  1.000000000 -0.10017349  0.06008231 -0.04244984
## n_hab_hotel   0.10704646 -0.100173488  1.00000000  0.03603023  0.05963037
## precip        0.06639028  0.060082314  0.03603023  1.00000000  0.08553252
## parq          0.55103114 -0.042449844  0.05963037  0.08553252  1.00000000

Correlación con la variable precio

# Correlación precio
cor_clase <- cor(datos_r[2:15], datos_r$precio)
print(cor_clase)
##                     [,1]
## area.resid   -0.49097333
## aire.Q       -0.43748685
## n_hab         0.75463398
## edad         -0.37868710
## dist1         0.24078186
## dist2         0.24049037
## dist3         0.23523069
## dist4         0.23067413
## maestros      0.53680772
## pobres       -0.76116287
## n_camas_hosp  0.10949790
## n_hab_hotel  -0.18055509
## precip       -0.04453384
## parq         -0.39977627

En este apartado las variables (numericas) con mayor correlación con la variable precio son:

  • n_hab y pobres (una positiva y otra negativa)

  • a gran distancia, maestros y calidad del aire

2 Modelo de regresión lineal

2.1 Modelo de regresión lineal simple

2.1.1 Calcular

Estimar por mínimos cuadrados ordinarios dos modelos lineales que expliquen la variable price, uno en función de la variable teachers y otro en función de la variable poor_prop.

2.1.1.1 price vs teachers

Creo un diagrama de dispersión entre precio y teachers

ggplot(datos_r, aes(x=maestros, y=precio)) + 
  geom_point() + theme_light()

De la figura anterior se ve claramente que a medida que aumenta el precio, la proporción de maestros que ella ofrece aumenta.

El modelo que se va a ajustar se muestra a continuación:

\[precio = N(μ_i,σ^2)\] \[μ_i= β_0+β_1maestros_i\] \[σ^2=constante\]

La función lm se aplica con la fórmula precio ~ maestros para indicar que precio es la variable respuesta y que maestros es la variable explicativa. Los resultados del la función lm se almacenan en el objeto mod1 para luego poder usar el modelo ajustado. La segunda línea del código mostrado abajo se usa para mostrar por pantalla un reporte sencillo del modelo ajustado.

mod1 <- lm(precio ~ maestros, data=datos_r)
mod1 # Para imprimir el objeto mod1
## 
## Call:
## lm(formula = precio ~ maestros, data = datos_r)
## 
## Coefficients:
## (Intercept)     maestros  
##     -27.734        2.344

En la salida anterior se observan los valores estimados de \(β_0\) y \(β_1\) pero no aparece la estimación de \(σ\) . Para obtener una tabla de resumen con detalles del modelo ajustado, se usa la función genérica summary, a continuación el código necesario para obtener la tabla.

summary(mod1)
## 
## Call:
## lm(formula = precio ~ maestros, data = datos_r)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -19.7662  -4.7658  -0.7827   3.1673  31.3252 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -27.7340     3.5677  -7.774 4.43e-14 ***
## maestros      2.3439     0.1654  14.170  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.762 on 496 degrees of freedom
## Multiple R-squared:  0.2882, Adjusted R-squared:  0.2867 
## F-statistic: 200.8 on 1 and 496 DF,  p-value: < 2.2e-16

Con estos resultados, podemos expresar el modelo ajustado de esta forma:

\[precio = N(μ_i,σ^2)\] \[μ_i= -27.7340+2.344maestros_i\] \[σ^2=7.762\]

Interpreto los efectos de \(β\):

  • Por cada incremento de maestros, se espera que el precio aumente en 2.3439
  • Si no hay maestros, (maestros=0), se espera que el precio promedio sea de -27.7340. Al ser un resultado negativo, se desecha. En este caso la interpretación del \(β_0\) no es relevante

Incluyo la recta de regresión que representa el modelo ajustado anterior

ggplot(datos_r, aes(x=maestros, y=precio)) + 
  geom_point() +
  geom_smooth(method='lm', formula=y~x, se=FALSE, col='dodgerblue1') +
  theme_light()

2.1.1.2 price vs poor_prop

Creo un diagrama de dispersión entre precio y pobres

ggplot(datos_r, aes(x=pobres, y=precio)) + 
  geom_point() + theme_light()

De la figura anterior se ve claramente que a medida que aumenta el precio, la proporcion de pobres que ella ofrece disminuye.

El modelo que se va a ajustar se muestra a continuación:

\[precio = N(μ_i,σ^2)\] \[μi= β0+β_1pobre_i\]
\[σ^2=constante\]

La función lm se aplica con la fórmula precio ~ pobres para indicar que precio es la variable respuesta y que pobre es la variable explicativa. Los resultados del la función lm se almacenan en el objeto mod2 para luego poder usar el modelo ajustado. La segunda línea del código mostrado abajo se usa para mostrar por pantalla un reporte sencillo del modelo ajustado.

mod2 <- lm(precio ~ pobres, data=datos_r)
mod2 # Para imprimir el objeto mod1
## 
## Call:
## lm(formula = precio ~ pobres, data = datos_r)
## 
## Coefficients:
## (Intercept)       pobres  
##     34.8972      -0.9919

En la salida anterior se observan los valores estimados de \(β_0\) y \(β_1\) pero no aparece la estimación de σ . Para obtener una tabla de resumen con detalles del modelo ajustado, se usa la función genérica summary, a continuación el código necesario para obtener la tabla.

summary(mod2)
## 
## Call:
## lm(formula = precio ~ pobres, data = datos_r)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -9.869 -3.908 -1.339  2.000 20.182 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 34.89719    0.54186   64.40   <2e-16 ***
## pobres      -0.99195    0.03795  -26.14   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.967 on 496 degrees of freedom
## Multiple R-squared:  0.5794, Adjusted R-squared:  0.5785 
## F-statistic: 683.2 on 1 and 496 DF,  p-value: < 2.2e-16

Con los resultados anteriores, se puede expresar el modelo ajustado:

\[precio = N(μ_i,σ^2)\] \[μ_i= 34.89719-0.99195pobre_i\]
\[σ^2=5.967\]

Interpreto los efectos de β:

  • Por cada incremento de pobres, se espera que el precio disminuya en 0.99195
  • Si no hay pobres, (pobres=0), se espera que el precio promedio sea de 34.89719

Incluyo la recta de regresión que representa el modelo ajustado anterior

ggplot(datos_r, aes(x=pobres, y=precio)) + 
  geom_point() +
  geom_smooth(method='lm', formula=y~x, se=FALSE, col='dodgerblue1') +
  theme_light()

### Describe las diferencias entre ambos modelos y compáralos.

cat ('Modelo 1:    precio ~ maestros', '\n')
## Modelo 1:    precio ~ maestros
mod1
## 
## Call:
## lm(formula = precio ~ maestros, data = datos_r)
## 
## Coefficients:
## (Intercept)     maestros  
##     -27.734        2.344
cat ('Modelo 2:    precio ~ pobreza', '\n')
## Modelo 2:    precio ~ pobreza
mod2
## 
## Call:
## lm(formula = precio ~ pobres, data = datos_r)
## 
## Coefficients:
## (Intercept)       pobres  
##     34.8972      -0.9919

En el primer modelo el intercepto es negativo, ya que indicaría que ante la ausencia de maestros el precio sería negativo… , lo cual no tiene sentido. En este caso la interpretación del \(β_0\) no es relevante y el interes en \(β_1\) que es igual a 2.344, indica que, por termino medio, cada incremento de maestros incrementa el precio en 2.344.

En este segundo modelo intercepto es positivo el cual indica que ante ausencia de niveles de pobreza el precio asciende a 34.8972 y ante aumento del nivel de pobreza, el precio disminuye en 0.9919.

2.1.2 Para cada modelo, realiza un gráfico de dispersión XY e interpretar brevemente el gráfico resultante.

Gráfico de dispersión con la recta de regresión del mod1

ggplot(datos_r, aes(x=maestros, y=precio)) + 
  geom_point() +
  geom_smooth(method='lm', formula=y~x, se=FALSE, col='dodgerblue1') +
  theme_light()

En este caso la linea azul marca la tendencia descrita anteriormente, a medida que aumenta el número de maestros, el precio de la vivienda se incrementa.

Gráfico de dispersión con la recta de regresión del mod2

ggplot(datos_r, aes(x=pobres, y=precio)) + 
  geom_point() +
  geom_smooth(method='lm', formula=y~x, se=FALSE, col='dodgerblue1') +
  theme_light()

En este laso la línea azul marca una tendencia decreciente. A medida que se incrementa el nivel de pobres en la población el precio de la vivienda disminuye.

2.2 Modelo de regresión lineal múltiple (regresores cuantitativos)

2.2.1 Calcular

Estimar por mínimos cuadrados ordinarios un modelo lineal que explique la variable price en función de age, teachers, poor_prop.

El modelo que se va a ajustar se muestra a continuación:

\[precio ~ N(μ_i,σ^2)\]
\[μ~i= β_0+β_1edad_i+β_2maestros_i+β_3pobres_i\] \[σ^2=constante\]

mod <- lm(precio ~ edad + maestros + pobres, data=datos_r)
summary(mod)
## 
## Call:
## lm(formula = precio ~ edad + maestros + pobres, data = datos_r)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -12.8713  -3.4091  -0.5932   2.0033  19.7464 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  6.74488    3.09285   2.181   0.0297 *  
## edad         0.04808    0.01096   4.385 1.42e-05 ***
## maestros     1.14016    0.13004   8.768  < 2e-16 ***
## pobres      -0.96123    0.04656 -20.645  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.489 on 494 degrees of freedom
## Multiple R-squared:  0.6455, Adjusted R-squared:  0.6434 
## F-statistic: 299.9 on 3 and 494 DF,  p-value: < 2.2e-16

Con los resultados anteriores se puede expresar el modelo ajustado como se muestra a continuación.

\[precio = N(μ_i,σ^2)\] \[μ_i= 6.4488+0.04808edad_i+1.14016maestros_i-0.96123pobres_i\] \[σ^2=5.489\]

2.2.2 Indicar el efecto de cada variable regresora e interpretar el modelo.

Interpreto los efectos de $β:

  • Por cada incremento de edad, se espera que el precio aumente en 0.04808

  • Por cada incremento de maestros, se espera que el precio aumente en 1.14016

  • Por cada incremento de porcentaje de pobres, se espera que el precio disminuya en 0.96123

  • Si no hay pobres, ni maestros, ni hay variación de edad, se espera que el precio promedio sea de 6.74488

La interpretación de cada β se hace suponiendo que las demás variables quedan constantes en algún valor

2.2.3 Evaluar la bondad de ajuste a través del coeficiente de determinación ajustado.

El R2ajust es una medida de bondad que considera el número de variables existentes en el modelo. Se considera a R2 una medida que contiene sesgo. A medida que se incorporan más variables, R2 tiende a sobreestimar el poder predictivo del modelo, aunque las variables no sean significativas. El R2ajust corrige esta interpretación y se define de la siguiente forma:

Donde:

n = tamaño de la muestra p = cantidad de variables en el modelo

R2 = 0.6455 n= 498 p = 4

1-((1-0.6455)*((498-1)/(498-4-1)))
## [1] 0.6426237

Adjusted R-squared: 0.6434

Este resultado nos dice que el modelo de regresión múltiple obtenido explica el 64,34% del precio de la vivienda. Dado que está muy cerca del 100%, en principio es un buen modelo.

En un modelo de regresión lineal, el R2ajust es una medida de bondad que considera el número de variables existentes en el modelo.

Cuanto mayor sea \(R^2\) , mayor será la proporción de variabilidad de Y explicada por el modelo y, por tanto, mayor será la bondad del ajuste. Se considera a \(R^2\) una medida que contiene sesgo. A medida que se incorporan más variables, \(R^2\) tiende a sobreestimar el proder predictivo del modelo, aunque las variables no sean significativas. \(R^2_ajust\), penaliza la incorporación de nuevas variables.

2.2.4 Ampliar el modelo anterior con las variables room_num, n_hos_beds y n_hot_rooms.

mod_ampliado <- lm(precio ~ edad + maestros + pobres + n_hab + n_camas_hosp + n_hab_hotel, data=datos_r)
summary(mod_ampliado)
## 
## Call:
## lm(formula = precio ~ edad + maestros + pobres + n_hab + n_camas_hosp + 
##     n_hab_hotel, data = datos_r)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -16.4983  -2.7555  -0.5749   2.2057  24.0474 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -25.702254   3.901419  -6.588 1.15e-10 ***
## edad           0.012137   0.009914   1.224   0.2214    
## maestros       0.872562   0.114461   7.623 1.29e-13 ***
## pobres        -0.565409   0.050475 -11.202  < 2e-16 ***
## n_hab          5.345747   0.428993  12.461  < 2e-16 ***
## n_camas_hosp   0.368501   0.145950   2.525   0.0119 *  
## n_hab_hotel   -0.008945   0.004233  -2.113   0.0351 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.738 on 491 degrees of freedom
## Multiple R-squared:  0.7375, Adjusted R-squared:  0.7343 
## F-statistic: 229.9 on 6 and 491 DF,  p-value: < 2.2e-16

En este modelo β0 negativo en -25.702254, el cual no tiene sentido, por lo que nos centramos en el resto de β1,β2, β3, β4, β5, β6. Podemos resumir que el precio se incrementa ante incrementos de la edad del inmueble, el numero de maestros por 1000 habi, nº medio de habitaciones en casas y nº de camas en hospitales, en cambio el precio se reducirla ante incrementos en la proporción de población pobre e incrementos del nº de habitaciones hoteleras.

Comparar los dos modelos. ¿Es significativamente mejor el nuevo modelo?

En el último modelo el coeficiente de determinación es de 0.733 y en el anterior modelo el R2 es de 0.6455. Teniendo en cuenta esto el último modelo es significativamente mejor ya que aporta mayor numero de variables al modelo y este se acerca más a 1 (100%) que daría lugar a un buen modelo.

2.3 Modelo de regresión lineal múltiple (regresores cuantitativos y cualitativos)

Queremos conocer en qué medida el modelo anterior (Modelo 2.2) se ve afectado por la inclusión de la variable airport.

2.3.1 Aplicar un modelo de regresión lineal múltiple y explicar el resultado.

El modelo que se va a ajustar se muestra a continuación:

\[precio = N(μ_i,σ^2)\] \[μ_i= β_0+β_1edad_i+β_2maestros_i+β_3pobres_i+β_4aeropuerto_i\] \[σ^2=constante\]

modelo <- lm(precio ~ edad + maestros+ pobres +airp, data=datos_r)
summary(modelo)
## 
## Call:
## lm(formula = precio ~ edad + maestros + pobres + airp, data = datos_r)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -12.5911  -3.5134  -0.6715   2.0863  19.3873 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  7.11870    3.10588   2.292   0.0223 *  
## edad         0.04776    0.01096   4.357  1.6e-05 ***
## maestros     1.14150    0.12998   8.782  < 2e-16 ***
## pobres      -0.96496    0.04663 -20.694  < 2e-16 ***
## airpYES     -0.61508    0.49661  -1.239   0.2161    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.486 on 493 degrees of freedom
## Multiple R-squared:  0.6466, Adjusted R-squared:  0.6438 
## F-statistic: 225.5 on 4 and 493 DF,  p-value: < 2.2e-16

Cada una de las pendientes de un modelo de regresión lineal múltiple se define del siguiente modo: Si el resto de variables se mantienen constantes, por cada unidad que aumenta el predictor en cuestión, la variable Y varía en promedio tantas unidades como indica la pendiente.

En el caso del predictor edad inmueble, si el resto de variables no varían, por cada unidad de edad que aumenta el precio del inmueble disminuye en promedio 0.07729 unidades.

En el caso del predictor maestros (nº. maestros por 1000 h), si el resto de variables no varían, por cada unidad de maestros que aumenta el precio del inmueble aumenta en promedio 2.02912 unidades.

Cuando un predictor es cualitativo, uno de sus niveles se considera de referencia (el que no aparece en la tabla de resultados) y se le asigna el valor de 0. El valor de la pendiente de cada nivel de un predictor cualitativo se define como el promedio de unidades que dicho nivel está por encima o debajo del nivel de referencia.
Para el predictor aeropuerto, el nivel de referencia es NO por lo que si la población no tiene aeropuerto se le da a la variable el valor 0 y si tiene aeropuerto el valor 1. Acorde al modelo generado, los precios de las localidades con aeropuerto es en promedio 0.04925 unidades de peso superiores a los que no tiene aeropuerto.

El modelo es capaz de explicar el 64.66% de la variabilidad observada en el precio de los inmubles (R-squared: 0.6466). El valor de \(R^2\)-ajustado es alto y cercano al \(R^2\) (Adjusted R-squared: 0.6438) lo que indica que el modelo contiene predictores útiles. El test F muestra un p-value de \(2.2^e-16\) por lo que el modelo en conjunto es significativo. Esto se corrobora con el p-value de cada predictor, en ambos casos significativo.

confint(modelo)
##                   2.5 %      97.5 %
## (Intercept)  1.01630722 13.22108704
## edad         0.02622424  0.06929396
## maestros     0.88612720  1.39687963
## pobres      -1.05658552 -0.87334432
## airpYES     -1.59081312  0.36065255

2.3.2 ¿Es significativamente mejor el nuevo modelo?

No, no lo es.

En el caso del 2.2: El modelo precio ~ edad + maestros + pobres tiene un \(R^2\) de 0.6455

El nuevo modelo El nuevo modelo precio ~ edad + maestros + pobres + airp tiene un \(R^2\) de 0.6466

La diferencia es de 11 milesimas por lo que deducimos que la aportación del nuevo predictor no hace que el nuevo modelo sea significativamente mejor.

2.3.3 Efectuar una predicción del precio de la vivienda.

Para una vivienda cuyas características son:

age =70, teachers =15 , poor_prop =15, room_num =8, n_hos_beds=8, n_hot_rooms=100

Utilizar el modelo Model.2.2

mod_ampliado
## 
## Call:
## lm(formula = precio ~ edad + maestros + pobres + n_hab + n_camas_hosp + 
##     n_hab_hotel, data = datos_r)
## 
## Coefficients:
##  (Intercept)          edad      maestros        pobres         n_hab  
##   -25.702254      0.012137      0.872562     -0.565409      5.345747  
## n_camas_hosp   n_hab_hotel  
##     0.368501     -0.008945
summary(mod_ampliado)
## 
## Call:
## lm(formula = precio ~ edad + maestros + pobres + n_hab + n_camas_hosp + 
##     n_hab_hotel, data = datos_r)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -16.4983  -2.7555  -0.5749   2.2057  24.0474 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  -25.702254   3.901419  -6.588 1.15e-10 ***
## edad           0.012137   0.009914   1.224   0.2214    
## maestros       0.872562   0.114461   7.623 1.29e-13 ***
## pobres        -0.565409   0.050475 -11.202  < 2e-16 ***
## n_hab          5.345747   0.428993  12.461  < 2e-16 ***
## n_camas_hosp   0.368501   0.145950   2.525   0.0119 *  
## n_hab_hotel   -0.008945   0.004233  -2.113   0.0351 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4.738 on 491 degrees of freedom
## Multiple R-squared:  0.7375, Adjusted R-squared:  0.7343 
## F-statistic: 229.9 on 6 and 491 DF,  p-value: < 2.2e-16

Este resultado nos dice que el modelo de regresión múltiple obtenido explica el 73,75% de la variabilidad de los gastos de los ordenadores. Dado que está muy cerca del 100%, en principio es un buen modelo.

nuevo <- data.frame(edad=70,
                    maestros=15,
                    pobres=15,
                    n_hab=8,
                    n_camas_hosp=8,
                    n_hab_hotel=100)
nuevo

Ahora ya podemos usar la función predict para obtener lo solicitado.

cat('El precio previsto según las caracteristicas introducidos es de:', predict(object=mod_ampliado, newdata=nuevo))
## El precio previsto según las caracteristicas introducidos es de: 24.57419

2.3.4 Efectuar una verificación visual de las suposiciones de modelización.

Analiza los residuos del modelo. Comenta los resultados.

confint(mod_ampliado)
##                     2.5 %        97.5 %
## (Intercept)  -33.36779007 -1.803672e+01
## edad          -0.00734188  3.161672e-02
## maestros       0.64766788  1.097456e+00
## pobres        -0.66458297 -4.662355e-01
## n_hab          4.50285797  6.188637e+00
## n_camas_hosp   0.08173653  6.552656e-01
## n_hab_hotel   -0.01726172 -6.273575e-04
influencePlot(mod_ampliado)

Relación lineal entre los predictores numéricos y la variable dependiente:

ggplot(data = datos_r, aes(x = precio, y = mod_ampliado$residuals)) +
geom_point() +
geom_smooth(color = "firebrick") +
geom_hline(yintercept = 0) +
theme_bw()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Se satisface la condición de linealidad. Se aprecia un posible dato atípico.

Distribución normal de los residuos:

qqnorm(mod_ampliado$residuals)
qqline(mod_ampliado$residuals)

shapiro.test(mod_ampliado$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  mod_ampliado$residuals
## W = 0.92827, p-value = 1.066e-14

La condición de normalidad se satisface.

Variabilidad constante de los residuos:

ggplot(data = data.frame(predict_values = predict(mod_ampliado),
                         residuos = residuals(mod_ampliado)),
       aes(x = predict_values, y = residuos)) +
    geom_point() +
    geom_smooth(color = "firebrick", se = FALSE) +
    geom_hline(yintercept = 0) +
    theme_bw()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
bptest(mod_ampliado)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_ampliado
## BP = 31.895, df = 6, p-value = 1.709e-05

Autocorrelación

library(car)
dwt(mod_ampliado,alternative = "two.sided")
##  lag Autocorrelation D-W Statistic p-value
##    1       0.4202436      1.158229       0
##  Alternative hypothesis: rho != 0

Identificación de posibles valores atípicos o influyentes

library(car)
outlierTest(mod_ampliado)
##     rstudent unadjusted p-value Bonferroni p
## 143 5.313760         1.6334e-07   8.1344e-05
## 142 4.934432         1.1033e-06   5.4946e-04
## 140 4.648535         4.3039e-06   2.1434e-03
## 28  4.133623         4.2005e-05   2.0918e-02
## 46  3.922875         9.9994e-05   4.9797e-02

Tal como se apreció en el estudio de normalidad de los residuos, la observaciones 143,142,140, 28 y 46 tiene un residuo estandarizado >3 (más de 3 veces la desviación estándar de los residuos) por lo que se considera un dato atípico.

summary(influence.measures(mod_ampliado))
## Potentially influential observations of
##   lm(formula = precio ~ edad + maestros + pobres + n_hab + n_camas_hosp +      n_hab_hotel, data = datos_r) :
## 
##     dfb.1_ dfb.edad dfb.mstr dfb.pbrs dfb.n_hb dfb.n_c_ dfb.n_h_ dffit  
## 16  -0.03   0.22    -0.22    -0.15     0.20     0.12    -0.15     0.52_*
## 28   0.00  -0.19     0.18     0.46    -0.18    -0.05     0.00     0.79_*
## 46  -0.09  -0.12     0.13     0.38    -0.08     0.11     0.11     0.64_*
## 105 -0.10  -0.13    -0.08     0.09     0.18     0.10     0.04     0.25  
## 114  0.03  -0.12     0.05     0.25    -0.04    -0.11    -0.21     0.41_*
## 133 -0.04  -0.08    -0.09     0.07     0.28    -0.22    -0.22     0.46_*
## 137 -0.15   0.03     0.08     0.05     0.13     0.01    -0.04     0.20  
## 140  0.40   0.42    -0.28    -0.51    -0.14    -0.23    -0.29     0.74_*
## 141  0.14   0.35    -0.24    -0.37    -0.03     0.21    -0.21     0.64_*
## 142  0.41   0.55    -0.24    -0.68    -0.39     0.24    -0.28     0.89_*
## 143  0.49   0.51    -0.23    -0.76    -0.57     0.43    -0.31     1.04_*
## 147 -0.05   0.00     0.11     0.06    -0.04    -0.02     0.01     0.14  
## 154 -0.07  -0.12     0.07     0.33     0.02    -0.06     0.02     0.46_*
## 159 -0.12  -0.13     0.00     0.32     0.04     0.20     0.01     0.47_*
## 163 -0.03  -0.06    -0.08     0.06     0.10     0.05     0.00    -0.14  
## 166 -0.06  -0.03     0.11     0.12     0.01    -0.05    -0.08     0.19  
## 240  0.17   0.19    -0.05    -0.20    -0.17    -0.08     0.07     0.29  
## 257  0.06   0.05     0.04    -0.10    -0.08    -0.10     0.13     0.24  
## 266 -0.18  -0.19    -0.04     0.12     0.23     0.16     0.11     0.37_*
## 268 -0.24   0.08     0.13     0.04     0.15     0.09     0.11     0.28  
## 270 -0.02  -0.02     0.00     0.04     0.02     0.01     0.01     0.04  
## 275  0.08  -0.05     0.14    -0.08    -0.23    -0.05     0.17    -0.37_*
## 341  0.29  -0.06     0.32    -0.12    -0.66     0.01    -0.15    -0.78_*
## 400  0.05  -0.03    -0.07    -0.02    -0.03     0.04     0.04    -0.11  
## 401  0.01  -0.01    -0.02     0.00     0.00     0.00     0.01    -0.02  
## 402  0.16  -0.01     0.09    -0.13    -0.22    -0.12    -0.12    -0.32  
## 420  0.01   0.01    -0.12     0.00     0.03     0.06     0.19    -0.28  
##     cov.r   cook.d hat    
## 16   0.93_*  0.04   0.03  
## 28   0.83_*  0.09   0.04  
## 46   0.84_*  0.06   0.03  
## 105  1.04_*  0.01   0.05_*
## 114  1.01    0.02   0.04_*
## 133  0.91_*  0.03   0.02  
## 137  1.05_*  0.01   0.04_*
## 140  0.77_*  0.08   0.03  
## 141  0.84_*  0.06   0.03  
## 142  0.75_*  0.11   0.03  
## 143  0.71_*  0.15   0.04  
## 147  1.05_*  0.00   0.04  
## 154  0.93_*  0.03   0.03  
## 159  0.94_*  0.03   0.03  
## 163  1.05_*  0.00   0.04  
## 166  1.05_*  0.00   0.04_*
## 240  0.96_*  0.01   0.02  
## 257  0.91_*  0.01   0.01  
## 266  0.96    0.02   0.02  
## 268  1.04    0.01   0.05_*
## 270  1.06_*  0.00   0.04  
## 275  0.93_*  0.02   0.02  
## 341  0.88_*  0.08   0.04_*
## 400  1.04_*  0.00   0.03  
## 401  1.04_*  0.00   0.03  
## 402  0.94_*  0.01   0.02  
## 420  0.93_*  0.01   0.01
influencePlot(mod_ampliado)

3 Modelo de regresión logística

Se desea ajustar un modelo predictivo para predecir la expectativa que una vivienda sea vendida y conocer los factores influyentes en la predicción.

Convertir la variable Sold a tipo factor y recodificar los valores, asignando “Not” al 0 y “Yes” al 1.

Realizado anteriormente
# Muestro
str(datos_r$vendido)
##  Factor w/ 2 levels "NOT","YES": 1 1 1 1 1 1 1 1 1 1 ...

3.1 Regresores cuantitativos

3.1.1 Calcular

Estimar el modelo de regresión logística donde la variable dependiente es Sold y las explicativas price, age, poor_prop

modelo_glm <- glm(vendido ~ precio + edad + pobres , 
                  data = datos_r, family=binomial(link=logit))
summary(modelo_glm)
## 
## Call:
## glm(formula = vendido ~ precio + edad + pobres, family = binomial(link = logit), 
##     data = datos_r)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.7500  -1.0939  -0.4598   1.1186   1.9027  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  4.653279   0.728844   6.384 1.72e-10 ***
## precio      -0.141213   0.020957  -6.738 1.60e-11 ***
## edad         0.008381   0.004466   1.877   0.0606 .  
## pobres      -0.184457   0.029807  -6.188 6.08e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 686.12  on 497  degrees of freedom
## Residual deviance: 622.37  on 494  degrees of freedom
## AIC: 630.37
## 
## Number of Fisher Scoring iterations: 4

3.1.2 Interpretar

Acorde al modelo, el logaritmo de odds de que una vivienda se venda esta negativamente relacionado con el precio (coeficiente parcial = -0.141213), siento significativa esta relación (p-value = \(1.60^e-11\)).
También existe una relación significativa positiva entre el logaritmo de odds de si se vende una vivienda y la antigüedad de la vivienda (p-value = 0.0606), siendo, para un mismo resultado en el el precio y el nivel de pobres.
Y por último existe una relación significativa negativa entre el logaritmo de odds de sis se vende una vivienda y el nivel de pobres en la ciudad (coef. parcial = -0.184457), siendo el resto de variables (precio y edad)

Estima los odds ratio de las variables price, age, poor_prop mediante un intervalo de confianza del 95 % e interpreta los intervalos obtenidos. ¿Cuál sería el odds ratio de un quinquenio?

OR_precio=exp(modelo_glm$coefficients[2])
cat ('El Odd Ratio de precio es:', OR_precio, '\n')
## El Odd Ratio de precio es: 0.8683041
OR_edad=exp(modelo_glm$coefficients[3])
cat ('El Odd Ratio de edad es:', OR_edad, '\n')
## El Odd Ratio de edad es: 1.008416
OR_pobres=exp(modelo_glm$coefficients[4])
cat ('El Odd Ratio de pobres es:', OR_pobres, '\n')
## El Odd Ratio de pobres es: 0.831556

A continuación se calculan los odds asociados a estas variables explicativas:

exp( modelo_glm$coefficients[2:4])
##    precio      edad    pobres 
## 0.8683041 1.0084158 0.8315560

La interpretación de los OR son:

Aumentar en una unidad el precio implica que las odds de vender un inmueble se reduce en 0.8683041
Aumentar en una unidad la unidad, implica que las odds de vender un inmueble se multiplica por 1.0084158
Aumentar en una unidad el indice de pobreza implica que las odds de vender un inmueble se reduce en 0.8315560

Los intervalos de confianza del 95% de las variables son:

# En caso de querer los intervalos basados en el error estándar.
confint.default(modelo_glm)
##                     2.5 %     97.5 %
## (Intercept)  3.2247703068  6.0817871
## precio      -0.1822888846 -0.1001376
## edad        -0.0003723248  0.0171334
## pobres      -0.2428772425 -0.1260361

En el caso de un quinquenio, \(1.0084158^5\) = 1,042793243

Quiere decir que en caso de ausencia de variación del resto de variables, el incremento del precio durante un quinquenio se incrementaría en 1.042793243

3.2 Regresores cualitativos

3.2.1 Calcular

Estimar el modelo de regresión logística donde la variable dependiente es Sold y la explicativa airport

modelo_glm_cat <- glm(vendido ~ airp, 
                      data = datos_r, 
                      family=binomial(link=logit))
summary(modelo_glm_cat)
## 
## Call:
## glm(formula = vendido ~ airp, family = binomial(link = logit), 
##     data = datos_r)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.2440  -1.1661  -0.9322   1.1122   1.4443  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -0.6084     0.1389  -4.379 1.19e-05 ***
## airpYES       0.7637     0.1848   4.133 3.59e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 686.12  on 497  degrees of freedom
## Residual deviance: 668.67  on 496  degrees of freedom
## AIC: 672.67
## 
## Number of Fisher Scoring iterations: 4

3.2.2 Interpretar

Estima el odds ratio de la variable airport mediante un intervalo de confianza del 95 % e interpreta el intervalo obtenido.

OR_airporto=exp(modelo_glm_cat$coefficients[2])
cat ('El Odd Ratio de precio es:', OR_airporto, '\n')
## El Odd Ratio de precio es: 2.1462
# En caso de querer los intervalos basados en el error estándar.
confint.default(modelo_glm_cat)
##                  2.5 %     97.5 %
## (Intercept) -0.8807120 -0.3360999
## airpYES      0.4014922  1.1259054

En concreto los odds de que vivienda se venda son \(e^0.0.7637\)=2.14620249708 mayores en las ciudades con aeropuerto que en la ciudades que carecen de aeropuerto

3.3 Regresores cuantitativos y cualitativos

Estimar el modelo de regresión logística donde la variable dependiente es Sold y los regresores price, age, poor_prop y airport.

modelo_glm_3_3 <- glm(vendido ~ precio + edad + pobres + airp , 
                      data = datos_r, 
                      family = "binomial")
summary(modelo_glm_3_3)
## 
## Call:
## glm(formula = vendido ~ precio + edad + pobres + airp, family = "binomial", 
##     data = datos_r)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.8107  -1.0754  -0.3749   1.0927   1.9193  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  4.395205   0.766035   5.738 9.60e-09 ***
## precio      -0.150857   0.022600  -6.675 2.47e-11 ***
## edad         0.008713   0.004554   1.913   0.0557 .  
## pobres      -0.186309   0.030647  -6.079 1.21e-09 ***
## airpYES      0.827814   0.201191   4.115 3.88e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 686.12  on 497  degrees of freedom
## Residual deviance: 604.92  on 493  degrees of freedom
## AIC: 614.92
## 
## Number of Fisher Scoring iterations: 4

3.3.1 Interpretar

Estima los odds ratio de las variables regresoras mediante un intervalo de confianza del 95 % e interpreta los intervalos obtenidos. ¿Qué regresor tiene más impacto en la probabilidad de venta?

exp(coefficients(modelo_glm_3_3))
## (Intercept)      precio        edad      pobres     airpYES 
##  81.0612870   0.8599705   1.0087509   0.8300174   2.2883116

Aumentar en una unidad el precio implica que las odds de vender un inmueble se reduce en 0.8599705
Aumentar en una unidad la edad, implica que las odds de vender un inmueble se multiplica por 1.0087509
Aumentar en una unidad el indice de pobreza implica que las odds de vender un inmueble se reduce en 0.8300174
Las odds de vender un imueble es 2.2883116 veces en localidades con aeropuerto que en localidades sin aeropuerto.

exp(confint(modelo_glm_3_3))
## Waiting for profiling to be done...
##                  2.5 %      97.5 %
## (Intercept) 18.9517816 383.9704537
## precio       0.8209073   0.8970991
## edad         0.9998233   1.0178614
## pobres       0.7798545   0.8795700
## airpYES      1.5476997   3.4086467

3.3.2 Predicción de venta

Para una vivienda cuyas características son:

price = 20, age = 50, poor_prop = 50 y airport = YES.

nuevo <- data.frame(precio=20,
                    edad=50,
                    pobres=50,
                    airp="YES")
nuevo

Ahora ya podemos usar la función predict para obtener lo solicitado.

pred <- predict(modelo_glm_3_3, newdata = nuevo, type='response')
pred
##           1 
## 0.001261848

El modelo del apartado anterior nos predice con una probalilidad de inmueble vendido del 0.001261848 (0,12%) para un inmueble de precio 20, edad de 50, con un indice de pobres de 50 y contando con aeropuerto. Es una probabilidad muy baja

De otra manera:

glm.pred <- ifelse(pred > 0.5, "Se vendio", "No se vendio")
glm.pred
##              1 
## "No se vendio"

3.3.3 Estimación por resustitución de la precisión del modelo

Proporcionar la tabla de confusión correspondiente al modelo. Comenta los resultados.

predicted_value <- predict(modelo_glm_3_3,newdata = datos_r,type = "response")
predicted_class <- ifelse(predicted_value>0.5, "YES","NOT")
performance_data<-data.frame(observed=datos_r$vendido,predicted= predicted_class)
positive <- sum(performance_data$observed=="YES")
negative <- sum(performance_data$observed=="NOT")
predicted_positive <- sum(performance_data$predicted=="YES")
predicted_negative <- sum(performance_data$predicted=="NOT")
total <- nrow(performance_data)
data.frame(positive, negative,predicted_positive,predicted_negative)
tp<-sum(performance_data$observed=="YES" & performance_data$predicted=="YES")
tn<-sum(performance_data$observed=="NOT" & performance_data$predicted=="NOT")
fp<-sum(performance_data$observed=="NOT" & performance_data$predicted=="YES")
fn<-sum(performance_data$observed=="YES" & performance_data$predicted=="NOT")
data.frame(tp,tn,fp,fn)
accuracy <- (tp+tn)/total
error_rate <- (fp+fn)/total
sensitivity <- tp/positive
especificity <- tn/negative
precision <- tp/predicted_positive
npv <- tn / predicted_negative
data.frame(accuracy,error_rate,sensitivity,especificity,precision,npv)

3.3.4 Visualización

Para los distintos valores de la variable price = c(20,30,40) se representaran las tres series de probabilidades de venta en un mismo gráfico de dispersión XY. En concreto, para cada valor de price, se tomarán los valores fijos de age =50, airport = “YES”, y se representarán las probabilidades de venta (eje Y) para los valores de poor_prop = c(5,25,35,50,65) (eje X).

nuevos_datos <- data.frame(precio=c(20,30,40,0,0),
                    edad=50,
                    pobres=c(5,25,35,50,65),
                    airp="YES")
nuevos_datos
prob_nuevo <- predict(modelo_glm_3_3, nuevos_datos, type="response")
glm.pred_nuevo <- ifelse(prob_nuevo > 0.5, "Se vendio", "No se vendio")
glm.pred_nuevo
##              1              2              3              4              5 
##    "Se vendio" "No se vendio" "No se vendio" "No se vendio" "No se vendio"
poor_prop = c(5,25,35,50,65)
plot(poor_prop,prob_nuevo)

Comenta el gráfico obtenido.

Podemos afirmar que solo se vendio el inmueble cuando el nivel de pobreza es de 5. Para el resto de niveles, no se vendio el inmueble.

4 Conclusión

Recopilar las conclusiones alcanzadas en los apartados 2.1, 2.2, 2.3, 3.1, 3.2 y 3.3. En cada caso, puedes acompañar tus conclusiones con los niveles de confianza y/o los p-valores correspondientes.

4.0.0.1 Apartados 2.1

Estimar por mínimos cuadrados ordinarios dos modelos lineales que expliquen la variable price, uno en función de la variable teachers y otro en función de la variable poor_prop.

cat('El modelo lineal que explique la variable price en función de teachers :')
## El modelo lineal que explique la variable price en función de teachers :
mod1
## 
## Call:
## lm(formula = precio ~ maestros, data = datos_r)
## 
## Coefficients:
## (Intercept)     maestros  
##     -27.734        2.344
ggplot(datos_r, aes(x = maestros, y = precio)) + geom_point() + geom_smooth(method = "lm", formula = y ~ x, level=0.95)

# cor.test correlación Pearson con prueba de hipótesis
cor.test(datos_r$maestros,datos_r$precio)
## 
##  Pearson's product-moment correlation
## 
## data:  datos_r$maestros and datos_r$precio
## t = 14.17, df = 496, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.4711647 0.5965372
## sample estimates:
##       cor 
## 0.5368077

Para un nivel de confianza del 95% y un nivel de significación de 0.05, el p-value de 2.2\(e-16\), inferior a \(α\) podemos decir que tenemos un resultado estadisticamente significativo.

cat('El modelo lineal que explique la variable price en función de poor_prop :')
## El modelo lineal que explique la variable price en función de poor_prop :
mod2
## 
## Call:
## lm(formula = precio ~ pobres, data = datos_r)
## 
## Coefficients:
## (Intercept)       pobres  
##     34.8972      -0.9919
cat('El modelo con un nivel de confianza del 95% :')
## El modelo con un nivel de confianza del 95% :
ggplot(datos_r, aes(x = pobres, y = precio)) + geom_point() + geom_smooth(method = "lm", formula = y ~ x, level=0.95)

# cor.test correlación Pearson con prueba de hipótesis
cor.test(datos_r$pobres,datos_r$precio)
## 
##  Pearson's product-moment correlation
## 
## data:  datos_r$pobres and datos_r$precio
## t = -26.138, df = 496, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.7958054 -0.7215544
## sample estimates:
##        cor 
## -0.7611629

Para un nivel de confianza del 95% y un nivel de significación de 0.05, el p-value de 2.2\(e-16\), inferior a \(α\) podemos decir que tenemos un resultado estadisticamente significativo.

4.0.0.2 Apartados 2.2

cat('El modelo ineal que explique la variable price en función de
age, teachers, poor_prop: ')
## El modelo ineal que explique la variable price en función de
## age, teachers, poor_prop:
summary(mod)
## 
## Call:
## lm(formula = precio ~ edad + maestros + pobres, data = datos_r)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -12.8713  -3.4091  -0.5932   2.0033  19.7464 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  6.74488    3.09285   2.181   0.0297 *  
## edad         0.04808    0.01096   4.385 1.42e-05 ***
## maestros     1.14016    0.13004   8.768  < 2e-16 ***
## pobres      -0.96123    0.04656 -20.645  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.489 on 494 degrees of freedom
## Multiple R-squared:  0.6455, Adjusted R-squared:  0.6434 
## F-statistic: 299.9 on 3 and 494 DF,  p-value: < 2.2e-16

En este apartado, para un nivel de confianza del 95% y un nivel de significación de 0.05, el p-value de 2.2\(e-16\), inferior a \(α\) podemos decir que tenemos un resultado estadisticamente significativo. #### Apartados 2.3

cat('El modelo ineal que explique la variable price en función de
age, teachers, poor_prop, airport')
## El modelo ineal que explique la variable price en función de
## age, teachers, poor_prop, airport
summary(modelo)
## 
## Call:
## lm(formula = precio ~ edad + maestros + pobres + airp, data = datos_r)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -12.5911  -3.5134  -0.6715   2.0863  19.3873 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  7.11870    3.10588   2.292   0.0223 *  
## edad         0.04776    0.01096   4.357  1.6e-05 ***
## maestros     1.14150    0.12998   8.782  < 2e-16 ***
## pobres      -0.96496    0.04663 -20.694  < 2e-16 ***
## airpYES     -0.61508    0.49661  -1.239   0.2161    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.486 on 493 degrees of freedom
## Multiple R-squared:  0.6466, Adjusted R-squared:  0.6438 
## F-statistic: 225.5 on 4 and 493 DF,  p-value: < 2.2e-16

Para este modelo para un nivel de confianza del 95% y un nivel de significación de 0.05, las variables edad, maestros, pobres tienen un p-value inferior a \(α\) podemos decir que tenemos un resultado estadisticamente significativo. En cambio para la variable aeropuerto=SI, el p-value es de 0.2161(este no es estadisticamente significativo)

4.0.0.3 Apartados 3.1

cat('El modelo de regresión logística donde la variable dependiente es Sold y las explicativas price, age, poor_prop')
## El modelo de regresión logística donde la variable dependiente es Sold y las explicativas price, age, poor_prop
summary(modelo_glm)
## 
## Call:
## glm(formula = vendido ~ precio + edad + pobres, family = binomial(link = logit), 
##     data = datos_r)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.7500  -1.0939  -0.4598   1.1186   1.9027  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  4.653279   0.728844   6.384 1.72e-10 ***
## precio      -0.141213   0.020957  -6.738 1.60e-11 ***
## edad         0.008381   0.004466   1.877   0.0606 .  
## pobres      -0.184457   0.029807  -6.188 6.08e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 686.12  on 497  degrees of freedom
## Residual deviance: 622.37  on 494  degrees of freedom
## AIC: 630.37
## 
## Number of Fisher Scoring iterations: 4

En este modelo para un nivel de confianza del 95% y un nivel de significación de 0.05, las variables precio y pobres son estadisticamente significativa y edad no lo es.

4.0.0.4 Apartados 3.2

cat('El modelo de regresión logística donde la variable dependiente es Sold y la explicativa airport:')
## El modelo de regresión logística donde la variable dependiente es Sold y la explicativa airport:
summary(modelo_glm_cat)
## 
## Call:
## glm(formula = vendido ~ airp, family = binomial(link = logit), 
##     data = datos_r)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.2440  -1.1661  -0.9322   1.1122   1.4443  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -0.6084     0.1389  -4.379 1.19e-05 ***
## airpYES       0.7637     0.1848   4.133 3.59e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 686.12  on 497  degrees of freedom
## Residual deviance: 668.67  on 496  degrees of freedom
## AIC: 672.67
## 
## Number of Fisher Scoring iterations: 4
ggplot(datos_r, aes(x = airp, y = vendido)) + geom_point() + geom_smooth(method = "glm", formula = y ~ x, level=0.95)

En este modelo para un nivel de confianza del 95% y un nivel de significación de 0.05, las variables aeropuerto=“Si” es estadisticamente significativa.

4.0.0.5 Apartados 3.3

cat('El modelo de regresión logística donde la variable dependiente es Sold y los regresores price, age, poor_prop y airport.')
## El modelo de regresión logística donde la variable dependiente es Sold y los regresores price, age, poor_prop y airport.
summary(modelo_glm_3_3)
## 
## Call:
## glm(formula = vendido ~ precio + edad + pobres + airp, family = "binomial", 
##     data = datos_r)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.8107  -1.0754  -0.3749   1.0927   1.9193  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  4.395205   0.766035   5.738 9.60e-09 ***
## precio      -0.150857   0.022600  -6.675 2.47e-11 ***
## edad         0.008713   0.004554   1.913   0.0557 .  
## pobres      -0.186309   0.030647  -6.079 1.21e-09 ***
## airpYES      0.827814   0.201191   4.115 3.88e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 686.12  on 497  degrees of freedom
## Residual deviance: 604.92  on 493  degrees of freedom
## AIC: 614.92
## 
## Number of Fisher Scoring iterations: 4
ggplot(datos_r, aes(x = vendido, y = precio, z = edad, w = pobres)) + geom_point() + geom_smooth(method = "glm", formula = y ~ x + z + w, level=0.95)

En este modelo para un nivel de confianza del 95% y un nivel de significación de 0.05, las variables precio, pobres y aeropuerto=“Si” son estadisticamente significativa y edad no lo es.

5 Referencias: