UBI as a means of reducing gendered poverty

By Katarina van Alebeek and Max Ghenis, 2020-03-08

This year’s International Women’s Day asks its celebrants to challenge the world in order to change it (#ChooseToChallenge). The following simulation seeks to challenge the fact that women in the United States are more likely to be impoverished than men. In our analysis, we evaluate a Universal Basic Income (UBI), funded by a flat income tax, as a possible solution for both alleviating poverty and narrowing the gendered poverty gap.1

Poverty rates for children are roughly equal between genders, while adult women experience poverty at rates 17 percent greater than adult men: 12.4 percent vs. 10.6 percent. As a general trend, the difference in poverty rates between women and men increases with age. For example, 20.8 percent of women aged 85 or older are in poverty, compared to only 14.5 percent of men of the same age. Among people aged 85 or older, women experience deep poverty at twice the rate of men.

import microdf as mdf
import numpy as np
import pandas as pd
import plotly.express as px
import ubicenter

df = pd.read_csv(
    "https://github.com/MaxGhenis/datarepo/raw/master/pppub20.csv.gz",
    usecols=[
        "MARSUPWT",
        "SPM_RESOURCES",
        "SPM_POVTHRESHOLD",
        "SPM_WEIGHT",
        "SPM_NUMPER",
        "A_SEX",
        "A_AGE",
        "SPM_ID",
        "AGI",
    ],
)
df.columns = df.columns.str.lower()
df["weight"] = df.marsupwt / 100
df["spm_weight"] = df.spm_weight / 100
df["female"] = df.a_sex == 2
df["poverty"] = df.spm_resources < df.spm_povthreshold
df["deep_poverty"] = df.spm_resources < (df.spm_povthreshold / 2)
df["sex"] = np.where(df.female, "Female", "Male")

spm = df.groupby(
    ["spm_id", "spm_resources", "spm_weight", "spm_povthreshold", "spm_numper"]
)[["agi"]].sum()
spm["agi_pos"] = np.maximum(spm.agi, 0)
spm.reset_index(inplace=True)

total_population = df.weight.sum()
total_agi_pos = mdf.weighted_sum(spm, "agi_pos", "spm_weight")

# Bin into ages aligning with 18 year old threshold.
DARK_PURPLE = "#46296E"  # Official Intl Womens Day Color.
LIGHT_PURPLE = "#907EA8"  # Lightened version.
DARK_GREY = "#9E9E9E"  # Gray 500 from Material Design.
LIGHT_GREY = "#BDBDBD"  # Gray 400.

COLOR_MAP = {
    "Female": DARK_PURPLE,
    "Male": LIGHT_GREY,
    "Female poverty": DARK_PURPLE,
    "Female deep poverty": LIGHT_PURPLE,
    "Male poverty": DARK_GREY,
    "Male deep poverty": LIGHT_GREY,
    "Poverty": DARK_PURPLE,
    "Deep poverty": LIGHT_PURPLE,
}

df["age_group"] = pd.cut(df.a_age + 1, np.arange(0, 91, 5), labels=np.arange(0, 86, 5))
pov_age = mdf.weighted_mean(
    df, ["poverty", "deep_poverty"], "marsupwt", groupby=["age_group", "sex"]
)
pov_age = pov_age.round(3)
pov_age.reset_index(inplace=True)
pov_age = pov_age.melt(["age_group", "sex"], ["poverty", "deep_poverty"])
pov_age["label"] = (
    pov_age.sex
    + " "
    + np.where(pov_age.variable == "poverty", "poverty", "deep poverty")
)

fig = px.line(
    pov_age, x="age_group", y="value", color="label", color_discrete_map=COLOR_MAP
)
fig.update_layout(
    title="Poverty by gender and age",
    xaxis_title="Age (in 5-year bins)",
    yaxis_title="SPM poverty rate (2019)",
    legend_title="",
    yaxis_tickformat="%",
    yaxis_range=[0, pov_age.value.max() * 1.1] #fig.update_xaxes(range=[1.5, 4.5])
)

fig.update_traces(mode="markers+lines", hovertemplate=None)

ubicenter.format_fig(fig)