Autor: Fernando

  • Estadísticas Resumidas

    En el análisis de datos, especialmente cuando trabajamos con conjuntos de datos tabulares, es común que lo primero que queramos hacer sea “entender el terreno”: obtener una visión rápida de los patrones, la distribución y las características principales de las variables.
    A este proceso lo llamamos estadísticas resumidas (summary statistics), y constituye uno de los pilares del análisis exploratorio de datos (EDA, Exploratory Data Analysis).

    Estas estadísticas nos permiten responder preguntas básicas como:

    • ¿Qué tan centrados o dispersos están los datos?
    • ¿Existen valores extremos o atípicos?
    • ¿Cómo se distribuyen los valores?
    • ¿Qué categorías son más frecuentes?

    Estas herramientas —medias, dispersiones, cuartiles, gráficos y agrupaciones— nos permiten:

    • Preparar los datos para análisis más complejos.
    • Detectar errores o valores extremos.
    • Comprender patrones iniciales.

    Análisis Univariado: Explorando una Variable a la Vez

    El análisis univariado se enfoca en describir y entender una sola variable por vez. Es la forma más directa de comenzar el EDA y nos permite observar tendencias, detectar anomalías y entender el comportamiento general de los datos.

    Podemos dividirlo en dos grandes tipos:

    • Variables cuantitativas (numéricas)
    • Variables categóricas (de tipo texto o etiquetas)

    Veamos cómo se resumen y visualizan cada una.

    Variables Cuantitativas

    Medidas de Tendencia Central

    Las medidas de tendencia central buscan representar el valor “típico” o central de un conjunto de datos.

    • Media (promedio): la suma de todos los valores dividida por el número de observaciones. Es útil, pero sensible a valores atípicos.
    • Mediana: el valor que divide al conjunto en dos partes iguales. Menos afectada por outliers, representa mejor distribuciones sesgadas.
    • Moda: el valor más frecuente. Muy útil en datos categóricos o multimodales.
    • Media recortada: elimina un porcentaje de los valores más altos y bajos antes de calcular la media.
    df['column'].mean() # media
    df['column'].median() # mediana
    df['column'].mode() # Moda
    
    # Media recortada:
    from scipy.stats import trim_mean 
    trim_mean(df.column, proportiontocut=0.1)

    Medidas de Dispersión

    Describen cuánto varían los valores respecto al centro.

    • Rango: diferencia entre el valor máximo y el mínimo.
    • Varianza: mide la variabilidad cuadrática respecto a la media.
    • Desviación estándar: raíz cuadrada de la varianza; indica cuánto se alejan los datos, en promedio, de la media.
    • Desviación media absoluta (MAD): promedio de las diferencias absolutas respecto a la media.
    df['column'].max() - df['column'].min()  # rango
    df['column'].var()  # Varianza
    df['column'].std()  # Desviacion estandar
    (df.column - df.column.mean()).abs().mean()  # Desviación media absoluta

    Asimetría (Skewness) y Curtosis

    Estas métricas describen la forma de la distribución:

    • Asimetría (Skewness): indica si los datos están sesgados a la izquierda o derecha.
      • Sesgo positivo → cola larga a la derecha
      • Sesgo negativo → cola larga a la izquierda
    • Curtosis (Kurtosis): mide el peso de las colas de la distribución (presencia de valores extremos). df['column'].kurt()
      • Leptocúrtica: colas gruesas (muchos outliers)
      • Platicúrtica: colas delgadas
      • Mesocúrtica: similar a la normal
    df['column'].skew()  # Asimetría 
    df['column'].kurt()  # Curtosis

    Percentiles y Cuartiles

    Los percentiles indican el porcentaje de observaciones por debajo de un valor dado.
    Por ejemplo, el percentil 80 = 130 significa que el 80% de los valores son menores que 130.

    np.percentile(df['column'], 80)

    Los cuartiles dividen los datos en cuatro partes iguales:

    • Q1 (25%), Q2 (50% = mediana), Q3 (75%)

    El rango intercuartílico (IQR) se calcula como:

    IQR = Q3 - Q1

    y representa la dispersión central, resistente a outliers.

    Visualización: Histogramas y Boxplots

    Visualizar los datos es esencial para complementar las estadísticas numéricas.

    • Histograma: muestra la frecuencia de valores en intervalos (bins).
    sns.histplot(df['column'])
    • Boxplot (diagrama de caja): representa la mediana, los cuartiles y los valores atípicos.
    sns.boxplot(df['column'])

    Estos gráficos ayudan a detectar sesgos, simetrías y valores extremos de un vistazo.


    Variables Categóricas

    Cuando analizamos variables no numéricas (como “país”, “color” o “tipo de producto”), las estadísticas cambian.

    Frecuencias y Proporciones

    La herramienta básica es el conteo de valores:

    df['column'].value_counts()

    Y para ver proporciones:

    df['column'].value_counts(normalize=True)

    Estas proporciones nos ayudan a entender la distribución de categorías, especialmente cuando hay clases dominantes o poco representadas.

    Visualización

    • Gráficos de barras: ideales para mostrar frecuencias.
    sns.countplot(x='column', data=df)
    • Gráficos circulares (pie charts): útiles para proporciones, aunque menos precisos.

    Agrupación y Agregación de Datos

    En análisis exploratorios más profundos, necesitamos obtener estadísticas por grupo.
    Por ejemplo: ¿Cuál es el precio promedio por tipo de carrocería?

    La función groupby() de pandas permite dividir, aplicar y combinar fácilmente:

    df.groupby('body-style')['price'].mean()

    También podemos aplicar múltiples funciones de agregación:

    df.groupby(['body-style', 'drive-wheels']).agg({
        'height': 'min',
        'length': 'max',
        'price': 'mean'
    })

    Y definir agregaciones personalizadas con agg():

    df.agg({'length':['sum','min'], 'width':['max','min']})

    Este enfoque es esencial para crear tablas resumen, indicadores por categoría y comparativas entre grupos.

    Variables Categóricas Ordinales

    Algunas categorías tienen un orden lógico (por ejemplo: “bajo”, “medio”, “alto”).
    En estos casos, podemos convertirlas en variables de tipo category ordenadas para analizarlas numéricamente:

    order = ['Preschool', 'Primary', 'Secondary', 'College', 'Graduate']
    df['education'] = pd.Categorical(df['education'], categories=order, ordered=True)

    Esto permite calcular la mediana de la categoría:

    median_index = np.median(df['education'].cat.codes)
    order[int(median_index)]

    Importante:

    Aunque podemos asignar números, no debemos calcular medias si las distancias entre categorías no son uniformes.

  • Tratamiento de datos sesgados

    En el diseño de arquitecturas de Machine Learning, la calidad de las predicciones de un modelo no depende únicamente de la complejidad del algoritmo matemático seleccionado, sino de la forma geométrica de los datos que le suministramos.

    Muchos algoritmos fundamentales (como la Regresión Lineal, la Regresión Logística o las Redes Neuronales) asumen de manera implícita que las variables numéricas de entrada siguen una Distribución Normal (o Gaussiana). Sin embargo, en el mundo real, los datos de negocio suelen ser imperfectos y presentan sesgo o asimetría (skewness), acumulando la mayoría de sus registros en un extremo y extendiendo una larga cola en el sentido opuesto.

    En este artículo analítico, abordaremos en exclusiva las técnicas de ingeniería de características cuyo objetivo principal es reducir la asimetría de una distribución para aproximarla a una campana de Gauss.

    ¿Qué son los datos sesgados?

    Cuando un dataset presenta asimetría, la media, la mediana y la moda se separan, provocando que los modelos estadísticos tengan dificultades para aprender los patrones de forma equitativa. El escenario más común en analítica de negocio es la asimetría positiva (o sesgo a la derecha), donde la distribución presenta una cola alargada hacia los valores extremadamente altos. En una distribución normal, la media, la mediana y la moda coinciden, y la curva tiene forma de campana. Matemáticamente, se puede representar como:

    $$f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\frac{(x – \mu)^2}{2\sigma^2}}$$

    donde:

    • \( \mu \) es la media
    • \( \sigma \) la desviación estándar.

    Sin embargo, muchos conjuntos de datos reales, como ingresos, precios o número de visitas, presentan sesgo (skewness): una asimetría en la distribución.

    • Si la cola se extiende hacia la derecha, decimos que está sesgada positivamente.
    • Si se extiende hacia la izquierda, está sesgada negativamente.

    Por ejemplo, los ingresos de una población suelen estar sesgados a la derecha, porque hay muchas personas con ingresos bajos y pocas con ingresos muy altos.

    Reducir el sesgo mejora:

    • La precisión del modelo.
    • La interpretabilidad de los resultados.
    • La estabilidad numérica en el entrenamiento.

    Principales técnicas de transformación de datos

    A continuación, analizaremos las funciones matemáticas aplicadas en Data Science para comprimir las colas de las distribuciones y redistribuir los datos de forma simétrica.

    Transformación Logarítmica

    Es la técnica más extendida y utilizada en la industria. Consiste en aplicar el logaritmo natural a la variable predictora.

    $$y = \log(x)$$

    • Indicada para: Casos de asimetría positiva fuerte y distribuciones con colas extremadamente largas hacia la derecha.
    • Casos de uso típicos: Variables socioeconómicas o de comportamiento digital como ingresos, ventas acumuladas o tráfico web, donde unos pocos usuarios o registros presentan valores astronómicos en comparación con la media.
    • Limitación: Matemáticamente no está definida para valores menores o iguales a cero. Si existen ceros, suele aplicarse \(\log(x + 1)\) como variante técnica.

    Transformación de Raíz Cuadrada

    Una alternativa de compresión geométrica moderada.

    $$y = \sqrt{x}$$

    • Indicada para: Escenarios donde la asimetría positiva es moderada. Al ser menos agresiva que la función logarítmica, no deforma de manera tan drástica las distancias relativas.
    • Ventaja: Acepta directamente el valor cero en el dominio de la variable, haciéndola ideal para conteos.

    Transformación de Raíz Cúbica

    Una herramienta matemática versátil para la manipulación de espectros numéricos amplios.

    $$y = \sqrt[3]{x}$$

    • Indicada para: Distribuciones que contienen valores positivos, negativos y ceros simultáneamente, siempre que la asimetría no sea extrema. Al conservar el signo del input original, se permite estabilizar la varianza sin perder la naturaleza bidireccional del dato.

    Transformación Recíproca

    Una de las funciones de transmutación más agresivas en el arsenal estadístico.

    $$y = \frac{1}{x}$$

    • Indicada para: Distribuciones con una asimetría extremadamente severa y presencia de outliers de gran magnitud. Esta operación invierte el orden de magnitud, transformando los valores extremadamente grandes en valores cercanos a cero, logrando una compresión radical de la cola derecha.

    Transformaciones Avanzadas y Automatizadas

    En lugar de probar manualmente qué función matemática se adapta mejor a cada columna del dataset, la ciencia de datos moderna utiliza optimizadores algorítmicos que buscan el parámetro de transformación idóneo de manera automatizada.

    Transformación Box-Cox

    Es un método estadístico avanzado que parametriza la transformación mediante un valor de potencia llamado Lambda (\(\lambda\)). El algoritmo busca el \(\lambda\) óptimo que minimiza la asimetría de la variable resultante.

    $$y = \begin{cases} \frac{x^\lambda – 1}{\lambda} & \text{si } \lambda \neq 0 \\ \log(x) & \text{si } \lambda = 0 \end{cases}$$

    • Gran Limitación: Funciona única y exclusivamente con valores estrictamente positivos. Si la columna contiene un solo cero o un número negativo, el sistema fallará.

    Transformación Yeo-Johnson

    Considerada la evolución moderna del método Box-Cox. Modifica las ecuaciones para estabilizar las varianzas permitiendo que la potencia \(\lambda\) se calcule de forma segura sobre cualquier naturaleza numérica.

    • Ventajas de Producción: Es compatible con valores negativos y ceros. Debido a esta flexibilidad analítica, es una de las técnicas automatizadas más integradas en los pipelines de Machine Learning industriales (como los transformadores nativos de Scikit-Learn).

    Comparación de Transformaciones para Datos Sesgados

    TransformaciónIntensidadAdmite CerosAdmite Negativos
    LogarítmicaAltaNoNo
    Raíz CuadradaMediaNo
    Raíz CúbicaBaja
    Box-CoxAltaNoNo
    Yeo-JohnsonAlta

    Buenas prácticas

    1. Visualiza siempre tus datos antes y después de transformar.
    2. Mide la asimetría \( (\text{skewness})\) antes y después.
    3. No transformes por costumbre: hazlo solo si hay una razón estadística o del modelo.
    4. Guarda los parámetros de transformación si vas a aplicarlos en datos futuros (por ejemplo, en deploy de modelos).
    5. Considera también el escalado posterior (normalización o estandarización).

  • Manejo de Datos Faltantes

    Uno de los problemas más comunes en cualquier análisis de datos es la presencia de valores faltantes. No importa si trabajas con datos de clientes, de sensores, o de ventas: los huecos están ahí, casi siempre. Y si no los manejas bien, cualquier análisis que hagas puede llevarte a conclusiones incorrectas o sesgadas.

    Pero no te preocupes. Hay estrategias simples y efectivas para detectar, entender y manejar los datos faltantes de manera profesional. En este artículo aprenderás cómo hacerlo paso a paso.

    ¿Qué son los datos faltantes?

    Decimos que hay datos faltantes cuando una variable no tiene valor para una observación determinada. En la práctica, suelen aparecer como NULL, NaN, #N/A o simplemente celdas vacías.

    Por ejemplo, imagina que trabajas con los datos de ventas de varias tiendas de ropa y te encuentras con esto:

    StoreIDProductIDProductColorPrice
    A1Red20
    B3Blue18
    C1NULL20
    C2NULL25

    Aquí, las tiendas del grupo C no informaron el color del producto. Si no corriges este problema, cualquier análisis sobre los colores más vendidos será inexacto.

    Por qué es importante gestionar los datos faltantes

    Tener valores ausentes no solo significa un dataset incompleto. También puede distorsionar tus conclusiones. Por ejemplo, si intentas calcular la media de precios o la correlación entre variables sin tratarlos, obtendrás resultados falsos o sin sentido.

    Desde el punto de vista estadístico, manejar los datos faltantes aumenta el poder estadístico (la capacidad de detectar patrones reales en los datos) y reduce el riesgo de errores de interpretación.

    En resumen:

    • Mejora la precisión del análisis.
    • Evita conclusiones engañosas.
    • Permite conservar el tamaño de la muestra y su representatividad.

    Por qué faltan los datos

    Existen varias causas típicas:

    1. Errores o causas sistemáticas: El dato nunca se registró. Puede deberse a un descuido humano o a un fallo técnico.
    2. Privacidad o consentimiento: A veces los usuarios optan por no proporcionar ciertos datos, como su correo electrónico o edad.
    3. Pérdida o corrupción de información: Errores de conexión, fallos en la base de datos o interrupciones durante la carga de información pueden causar huecos.

    Tipos de datos faltantes

    No todos los datos faltantes son iguales. En ciencia de datos se clasifican en cuatro tipos:

    1. Estructuralmente faltantes (Expected Missing): Es normal que falten: por ejemplo, si alguien responde “no tengo asma”, es lógico que los campos sobre inhaladores estén vacíos.
    2. MCAR (Missing Completely at Random): Faltan al azar, sin ningún patrón. Es el caso ideal, aunque poco frecuente.
    3. MAR (Missing at Random): Faltan por alguna razón, pero dentro de ciertos grupos.
      Ejemplo: personas con un IMC alto tienden a no reportar su peso.
    4. MNAR (Missing Not at Random): Faltan por una razón directamente relacionada con el valor faltante. Por ejemplo, si los pacientes con presión arterial muy alta evitan hacerse la medición.

    Cómo identificar los datos faltantes

    1. Explora pequeñas muestras de datos:
      Visualiza las primeras o últimas filas para ver si hay celdas vacías.
    2. Usa funciones de resumen:
      En Python, data.isnull().sum() te mostrará cuántos valores faltan por columna.
    3. Compara recuentos:
      Si una columna tiene menos registros válidos que otras, probablemente tenga valores ausentes.

    Estrategias para manejar los datos faltantes

    1. Eliminación (borrar los datos faltantes)

    A veces la mejor solución es simplemente eliminar filas o columnas con datos faltantes.
    Pero cuidado: no siempre es seguro.

    Cuándo eliminar

    • Cuando los datos faltantes son pocos (menos del 5% del total).
    • Cuando los valores faltan al azar (MCAR o MAR).
    • Cuando los datos faltantes no afectan directamente al análisis principal.

    Cuándo no eliminar

    • Si perderías demasiadas observaciones (más del 20%).
    • Si los datos faltan por una razón estructural o sistemática.

    Tipos de eliminación

    Eliminación por lista:
    Borra toda la fila con cualquier dato faltante.

    data.dropna(inplace=True)

    Eliminación por pares:
    Solo elimina las filas que afecten a las variables que estás analizando.

    data.dropna(subset=['Height', 'Education'], inplace=True)

    Eliminación de variables:
    Si a una columna le falta más del 60% de los datos, puede ser mejor eliminarla por completo.


    2. Imputación (rellenar los huecos)

    Cuando los datos son valiosos y no conviene eliminarlos, podemos reemplazar los valores faltantes por otros estimados.

    Algunas estrategias:

    Media, mediana o moda

    Reemplaza los valores faltantes por el promedio, la mediana o el valor más común.

    data['Age'].fillna(data['Age'].mean(), inplace=True)

    Forward Fill (LOCF)

    Usa el valor anterior para completar el actual (útil en series temporales).

    data['Value'].ffill(inplace=True)

    Interpolación

    Calcula un valor intermedio entre los datos vecinos:

    data['Temperature'].interpolate(inplace=True)

    Modelos predictivos

    Utiliza algoritmos de Machine Learning (como regresión lineal o KNN) para estimar los valores faltantes en base a otras variables.

    Caso especial: datos faltantes en series temporales

    Cuando los datos se registran en el tiempo (como precios bursátiles o sensores IoT), los huecos pueden rellenarse con métodos temporales, como:

    • LOCF (Last Observation Carried Forward)
    • Interpolación lineal
    • Suavizado exponencial

    Por ejemplo:

    TimestampValue
    08:0112
    08:0213
    08:03Falta
    08:0416

    Podemos reemplazar el valor faltante (08:03) con el anterior (13) o con un promedio (14.5).

    Recomendaciones finales

    1. Entiende el contexto de tus datos.
      No todos los huecos significan error.
    2. Documenta tus decisiones.
      Explica por qué imputaste, eliminaste o dejaste un valor vacío.
    3. Evalúa el impacto.
      Comprueba cómo cambian tus resultados antes y después del tratamiento.

    En resumen

    EstrategiaCuándo usarlaRiesgo
    Eliminación por listaPocos valores faltantesPérdida de datos
    Eliminación por paresSolo faltan algunas variablesMínimo
    Imputación media/medianaDatos numéricos simplesSesgo posible
    LOCF o InterpolaciónSeries temporalesPuede suavizar en exceso
    Modelos predictivosDatos complejos o correlacionadosMayor esfuerzo computacional

    Manejar los datos faltantes no se trata solo de “rellenar huecos”, sino de preservar la integridad del análisis. Un buen tratamiento puede marcar la diferencia entre un modelo fiable y uno que toma decisiones erróneas. En análisis de datos, la ausencia también habla: cada valor faltante tiene una historia detrás, y entenderla es parte del trabajo de un buen analista.

  • Fundamentos de la Transformación de Datos

    Uno de los pasos fundamentales del Análisis Exploratorio de Datos (EDA) es el Data Wrangling. La transformación de datos es un conjunto de técnicas utilizadas para convertir datos de un formato o estructura a otro, con el fin de hacerlos más útiles, consistentes y listos para el análisis.

    En el proceso de preparación de datos, ciertas tareas suelen realizarse en un orden específico para maximizar la eficiencia y efectividad del flujo de trabajo. Un flujo de trabajo típico de limpieza y preparación de datos seria:

    1. Key restructuring (reestructuración de claves)
    2. Data validation (validación de datos)
    3. Data cleaning (limpieza de datos)
    4. Data deduplication (deduplicación de datos)
    5. Data derivation (derivación de datos)
    6. Format revisioning (revisión de formato)
    7. Data aggregation (agregación de datos)
    8. Data filtering (filtrado de datos)
    9. Data joining (unión de datos)
    10. Data integration (integración de datos)

    Este flujo de trabajo es iterativo y puede requerir ajustes según las necesidades específicas del proyecto y la naturaleza de los datos. Además, algunos pasos pueden superponerse o requerir revisiones cuando surgen nuevos datos o cambios en los requisitos del análisis.

    La razón principal para transformar los datos es obtener una representación más útil y compatible con otros conjuntos de datos. Además, la transformación adecuada favorece la interoperabilidad dentro de un sistema al seguir una estructura y formato común.

    Key Restructuring

    En el ámbito de la ciencia de datos, “Key Restructuring” se refiere a la reorganización o transformación de las claves en un conjunto de datos.
    Las “claves” suelen ser identificadores únicos o combinaciones de campos que sirven para relacionar registros entre sí.

    Renombrar Claves

    df.rename(columns={'old_name': 'new_name'}, inplace=True)

    Reasignar Valores de Clave

    df['key_column'] = df['key_column'].map(lambda x: 'new_value' if condition else x)

    Crear Claves Compuestas

    df['composite_key'] = df['key_part1'].astype(str) + '-' + df['key_part2'].astype(str)

    Eliminar Claves Innecesarias

    df.drop(columns=['unnecessary_key'], inplace=True)

    Asegurar la Unicidad

    if df['key_column'].is_unique:
        print("Las claves son únicas.")
    else:
        df.drop_duplicates(subset=['key_column'], inplace=True)

    Reindexación Basada en Claves

    df.set_index('key_column', inplace=True)

    Data Validation

    La validación de datos consiste en verificar si los datos cumplen con un conjunto de reglas o normas antes de ser procesados o analizados. Es una etapa crítica, ya que trabajar con datos erróneos o mal formateados puede llevar a conclusiones incorrectas y resultados poco confiables.

    Técnicas comunes en Pandas

    • Verificación de tipos de datos
    df.dtypes
    df['column'] = df['column'].astype(float)
    • Aplicar condiciones de validación
    assert (df['column'] > 0).all()
    • Validación de texto con expresiones regulares
    df['text_column'].str.match(r'^\w+$')
    • Detección de valores nulos
    df.isnull().sum()
    df.dropna(subset=['column'], inplace=True)
    • Valores únicos y duplicados
    df['column'].is_unique
    df.drop_duplicates(subset=['column'], inplace=True)
    • Rangos de valores
    df[(df['column'] >= min_value) & (df['column'] <= max_value)]
    • Validación de categorías
    allowed = {'cat1', 'cat2'}
    df['col'].isin(allowed)
    • Validación cruzada entre columnas
    df.apply(lambda row: row['col1'] < row['col2'], axis=1)

    La validación debe ser continua, adaptándose a las reglas del negocio y al tipo de análisis o modelo que se esté desarrollando.

    Data Cleaning

    La limpieza de datos busca detectar y corregir (o eliminar) registros corruptos, incompletos o inconsistentes, tratando valores faltantes y estandarizando formatos.

    Tareas comunes:

    • Detectar valores faltantes
    df.isnull()
    • Eliminar valores faltantes
    df.dropna()
    • Rellenar valores faltantes
    df.fillna(method='ffill')
    • Conversión de tipos
    df.astype({'col1': 'int32'})
    • Normalización de texto
    df['col'] = df['col'].str.strip().str.lower()
    • Manejo de outliers
      Filtrar o imputar valores extremos según percentiles o desviaciones estándar.
    • Manejo de fechas
    df['fecha'] = pd.to_datetime(df['fecha'], errors='coerce')
    • Guardar los datos limpios
    df.to_csv('clean_data.csv', index=False)

    Una limpieza adecuada es la base para cualquier análisis o modelado confiable.


    Data Deduplication

    La deduplicación de datos busca identificar y eliminar registros repetidos dentro de un conjunto de datos. Esto mejora la precisión y evita sesgos en el análisis.

    Métodos en Pandas:

    df.drop_duplicates()
    df.duplicated()

    Se puede usar el argumento subset para definir columnas específicas y keep para decidir qué duplicado conservar. Antes de eliminar duplicados, conviene analizar su origen y asegurarse de no eliminar información valiosa.

    Data Derivation

    La derivación de datos consiste en crear nuevas variables o columnas a partir de datos existentes.

    Ejemplos comunes:

    • Cálculo de estadísticas
    df['avg'] = df['value'].mean()
    • Transformaciones matemáticas
    df['normalized'] = (df['x'] - df['x'].mean()) / df['x'].std()
    • Descomposición de fechas
    df['year'] = df['date'].dt.year
    • One-hot encoding
    pd.get_dummies(df['category'])
    • Binning
    pd.cut(df['var'], bins=3)
    • Cálculo de diferencias
    df['diff'] = df['value'].diff()

    Derivar datos correctamente permite enriquecer el conjunto de análisis y mejorar el rendimiento de los modelos.

    Format Revisioning

    La revisión de formato implica convertir datos a tipos o estructuras adecuados para el análisis o interoperabilidad.

    • Conversión de tipos
    df['col'] = pd.to_numeric(df['col'], errors='coerce')
    • Normalización de texto
    df['texto'] = df['texto'].str.lower().str.strip()
    • Fechas y horas
    df['fecha'] = pd.to_datetime(df['fecha'])
    • Conversión a categorías
    df['cat'] = df['cat'].astype('category')
    • Exportar a otros formatos
    df.to_excel('datos.xlsx', index=False)
    df.to_sql('tabla', con=conexion)

    Data Aggregation

    La agregación de datos permite resumir información, extraer métricas y generar resúmenes útiles.

    Ejemplos:

    df.groupby('col')['ventas'].sum()
    df.groupby('col').agg({'ventas': ['mean', 'std']})
    df.pivot_table(values='ventas', index='mes', columns='region')
    pd.crosstab(df['categoria'], df['region'])
    df['ventas'].rolling(window=3).mean()
    df.resample('M')['ventas'].sum()

    La agregación facilita el análisis exploratorio y la generación de indicadores clave (KPIs).

    Data Filtering

    El filtrado de datos consiste en seleccionar subconjuntos relevantes según condiciones o criterios específicos.

    Ejemplos:

    df[df['edad'] > 30]
    df.query('columna > 100')
    df[df['pais'].isin(['España', 'Chile'])]
    df[(df['ventas'] > 500) & (df['region'] == 'Norte')]

    También puedes aplicar funciones personalizadas:

    df[df['nombre'].apply(lambda x: 'a' in x)]

    El filtrado ayuda a centrarse en los datos más relevantes y reduce ruido analítico.

    Top – Data Joining

    El data joining combina conjuntos de datos mediante claves comunes, similar a las uniones de SQL.

    Métodos:

    • pd.concat() – concatenar DataFrames (vertical u horizontalmente)
    • pd.merge() – unión tipo SQL (inner, left, right, outer)
    • df.join() – unión por índice o columna
    • merge_asof() y merge_ordered() – uniones temporales o ordenadas
    • compare() – detectar diferencias entre DataFrames

    Ejemplos:

    pd.concat([df1, df2], axis=0)
    pd.merge(df1, df2, on='id', how='left')

    La unión de datos es esencial para integrar fuentes diversas y construir un dataset analítico coherente.

  • Estructura de un Informe de Análisis de Datos

    Un informe de análisis de datos no es un artículo académico, ensayo ni informe de laboratorio. Es una conversación organizada con tu cliente o colaborador, con vida interna (memo extendido) y externa (para supervisores).

    Características Clave

    1. Fácil de ojear → Audiencias diferentes encuentran lo que necesitan rápido.
    2. Redacción invisible → El lector recuerda el contenido, no el estilo.

    Evita:

    • Prosa florída o demasiado casual.
    • Errores gramaticales.
    • Contexto inadecuado.
    • Enfocarse en proceso (salvo en apéndice).
    • Detalles técnicos innecesarios en el cuerpo.

    Estructura Básica

    SecciónContenido esencial
    IntroducciónResumen del estudio, datos, contexto, grandes preguntas, conclusiones clave y esquema del informe.
    CuerpoAnálisis principal con evidencia (tablas/gráficos).
    Conclusión/DiscusiónRepite preguntas + conclusiones. Añade observaciones y preguntas futuras.
    ApéndiceDetalles técnicos, tablas extras, código, salidas.

    Audiencias y Cómo Escribir para Cada Una

    AudienciaQué leeCómo facilitarles la vida
    Principal (cliente/colaborador)Introducción + Conclusión + ojea CuerpoOrganiza como una agenda de conversación: de general a específico o por importancia. Incluye evidencia clave en Cuerpo, detalles en Apéndice.
    EjecutivoSolo Introducción y ConclusiónDeja “titulares” claros en ambas secciones.
    Supervisor técnicoCuerpo + ApéndiceReferencias cruzadas específicas. Texto explicativo en Apéndice (cómo y por qué hiciste cada análisis).

    Organización del Cuerpo: 2 Formatos Efectivos

    1. Tradicional (familiar en psicología)

    • Datos
    • Métodos
    • Análisis
    • Resultados

    Riesgo:

    “Métodos” suena estéril sin resultados → fusiona con Análisis.

    2. Orientado a preguntas (recomendado)

    • Análisis
      • Tasa de Éxito
    • Métodos
    • Análisis
    • Conclusiones
      • Tiempo hasta Recaída
      • Efecto del Género

    Ventajas:

    • Sigue orden de la Introducción.
    • Cada subsección es autónoma.
    • Fácil de ojear.

    Reglas de Oro para el Cuerpo

    • 1–2 tablas/gráficos por pregunta → captan atención.
    • Evita exceso gráfico → rompe flujo → mueve extras al Apéndice.
    • Texto claro + evidencia visual = comprensión rápida.

    Apéndice: El Lugar de los Detalles

    Incluye:

    • Procedimientos estadísticos complejos.
    • Tablas/salidas detalladas.
    • Figuras secundarias.
    • Código comentado (¡con texto explicativo!).

    Regla:
    Cuerpo → lo justo para convencer.
    Apéndice → todo lo necesario para validar.


    Introducción: El Gancho Perfecto

    Debe incluir (en este orden):

    1. Resumen del estudio y datos.
    2. Contexto o problema.
    3. Grandes preguntas + conclusiones clave.
    4. Esquema del informe.

    Conclusión: Cierra con Impacto

    • Repite preguntas y respuestas.
    • Añade observaciones nuevas.
    • Propón preguntas futuras o próximos pasos.

    Checklist Final antes de Entregar

    • [ ] ¿Es fácil ojear para ejecutivos?
    • [ ] ¿Tiene agenda clara para el cliente?
    • [ ] ¿Apéndice valida todo para el supervisor?
    • [ ] ¿Redacción limpia y sin distracciones?
    • [ ] ¿1–2 visuales por pregunta?
    • [ ] ¿Referencias cruzadas entre Cuerpo y Apéndice?

    Conclusión:
    Un buen informe de datos no impresiona por su longitud.
    Impresiona porque tu cliente lo entiende, tu jefe lo aprueba y tu ejecutivo lo usa para decidir.

    Estructura simple. Audiencia clara. Contenido que habla.
    Eso es todo.

  • Análisis de Audiencia en la Redacción

    La audiencia de un documento técnico es el lector o lectores previstos. Para los redactores técnicos, esta es la consideración clave al planificar, redactar y revisar. Se trata de adaptar la escritura a las necesidades, intereses y antecedentes del lector.

    El principio es simple: habla para que te entiendan. No expliques cohetes a un niño de seis años. Parece obvio, pero la falta de análisis de audiencia es la raíz de la mayoría de los problemas en documentos técnicos, especialmente en instrucciones.

    Herramientas Prácticas

    • Planificador de audiencias: Responde preguntas detalladas y envíatelo por email (opcional: a tu instructor).
    • Planificador de situaciones: Define el contexto en que tu audiencia usa el documento.

    Tipos de Audiencias

    TipoDescripción
    ExpertosConocen teoría y producto al detalle. Diseñan, prueban. Títulos avanzados. Desafío: comunicarse con técnicos y ejecutivos.
    TécnicosConstruyen, operan, mantienen, reparan. Conocimiento práctico y técnico.
    EjecutivosToman decisiones comerciales, legales, políticas. Poco conocimiento técnico. Deciden si producir, implementar, financiar.
    No especialistasMínimo conocimiento técnico. Interés práctico o curiosidad. Ej: votar en elecciones, aprender sin motivo específico.

    Análisis Detallado de la Audiencia

    Más allá del tipo, evalúa:

    1. Antecedentes (conocimiento, experiencia, capacitación)
    • ¿Cuánto saben tus lectores?
    • Ejemplo: Guía de software en Windows → ¿incluyes basics de Windows?
      • No: Frustra al usuario.
      • : Aumenta páginas y costo.
        → Equilibra según el tamaño del segmento que lo necesita.
    1. Necesidades e intereses
    • ¿Qué esperan del documento?
    • Ej: Manual de smartphone → pasos claros.
    • Informe de calentamiento global para inmobiliarios → ¿qué quieren (y no quieren) leer?
    1. Diferentes culturas
    • Formatos de fecha, hora, moneda varían.
    • Evita humor local (“dar un jonrón”). → Recursos:
      • Capítulo 6: Escritura para lectores internacionales (Texas A&M).
      • Lista de guías de estilo en Wikipedia.
    1. Otras características demográficas
    • Edad, género, residencia, preferencias políticas, etc.

    Complicaciones Comunes

    • Audiencias mixtas: Técnicos + ejecutivos →
      • Opción 1: Todo comprensible para todos (difícil).
      • Opción 2: Secciones por audiencia + títulos claros para navegar.
    • Variabilidad amplia: En una misma categoría →
      • Escribir al mínimo común denominador → documento tedioso.
      • Solución:
        • Apuntar a la mayoría.
        • Info extra en apéndices o referencias cruzadas.

    Ejemplo de Descripción de Audiencia (para curso)

    Nota al instructor: Instrucciones para usuarios que optimizan cálculos en Excel con macros. Saben ingresar datos, usan Office Suite, están cómodos con Windows y aritmética básica para verificar errores.


    Adaptación Práctica: 16 Controles para Conectar con tu Audiencia

    (Enfocados en no especialistas, pero aplicables a todos)

    1. Añade info clave → pasos, antecedentes, definiciones.
    2. Omite lo innecesario → evita confusión.
    3. Ajusta nivel técnico → no hables a expertos si tu lector es técnico.
    4. Incluye ejemplos → analogías potentes.
    5. Adapta ejemplos → caseros para no expertos, técnicos para especialistas.
    6. Reorganiza contenido → fondo donde se necesita.
    7. Fuerza transiciones → “por lo tanto”, “sin embargo”, repite palabras clave.
    8. Escribe introducciones fuertes → panorama general del documento y secciones.
    9. Usa oraciones temáticas → guía al lector como un mapa.
    10. Estilo directo → voz imperativa (“haz clic”), verbos activos, “tú”.
    11. Oraciones 15–25 palabras → evita >30.
    12. Claridad y economía → reduce 20% del texto en revisión.
    13. Más gráficos simples → para no especialistas.
    14. Párrafos cortos → 6–8 líneas máx.
    15. Referencias cruzadas → “ver sección X”.
    16. Títulos, listas, tipografía → márgenes amplios, fuente legible, interlineado.

    Situación de la Audiencia: El Contexto lo es Todo

    No basta con saber quién. Pregunta: ¿En qué situación usa mi audiencia este documento?

    Ejemplos:

    SituaciónObjetivoAudiencia
    Resumen de novedadesDecisión informadaEjecutivos, no especialistas
    Guía de tareasEjecución eficienteTécnicos
    Promoción de interésPersuasiónPúblico general, decisores
    Resumen para estudiantesAprendizaje introductorioEstudiantes no especializados
    Resumen para clientesAsesoríaConsejeros
    Resumen para ciudadanosDebate informadoLegisladores, público

  • Cómo redactar informes de análisis de datos.

    En un análisis estadístico, normalmente se comienza considerando las características de la población sobre la cual se quieren hacer inferencias. De manera similar, cuando comienzas a escribir un informe sobre un análisis, generalmente comienzas considerando las características de la audiencia con la que deseas comunicarte.

    Debes pensar en el quién, qué, por qué, dónde, cuándo y cómo de las personas clave que leerán tu informe.

    ¿Quién leerá tu informe?

    La audiencia a menudo se define por el rol que desempeña el lector en relación con el informe:

    • Tomadores de decisiones: Usarán el informe para actuar.
    • Partes interesadas: Aprenderán nueva información.
    • Revisores: Lo criticarán en base a lo que ya saben.
    • Interesados generales: Buscan contexto o inspiración.

    Algunos informes son leídos por una sola persona, pero la mayoría por muchas. Pueden existir niveles de participación: primarios, secundarios y terciarios.

    Consejo clave:

    No puedes complacer a todos. Concéntrate primero en las personas más importantes para recibir tu mensaje, y en segundo lugar en el grupo más amplio.


    ¿Qué saben tus lectores?

    Una vez definido a quién te diriges, comprende sus características. La más importante para un redactor técnico es su nivel de comprensión del tema y de las técnicas estadísticas.

    Puedes ajustar cómo presentas la información estadística. Aquí tienes un mapa de audiencias comunes:

    Tipo de lectorCaracterísticasRecomendaciones
    MatefobiasTemen a los números, pero escuchan conceptosEvita jerga, fórmulas y porcentajes. Usa “aproximadamente la mitad” en lugar de “48.7%”.
    PasantesEntienden poco y tienen bajo interésNo te preocupes: no leerán más allá del resumen. Hazlo conciso y resalta el hallazgo clave.
    TuristasEntienden algo y están interesadosSé amable. Usa jerga solo si la defines. Prefiere gráficos simples (barras, circulares). Redondea valores.
    Perros calientesCreen saber más de lo que sabenUsa jerga y fórmulas, pero explícalas claramente. Guíalos para evitar conclusiones erróneas.
    AsociadosOtros analistas con jerga básicaTodo vale si lo explicas bien.
    ColegasExpertos en el tema y técnicasTodo vale. Sé técnico, preciso y directo.

    Estas características te orientan sobre la extensión, tono y estilo del informe.

    ¿Por qué leerán tu informe?

    Sé honesto:

    ¿Por qué alguien estaría interesado en leer tu informe?

    Pregúntate:

    • ¿Qué harán con tus hallazgos?
    • ¿Se informarán? ¿Tomarán decisiones? ¿Actuarán?
    • ¿Es algo crítico para ellos o solo un trámite?

    El nivel de interés define cuánto esfuerzo debes invertir en hacerlo claro, atractivo y accionable.

    ¿Dónde se leerá tu informe?

    Considera el alcance y contexto:

    • ¿Es para un grupo interno (organización) o público general?
    • ¿Va dirigido a la alta dirección (de arriba hacia abajo) o a equipos operativos (de abajo hacia arriba)?
    • ¿Hay preocupaciones de seguridad o confidencialidad?

    Esto afecta el lenguaje, el nivel de detalle y las medidas de protección (contraseñas, marcas de agua, etc.).

    ¿Cuándo lo necesitan?

    El tiempo es un factor crítico:

    • ¿Cuándo debe estar listo?
    • ¿Quién lo revisará y cuánto tardará?
    • ¿Los plazos son flexibles o inamovibles?
    • ¿Tienes tiempo para:
    • Pensar el mensaje?
    • Hacer análisis adicionales?
    • Editar y pulir?

    Regla de oro (que todos rompemos, pero no deberíamos): Nunca envíes un borrador para revisión que no sea tu obra maestra completa y editada.

    ¿Cómo debe presentarse el informe?

    Finalmente, piensa en cómo maximizar el impacto para tu audiencia. Aquí van cinco consideraciones clave:

    1. Paquete

    ¿Cómo se entregará?

    • Carta breve
    • Informe completo
    • Entrada de blog
    • Artículo profesional
    • Anexo en otro documento

    2. Formato

    • ¿Digital o impreso?
    • ¿PDF, Word, web?
    • ¿Editable o protegido?
    • ¿Con contraseña?

    3. Apariencia

    • ¿Blanco y negro o a color?
    • ¿Muchos gráficos o mucho texto?
    • ¿Convencional o visualmente impactante?
    • ¿Incluye mapas, desplegables, inserciones grandes?

    4. Artículos especiales

    • ¿Entregarás datos, scripts, código o resultados adicionales?
    • ¿Crearás una presentación?
    • ¿Se usarán tus gráficos en tribunales o eventos públicos?

    5. Accesibilidad

    • ¿Debes cumplir con la Sección 508 (EE.UU.) para accesibilidad?
    • ¿Tus gráficos son legibles para personas con daltonismo?
    • ¿Usas títulos claros, tablas bien etiquetadas, alt text en imágenes?

    Conclusión:

    No necesitas responder todas estas preguntas en detalle. Muchas solo requieren unos segundos de reflexión. Pero si analizas estas dimensiones —quién, qué, por qué, dónde, cuándo y cómo— tendrás una idea mucho más clara de para quién escribes
    Y cómo debes escribirlo

  • Sustitución hacia atrás e inversión de matrices

    El backsolving es un método para resolver sistemas de ecuaciones lineales una vez que ya hemos reducido el sistema a forma triangular superior mediante eliminación gaussiana (o cualquier otra técnica de factorización como LU).

    Trabajamos el mismo problema del articulo anterior:

    $$ M = \begin{bmatrix} 3 & 6 & 2 \\ 10 & 3 & 8 \\ 1 & 7 & 5 \end{bmatrix} , p = \begin{bmatrix} p_1 \\ p_2 \\ p_3 \end{bmatrix}, c = \begin{bmatrix} 34 \\ 69 \\ 48 \end{bmatrix} $$

    Queremos resolver los precios \( (p) \) de cada producto. En este caso utilizaremos eliminación gaussiana y luego sustitución hacia atrás — eso es, reducir el sistema a triangular superior y luego encontrar las incógnitas empezando por la última.

    Eliminación gaussiana (reducción hacia triangular superior)

    Escribimos el sistema en sus ecuaciones explícitas (producto fila por columna):

    $$ \begin{cases} 3p_1 + 6p_2 + 2p_3 = 34 \\ 10p_1 + 3p_2 + 8p_3 = 69 \\ 1p_1 + 7p_2 + 5p_3 = 48 \end{cases}$$

    Paso 1 — usar la primera ecuación para eliminar \(p_1\) de las filas 2 y 3.

    Despejamos \(p_1\) (temporalmente) o eliminamos directamente:

    Multiplicador para la fila 2: \(\frac{10}{3}=2\).
    Hacemos \(R_2 \leftarrow R_2 – 2R_1\):

    • Columna 1: \(10 – 2\cdot 3 = 0\).
    • Columna 2: \(3 – 2\cdot 6 = 3 – 12 = -9\).

    Multiplicador para la fila 3: \(\frac{1}{3}\).
    Hacemos \(R_3 \leftarrow R_3 – \frac{1}{3}R_1\).

    Después de eliminar \(p_1\) en filas 2 y 3 (operaciones sobre las filas):

    $$\begin{pmatrix}3 & 6 & 2 & | & 34\\0 & -17 & 4 & | & 1\\0 & \frac{4}{3} & \frac{13}{3} & | & \frac{76}{3} \end{pmatrix}$$

    Nota: la fila 2 quedó con coeficiente (-17) en la columna de \(p_2\). La fila 3 tiene fracciones — eso es normal en eliminación.

    Paso 2 — usar la fila 2 para eliminar la componente \(p_2\) de la fila 3.

    Multiplicador para \(R_3\): \(f=\frac{\frac{4}{3}}{-17}=-\frac{4}{51}\).
    Hacemos \(R_3 \leftarrow R_3 – f R_2 = R_3 + \frac{4}{51}R_2\).

    Al realizar esa operación la segunda columna de \(R_3\) queda 0 y obtenemos una ecuación sólo en \(p_3\):

    $$\begin{pmatrix}3 & 6 & 2 & | & 34 \\ 0 & -17 & 4 & | & 1 \\ 0 & 0 & \frac{241}{51} & | & \frac{1296}{51} \end{pmatrix}$$

    Paso 3 — despejar \(p_3\) y luego usar sustitución hacia atrás.

    De la tercera fila:

    $$\frac{241}{51},p_3 = \frac{1296}{51} \quad\Rightarrow\quad p_3 = \frac{1296}{241}$$

    Sustituyendo \(p_3\) en la segunda fila:

    $$-17,p_2 + 4,p_3 = 1 \quad\Rightarrow\quad p_2 = \frac{1 – 4p_3}{-17}$$

    Sustituyendo el valor numérico de \(p_3\) (o directamente resolviendo con las fracciones) se obtiene \(p_2=3\).

    Finalmente sustituimos \(p_2\) y \(p_3\) en la primera ecuación para obtener (p_1), que da (p_1=2).

    Conclusión del método manual (eliminación + sustitución):

    $$\mathbf p = \begin{pmatrix}2 \\ 3 \\ 5\end{pmatrix}$$

    ¿Qué significa calcular la inversa \(M^{-1}\) y cómo se obtiene con matriz aumentada?

    Otra forma más “directa” (y que explica el porqué de la eliminación) es calcular la inversa de \(M\). Si \(M\) es invertible entonces

    $$\mathbf p = M^{-1}\mathbf c$$

    Para encontrar \(M^{-1}\) se construye la matriz aumentada \([,M \mid I,]\) y se aplican operaciones elementales por filas hasta transformar el lado izquierdo en la identidad; entonces el lado derecho habrá quedado como \(M^{-1}\).

    Verificaciones numéricas y redondeo

    En la práctica, cuando calculas \(M^{-1}M\) en ordenador verás que los elementos fuera de la diagonal no son exactamente cero sino números muy pequeños (por ejemplo \(-5\times 10^{-17})\). Eso es error numérico de punto flotante. Si redondeas (por ejemplo a 10 decimales) obtendrás la matriz identidad exacta en la presentación.

    Resumen conceptual

    • Eliminación gaussiana: reduce el sistema a triangular superior (eliminación hacia adelante) y luego despeja las variables (sustitución hacia atrás).
    • Inversa por matriz aumentada: hacer operaciones elementales sobre \([M\mid I]\) hasta convertir \(M\) en \(I\); lo que quede a la derecha será \(M^{-1}\).
    • Comprobación: puedes verificar que \(M^{-1}\mathbf c = \mathbf p\) y \(M^{-1}M = I\) (hasta errores numéricos muy pequeños).

    Código Python

    import numpy as np
    
    # Definición de la matriz y vectores (el sistema del ejemplo)
    M = np.array([[3, 6, 2],
                  [10, 3, 8],
                  [1, 7, 5]], dtype=float)
    
    c = np.array([34, 69, 48], dtype=float)
    
    # 1) Resolver el sistema M p = c
    p = np.linalg.solve(M, c)
    print("Solución (np.linalg.solve):", p)
    
    # 2) Calcular la inversa de M
    M_inv = np.linalg.inv(M)
    print("\nInversa M^{-1}:\n", M_inv)
    
    # 3) Verificar que M^{-1} * c = p
    p_from_inv = M_inv @ c
    print("\nM^{-1} @ c =", p_from_inv)
    
    # 4) Verificar que M_inv @ M ≈ I (mostramos la matriz y una versión redondeada)
    I_approx = M_inv @ M
    print("\nM^{-1} @ M (aprox):\n", I_approx)
    print("\nM^{-1} @ M (redondeado a 10 decimales):\n", np.round(I_approx, 10))
    

    Salida:

    Solución (np.linalg.solve): [2. 3. 5.]
    
    Inversa M^{-1}:
     [[ 0.17012448  0.06639004 -0.17427386]
     [ 0.17427386 -0.05394191  0.01659751]
     [-0.2780083   0.06224066  0.21161826]]
    
    M^{-1} @ c = [2. 3. 5.]
    
    M^{-1} @ M (aprox):
     [[ 1.00000000e+00  0.00000000e+00  0.00000000e+00]
     [-1.56125113e-16  1.00000000e+00 -5.55111512e-17]
     [ 5.55111512e-17  0.00000000e+00  1.00000000e+00]]
    
    M^{-1} @ M (redondeado a 10 decimales):
     [[ 1.  0.  0.]
     [-0.  1. -0.]
     [ 0.  0.  1.]]
    

    Qué observar al ejecutar:

    • p debe salir como [2. 3. 5.].
    • M_inv @ c debe coincidir con p (igual numéricamente, dentro de tolerancias de punto flotante).
    • M_inv @ M será numéricamente la identidad; si ves valores muy pequeños fuera de la diagonal, es normal: redondea para comprobar que esos valores son efectivamente cero dentro de la precisión de la máquina.

    Resumen

    La eliminación y la inversa son dos caras de la misma moneda: la primera resuelve un sistema concreto, la segunda construye la “función inversa” que, aplicada a cualquier vector de costes, devolvería los precios.

    En aplicaciones (ciencia de datos, econometría, ingeniería), normalmente no calculamos la inversa si solo queremos resolver un sistema: usamos solve (algoritmos de factorización) por razones de estabilidad numérica y eficiencia. Sin embargo, obtener la inversa es útil para entender conceptualmente la transformada inversa y para comprobaciones.

  • De sistemas de ecuaciones a matrices

    El Formato Matricial

    La expresión general:

    $$y=a_1​x_1​+a_2​x_2​+⋯+a_n​x_n​$$

    Es el punto de partida que lleva directamente a la forma matricial de los sistemas lineales. El mismo sistema de ecuaciones de las frutas puede escribirse y resolverse en forma matricial. En la ciencia de datos los datasets son matrices, y resolver sistemas lineales ayuda a encontrar relaciones entre variables.

    Partimos del sistema:

    $$\begin{cases} 2x + 3y = 30 \\ x + y = 12 \end{cases}$$

    En formato matricial:

    $$\begin{bmatrix} 2 & 3 \\ 1 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} 30 \\ 12 \end{bmatrix}$$

    Significado de las partes:

    PartesSignificado
    $$\begin{bmatrix} 2 & 3 \\ 1 & 1 \end{bmatrix}$$Matriz de coeficientes: contiene los números que multiplican a las variables (los precios de las frutas).
    $$\begin{bmatrix} x \\ y \end{bmatrix}$$Vector de incógnitas: las variables que queremos encontrar (número de manzanas y naranjas).
    $$\begin{bmatrix} 30 \\ 12 \end{bmatrix}$$Vector de resultados: los valores en el lado derecho (total de dinero y total de frutas).

    La forma vectorial compacta del sistema matricial se expresa como:

    $$A\vec{x} = \vec{b}$$

    Donde:

    • \(A\) –> es la matriz de coeficientes
    • \(\vec{x}\) –> es el vector de incógnitas
    • \(\vec{b}\) –> es el vector de términos independientes

    Por tanto:

    $$A = \begin {bmatrix} 2 & 3 \\ 1 & 1 \end{bmatrix}, \vec{x} = \begin{bmatrix} x \\ y \end{bmatrix}, \vec{b} = \begin{bmatrix} 30 \\ 12 \end{bmatrix}$$

    En ciencia de datos y machine learning esta forma es fundamental porque:

    • Permite expresar relaciones entre miles de variables en una sola ecuación.
    • Es la base de la regresión lineal, la reducción de dimensionalidad, y el entrenamiento de modelos.
    • Toda la manipulación se hace con álgebra matricial, que es más eficiente computacionalmente.

    Resolviendo problemas reales.

    En artículos anteriores vimos operaciones sobre vectores y matrices desde la perspectiva matemática. Vamos a ver cómo esas mismas operaciones pueden resolver problemas reales, como descubrir cuánto cuesta cada producto de un supermercado.

    Escenario

    Volvemos a nuestro supermercado de frutas. Imaginemos que tenemos tres personas:
    Bob, Alice y Tim, que han ido al supermercado y compraron manzanas, naranjas y peras. Podemos representar sus compras en una matriz \(M\):

    $$M = \begin{bmatrix} 3 & 6 & 2 \\ 10 & 3 & 8 \\ 1 & 7 & 5 \end{bmatrix}$$

    Cada fila representa una persona, y cada columna representa un producto:

    PersonaManzanasNaranjasPeras
    Bob362
    Alice1038
    Tim175

    El coste total

    Sabemos cuánto pagó cada persona:

    $$C =\begin{bmatrix} 34 \\ 69 \\ 48 \end{bmatrix}$$

    Y queremos averiguar cuánto cuesta cada producto. Presentemos los importes que gasto cada uno en un vector que llamamos \( P \) , vector de precios:

    $$P = \begin{bmatrix} p_1 \\ p_2 \\ p_3 \end{bmatrix} $$

    Donde:

    • \(p_1\) –> precio de la manzana
    • \(p_2\) –> precio de la naranja
    • \(p_3\) –> precio de la pera

    Sabemos que:

    $$M \cdot P = C$$

    o, dicho en palabras: la cantidad comprada multiplicada por el precio unitario da el coste total.

    Escribiendo las ecuaciones

    Multiplicar la matriz \(M\) por el vector \(P\) nos da tres ecuaciones:

    $$ \begin{cases} 3p_1 + 6p_2 + 2p_3 = 34 \\ 10p_1 + 3p_2 + 8p_3 = 69 \\ 1p_1 + 7p_2 + 5p_3 = 48 \end{cases}$$

    Esto es un sistema de ecuaciones lineales con tres incógnitas: \( p_1, p_2, p_3 \).

    Solución del sistema de ecuaciones.

    Solución

    Método de sustitución.

    Se despeja una variable y se sustituye, reduciendo gradualmente el sistema hasta obtener cada variable.

    Paso 1 — despejar p1 de la ecuación (1)

    $$ 3p_1 + 6p_2 + 2p_3 = 34$$

    $$ p_1 =\frac{34}{3} \, – 2p_2 \, – \frac{2p_3}{3}$$

    Paso 2 — sustituir \(p_1\)​ en las ecuaciones (2) y (3)

    Sustitución en la ecuación (2):

    $$10p_1 + 3p_2 + 8p_3 = 69$$

    $$10(\frac{34}{3} – 2p_2 – \frac{2p_3}{3}) + 3p_2 + 8p_3 = 69$$

    Multiplicamos todo por 3 para eliminar el denominador:

    $$340−60p2​−20p3​+9p2​+24p3 \\ ​=207$$

    Agrupamos términos semejantes:

    • Términos en \(p_2​: −60p_2+9p_2=−51p_2\)
    • Términos en \(p_3​: −20p_3+24p_3=4p_3\)

    Queda:

    $$340−51p2​+4p3​=207$$

    Pasamos 340 al otro lado y calculamos:

    $$−51p2​+4p3​=207−340$$

    $$−51p2​+4p3​=-133$$

    Multiplicamos por −1 (para simplificar signos)(Ecuación A):

    $$51p2​-4p3​=133$$

    Sustitución en la ecuación (3):

    $$1p_1 + 7p_2 + 5p_3 = 48$$

    $$\frac{34}{3} – 2p_2 – \frac{2p_3}{3} + 7p_2 + 5p_3 = 48$$

    Multiplicamos por 3:

    $$34−6p2​−2p3​+21p2​+15p3​=144$$

    Agrupamos:

    • Términos en \(p_2: -6p_2 + 21p_2 = 15p_2\)
    • Términos en \(p_3: -2p_3 + 15p_3 = 13p_3\)

    Queda:

    $$34+15p_2​+13p_3​=144$$

    Pasamos 34 al otro lado (Ecuación B):

    $$15p_2​+13p_3​=144−34=110$$

    Ahora hemos reducido el sistema original a dos ecuaciones en \(p_2\)​ y \(p_3\)​:

    • (A) \(51p_2 – 4p_3 = 133\)
    • (B) \(15p_2 +13p_3 = 110\)

    Paso 3 — resolver el sistema reducido (A) y (B)

    Usamos eliminación. Multiplicamos la ecuación A por 15 y la B por −51 para cancelar \(p_2\)​:

    • A * 15: \( 765p_2 – 60p_3 = 1995\)
    • B * (-51): \( -765p_2 – 663p_3 = -5610\)

    Sumamos las dos ecuaciones:

    $$(765p2​−60p3​)+(−765p2​−663p3​)\\=1995−5610$$

    Se cancelan los \(p_2\) Queda:

    $$−723p3​=−3615$$

    Despejamos \(p_3\)​:

    $$p_3 = \frac{-3615}{-723} = \frac{3615}{723} = 5$$

    Ahora sustituimos \(p_3 = 5\) en la ecuación B:

    $$15p_2​+13 \cdot 5=110$$

    $$15p_2​+65 =110$$

    $$15p_2​ =45$$

    $$p_2​ =3$$

    Por último, calculamos \(p_1\)​ usando la fórmula que obtuvimos en el Paso 1:

    $$p_1 = \frac{34 – 6p_2 – 2p_3}{3}$$

    $$p_1 = \frac{34 – 6 \cdot 3 – 2 \cdot 5}{3}$$

    $$p_1 = \frac{34 – 18 – 10}{3}$$

    $$p_1 = \frac{6}{3} = 2$$

    Resultado final: \(p_1 = 2, p_2 = 3, p_3 = 5\)

    Precios

    Pera: 5€

    Manaza: 2$

    Naranja: 3€

    Representar el sistema de ecuaciones en formato matricial:

    $$ \begin{bmatrix} 3 & 6 & 2 \\ 10 & 3 & 8 \\ 1 & 7 & 5 \end{bmatrix} \cdot \begin{bmatrix} p_1 \\ p_2 \\ p_3 \end{bmatrix} = \begin{bmatrix} 34 \\ 69 \\ 48 \end{bmatrix} $$

    Recordando, tenemos aqui:

    • Matriz de coeficientes: contiene los números que multiplican a las variables (las cantidades de las frutas).
    • Vector de incógnitas: las variables que queremos encontrar (precio de las frutas).
    • Vector de resultados: los valores en el lado derecho (total de dinero gastado).

    Cómo transformar el sistema para poder resolverlo

    Hasta ahora has visto qué es un sistema de ecuaciones y cómo representarlo en forma matricial. Pero hay un problema práctico: tal como están escritas, las ecuaciones no siempre resultan fáciles de resolver.

    En otros articulos hablamos de las caracteristicas del un sistema, como la singularidad. Aqui veremos como transformar el sistema sin cambiar su significado, haciendo mas simple su solucion.

    Transformar sin perder información

    Existe una serie de operaciones que podemos aplicar a las ecuaciones sin alterar sus soluciones:

    • Intercambiar ecuaciones
    • Multiplicar o dividir una ecuación por un número distinto de cero
    • Sumar o restar ecuaciones entre sí

    Estas operaciones son la base del Algoritmo de eliminación de Gauss. Su objetivo es reorganizar el sistema en una forma mucho más sencilla de interpretar.

    Ejemplo conceptual del proceso

    Partimos de un sistema cualquiera y aplicamos operaciones de fila para:

    1. Elegir un elemento clave (pivote)
    2. Convertir en cero todo lo que hay debajo
    3. Repetir el proceso en las siguientes filas

    El resultado es una matriz en la que la estructura del sistema se vuelve transparente.

    Es como resolver un sistema de ecuaciones común por eliminación, pero aplicado directamente a los números de una matriz (llamada matriz de coeficientes). El objetivo es limpiar la matriz para que las respuestas sean evidentes.

    Forma escalonada por filas (row echelon form).

    Se consigue eliminando la información redundante y aislando la información útil. Cada paso reduce el sistema a algo más simple, manteniendo exactamente las mismas soluciones.

    Una matriz está en esta forma cuando:

    • Cada fila empieza más a la derecha que la anterior
    • Debajo de cada elemento clave (pivote) hay ceros
    • Las filas sin información (todos ceros) quedan al final

    $$A = \begin{bmatrix}1 & * & * \\ 0 & 1 & * \\ 0 & 0 & 1 \end{bmatrix}$$

    • Es útil porque te deja el sistema listo para “sustitución hacia atrás”.

    Forma escalonada reducida: la solución directa

    Si continúas el proceso un paso más, llegas a la forma escalonada reducida (reduced row echelon form) Aquí ocurre algo muy potente, en su columna solo hay ceros (arriba y abajo)

    Cada pivote es 1

    $$A = \begin{bmatrix}1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}$$

    • Es el nivel máximo de limpieza.
    • Aquí la solución es directa, cada fila te dice el valor de cada variable.

    ¿Qué pasa si el sistema es “Singular”?

    A veces, al hacer la eliminación gaussiana, una fila completa se convierte en ceros \( 0 = 0 \)). Esto significa que:

    • El sistema es singular (las ecuaciones eran dependientes o redundantes).
    • En la matriz, verás un 0 en la diagonal principal en lugar de un 1.
    • Esto indica que el sistema puede tener infinitas soluciones o ninguna.

    Método de eliminación gaussiana

    La eliminación gaussiana (o reducción de filas) es el proceso de manipular una matriz mediante operaciones matemáticas simples para simplificarla y resolver sistemas de ecuaciones.

    Pasos en la solución.

    1 – Crear la matriz aumentada:

    $$
    \left(
    \begin{array}{ccc|c}
    3 & 6 & 2 & 34 \\
    10 & 3 & 8 & 69 \\
    1 & 7 & 5 & 48
    \end{array}
    \right)
    $$

    2 – Elegir un buen pivote y hacer intercambio de filas.

    En este ejemplo la fila 3 tiene coeficiente 1 y la cambiamos por la 1.

    $$
    F_1 \leftrightarrow F_3
    $$

    $$
    \left(
    \begin{array}{ccc|c}
    1 & 7 & 5 & 48 \\
    10 & 3 & 8 & 69 \\
    3 & 6 & 2 & 34
    \end{array}
    \right)
    $$

    3- Eliminación columna 1

    Queremos eliminar las variables \( p_1 \) de las filas 2 y 3.

    Buscamos eliminar las \(p_1\), lo primero es restar la fila 1 con la fila 2. Para esto hacemos una normalización de la fila dos, buscando que se elimine la variable. En notación de matrices se expone como:

    $$
    F_2 \leftarrow F_2 – 10F_1
    $$

    Lo que quiere decir es que la nueva fila \( F_2 \) será el resultado de la resta de la fila \( F_2 \) y la fila \( F_1 \) multiplicada por 10. Esto hace que se elimine \(p_1\) en la operación \(10p_1 – 10p_1\).

    La segunda eliminación de la variable es creando una nueva fila 3 producto de la resta entre las filas \( F_3 \) y la \( F_1 \) multiplicando esta por 3.

    $$
    F_3 \leftarrow F_3 – 3F_1
    $$

    La matriz resultante es:

    $$
    \left(
    \begin{array}{ccc|c}
    1 & 7 & 5 & 48 \\
    0 & -67 & -42 & -411 \\
    0 & -15 & -13 & -110
    \end{array}
    \right)
    $$

    4 – Normalización pivote 2

    De la matriz actual buscamos reducir \(p_2\). Normalizamos la fila 2, dividiéndola entre 67, llevando \(p_2\) a 1.

    $$
    F_2 \leftarrow \frac{1}{-67}F_2
    $$

    $$
    \left(
    \begin{array}{ccc|c}
    1 & 7 & 5 & 48 \\
    0 & 1 & \frac{42}{67} & \frac{411}{67} \\
    0 & -15 & -13 & -110
    \end{array}
    \right)
    $$

    5 – Eliminación columna 2

    Normalizamos la \(F_3\), dividiendo entre 15, y la restamos con \(F_2\) eliminando la variable.

    $$
    F_3 \leftarrow F_3 + 15F_2
    $$

    $$
    \left(
    \begin{array}{ccc|c}
    1 & 7 & 5 & 48 \\
    0 & 1 & \frac{42}{67} & \frac{411}{67} \\
    0 & 0 & \frac{-241}{67} & \frac{-1205}{67}
    \end{array}
    \right)
    $$

    6 – Normalización pivote 3

    Multiplicamos \(F_3\) por \( \frac{-67}{241} \) para llevar \(p_3\) a 1.

    $$
    F_3 \leftarrow \frac{-67}{241}F_3
    $$

    $$
    \left(
    \begin{array}{ccc|c}
    1 & 7 & 5 & 48 \\
    0 & 1 & \frac{42}{67} & \frac{411}{67} \\
    0 & 0 & 1 & \frac{1205}{241}
    \end{array}
    \right)
    $$

    7 – Sustitución hacia atrás

    Calcular el valor de \(p_3\).

    $$
    p_3 = \frac{1205}{241} = 5
    $$

    Sustituir \(p_3\) en \(F_2\)

    $$
    p_2 + \frac{42}{67} \cdot 5 = \frac{411}{67}
    $$

    $$
    p_2 = 3
    $$

    Sustituir \(p_3\) y \(p_2\) en \(F_1\)

    $$
    p_1 + 7 \cdot 3 + 5 \cdot 5 = 48
    $$

    $$
    p_1 = 2
    $$

    Resultado final

    $$
    \begin{cases}
    p_1 = 2 \\
    p_2 = 3 \\
    p_3 = 5
    \end{cases}
    $$

    Paso 4 — verificación (comprobación directa)

    Multiplicamos la matriz por el vector de precios para ver si obtenemos los costes:

    $$M = \begin{bmatrix} 3 & 6 & 2 \\ 10 & 3 & 8 \\ 1 & 7 & 5 \end{bmatrix}, p = \begin{bmatrix} 2 \\ 3 \\ 5 \end{bmatrix}$$

    Producto \(Mp\):

    • Fila 1: \( 3 \cdot 2 + 6 \cdot 3 + 2 \cdot 5 = 34\)
    • Fila 2: \( 10 \cdot 2 + 3 \cdot 3 + 8 \cdot 5 = 69\)
    • Fila 3: \( 1 \cdot 2 + 7 \cdot 3 + 5 \cdot 5 = 48\)

    Método de Gauss-Jordan: llevar el sistema hasta la matriz identidad

    Una vez hemos aplicado la sustitución hacia atrás y ya conocemos los valores de las variables, puede surgir una pregunta lógica: ¿Y si en lugar de calcular las variables “a mano”, dejamos la matriz ya resuelta automáticamente? Aquí es donde entra el método de Gauss-Jordan.

    ¿Qué aporta Gauss-Jordan?

    El método de Gauss (el que hemos usado) termina en una matriz escalonada, y a partir de ahí necesitamos hacer sustitución hacia atrás. El método de Gauss-Jordan va un paso más allá. Sigue aplicando operaciones hasta convertir la matriz en la matriz identidad

    💡 En ese momento:

    • Ya no necesitas sustituir
    • Los valores de las variables aparecen directamente en la última columna

    ¿Por qué es útil llegar a la identidad?

    Porque transforma el sistema en algo trivial:

    • Cada fila representa directamente una variable
    • El sistema queda completamente desacoplado
    • Es el método que se usa en:
      • cálculo matricial
      • inversa de matrices
      • implementaciones en programación

    Continuamos el ejemplo

    $$
    \left(
    \begin{array}{ccc|c}
    1 & 7 & 5 & 48 \\
    0 & 1 & \frac{42}{67} & \frac{411}{67} \\
    0 & 0 & 1 & \frac{1205}{241}
    \end{array}
    \right)
    $$

    Paso 1: Eliminar la columna 3 de la fila 2 usando la fila 3:

    Operación \( F_2 \rightarrow F_2 – \frac{42}{67}F_3\)

    • Columna 3:

    $$ \frac{42}{67} – \frac{42}{67} \cdot 1 = 0$$

    • Termino independiente:

    $$ \frac{411}{67} – \frac{42}{67} \cdot 1 \frac{1205}{241}$$

    $$ \frac{42 \cdot 1205}{67 \cdot 241} = \frac{50610}{16147}$$

    Ahora llevamos \( \frac{411}{67}\) al mismo denominador:

    $$ \frac{411}{67} = \frac{411 \cdot 241}{67 \cdot 241} = \frac{99051}{16147}$$

    Restamos:

    $$ \frac{99051}{16147} – \frac{50610}{16147} = \frac{48441}{16471} = 3$$

    Nueva \(F_2\):

    $$\left(\begin{array}{ccc|c}0 & 1 & 0 & 3 \end{array}\right)$$

    Paso 2: eliminar la columna 3 de la fila 1 usando la fila 3

    Operación \( F_1 \rightarrow F_1 – 5F_3\)

    • Columna 3:

    $$5 – 5 = 0$$

    • Termino independiente:

    $$ 48 – 5 \cdot \frac{1205}{241}$$

    $$ 5 \cdot \frac{1205}{241} = \frac{6025}{241}$$

    Pasamos 48 a fracción:

    $$ 48 = \frac{11568}{241}$$

    Restamos:

    $$ \frac{11568}{241} – \frac{6025}{241} = \frac{5543}{241} = 23$$

    Calculamos el término independiente de la fila 3 que no se usará nuevamente:

    $$ \frac{1205}{241} = 5$$

    Matriz tras paso 1:

    $$
    \left(
    \begin{array}{ccc|c}
    1 & 7 & 0 & 23 \\
    0 & 1 & 0 & 3 \\
    0 & 0 & 1 & 5
    \end{array}
    \right)
    $$

    PASO 2: eliminar la columna 2 (usando la fila 2)

    Operación \( F_1 \rightarrow F_1 – 7F_2\)

    Columna 2:

    $$7 – 7 = 0$$

    Termino independiente:

    $$23 – 7 \cdot 3 = 2$$

    Matriz de identidad:

    $$
    \left(
    \begin{array}{ccc|c}
    1 & 0 & 0 & 2 \\
    0 & 1 & 0 & 3 \\
    0 & 0 & 1 & 5
    \end{array}
    \right)
    $$

    Solucion final

    $$
    \begin{cases}
    p_1 = 2 \\
    p_2 = 3 \\
    p_3 = 5
    \end{cases}
    $$

    Solución con Python

    Para solucionar con python usamos numpy.linalg.solve, que aplica internamente eliminación de Gauss con pivotado, y es la forma más eficiente y segura de resolver sistemas lineales \(A \cdot x = b \) en Python.

    import numpy as np
    
    # Matriz de coeficientes
    A = np.array([
        [3, 6, 2],
        [10, 3, 8],
        [1, 7, 5]
    ], dtype=float)
    
    # Vector de resultados
    b = np.array([34, 69, 48], dtype=float)
    
    # Resolver el sistema A·x = b
    sol = np.linalg.solve(A, b)
    
    # Mostrar resultados
    p1, p2, p3 = sol
    print(f"p1 = {p1:.2f}, p2 = {p2:.2f}, p3 = {p3:.2f}")

    Salida:

    p1 = 2.00, p2 = 3.00, p3 = 5.00
  • Eigenvectores, Eigenvalores y Compresión de Datos (Eigenfaces)

    En el artículo anterior se trabajo los autovalores y autovectores, es común quedarse con la sensación de que son conceptos abstractos. Pero en realidad, están detrás de muchas de las herramientas más potentes del análisis de datos moderno.

    Una de ellas es el Análisis de Componentes Principales (PCA), una técnica que permite comprimir información sin perder lo esencial.

    En este artículo veremos cómo los eigenvectores sirven para reducir la dimensionalidad de los datos, y cómo este principio se aplica a algo tan visual como la compresión de imágenes de rostros humanos.

    Cuando trabajamos con datos reales —imágenes, audio, sensores o registros de clientes— solemos tener miles de variables. Eso significa que el procesamiento se vuelve lento, costoso y muchas veces innecesario, porque buena parte de los datos son redundantes.

    El PCA (Principal Component Analysis) se basa precisamente en encontrar las direcciones de mayor variabilidad dentro de los datos. Y esas direcciones no son otras que los autovectores de la matriz de covarianza del conjunto.

    Visualizando el concepto con una imagen

    Una imagen digital no es más que una matriz de números, donde cada valor representa la intensidad del color (por ejemplo, del blanco al negro si es en escala de grises).

    Para este ejemplo usaremos el famoso dataset de rostros de celebridades incluido en scikit-learn.

    from sklearn.datasets import fetch_lfw_people
    import matplotlib.pyplot as plt
    
    # Cargamos el dataset de caras
    faces = fetch_lfw_people(min_faces_per_person=60)
    image = faces.images[0]
    
    plt.imshow(image, cmap='bone')
    plt.title(f"Ejemplo de imagen: {faces.target_names[0]}")
    plt.axis('off')
    plt.show()
    

    Cada imagen tiene 62 filas × 47 columnas, es decir, 2.914 píxeles o variables.
    PCA nos permitirá representar esta misma información con muchas menos variables.


    Aplicando PCA paso a paso

    PCA consiste básicamente en tres fases:

    1. Calcular la matriz de covarianza del conjunto de datos.
    2. Obtener sus autovectores y autovalores.
    3. Proyectar los datos sobre las direcciones asociadas a los autovalores más grandes, que contienen la mayor parte de la varianza.

    En código, podemos hacerlo así:

    from sklearn.decomposition import PCA
    import numpy as np
    
    # Aplanamos las imágenes 2D a vectores 1D
    X = faces.data
    
    # Aplicamos PCA para conservar solo 15 componentes principales
    pca = PCA(n_components=15)
    X_pca = pca.fit_transform(X)
    
    # Reconstruimos las imágenes desde los componentes principales
    X_reconstructed = pca.inverse_transform(X_pca)
    
    # Mostramos la imagen original y la reconstruida
    fig, axes = plt.subplots(1, 2, figsize=(8, 4))
    axes[0].imshow(X[0].reshape(62, 47), cmap='bone')
    axes[0].set_title("Imagen original")
    axes[0].axis('off')
    
    axes[1].imshow(X_reconstructed[0].reshape(62, 47), cmap='bone')
    axes[1].set_title("Reconstruida (15 componentes)")
    axes[1].axis('off')
    
    plt.show()
    

    ¿Qué estamos haciendo en realidad?

    Cada componente principal es un autovector de la matriz de covarianza.
    Cada uno representa una dirección en el espacio de datos donde la información cambia más.
    Los autovalores indican cuánta “varianza” explica cada componente.

    En este caso, al reconstruir la imagen con solo 15 componentes, vemos una versión algo borrosa, pero perfectamente reconocible. Hemos pasado de 2.914 variables a solo 15, manteniendo casi toda la información útil.

    Si reducimos a 5 componentes, la imagen pierde detalle; si aumentamos a 50, se ve casi igual que la original. Todo depende del equilibrio que queramos entre tamaño y fidelidad.


    Las “eigenfaces”

    Una de las formas más visuales de entender PCA en imágenes es observar los autovectores directamente. En este caso se les conoce como eigenfaces, o “caras propias”.

    Cada eigenface representa un patrón característico: sombras de ojos, contorno del rostro, luz lateral, expresión, etc.

    Podemos verlos así:

    fig, axes = plt.subplots(3, 5, figsize=(9, 6))
    for i, ax in enumerate(axes.flat):
        ax.imshow(pca.components_[i].reshape(62, 47), cmap='bone')
        ax.set_title(f"Comp {i+1}")
        ax.axis('off')
    plt.suptitle("Los 15 eigenfaces principales")
    plt.show()
    

    Los eigenvectores son, en el fondo, una forma de entender la estructura interna de los datos.