IDH


In [1]:
%matplotlib inline
import pandas as pd
import requests as req
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from scipy.stats import ttest_ind, ttest_rel
from scipy.stats import gaussian_kde
from statsmodels.formula.api import ols, mixedlm, gee
from statsmodels.stats.outliers_influence import OLSInfluence
from statsmodels.regression.linear_model import OLSResults
from patsy import dmatrix

np.set_printoptions(precision=3)

Carregando dados de IDH-M da Wikipedia


In [2]:
idhm_df = pd.read_csv("../data/brazil_states_idhr_2000_2010.csv", index_col=0)
idhm_df


Out[2]:
Estado I2000 I2010 Ratio idh_level_2000
0 Distrito Federal 0.805 0.863 1.072050 1
1 São Paulo 0.756 0.789 1.043651 1
2 Rio de Janeiro 0.745 0.782 1.049664 1
3 Santa Catarina 0.717 0.773 1.078103 1
4 Rio Grande do Sul 0.720 0.769 1.068056 1
5 Paraná 0.704 0.757 1.075284 1
6 Espírito Santo 0.687 0.743 1.081514 1
7 Goiás 0.686 0.742 1.081633 1
8 Mato Grosso do Sul 0.687 0.740 1.077147 1
9 Mato Grosso 0.689 0.732 1.062409 1
10 Minas Gerais 0.680 0.730 1.073529 1
11 Rondônia 0.654 0.712 1.088685 1
12 Roraima 0.652 0.695 1.065951 1
13 Amapá 0.638 0.694 1.087774 1
14 Tocantins 0.605 0.690 1.140496 0
15 Rio Grande do Norte 0.608 0.678 1.115132 0
16 Amazonas 0.608 0.677 1.113487 0
17 Pernambuco 0.615 0.673 1.094309 0
18 Sergipe 0.596 0.672 1.127517 0
19 Acre 0.612 0.671 1.096405 0
20 Bahia 0.594 0.663 1.116162 0
21 Paraíba 0.582 0.656 1.127148 0
22 Ceará 0.588 0.651 1.107143 0
23 Pará 0.601 0.646 1.074875 0
24 Alagoas 0.574 0.641 1.116725 0
25 Piauí 0.556 0.635 1.142086 0
26 Maranhão 0.531 0.612 1.152542 0

Análise


In [3]:
idhm_df.describe()


Out[3]:
I2000 I2010 Ratio idh_level_2000
count 27.000000 27.000000 27.000000 27.000000
mean 0.647778 0.706889 1.093684 0.518519
std 0.067080 0.058228 0.028837 0.509175
min 0.531000 0.612000 1.043651 0.000000
25% 0.598500 0.667000 1.074202 0.000000
50% 0.638000 0.694000 1.087774 1.000000
75% 0.688000 0.742500 1.115647 1.000000
max 0.805000 0.863000 1.152542 1.000000

In [4]:
f = plt.figure(14)
idhm_df[["I2000","I2010","Ratio"]].hist(bins=10)
plt.figure()
sns.kdeplot(idhm_df["I2000"], shade=True);
sns.kdeplot(idhm_df["I2010"], shade=True);
sns.kdeplot(idhm_df["Ratio"], shade=True);


<matplotlib.figure.Figure at 0x7f78d26aff28>

Testando hipótese

A diferença média entre os IDHs de 2000 e 2010 é estatisticamente significativa?


In [5]:
ttest_rel(idhm_df['I2000'], idhm_df['I2010'])


Out[5]:
(-23.005327846415476, 8.2467988817246606e-19)

In [6]:
import scipy  
import scikits.bootstrap as bootstrap
  
# compute 95% confidence intervals around the mean  
CIs00 = bootstrap.ci(data=idhm_df["I2000"])  
CIs10 = bootstrap.ci(data=idhm_df["I2010"])
CIsR  = bootstrap.ci(data=idhm_df["Ratio"])

print("IDHM 2000 mean 95% confidence interval. Low={0:.3f}\tHigh={1:.3f}".format(*tuple(CIs00)))
print("IDHM 2010 mean 95% confidence interval. Low={0:.3f}\tHigh={1:.3f}".format(*tuple(CIs10)))
print("IDHM ratio mean 95% confidence interval. Low={0:.3f}\tHigh={1:.3f}".format(*tuple(CIsR)))


