Descripción del problema

Una empresa inmobiliaria líder en una gran ciudad está buscando comprender en profundidad el mercado de viviendas urbanas para tomar decisiones estratégicas más informadas. La empresa posee una base de datos extensa que contiene información detallada sobre diversas propiedades residenciales disponibles en el mercado. Se requiere realizar un análisis holístico de estos datos para identificar patrones, relaciones y segmentaciones relevantes que permitan mejorar la toma de decisiones en cuanto a la compra, venta y valoración de propiedades.

Solución

Parte 1: Instalación del set de datos

# devtools::install_github("dgonxalex80/paqueteMODELOS", force = TRUE)
library(paqueteMODELOS)
vivienda
## # A tibble: 8,322 × 13
##       id zona   piso  estrato preciom areaconst parqueaderos banios habitaciones
##    <dbl> <chr>  <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl>
##  1  1147 Zona … <NA>        3     250        70            1      3            6
##  2  1169 Zona … <NA>        3     320       120            1      2            3
##  3  1350 Zona … <NA>        3     350       220            2      2            4
##  4  5992 Zona … 02          4     400       280            3      5            3
##  5  1212 Zona … 01          5     260        90            1      2            3
##  6  1724 Zona … 01          5     240        87            1      3            3
##  7  2326 Zona … 01          4     220        52            2      2            3
##  8  4386 Zona … 01          5     310       137            2      3            4
##  9  1209 Zona … 02          5     320       150            2      4            6
## 10  1592 Zona … 02          5     780       380            2      3            3
## # ℹ 8,312 more rows
## # ℹ 4 more variables: tipo <chr>, barrio <chr>, longitud <dbl>, latitud <dbl>

Parte 2: Conociendo el set de datos

A continuación se inicia con la exploración del conjunto de datos

¿Cuál es el número de registros y cuál es la cantidad de atributos?

cant_reg <- nrow(vivienda)
cant_atr <- ncol(vivienda)

cat("Cantidad de Registros: ", cant_reg, "\n")
## Cantidad de Registros:  8322
cat("Cantidad de Atributos: ", cant_atr, "\n")
## Cantidad de Atributos:  13

Tipo de dato de los atributos

str(vivienda)
## spc_tbl_ [8,322 × 13] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
##  $ id          : num [1:8322] 1147 1169 1350 5992 1212 ...
##  $ zona        : chr [1:8322] "Zona Oriente" "Zona Oriente" "Zona Oriente" "Zona Sur" ...
##  $ piso        : chr [1:8322] NA NA NA "02" ...
##  $ estrato     : num [1:8322] 3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : num [1:8322] 250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num [1:8322] 70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: num [1:8322] 1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : num [1:8322] 3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num [1:8322] 6 3 4 3 3 3 3 4 6 3 ...
##  $ tipo        : chr [1:8322] "Casa" "Casa" "Casa" "Casa" ...
##  $ barrio      : chr [1:8322] "20 de julio" "20 de julio" "20 de julio" "3 de julio" ...
##  $ longitud    : num [1:8322] -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num [1:8322] 3.43 3.43 3.44 3.44 3.46 ...
##  - attr(*, "spec")=List of 3
##   ..$ cols   :List of 13
##   .. ..$ id          : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ zona        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ piso        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ estrato     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ preciom     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ areaconst   : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ parqueaderos: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ banios      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ habitaciones: list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ tipo        : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ barrio      : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_character" "collector"
##   .. ..$ longitud    : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   .. ..$ latitud     : list()
##   .. .. ..- attr(*, "class")= chr [1:2] "collector_double" "collector"
##   ..$ default: list()
##   .. ..- attr(*, "class")= chr [1:2] "collector_guess" "collector"
##   ..$ delim  : chr ";"
##   ..- attr(*, "class")= chr "col_spec"
##  - attr(*, "problems")=<externalptr>

Valores únicos de las variables categóricas.

