stratindex
A nonparametric index of stratification (Zhou 2012) — a Python port of the R package strat by Xiang Zhou.
Documentation: https://promsoft.github.io/stratindex/
The index measures how strongly a set of strata (social classes, occupations, schools, …) stratifies a numeric outcome (income, test scores, …). It is the weighted excess of concordant over discordant pairs among all pairs of observations drawn from different strata with distinct outcomes — an analogue of Somers' D where strata are ordered by the average percentile rank of their members (or taken as pre-ordered). The index lies in [-1, 1]: 1 means perfect stratification (every member of a higher stratum outranks every member of a lower one), 0 means no stratification.
Zhou, Xiang. 2012. "A Nonparametric Index of Stratification." Sociological Methodology, 42(1): 365–389. doi:10.1177/0081175012452207
Installation
pip install stratindex
Requires Python ≥ 3.12. The only runtime dependency is NumPy.
Usage
from stratindex import strat, srank, load_cpsmarch2015
d = load_cpsmarch2015() # bundled example data: March CPS 2015, 14,358 men
# stratum-specific information: population share and average percentile rank
print(srank(d["income"], d["big_class"], weights=d["weight"]))
# the stratification index with a between-/within-group decomposition
s = strat(
d["income"], d["big_class"],
weights=d["weight"],
group=d["education"], group_name="education",
)
print(s.format(digits=4))
overall stratification:
strat std_error
0.4128 0.01296
decomposition by education:
weight strat
within education 0.2435 0.2684
between education 0.7565 0.4592
Results are plain dataclasses: s.strat, s.std_error, s.strata_info,
s.decomposition, s.within_group; in Jupyter they render as HTML tables.
If pandas is installed, s.to_pandas() returns the tables as DataFrames, and
load_cpsmarch2015(as_pandas=True) returns a DataFrame.
A DataFrame (or any mapping of columns, like the dict above) can be passed directly — string keywords are resolved as column names, and the group label is taken from the column name:
s = strat(d, outcome="income", strata="big_class",
weights="weight", group="education")
pandas Categorical strata keep their category order (used by
ordered=True and for row order in the tables). Besides the default
Goodman–Kruskal approximation, a bootstrap standard error is available:
strat(..., se_method="bootstrap", n_boot=500, random_state=0).
Correspondence with the R package
| R | Python |
|---|---|
strat(outcome, strata, weights, ordered, group) |
strat(outcome, strata, weights=None, ordered=False, group=None, group_name="group") |
srank(outcome, strata, weights, group) |
srank(outcome, strata, weights=None, group=None) |
s$overall (strat, std_error) |
s.strat, s.std_error (or s.overall) |
s$strata_info |
s.strata_info |
s$decomposition |
s.decomposition |
s$within_group |
s.within_group |
data(cpsmarch2015) |
load_cpsmarch2015() |
Behavioral notes:
- Strata and group levels are ordered by their sorted unique values (as R's
factor()does for character vectors). Withordered=Truethis level order is the stratum order. - R derives the group label from the expression passed as
group; Python uses the column name in data mode (orgroup_name=explicitly). - The pairwise comparisons (an O(n²) C++ loop in the original) are computed in O(n log n) via weighted inversion counting; the full 14,358-row example runs in a fraction of a second.
- Numerical output is cross-validated against the original R package
(see
tests/data/r_golden.json, regenerated withscripts/r_golden.R).
Standard error
The reported standard error is the approximation of Goodman & Kruskal (1963),
as in the R package: se = sqrt((1 - strat²) · n / deno) where deno is the
total weight of comparable pairs.
License
GPL-3.0-or-later, same as the original R package (this is a derivative work).
The bundled cpsmarch2015 dataset originates from the March 2015 Current
Population Survey (U.S. Census Bureau / BLS public data), as distributed with
the R package.
Metadata
Release files for stratindex 0.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| stratindex-0.2.1.tar.gz | 238.1 kB | With provenance | Details for stratindex-0.2.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| stratindex-0.2.1-py3-none-any.whl | Python 3 | none | any | Details for stratindex-0.2.1-py3-none-any.whl |
Total release size: 461.8 kB
Release files / stratindex-0.2.1.tar.gz
| Download URL | stratindex-0.2.1.tar.gz |
|---|---|
| Size | 238.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
6bfef9c2ef65070c04f19186d9432bbb0749381bc070d68c08546caee2aef015
|
|
BLAKE2b-256 checksum How to use checksums |
75214b1fad057eda604be7b3e41f3405a7cca739d9a4fe944cf21984a681e665
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 13, 2026.
Transparency logRelease files / stratindex-0.2.1-py3-none-any.whl
| Download URL | stratindex-0.2.1-py3-none-any.whl |
|---|---|
| Size | 223.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c6fa2a6d6f83b1875fb7d19b2be66e685bef0737cc723b57ed02778c851ccc56
|
|
BLAKE2b-256 checksum How to use checksums |
9032ce1e869df1af80081d002bdf62ea27ab7763da50495a2f37700987c01078
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.12
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 13, 2026.
Transparency logSecurity for stratindex 0.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for stratindex-0.2.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 13, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.