A través del siguiente documento se planea presentar un análisis exploratorio de los datos entregado por la empresa B&C, en el cual se planea resaltar aquellas generalidades o puntos claves que se pueden concluir de los datos para el uso del negocio, y puedan tomar decisiones basados en sus propios datos recolectados.
Este análisis fue realizado con uso de R un lenguaje de programación con un enfoque al análisis estadístico, podrán observar gráficas y análisis de valores estadísticos con sus respectivas conclusiones después del análisis.
Identificar cual es el comportamiento de cada uno de los datos característicos de una vivienda, entre que rangos suelen estar los valores de estos datos de acuerdo a la variable que se está observando, cuales podrían ser valores atípicos, o cual es el conjunto de valores más esperado para una determinada variable.
Poder determinar si hay posibles reglas de negocio que se puedan extraer al observar el comportamiento de cada uno de los datos de las distintas viviendas que se tienen como conjunto de datos a analizar.
Determinar cómo se relacionan entre si las distintas variables que poseo, y como estas podrían ayudar al negocio a determinar el precio de las viviendas a partir de otros datos.
Es el lenguaje de programación escogido para realizar el respectivo análisis exploratorio de datos, debido a su enfoque en estadística, y su facilidad para realizar estas tareas.
Para determinar el comportamiento de los datos obtenidos, se va a realizar una serie de medidas estadísticas como la media, mediana, o moda, varianza y desviación estándar para poder determinar cómo es la distribución de mi conjunto de datos.
Además de esto se va apoyar de gráficos que me permitan tanto ver el comportamiento individual de cada una de mis variables así como la relación entre ellas, de ser existente, como puede ser el tamaño de una casa con el precio, o la zona donde se ubica.
Lo primero que haremos es identificar la comportamiento general de cada una de las variables numéricas, apoyándonos en las variables cualitativas.
psych::describe(vivienda_faltantes[c("piso", "estrato", "preciom", "parquea", "banios", "habitac", "longitud", "latitud")])
## vars n mean sd median trimmed mad min max
## piso 1 5689 3.77 2.62 3.00 3.37 1.48 1.00 12.00
## estrato 2 8327 4.63 1.03 5.00 4.67 1.48 3.00 6.00
## preciom 3 8328 434.24 329.02 330.00 374.72 209.05 58.00 1999.00
## parquea 4 6724 1.84 1.13 2.00 1.62 1.48 1.00 10.00
## banios 5 8327 3.11 1.43 3.00 2.99 1.48 0.00 10.00
## habitac 6 8327 3.61 1.46 3.00 3.41 1.48 0.00 10.00
## longitud 7 8327 -21845.13 34503.90 -76.54 -17732.94 0.03 -76576.00 -76.46
## latitud 8 8327 970.37 1539.16 3.45 779.76 0.10 3.33 3497.00
## range skew kurtosis se
## piso 11.00 1.28 1.05 0.03
## estrato 3.00 -0.18 -1.11 0.01
## preciom 1941.00 1.85 3.66 3.61
## parquea 9.00 2.32 8.29 0.01
## banios 10.00 0.92 1.12 0.02
## habitac 10.00 1.64 3.99 0.02
## longitud 76499.54 -0.95 -1.09 378.11
## latitud 3493.67 0.96 -1.07 16.87
Algunas de las cosas que podemos notar de este resumen es que la mayoría suelen estar en el piso 3 dentro de la base de datos, el promedio del precio es 434.2, la mayoría de los inmuebles tienen entre 2 y 4 baños y habitaciones, así como que la mayoría de los datos que se tienen son de viviendas del estrato 4 y 5, de hecho, no hay viviendas de estrato menor al 3, para confirmar esto vamos a hacer un diagrama de barras.
# Configurar tamaño del plot en R Markdown
options(repr.plot.width = 10, repr.plot.height = 6)
# Paso 1: Calculate frequencies of each category in the 'estrato' variable
estrato_freq <- table(vivienda_faltantes$estrato)
# Adding row count labels to the bars
text(barplot(estrato_freq,
main = "Cantidad Viviendas por Estrato",
xlab = "Estrato",
ylab = "# Viviendas"),
estrato_freq,
labels = estrato_freq,
pos = 1,
col = "black")
Otra de las variables que suelen llamar la atencion es la de precios, por ello vamos a graficar un histograma asi como un diagrama cajas y bigotes para observar la distribucion de valores de esta, de manera mas detallada.
# Paso 1: Crear a histogram
hist(vivienda_faltantes$preciom,
main = "Histogram of Preciom",
xlab = "Preciom",
ylab = "Frequency",
col = "blue",
border = "black")
boxplot(vivienda_faltantes$preciom,
main = "Box Plot of Preciom",
ylab = "Preciom")
# Se divide los precios entre el 20% mayor y el 80% inferior
limite <- quantile(vivienda_faltantes$preciom, 0.8, na.rm = TRUE)
# Se crean dos subconjuntos de datos para el limite
limite_inferior <- vivienda_faltantes[vivienda_faltantes$preciom <= limite, ]
limite_superior <- vivienda_faltantes[vivienda_faltantes$preciom > limite, ]
# Create two box plots
par(mfrow = c(1, 2)) # Set up a 1x2 grid of plots
# Box plot for values below the cutoff (80%)
boxplot(limite_inferior$preciom,
main = " Precios <= 80%",
ylab = "Preciom")
# Box plot for values above the cutoff (20%)
boxplot(limite_superior$preciom,
main = "Precios > 80%",
ylab = "Preciom")
Ya teniendo el comportamiento de esta variable mas clara, hay una vision mas clara de como estan distribuidos los precios de estas viviendas. Analizaremos otras variables y luego el comportamiento entre ellas.
Ahora poder observar los datos de tipo categóricos, nos apoyamos de manera gráfica, comenzando por la observar la variable zonas
# Paso 1: Calculate frequencies of each category in the 'zona' variable
zona_freq <- table(vivienda_faltantes$zona)
# Paso 2: Se crea un pie chart con sus etiquetas
pie(zona_freq,
labels = paste(names(zona_freq), " (", zona_freq, ")", sep = ""),
main = "Distribucion datos Zona(cantidad) ")
# Paso 1: Calculate frequencies of each category in the 'zona' variable
zona_rel_freq <- prop.table(zona_freq) * 100
# Paso 2: Create a pie chart with labels
pie(zona_freq,
labels = paste(names(zona_rel_freq), " (", format(zona_rel_freq, digits = 3), "%)", sep = ""),
main = "Distribucion datos Zona(porcentaje)")
Como podemos notar la mayoría de los datos que se tienen, son de la zona Sur de Cali, probablemente alli se acumulan la mayoria de viviendas de estrato del 3 al 5. Ahora procederemos a observar la distribucion tipo de viviendas que tenemos
# Paso 1: Para arreglar los datos de la variable 'tipo'
#Hay que hacer un tratamiento de datos debido a que hay distintas formas de llenar la misma informacion, por lo cual vamos a convertir todo a mayuscula
vivienda_faltantes$tipo <- toupper(vivienda_faltantes$tipo)
#A veces se lleno el valor de vivienda con el valor de APTO en vez de APARTAMENTO
#SE CORRIJE ESTE ERROR
vivienda_faltantes$tipo <- ifelse(vivienda_faltantes$tipo == "APTO", "APARTAMENTO", vivienda_faltantes$tipo)
tipo_freq <- table(vivienda_faltantes$tipo)
# Paso 2: Calculo de frecuencias relativas
tipo_rel_freq <- prop.table(tipo_freq) * 100
# Paso 3: Create a pie chart with labels including counts and formatted relative frequencies
labels <- paste(names(tipo_freq), "\nCantidad: ", tipo_freq, "\nPorcentaje: ", format(tipo_rel_freq, digits = 2), "%", sep = "")
# Paso 4: Create the pie chart
pie(tipo_freq, labels = labels, main = "Distribucion Tipo Vivienda")
Según lo anterior tenemos una mayor cantidad de apartamentos que de casas, tal vez sea mejor analizar por separado cada caso. Ahora pasaremos a revisar la varacion de los precios de acuerdo a las variables, empezando por la relacion entre la cantidad de Habitaciones, baños y parqueaderos con respecto al precio.
plot(vivienda_faltantes$habitac,vivienda_faltantes$preciom,
main = "Precios por Cant. De Habitacion",
ylab = "Preciom",
xlab = "Cant. Habitaciones")
plot(vivienda_faltantes$banios,vivienda_faltantes$preciom,
main = "Precios por Cant. De Banos",
ylab = "Preciom",
xlab = "Cant. Banos")
plot(vivienda_faltantes$parquea,vivienda_faltantes$preciom,
main = "Precios por Cant. De Parqueaderos",
ylab = "Preciom",
xlab = "Cant. Parqueaderos")
Se ve que hay una ligera diferencia o tendencia a crecimiento a los precios de 2 a 4 habitaciones pero no es muy marcado, en cambio con la cantidad de baños si parece tener mayor inferencia sobre el precio final de la vivienda, y aun mas el numero de parqueaderos que pareciera nos ayuda mas a segmentar los datos, para un futuro agrupamiento.
Ahora revisaremos como afecta el area construida el precio final de la vivienda.
plot(vivienda_faltantes$areaconst,vivienda_faltantes$preciom,
main = "Precios por Area Construida",
ylab = "Preciom",
xlab = "Area Construida")
Hay un correlacion directamente proporcional entre ambas variables. Procedemos a ver como afecta el estrato el precio y que tanta relacion tienen estas dos varibales.
boxplot(preciom ~ estrato, data = vivienda_faltantes, main = "Distribucion de Precio por Estrato")
# Customize x-axis tick marks to display only integers
#axis(1, at = round(unique(vivienda_faltantes$estrato)),
# labels = round(unique(vivienda_faltantes$estrato)))
Luego de esto precedemos a ver como afecta el precio la zona donde se ubica la vivienda, para esto hacemos un boxplot que nos ayuda a ver entre que rango de valores suele distribuirse la variable y nos da idea de su distribucion.
#Boxplot sencillo de distribucion de precio
boxplot(preciom ~ zona, data = vivienda_faltantes, main = "Distribucion de Precio por Zona")
Como el tipo de vivienda y el estrato tambien suelen ser variables que afecten mucho el valor, procedemos a ver como se comporta antes este caso.
# Tipos de Vivienda a Filtrar
tipo_values <- c("APARTAMENTO", "CASA")
# Creacion de subconjunto de datos para los tipos de variables
filtered_datasets <- lapply(tipo_values, function(tipo) {
filter_data <- vivienda_faltantes[vivienda_faltantes$tipo == tipo, ]
return(filter_data)
})
# Creacion de plot para cada subconjunto de datos filtrados
for (i in 1:length(filtered_datasets)) {
boxplot(preciom ~ estrato, data = filtered_datasets[[i]], main = paste("Distribucion de Precio por ", tipo_values[i]))
}
Hasta el momento parece que los precios en apartamentos son menos dispersos que los que se observan cuando son casas, para ello vamos a graficar como se comporta el precio si segmentamos por estas variables.
# Estrat de Vivienda a Filtrar
tipo_values <- c("APARTAMENTO", "CASA")
# Creacion de subconjunto de datos para los tipos de variables
filtered_datasets <- lapply(tipo_values, function(tipo) {
filter_data <- vivienda_faltantes[vivienda_faltantes$tipo == tipo, ]
return(filter_data)
})
# Creacion de plot para cada subconjunto de datos filtrados
for (i in 1:length(filtered_datasets)) {
plot(preciom ~ areaconst, data = filtered_datasets[[i]], main = paste("Distribucion de Precio por ", tipo_values[i]))
}
Confirmamos que observar una tendencia en los precios por el dato de area construida es mas visible sobre apartamentos que sobre casas.
Ya teniendo una revision a todas las variables procedemos a generar algo de discusion sobre los resultados vistos.
Lo primero que hay que resaltar es que hay oportunidades de mejora con respecto a la calidad de los datos, ya sea en completitud o estandarizacion de valores, hay varias columnas con datos faltantes, esto podría generar una mejor operacionalidad entre las personas que usan esta informacion para las ventas.
Segundo hay que discutir si no se está perdiendo oportunidad de negocio sobre algunas zonas de la ciudad o con respecto al estrato, ya que se puede evaluar la posibilidad de conseguir viviendas economicas sobre estos sitios, para otros perfiles de compradores no contemplados.
Un buen tratamiento de datos es necesario para generar un algún tipo de modelo que pueda ayudar al mejoramiento en los procesos de una compañía. Se evidencia una falta de curaduría en los datos, incluir un equipo que me ayude a mejorar la calidad de los datos es importante para evitar tiempo en reprocesos de información, y dedicarse simplemente al análisis y entendimiento de los datos, así como de generar modelos de matemáticos o predictivos que generen valor al negocio de B&C.
Otra cosa observable en los datos, es que hay una cantidad de datos nada despreciable que puede afectar modelos que se generen a partir de los datos, se hizo una separación de la variable preciom entre el 80% y el 20% y esta variable parecía cumplir con dos distribuciones diferentes, el segmentar las poblaciones de mis datos me podría ayudar a entender mejor mis datos para cada uno de los casos y poder determinar cuál es el mejor valor estimado para otras viviendas similares, o incluso si es posible recalcular el precio de una vivienda.
Dentro de las variables que me afectan el precio se esperaría que la cantidad de habitaciones sea un claro determinador del precio, pero se observa como la cantidad de baños o parqueaderos puede parecen un poco más correlacionadas con el precio. Pero las variables que más parecen estar realmente relacionadas con el precio son el del estrato y el área construido, este análisis sobre relación entre variables nos puede ayudar a prescindir de algunas de ellas para facilitar el análisis de los datos, ejemplo si vemos que la cantidad de habitaciones y la cantidad de baños están igualmente relacionadas con el valor de la vivienda, podemos prescindir de algunas de las dos, dependiendo cual este mas relacionada y de la cual se posean más datos, en este caso podría ser la cantidad de baños y prescindir de la variable de cantidad de habitaciones.
Otra cosa que se suele observar es que variables como el tipo de vivienda, y su valor respecto a otras zonas me puede indicar si una zona está sufriendo cambios. Por ejemplo, en la zona Sur parece haber una cantidad de casas de valor alto considerable en comparación del resto de zonas, esto nos podría indicar que está en proceso de densificación y que constructoras están tratando de comprar casas de esta zona para poder construir apartamentos y venderlos a precios similares a los que tienen las casas.
Y finalmente podemos observar cómo los precios en los apartamentos suelen presentar menor cantidad de datos atípicos que con casas, las casas los valores suelen presentar mayor cantidad de estos datos atípicos, seguramente debido a que a pesar de la zona o el estrato puedan poseer una gran área sobre la cual están construidas, mientras que los apartamentos suelen tener un área de construcción en un rango mucho más contenido.
Y quisiera remarcar el hecho de que en los datos hay tanto estratos como zonas en las que se puede estar perdiendo oportunidad de ganancia, debido a que no se tiene en cuenta la posibilidad trabajar con viviendas de estratos menores al 3.