cat("Zona:\n")
## Zona:
print(unique(vivienda$zona))
## [1] "Zona Oriente" "Zona Sur"     "Zona Norte"   "Zona Oeste"   "Zona Centro" 
## [6] NA
cat("\n")
cat("Piso:\n")
## Piso:
print(unique(vivienda$piso))
##  [1] NA   "02" "01" "03" "04" "05" "06" "07" "08" "09" "10" "11" "12"
cat("\n")
cat("Tipo:\n")
## Tipo:
print(unique(vivienda$tipo))
## [1] "Casa"        "Apartamento" NA
cat("\n")
cat("Barrio:\n")
## Barrio:
print(unique(vivienda$barrio))
##   [1] "20 de julio"                   "3 de julio"                   
##   [3] "acopi"                         "agua blanca"                  
##   [5] "aguablanca"                    "aguacatal"                    
##   [7] "alameda"                       "alameda del río"              
##   [9] "alameda del rio"               "alamos"                       
##  [11] "alborada"                      "alcazares"                    
##  [13] "alférez real"                 "alferez real"                 
##  [15] "alfonso lópez"                 "alfonso lópez i"              
##  [17] "alfonso lopez"                 "alto jordán"                  
##  [19] "altos de guadalupe"            "altos de menga"               
##  [21] "altos de santa"                "antonio nariño"               
##  [23] "aranjuez"                      "arboleda"                     
##  [25] "arboleda campestre candelaria" "arboledas"                    
##  [27] "atanasio girardot"             "autopista sur"                
##  [29] "bajo aguacatal"                "barranquilla"                 
##  [31] "barrio 7de agosto"             "barrio el recuerdo"           
##  [33] "barrio eucarístico"            "barrio obrero"                
##  [35] "barrio tranquilo y"            "base aérea"                  
##  [37] "belalcazar"                    "Belalcazar"                   
##  [39] "belisario caicedo"             "bella suiza"                  
##  [41] "bella suiza alta"              "bellavista"                   
##  [43] "benjamín herrera"              "berlin"                       
##  [45] "bloques del limonar"           "bochalema"                    
##  [47] "bolivariano"                   "bosques de alboleda"          
##  [49] "bosques del limonar"           "boyacá"                       
##  [51] "bretaña"                       "brisas de guadalupe"          
##  [53] "brisas de los"                 "Brisas De Los"                
##  [55] "brisas del guabito"            "brisas del limonar"           
##  [57] "Bueno Madrid"                  "buenos aires"                 
##  [59] "cañasgordas"                   "cañaveralejo"                 
##  [61] "cañaverales"                   "cañaverales los samanes"      
##  [63] "caldas"                        "Cali"                         
##  [65] "cali bella"                    "cali canto"                   
##  [67] "calibella"                     "calicanto"                    
##  [69] "calicanto viii"                "calima"                       
##  [71] "calimio norte"                 "calipso"                      
##  [73] "cambulos"                      "camino real"                  
##  [75] "Camino Real"                   "campestre"                    
##  [77] "caney"                         "caney especial"               
##  [79] "capri"                         "cascajal"                     
##  [81] "cataya real"                   "ceibas"                       
##  [83] "centelsa"                      "centenario"                   
##  [85] "Centenario"                    "centro"                       
##  [87] "cerro cristales"               "cerros de guadalupe"          
##  [89] "champagnat"                    "chapinero"                    
##  [91] "chiminangos"                   "Chiminangos"                  
##  [93] "chiminangos 1 etapa"           "chiminangos 2 etapa"          
##  [95] "chipichape"                    "ciudad 2000"                  
##  [97] "Ciudad 2000"                   "ciudad antejardin"            
##  [99] "ciudad bochalema"              "ciudad córdoba"               
## [101] "ciudad córdoba reservado"      "ciudad capri"                 
## [103] "ciudad cordoba"                "ciudad country"               
## [105] "ciudad del campo"              "ciudad jardín"                
## [107] "Ciudad Jardín"                 "ciudad jardin"                
## [109] "ciudad jardin pance"           "ciudad los álamos"            
## [111] "ciudad los alamos"             "ciudad meléndez"             
## [113] "ciudad melendez"               "ciudad modelo"                
## [115] "ciudad pacifica"               "Ciudad Pacifica"              
## [117] "ciudad real"                   "ciudad talanga"               
## [119] "ciudad universitaria"          "ciudadela comfandi"           
## [121] "ciudadela del río"             "ciudadela melendez"           
## [123] "ciudadela paso ancho"          "ciudadela pasoancho"          
## [125] "colinas de menga"              "colinas del bosque"           
## [127] "colinas del sur"               "colon"                        
## [129] "colseguros"                    "colseguros andes"             
## [131] "Colseguros Andes"              "comfenalco"                   
## [133] "compartir"                     "conjunto gibraltar"           
## [135] "cristóbal colón"               "cristales"                    
## [137] "cristobal colón"               "cuarto de legua"              
## [139] "departamental"                 "ed benjamin herrera"          
## [141] "el bosque"                     "El Bosque"                    
## [143] "el caney"                      "El Caney"                     
## [145] "el castillo"                   "el cedro"                     
## [147] "el diamante"                   "el dorado"                    
## [149] "el gran limonar"               "el guabal"                    
## [151] "el guabito"                    "el ingenio"                   
## [153] "El Ingenio"                    "el ingenio 3"                 
## [155] "el ingenio i"                  "el ingenio ii"                
## [157] "el ingenio iii"                "el jardín"                    
## [159] "el jordán"                     "el lido"                      
## [161] "el limonar"                    "el nacional"                  
## [163] "el paraíso"                    "el peñon"                     
## [165] "el prado"                      "el refugio"                   
## [167] "el rodeo"                      "el sena"                      
## [169] "el trébol"                    "el troncal"                   
## [171] "el vallado"                    "eucarístico"                  
## [173] "evaristo garcía"               "farrallones de pance"         
## [175] "fenalco kennedy"               "fepicol"                      
## [177] "flora"                         "flora industrial"             
## [179] "floralia"                      "fonaviemcali"                 
## [181] "francisco eladio ramirez"      "fuentes de la"                
## [183] "gaitan"                        "gran limonar"                 
## [185] "granada"                       "guadalupe"                    
## [187] "guadalupe alto"                "guaduales"                    
## [189] "guayaquil"                     "hacienda alferez real"        
## [191] "ingenio"                       "ingenio i"                    
## [193] "ingenio ii"                    "jamundi"                      
## [195] "jamundi alfaguara"             "jorge eliecer gaitán"         
## [197] "jorge isaacs"                  "jose manuel marroquín"        
## [199] "juanamb√∫"                     "juanambu"                     
## [201] "junín"                         "junin"                        
## [203] "la alborada"                   "la alianza"                   
## [205] "la arboleda"                   "la base"                      
## [207] "la buitrera"                   "la campiña"                   
## [209] "la cascada"                    "la ceibas"                    
## [211] "la esmeralda"                  "la flora"                     
## [213] "La Flora"                      "la floresta"                  
## [215] "la fortaleza"                  "la gran colombia"             
## [217] "la hacienda"                   "La Hacienda"                  
## [219] "la independencia"              "la libertad"                  
## [221] "la luisa"                      "la merced"                    
## [223] "la morada"                     "la nueva base"                
## [225] "la playa"                      "la portada al"                
## [227] "la primavera"                  "la reforma"                   
## [229] "la rivera"                     "la rivera i"                  
## [231] "la rivera ii"                  "la riverita"                  
## [233] "la riviera"                    "la selva"                     
## [235] "la villa del"                  "laflora"                      
## [237] "lares de comfenalco"           "las acacias"                  
## [239] "las américas"                 "las camelias"                 
## [241] "las ceibas"                    "las delicias"                 
## [243] "las granjas"                   "las quintas de"               
## [245] "las vegas"                     "las vegas de"                 
## [247] "libertadores"                  "los alamos"                   
## [249] "los alcázares"                 "los alcazares"                
## [251] "los andes"                     "los cámbulos"                 
## [253] "los cambulos"                  "los cristales"                
## [255] "los cristales club"            "los farallones"               
## [257] "los guaduales"                 "Los Guaduales"                
## [259] "los guayacanes"                "los jockeys"                  
## [261] "los libertadores"              "los parques barranquilla"     
## [263] "los robles"                    "lourdes"                      
## [265] "mamellan"                      "manzanares"                   
## [267] "mariano ramos"                 "marroquín iii"                
## [269] "mayapan las vegas"             "meléndez"                    
## [271] "melendez"                      "menga"                        
## [273] "metropolitano del norte"       "miradol del aguacatal"        
## [275] "miraflores"                    "Miraflores"                   
## [277] "morichal de comfandi"          "multicentro"                  
## [279] "municipal"                     "nápoles"                      
## [281] "napoles"                       "normandía"                    
## [283] "normandía west point"          "normandia"                    
## [285] "norte"                         "norte la flora"               
## [287] "nueva base"                    "nueva floresta"               
## [289] "nueva tequendama"              "oasis de comfandi"            
## [291] "oasis de pasoancho"            "occidente"                    
## [293] "pacará"                        "pacara"                       
## [295] "palmas del ingenio"            "pampa linda"                  
## [297] "pampalinda"                    "panamericano"                 
## [299] "pance"                         "Pance"                        
## [301] "parcelaciones pance"           "parque residencial el"        
## [303] "paseo de los"                  "paso del comercio"            
## [305] "pasoancho"                     "poblado campestre"            
## [307] "ponce"                         "popular"                      
## [309] "portada de comfandi"           "portales de comfandi"         
## [311] "porvenir"                      "prados de oriente"            
## [313] "prados del limonar"            "Prados Del Limonar"           
## [315] "prados del norte"              "Prados Del Norte"             
## [317] "prados del sur"                "primavera"                    
## [319] "primero de mayo"               "primitivo crespo"             
## [321] "puente del comercio"           "puente palma"                 
## [323] "quintas de don"                "Quintas De Don"               
## [325] "quintas de salomia"            "rafael uribe uribe"           
## [327] "refugio"                       "rep√∫blica de israel"         
## [329] "rincón de salomia"             "rincon de la"                 
## [331] "riveras del valle"             "rozo la torre"                
## [333] "saavedra galindo"              "salomia"                      
## [335] "samanes"                       "samanes de guadalupe"         
## [337] "sameco"                        "san antonio"                  
## [339] "san bosco"                     "san carlos"                   
## [341] "san cayetano"                  "san fernando"                 
## [343] "San Fernando"                  "san fernando nuevo"           
## [345] "san fernando viejo"            "san joaquín"                  
## [347] "san joaquin"                   "san juan bosco"               
## [349] "san judas"                     "san judas tadeo"              
## [351] "san luís"                      "san luis"                     
## [353] "san nicolás"                   "san nicolas"                  
## [355] "san pedro"                     "san vicente"                  
## [357] "santa"                         "santa anita"                  
## [359] "Santa Anita"                   "santa anita sur"              
## [361] "santa bárbara"                 "santa elena"                  
## [363] "santa fe"                      "santa helena de"              
## [365] "santa isabel"                  "Santa Isabel"                 
## [367] "santa mónica"                  "santa mónica alta"            
## [369] "santa mónica popular"          "santa mónica residencial"     
## [371] "santa monica"                  "Santa Monica"                 
## [373] "santa monica norte"            "santa monica popular"         
## [375] "santa monica residencial"      "santa rita"                   
## [377] "santa rosa"                    "santa teresita"               
## [379] "Santa Teresita"                "Santafe"                      
## [381] "santander"                     "santo domingo"                
## [383] "Santo Domingo"                 "sector aguacatal"             
## [385] "sector cañaveralejo guadalupe" "seminario"                    
## [387] "sierras de normandía"          "siete de agosto"              
## [389] "simón bolivar"                 "tejares cristales"            
## [391] "tejares de san"                "templete"                     
## [393] "tequendama"                    "tequendema"                   
## [395] "terrón colorado"               "torres de comfandi"           
## [397] "unión de vivienda"             "unicentro cali"               
## [399] "urbanización barranquilla"     "urbanización boyacá"          
## [401] "urbanización colseguros"       "urbanización la flora"        
## [403] "urbanización la merced"        "urbanización la nueva"        
## [405] "urbanización las cascadas"     "urbanización nueva granada"   
## [407] "urbanización pacara"           "urbanización río lili"        
## [409] "urbanización san joaquin"      "urbanización tequendama"      
## [411] "urbanizacion el saman"         "urbanizacion gratamira"       
## [413] "urbanizacion lili"             "valle de lili"                
## [415] "valle del lili"                "Valle Del Lili"               
## [417] "valle grande"                  "versalles"                    
## [419] "villa colombia"                "villa de veracruz"            
## [421] "villa del lago"                "villa del parque"             
## [423] "villa del prado"               "Villa Del Prado"              
## [425] "villa del sol"                 "villa del sur"                
## [427] "Villas De Veracruz"            "villas de veracruz"           
## [429] "vipasa"                        "zona centro"                  
## [431] "zona norte"                    "zona norte los"               
## [433] "zona oeste"                    "zona oriente"                 
## [435] "zona residencial"              "zona sur"                     
## [437] NA

