Ciencia de datos

Análisis de correlación para modelos de regresión: Cómo eliminar la multicolinealidad y mejorar la robustez

Los modelos de regresión son una de las técnicas estadísticas más utilizadas para comprender y predecir las relaciones entre las variables. Siendo ampliamente utilizadas en análisis de datos y aprendizaje automático. Sin embargo, cuando las variables que se desean utilizar para la construcción del modelo están altamente correlacionadas, aparece el problema de la multicolinealidad. Pudiendo afectar negativamente tanto a la precisión como a la interpretación de los resultados. En esta entrada se analizará cómo se puede abordar el problema de la multicolinealidad mediante el análisis de correlación.

El problema de la multicolinealidad en los modelos de regresión

Imaginemos que nos han pedido la construcción de un modelo para predecir el precio de la vivienda en función de múltiples características. Posiblemente nuestra primera opción sería un modelo de regresión. Para el que se usarán características como el tamaño, el número de habitaciones, la ubicación, etc. Al recibir los datos, se puede ver intuitivamente que algunas características están altamente correlacionadas entre sí. Por ejemplo, el tamaño de la casa y el número de habitaciones suelen estar fuertemente correlacionados, lo que indica multicolinealidad. La multicolinealidad es un problema importante en modelos de regresión debido a varias razones, entre las que se puede destacar:

  1. Distorsiona las estimaciones de los coeficientes: Cuando las variables independientes están altamente correlacionadas, el modelo tiene dificultades para estimar los efectos individuales de cada variable sobre la variable dependiente. Esto puede resultar en coeficientes de regresión poco fiables o sesgados.
  2. Dificulta la interpretación de los resultados: La presencia de multicolinealidad puede hacer que sea difícil determinar la importancia relativa de cada variable independiente en el modelo. Esto puede dificultar la interpretación de los resultados. Siguiendo con el ejemplo anterior, ¿es el tamaño o el número de habitaciones lo que mejor predice el precio?
  3. Aumenta la varianza de las estimaciones: La multicolinealidad puede aumentar la varianza de las estimaciones de los coeficientes, lo que reduce la precisión del modelo y puede llevar a conclusiones erróneas sobre la relación entre las variables.

Esto hace que identificar la multicolinealidad en los conjuntos de utilizados para la construcción de modelo de regresión sea clave. Garantizando así mejores estimaciones y una interpretación adecuada de los resultados.

Eliminación de la multicolinealidad mediante análisis de correlación

El análisis de correlación es una herramienta clave para poder identificar la multicolinealidad entre las variables independientes en un modelo de regresión. Un análisis sencillo que se puede realizar mediante los siguientes pasos:

  1. Calcular la matriz de correlación: Obtener la matriz de correlación con las correlaciones entre todas las variables independientes del conjunto de datos. Para su obtención se pueden utilizar diferentes métodos como el coeficiente de correlación de Pearson.
  2. Identificar los pares de variables altamente correlacionadas: Examinar la matriz de correlación para identificar cuáles son los pares de variables que están altamente correlacionadas entre sí. Esto se hace localizando los valores de correlación cercanos a 1 o -1, ya que indican una fuerte correlación entre las variables.
  3. Evaluar la magnitud de la correlación: Se debe considerar la magnitud de la correlación entre las diferentes variables. Aunque la correlación puede ser alta, es importante determinar si es lo suficientemente alta como para causar problemas de multicolinealidad en el modelo de regresión.
  4. Seleccionar las características a eliminar: Una vez identificados los pares de variables altamente correlacionadas, es necesario seleccionar una de las variables de cada par para eliminarla del modelo. La selección puede basarse en criterios como la relevancia teórica, la importancia de la variable en el contexto del problema o la disponibilidad de datos.
  5. Eliminar las características seleccionadas: Elimina las características seleccionadas del conjunto de datos usado para la creación del modelo. Lo que implica excluir estas características del modelo de regresión.
  6. Repetir el proceso si es necesario: Si la matriz de correlación revela múltiples pares de variables altamente correlacionadas, será necesario repetir el proceso de identificación y eliminación de características hasta que el nivel de multicolinealidad en el modelo de regresión sea asumible.

Es importante tener en cuenta que la eliminación de características debe realizarse con precaución, ya que puede afectar la capacidad predictiva y la interpretabilidad del modelo. Siempre se debe considerar el contexto del problema y la relevancia de las características antes de eliminarlas.

Además del análisis de correlación, también se pueden emplear otras técnicas como el factor de inflación de la varianza (VIF) para identificar y abordar la multicolinealidad en modelos de regresión.

Uso del análisis de correlación en Python para eliminar la multicolinealidad

El proceso que se ha descrito en la sección anterior se puede implementar fácilmente en Python. Para ello, en primer lugar, hace falta disponer de un conjunto de datos con variables colineales, lo que se puede obtener con las funciones de generación de números aleatorios de NumPy. En el siguiente código se fija la semilla 42 para la reproducibilidad de los datos. A continuación, se define una matriz de covarianza con multicolinealidad, para lo que se indica valores de correlación altos tales como un 0,8. Finalmente, se crea el conjunto de datos con la función np.random.multivariate_normal() y se almacena en un DataFrame.

import numpy as np
import pandas as pd

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

# Se crea un 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)

# El array de numpy se transforma en un DataFrame de pandas
df = pd.DataFrame(data, columns=['X1', 'X2', 'X3', 'X4', 'X5'])

# Conjunto de datos con variables colineales
print("Conjunto de datos con variables colineales:")
print(df.head())
Conjunto de datos con variables colineales:
X1 X2 X3 X4 X5
0 -0.757616 0.111037 -0.634418 -0.680133 0.095039
1 1.321557 0.724946 0.035784 -0.719422 -0.555579
2 0.692901 -0.125111 -0.204947 1.091728 0.538835
3 0.215137 0.024256 0.003629 1.182242 1.035566
4 -0.826915 -1.687707 -1.567666 -0.870726 -0.737170

A simple vista es difícil saber si los datos están o no correlacionados. Pero se puede usar el proceso descrito anteriormente para eliminar las variables que están altamente correlacionadas. Lo que se muestra en el siguiente código.

# Calculo de la matriz de correlación
correlation_matrix = df.corr()

# Identificación de las variables colineales
colinear_features = set()
for i in range(len(correlation_matrix.columns)):
    for j in range(i):
        if abs(correlation_matrix.iloc[i, j]) > 0.8:  # Umbral de correlación
            colinear_features.add(correlation_matrix.columns[i])

# Eliminación de las variables colineales del DataFrame
df_cleaned = df.drop(columns=colinear_features)

# El nuevo conjunto de datos sin variables colineales
print("Conjunto de datos sin variables colineales:")
print(df_cleaned.head())
Conjunto de datos sin variables colineales:
X1 X3 X4 X5
0 -0.757616 -0.634418 -0.680133 0.095039
1 1.321557 0.035784 -0.719422 -0.555579
2 0.692901 -0.204947 1.091728 0.538835
3 0.215137 0.003629 1.182242 1.035566
4 -0.826915 -1.567666 -0.870726 -0.737170

En este ejemplo, en primer lugar, se usa el método corr() del DataFrame para obtener la matriz de correlación. Posteriormente se recorre la diagonal superior de la matriz en búsqueda de valores que superen el umbral de correlación. Valor que se ha fijado en 0,8. Las columnas del DataFrame que superan este valor umbral son eliminadas usando para ello el método drop().

Se puede ver como resultado se ha eliminado la variable X2, la cual se creó con un factor de correlación de 0,8 con X1. Por su parte, X3 y X4 también se definieron con este valor, pero se puede ver que los datos generados tienen una correlación ligeramente inferior (~ 0,73) debido a la variabilidad estadística de los números aleatorios, por lo que el proceso no elimina ninguno de los dos.

Factorización del análisis de correlación en Python

Ya que este proceso es habitual en los análisis, se puede crear una función para tener a mano el método ya implementado. Una posible implementación de la función sería la que se muestra a continuación.

import numpy as np
import pandas as pd

def eliminar_variables_colineales(dataframe, umbral=0.8):
    """
    Elimina las variables colineales de un DataFrame basado en un umbral de correlación.

    Parámetros:
    - dataframe: DataFrame de pandas. El conjunto de datos que contiene las variables.
    - umbral: float, opcional (default=0.8). El umbral de correlación para considerar dos variables como colineales.

    Retorna:
    - DataFrame: Un nuevo DataFrame sin las variables colineales.

    """

    # Calcula la matriz de correlación
    correlation_matrix = dataframe.corr()

    # Busca las variables colineales
    colinear_features = set()
    for i in range(len(correlation_matrix.columns)):
        for j in range(i):
            if abs(correlation_matrix.iloc[i, j]) > umbral:
                colinear_features.add(correlation_matrix.columns[i])

    # Elimina las variables colineales del DataFrame
    df_cleaned = dataframe.drop(columns=colinear_features)

    return df_cleaned

En donde se ha convertido el umbral en un parámetro que por defecto se fija a 0,8, pero que el usuario puede cambiar con facilidad. A continuación, se puede ver cómo al reducir el umbral el número de características que sobreviven al análisis son menos.

# Uso de la función para eliminar variables colineales con un umbral de 0.6
df_cleaned = eliminar_variables_colineales(df, umbral=0.6)
print("Conjunto de datos sin variables colineales:")
print(df_cleaned.head())
Conjunto de datos sin variables colineales:
X1 X5
0 -0.757616 0.095039
1 1.321557 -0.555579
2 0.692901 0.538835
3 0.215137 1.035566
4 -0.826915 -0.737170

Conclusiones

El análisis de correlación es una herramienta que puede ayudar a detectar el problema de la multicolinealidad en los conjuntos de datos. Un método sencillo que permite la detección de este problema y tomar medidas para eliminar los pares de variables con problemas.

Imagen de Orlando en Pixabay

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

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

En la era del dato, las organizaciones se enfrentan al reto de gestionar volúmenes masivos…

2 días ago

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

En la serie Creación de una API REST con Express y TypeScript construimos una API…

4 días ago

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

Durante la Segunda Guerra Mundial, la Fuerza Aérea de Estados Unidos quería reforzar sus aviones…

1 semana ago

Cómo abrir una ventana de Chrome con tamaño y posición específicos desde la línea de comandos en Windows

En muchas situaciones —ya sea para grabar un tutorial, tomar capturas de pantalla profesionales, probar…

2 semanas ago

La Paradoja del Cumpleaños, o por qué no es tan raro compartir fecha de nacimiento

Imagínate en una sala con un grupo de personas, por ejemplo, en una oficina, un…

2 semanas ago

Programador de tareas de Windows: Guía definitiva para automatizar tu trabajo (BAT, PowerShell y Python)

En el trabajo diario con ordenadores, es común encontrarse con tareas repetitivas: realizar copias de…

3 semanas ago

This website uses cookies.