
🚀 Tutorial de Ciencia de Datos: Exploración Inicial de un Dataset (EDA) en JupyterLab
¡Hola a todos/as! 👋
Una vez que habéis cargado el conjunto de datos de viviendas de California (California Housing Dataset) en vuestro cuaderno de JupyterLab, el siguiente paso obligatorio en cualquier proyecto de Machine Learning es realizar un Análisis Exploratorio de Datos (EDA).
En este dataset, cada fila representa un distrito escolar y disponemos de 10 atributos:
- Ubicación:
longitude,latitude - Datos de la vivienda:
housing_median_age,total_rooms,total_bedrooms,households,median_house_value - Demografía y socioeconomía:
population,median_income - Ubicación geográfica:
ocean_proximity
A continuación, repasaremos las herramientas fundamentales de Pandas y Matplotlib para inspeccionar la estructura, calidad y distribución de los datos.
1. Inspección general con housing.info()
El método .info() es vuestra primera parada. Nos muestra una descripción rápida de la tabla: el número total de filas, el tipo de dato de cada columna y cuántos valores no nulos hay.
Python
housing.info()
🔍 ¿En qué debemos fijarnos?
- Tamaño del dataset: Tenemos 20,640 instancias (distritos). En el mundo real del ML es un dataset pequeño, pero es perfecto para aprender.
- Valores faltantes (Missing values): Fijaos en que
total_bedroomssolo tiene 20,433 valores no nulos. Esto significa que hay 207 distritos sin este dato. Tendremos que solucionar esto más adelante en la fase de limpieza. - Tipos de datos: La mayoría de atributos son numéricos, excepto
ocean_proximity, cuyo tipo figura comoobject.

2. Análisis de variables categóricas con value_counts()
Dado que cargamos los datos desde un CSV y ocean_proximity es de tipo object, sabemos que contiene texto. Si observáis las primeras filas, los valores se repiten, lo que indica que es una variable categórica.
Para descubrir qué categorías existen y cuántos distritos pertenecen a cada una, utilizamos .value_counts():
Python
housing["ocean_proximity"].value_counts()
Resultado obtenible en la consola:
Plaintext
<1H OCEAN 9136
INLAND 6551
NEAR OCEAN 2658
NEAR BAY 2290
ISLAND 5
Name: ocean_proximity, dtype: int64
💡 Observación: La gran mayoría de distritos están a menos de una hora del océano o en el interior, mientras que la categoría
ISLANDes sumamente rara (solo 5 distritos).
3. Resumen estadístico numérico con describe()
Para las variables numéricas, el método .describe() genera un resumen estadístico automático:
Python
housing.describe()
📊 Cómo interpretar la tabla resumen:
count,mean,minymax: Muestran la cantidad de valores válidos, la media, el mínimo y el máximo. (Notad que los valores nulos se ignoran:total_bedroomsindica 20,433).std(Desviación Estándar $\sigma$): Mide qué tan dispersos están los valores respecto a la media.📐 Recordatorio teórico (Regla empírica 68-95-99.7): Cuando una variable sigue una distribución normal o gaussiana (en forma de campana), aproximadamente el 68% de los datos cae a $\pm 1\sigma$ de la media, el 95% a $\pm 2\sigma$, y el 99.7% a $\pm 3\sigma$.25%,50%,75%(Percentiles / Cuartiles): Muestran el valor por debajo del cual cae un determinado porcentaje de observaciones.- Por ejemplo: el 25% de los distritos tiene una antigüedad media (
housing_median_age) menor a 18 años. - El 50% (la mediana) es menor a 29 años.
- El 75% es menor a 37 años.
- Por ejemplo: el 25% de los distritos tiene una antigüedad media (
4. Visualización con Histogramas (hist())
La mejor forma de “sentir” cómo se distribuyen los datos es graficar un histograma para cada variable numérica. Un histograma muestra el número de instancias (eje vertical) para un rango de valores determinado (eje horizontal).
En lugar de hacer las gráficas una por una, podemos llamar a .hist() directamente sobre todo el DataFrame:
Python
%matplotlib inline # Solo necesario en cuadernos Jupyter
import matplotlib.pyplot as plt
housing.hist(bins=50, figsize=(20, 15))
plt.show()
📌 ¿Qué significa %matplotlib inline?
Matplotlib necesita un backend gráfico para dibujar. El comando mágico %matplotlib inline le indica a JupyterLab que utilice su propio backend integrado para mostrar las gráficas directamente debajo de la celda de código.
(Nota: En JupyterLab, llamar a plt.show() es opcional, ya que el cuaderno muestra los gráficos de manera automática al ejecutar la celda).

🎯 Ejercicio práctico para la sesión
- Ejecutad estos comandos en vuestro JupyterLab.
- Analizad los histogramas resultantes: ¿Qué variables tienen distribuciones sesgadas hacia la derecha (right-skewed)?
- ¿Observáis algún tope o valor máximo artificial (data capping) en las gráficas de
housing_median_ageomedian_house_value?
¡Dejad vuestras observaciones en los comentarios o las comentamos en la próxima clase! 🚀