A continuación, se presenta los valores ausentes en el conjunto de datos

valores_faltantes <- colSums(is.na(vivienda))
print(valores_faltantes)
##           id         zona         piso      estrato      preciom    areaconst 
##            3            3         2638            3            2            3 
## parqueaderos       banios habitaciones         tipo       barrio     longitud 
##         1605            3            3            3            3            3 
##      latitud 
##            3
#Graficando la cantidad de valores ausentes por atributo
barplot(
  valores_faltantes,
  names.arg = names(valores_faltantes),
  col = "skyblue",
  main = "Valores Faltantes por Atributos",
  ylim = c(0, max(valores_faltantes) + 500),
  las = 2,
  cex.names = 0.7
)

El gráfico revela claramente que los atributos “piso” y “parqueaderos” presentan una notable cantidad de datos faltantes, destacándose como las variables con mayor ausencia de información. Por otro lado, los demás atributos muestran una proporción significativamente menor de valores faltantes.

Generando el diagrama de caja y bigotes para todos los atributos numéricos

columnas_numericas <- vivienda[sapply(vivienda, is.numeric)]

# Crear el boxplot
# Configurar el tamaño de las etiquetas
par(cex.axis = 0.7)

boxplot(
  columnas_numericas, 
  main = "Boxplot Atributos Numéricos", 
  las = 2
)

Se muestra un resumen estadístico de los datos

resumen_estadistico <- summary(vivienda)
print(resumen_estadistico)
##        id           zona               piso              estrato     
##  Min.   :   1   Length:8322        Length:8322        Min.   :3.000  
##  1st Qu.:2080   Class :character   Class :character   1st Qu.:4.000  
##  Median :4160   Mode  :character   Mode  :character   Median :5.000  
##  Mean   :4160                                         Mean   :4.634  
##  3rd Qu.:6240                                         3rd Qu.:5.000  
##  Max.   :8319                                         Max.   :6.000  
##  NA's   :3                                            NA's   :3      
##     preciom         areaconst       parqueaderos        banios      
##  Min.   :  58.0   Min.   :  30.0   Min.   : 1.000   Min.   : 0.000  
##  1st Qu.: 220.0   1st Qu.:  80.0   1st Qu.: 1.000   1st Qu.: 2.000  
##  Median : 330.0   Median : 123.0   Median : 2.000   Median : 3.000  
##  Mean   : 433.9   Mean   : 174.9   Mean   : 1.835   Mean   : 3.111  
##  3rd Qu.: 540.0   3rd Qu.: 229.0   3rd Qu.: 2.000   3rd Qu.: 4.000  
##  Max.   :1999.0   Max.   :1745.0   Max.   :10.000   Max.   :10.000  
##  NA's   :2        NA's   :3        NA's   :1605     NA's   :3       
##   habitaciones        tipo              barrio             longitud     
##  Min.   : 0.000   Length:8322        Length:8322        Min.   :-76.59  
##  1st Qu.: 3.000   Class :character   Class :character   1st Qu.:-76.54  
##  Median : 3.000   Mode  :character   Mode  :character   Median :-76.53  
##  Mean   : 3.605                                         Mean   :-76.53  
##  3rd Qu.: 4.000                                         3rd Qu.:-76.52  
##  Max.   :10.000                                         Max.   :-76.46  
##  NA's   :3                                              NA's   :3       
##     latitud     
##  Min.   :3.333  
##  1st Qu.:3.381  
##  Median :3.416  
##  Mean   :3.418  
##  3rd Qu.:3.452  
##  Max.   :3.498  
##  NA's   :3

nota: En esta fase, la matriz de correlación no se exhibe debido a la presencia de valores faltantes en todos los atributos. Al calcular la matriz de correlación de esta manera, se generan valores NA en las celdas fuera de la diagonal principal.

Parte 3: Preprocesamiento de los datos

Dado que la columna de identificación (ID) no aporta información relevante para el análisis, se optará por su eliminación, junto con la variable “barrio”.

# Eliminar la columna "id" del dataframe
vivienda_pre <- vivienda[, !(names(vivienda) == "id")]
# Eliminar la columna "barrio" del dataframe modificado vivienda_pre
vivienda_pre <- vivienda_pre[, !(names(vivienda_pre) == "barrio")]
vivienda_pre
## # A tibble: 8,322 × 11
##    zona   piso  estrato preciom areaconst parqueaderos banios habitaciones tipo 
##    <chr>  <chr>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl> <chr>
##  1 Zona … <NA>        3     250        70            1      3            6 Casa 
##  2 Zona … <NA>        3     320       120            1      2            3 Casa 
##  3 Zona … <NA>        3     350       220            2      2            4 Casa 
##  4 Zona … 02          4     400       280            3      5            3 Casa 
##  5 Zona … 01          5     260        90            1      2            3 Apar…
##  6 Zona … 01          5     240        87            1      3            3 Apar…
##  7 Zona … 01          4     220        52            2      2            3 Apar…
##  8 Zona … 01          5     310       137            2      3            4 Apar…
##  9 Zona … 02          5     320       150            2      4            6 Casa 
## 10 Zona … 02          5     780       380            2      3            3 Casa 
## # ℹ 8,312 more rows
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>

Debido a la alta presencia de valores faltantes en el atributo “parqueadero”, se procederá a su imputación mediante la sustitución de los valores ausentes por la mediana.

mediana_par <- median(vivienda_pre$parqueaderos, na.rm = TRUE)

vivienda_pre$parqueaderos <- ifelse(
  is.na(vivienda_pre$parqueaderos), 
  mediana_par, vivienda_pre$parqueaderos
)

#Contanto los valores vacíos del atributo parqueadero
cat("Cantidad valores vacíos atributo parqueadero: ", sum(is.na(vivienda_pre$parqueaderos)), "\n")
## Cantidad valores vacíos atributo parqueadero:  0

Dado que el atributo “piso” es de naturaleza categórica, se realizará un procesamiento de la siguiente manera: inicialmente, se imputarán los valores faltantes con la moda y, posteriormente, se transformará su tipo a numérico.

library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.2
#imputando los valores faltantes con la moda
vivienda_pre$piso[is.na(vivienda_pre$piso)] <- Mode(vivienda_pre$piso, na.rm = TRUE)

#Conviertiendo los valores a tipo numérico
vivienda_pre$piso <- as.numeric(vivienda_pre$piso)

#Contanto los valores vacíos del atributo parqueadero
cat("Cantidad valores vacíos atributo piso: ", sum(is.na(vivienda_pre$piso)), "\n")
## Cantidad valores vacíos atributo piso:  0

Dado que la proporción de valores faltantes es insignificante en comparación con la cantidad total de registros en el dataframe, se opta por eliminar dichos valores faltantes.

vivienda_pre <- na.omit(vivienda_pre)

Dado que se han eliminado todos los valores faltantes, a continuación, se presenta la matriz de correlación para analizar las relaciones entre las variables.

library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.2
## corrplot 0.92 loaded
vivienda_numeric <- vivienda_pre[, sapply(vivienda_pre, is.numeric)]
matriz_correlacion <- cor(vivienda_numeric)
corrplot(matriz_correlacion, method = "number")

A continuación, se muestra el dataframe ya preprocesado.

vivienda_pre
## # A tibble: 8,319 × 11
##    zona    piso estrato preciom areaconst parqueaderos banios habitaciones tipo 
##    <chr>  <dbl>   <dbl>   <dbl>     <dbl>        <dbl>  <dbl>        <dbl> <chr>
##  1 Zona …     2       3     250        70            1      3            6 Casa 
##  2 Zona …     2       3     320       120            1      2            3 Casa 
##  3 Zona …     2       3     350       220            2      2            4 Casa 
##  4 Zona …     2       4     400       280            3      5            3 Casa 
##  5 Zona …     1       5     260        90            1      2            3 Apar…
##  6 Zona …     1       5     240        87            1      3            3 Apar…
##  7 Zona …     1       4     220        52            2      2            3 Apar…
##  8 Zona …     1       5     310       137            2      3            4 Apar…
##  9 Zona …     2       5     320       150            2      4            6 Casa 
## 10 Zona …     2       5     780       380            2      3            3 Casa 
## # ℹ 8,309 more rows
## # ℹ 2 more variables: longitud <dbl>, latitud <dbl>

Parte 4: Codificación de variables categóricas

Previamente a la aplicación de cualquier análisis, es esencial llevar a cabo la codificación de las variables categóricas presentes en el conjunto de datos. Se empleará la codificación one-hot para las variables “zona” y “tipo”.

Codificación de la variable “zona”

library(caret)
## Warning: package 'caret' was built under R version 4.3.2
## Loading required package: lattice
## 
## Attaching package: 'lattice'
## The following object is masked from 'package:boot':
## 
##     melanoma
## 
## Attaching package: 'caret'
## The following objects are masked from 'package:DescTools':
## 
##     MAE, RMSE
vivienda_cod <- vivienda_pre

dummy_spec <- dummyVars(~ zona, data = vivienda_cod)
zona_dummy <- predict(dummy_spec, newdata = vivienda_cod)
vivienda_cod <- cbind(vivienda_cod, zona_dummy)
vivienda_cod$zona <- NULL

#Cambiando el nombre de las columnas

indice_columna <- which(colnames(vivienda_cod) == "zonaZona Centro")
colnames(vivienda_cod)[indice_columna] <- "Centro"

indice_columna <- which(colnames(vivienda_cod) == "zonaZona Norte")
colnames(vivienda_cod)[indice_columna] <- "Norte"

indice_columna <- which(colnames(vivienda_cod) == "zonaZona Oeste")
colnames(vivienda_cod)[indice_columna] <- "Oeste"

indice_columna <- which(colnames(vivienda_cod) == "zonaZona Oriente")
colnames(vivienda_cod)[indice_columna] <- "Oriente"

indice_columna <- which(colnames(vivienda_cod) == "zonaZona Sur")
colnames(vivienda_cod)[indice_columna] <- "Sur"

#Para eliminar la reduncia de los datos, se elimina la columna zonaZona Sur

vivienda_cod <- vivienda_cod[, colnames(vivienda_cod) != "Sur"]
head(vivienda_cod, 5)
##   piso estrato preciom areaconst parqueaderos banios habitaciones        tipo
## 1    2       3     250        70            1      3            6        Casa
## 2    2       3     320       120            1      2            3        Casa
## 3    2       3     350       220            2      2            4        Casa
## 4    2       4     400       280            3      5            3        Casa
## 5    1       5     260        90            1      2            3 Apartamento
##    longitud latitud Centro Norte Oeste Oriente
## 1 -76.51168 3.43382      0     0     0       1
## 2 -76.51237 3.43369      0     0     0       1
## 3 -76.51537 3.43566      0     0     0       1
## 4 -76.54000 3.43500      0     0     0       0
## 5 -76.51350 3.45891      0     1     0       0

Codificación de la variable “tipo”

library(caret)

dummy_spec <- dummyVars(~ tipo, data = vivienda_cod)
tipo_dummy <- predict(dummy_spec, newdata = vivienda_cod)
vivienda_cod <- cbind(vivienda_cod, tipo_dummy)
vivienda_cod$tipo <- NULL

#Cambiando el nombre de la columna tipoCasa por tipo

indice_columna <- which(colnames(vivienda_cod) == "tipoCasa")
colnames(vivienda_cod)[indice_columna] <- "tipo"


#Para reducir la redundancia en los datos, se excluye la columna 
#"tipoApartamento". Ahora, si en la columna "tipo" se encuentra un 
#valor de 1, representa una casa; de lo contrario, un valor de 0 indica 
#que es un apartamento.

vivienda_cod <- vivienda_cod[, colnames(vivienda_cod) != "tipoApartamento"]
head(vivienda_cod,5)
##   piso estrato preciom areaconst parqueaderos banios habitaciones  longitud
## 1    2       3     250        70            1      3            6 -76.51168
## 2    2       3     320       120            1      2            3 -76.51237
## 3    2       3     350       220            2      2            4 -76.51537
## 4    2       4     400       280            3      5            3 -76.54000
## 5    1       5     260        90            1      2            3 -76.51350
##   latitud Centro Norte Oeste Oriente tipo
## 1 3.43382      0     0     0       1    1
## 2 3.43369      0     0     0       1    1
## 3 3.43566      0     0     0       1    1
## 4 3.43500      0     0     0       0    1
## 5 3.45891      0     1     0       0    0
str(vivienda_cod)
## 'data.frame':    8319 obs. of  14 variables:
##  $ piso        : num  2 2 2 2 1 1 1 1 2 2 ...
##  $ estrato     : num  3 3 3 4 5 5 4 5 5 5 ...
##  $ preciom     : num  250 320 350 400 260 240 220 310 320 780 ...
##  $ areaconst   : num  70 120 220 280 90 87 52 137 150 380 ...
##  $ parqueaderos: num  1 1 2 3 1 1 2 2 2 2 ...
##  $ banios      : num  3 2 2 5 2 3 2 3 4 3 ...
##  $ habitaciones: num  6 3 4 3 3 3 3 4 6 3 ...
##  $ longitud    : num  -76.5 -76.5 -76.5 -76.5 -76.5 ...
##  $ latitud     : num  3.43 3.43 3.44 3.44 3.46 ...
##  $ Centro      : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Norte       : num  0 0 0 0 1 1 1 1 1 1 ...
##  $ Oeste       : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Oriente     : num  1 1 1 0 0 0 0 0 0 0 ...
##  $ tipo        : num  1 1 1 1 0 0 0 0 1 1 ...

Parte 5: Análisis de Componentes Principales

Reducir la dimensionalidad del conjunto de datos y visualizar la estructura de las variables en componentes principales para identificar características clave que influyen en la variación de precios y oferta del mercado.

Estandarización de Datos:

Antes de realizar el análisis de componentes principales (PCA), es recomendable estandarizar los datos para que todas las variables tengan la misma escala.

#Escalar los datos para estandarizar las variables
vivienda_pre_standardized <- scale(vivienda_cod)

Análisis de Componentes Principales (PCA):

Ejecución del análisis de componentes principales

pca_result <- prcomp(vivienda_pre_standardized, scale = TRUE)

Varianza explicada:

summary(pca_result)
## Importance of components:
##                           PC1    PC2    PC3     PC4     PC5     PC6     PC7
## Standard deviation     1.9684 1.5582 1.2550 1.06311 1.02203 0.95461 0.86760
## Proportion of Variance 0.2767 0.1734 0.1125 0.08073 0.07461 0.06509 0.05377
## Cumulative Proportion  0.2767 0.4502 0.5627 0.64342 0.71803 0.78312 0.83689
##                            PC8     PC9    PC10    PC11    PC12   PC13    PC14
## Standard deviation     0.70435 0.66611 0.65470 0.56658 0.48457 0.4315 0.41603
## Proportion of Variance 0.03544 0.03169 0.03062 0.02293 0.01677 0.0133 0.01236
## Cumulative Proportion  0.87232 0.90402 0.93463 0.95756 0.97434 0.9876 1.00000

Visualización de Resultados (PCA):

Gráfica de la varianza acumulada explicada

# Graficar la varianza acumulada explicada
plot(cumsum(pca_result$sdev^2) / sum(pca_result$sdev^2), 
     xlab = "Número de Componentes Principales",
     ylab = "Varianza Acumulada Explicada",
     ylim = c(0, 1),
     type = "b")
abline(h = 0.95, col = "red", lty = 2)  # Establecer un umbral, por ejemplo, 95% de varianza explicada

A continuación, analizamos la contribución de cada variable a las componentes del PCA utilizando el atributo $rotation del objeto resultante pca_result.

print(pca_result$rotation)
##                      PC1         PC2         PC3          PC4          PC5
## piso          0.08760175  0.27278469 -0.14561450  0.066861652 -0.187280601
## estrato      -0.28700092  0.38735426 -0.08782700  0.186953258 -0.007639824
## preciom      -0.43727419  0.11236183 -0.15266071  0.049343153 -0.034047572
## areaconst    -0.41578046 -0.17576476 -0.09282622  0.027581986 -0.005362149
## parqueaderos -0.34870071 -0.01996084 -0.11847176  0.132124864 -0.038333104
## banios       -0.42981805 -0.07727100 -0.05508756  0.048987910 -0.023362957
## habitaciones -0.27365799 -0.35859185  0.02520280 -0.143970614 -0.036194791
## longitud      0.22147406 -0.36331262 -0.11885244  0.237634895 -0.156839788
## latitud       0.11975637 -0.14863547 -0.66058701 -0.326933466 -0.025186809
## Centro        0.01001118 -0.12215862  0.08421600 -0.445865649  0.704585519
## Norte         0.13890465 -0.21149528 -0.59936807  0.304621907  0.137538852
## Oeste        -0.12232777  0.33653439 -0.25664047 -0.582492754 -0.174355831
## Oriente       0.04463079 -0.29850653  0.16624861 -0.350019734 -0.619847240
## tipo         -0.25476813 -0.42540137  0.10543722 -0.006325636  0.071784124
##                      PC6         PC7          PC8          PC9         PC10
## piso          0.84158041 -0.12222480  0.204650578 -0.049157733  0.262707134
## estrato      -0.04349683  0.05234643 -0.529589034  0.226407604 -0.020609872
## preciom       0.04600871  0.21920320 -0.178841464  0.020054234  0.137379174
## areaconst     0.04360466  0.03132795  0.007410759 -0.011475623  0.423646501
## parqueaderos  0.02815215  0.58810629  0.548747209 -0.079738265 -0.355108032
## banios        0.16092523 -0.24625392 -0.211310444  0.031582577 -0.280164376
## habitaciones  0.19902504 -0.49042577  0.060269861 -0.002304778 -0.456413068
## longitud      0.19947377  0.30221166 -0.482450556 -0.571395048 -0.153447367
## latitud      -0.05938755 -0.04241677  0.004973499  0.029683216  0.022270604
## Centro        0.34326797  0.31031445 -0.186164099  0.143570768 -0.027492978
## Norte        -0.07471086 -0.04488514  0.036390522  0.360694605  0.029200479
## Oeste        -0.17826796 -0.03125385 -0.024368576 -0.410052857 -0.008967725
## Oriente       0.08612390  0.29140125 -0.139988140  0.490601719  0.047024487
## tipo         -0.11663516 -0.09449730  0.085154122 -0.226954489  0.539779390
##                     PC11         PC12        PC13         PC14
## piso         -0.13596973  0.036086111 -0.02876636 -0.006245784
## estrato      -0.34023268  0.483562269  0.13587139 -0.141527623
## preciom       0.22174812 -0.181780107 -0.22904730  0.730179157
## areaconst     0.60862947  0.160550999  0.13877775 -0.434529217
## parqueaderos -0.18587118  0.114854922  0.07329013 -0.108126166
## banios       -0.17284150 -0.683445839  0.15881254 -0.265390216
## habitaciones  0.08887722  0.463911490 -0.16589833  0.176454155
## longitud      0.04724293  0.055112614 -0.04427104 -0.051092003
## latitud      -0.05646054  0.038742435  0.60464292  0.206545729
## Centro       -0.03628966  0.005396598 -0.08160209 -0.067002740
## Norte        -0.06479710 -0.047386352 -0.53745187 -0.172769086
## Oeste        -0.05820978 -0.006053021 -0.41937520 -0.235253028
## Oriente      -0.07712626 -0.028694101 -0.09590509 -0.061149676
## tipo         -0.59460771  0.053553708 -0.05229398  0.077466460

Al analizar la matriz anterior, destacamos que las variables “preciom”, “areaconst”, “banios” y “parqueaderos” son las que más contribuyen a la primera componente, mientras que “estrato”, “habitaciones”, “longitud”, “Oeste” y “tipo” son las que más aportan a la segunda componente. Dado que la primera componente captura la mayor variabilidad de los datos, podemos afirmar que las variables “preciom”, “areaconst”, “banios” y “parqueaderos” desempeñan un papel crucial en la definición del conjunto de datos.

Se utiliza un gráfico de dispersión o biplot para visualizar la relación entre las observaciones y los componentes principales.

library(ggfortify)
## Warning: package 'ggfortify' was built under R version 4.3.2
autoplot(pca_result, loadings = TRUE, loadings.label = TRUE, loadings.colour = 'blue')

Al analizar cuidadosamente el gráfico biplot, se confirma lo indicado por la matriz. Las variables “preciom”, “areaconst”, “banios” y “parqueaderos” exhiben las longitudes más prominentes a lo largo de la primera componente, lo que sugiere que son las variables que más contribuyen a esta dimensión. De manera similar, las variables “estrato”, “habitaciones”, “longitud”, “Oeste” y “tipo” muestran una mayor importancia en la segunda componente, como se refleja en sus longitudes en el gráfico.

Parte 6: Análisis de Conglomerados

library(cluster)
## Warning: package 'cluster' was built under R version 4.3.2
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.2
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
## 
##     combine
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Seleccionar las columnas relevantes para el clustering

datos_clustering <- vivienda_cod[, c("piso", "estrato", "preciom", "areaconst", "parqueaderos", "banios", "habitaciones", "longitud", "latitud")]

Escalar los datos para que todas las variables tengan la misma escala

datos_escalados <- scale(datos_clustering)

Determinar el número óptimo de clústeres utilizando el método del codo

set.seed(123)
wss <- sapply(1:10, function(k) kmeans(datos_escalados, centers = k)$tot.withinss)
plot(1:10, wss, type = "b", main = "Método del Codo", xlab = "Número de Clústeres", ylab = "Within-cluster sum of squares")

Aplicar el algoritmo K-means con el número óptimo de clústeres

numero_optimo_clusters <- 6
modelo_kmeans <- kmeans(datos_escalados, centers = numero_optimo_clusters)

Agregar la asignación de clústeres al dataframe original

vivienda_cod$cluster <- as.factor(modelo_kmeans$cluster)

Resumen de los clusteres

summary(vivienda_cod$cluster)
##    1    2    3    4    5    6 
##  725 1900  854 1388  837 2615

Visualización de Resultados (k-means):

A continuación, se presenta la distribución de las variables “preciom”, “areaconst”, “banios” y “parqueaderos”, las cuales destacan por su contribución significativa a la primera componente en el Análisis de Componentes Principales (PCA). El propósito es comparar sus distribuciones entre los distintos grupos.

Comparación de la variable “precio” en los diferentes grupos

# Diagrama de cajas
ggplot(vivienda_cod, aes(x = cluster, y = preciom, fill = cluster)) +
  geom_boxplot() +
  ggtitle("Comparación de Precios por Grupo")

Comparación de la variable “areaconst” en los diferentes grupos

# Diagrama de cajas
ggplot(vivienda_cod, aes(x = cluster, y = areaconst, fill = cluster)) +
  geom_boxplot() +
  ggtitle("Comparación de Precios por Grupo")

Comparación de la variable “banios” en los diferentes grupos

# Diagrama de cajas
ggplot(vivienda_cod, aes(x = cluster, y = banios, fill = cluster)) +
  geom_boxplot() +
  ggtitle("Comparación de Precios por Grupo")

Comparación de la variable “parqueaderos” en los diferentes grupos

# Diagrama de cajas
ggplot(vivienda_cod, aes(x = cluster, y = parqueaderos, fill = cluster)) +
  geom_boxplot() +
  ggtitle("Comparación de Precios por Grupo")

Al analizar los diversos diagramas de caja, se destaca que el grupo 1 exhibe las mejores viviendas, evidenciado por el hecho de que en todos los diagramas de caja, las medidas de tendencia central de las variables “areaconst”, “banios” y “parqueaderos” superan a las de los demás grupos. No obstante, también se observa que estas propiedades poseen los precios más altos, dado que la mediana de la variable “preciom” en el grupo 1 se sitúa por encima de las medianas de los otros grupos.

Parte 7: Análisis de Correspondencia

Se lleva a cabo un análisis de correspondencia entre las variables “tipo” y “zona” con el objetivo de explorar posibles relaciones entre sus distintas categorías.

#Se genera un nuevo dataframe que incluya exclusivamente estas dos variables.
tipo <- vivienda_pre$tipo
zona <- vivienda_pre$zona
df <- data.frame(tipo = tipo, zona = zona)
head(df, 5)
##          tipo         zona
## 1        Casa Zona Oriente
## 2        Casa Zona Oriente
## 3        Casa Zona Oriente
## 4        Casa     Zona Sur
## 5 Apartamento   Zona Norte

Se muestra una tabla para verificar la ausencia de valores faltantes.

library(mice)
## Warning: package 'mice' was built under R version 4.3.2
## 
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
## 
##     filter
## The following objects are masked from 'package:base':
## 
##     cbind, rbind
md.pattern(df, rotate.names = TRUE)
##  /\     /\
## {  `---'  }
## {  O   O  }
## ==>  V <==  No need for mice. This data set is completely observed.
##  \  \|/  /
##   `-----'

##      tipo zona  
## 8319    1    1 0
##         0    0 0

A continuación, se genera la tabla de contingencia que relaciona las dos variables.

library(FactoMineR)
## Warning: package 'FactoMineR' was built under R version 4.3.2
tabla <- table(df$zona, df$tipo)
tabla
##               
##                Apartamento Casa
##   Zona Centro           24  100
##   Zona Norte          1198  722
##   Zona Oeste          1029  169
##   Zona Oriente          62  289
##   Zona Sur            2787 1939

La tabla permite visualizar la distribución de los datos según las categorías de las variables. En este caso, podrías interpretar que la mayoría de los apartamentos están ubicados en las zonas Norte y Sur, mientras que las casas tienen una distribución más equilibrada en todas las zonas, con una cantidad relativamente alta en la zona Norte también.

Prueba de Chi-cuadrado de Pearson

chisq.test(tabla)
## 
##  Pearson's Chi-squared test
## 
## data:  tabla
## X-squared = 690.93, df = 4, p-value < 2.2e-16

El valor p es < 2.2e-16, lo que indica que es esencialmente cero. Esto significa que hay una asociación muy significativa entre las variables, ya que el valor p es extremadamente pequeño.

En la siguiente línea de código se realiza en análisis de correspondencia.

res.ac <- CA(tabla)
res.ac
## **Results of the Correspondence Analysis (CA)**
## The row variable has  5  categories; the column variable has 2 categories
## The chi square of independence between the two variables is equal to 690.9297 (p-value =  3.207561e-148 ).
## *The results are available in the following objects:
## 
##    name              description                   
## 1  "$eig"            "eigenvalues"                 
## 2  "$col"            "results for the columns"     
## 3  "$col$coord"      "coord. for the columns"      
## 4  "$col$cos2"       "cos2 for the columns"        
## 5  "$col$contrib"    "contributions of the columns"
## 6  "$row"            "results for the rows"        
## 7  "$row$coord"      "coord. for the rows"         
## 8  "$row$cos2"       "cos2 for the rows"           
## 9  "$row$contrib"    "contributions of the rows"   
## 10 "$call"           "summary called parameters"   
## 11 "$call$marge.col" "weights of the columns"      
## 12 "$call$marge.row" "weights of the rows"