IDHM 2000 mean 95% confidence interval. Low=0.624	High=0.674
IDHM 2010 mean 95% confidence interval. Low=0.686	High=0.729
IDHM ratio mean 95% confidence interval. Low=1.084	High=1.105

In [7]:
CIs00 = bootstrap.ci(data=idhm_df["I2000"], statfunction=scipy.median)  
CIs10 = bootstrap.ci(data=idhm_df["I2010"], statfunction=scipy.median)
CIsR  = bootstrap.ci(data=idhm_df["Ratio"], statfunction=scipy.median)

print("IDHM 2000 median 95% confidence interval. Low={0:.3f}\tHigh={1:.3f}".format(*tuple(CIs00)))
print("IDHM 2010 median 95% confidence interval. Low={0:.3f}\tHigh={1:.3f}".format(*tuple(CIs10)))
print("IDHM ratio median 95% confidence interval. Low={0:.3f}\tHigh={1:.3f}".format(*tuple(CIsR)))


IDHM 2000 median 95% confidence interval. Low=0.601	High=0.686
IDHM 2010 median 95% confidence interval. Low=0.671	High=0.732
IDHM ratio median 95% confidence interval. Low=1.075	High=1.107

A resposta de diversos testes, para um nível de 5% de significância, mostra que há fortes evidências que sim.

Montando percentual de impacto da administração de cada partido em cada Estado da Federação.


In [8]:
state_parties_df = pd.read_csv("../data/brazil_states_parties_2000-2010.csv", index_col=0)

In [9]:
state_parties_df


Out[9]:
Estado Outros PSDB PT
0 Distrito Federal 1.000 0.000 0.000
1 São Paulo 0.075 0.925 0.000
2 Santa Catarina 1.000 0.000 0.000
3 Rio de Janeiro 0.600 0.000 0.400
4 Paraná 1.000 0.000 0.000
5 Rio Grande do Sul 0.400 0.400 0.200
6 Espírito Santo 0.800 0.200 0.000
7 Goiás 0.400 0.600 0.000
8 Minas Gerais 0.200 0.800 0.000
9 Mato Grosso do Sul 0.400 0.600 0.000
10 Mato Grosso 0.800 0.200 0.000
11 Amapá 0.925 0.000 0.075
12 Roraima 0.325 0.400 0.275
13 Tocantins 0.800 0.200 0.000
14 Rondônia 0.600 0.400 0.000
15 Rio Grande do Norte 1.000 0.000 0.000
16 Ceará 0.400 0.000 0.600
17 Amazonas 1.000 0.000 0.000
18 Pernambuco 1.000 0.000 0.000
19 Sergipe 0.400 0.200 0.400
20 Acre 0.000 0.000 1.000
21 Bahia 0.600 0.000 0.400
22 Paraíba 0.450 0.550 0.000
23 Piauí 0.200 0.000 0.800
24 Pará 0.000 0.600 0.400
25 Maranhão 1.000 0.000 0.000
26 Alagoas 1.000 0.000 0.000

In [10]:
state_regions_df = pd.read_csv("../data/brazil_states_regions.csv", index_col=0)
state_regions_df


Out[10]:
Estado Regiao
0 Distrito Federal Centro-Oeste
1 São Paulo Sudeste
2 Santa Catarina Sul
3 Rio de Janeiro Sudeste
4 Paraná Sul
5 Rio Grande do Sul Sul
6 Espírito Santo Sudeste
7 Goiás Centro-Oeste
8 Minas Gerais Sudeste
9 Mato Grosso do Sul Centro-Oeste
10 Mato Grosso Centro-Oeste
11 Amapá Norte
12 Roraima Norte
13 Tocantins Norte
14 Rondônia Norte
15 Rio Grande do Norte Nordeste
16 Ceará Nordeste
17 Amazonas Norte
18 Pernambuco Nordeste
19 Sergipe Nordeste
20 Acre Norte
21 Bahia Nordeste
22 Paraíba Nordeste
23 Piauí Nordeste
24 Pará Norte
25 Maranhão Nordeste
26 Alagoas Nordeste

