Volver a la lista

Limpieza de datos: permite utilizar datos sin procesar.

Se explican paso a paso los fundamentos de las técnicas de limpieza para detectar y tratar valores faltantes, duplicados y valores atípicos en datos reales, utilizando pandas.

Principiante
|
8min
|
Verificado (2026-07)
purificación de datosvalores faltantesvalores atípicoseliminación de duplicadoscalidad de datos
Progreso0/17 (0%)

Limpieza de datos: preparación de los datos para su uso

Al finalizar este tema

Podrás identificar y solucionar problemas comunes en los datos reales, como los valores faltantes, los duplicados y los valores atípicos.


¿Por qué es necesaria la limpieza de datos?

Los datos del mundo real no siempre son perfectos. Pueden tener respuestas incompletas en las encuestas, entradas duplicadas de la misma persona o incluso filas con edades negativas, como -5 años. Analizar estos datos sin procesarlos puede generar resultados poco fiables.

Se estima que entre el 60 y el 80 % del trabajo de análisis de datos se dedica a la limpieza. Esta etapa es mucho más importante que aplicar técnicas de análisis sofisticadas.


Paso 1: Obtener una visión general de los datos

python
import pandas as pd
df = pd.read_csv("patients.csv")
# Información básica
print(df.shape) # (1000, 8) — 1000 filas, 8 columnas
print(df.dtypes) # Tipo de datos de cada columna
print(df.info()) # Resumen que incluye estado de valores faltantes
# Verificar inicio/final
print(df.head()) # Primeras 5 filas
print(df.tail()) # Últimas 5 filas
# Resumen estadístico
print(df.describe()) # Media, desviación estándar, mínimo/máximo de columnas numéricas, etc.

Al ejecutar df.info(), se muestra el recuento de valores no nulos. Si este recuento es menor que el número total de filas, significa que hay valores faltantes. En df.describe(), si los valores mínimo y máximo están fuera de un rango razonable, se deben investigar posibles valores atípicos.


Paso 2: Manejo de valores faltantes

python
# Verificar valores faltantes
print(df.isnull().sum())
# name 0
# age 15
# blood_type 3
# weight 42
# Estrategia 1: Eliminar — cuando las filas con valores faltantes son minoría
df_clean = df.dropna(subset=["blood_type"]) # Elimina 3 filas sin blood_type
# Estrategia 2: Rellenar — columnas numéricas
df["age"] = df["age"].fillna(df["age"].median()) # Con la mediana
df["weight"] = df["weight"].fillna(df["weight"].mean()) # Con la media
# Estrategia 3: Rellenar con un valor específico
df["blood_type"] = df["blood_type"].fillna("Desconocido")

La estrategia a utilizar depende del contexto.

  • Si la proporción de valores faltantes es inferior al 5 %, la opción más segura es eliminarlos.
  • Para las variables numéricas, se imputan con la mediana (robusta frente a los valores atípicos) o la media.
  • Para las variables categóricas (tipo de sangre, género), se imputan con la moda o con la opción "no especificado".

Paso 3: Eliminación de duplicados

python
# Verificar duplicados
print(df.duplicated().sum()) # 23 filas duplicadas
# Ver contenido de los duplicados
print(df[df.duplicated(keep=False)]) # Muestra tanto el original como los duplicados
# Eliminar duplicados (conservar la primera aparición)
df = df.drop_duplicates()
# Eliminación de duplicados por columna específica
df = df.drop_duplicates(subset=["patient_id"], keep="last")

keep="first" conserva la primera fila y elimina las demás. keep="last" conserva la última. Si los datos están ordenados cronológicamente, last conserva el registro más reciente.


Paso 4: Detección de valores atípicos

python
# Verificar con estadísticas básicas
print(df["age"].describe())
# min: -5 ← anómalo
# max: 200 ← anómalo
# Filtrado por rango
df = df[(df["age"] >= 0) & (df["age"] <= 120)]
# Método IQR — detección estadística de valores atípicos
Q1 = df["weight"].quantile(0.25)
Q3 = df["weight"].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df["weight"] < lower) | (df["weight"] > upper)]
print(f"Se encontraron {len(outliers)} valores atípicos")
# Eliminación de valores atípicos
df = df[(df["weight"] >= lower) & (df["weight"] <= upper)]

No se deben eliminar los valores atípicos sin más. Si bien una edad de -5 es un error evidente que debe eliminarse, un peso de 150 kg podría ser un valor real. El conocimiento del dominio es clave para determinar qué se considera un valor atípico.


Paso 5: Conversión de tipos y unificación de formatos

python
# Números como cadenas → tipo numérico
df["age"] = pd.to_numeric(df["age"], errors="coerce")
# Cadenas de fecha → datetime
df["visit_date"] = pd.to_datetime(df["visit_date"])
# Limpieza de cadenas: eliminar espacios iniciales/finales y unificar mayúsculas/minúsculas
df["name"] = df["name"].str.strip()
df["blood_type"] = df["blood_type"].str.upper()

errors="coerce" procesa los valores no convertibles (por ejemplo, "N/A") como NaN. Esto resulta útil para grandes conjuntos de datos, ya que permite continuar el proceso sin generar errores.


Resumen clave

PasoAspecto a verificarHerramientas principales
Visión generalNúmero de filas/columnas, tipos de datos, estado de los valores faltantesinfo(), describe()
Valores faltantesVerificar la proporción → eliminar o imputarisnull(), fillna(), dropna()
DuplicadosFilas idénticas o duplicados según una claveduplicated(), drop_duplicates()
Valores atípicosRango razonable + IQRdescribe(), filtrado por rango
Tipos/formatoUnificar números, fechas y cadenas de textoto_numeric(), to_datetime(), str.strip()

La limpieza de datos es una tarea repetitiva y tediosa, pero omitir este paso comprometerá todos los resultados del análisis posterior. "Garbage in, garbage out": si la entrada es incorrecta, la salida también lo será.


💬 Preguntas y comentarios

0 comentarios

Puedes publicar sin iniciar sesión. Los comentarios de invitados no pueden editarse ni eliminarse después.

0/2000

Cargando...