• Saltar al contenido principal
  • Skip to secondary menu
  • Saltar a la barra lateral principal
  • Saltar al pie de página
  • Inicio
  • Secciones
    • Ciencia de datos
    • Criptografía
    • Herramientas
    • Machine Learning
    • Noticias
    • Opinión
    • Productividad
    • Programación
      • JavaScript
      • Julia
      • Matlab
      • Python
      • R
  • Programación
    • JavaScript
    • Julia
    • Matlab
    • Python
    • R
  • Laboratorio
    • Encuestas: Tamaño de Muestra
    • Lotería: Probabilidad de Ganar
    • Reparto de Escaños (D’Hondt)
    • Tres en Raya con IA
  • Noticias
  • Boletín
  • Contacto
  • Tienda
    • Libros
    • Equipamiento de oficina
    • Equipamiento en movilidad
    • Tiendas afiliadas
      • AliExpress
      • Amazon
      • Banggood
      • GeekBuying
      • Lenovo

Analytics Lane

Ciencia e ingeniería de datos aplicada

  • Ciencia de datos
  • Machine Learning
  • IA Generativa
  • Python
  • Pandas
  • NumPy
  • Excel
  • Matlab

Eliminación de la multicolinealidad con PCA en modelos de regresión

junio 14, 2024 Por Daniel Rodríguez Deja un comentario
Tiempo de lectura: 7 minutos

En aprendizaje automático, la multicolinealidad es un problema habitual que suele afectar a la precisión y la interpretabilidad de los modelos de regresión. Lo que reduce la utilidad de estos. La multicolinealidad aparece cuando dos o más variables independientes están altamente correlacionadas, dificultando determinar el impacto individual de cada una de estas variables en la dependiente. En esta entrada se verá cómo reducir el problema de la multicolinealidad con PCA (Análisis de Componentes Principales) y cuáles son sus ventajas respecto a otras técnicas.

Tabla de contenidos

  • 1 Por qué la multicolinealidad es un problema para los modelos de regresión
  • 2 Por qué usar PCA para eliminar la multicolinealidad
    • 2.1 Ventajas de PCA frente a VIF y el análisis de correlación
    • 2.2 Desventajas de PCA
  • 3 Proceso para eliminar la multicolinealidad utilizando PCA
  • 4 Ejemplo de uso en Python
  • 5 Factorización del proceso
  • 6 Conclusiones

Por qué la multicolinealidad es un problema para los modelos de regresión

La multicolinealidad en los modelos de regresión puede tener varias implicaciones negativas que afectan tanto la calidad de las estimaciones como la capacidad predictiva del modelo. Algunas de las razones por las que la multicolinealidad es un problema para tener en cuenta son:

  • Estimaciones de coeficientes inestables: La alta correlación entre variables independientes puede hacer que las estimaciones de los coeficientes de regresión sean muy sensibles a cambios en los datos. Algo que dificulta enormemente la interpretación de los resultados.
  • Reducción de la precisión: La multicolinealidad introduce redundancia en las variables independientes, debido a que unas variables dependen linealmente de otras, lo que puede reducir la capacidad predictiva del modelo y llevar a predicciones menos precisas y más variables.
  • Dificultad en la interpretación: Cuando las variables son colineales, puede ser difícil discernir cuál de las variables es más importante para el modelo, aumentando la dificultad para interpretar los resultados.

Publicidad


Por qué usar PCA para eliminar la multicolinealidad

El Análisis de Componentes Principales (PCA) es una herramienta que se puede usar para solucionar el problema de la multicolinealidad. PCA transforma las variables originales en un nuevo conjunto de variables no correlacionadas (a las que se denominan componentes principales), reteniendo la mayor parte de la varianza del conjunto de datos original.

Curiosidad: La maldición de la dimensionalidad, o por qué añadir más datos puede empeorar tu modelo
En Analytics Lane
Curiosidad: La maldición de la dimensionalidad, o por qué añadir más datos puede empeorar tu modelo

Ventajas de PCA frente a VIF y el análisis de correlación

Existen otros métodos para eliminar o reducir el efecto de la multicolinealidad en los modelos de regresión como VIF y el análisis de correlación. Algunas de las ventajas que ofrece PCA frente a estos son:

  • Reducción de dimensionalidad: PCA no solo elimina la multicolinealidad, sino que también reduce la dimensionalidad del conjunto de datos, lo que puede mejorar la eficiencia computacional y la simplicidad del modelo. En contraste, el análisis de correlación y el VIF solo identifican y eliminan variables colineales sin cambiar la dimensionalidad del conjunto de datos.
  • Componentes no correlacionados: A diferencia del análisis de correlación, que solo identifica variables correlacionadas, PCA genera componentes principales que son inherentemente no correlacionados. El VIF, por otro lado, mide cuánto se infla la varianza de un coeficiente de regresión debido a la colinealidad, pero no transforma las variables.
  • Varianza explicada: PCA permite retener la mayor parte de la información original al seleccionar componentes que explican la mayor parte de la varianza. Esto significa que, aunque se reduzca el número de variables, la mayor parte de la información relevante de los datos se conserva. Pudiéndose saber además cuál es el porcentaje que se conserva.

