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_onewayRecopilació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()