Spatial inequality dynamics across US counties
Setup
# Load libraries
import numpy as np
import pandas as pd
pd.set_option('display.max_columns', None)
import matplotlib.pyplot as plt
plt.style.use('ggplot')
from matplotlib.ticker import FormatStrFormatter
from matplotlib_scalebar.scalebar import ScaleBar
from pylab import rcParams
import matplotlib as mpl
mpl.rcParams['figure.dpi'] = 72
import seaborn as sns
#sns.set_style("darkgrid")
#sns.set_context(context="paper", font_scale=1.5, rc=None)
#sns.set(font="serif")
import plotly.express as px
import plotly.graph_objects as go
import geopandas as gpd
import libpysal
from libpysal import weights
from libpysal.weights import Queen
import inequality
from inequality.gini import Gini_Spatial
import esda
from esda.moran import Moran, Moran_Local
import splot
from splot.esda import moran_scatterplot, plot_moran, lisa_cluster, plot_local_autocorrelation
from splot.libpysal import plot_spatial_weights
from giddy.directional import Rose
import statsmodels.api as sm
import statsmodels.formula.api as smf
from spreg import OLS
from spreg import MoranRes
from spreg import ML_Lag
from spreg import ML_Error
from mgwr.gwr import GWR, MGWR
from mgwr.sel_bw import Sel_BW
from mgwr.utils import shift_colormap, truncate_colormap
import warnings
warnings.filterwarnings('ignore')
Import data
gdf = gpd.read_file("https://github.com/gdsbook/book/raw/master/data/us_county_income/uscountypcincome.gpkg")
#gdf = gpd.read_file("/work/uscountypcincome.gpkg")
gdf.head()
STATEFPobject
COUNTYFPobject
0
55
111
1
55
093
2
55
063
3
55
033
4
55
053
gdf.columns
gdf.shape
gdf.query('NAME == "Jackson" & STATEFP == "28"').loc[:, '1969':'1979']
1969int64
1970int64
1417
2957
3121
years = np.arange(1969, 2018).astype(str)
Regional inequality
sns.histplot(x=gdf['1969'], kde=True);
px.histogram(gdf, x = '1969', hover_name= 'NAME', marginal='rug')
Gini index
g69 = inequality.gini.Gini(gdf['1969'].values)
g69.g
def gini_by_col(column):
return inequality.gini.Gini(column.values).g
inequalities = gdf[years].apply(gini_by_col, axis=0).to_frame('gini')
inequalities.plot();
px.line(inequalities, x=inequalities.index, y='gini')
Theil index
def theil(column):
return inequality.theil.Theil(column.values).T
inequalities['theil'] = gdf[years].apply(theil, axis=0)
inequalities['theil'].plot();
px.line(inequalities, x=inequalities.index, y='theil')
Spatial dependence
ax = gdf.plot(
column='1969',
scheme='NaturalBreaks',
legend=True,
edgecolor='none',
legend_kwds={'loc': 'lower left'},
figsize=(12, 12)
)
ax.set_axis_off()
plt.show()
<