Publicidad


Desventajas de PCA

A pesar de sus ventajas, también presenta algunas desventajas que se deben tener en cuenta a la hora de seleccionar el mejor método para abordar el problema de la multicolinealidad:

  • Pérdida de interpretabilidad: Los componentes principales son combinaciones lineales de las variables originales, lo que puede hacer que el modelo sea más difícil de interpretar. Al usar PCA los modelos ya no se entrenan con las variables originales, sino con los componentes principales. En cambio, el análisis de correlación y el VIF mantienen las variables originales, facilitando la interpretación.
  • Requiere estandarización: PCA es sensible a las escalas de las variables, por lo que es necesario estandarizar los datos antes de aplicar PCA.

Proceso para eliminar la multicolinealidad utilizando PCA

Para eliminar la multicolinealidad de un conjunto de datos mediante PCA es necesario seguir un proceso estándar. Siendo estos pasos lo que se muestra a continuación:

  1. Estandarización de los datos: En primer lugar, es imprescindible proceder a la estandarización de las variables antes de usar PCA, ya que el algoritmo es sensible a las escalas de las variables.
  2. Aplicación de PCA: Calcula los componentes principales y selecciona el número adecuado de componentes que explican la mayor parte de la varianza.
  3. Transformación de los datos: Transforma el conjunto de datos original en el espacio de los componentes principales seleccionados.

Publicidad


Ejemplo de uso en Python

El proceso anterior se puede implementar fácilmente en Python gracias a las herramientas que ofrece Scikit-learn. Para ello solo hace falta un conjunto de datos, normalizar este y usar PCA antes de crear el modelo.

import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# Se establece una semilla para reproducibilidad
np.random.seed(42)

# Conjunto de datos sintético con multicolinealidad
mu = [0, 0, 0, 0, 0]
sigma = [[1, 0.8, 0.6, 0.4, 0.2], 
         [0.8, 1, 0.7, 0.5, 0.3], 
         [0.6, 0.7, 1, 0.8, 0.4], 
         [0.4, 0.5, 0.8, 1, 0.6], 
         [0.2, 0.3, 0.4, 0.6, 1]]
data = np.random.multivariate_normal(mu, sigma, size=100)
df = pd.DataFrame(data, columns=['X1', 'X2', 'X3', 'X4', 'X5'])

# Estandarización los datos
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)

# PCA
pca = PCA()
pca.fit(df_scaled)

# Obtenención de la varianza explicada por cada componente principal
explained_variance = pca.explained_variance_ratio_
print("Varianza explicada por cada componente principal:")
print(explained_variance)

# Selección del número adecuado de componentes que expliquen al menos el 95% de la varianza
cumulative_variance = np.cumsum(explained_variance)
num_components = np.argmax(cumulative_variance >= 0.95) + 1
print(f"Se seleccionaron los primeros {num_components} componentes principales.")

# Transformación de los datos originales en el espacio de los componentes principales seleccionados
df_pca = pca.transform(df_scaled)[:, :num_components]

# Conversión del resultado a un DataFrame
df_pca = pd.DataFrame(df_pca, columns=[f'PC{i+1}' for i in range(num_components)])

# Impresión del nuevo conjunto de datos con los componentes principales
print("Conjunto de datos transformado en el espacio de los componentes principales:")
print(df_pca.head())
Varianza explicada por cada componente principal:
[0.57809153 0.23707732 0.1148487 0.03757537 0.03240708]
Se seleccionaron los primeros 4 componentes principales.
Conjunto de datos transformado en el espacio de los componentes principales:
PC1 PC2 PC3 PC4
0 1.037293 0.109094 -0.590973 0.598084
1 -0.363318 -1.659331 -0.526006 -0.256955
2 -0.780882 0.742319 -0.200194 -1.118984
3 -0.962928 1.361873 -0.365125 -0.643992
4 2.868593 0.047854 -0.014559 -0.640989

En este código, lo primero que se hace es estandarizar los datos a través de StandardScaler para asegurar que todas las variables tengan la misma escala. Recordando que PCA es altamente sensible a la magnitud de las variables. A continuación, se entrena el modelo PCA a los datos estandarizados para calcular los componentes principales.

