Statsmodels Cheat Sheet
Statsmodels reference for OLS and logistic regression, the R-style formula API, and ARIMA time-series modeling with full statistical summaries.
OLS Regression (Array API)
Fit and summarize a linear model.
import statsmodels.api as smX = sm.add_constant(X) # adds an intercept columnmodel = sm.OLS(y, X).fit()print(model.summary()) # coefficients, R-squared, p-values, F-statprint(model.params, model.pvalues, model.rsquared)
Formula API
R-style formulas for regression models.
import statsmodels.formula.api as smfmodel = smf.ols("sales ~ tv + radio + newspaper", data=df).fit()print(model.summary())logit = smf.logit("churn ~ tenure + monthly_charges", data=df).fit()print(logit.params)
Time Series (ARIMA)
Test stationarity and forecast.
from statsmodels.tsa.arima.model import ARIMAfrom statsmodels.tsa.stattools import adfullerresult = adfuller(series) # test for stationarityprint("p-value:", result[1])model = ARIMA(series, order=(1, 1, 1))fitted = model.fit()forecast = fitted.forecast(steps=12)
Key Models & Tools
Commonly used statsmodels components.
- OLS- ordinary least squares linear regression
- Logit / Probit- binary classification GLMs
- GLM- generalized linear models (Poisson, Binomial, etc.)
- ARIMA / SARIMAX- autoregressive time-series models
- anova_lm- analysis of variance table for fitted models
- acf / pacf- autocorrelation and partial autocorrelation functions
Robust & Clustered Standard Errors
Correct inference under heteroskedasticity or within-cluster correlation.
import statsmodels.formula.api as smf# HC3 heteroskedasticity-robust covariancemodel = smf.ols("sales ~ tv + radio", data=df).fit(cov_type="HC3")print(model.bse) # robust standard errors# Cluster-robust SEs (e.g. clustered by store_id)clustered = smf.ols("sales ~ tv + radio", data=df).fit( cov_type="cluster", cov_kwds={"groups": df["store_id"]})print(clustered.summary())# Newey-West HAC for autocorrelated time-series residualshac = smf.ols("y ~ x", data=df).fit(cov_type="HAC", cov_kwds={"maxlags": 4})
GLM With Custom Link Functions
Fit Poisson, Gamma, and negative binomial models beyond OLS/Logit.
import statsmodels.api as smimport statsmodels.formula.api as smf# Poisson regression for count datapoisson = smf.glm("claims ~ age + region", data=df, family=sm.families.Poisson()).fit()# Gamma GLM with log link for skewed positive outcomesgamma = smf.glm("cost ~ severity", data=df, family=sm.families.Gamma(link=sm.families.links.Log())).fit()# Negative binomial for over-dispersed countsfrom statsmodels.discrete.discrete_model import NegativeBinomialnb = NegativeBinomial(df["claims"], sm.add_constant(df[["age"]])).fit()print(poisson.deviance, poisson.pearson_chi2)
Regression Diagnostics
Test assumptions: heteroskedasticity, autocorrelation, multicollinearity, influence.
from statsmodels.stats.diagnostic import het_breuschpagan, acorr_ljungboxfrom statsmodels.stats.outliers_influence import variance_inflation_factorfrom statsmodels.stats.stattools import durbin_watson# Heteroskedasticity: Breusch-Pagan testbp_stat, bp_pval, _, _ = het_breuschpagan(model.resid, model.model.exog)# Autocorrelation in residualsprint(durbin_watson(model.resid))print(acorr_ljungbox(model.resid, lags=[10], return_df=True))# Multicollinearity via VIFX = sm.add_constant(df[["tv", "radio", "newspaper"]])vif = pd.DataFrame({ "feature": X.columns, "VIF": [variance_inflation_factor(X.values, i) for i in range(X.shape[1])],})# Influential pointsinfluence = model.get_influence()cooks_d = influence.cooks_distance[0]
SARIMAX With Seasonality & Exogenous Regressors
Extend ARIMA with seasonal terms and external predictors.
from statsmodels.tsa.statespace.sarimax import SARIMAXfrom statsmodels.tsa.seasonal import seasonal_decompose# Decompose trend/seasonality/residual before modelingdecomp = seasonal_decompose(series, model="additive", period=12)decomp.plot()# Seasonal ARIMA with exogenous regressor (e.g. promotions)model = SARIMAX( series, exog=promo_flag, order=(1, 1, 1), seasonal_order=(1, 1, 1, 12), enforce_stationarity=False, enforce_invertibility=False,)fitted = model.fit(disp=False)forecast = fitted.get_forecast(steps=12, exog=future_promo_flag)print(forecast.predicted_mean, forecast.conf_int())
Advanced Tests & Tools
Statistical diagnostics and model-comparison utilities beyond basic fitting.
- het_breuschpagan / het_white- tests for heteroskedasticity in residuals
- acorr_ljungbox- tests residual autocorrelation at multiple lags
- variance_inflation_factor- quantifies multicollinearity among regressors
- anova_lm(model1, model2)- likelihood-ratio comparison between nested models
- MixedLM- linear mixed-effects models for grouped/hierarchical data
- QuantReg- quantile regression, robust to outliers and skew
- coint / grangercausalitytests- cointegration and Granger causality for time series
- influence.summary_frame()- leverage, Cook's distance, and DFFITS per observation
Use the formula API (statsmodels.formula.api) with R-style formulas like 'y ~ x1 + x2' when you want automatic categorical encoding and an intercept — the array-based API (sm.OLS) requires sm.add_constant() and manual dummy encoding.