que es el data enrichment
Flecha al alza formada por decenas de datos interconectados.

¿Qué Es El Data Enrichment?

El data enrichment -en español, enriquecimiento de datos- es el proceso de agregar información adicional a datos existentes para hacerlos más útiles y valiosos. Esta información puede ser extraída de diversas fuentes; ya sea mediante bases de datos externas, datos internos de la empresa, técnicas de web scraping, minería de datos, uso de API de terceros, o introducidos manualmente.

¿Cómo Se Realiza El Data Enrichment?

El proceso de data enrichment puede implementarse de diversas formas. Por un lado, puede ser realizado manualmente, implicando la tarea de agregar individualmente datos a un conjunto existente. Esta metodología es laboriosa, pero permite un control granular de la información que se añade. En otro sentido, el enriquecimiento también puede venir de fuentes externas. Esto significa que los datos se agregan desde otras bases de datos o hojas de cálculo, expandiendo el volumen de información a partir de recursos previamente existentes.

Por otro lado, una forma indirecta pero igualmente válida de enriquecer los datos es a través de la limpieza de datos. Si no hay información valiosa para agregar, mejorar la calidad del conjunto de datos existente puede pasar por eliminar inconsistencias y errores presentes en los datos. Finalmente, la integración se refiere a la combinación de datos de varias fuentes en un solo conjunto de datos. Este enfoque suele implicar procesos de extracción, transformación y carga, que buscan unificar y enriquecer los datos provenientes de diferentes orígenes. Cada una de estas estrategias tiene como meta final incrementar la utilidad y el valor de los conjuntos de datos existentes.

Ejemplo Con Python

Para visualizar mejor el proceso de data enrichment, se presenta este ejemplo reproducible donde mediante a partir del nombre de 50 libros se obtendrán el autor y la descripción de cada uno, utilizando la información de la plataforma Goodreads. Para ello:

I) Instalamos requests, bs4 y pandas:

pip install requests beautifulsoup4 pandas

II) Importamos las librerías necesarias:

import requests
from bs4 import BeautifulSoup
import pandas as pd
import time
import random

III) Establecemos la cabecera de agente de usuario para realizar las peticiones pertinentes:

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'
}

IV) Definimos la primera función:

def get_book_page_url(session, title, retries=5):
    """
    Obtiene la URL de la página de un libro en Goodreads utilizando la sesión de requests y el título del libro proporcionados.
    
    La función intentará hacer la solicitud `retries` veces antes de rendirse. En cada fallo,
    la función esperará un período de tiempo antes de reintentar. Este tiempo de espera aumenta exponencialmente
    con cada intento fallido para prevenir la sobrecarga del servidor.

    Args:
        session (requests.Session): La sesión utilizada para hacer las solicitudes HTTP.
        title (str): El título del libro para el cual se desea obtener la URL de la página.
        retries (int, opcional): El número de veces que la función intentará obtener la URL en caso de fallo. Por defecto es 5.

    Returns:
        str: La URL de la página del libro en el sitio web de Goodreads, o None si no se pudo obtener la URL después de
             `retries` intentos.

    Raises:
        Puede generar varias excepciones si hay problemas de red, si la estructura de la página web cambia, o si el servidor
        rechaza la solicitud HTTP.
    """
    base_url = "https://www.goodreads.com"
    search_url = base_url + "/search?q=" + title.replace(" ", "+") + "&search_type=authors&search_field=title"

    for i in range(retries):
        try:
            response = session.get(search_url, headers=HEADERS, timeout=5)
            response.raise_for_status()
            soup = BeautifulSoup(response.content, "html.parser")
            book_url = soup.find_all("a", class_="bookTitle")[0].get('href')
            return base_url + book_url
        except (requests.HTTPError, requests.ConnectionError, requests.Timeout, IndexError):
            time.sleep(2 ** i + random.random())
            continue

    return None

V) Definimos la segunda función:

def get_book_info(session, url, retries=5):
    """
    Obtiene información de un libro en Goodreads utilizando la sesión de requests y la URL proporcionada.

    La función intentará hacer la solicitud `retries` veces antes de rendirse. En cada fallo,
    la función esperará un período de tiempo antes de reintentar. Este tiempo de espera aumenta exponencialmente
    con cada intento fallido para prevenir la sobrecarga del servidor.

    Args:
        session (requests.Session): La sesión utilizada para hacer las solicitudes HTTP.
        url (str): La URL de la página del libro en Goodreads.
        retries (int, opcional): El número de veces que la función intentará obtener la información del libro en caso de fallo.
                                  Por defecto es 5.

    Returns:
        tuple: Un tuple con el título del libro, el autor y la descripción, o una cadena vacía y un mensaje "No description for this book"
               si no se pudo obtener la información después de `retries` intentos.

    Raises:
        Puede generar varias excepciones si hay problemas de red, si la estructura de la página web cambia, o si el servidor
        rechaza la solicitud HTTP.
    """
    if url is None:
        return "", "", "No description for this book"
        
    for i in range(retries):
        try:
            book_page = session.get(url, headers=HEADERS, timeout=5)
            book_page.raise_for_status()
            soup = BeautifulSoup(book_page.content, "html.parser")
            title = soup.find("h1", {"data-testid": "bookTitle"}).get_text(strip=True)
            author = soup.find("span", {"data-testid": "name"}).get_text(strip=True)
            description = soup.find("span", class_="Formatted").get_text(strip=True)

            if not description:
                description = "No description for this book"

            unwanted_texts = ['An alternative cover for this ASIN can be foundhere', 'For previous cover edition seehere']
            for text in unwanted_texts:
                description = description.replace(text, '')

            return title, author, description
        except (requests.HTTPError, requests.ConnectionError, requests.Timeout, AttributeError):
            time.sleep(2 ** i + random.random())
            continue

    return "", "", "No description for this book"

VI) Definimos la tercera función:

def main():
    """
    Lee un archivo CSV que contiene una columna 'title' con títulos de libros, enriquece cada fila con la información del autor
    y la descripción obtenida de Goodreads, y finalmente guarda el DataFrame enriquecido en un nuevo archivo CSV.

    La función utiliza una sesión de requests para hacer múltiples solicitudes HTTP a Goodreads en un solo bloque de conexión TCP,
    lo cual es más eficiente que abrir y cerrar una nueva conexión para cada solicitud.

    Args:
        Ninguno

    Returns:
        Ninguno. Sin embargo, como efecto secundario, la función guarda un nuevo archivo CSV llamado 'goodreads_enriched.csv' con
        la información enriquecida.

    Raises:
        Puede generar varias excepciones si hay problemas de red, si la estructura de la página web cambia, o si el servidor
        rechaza la solicitud HTTP.
    """
    df = pd.read_csv("https://forodatos.com/multimedia/datos/goodreads.csv")

    titles = []
    authors = []
    descriptions = []

    with requests.Session() as session:
        for title in df['title']:
            url = get_book_page_url(session, title)
            retrieved_title, author, description = get_book_info(session, url)
            titles.append(retrieved_title)
            authors.append(author)
            descriptions.append(description)

    df['title'] = titles
    df['author'] = authors
    df['description'] = descriptions

    df.to_csv("goodreads_enriched.csv", index=False)

"""
El tiempo de ejecución del proceso es de ~10 minutos, como consecuencia de las limitaciones presentes en la plataforma de la cual se extrae la información.

También puede dar lugar a datos faltantes y errores en el formato del CSV, en base a la cantidad de peticiones fallidas.
"""

if __name__ == "__main__":
    main()

La ejecución de este codigo generará un archivo csv “goodreads_enriched.csv” con los títulos presentes en “goodreads.csv” junto con sus respectivos datos de autor y descripción.

¿Por Qué Es Importante?

Podemos considerar las siguientes razones:

  • Mejores decisiones: los datos enriquecidos contienen información extraordinariamente precisa y completa, cualidades que se pueden aprovechar para tomar mejores decisiones.
  • Análisis mejorados: ayuda realizar análisis con un mayor nivel de precisión y detalle; lo que nos permite comprender de mejor manera los patrones, tendencias y relaciones que presentan los datos a tratar.
  • Mayor productividad: al automatizar el proceso de data enrichment, podemos ahorrar tiempo a la vez que aprovechamos las ventajas de esta técnica.
  • Calidad del servicio: al tener datos enriquecidos, las empresas entienden mejor a sus clientes y adaptar los productos-servicios según las necesidades que estos presenten.

