A continuación se pretende realizar un análisis descriptivo del dataset Airbnb tomado da la plataforma Kaggle.
Para ello, primero realizaremos la importación de las librerias necesarias para el este proceso:
library(readr) #Leer archivos excel
library(psych) #Librería para análisis esrtadístico
library(ggplot2) # Librería para representación gráfica de datos
##
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
library(tidyverse) #Librería con diversas herramientas
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ stringr 1.5.1
## ✔ forcats 1.0.0 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ ggplot2::%+%() masks psych::%+%()
## ✖ ggplot2::alpha() masks psych::alpha()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(nortest) #Verificar si una variable tiene dist. normal
library(plotly) #Añadir valores en la gráfica
##
## Attaching package: 'plotly'
##
## The following object is masked from 'package:ggplot2':
##
## last_plot
##
## The following object is masked from 'package:stats':
##
## filter
##
## The following object is masked from 'package:graphics':
##
## layout
Importamos el archivo CSV de la ruta local, y filtramos el dataset por las variables relevantes para el propósito de este análisis descriptivo:
Airbnb <- data.frame(read.csv("C:/Users/ASUS/OneDrive/Escritorio/ESEIT/Matemáticas para Big Data/Airbnb_Data.csv"))
Airbnb <- select(Airbnb, c(2:4,6:10,25,28,29))
Realizamos una primera visualización general de los datos, usando las funciones summary y describe, que permiten conocer el tipo de variables y las principales medidas de tendencia central:
summary(Airbnb)
## log_price property_type room_type accommodates
## Min. :0.000 Length:74111 Length:74111 Min. : 1.000
## 1st Qu.:4.317 Class :character Class :character 1st Qu.: 2.000
## Median :4.710 Mode :character Mode :character Median : 2.000
## Mean :4.782 Mean : 3.155
## 3rd Qu.:5.220 3rd Qu.: 4.000
## Max. :7.600 Max. :16.000
##
## bathrooms bed_type cancellation_policy cleaning_fee
## Min. :0.000 Length:74111 Length:74111 Length:74111
## 1st Qu.:1.000 Class :character Class :character Class :character
## Median :1.000 Mode :character Mode :character Mode :character
## Mean :1.235
## 3rd Qu.:1.000
## Max. :8.000
## NA's :200
## review_scores_rating bedrooms beds
## Min. : 20.00 Min. : 0.000 Min. : 0.000
## 1st Qu.: 92.00 1st Qu.: 1.000 1st Qu.: 1.000
## Median : 96.00 Median : 1.000 Median : 1.000
## Mean : 94.07 Mean : 1.266 Mean : 1.711
## 3rd Qu.:100.00 3rd Qu.: 1.000 3rd Qu.: 2.000
## Max. :100.00 Max. :10.000 Max. :18.000
## NA's :16722 NA's :91 NA's :131
describe(Airbnb)
## vars n mean sd median trimmed mad min max range
## log_price 1 74111 4.78 0.72 4.71 4.75 0.68 0 7.6 7.6
## property_type* 2 74111 6.77 8.62 1.00 5.50 0.00 1 35.0 34.0
## room_type* 3 74111 1.47 0.55 1.00 1.43 0.00 1 3.0 2.0
## accommodates 4 74111 3.16 2.15 2.00 2.82 1.48 1 16.0 15.0
## bathrooms 5 73911 1.24 0.58 1.00 1.10 0.00 0 8.0 8.0
## bed_type* 6 74111 4.94 0.42 5.00 5.00 0.00 1 5.0 4.0
## cancellation_policy* 7 74111 2.14 0.85 2.00 2.17 1.48 1 5.0 4.0
## cleaning_fee* 8 74111 1.73 0.44 2.00 1.79 0.00 1 2.0 1.0
## review_scores_rating 9 57389 94.07 7.84 96.00 95.53 5.93 20 100.0 80.0
## bedrooms 10 74020 1.27 0.85 1.00 1.17 0.00 0 10.0 10.0
## beds 11 73980 1.71 1.25 1.00 1.44 0.00 0 18.0 18.0
## skew kurtosis se
## log_price 0.51 0.66 0.00
## property_type* 1.05 -0.32 0.03
## room_type* 0.62 -0.69 0.00
## accommodates 2.23 7.43 0.01
## bathrooms 3.69 22.23 0.00
## bed_type* -7.39 57.60 0.00
## cancellation_policy* -0.24 -1.53 0.00
## cleaning_fee* -1.06 -0.88 0.00
## review_scores_rating -3.38 20.02 0.03
## bedrooms 1.99 7.58 0.00
## beds 3.36 19.72 0.00
A continuación, seleccionamos cuatro variables que consideramos relevantes para poder analizar el tipo de propiedades disponíbles en Airbnb, segmentados por el número máximo de personas que puede hospedar, el tipo de política de cancelación, y la calificación otorgada por los reviews de los usuários:
Table_Property_Type <- table(Airbnb$property_type)
Table_Accommodates <- table(Airbnb$accommodates)
Table_Cancellation_Policy <- table(Airbnb$cancellation_policy)
Table_Review_Scores <- table(Airbnb$review_scores_rating)
Table_Property_Type
##
## Apartment Bed & Breakfast Boat Boutique hotel
## 49003 462 65 69
## Bungalow Cabin Camper/RV Casa particular
## 366 72 94 1
## Castle Cave Chalet Condominium
## 13 2 6 2658
## Dorm Earth House Guest suite Guesthouse
## 142 4 123 498
## Hostel House Hut In-law
## 70 16511 8 71
## Island Lighthouse Loft Other
## 1 1 1244 607
## Parking Space Serviced apartment Tent Timeshare
## 1 21 18 77
## Tipi Townhouse Train Treehouse
## 3 1692 2 7
## Vacation home Villa Yurt
## 11 179 9
Table_Accommodates
##
## 1 2 3 4 5 6 7 8 9 10 11 12 13
## 9434 31854 7794 12066 3444 4969 946 1795 270 701 79 264 36
## 14 15 16
## 104 54 301
Table_Cancellation_Policy
##
## flexible moderate strict super_strict_30 super_strict_60
## 22545 19063 32374 112 17
Table_Review_Scores
##
## 20 27 30 35 40 47 49 50 53 54 55 56 57
## 97 2 4 1 90 5 1 30 10 1 3 1 3
## 58 60 62 63 64 65 66 67 68 69 70 71 72
## 1 444 3 11 10 28 3 66 20 13 196 14 38
## 73 74 75 76 77 78 79 80 81 82 83 84 85
## 157 39 101 76 74 94 83 2163 126 211 403 438 625
## 86 87 88 89 90 91 92 93 94 95 96 97 98
## 512 1119 1056 1120 2852 1615 2064 3647 2618 3713 4081 4087 4374
## 99 100
## 2631 16215
Creamos una tabla con las frecuencias relativas de las variables mencionadas encima:
Freq_Rel_Property_Type <- prop.table(Table_Property_Type)
Freq_Rel_Table_Accommodates<- prop.table(Table_Accommodates)
Freq_Rel_Table_Cancellation_Policy <- prop.table(Table_Cancellation_Policy)
Freq_Rel_Table_Review_Scores <- prop.table(Table_Review_Scores)
Freq_Rel_Property_Type
##
## Apartment Bed & Breakfast Boat Boutique hotel
## 6.612109e-01 6.233892e-03 8.770628e-04 9.310359e-04
## Bungalow Cabin Camper/RV Casa particular
## 4.938538e-03 9.715157e-04 1.268368e-03 1.349327e-05
## Castle Cave Chalet Condominium
## 1.754126e-04 2.698655e-05 8.095964e-05 3.586512e-02
## Dorm Earth House Guest suite Guesthouse
## 1.916045e-03 5.397309e-05 1.659673e-03 6.719650e-03
## Hostel House Hut In-law
## 9.445292e-04 2.227874e-01 1.079462e-04 9.580224e-04
## Island Lighthouse Loft Other
## 1.349327e-05 1.349327e-05 1.678563e-02 8.190417e-03
## Parking Space Serviced apartment Tent Timeshare
## 1.349327e-05 2.833587e-04 2.428789e-04 1.038982e-03
## Tipi Townhouse Train Treehouse
## 4.047982e-05 2.283062e-02 2.698655e-05 9.445292e-05
## Vacation home Villa Yurt
## 1.484260e-04 2.415296e-03 1.214395e-04
Freq_Rel_Table_Accommodates
##
## 1 2 3 4 5 6
## 0.1272955432 0.4298147374 0.1051665745 0.1628098393 0.0464708343 0.0670480765
## 7 8 9 10 11 12
## 0.0127646368 0.0242204261 0.0036431839 0.0094587848 0.0010659686 0.0035622242
## 13 14 15 16
## 0.0004857578 0.0014033005 0.0007286368 0.0040614754
Freq_Rel_Table_Cancellation_Policy
##
## flexible moderate strict super_strict_30 super_strict_60
## 0.3042058534 0.2572222747 0.4368312396 0.0015112466 0.0002293857
Freq_Rel_Table_Review_Scores
##
## 20 27 30 35 40 47
## 1.690219e-03 3.484988e-05 6.969977e-05 1.742494e-05 1.568245e-03 8.712471e-05
## 49 50 53 54 55 56
## 1.742494e-05 5.227483e-04 1.742494e-04 1.742494e-05 5.227483e-05 1.742494e-05
## 57 58 60 62 63 64
## 5.227483e-05 1.742494e-05 7.736674e-03 5.227483e-05 1.916744e-04 1.742494e-04
## 65 66 67 68 69 70
## 4.878984e-04 5.227483e-05 1.150046e-03 3.484988e-04 2.265242e-04 3.415289e-03
## 71 72 73 74 75 76
## 2.439492e-04 6.621478e-04 2.735716e-03 6.795727e-04 1.759919e-03 1.324296e-03
## 77 78 79 80 81 82
## 1.289446e-03 1.637945e-03 1.446270e-03 3.769015e-02 2.195543e-03 3.676663e-03
## 83 84 85 86 87 88
## 7.022252e-03 7.632125e-03 1.089059e-02 8.921570e-03 1.949851e-02 1.840074e-02
## 89 90 91 92 93 94
## 1.951594e-02 4.969593e-02 2.814128e-02 3.596508e-02 6.354876e-02 4.561850e-02
## 95 96 97 98 99 100
## 6.469881e-02 7.111119e-02 7.121574e-02 7.621670e-02 4.584502e-02 2.825454e-01
Una vez que verificamos la tabla de frecuencia absoluta y relativa de los datos en las cuatro variables analizadas, procedemos a realizar la visualización de datos por medio de una representación gráfica en histogramas:
1. Histogramas de variables cuantitativas
#Histogramas de variables cuantitativas
hist(Airbnb$accommodates)
hist(Airbnb$review_scores_rating)
El histograma de review score rating, permitió visualizar que esta
variable tiene un sesgo hacia la izquierda, debido a que la mayoría de
los datos se encuentras concentrados en la parte derecha del histograma.
Esto permite evidenciar que en promedio se obtienen calificacións más
positivas en los score reviews analizados en este dataset.
Por otra parte, el histograma de acomodaciones, permitió verificar que esta variable tiene un sesgo hacia la derecha, debido a que la mayoría de los datos se encuentras concentrados en la parte izquierda del histograma. lo cual refleja que en promedio las propiedades tienen capacidad máxima de entre 1 y 5 personas.
2. Histogramas de variables cuantitativas
Ahora analizaremos la variable central del dataset, property type:
# Crear el histograma para property type usando GGPLOT2
ggplot(Airbnb, aes(x=property_type)) +
geom_histogram(stat = "count")+
labs(x= "Property type", y= "número de propiedades",
title= "número de propiedades por categoría") +
theme(axis.text.x = element_text(angle = 80, hjust = 1, vjust = 1))
## Warning in geom_histogram(stat = "count"): Ignoring unknown parameters:
## `binwidth`, `bins`, and `pad`
Al graficar todos los datos, se evidenció que existen datos con una frecuencia relativa muy baja que consideramos no relevantes para el estudio, por lo cual pasamos a definir un umbral mínimo de frecuencia relatíva mayor a 0.5%.
Freq_Rel_Property_Type <- names(Freq_Rel_Property_Type[as.numeric(Freq_Rel_Property_Type) > 0.005])
Con base en este filtro por umbral, se determinó que existen 8 categorías relevantes dentro de la variable property type:
# Lista de categorías específicas
categorias_interes <- c("Apartment", "Bed & Breakfast", "Condominium", "Guesthouse", "House", "Loft", "Other", "Townhouse")
# Filtrar el data frame para incluir solo estas categorías
Property_Type_RV <- Airbnb[Airbnb$property_type %in% categorias_interes, ]
Procedemos a calcular nuevamente la frecuncia absoluta de las categoría que consideramos relevantes y creamos un nuevo histograma:
# Calcular las frecuencias absolutas
Table_Property_Type_RV <- table(Property_Type_RV$property_type)
# Crear el histograma de frecuencias absolutas
ggplot(Property_Type_RV, aes(x = property_type)) +
geom_bar(fill = "skyblue") +
labs(title = "Frecuencias Absolutas de Property Types en Airbnb",
x = "Property Type",
y = "Frecuencia Absoluta") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Ahora procedemos a realizar un análisis descriptivo de la variable cancellation policy:
ggplot(Airbnb, aes(x = cancellation_policy)) +
geom_bar(fill = "skyblue") +
labs(title = "Frecuencias Absolutas de Cancellation Policy en Airbnb",
x = "Property Type",
y = "Frecuencia Absoluta") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Esta variable solamente contiene 5 posibles valores, de los cuáles solamente tres políticas son tienen valores con probabilidad de frecuencia alta, por lo cual este tipo de variable es más útil para segmentar la varible principal en relación a la política de cancelación como se puede ver en el siguiente histograma que relaciona las dos variables:
property_type_cancellation_policy<- ggplot(Property_Type_RV, aes(x = property_type, fill = cancellation_policy)) +
geom_bar(position = "dodge") + # Utiliza 'dodge' para separar las barras por colores
labs(title = "Frecuencias Absolutas de Property Types en Airbnb segmentados por política de cancelación",
x = "Property Type",
y = "Frecuencia Absoluta",
fill = "Cancellation Policy") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
ggplotly(property_type_cancellation_policy)
Procedemos a verificar las medidas de tendencia central para las variables numéricas hallando la media, la mediana y la desviación estándar:
mean_Accommodates <- mean(Airbnb$accommodates)
mean_Review_Scores <- mean(Airbnb$review_scores_rating)
std_Accommodates <- sd(Airbnb$accommodates)
std_Review_Scores <- sd(Airbnb$review_scores_rating)
median_Accommodates <- median(Airbnb$accommodates)
median_Review_Scores <- median(Airbnb$review_scores_rating)
Primero, procedemos a realizar un test de Kolmogorov para verificar si las variables cuantitativas tienen una distribución normal:
lillie.test(Airbnb$accommodates)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: Airbnb$accommodates
## D = 0.26126, p-value < 2.2e-16
lillie.test(Airbnb$review_scores_rating)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: Airbnb$review_scores_rating
## D = 0.22451, p-value < 2.2e-16
Usando el test de Kolmogorov, se pudo identificar que ninguna de las variables cuantitativas siguen una distribución normal debido a que el P value es muy inferior a 0.05, por lo cual, vamos a proceder a realizar un análisis usando el teorema del límite central, creando mil subgrupos de 30 datos cada uno.
Análisis del teorema del límite central para la variable accommodates.
accommodates <- Airbnb$accommodates
# Número de subgrupos
num_subgroups <- 1000
# Tamaño de cada subgrupo
subgroup_size <- 30
# Inicializar un vector para almacenar las medias de los subgrupos
subgroup_means_accommodates <- numeric(num_subgroups)
set.seed(123) # Fijar la semilla para reproducibilidad
# Crear los subgrupos y calcular sus medias seleccionar una muestra aleatoria de tamaño subgroup_size y calcular la media de la muestra.
for (i in 1:num_subgroups) {
sample_data <- sample(accommodates, subgroup_size, replace = TRUE)
subgroup_means_accommodates[i] <- mean(sample_data)
}
# Analizar la distribución de las medias de los subgrupos
# Puedes usar histogramas y pruebas de normalidad
hist(subgroup_means_accommodates, breaks = 30, main = "Distribución de las Medias de los Subgrupos", xlab = "Medias de los Subgrupos")
Con base en este análisis del teorema del limite central tomando una
muestra de 1000 subconjuntos de 30 datos, se pudo evidenciar en el
histograma que en promedio, la mayoría de las propiedades acomodan a lo
sumo entre 3 y 4 personas.
# Prueba de normalidad sobre las medias de los subgrupos
lillie.test(subgroup_means_accommodates)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: subgroup_means_accommodates
## D = 0.062925, p-value = 5.31e-10
shapiro.test(subgroup_means_accommodates)
##
## Shapiro-Wilk normality test
##
## data: subgroup_means_accommodates
## W = 0.99043, p-value = 4.26e-06
#Analisar con el profe por qué el shapiro test
Análisis del teorema del límite central para la variable reviews score.
review_scores_rating <- na.omit(Airbnb$review_scores_rating)
# Inicializar un vector para almacenar las medias de los subgrupos
subgroup_means_reviews <- numeric(num_subgroups)
set.seed(123) # Fijar la semilla para reproducibilidad
# Crear los subgrupos y calcular sus medias seleccionar una muestra #aleatoria de tamaño subgroup_size, calcular la media de la muestra y #almacenandola.
for (i in 1:num_subgroups) {
sample_data <- sample(review_scores_rating, subgroup_size, replace = TRUE)
subgroup_means_reviews[i] <- mean(sample_data)
}
# Analizar la distribución de las medias de los subgrupos
# Puedes usar histogramas y pruebas de normalidad
hist(subgroup_means_reviews, breaks = 30, main = "Distribución de las Medias de los Subgrupos", xlab = "Medias de los Subgrupos")
# Prueba de normalidad sobre las medias de los subgrupos
lillie.test(subgroup_means_reviews)
##
## Lilliefors (Kolmogorov-Smirnov) normality test
##
## data: subgroup_means_reviews
## D = 0.059117, p-value = 9.104e-09
shapiro.test(subgroup_means_reviews)
##
## Shapiro-Wilk normality test
##
## data: subgroup_means_reviews
## W = 0.97246, p-value = 7.782e-13
#Analisar con el profe por qué el shapiro test
Con base en este análisis del teorema del limite central tomando una muestra de 1000 subconjuntos de 30 datos, se pudo evidenciar en este histograma que en promedio, la mayoría de las propiedades tienen una calificación otorgado por los reviews de los usuários de entre 93 y 96, cual indica el promedio del grado de satisfacción de los clientes es alto.
PREGUNTA: Por qué al realizar los teste de Kolmogorov e Shapiro en estas muestras de TLC, se obtuvo valores inferiores a 0.05%, cuando los histógramas muestran una distribución normal?
Probabilidades
Hallar la probabilidad con base en los promedios, de que a lo sumo sean tres personas las que pueden acomodar en la propriedad:
Análisis de probabilidad de variable acomodación:
Conclusiones de la variable accommodates:
#Hallar media de promedios de subgrupos de accommodates
mean_accommodates_tlc <- mean(subgroup_means_accommodates)
std_accommodates_tlc <- sd(subgroup_means_accommodates)
probabilidad_3_ocupantes <- pnorm(3 , mean_accommodates_tlc, std_accommodates_tlc )
cat("En promedio, la probabilidad de que sean a lo sumo 3 ocupantes es igual a ",
probabilidad_3_ocupantes,"\n")
## En promedio, la probabilidad de que sean a lo sumo 3 ocupantes es igual a 0.3480001
probabilidad_4_ocupantes <- pnorm(4 , mean_accommodates_tlc, std_accommodates_tlc )
cat("En promedio, la probabilidad de que sean a lo sumo 4 ocupantes es igual a ",
probabilidad_4_ocupantes,"\n")
## En promedio, la probabilidad de que sean a lo sumo 4 ocupantes es igual a 0.9855111
probabilidad_entre_3_y_4_ocupantes <- probabilidad_4_ocupantes - probabilidad_3_ocupantes
cat("En promedio, la probabilidad de que sean a entre 3 y 4 ocupantes es igual a ",
probabilidad_entre_3_y_4_ocupantes)
## En promedio, la probabilidad de que sean a entre 3 y 4 ocupantes es igual a 0.6375111
Análisis de probabilidad de variable reviews:
Conclusiones de la variable reviews:
#Hallar media de promedios de subgrupos de reviews
mean_reviews_tlc <- mean(subgroup_means_reviews)
std_reviews_tlc <- sd(subgroup_means_reviews)
probabilidad_review_menor_a_92 <- pnorm(92 ,mean_reviews_tlc, std_reviews_tlc )
cat("En promedio,la probabilidad de que la calificación del review de los usuarios sea menor a 96 es igual a ",
probabilidad_review_menor_a_92,"\n")
## En promedio,la probabilidad de que la calificación del review de los usuarios sea menor a 96 es igual a 0.07091369
probabilidad_review_menor_a_96 <- pnorm(96 , mean_accommodates_tlc, std_accommodates_tlc )
cat("En promedio, la probabilidad de que la calificación del review de los usuarios sea menor a 96 es igual a ",
probabilidad_review_menor_a_96,"\n")
## En promedio, la probabilidad de que la calificación del review de los usuarios sea menor a 96 es igual a 1
probabilidad_entre_92_y_96 <- probabilidad_review_menor_a_96 - probabilidad_review_menor_a_92
cat("En promedio, la probabilidad de que la calificación del review de los usuarios este entre 92 y 96 es igual a ",
probabilidad_entre_92_y_96)
## En promedio, la probabilidad de que la calificación del review de los usuarios este entre 92 y 96 es igual a 0.9290863