In [11]:
df = idhm_df.merge(state_parties_df, on="Estado")
df = df.merge(state_regions_df, on="Estado")
df


Out[11]:
Estado I2000 I2010 Ratio idh_level_2000 Outros PSDB PT Regiao
0 Distrito Federal 0.805 0.863 1.072050 1 1.000 0.000 0.000 Centro-Oeste
1 São Paulo 0.756 0.789 1.043651 1 0.075 0.925 0.000 Sudeste
2 Rio de Janeiro 0.745 0.782 1.049664 1 0.600 0.000 0.400 Sudeste
3 Santa Catarina 0.717 0.773 1.078103 1 1.000 0.000 0.000 Sul
4 Rio Grande do Sul 0.720 0.769 1.068056 1 0.400 0.400 0.200 Sul
5 Paraná 0.704 0.757 1.075284 1 1.000 0.000 0.000 Sul
6 Espírito Santo 0.687 0.743 1.081514 1 0.800 0.200 0.000 Sudeste
7 Goiás 0.686 0.742 1.081633 1 0.400 0.600 0.000 Centro-Oeste
8 Mato Grosso do Sul 0.687 0.740 1.077147 1 0.400 0.600 0.000 Centro-Oeste
9 Mato Grosso 0.689 0.732 1.062409 1 0.800 0.200 0.000 Centro-Oeste
10 Minas Gerais 0.680 0.730 1.073529 1 0.200 0.800 0.000 Sudeste
11 Rondônia 0.654 0.712 1.088685 1 0.600 0.400 0.000 Norte
12 Roraima 0.652 0.695 1.065951 1 0.325 0.400 0.275 Norte
13 Amapá 0.638 0.694 1.087774 1 0.925 0.000 0.075 Norte
14 Tocantins 0.605 0.690 1.140496 0 0.800 0.200 0.000 Norte
15 Rio Grande do Norte 0.608 0.678 1.115132 0 1.000 0.000 0.000 Nordeste
16 Amazonas 0.608 0.677 1.113487 0 1.000 0.000 0.000 Norte
17 Pernambuco 0.615 0.673 1.094309 0 1.000 0.000 0.000 Nordeste
18 Sergipe 0.596 0.672 1.127517 0 0.400 0.200 0.400 Nordeste
19 Acre 0.612 0.671 1.096405 0 0.000 0.000 1.000 Norte
20 Bahia 0.594 0.663 1.116162 0 0.600 0.000 0.400 Nordeste
21 Paraíba 0.582 0.656 1.127148 0 0.450 0.550 0.000 Nordeste
22 Ceará 0.588 0.651 1.107143 0 0.400 0.000 0.600 Nordeste
23 Pará 0.601 0.646 1.074875 0 0.000 0.600 0.400 Norte
24 Alagoas 0.574 0.641 1.116725 0 1.000 0.000 0.000 Nordeste
25 Piauí 0.556 0.635 1.142086 0 0.200 0.000 0.800 Nordeste
26 Maranhão 0.531 0.612 1.152542 0 1.000 0.000 0.000 Nordeste

In [12]:
sns.factorplot("idh_level_2000","Ratio",data=df, kind="box")


Out[12]:
<seaborn.axisgrid.FacetGrid at 0x7f78ce381eb8>

In [13]:
sns.factorplot("Regiao","Ratio",data=df, kind="box")


Out[13]:
<seaborn.axisgrid.FacetGrid at 0x7f78ce38ac88>

In [14]:
sns.set()
sns.pairplot(df, hue="idh_level_2000", size=2.5)


Out[14]:
<seaborn.axisgrid.PairGrid at 0x7f78ce3657b8>

In [15]:
sns.coefplot("Ratio ~ PT + PSDB + Outros + C(idh_level_2000) - 1", df, palette="Set1");



In [16]:
sns.coefplot("Ratio ~ Outros==0 + Outros - 1", df, palette="Set1");



In [17]:
sns.set(style="whitegrid")
sns.residplot(df.Outros,df.Ratio, color="navy", lowess=True, order=1)