Tipos De Data Enrichment

Destacamos 5 tipos de data enrichment, cada uno con su propio propósito y aplicaciones específicas::

  1. Enriquecimiento demográfico: al conjunto de datos se le añade información como la edad, renta, sexo y ubicación geográfica. Este tipo de enriquecimiento es particularmente útil en la segmentación de mercados, permitiendo a las empresas adaptar sus estrategias de marketing a grupos demográficos específicos.
  2. Enriquecimiento firmográfico: agrega información como la industria, facturación y cantidad de empleados de una empresa. Esto es vital para la generación de leads B2B, permitiendo a las empresas identificar prospectos con características específicas.
  3. Enriquecimiento tecnológico: se añade información sobre el stack tecnológico de la empresa, incluyendo el software y hardware empleado. Este tipo de data enrichment ayuda a las empresas tecnológicas a entender mejor las necesidades y limitaciones de sus clientes.
  4. Enriquecimiento contextual: se agrega el contexto donde se produjo una actividad o evento relacionado con el dataset existente. De gran valor en industrias donde el contexto influye en la interpretación de los datos, como en análisis de redes sociales o estudios de comportamiento del consumidor.
  5. Enriquecimiento preferencial: se añaden datos relacionados con el comportamiento en línea del usuario, como sitios webs visitados o resultados de encuestas. Lo que mejorarla personalización y la eficacia de las estrategias de marketing digital.

Utilidad Del Proceso

El data enrichment se emplea en diferentes industrias, como:

  • Publicidad: al enriquecer los datos de los clientes con información sobre su comportamiento y preferencias, las empresas pueden crear campañas de marketing optimizadas para un target concreto.
  • Atención médica: al añadir -y mantener una rigurosa- información sobre el paciente como preferencias, alergias e historial de ingresos; el personal médico podría brindar una atención más cercana y efectiva.
  • Retail: los minoristas utilizan el data enrichment para comprender mejor las preferencias de compra de sus clientes y ajustar su inventario y estrategias de marketing en consecuencia.
  • Finanzas: los analistas financieros toman decisiones más sensatas gracias a tener información adicional sobre el desempeño de la empresa y las tendencias de la industria.
  • E-Commerce: las tiendas en línea enriquecen sus datos con información demográfica y preferencial para personalizar las experiencias de los usuarios, mejorar las recomendaciones de productos y optimizar sus campañas de marketing digital.

Desafíos & Mejores Prácticas

Hay varios aspectos a tener en cuenta a la hora de poner en práctica el data enrichment:

  1. Calidad: es crucial que los datos que se agregan sean precisos y actualizados, esto se logra mediante el uso de fuentes confiables y una limpieza periódica de los datos.
  2. Privacidad: hay que tener en cuenta las leyes de protección de datos al realizar el proceso de data enrichment. Asegurándose de que se haya dado el consentimiento necesario y de que los datos estén protegidos. Esto requiere de una familiarización con reglamentos como la LOPD y la CCPA, entre otros, que dictan normas estrictas sobre cómo se deben manejar los datos personales.
  3. Integración: al combinar datos de diferentes fuentes, debemos asegurarnos de que los datos sean compatibles entre sí. Esto requiere la estandarización de formatos de datos e incluso el uso de software especializado en integración de datos.
  4. Gobernanza: ser claro en las pautas y procesos necesarios para el data enrichment ayuda a garantizar el uso adecuado de los datos y que se mantengan fiables con el transcurso del tiempo.
  5. Seguridad: es muy importante garantizar la seguridad de los datos, para evitar posibles filtraciones de datos.

Conclusión

El data enrichment es una técnica muy útil que ayuda a mejorar la precisión y utilidad de los conjuntos de datos. Al incorporar información adicional, las empresas y organizaciones pueden tomar mejores decisiones y análisis, mejorando la calidad de los productos y servicios. Sin olvidar la calidad de los datos añadidos, y estableciendo instrucciones claras para un buen data governance.