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) |
• 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.
. 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 %)
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.
# 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"
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)
| 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 | ▃▇▆▂▁ |
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)
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")
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
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.
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 \(β\):
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()
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 β:
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.
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.
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\]
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
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.
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.
Queremos conocer en qué medida el modelo anterior (Modelo 2.2) se ve afectado por la inclusión de la variable airport.
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
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.
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
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)
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 ...
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
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
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
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
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
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
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"
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)
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.
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.
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.
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)
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.
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.
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.
A. (2019, 5 diciembre). Creating a logistic regression model to predict claims. RStudio Community. https://community.rstudio.com/t/creating-a-logistic-regression-model-to-predict-claims/46519/3Alice, M. (2018, 24 junio).
How to Perform a Logistic Regression in R. DataScience+. https://datascienceplus.com/perform-logistic-regression-in-r/Dominguez-Lara, S. A. (2018, 1 enero).
El odds ratio y su interpretación como magnitud del efecto en investigación | Educación Médica. Odds Ratio. https://www.elsevier.es/es-revista-educacion-medica-71-articulo-el-odds-ratio-su-interpretacion-S1575181317300360Hernández, F. (2020a, septiembre 21).
20 Prueba de hipótesis | Manual de R. Manual de R. https://fhernanb.github.io/Manual-de-R/ph.htmlHernández, F. (2020b, octubre 30).
2 Regresión lineal múltiple | Modelos de Regresión con R. libro de regresión. https://fhernanb.github.io/libro_regresion/rlm.html#modelo-estad%C3%ADstico-1Hernández, F. (2020c, octubre 30).
5 Intervalos de confianza | Modelos de Regresión con R. Intervalos de confianza. https://fhernanb.github.io/libro_regresion/ic.htmlPrabhakaran, S. (2019, 15 agosto).
Logistic Regression - A Complete Tutorial with Examples in R. ML+. https://www.machinelearningplus.com/machine-learning/logistic-regression-tutorial-examples-r/RPubs - RegresiÃ3n Lineal MÃoltiple en R. (2016, 11 noviembre).
Regresión logistica. https://www.rpubs.com/Joaquin_AR/226291RPubs - RegresiÃ3n logÃstica en R. (2016, 23 noviembre).
Regresión logistica. https://rpubs.com/Joaquin_AR/229736
Coeficiente de determinación corregido o R-cuadrado ajustado | Welcome to the Jungle. (s. f.). Coeficiente determinación. http://www.ericmelillanca.cl/content/coeficiente-determinaci-n-corregido-o-r-cuadrado-ajustadoSanjuán, F. J. M. (2018, 7 noviembre).
R cuadrado ajustado (Coeficiente de determinación ajustado). Economipedia. https://economipedia.com/definiciones/r-cuadrado-ajustado-coeficiente-de-determinacion-ajustado.html