There are many ways to check that there is constant variance of errors across values of the X variables in a regression model. If you’re looking for a statistical test, you can use White’s test or the Breusch-Pagan test, both of which can be implemented using statsmodels
. This post will go over a visual way to check for heteroskedasticity using residual plots after you’ve built your linear regression model.
You can access the code in the statsmodels
canvas below, or read on for an in-depth, line-by-line explanation.
Set up: fit a linear regression model
import statsmodels.api as sm
# Create X and y dataframes
X = df[["petal_width"]]
y = df[["petal_length"]]
# Add constant according to statsmodels documentation
X_sm = sm.add_constant(X)
# Create model, fit, and print results
mod_sm = sm.OLS(y,X_sm)
res_sm = mod_sm.fit()
Now that the results are saved as res_sm
, we can plot the fitted values against the residuals.
matplotlib
Residual plot: fitted values vs. residuals using import matplotlib.pyplot as plt
# Plot fitted values vs. residuals to test for heteroskedasticity
plt.scatter(res_sm.fittedvalues, res_sm.resid)
plt.xlabel('Fitted Values')
plt.ylabel('Residuals')
plt.axhline(y = 0, color = 'r')
plt.show()
Output:

Identifying heteroskedasticity
From the plot, we can see that the residuals seem evenly distributed for each fitted value. When examining this kind of plot, we ’re looking for any distinct, observable patterns among the residuals. For example, if the residuals increase or decrease systematically as the fitted values increase, this may indicate that the model is missing some important linear or nonlinear relationship in the data.

A cone-like shape on the left shows that variance of the residuals increases as our X variable increases, indicating non-constant variance or heteroskedasticity. The random scattering of points on the right shows that the variance of the residuals is constant across values of the X variable. As our residual plot generated earlier resembles more of the plot on the right--a random cloud of data points, with no discernible pattern--we can move forward with our regression analysis.
Alternative plotting functions
If you want to generate a few regression plots, including the one we created manually above, you can use the sm.graphics.plot_regress_exog()
function.
import matplotlib.pyplot as plt
fig = plt.figure(figsize = (8,6))
# Create regression plots for specified X variable
sm.graphics.plot_regress_exog(res_sm, 'petal_width', fig = fig)
plt.show()
Output:

The function takes in a fitted linear regression model, a named X variable (i.e. 'petal_width'
), and a figure object, and produces 4 plots. From top left, going clockwise:
- Fitted values vs. chosen X variable, including confidence intervals of each prediction
- Residuals vs. chosen X variable, helps to detect heteroskedasticity
- Component-Component Plus Residual (CCPR) plot, accounts for the effects of other X variables in the model, when examining the relationship between the y variable and the chosen X variable.
- Partial regression plot examines relationship between the y variable and chosen X variable, when all other X variables are held constant
This function is even more useful for multiple linear regression models involving several X variables, in which you want to isolate the effects of one variable at a time.
About
Einblick is an AI-native data science platform that provides data teams with an agile workflow to swiftly explore data, build predictive models, and deploy data apps. Founded in 2020, Einblick was developed based on six years of research at MIT and Brown University. Einblick is funded by Amplify Partners, Flybridge, Samsung Next, Dell Technologies Capital, and Intel Capital. For more information, please visit www.einblick.ai and follow us on LinkedIn and Twitter.