Una vez obtenido las componentes principales, se puede calcular que parte de la varianza explica cada una de ellas. Usando para ello la propiedad explained_variance_ratio_. Usando como criterio para seleccionar el número de componentes que la varianza total explicada esté por encima de un umbral, en el ejemplo un 95%. Garantizando de este modo que la mayoría de la información relevante de los datos originales se conserve.

Finalmente, se transforma el conjunto de datos original en el espacio de los componentes principales seleccionados y convertimos el resultado en un DataFrame. Lo que facilita trabajar con el nuevo conjunto de datos.

Factorización del proceso

Debido a que este es un proceso habitual cuando se necesita crear modelos de regresión, se puede crear una función para tener a mano el método.

import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline

def eliminar_variables_colineales_pca(X, varianza_umbral=0.95):
    """
    Elimina variables colineales utilizando Análisis de Componentes Principales (PCA).

    Parámetros:
    ----------
    X : array-like, shape (n_samples, n_features)
        El conjunto de datos de entrada.
    
    varianza_umbral : float, opcional (default=0.95)
        El umbral de varianza acumulada para seleccionar los componentes principales.

    Retorna:
    -------
    pipeline : sklearn.pipeline.Pipeline
        Tubería de scikit-learn con los pasos de estandarización y PCA.
    
    X_pca : array, shape (n_samples, n_components)
        El conjunto de datos transformado en el espacio de los componentes principales seleccionados.
    
    n_components : int
        Número de componentes principales seleccionados que explican al menos el umbral de varianza especificado.
    
    explained_variance_ratio : array, shape (n_components,)
        La cantidad de varianza explicada por cada uno de los componentes principales seleccionados.
    """
    # Estandarizar los datos
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)

    # Aplicar PCA
    pca = PCA()
    pca.fit(X_scaled)

    # Calcular la varianza explicada acumulada
    cumulative_variance = np.cumsum(pca.explained_variance_ratio_)

    # Determinar el número de componentes que explican al menos el umbral de varianza
    n_components = np.argmax(cumulative_variance >= varianza_umbral) + 1

    # Crear una tubería con estandarización y PCA
    pipeline = Pipeline([
        ('scaler', StandardScaler()),
        ('pca', PCA(n_components=n_components))
    ])

    # Ajustar y transformar los datos usando la tubería
    X_pca = pipeline.fit_transform(X)

    return pipeline, X_pca, n_components, pca.explained_variance_ratio_[:n_components]

En este caso la función eliminar_variables_colineales_pca() recibe los datos como parámetro de entrada. La salida son cuatro parámetros: una tubería con el proceso (necesario para transformar datos tanto en un conjunto de pruebas como en producción), el resultado de la transformación, el número de componentes principales y el porcentaje de varianza explicada.

Ahora se puede usar este código para comprobar que se obtienen los mismos resultados.

# Uso de la función para eliminar variables colineales
pipeline, df_pca, n_components, explained_variance_ratio = eliminar_variables_colineales_pca(df, varianza_umbral=0.95)

print("Número de componentes seleccionados:", n_components)
print("Varianza explicada por cada componente seleccionado:", explained_variance_ratio)
print("Conjunto de datos transformado en el espacio de los componentes principales:")
print(pd.DataFrame(df_pca).head())
Número de componentes seleccionados: 4
Varianza explicada por cada componente seleccionado: [0.57809153 0.23707732 0.1148487 0.03757537]
Conjunto de datos transformado en el espacio de los componentes principales:
0 1 2 3
0 1.037293 0.109094 -0.590973 0.598084
1 -0.363318 -1.659331 -0.526006 -0.256955
2 -0.780882 0.742319 -0.200194 -1.118984
3 -0.962928 1.361873 -0.365125 -0.643992
4 2.868593 0.047854 -0.014559 -0.640989

Publicidad


Conclusiones

El Análisis de Componentes Principales (PCA) permite transformar un conjunto de datos en otro donde los componentes principales son ortogonales entre sí. Si existe un problema de multicolinealidad en los datos originales, este desaparece en las componentes principales. Por lo que, al seleccionar un número adecuado de componentes principales que explican una proporción significativa de la varianza total se puede obtener un nuevo conjunto de datos sin multicolinealidad con el que se pueden crear modelos de regresión. Con lo que se pueden obtener modelos más estables y eficaces. Aunque el uso de PCA también tiene la desventaja de perder la interpretabilidad del modelo, algo que puede ser clave en muchas aplicaciones.

Imagen de Jonas en Pixabay

¿Te ha parecido de utilidad el contenido?

¡Puntúalo entre una y cinco estrellas!

Puntuación promedio 0 / 5. Votos emitidos: 0

Ya que has encontrado útil este contenido...

¡Síguenos en redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Déjame mejorar este contenido!

Dime, ¿cómo puedo mejorar este contenido?

