CLASE 12. Regresión de Poisson con Patsy en Python
Autor/a
Gerson Rivera
Fecha de publicación
30 julio 2024
El paquete statmodels y patsy de Python tiene un soporte excelente para realizar la regresión de Poisson.
Usemos el conjunto de datos de recuentos de ciclistas del puente de Brooklyn. Puede recoger el conjunto de datos desde nyc_bb_bicyclist_counts.csv
Nuestro objetivo es construir un modelo de regresión de Poisson para los conteos de ciclistas observados y usaremos el modelo entrenado para predecir los recuentos diarios de ciclistas en el puente de Brooklyn que el modelo no ha visto durante el entrenamiento.
import pandas as pdfrom patsy import dmatricesimport numpy as npimport statsmodels.api as smimport matplotlib.pyplot as plt
No usaremos la variable Date como regresor ya que contiene un valor de fecha absoluto, pero no necesitamos hacer nada especial para eliminar Date, ya que ya se consume como índice del DataFrame de pandas. Por lo tanto, no estará disponible para nosotros en la matriz X. Crearemos los conjuntos de datos de entrenamiento y prueba.
mask = np.random.rand(len(df)) <0.8df_train = df[mask]df_test = df[~mask]print('Training data set length='+str(len(df_train)))print('Testing data set length='+str(len(df_test)))
Training data set length=177
Testing data set length=37
df_train.head()
HIGH_T
LOW_T
PRECIP
BB_COUNT
MONTH
DAY_OF_WEEK
DAY
Date
2017-04-01
46.0
37.0
0.00
606
4
5
1
2017-04-02
62.1
41.0
0.00
2021
4
6
2
2017-04-03
63.0
50.0
0.03
2470
4
0
3
2017-04-04
51.1
46.0
1.18
723
4
1
4
2017-04-05
63.0
46.0
0.00
2807
4
2
5
Configure la expresión de regresión en notación patsy. Le estamos diciendo a patsy que BB_COUNT es nuestra variable dependiente y depende de las variables de regresión:
DAY, DAY_OF_WEEK, MONTH, HIGH_T, LOW_T y PRECIP
predicted_counts=predictions_summary_frame['mean']actual_counts = y_test['BB_COUNT']fig = plt.figure(figsize=(12,6))fig.suptitle('Predicted versus actual bicyclist counts on the Brooklyn bridge')predicted, = plt.plot(X_test.index, predicted_counts, 'go-', label='Predicted counts')actual, = plt.plot(X_test.index, actual_counts, 'ro-', label='Actual counts')plt.legend(handles=[predicted, actual])plt.show()
plt.clf()fig = plt.figure()fig.suptitle('Scatter plot of Actual versus Predicted counts')plt.scatter(x=predicted_counts, y=actual_counts, marker='.')plt.xlabel('Predicted counts')plt.ylabel('Actual counts')plt.show()
<Figure size 672x480 with 0 Axes>
Los valores informados de desviación y chi-cuadrado de Pearson son muy grandes. Un buen ajuste es virtualmente imposible dados estos valores. Para hacer una determinación cuantitativa de la bondad del ajuste en algún nivel de confianza, digamos 95\%(p = 0.05), buscamos el valor en la tabla \chi^2 para p = 0.05 y grados de libertad de residuos = 163 (Residuos DF = No. Observaciones menos modelo DF). Comparamos este valor de chi-cuadrado con la estadística observada, en este caso, la desviación o el valor de chi-cuadrado de Pearson informado en GLMResults. Encontramos que en p = 0.05 y Residuales DF = 163, el valor de chi-cuadrado de la tabla estándar es 193.791, que es mucho más pequeño que el estadístico informado de 23030 y 23300. Por lo tanto, según esta prueba, el modelo de regresión de Poisson , a pesar de demostrar un ajuste visual “aceptable” para el conjunto de datos de prueba, se ha ajustado bastante mal a los datos de entrenamiento.