Out[17]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f78ccd10128>

In [18]:
sns.coefplot("Ratio ~ PT==0 + PT - 1", df, palette="Set1");



In [19]:
sns.set(style="whitegrid")
sns.residplot(df[df.PT>0].PT, df[df.PT>0].Ratio, color="navy", order=1)


Out[19]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f78cd4dc278>

In [20]:
sns.coefplot("Ratio ~ PSDB==0 + PSDB + np.multiply(PSDB, PSDB) - 1", df, palette="Set1");



In [21]:
sns.set(style="whitegrid")
sns.residplot(df[df.PSDB>0].PSDB, df[df.PSDB>0].Ratio, color="navy", lowess=True, order=2)


Out[21]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f78cd493160>

Impacto por partido ou nível do IDH-M em 2000


In [22]:
sns.coefplot("Ratio ~ PT + PSDB + Outros + C(idh_level_2000) - 1", df, palette="Set1");
sns.coefplot("Ratio ~ PT + PSDB + C(idh_level_2000)", df, palette="Set1");
sns.coefplot("Ratio ~ PT + Outros + C(idh_level_2000)", df, palette="Set1");
sns.coefplot("Ratio ~ PSDB + Outros + C(idh_level_2000)", df, palette="Set1");



In [23]:
formula = "Ratio ~ PT + PSDB + C(idh_level_2000) + C(Regiao)"
model = ols(formula, df).fit()
model.summary()


Out[23]:
OLS Regression Results
Dep. Variable: Ratio R-squared: 0.730
Model: OLS Adj. R-squared: 0.631
Method: Least Squares F-statistic: 7.355
Date: Wed, 20 May 2015 Prob (F-statistic): 0.000247
Time: 00:16:07 Log-Likelihood: 75.640
No. Observations: 27 AIC: -135.3
Df Residuals: 19 BIC: -124.9
Df Model: 7
Covariance Type: nonrobust
coef std err t P>|t| [95.0% Conf. Int.]
Intercept 1.1058 0.017 65.387 0.000 1.070 1.141
C(idh_level_2000)[T.1] -0.0288 0.014 -2.095 0.050 -0.058 -2.28e-05
C(Regiao)[T.Nordeste] 0.0214 0.017 1.240 0.230 -0.015 0.057
C(Regiao)[T.Norte] 0.0086 0.014 0.639 0.530 -0.020 0.037
C(Regiao)[T.Sudeste] -0.0081 0.013 -0.645 0.527 -0.035 0.018
C(Regiao)[T.Sul] -0.0006 0.014 -0.044 0.966 -0.029 0.028
PT -0.0171 0.014 -1.236 0.232 -0.046 0.012
PSDB -0.0104 0.014 -0.741 0.468 -0.040 0.019
Omnibus: 0.165 Durbin-Watson: 1.689
Prob(Omnibus): 0.921 Jarque-Bera (JB): 0.024
Skew: 0.048 Prob(JB): 0.988
Kurtosis: 2.891 Cond. No. 11.0

Não foi possível observar diferença significantiva entre os partidos.

Quais estados possuem diferença significativa?

Comparando 2010 com 2000


In [24]:
sns.lmplot("I2000", "I2010", data=df, legend=True, size=10, n_boot=10000, ci=95)


Out[24]:
<seaborn.axisgrid.FacetGrid at 0x7f78cd15e9b0>

In [25]:
sns.jointplot("I2000", "I2010", data=df, kind='resid',color=sns.color_palette()[2], size=10)


Out[25]:
<seaborn.axisgrid.JointGrid at 0x7f78cd152e10>

In [26]:
sns.coefplot("I2010 ~ I2000", data=df, intercept=True)
sns.coefplot("I2010 ~ I2000", data=df, groupby="idh_level_2000", intercept=True)



In [27]:
sns.lmplot("I2000", "I2010", data=df, hue="idh_level_2000", col="idh_level_2000", legend=True, size=6, n_boot=10000, ci=99)
sns.lmplot("I2000", "I2010", data=df, hue="Regiao", col="Regiao", col_wrap=2, legend=True, size=6, n_boot=10000, ci=99)