Publicaciones relacionadas

  • Curiosidad: La maldición de la dimensionalidad, o por qué añadir más datos puede empeorar tu modelo
  • ¿Está concentrado el MSCI World? Un análisis con Gini, Lorenz y leyes de potencia
  • Curiosidad: ¿Por qué usamos p < 0.05? Un umbral que cambió la historia de la ciencia
  • Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python)
  • La Paradoja del Cumpleaños, o por qué no es tan raro compartir fecha de nacimiento
  • Cómo abrir una ventana de Chrome con tamaño y posición específicos desde la línea de comandos en Windows
  • Curiosidad: El sesgo de supervivencia, o por qué prestar atención sólo a los que “llegaron” puede engañarte
  • Documentar tu API de Express con TypeScript usando OpenAPI (Swagger)
  • Data Lake y Data Warehouse: diferencias, usos y cómo se complementan en la era del dato

Publicado en: Ciencia de datos Etiquetado como: PCA

Interacciones con los lectores

Deja una respuesta Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

I accept the Terms and Conditions and the Privacy Policy

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Barra lateral principal

Suscríbete a nuestro boletín

Suscríbete al boletín semanal para estar al día de todas las publicaciones.

Política de Privacidad

Analytics Lane en redes sociales

  • Amazon
  • Bluesky
  • Facebook
  • GitHub
  • Instagram
  • Mastodon
  • Pinterest
  • RSS
  • Telegram
  • Tumblr
  • Twitter
  • YouTube

Publicidad

Entradas recientes

Data Lake y Data Warehouse: diferencias, usos y cómo se complementan en la era del dato

octubre 23, 2025 Por Daniel Rodríguez

Documentar tu API de Express con TypeScript usando OpenAPI (Swagger)

octubre 21, 2025 Por Daniel Rodríguez

Curiosidad: El sesgo de supervivencia, o por qué prestar atención sólo a los que “llegaron” puede engañarte

octubre 16, 2025 Por Daniel Rodríguez

Publicidad

Es tendencia

  • Cómo calcular el tamaño de la muestra para encuestas publicado el septiembre 9, 2025 | en Ciencia de datos
  • Aplicación web interactiva que muestra un mapa de Madrid con puntos de interés destacados, creado utilizando la biblioteca Folium. Tutorial: Creando un mapa interactivo con Folium en Python publicado el diciembre 13, 2024 | en Python
  • Entendiendo la validación cruzada: Selección de la profundidad óptima en un árbol de decisión publicado el septiembre 13, 2024 | en Ciencia de datos
  • Introducción a igraph en R (Parte 9): Centralidad de Prestigio y Autoridad (modelo HITS, Hyperlink-Induced Topic Search) publicado el mayo 14, 2025 | en R
  • Aprovecha un 40% de descuento en Coursera Plus para impulsar tus habilidades en Ciencia de Datos e Inteligencia Artificial publicado el noviembre 9, 2024 | en Noticias, Reseñas

Publicidad

Lo mejor valorado

4.9 (24)

Seleccionar filas y columnas en Pandas con iloc y loc

4.6 (16)

Archivos JSON con Python: lectura y escritura

4.4 (14)

Ordenación de diccionarios en Python mediante clave o valor

4.7 (13)

Operaciones de filtrado de DataFrame con Pandas en base a los valores de las columnas

4.5 (10)

Diferencias entre var y let en JavaScript

Publicidad

Comentarios recientes

  • Daniel Rodríguez en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • Pepe en Probabilidad básica: cómo entender el azar en nuestra vida diaria
  • CARLOS ARETURO BELLO CACERES en Justicio: La herramienta gratuita de IA para consultas legales
  • Piera en Ecuaciones multilínea en Markdown
  • Daniel Rodríguez en Tutorial de Mypy para Principiantes

Publicidad


Footer

Analytics Lane

  • Acerca de Analytics Lane
  • Boletín de noticias
  • Contacto
  • Libros
  • Lo más popular
  • Noticias
  • Tienda
  • Tiendas afiliadas

Secciones

  • Ciencia de datos
  • Criptografía
  • Herramientas
  • Machine Learning
  • Opinión
  • Productividad
  • Programación
  • Reseñas

Sobre de Analytics Lane

En Analytics Lane tratamos de explicar los principales conceptos de la ciencia e ingeniería de datos con un enfoque práctico. Los principales temas tratados son ciencia de datos, ingeniería de datos, inteligencia artificial, machine learning, deep learning y criptografía. Además, también se habla de los principales lenguajes de programación y herramientas utilizadas por los científicos e ingenieros de datos.

Copyright © 2018-2025 Analytics Lane ·Términos y condiciones ·Política de Cookies ·Política de Privacidad ·Herramientas de privacidad ·Contacto