The Python companion package for ModernDive: Statistical Inference via Data
Science — a faithful port of the R moderndive
and infer packages to a modern Python
data-science stack (polars, plotnine,
statsmodels).
It is intentionally pure-Python (no compiled extensions) so it installs under
Pyodide via micropip for in-browser execution.
pip install moderndive # from PyPI (once published)
# or, from source:
pip install git+https://github.com/moderndive/moderndive-python- A tidy simulation-inference grammar mirroring R
infer:specify → hypothesize → generate → calculate, plusfit()for multiple regression,observe(),assume()(theoretical t/z/F/Chisq), the visualization layersvisualize/shade_p_value/shade_confidence_interval, and the gettersget_p_value/get_confidence_interval(percentile, SE, bias-corrected). British-spelling and short aliases are included. - Theory-based wrapper tests:
t_test,prop_test,chisq_test,t_stat,chisq_stat, plus themoderndive.theorymodule. - Regression helpers mirroring R
moderndive:get_regression_table,get_regression_points,tidy_summary(built onstatsmodels, returningpolarsframes). - Sampling:
rep_slice_sample/rep_sample_nfor sampling-distribution activities. - Plots:
pairplot(a seaborn scatterplot-matrix, theGGally::ggpairsanalog). - Datasets:
load_*()loaders returningpolarsDataFrames (thenycflights23,gapminder,moderndive, ISLR2, and FiveThirtyEight datasets used in the book).
import moderndive as md
from moderndive import specify, get_p_value, visualize, shade_p_value
spotify = md.load_spotify_metal_deephouse()
# observed difference in popularity rates (metal − deep house)
obs = specify(spotify, formula="popular_or_not ~ track_genre", success="popular") \
.calculate(stat="diff in props", order=("metal", "deep-house"))
# permutation null distribution + p-value
null = (
specify(spotify, formula="popular_or_not ~ track_genre", success="popular")
.hypothesize(null="independence")
.generate(reps=1000, type="permute", seed=76)
.calculate(stat="diff in props", order=("metal", "deep-house"))
)
get_p_value(null, obs_stat=obs, direction="right")
visualize(null, bins=25) + shade_p_value(obs_stat=obs, direction="right")This repo uses uv.
uv sync --extra dev # create the environment
make test # run the test suite (enforces 100% coverage)
make build-data # rebuild the bundled Parquet datasets (needs R; see tools/)
make build # build the wheel/sdistThe test suite is held at 100% statement coverage (enforced in CI via
--cov-fail-under=100).
MIT. The ModernDive book content is licensed CC-BY-NC-SA 4.0; this software package is MIT-licensed.
