ANÁLISIS DESCRIPTIVO

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)

ANÁLISIS PROBABILÍSTICO

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