Las coordenadas de las filas y columnas se guardan en dos nuevas variables para su posterior visualización.

# Coordenadas de las filas
coordenadas_filas <- res.ac$row$coord
# Coordenadas de las columnas
coordenadas_columnas <- res.ac$col$coord

Las categorías de la variable “zona” se representan gráficamente en un gráfico unidimensional.

# Definir los nuevos nombres de las categorías
nuevos_nombres <- c("Centro", "Norte", "Oeste", "Oriente", "Sur")

# Crear un gráfico de dispersión con puntos sobre el eje
plot(coordenadas_filas, rep(0, length(coordenadas_filas)), 
     pch = 16, col = "blue", 
     xlim = c(min(coordenadas_filas) - 0.5, max(coordenadas_filas) + 0.5),
     main = "Coordenadas de las filas en una dimensión",
     xlab = "Coordenadas",
     ylab = "",
     yaxt = "n")  # Para ocultar los valores del eje y

# Agregar etiquetas de categorías con los nuevos nombres
text(coordenadas_filas, rep(0.5, length(coordenadas_filas)), 
     labels = nuevos_nombres, pos = 1)

Similitudes entre Zona Centro y Zona Oriente: La cercanía entre las categorías “Zona Centro” y “Zona Oriente” sugiere que estas dos zonas comparten características o tienen patrones de asociación similares. Esto podría indicar, por ejemplo, que las áreas clasificadas como “Centro” y “Oriente” comparten ciertas características socioeconómicas, demográficas o geográficas.

Similitudes entre Zona Norte y Zona Sur: De manera similar, la proximidad entre las categorías “Zona Norte” y “Zona Sur” indica que estas dos zonas comparten similitudes en términos de sus características o comportamientos.

Diferenciación de Zona Oeste: La mayor distancia de la categoría “Zona Oeste” en el gráfico sugiere que esta zona tiene características distintas o únicas en comparación con las otras zonas. Podría haber diferencias significativas en términos de su demografía, economía, geografía u otros factores.

Las categorías de la variable “tipo” se representan gráficamente en un gráfico unidimensional.

# Coordenadas de las columnas
coordenadas_columnas <- c("Apartamento" = 0.2289585, 
                          "Casa" = -0.3627488)

# Crear un vector con las categorías
categorias_columnas <- names(coordenadas_columnas)

# Crear un gráfico de dispersión con puntos sobre el eje
plot(coordenadas_columnas, rep(0, length(coordenadas_columnas)), 
     pch = 16, col = "green", 
     xlim = c(min(coordenadas_columnas) - 0.5, max(coordenadas_columnas) + 0.5),
     main = "Coordenadas de las columnas en una dimensión",
     xlab = "Coordenadas",
     ylab = "",
     yaxt = "n")  # Para ocultar los valores del eje y

# Agregar etiquetas de categorías
text(coordenadas_columnas, rep(0.5, length(coordenadas_columnas)), 
     labels = categorias_columnas, pos = 1)

Al analizar el gráfico de las categorías de columnas, se destaca una marcada separación entre las categorías, lo que indica una diferencia notable entre ellas en términos de sus asociaciones.

Uniendo las dos gráficas

# Coordenadas de las filas
coordenadas_filas <- c("Centro" = -0.86131854, 
                       "Norte" = 0.02238755, 
                       "Oeste" = 0.50482822, 
                       "Oriente" = -0.89603812, 
                       "Sur" = -0.04791693)

# Coordenadas de las columnas
coordenadas_columnas <- c("Apartamento" = 0.2289585, 
                          "Casa" = -0.3627488)

# Crear un vector con las categorías
categorias_filas <- names(coordenadas_filas)
categorias_columnas <- names(coordenadas_columnas)

# Definir los límites del gráfico
eje_x_min <- min(min(coordenadas_filas), min(coordenadas_columnas))
eje_x_max <- max(max(coordenadas_filas), max(coordenadas_columnas))

# Crear un gráfico de dispersión unidimensional
plot(coordenadas_filas, rep(0, length(coordenadas_filas)), 
     pch = 16, col = "blue", xlim = c(eje_x_min, eje_x_max),
     main = "Coordenadas de filas y columnas en una dimensión",
     xlab = "Coordenadas",
     ylab = "",
     yaxt = "n")  # Para ocultar los valores del eje y

# Agregar puntos y etiquetas de las filas
points(coordenadas_filas, rep(0, length(coordenadas_filas)), pch = 16, col = "blue")
text(coordenadas_filas, rep(0.05, length(coordenadas_filas)), 
     labels = categorias_filas, pos = 1)

# Agregar puntos y etiquetas de las columnas
points(coordenadas_columnas, rep(0, length(coordenadas_columnas)), pch = 16, col = "green")
text(coordenadas_columnas, rep(-0.05, length(coordenadas_columnas)), 
     labels = categorias_columnas, pos = 3)

El valor del p-valor del test de chi-cuadrado de Pearson, siendo menor que 2.2e-16, ofrece una evidencia contundente en contra de la hipótesis nula de independencia entre las variables. No obstante, al observar la separación entre las categorías de filas y columnas en el gráfico de coordenadas, surge una aparente contradicción. Varias explicaciones pueden abordar esta discrepancia:

  1. Es factible que exista una estructura latente en los datos que no se refleje directamente en el test de chi-cuadrado. Esto sugiere relaciones más complejas entre las categorías de filas y columnas que no se capturan completamente en el test de independencia.

  2. A pesar de que el test de chi-cuadrado detecta una asociación significativa, el impacto real puede ser mínimo en términos de magnitud. En tal caso, las categorías pueden parecer distantes en el gráfico de coordenadas, pero aún así se mantiene una asociación estadísticamente significativa debido al amplio tamaño de la muestra.

En conclusión, aunque el test de chi-cuadrado señala una asociación significativa entre las variables de fila y columna, las discrepancias observadas en el gráfico de coordenadas pueden atribuirse a factores como la estructura latente de los datos, el tamaño de la muestra o las limitaciones inherentes al análisis de correspondencia.