Skip to content

Precios viviendas en la República Dominicana

Este proyecto tiene como objetivo comparar los costos de compra y alquiler de viviendas en la República Dominicana, utilizando datos recopilados a través de web scraping del sitio web Precios Mundi. El análisis se realizará utilizando Python, BeautifulSoup y Seaborn, y los resultados se presentarán en un Jupyter Notebook que se publicará en línea y en Github.

Jimmy R. Coste Yost

_Creación Julio 2023

_Revisión Mayo 2024

Metodología

Definición del Problema:

Objetivo: Comparar los precios de compra y alquiler de viviendas por tipo en la República Dominicana y su relación con los salarios.

Recopilación de Datos:

Identificar la fuente de datos: https://preciosmundi.com/republica-dominicana/precio-vivienda-salarios Utilizar webscraping para obtener los datos de precios de viviendas y salarios.

Procesamiento y Preparación de Datos:

Limpiar y estructurar los datos obtenidos del webscraping. Unir los datos de precios de viviendas y salarios en un único dataset.

Análisis Exploratorio de Datos:

Explorar los datos para comprender la distribución y las relaciones entre los precios de viviendas y los salarios.

Modelado y Evaluación:

Crear visualizaciones para comparar los precios de viviendas y salarios.

0. Preparo el terreno

Definición del Problema:

Objetivo: Comparar los precios de compra y alquiler de viviendas por tipo en la República Dominicana y su relación con los salarios.

Utilizaremos Python con las bibliotecas BeautifulSoup y Seaborn para realizar el webscraping y crear visualizaciones. Asegúrate de tener instaladas estas bibliotecas antes de continuar.

Primero, necesitaremos importar las bibliotecas necesarias y luego realizar el webscraping para obtener los datos de precios de viviendas y salarios en la República Dominicana.

# Importar bibliotecas
import re
import requests
from bs4 import BeautifulSoup
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.stats import f_oneway

Recopilación de Datos:

Identificar la fuente de datos: https://preciosmundi.com/republica-dominicana/precio-vivienda-salarios Utilizar webscraping para obtener los datos de precios de viviendas y salarios. Importo con el método de "Web Scrapping" los precios de las viviendas y los salarios en la República Dominicana, publicados por Precios Mundi.

Defino la URL de la página web de Precios Mundi: https://preciosmundi.com/republica-dominicana/precio-vivienda-salarios Realizo una solicitud GET a la URL utilizando la biblioteca requests. Analizo el contenido HTML de la respuesta utilizando BeautifulSoup. Extraigo los datos relevantes de los precios de compra y alquiler, por tipo de vivienda, utilizando expresiones regulares o XPath. Almaceno los datos extraídos en un DataFrame de pandas. Extraigo el contenido HTML de la página web utilizando la función requests.get()

# Definir la URL del sitio web
url = "https://preciosmundi.com/republica-dominicana/precio-vivienda-salarios"

# Agregar un encabezado de agente de usuario a la solicitud para simular un navegador web
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}

# Realizar la solicitud GET al sitio web con el encabezado de agente de usuario
response = requests.get(url, headers=headers)

# Verificar si la solicitud fue exitosa
if response.status_code == 200:
    # Parsear el contenido HTML usando BeautifulSoup
    soup = BeautifulSoup(response.content, "html.parser")
    
    # Encontrar la tabla que contiene los datos de precios de viviendas y salarios
    table = soup.find("table")
    
    # Extraer los datos de la tabla y almacenarlos en un DataFrame de Pandas
    df = pd.read_html(str(table))[0]
    
    # Mostrar los primeros registros del DataFrame
    df.describe()
else:
    print("Error al obtener la página:", response.status_code)

Procesamiento y Preparación de Datos:

En esta fase, limpiaremos y prepararemos los datos para el análisis exploratorio. Esto puede incluir la eliminación de valores nulos, la conversión de tipos de datos y la combinación de diferentes conjuntos de datos si es necesario.

Limpiar y estructurar los datos obtenidos del webscraping.

df.describe()
# Eliminar la columna adicional "Unnamed: 4"
df = df.drop(columns=["Unnamed: 4"])

# Eliminar las filas que contienen los encabezados de sección
df = df.drop(index=[0, 5, 8, 10])

# Resetear el índice
df = df.reset_index(drop=True)

# Renombrar las columnas para que sean más descriptivas
df.columns = ["Producto", "Precio DOP", "Precio USD", "Precio EUR"]

# Cambiar el nombre del registro específico dentro de la columna "Producto"
df["Producto"] = df["Producto"].replace({"Salario (sueldo mensual) medio después de impuestos (neto)": "SalarioNeto"})

# Mostrar los primeros registros del DataFrame procesado
df
# Eliminar el texto alfanumérico y los signos de puntuación de la columna "Precio RD$"
df["Precio DOP"] = df["Precio DOP"].apply(lambda x: re.sub(r'[^0-9]', '', x)[:-2])

# Convertir la columna "Precio RD$" a tipo numérico
df["Precio DOP"] = pd.to_numeric(df["Precio DOP"])

# Eliminar el texto alfanumérico, los signos de puntuación y los últimos dos ceros decimales de la columna "Precio USD"
df["Precio USD"] = df["Precio USD"].apply(lambda x: re.sub(r'[^\d.]', '', x)[:-2])

# Convertir la columna "Precio USD" a tipo numérico
df["Precio USD"] = pd.to_numeric(df["Precio USD"])

# Eliminar el texto alfanumérico, los signos de puntuación y los últimos dos ceros decimales de la columna "Precio EUR"
df["Precio EUR"] = df["Precio EUR"].apply(lambda x: re.sub(r'[^\d.]', '', x)[:-2])

# Convertir la columna "Precio EUR" a tipo numérico
df["Precio EUR"] = pd.to_numeric(df["Precio EUR"])

Análisis Exploratorio de Datos:

Explorar los datos para comprender la distribución y las relaciones entre los precios de viviendas y los salarios.

# Seleccionar los registros correspondientes a "Alquiler" y "Compra"
alquiler_df = df.iloc[:4]
compra_df = df.iloc[4:6]
Visualización

Genero un gráfico de columnas usando Seaborn, con el valor de las viviendas en Pesos Dominicanos

# Configurar el estilo y tamaño de las visualizaciones
sns.set(style="whitegrid")
plt.figure(figsize=(10, 6))

# Crear la visualización para cada producto de alquiler
sns.barplot(x="Producto", y="Precio DOP", data=alquiler_df, color="blue", alpha=0.7, label="RD$")

# Añadir título y etiquetas de los ejes
plt.title("Precios de alquiler por moneda")
plt.xlabel("Producto")
plt.ylabel("Precio")

# Rotar las etiquetas del eje x para mejorar la legibilidad
plt.xticks(rotation=45, ha='right')

# Añadir una leyenda
plt.legend()

# Mostrar la visualización
plt.tight_layout()
plt.show()
# Configurar el estilo y tamaño de las visualizaciones
sns.set(style="whitegrid")
plt.figure(figsize=(10, 6))

# Crear la visualización para cada producto de compra en Precio DOP
sns.barplot(x="Producto", y="Precio DOP", data=compra_df, color="blue", alpha=0.7)

# Añadir título y etiquetas de los ejes
plt.title("Precios de compra en Precio DOP")
plt.xlabel("Producto")
plt.ylabel("Precio DOP")

# Rotar las etiquetas del eje x para mejorar la legibilidad
plt.xticks(rotation=45, ha='right')

# Mostrar la visualización
plt.tight_layout()
plt.show()