Out[27]:
<seaborn.axisgrid.FacetGrid at 0x7f78cad8d198>

In [28]:
md = ols("I2010 ~ I2000 + C(Regiao)", df).fit()
print(md.summary())


                            OLS Regression Results                            
==============================================================================
Dep. Variable:                  I2010   R-squared:                       0.978
Model:                            OLS   Adj. R-squared:                  0.973
Method:                 Least Squares   F-statistic:                     189.2
Date:                Wed, 20 May 2015   Prob (F-statistic):           1.01e-16
Time:                        00:16:22   Log-Likelihood:                 90.671
No. Observations:                  27   AIC:                            -169.3
Df Residuals:                      21   BIC:                            -161.6
Df Model:                           5                                         
Covariance Type:            nonrobust                                         
=========================================================================================
                            coef    std err          t      P>|t|      [95.0% Conf. Int.]
-----------------------------------------------------------------------------------------
Intercept                 0.1306      0.045      2.926      0.008         0.038     0.224
C(Regiao)[T.Nordeste]     0.0037      0.010      0.362      0.721        -0.017     0.025
C(Regiao)[T.Norte]       -0.0033      0.008     -0.398      0.695        -0.021     0.014
C(Regiao)[T.Sudeste]     -0.0085      0.007     -1.255      0.223        -0.023     0.006
C(Regiao)[T.Sul]         -0.0002      0.007     -0.023      0.982        -0.015     0.015
I2000                     0.8910      0.062     14.383      0.000         0.762     1.020
==============================================================================
Omnibus:                        3.440   Durbin-Watson:                   1.914
Prob(Omnibus):                  0.179   Jarque-Bera (JB):                1.871
Skew:                           0.476   Prob(JB):                        0.392
Kurtosis:                       3.869   Cond. No.                         53.6
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

In [29]:
rrr = md.get_robustcov_results()
rrp = rrr.outlier_test("fdr_bh", 0.1)
idx = rrp[rrp["fdr_bh(p)"] <= 0.1].index
print("Estados fora da média:\n",df.ix[idx.values])
rrp[rrp["fdr_bh(p)"] <= 0.1]


Estados fora da média:
 Empty DataFrame
Columns: [Estado, I2000, I2010, Ratio, idh_level_2000, Outros, PSDB, PT, Regiao]
Index: []
Out[29]:
student_resid unadj_p fdr_bh(p)

GEE


In [30]:
import statsmodels.api as sm
md = gee("Ratio ~ PT + PSDB ", df.idh_level_2000, df, cov_struct=sm.cov_struct.Exchangeable()) 
mdf = md.fit() 
print(mdf.summary())
print(mdf.cov_struct.summary())


                               GEE Regression Results                              
===================================================================================
Dep. Variable:                       Ratio   No. Observations:                   27
Model:                                 GEE   No. clusters:                        2
Method:                        Generalized   Min. cluster size:                  13
                      Estimating Equations   Max. cluster size:                  14
Family:                           Gaussian   Mean cluster size:                13.5
Dependence structure:         Exchangeable   Num. iterations:                     6
Date:                     Wed, 20 May 2015   Scale:                           0.001
Covariance type:                    robust   Time:                         00:16:22
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept      1.1016      0.016     67.463      0.000         1.070     1.134
PT            -0.0183      0.005     -3.844      0.000        -0.028    -0.009
PSDB          -0.0177      0.005     -3.861      0.000        -0.027    -0.009
==============================================================================
Skew:                          0.4277   Kurtosis:                      -0.8240
Centered skew:                -0.0338   Centered kurtosis:             -0.4141
==============================================================================
The correlation between two observations in the same cluster is 0.589

In [31]:
plt.plot(mdf.fittedvalues, mdf.resid, 'o', alpha=0.5)
plt.xlabel("Fitted values", size=17)
plt.ylabel("Residuals", size=17)


Out[31]:
<matplotlib.text.Text at 0x7f78cceec198>

In [32]:
sns.jointplot(mdf.fittedvalues, mdf.resid, size=10, kind="kde")


Out[32]:
<seaborn.axisgrid.JointGrid at 0x7f78ccf0f6d8>

In [ ]:


In [ ]: