Regresión Lineal con SciPy

La regresión lineal trata de explicar la relación entre dos o más variables continuas. En este artículo, veremos cómo construir una recta de regresión lineal, calcular R² y p-value utilizando la librería SciPy.

Bienvenidas/os!!, muchas gracias por visitarnos, si están comenzando en Python y este es el primer artículo al que entran en nuestro sitio, les recomendamos visitar Primeros Pasos.

ℹ️ Les recordamos que todos los ejemplos de códigos en nuestro sitio web van a encontrarlos en nuestro repositorio GitHub. Los códigos de este artículo los encontrarán en Linear-Regression_scipy.ipynb.

En este artículo, comenzaremos realizando un simple repaso sobre el concepto de regresión lineal.

Luego explicaremos los pasos para obtener una recta de regresión lineal con SciPy a partir de un conjunto de datos que nosotros mismos crearemos. Además de la recta, obtendremos parámetros estadísticos, tales como R² y valor-p. Para finalizar, crearemos un gráfico con matplotlib para visualizar los resultados. Todo esto lo haremos utilizando código Python.



REGRESIÓN LINEAL

La regresión lineal simple consiste en generar un modelo de regresión, (ecuación de una recta), que permita explicar la relación lineal que existe entre dos variables, una de ellas independiente, y la restante, dependiente.

A la variable independiente o predictora se la conoce como X, mientras que a la variable dependiente o respuesta se la identifica como Y.

El modelo de regresión lineal simple se describe de acuerdo a la ecuación:

$$ Y = \beta_{0} + \beta_{1} x + \epsilon $$

Siendo β0 la ordenada en el origen, β1 la pendiente y ϵ el error aleatorio. Este último representa la diferencia entre el valor ajustado por la recta y el valor real. Recoge el efecto de todas aquellas variables que influyen en Y pero que no se incluyen en el modelo como predictores. Al error aleatorio también se le conoce como residuo.

Una recta de regresión puede emplearse para diferentes propósitos y dependiendo de ellos, es necesario satisfacer distintas condiciones. En caso de querer medir la relación lineal entre dos variables, la recta de regresión lo va a indicar de forma directa. Sin embargo, en caso de querer predecir el valor de una variable en función de la otra, no sólo se necesita calcular la recta, sino que además hay que asegurar que el modelo sea eficiente. Para ello se utilizan diferentes herramientas de las cuales mencionaremos:

  • R² (Coeficiente de Determinación)
  • valor-p (p-value)

R² (Coeficiente de Determinación)

En los modelos de regresión lineal simple el valor de se corresponde con el cuadrado del coeficiente de correlación de Pearson (r) entre X e Y.

describe la proporción de variabilidad observada en la variable dependiente explicada por el modelo y relativa a la variabilidad total.

Su valor está acotado entre 0 y 1. (Un valor de R²=1 significa un ajuste lineal perfecto, mientras que un valor de R²=0 indica la no representatividad del modelo lineal). En general, se toman valores de R² entre 0.7-1.0 , (- 0.7 and -1.0), como indicador de una fuerte relación lineal.


Valor-p ó p-value

El p-value o valor-p tiene relación con la fiabilidad del estudio, cuyo resultado será más fiable cuanto menor sea el valor-p.

En realidad, el valor-p nos indicaría la probabilidad de obtener un valor semejante si se realiza el experimento en las mismas condiciones, pero hay muchos factores que pueden intervenir además del hecho de que exista o no diferencia real: el tamaño de la muestra, la varianza de la variable medida, el tamaño del efecto, la distribución de probabilidad empleada, etc.

Vamos a dejar la explicación allí ya que no es el objetivo de este artículo ahondar en el concepto del mismo, lo que sí nos gustaría resaltar, es que dicho valor es uno de los outputs del método de SciPy para obtener la recta de regresión lineal.

ℹ️ Si desean ahondar en el concepto del valor-p, les dejamos este link .



REGRESION LINEAL CON SciPy

Luego del breve repaso, vamos a continuar con la segunda parte de este artículo, obtener una recta de regresión lineal, R² y p-value con SciPy.


IMPORTAR LIBRERIAS

Como siempre, lo primero que haremos es importar todas las librerías que utilizaremos en el notebook.

import numpy as np
from scipy import stats

import matplotlib.pyplot as plt
%matplotlib inline

CREACIÓN Y VISUALIZACIÓN DE LOS DATOS

Para conseguir una recta de regresión lineal, vamos a necesitar un conjunto de datos. Con este fin, vamos a crear con Numpy 500 pares de puntos (x,y) que sigan una tendencia. Para ello, construiremos una recta con pendiente y ordenada al origen, pero también agregaremos valores aleatorios a cada par de puntos de dicha recta. (Es exactamente el mismo conjunto de datos que creamos en los artículos Regresión Lineal con NumPy y Regresión Lineal con scikit-learn).

# Creamos el conjunto de datos para trabajar
x_data = np.linspace(0.0,10.0,500)      # Creamos 500 valores de x equidistantes entre 0 y 10.

np.random.seed(652)                     # seed obtiene números al azar, pero siempre elegirá los mismos en el mismo orden.
noise = np.random.randn(len(x_data))    # obtengo 500 números aleatorios ya predeterminados por seed.

y_data =  (0.5 * x_data ) + 5 + noise   # Obtenemos 500 valores de y que seguirán la tendencia de y=0.5x+5

# Graficamos los datos
plt.figure(figsize=(9, 6))
plt.plot(x_data,y_data,'.')
plt.xlabel('x', fontsize=14,fontweight="bold")
plt.ylabel('y', fontsize=14,fontweight="bold")
plt.title('DATOS',fontsize=18,fontweight="bold")
plt.show()

OBTENCIÓN Y VISUALIZACIÓN DE LA RECTA DE REGRESIÓN LINEAL

scipy.stats.linregress(x, y)

linregress() es un método de la librería SciPy que calcula una regresión linear para un conjunto de datos utilizando mínimos cuadrados.

ℹ️ Para más información sobre la clase linregress() visiten https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html .


Calculamos la recta, m, b, R², p-value

linregress() va a calcular m, b, r y p-value, etc., a partir de un conjunto de datos (x,y).

  • m: llamado linregress().slope en SciPy.
  • b: denominado linregress().intercept.
  • R²: si bien no calcula directamente R², calcula r, (coeficiente de correlación de Pearson), denominándolo linregress().rvalue. (Para obtener R², elevamos al cuadrado este valor).
  • p-value: se denomina linregress().pvalue en Scipy.
linreg = stats.linregress(x_data, y_data)
print(f"m = {linreg.slope:.3f}")
print(f"b = {linreg.intercept:.3f}")
print(f'y = {linreg.slope:.3f}x + {linreg.intercept:.3f}')
r2 = linreg.rvalue**2
pvalue = linreg.pvalue

print(f"R\u00b2 = {r2:.3f}")
print(f"p-value = {pvalue:.3e}")

Graficamos los datos originales junto con la recta de regresión lineal

Para finalizar, graficaremos en un mismo plot los datos originales y la recta de regresión lineal obtenida con SciPy.

Además, agregaremos un cuadro de texto o bbox dentro del área del gráfico con los valores de la recta, R² y p-value.

x=x_data

plt.figure(figsize=(9, 6))
plt.plot(x_data,y_data,'.')

plt.plot(x, linreg.slope * x + linreg.intercept,
         'r', linewidth= 2)
#          label=f'y = {float(linreg.coef_):.3f}x + {float(linreg.intercept_):2.3f}')
plt.xlabel('x', fontsize=14,fontweight="bold")
plt.ylabel('y', fontsize=14,fontweight="bold")
plt.title(f'DATOS y RECTA DE REGRESIÓN LINEAL',fontsize=18,fontweight="bold")
plt.text(0, 10.9,f'y = {linreg.slope:.3f}x + {linreg.intercept:2.3f}\nR\u00b2 ={r2:.3f}\np-value = {pvalue:.1e}',
         fontsize=14,
         bbox=dict(boxstyle="round",
                   ec=('#1F618D'),
                   fc=('#EBF5FB'),
                   ))
plt.show()

En resumen, creamos un conjunto de datos relacionados entre sí linealmente. Luego calculamos la recta de regresión lineal que mejor los representa utilizando SciPy. También calculamos las métricas y valor-p. Para finalizar, graficamos los datos originales junto con dicha recta y sus métricas con matplotlib.

Les agradecemos su tiempo y esperamos fervientemente que hayan disfrutado este artículo. Si tienen alguna consulta, desean hacer algún comentario o sugerencia para mejorar el contenido, o simplemente indicarles qué les pareció este artículo, debajo pueden hacerlo.

Esperamos reencontrarlos en algún otro artículo del sitio. Hasta luego!


comments powered by Disqus