Statsmodels: Statistical Modeling and Econometrics
Overview
Statsmodels is Python's premier library for statistical modeling, providing tools for estimation, inference, and diagnostics across a wide range of statistical methods. Apply this skill for rigorous statistical analysis, from simple linear regression to complex time series models and econometric analyses.
When to Use This Skill
This skill should be used when:
- Fitting regression models (OLS, WLS, GLS, quantile regression)
- Performing generalized linear modeling (logistic, Poisson, Gamma, etc.)
- Analyzing discrete outcomes (binary, multinomial, count, ordinal)
- Conducting time series analysis (ARIMA, SARIMAX, VAR, forecasting)
- Running statistical tests and diagnostics
- Testing model assumptions (heteroskedasticity, autocorrelation, normality)
- Detecting outliers and influential observations
- Comparing models (AIC/BIC, likelihood ratio tests)
- Estimating causal effects
- Producing publication-ready statistical tables and inference
Quick Start Guide
Linear Regression (OLS)
import statsmodels.api as sm
import numpy as np
import pandas as pd
# Prepare data - ALWAYS add constant for intercept
X = sm.add_constant(X_data)
# Fit OLS model
model = sm.OLS(y, X)
results = model.fit()
# View comprehensive results
print(results.summary())
# Key results
print(f"R-squared: {results.rsquared:.4f}")
print(f"Coefficients:\\n{results.params}")
print(f"P-values:\\n{results.pvalues}")
# Predictions with confidence intervals
predictions = results.get_prediction(X_new)
pred_summary = predictions.summary_frame()
print(pred_summary) # includes mean, CI, prediction intervals
# Diagnostics
from statsmodels.stats.diagnostic import het_breuschpagan
bp_test = het_breuschpagan(results.resid, X)
print(f"Breusch-Pagan p-value: {bp_test[1]:.4f}")
# Visualize residuals
import matplotlib.pyplot as plt
plt.scatter(results.fittedvalues, results.resid)
plt.axhline(y=0, color='r', linestyle='--')
plt.xlabel('Fitted values')
plt.ylabel('Residuals')
plt.show()
Logistic Regression (Binary Outcomes)
from statsmodels.discrete.discrete_model import Logit
# Add constant
X = sm.add_constant(X_data)
# Fit logit model
model = Logit(y_binary, X)
results = model.fit()
print(results.summary())
# Odds ratios
odds_ratios = np.exp(results.params)
print("Odds ratios:\\n", odds_ratios)
# Predicted probabilities
probs = results.predict(X)
# Binary predictions (0.5 threshold)
predictions = (probs > 0.5).astype(int)
# Model evaluation
from sklearn.metrics import classification_report, roc_auc_score
print(classification_report(y_binary, predictions))
print(f"AUC: {roc_auc_score(y_binary, probs):.4f}")
# Marginal effects
marginal = results.get_margeff()
print(marginal.summary())
Time Series (ARIMA)
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
# Check stationarity
from statsmodels.tsa.stattools import adfuller
adf_result = adfuller(y_series)
print(f"ADF p-value: {adf_result[1]:.4f}")
if adf_result[1] > 0.05:
# Series is non-stationary, difference it
y_diff = y_series.diff().dropna()
# Plot ACF/PACF to identify p, q
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
plot_acf(y_diff, lags=40, ax=ax1)
plot_pacf(y_diff, lags=40, ax=ax2)
plt.show()
# Fit ARIMA(p,d,q)
model = ARIMA(y_series, order=(1, 1, 1))
results = model.fit()
print(results.summary())
# Forecast
forecast = results.forecast(steps=10)
forecast_obj = results.get_forecast(steps=10)
forecast_df = forecast_obj.summary_frame()
print(forecast_df) # includes mean and confidence intervals
# Residual diagnostics
results.plot_diagnostics(figsize=(12, 8))
plt.show()
Generalized Linear Models (GLM)
import statsmodels.api as sm
# Poisson regression for count data
X = sm.add_constant(X_data)
model = sm.GLM(y_counts, X, family=sm.families.Poisson())
results = model.fit()
print(results.summary())
# Rate ratios (for Poisson with log link)
rate_ratios = np.exp(results.params)
print("Rate ratios:\\n", rate_ratios)
# Check overdispersion
overdispersion = results.pearson_chi2 / results.df_resid
print(f"Overdispersion: {overdispersion:.2f}")
if overdispersion > 1.5:
# Use Negative Binomial instead
from statsmodels.discrete.count_model import NegativeBinomial
nb_model = NegativeBinomial(y_counts, X)
nb_results = nb_model.fit()
print(nb_results.summary())
Core Statistical Modeling Capabilities
1. Linear Regression Models
Comprehensive suite of linear models for continuous outcomes with various error structures.
Available models:
- OLS: Standard linear regression with i.i.d. errors
- WLS: Weighted least squares for heteroskedastic errors
- GLS: Generalized least squares for arbitrary covariance structure
- GLSAR: GLS with autoregressive errors for time series
- Quantile Regression: Conditional quantiles (robust to outliers)
- Mixed Effects: Hierarchical/multilevel models with random effects
- Recursive/Rolling: Time-varying parameter estimation
Key features:
- Comprehensive diagnostic tests
- Robust standard errors (HC, HAC, cluster-robust)
- Influence statistics (Cook's distance, leverage, DFFITS)
- Hypothesis testing (F-tests, Wald tests)
- Model comparison (AIC, BIC, likelihood ratio tests)
- Prediction with confidence and prediction intervals
When to use: Continuous outcome variable, want inference on coefficients, need diagnostics
Reference: See references/linear_models.md for detailed guidance on model selection, diagnostics, and best practices.
2. Generalized Linear Models (GLM)
Flexible framework extending linear models to non-normal distributions.
Distribution families:
- Binomial: Binary outcomes or proportions (logistic regression)
- Poisson: Count data
- Negative Binomial: Overdispersed counts
- Gamma: Positive continuous, right-skewed data
- Inverse Gaussian: Positive continuous with specific variance structure
- Gaussian: Equivalent to OLS
- Tweedie: Flexible family for semi-continuous data
Link functions:
- Logit, Probit, Log, Identity, Inverse, Sqrt, CLogLog, Power
- Choose based on interpretation needs and model fit
Key features:
- Maximum likelihood estimation via IRLS
- Deviance and Pearson residuals
- Goodness-of-fit statistics
- Pseudo R-squared measures
- Robust standard errors
When to use: Non-normal outcomes, need flexible variance and link specifications
Reference: See references/glm.md for family selection, link functions, interpretation, and diagnostics.
3. Discrete Choice Models
Models for categorical and count outcomes.
Binary models:
- Logit: Logistic regression (odds ratios)
- Probit: Probit regression (normal distribution)
Multinomial models:
- MNLogit: Unordered categories (3+ levels)
- Conditional Logit: Choice models with alternative-specific variables
- Ordered Model: Ordinal outcomes (ordered categories)
Count models:
- Poisson: Standard count model
- Negative Binomial: Overdispersed counts
- Zero-Inflated: Excess zeros (ZIP, ZINB)
- Hurdle Models: Two-stage models for zero-heavy data
Key features:
- Maximum likelihood estimation
- Marginal effects at means or average marginal effects
- Model comparison via AIC/BIC
- Predicted probabilities and classification
- Goodness-of-fit tests
When to use: Binary, categorical, or count outcomes
Reference: See references/discrete_choice.md for model selection, interpretation, and evaluation.
4. Time Series Analysis
Comprehensive time series modeling and forecasting capabilities.
Univariate models:
- AutoReg (AR): Autoregressive models
- ARIMA: Autoregressive integrated moving average
- SARIMAX: Seasonal ARIMA with exogenous variables
- Exponential Smoothing: Simple, Holt, Holt-Winters
- ETS: Innovations state space models
Multivariate models:
- VAR: Vector autoregression
- VARMAX: VAR with MA and exogenous variables
- Dynamic Factor Models: Extract common factors
- VECM: Vector error correction models (cointegration)
Advanced models:
- State Space: Kalman filtering, custom specifications
- Regime Switching: Markov switching models
- ARDL: Autoregressive distributed lag
Key features:
- ACF/PACF analysis for model identification
- Stationarity tests (ADF, KPSS)
- Forecasting with prediction intervals
- Residual diagnostics (Ljung-Box, heteroskedasticity)
- Granger causality testing
- Impulse response functions (IRF)
- Forecast error variance decomposition (FEVD)
When to use: Time-ordered data, forecasting, understanding temporal dynamics
Reference: See references/time_series.md for model selection, diagnostics, and forecasting methods.
5. Statistical Tests and Diagnostics
Extensive testing and diagnostic capabilities for model validation.
Residual diagnostics:
- Autocorrelation tests (Ljung-Box, Durbin-Watson, Breusch-Godfrey)
- Heteroskedasticity tests (Breusch-Pagan, White, ARCH)
- Normality tests (Jarque-Bera, Omnibus, Anderson-Darling, Lilliefors)
- Specification tests (RESET, Harvey-Collier)
Influence and outliers:
- Leverage (hat values)
- Cook's distance
- DFFITS and DFBETAs
- Studentized residuals
- Influence plots
Hypothesis testing:
- t-tests (one-sample, two-sample, paired)
- Proportion tests
- Chi-square tests
- Non-parametric tests (Mann-Whitney, Wilcoxon, Kruskal-Wallis)
- ANOVA (one-way, two-way, repeated measures)
Multiple comparisons:
- Tukey's HSD
- Bonferroni correction
- False Discovery Rate (FDR)
Effect sizes and power:
- Cohen's d, eta-squared
- Power analysis for t-tests, proportions
- Sample size calculations
Robust inference:
- Heteroskedasticity-consistent SEs (HC0-HC3)
- HAC standard errors (Newey-West)
- Cluster-robust standard errors
When to use: Validating assumptions, detecting problems, ensuring robust inference
Reference: See references/stats_diagnostics.md for comprehensive testing and diagnostic procedures.
Formula API (R-style)
Statsmodels supports R-style formulas for intuitive model specification:
import statsmodels.formula.api as smf
# OLS with formula
results = smf.ols('y ~ x1 + x2 + x1:x2', data=df).fit()
# Categorical variables (automatic dummy coding)
results = smf.ols('y ~ x1 + C(category)', data=df).fit()
# Interactions
results = smf.ols('y ~ x1 * x2', data=df).fit() # x1 + x2 + x1:x2
# Polynomial terms
results = smf.ols('y ~ x + I(x**2)', data=df).fit()
# Logit
results = smf.logit('y ~ x1 + x2 + C(group)', data=df).fit()
# Poisson
results = smf.poisson('count ~ x1 + x2', data=df).fit()
# ARIMA (not available via formula, use regular API)
Model Selection and Comparison
Information Criteria
# Compare models using AIC/BIC
models = {
'Model 1': model1_results,
'Model 2': model2_results,
'Model 3': model3_results
}
comparison = pd.DataFrame({
'AIC': {name: res.aic for name, res in models.items()},
'BIC': {name: res.bic for name, res in models.items()},
'Log-Likelihood': {name: res.llf for name, res in models.items()}
})
print(comparison.sort_values('AIC'))
# Lower AIC/BIC indicates better model
Likelihood Ratio Test (Nested Models)
# For nested models (one is subset of the other)
from scipy import stats
lr_stat = 2 * (full_model.llf - reduced_model.llf)
df = full_model.df_model - reduced_model.df_model
p_value = 1 - stats.chi2.cdf(lr_stat, df)
print(f"LR statistic: {lr_stat:.4f}")
print(f"p-value: {p_value:.4f}")
if p_value < 0.05:
print("Full model significantly better")
else:
print("Reduced model preferred (parsimony)")
Cross-Validation
from sklearn.model_selection import KFold
from sklearn.metrics import mean_squared_error
kf = KFold(n_splits=5, shuffle=True, random_state=42)
cv_scores = []
for train_idx, val_idx in kf.split(X):
X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
# Fit model
model = sm.OLS(y_train, X_train).fit()
# Predict
y_pred = model.predict(X_val)
# Score
rmse = np.sqrt(mean_squared_error(y_val, y_pred))
cv_scores.append(rmse)
print(f"CV RMSE: {np.mean(cv_scores):.4f} ± {np.std(cv_scores):.4f}")
Best Practices
Data Preparation
- Always add constant: Use
sm.add_constant() unless excluding intercept
- Check for missing values: Handle or impute before fitting
- Scale if needed: Improves convergence, interpretation (but not required for tree models)
- Encode categoricals: Use formula API or manual dummy coding
Model Building
- Start simple: Begin with basic model, add complexity as needed
- Check assumptions: Test residuals, heteroskedasticity, autocorrelation
- Use appropriate model: Match model to outcome type (binary→Logit, count→Poisson)
- Consider alternatives: If assumptions violated, use robust methods or different model
Inference
- Report effect sizes: Not just p-values
- Use robust SEs: When heteroskedasticity or clustering present
- Multiple comparisons: Correct when testing many hypotheses
- Confidence intervals: Always report alongside point estimates
Model Evaluation
- Check residuals: Plot residuals vs fitted, Q-Q plot
- Influence diagnostics: Identify and investigate influential observations
- Out-of-sample validation: Test on holdout set or cross-validate
- Compare models: Use AIC/BIC for non-nested, LR test for nested
Reporting
- Comprehensive summary: Use
.summary() for detailed output
- Document decisions: Note transformations, excluded observations
- Interpret carefully: Account for link functions (e.g., exp(β) for log link)
- Visualize: Plot predictions, confidence intervals, diagnostics
Common Workflows
Workflow 1: Linear Regression Analysis
- Explore data (plots, descriptives)
- Fit initial OLS model
- Check residual diagnostics
- Test for heteroskedasticity, autocorrelation
- Check for multicollinearity (VIF)
- Identify influential observations
- Refit with robust SEs if needed
- Interpret coefficients and inference
- Validate on holdout or via CV
Workflow 2: Binary Classification
- Fit logistic regression (Logit)
- Check for convergence issues
- Interpret odds ratios
- Calculate marginal effects
- Evaluate classification performance (AUC, confusion matrix)
- Check for influential observations
- Compare with alternative models (Probit)
- Validate predictions on test set
Workflow 3: Count Data Analysis
- Fit Poisson regression
- Check for overdispersion
- If overdispersed, fit Negative Binomial
- Check for excess zeros (consider ZIP/ZINB)
- Interpret rate ratios
- Assess goodness of fit
- Compare models via AIC
- Validate predictions
Workflow 4: Time Series Forecasting
- Plot series, check for trend/seasonality
- Test for stationarity (ADF, KPSS)
- Difference if non-stationary
- Identify p, q from ACF/PACF
- Fit ARIMA or SARIMAX
- Check residual diagnostics (Ljung-Box)
- Generate forecasts with confidence intervals
- Evaluate forecast accuracy on test set
Reference Documentation
This skill includes comprehensive reference files for detailed guidance:
references/linear_models.md
Detailed coverage of linear regression models including:
- OLS, WLS, GLS, GLSAR, Quantile Regression
- Mixed effects models
- Recursive and rolling regression
- Comprehensive diagnostics (heteroskedasticity, autocorrelation, multicollinearity)
- Influence statistics and outlier detection
- Robust standard errors (HC, HAC, cluster)
- Hypothesis testing and model comparison
references/glm.md
Complete guide to generalized linear models:
- All distribution families (Binomial, Poisson, Gamma, etc.)
- Link functions and when to use each
- Model fitting and interpretation
- Pseudo R-squared and goodness of fit
- Diagnostics and residual analysis
- Applications (logistic, Poisson, Gamma regression)
references/discrete_choice.md
Comprehensive guide to discrete outcome models:
- Binary models (Logit, Probit)
- Multinomial models (MNLogit, Conditional Logit)
- Count models (Poisson, Negative Binomial, Zero-Inflated, Hurdle)
- Ordinal models
- Marginal effects and interpretation
- Model diagnostics and comparison
references/time_series.md
In-depth time series analysis guidance:
- Univariate models (AR, ARIMA, SARIMAX, Exponential Smoothing)
- Multivariate models (VAR, VARMAX, Dynamic Factor)
- State space models
- Stationarity testing and diagnostics
- Forecasting methods and evaluation
- Granger causality, IRF, FEVD
references/stats_diagnostics.md
Comprehensive statistical testing and diagnostics:
- Residual diagnostics (autocorrelation, heteroskedasticity, normality)
- Influence and outlier detection
- Hypothesis tests (parametric and non-parametric)
- ANOVA and post-hoc tests
- Multiple comparisons correction
- Robust covariance matrices
- Power analysis and effect sizes
When to reference:
- Need detailed parameter explanations
- Choosing between similar models
- Troubleshooting convergence or diagnostic issues
- Understanding specific test statistics
- Looking for code examples for advanced features
Search patterns:
# Find information about specific models
grep -r "Quantile Regression" references/
# Find diagnostic tests
grep -r "Breusch-Pagan" references/stats_diagnostics.md
# Find time series guidance
grep -r "SARIMAX" references/time_series.md
Common Pitfalls to Avoid
- Forgetting constant term: Always use
sm.add_constant() unless no intercept desired
- Ignoring assumptions: Check residuals, heteroskedasticity, autocorrelation
- Wrong model for outcome type: Binary→Logit/Probit, Count→Poisson/NB, not OLS
- Not checking convergence: Look for optimization warnings
- Misinterpreting coefficients: Remember link functions (log, logit, etc.)
- Using Poisson with overdispersion: Check dispersion, use Negative Binomial if needed
- Not using robust SEs: When heteroskedasticity or clustering present
- Overfitting: Too many parameters relative to sample size
- Data leakage: Fitting on test data or using future information
- Not validating predictions: Always check out-of-sample performance
- Comparing non-nested models: Use AIC/BIC, not LR test
- Ignoring influential observations: Check Cook's distance and leverage
- Multiple testing: Correct p-values when testing many hypotheses
- Not differencing time series: Fit ARIMA on non-stationary data
- Confusing prediction vs confidence intervals: Prediction intervals are wider
Getting Help
For detailed documentation and examples:
🔄 Workflow
Kaynak: Modern Data Stack & Polars Documentation
Aşama 1: Local Data Processing (Modern OLAP)
Aşama 2: Analysis & Visualization
Aşama 3: Production Pipeline
Kontrol Noktaları
| Aşama |
Doğrulama |
| 1 |
Veri işleme hafızaya (RAM) sığıyor mu? (Sığmıyorsa Polars Streaming veya DuckDB kullan). |
| 2 |
Tekrarlanan analizler modüler fonksiyonlara dönüştürüldü mü? |
| 3 |
Veri gizliliği (PII) kontrol edildi mi? |
1---2name: python-data-stack3description: Statistical modeling toolkit. OLS, GLM, logistic, ARIMA, time series, hypothesis tests, diagnostics, AIC/BIC, for rigorous statistical inference and econometric analysis.4---5
6# Statsmodels: Statistical Modeling and Econometrics
7
8## Overview
9
10Statsmodels is Python's premier library for statistical modeling, providing tools for estimation, inference, and diagnostics across a wide range of statistical methods. Apply this skill for rigorous statistical analysis, from simple linear regression to complex time series models and econometric analyses.
11
12## When to Use This Skill
13
14This skill should be used when:
15- Fitting regression models (OLS, WLS, GLS, quantile regression)
16- Performing generalized linear modeling (logistic, Poisson, Gamma, etc.)
17- Analyzing discrete outcomes (binary, multinomial, count, ordinal)
18- Conducting time series analysis (ARIMA, SARIMAX, VAR, forecasting)
19- Running statistical tests and diagnostics
20- Testing model assumptions (heteroskedasticity, autocorrelation, normality)
21- Detecting outliers and influential observations
22- Comparing models (AIC/BIC, likelihood ratio tests)
23- Estimating causal effects
24- Producing publication-ready statistical tables and inference
25
26## Quick Start Guide
27
28### Linear Regression (OLS)
29
30```python
31import statsmodels.api as sm
32import numpy as np
33import pandas as pd
34
35# Prepare data - ALWAYS add constant for intercept
36X = sm.add_constant(X_data)
37
38# Fit OLS model
39model = sm.OLS(y, X)
40results = model.fit()
41
42# View comprehensive results
43print(results.summary())
44
45# Key results
46print(f"R-squared: {results.rsquared:.4f}")
47print(f"Coefficients:\\n{results.params}")
48print(f"P-values:\\n{results.pvalues}")
49
50# Predictions with confidence intervals
51predictions = results.get_prediction(X_new)
52pred_summary = predictions.summary_frame()
53print(pred_summary) # includes mean, CI, prediction intervals
54
55# Diagnostics
56from statsmodels.stats.diagnostic import het_breuschpagan
57bp_test = het_breuschpagan(results.resid, X)
58print(f"Breusch-Pagan p-value: {bp_test[1]:.4f}")
59
60# Visualize residuals
61import matplotlib.pyplot as plt
62plt.scatter(results.fittedvalues, results.resid)
63plt.axhline(y=0, color='r', linestyle='--')
64plt.xlabel('Fitted values')
65plt.ylabel('Residuals')
66plt.show()
67```
68
69### Logistic Regression (Binary Outcomes)
70
71```python
72from statsmodels.discrete.discrete_model import Logit
73
74# Add constant
75X = sm.add_constant(X_data)
76
77# Fit logit model
78model = Logit(y_binary, X)
79results = model.fit()
80
81print(results.summary())
82
83# Odds ratios
84odds_ratios = np.exp(results.params)
85print("Odds ratios:\\n", odds_ratios)
86
87# Predicted probabilities
88probs = results.predict(X)
89
90# Binary predictions (0.5 threshold)
91predictions = (probs > 0.5).astype(int)
92
93# Model evaluation
94from sklearn.metrics import classification_report, roc_auc_score
95
96print(classification_report(y_binary, predictions))
97print(f"AUC: {roc_auc_score(y_binary, probs):.4f}")
98
99# Marginal effects
100marginal = results.get_margeff()
101print(marginal.summary())
102```
103
104### Time Series (ARIMA)
105
106```python
107from statsmodels.tsa.arima.model import ARIMA
108from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
109
110# Check stationarity
111from statsmodels.tsa.stattools import adfuller
112
113adf_result = adfuller(y_series)
114print(f"ADF p-value: {adf_result[1]:.4f}")
115
116if adf_result[1] > 0.05:
117 # Series is non-stationary, difference it
118 y_diff = y_series.diff().dropna()
119
120# Plot ACF/PACF to identify p, q
121fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
122plot_acf(y_diff, lags=40, ax=ax1)
123plot_pacf(y_diff, lags=40, ax=ax2)
124plt.show()
125
126# Fit ARIMA(p,d,q)
127model = ARIMA(y_series, order=(1, 1, 1))
128results = model.fit()
129
130print(results.summary())
131
132# Forecast
133forecast = results.forecast(steps=10)
134forecast_obj = results.get_forecast(steps=10)
135forecast_df = forecast_obj.summary_frame()
136
137print(forecast_df) # includes mean and confidence intervals
138
139# Residual diagnostics
140results.plot_diagnostics(figsize=(12, 8))
141plt.show()
142```
143
144### Generalized Linear Models (GLM)
145
146```python
147import statsmodels.api as sm
148
149# Poisson regression for count data
150X = sm.add_constant(X_data)
151model = sm.GLM(y_counts, X, family=sm.families.Poisson())
152results = model.fit()
153
154print(results.summary())
155
156# Rate ratios (for Poisson with log link)
157rate_ratios = np.exp(results.params)
158print("Rate ratios:\\n", rate_ratios)
159
160# Check overdispersion
161overdispersion = results.pearson_chi2 / results.df_resid
162print(f"Overdispersion: {overdispersion:.2f}")
163
164if overdispersion > 1.5:
165 # Use Negative Binomial instead
166 from statsmodels.discrete.count_model import NegativeBinomial
167 nb_model = NegativeBinomial(y_counts, X)
168 nb_results = nb_model.fit()
169 print(nb_results.summary())
170```
171
172## Core Statistical Modeling Capabilities
173
174### 1. Linear Regression Models
175
176Comprehensive suite of linear models for continuous outcomes with various error structures.
177
178**Available models:**
179- **OLS**: Standard linear regression with i.i.d. errors
180- **WLS**: Weighted least squares for heteroskedastic errors
181- **GLS**: Generalized least squares for arbitrary covariance structure
182- **GLSAR**: GLS with autoregressive errors for time series
183- **Quantile Regression**: Conditional quantiles (robust to outliers)
184- **Mixed Effects**: Hierarchical/multilevel models with random effects
185- **Recursive/Rolling**: Time-varying parameter estimation
186
187**Key features:**
188- Comprehensive diagnostic tests
189- Robust standard errors (HC, HAC, cluster-robust)
190- Influence statistics (Cook's distance, leverage, DFFITS)
191- Hypothesis testing (F-tests, Wald tests)
192- Model comparison (AIC, BIC, likelihood ratio tests)
193- Prediction with confidence and prediction intervals
194
195**When to use:** Continuous outcome variable, want inference on coefficients, need diagnostics
196
197**Reference:** See `references/linear_models.md` for detailed guidance on model selection, diagnostics, and best practices.
198
199### 2. Generalized Linear Models (GLM)
200
201Flexible framework extending linear models to non-normal distributions.
202
203**Distribution families:**
204- **Binomial**: Binary outcomes or proportions (logistic regression)
205- **Poisson**: Count data
206- **Negative Binomial**: Overdispersed counts
207- **Gamma**: Positive continuous, right-skewed data
208- **Inverse Gaussian**: Positive continuous with specific variance structure
209- **Gaussian**: Equivalent to OLS
210- **Tweedie**: Flexible family for semi-continuous data
211
212**Link functions:**
213- Logit, Probit, Log, Identity, Inverse, Sqrt, CLogLog, Power
214- Choose based on interpretation needs and model fit
215
216**Key features:**
217- Maximum likelihood estimation via IRLS
218- Deviance and Pearson residuals
219- Goodness-of-fit statistics
220- Pseudo R-squared measures
221- Robust standard errors
222
223**When to use:** Non-normal outcomes, need flexible variance and link specifications
224
225**Reference:** See `references/glm.md` for family selection, link functions, interpretation, and diagnostics.
226
227### 3. Discrete Choice Models
228
229Models for categorical and count outcomes.
230
231**Binary models:**
232- **Logit**: Logistic regression (odds ratios)
233- **Probit**: Probit regression (normal distribution)
234
235**Multinomial models:**
236- **MNLogit**: Unordered categories (3+ levels)
237- **Conditional Logit**: Choice models with alternative-specific variables
238- **Ordered Model**: Ordinal outcomes (ordered categories)
239
240**Count models:**
241- **Poisson**: Standard count model
242- **Negative Binomial**: Overdispersed counts
243- **Zero-Inflated**: Excess zeros (ZIP, ZINB)
244- **Hurdle Models**: Two-stage models for zero-heavy data
245
246**Key features:**
247- Maximum likelihood estimation
248- Marginal effects at means or average marginal effects
249- Model comparison via AIC/BIC
250- Predicted probabilities and classification
251- Goodness-of-fit tests
252
253**When to use:** Binary, categorical, or count outcomes
254
255**Reference:** See `references/discrete_choice.md` for model selection, interpretation, and evaluation.
256
257### 4. Time Series Analysis
258
259Comprehensive time series modeling and forecasting capabilities.
260
261**Univariate models:**
262- **AutoReg (AR)**: Autoregressive models
263- **ARIMA**: Autoregressive integrated moving average
264- **SARIMAX**: Seasonal ARIMA with exogenous variables
265- **Exponential Smoothing**: Simple, Holt, Holt-Winters
266- **ETS**: Innovations state space models
267
268**Multivariate models:**
269- **VAR**: Vector autoregression
270- **VARMAX**: VAR with MA and exogenous variables
271- **Dynamic Factor Models**: Extract common factors
272- **VECM**: Vector error correction models (cointegration)
273
274**Advanced models:**
275- **State Space**: Kalman filtering, custom specifications
276- **Regime Switching**: Markov switching models
277- **ARDL**: Autoregressive distributed lag
278
279**Key features:**
280- ACF/PACF analysis for model identification
281- Stationarity tests (ADF, KPSS)
282- Forecasting with prediction intervals
283- Residual diagnostics (Ljung-Box, heteroskedasticity)
284- Granger causality testing
285- Impulse response functions (IRF)
286- Forecast error variance decomposition (FEVD)
287
288**When to use:** Time-ordered data, forecasting, understanding temporal dynamics
289
290**Reference:** See `references/time_series.md` for model selection, diagnostics, and forecasting methods.
291
292### 5. Statistical Tests and Diagnostics
293
294Extensive testing and diagnostic capabilities for model validation.
295
296**Residual diagnostics:**
297- Autocorrelation tests (Ljung-Box, Durbin-Watson, Breusch-Godfrey)
298- Heteroskedasticity tests (Breusch-Pagan, White, ARCH)
299- Normality tests (Jarque-Bera, Omnibus, Anderson-Darling, Lilliefors)
300- Specification tests (RESET, Harvey-Collier)
301
302**Influence and outliers:**
303- Leverage (hat values)
304- Cook's distance
305- DFFITS and DFBETAs
306- Studentized residuals
307- Influence plots
308
309**Hypothesis testing:**
310- t-tests (one-sample, two-sample, paired)
311- Proportion tests
312- Chi-square tests
313- Non-parametric tests (Mann-Whitney, Wilcoxon, Kruskal-Wallis)
314- ANOVA (one-way, two-way, repeated measures)
315
316**Multiple comparisons:**
317- Tukey's HSD
318- Bonferroni correction
319- False Discovery Rate (FDR)
320
321**Effect sizes and power:**
322- Cohen's d, eta-squared
323- Power analysis for t-tests, proportions
324- Sample size calculations
325
326**Robust inference:**
327- Heteroskedasticity-consistent SEs (HC0-HC3)
328- HAC standard errors (Newey-West)
329- Cluster-robust standard errors
330
331**When to use:** Validating assumptions, detecting problems, ensuring robust inference
332
333**Reference:** See `references/stats_diagnostics.md` for comprehensive testing and diagnostic procedures.
334
335## Formula API (R-style)
336
337Statsmodels supports R-style formulas for intuitive model specification:
338
339```python
340import statsmodels.formula.api as smf
341
342# OLS with formula
343results = smf.ols('y ~ x1 + x2 + x1:x2', data=df).fit()
344
345# Categorical variables (automatic dummy coding)
346results = smf.ols('y ~ x1 + C(category)', data=df).fit()
347
348# Interactions
349results = smf.ols('y ~ x1 * x2', data=df).fit() # x1 + x2 + x1:x2
350
351# Polynomial terms
352results = smf.ols('y ~ x + I(x**2)', data=df).fit()
353
354# Logit
355results = smf.logit('y ~ x1 + x2 + C(group)', data=df).fit()
356
357# Poisson
358results = smf.poisson('count ~ x1 + x2', data=df).fit()
359
360# ARIMA (not available via formula, use regular API)
361```
362
363## Model Selection and Comparison
364
365### Information Criteria
366
367```python
368# Compare models using AIC/BIC
369models = {
370 'Model 1': model1_results,
371 'Model 2': model2_results,
372 'Model 3': model3_results
373}
374
375comparison = pd.DataFrame({
376 'AIC': {name: res.aic for name, res in models.items()},
377 'BIC': {name: res.bic for name, res in models.items()},
378 'Log-Likelihood': {name: res.llf for name, res in models.items()}
379})
380
381print(comparison.sort_values('AIC'))
382# Lower AIC/BIC indicates better model
383```
384
385### Likelihood Ratio Test (Nested Models)
386
387```python
388# For nested models (one is subset of the other)
389from scipy import stats
390
391lr_stat = 2 * (full_model.llf - reduced_model.llf)
392df = full_model.df_model - reduced_model.df_model
393p_value = 1 - stats.chi2.cdf(lr_stat, df)
394
395print(f"LR statistic: {lr_stat:.4f}")
396print(f"p-value: {p_value:.4f}")
397
398if p_value < 0.05:
399 print("Full model significantly better")
400else:
401 print("Reduced model preferred (parsimony)")
402```
403
404### Cross-Validation
405
406```python
407from sklearn.model_selection import KFold
408from sklearn.metrics import mean_squared_error
409
410kf = KFold(n_splits=5, shuffle=True, random_state=42)
411cv_scores = []
412
413for train_idx, val_idx in kf.split(X):
414 X_train, X_val = X.iloc[train_idx], X.iloc[val_idx]
415 y_train, y_val = y.iloc[train_idx], y.iloc[val_idx]
416
417 # Fit model
418 model = sm.OLS(y_train, X_train).fit()
419
420 # Predict
421 y_pred = model.predict(X_val)
422
423 # Score
424 rmse = np.sqrt(mean_squared_error(y_val, y_pred))
425 cv_scores.append(rmse)
426
427print(f"CV RMSE: {np.mean(cv_scores):.4f} ± {np.std(cv_scores):.4f}")
428```
429
430## Best Practices
431
432### Data Preparation
433
4341. **Always add constant**: Use `sm.add_constant()` unless excluding intercept
4352. **Check for missing values**: Handle or impute before fitting
4363. **Scale if needed**: Improves convergence, interpretation (but not required for tree models)
4374. **Encode categoricals**: Use formula API or manual dummy coding
438
439### Model Building
440
4411. **Start simple**: Begin with basic model, add complexity as needed
4422. **Check assumptions**: Test residuals, heteroskedasticity, autocorrelation
4433. **Use appropriate model**: Match model to outcome type (binary→Logit, count→Poisson)
4444. **Consider alternatives**: If assumptions violated, use robust methods or different model
445
446### Inference
447
4481. **Report effect sizes**: Not just p-values
4492. **Use robust SEs**: When heteroskedasticity or clustering present
4503. **Multiple comparisons**: Correct when testing many hypotheses
4514. **Confidence intervals**: Always report alongside point estimates
452
453### Model Evaluation
454
4551. **Check residuals**: Plot residuals vs fitted, Q-Q plot
4562. **Influence diagnostics**: Identify and investigate influential observations
4573. **Out-of-sample validation**: Test on holdout set or cross-validate
4584. **Compare models**: Use AIC/BIC for non-nested, LR test for nested
459
460### Reporting
461
4621. **Comprehensive summary**: Use `.summary()` for detailed output
4632. **Document decisions**: Note transformations, excluded observations
4643. **Interpret carefully**: Account for link functions (e.g., exp(β) for log link)
4654. **Visualize**: Plot predictions, confidence intervals, diagnostics
466
467## Common Workflows
468
469### Workflow 1: Linear Regression Analysis
470
4711. Explore data (plots, descriptives)
4722. Fit initial OLS model
4733. Check residual diagnostics
4744. Test for heteroskedasticity, autocorrelation
4755. Check for multicollinearity (VIF)
4766. Identify influential observations
4777. Refit with robust SEs if needed
4788. Interpret coefficients and inference
4799. Validate on holdout or via CV
480
481### Workflow 2: Binary Classification
482
4831. Fit logistic regression (Logit)
4842. Check for convergence issues
4853. Interpret odds ratios
4864. Calculate marginal effects
4875. Evaluate classification performance (AUC, confusion matrix)
4886. Check for influential observations
4897. Compare with alternative models (Probit)
4908. Validate predictions on test set
491
492### Workflow 3: Count Data Analysis
493
4941. Fit Poisson regression
4952. Check for overdispersion
4963. If overdispersed, fit Negative Binomial
4974. Check for excess zeros (consider ZIP/ZINB)
4985. Interpret rate ratios
4996. Assess goodness of fit
5007. Compare models via AIC
5018. Validate predictions
502
503### Workflow 4: Time Series Forecasting
504
5051. Plot series, check for trend/seasonality
5062. Test for stationarity (ADF, KPSS)
5073. Difference if non-stationary
5084. Identify p, q from ACF/PACF
5095. Fit ARIMA or SARIMAX
5106. Check residual diagnostics (Ljung-Box)
5117. Generate forecasts with confidence intervals
5128. Evaluate forecast accuracy on test set
513
514## Reference Documentation
515
516This skill includes comprehensive reference files for detailed guidance:
517
518### references/linear_models.md
519Detailed coverage of linear regression models including:
520- OLS, WLS, GLS, GLSAR, Quantile Regression
521- Mixed effects models
522- Recursive and rolling regression
523- Comprehensive diagnostics (heteroskedasticity, autocorrelation, multicollinearity)
524- Influence statistics and outlier detection
525- Robust standard errors (HC, HAC, cluster)
526- Hypothesis testing and model comparison
527
528### references/glm.md
529Complete guide to generalized linear models:
530- All distribution families (Binomial, Poisson, Gamma, etc.)
531- Link functions and when to use each
532- Model fitting and interpretation
533- Pseudo R-squared and goodness of fit
534- Diagnostics and residual analysis
535- Applications (logistic, Poisson, Gamma regression)
536
537### references/discrete_choice.md
538Comprehensive guide to discrete outcome models:
539- Binary models (Logit, Probit)
540- Multinomial models (MNLogit, Conditional Logit)
541- Count models (Poisson, Negative Binomial, Zero-Inflated, Hurdle)
542- Ordinal models
543- Marginal effects and interpretation
544- Model diagnostics and comparison
545
546### references/time_series.md
547In-depth time series analysis guidance:
548- Univariate models (AR, ARIMA, SARIMAX, Exponential Smoothing)
549- Multivariate models (VAR, VARMAX, Dynamic Factor)
550- State space models
551- Stationarity testing and diagnostics
552- Forecasting methods and evaluation
553- Granger causality, IRF, FEVD
554
555### references/stats_diagnostics.md
556Comprehensive statistical testing and diagnostics:
557- Residual diagnostics (autocorrelation, heteroskedasticity, normality)
558- Influence and outlier detection
559- Hypothesis tests (parametric and non-parametric)
560- ANOVA and post-hoc tests
561- Multiple comparisons correction
562- Robust covariance matrices
563- Power analysis and effect sizes
564
565**When to reference:**
566- Need detailed parameter explanations
567- Choosing between similar models
568- Troubleshooting convergence or diagnostic issues
569- Understanding specific test statistics
570- Looking for code examples for advanced features
571
572**Search patterns:**
573```bash
574# Find information about specific models
575grep -r "Quantile Regression" references/
576
577# Find diagnostic tests
578grep -r "Breusch-Pagan" references/stats_diagnostics.md
579
580# Find time series guidance
581grep -r "SARIMAX" references/time_series.md
582```
583
584## Common Pitfalls to Avoid
585
5861. **Forgetting constant term**: Always use `sm.add_constant()` unless no intercept desired
5872. **Ignoring assumptions**: Check residuals, heteroskedasticity, autocorrelation
5883. **Wrong model for outcome type**: Binary→Logit/Probit, Count→Poisson/NB, not OLS
5894. **Not checking convergence**: Look for optimization warnings
5905. **Misinterpreting coefficients**: Remember link functions (log, logit, etc.)
5916. **Using Poisson with overdispersion**: Check dispersion, use Negative Binomial if needed
5927. **Not using robust SEs**: When heteroskedasticity or clustering present
5938. **Overfitting**: Too many parameters relative to sample size
5949. **Data leakage**: Fitting on test data or using future information
59510. **Not validating predictions**: Always check out-of-sample performance
59611. **Comparing non-nested models**: Use AIC/BIC, not LR test
59712. **Ignoring influential observations**: Check Cook's distance and leverage
59813. **Multiple testing**: Correct p-values when testing many hypotheses
59914. **Not differencing time series**: Fit ARIMA on non-stationary data
60015. **Confusing prediction vs confidence intervals**: Prediction intervals are wider
601
602## Getting Help
603
604For detailed documentation and examples:
605- Official docs: https://www.statsmodels.org/stable/
606- User guide: https://www.statsmodels.org/stable/user-guide.html
607- Examples: https://www.statsmodels.org/stable/examples/index.html
608*Python Data Stack v1.1 - Enhanced*
609
610## 🔄 Workflow
611
612> **Kaynak:** [Modern Data Stack](https://moderndatastack.xyz/) & [Polars Documentation](https://pola.rs/)
613
614### Aşama 1: Local Data Processing (Modern OLAP)
615- [ ] **Polars**: Pandas yerine, büyük veriler (GB+) için Rust tabanlı `Polars` kullan (Lazy Evaluation ve Parallelism için).
616- [ ] **DuckDB**: Lokal SQL analitikleri ve Parquet dosyalarını sorgulamak için `DuckDB` kullan (In-process OLAP).
617- [ ] **Format**: Verileri CSV yerine `Parquet` veya `Arrow` formatında sakla (Hız ve sıkıştırma).
618
619### Aşama 2: Analysis & Visualization
620- [ ] **Notebooks**: Jupyter Notebook (veya VS Code Notebooks) ile interaktif analiz yap, ancak üretim kodu `.py` dosyalarında olsun.
621- [ ] **Viz**: Matplotlib yerine deklaratif görselleştirme için `Altair` veya `Plotnine` (Grammar of Graphics) kullan.
622- [ ] **Profiling**: Veri kalitesini anlamak için `ydata-profiling` raporları oluştur.
623
624### Aşama 3: Production Pipeline
625- [ ] **Orchestration**: ETL işleri için `Prefect` veya `Dagster` kullan (Airflow yerine daha modern ve lightweight).
626- [ ] **Validation**: Veri şemalarını ve kalitesini doğrulamak için `Pydantic` veya `Great Expectations` kullan.
627- [ ] **Environment**: Bağımlılıkları izole etmek için `uv` veya `conda` environment kullan.
628
629### Kontrol Noktaları
630| Aşama | Doğrulama |
631|-------|-----------|
632| 1 | Veri işleme hafızaya (RAM) sığıyor mu? (Sığmıyorsa Polars Streaming veya DuckDB kullan). |
633| 2 | Tekrarlanan analizler modüler fonksiyonlara dönüştürüldü mü? |
634| 3 | Veri gizliliği (PII) kontrol edildi mi? |