Unidad de Area Modificable

En esta práctica vamos a explorar la forma en la agregación delos datos influye en los resultados de un análisis. Para esto vamos a trabajar con los datos de desaparecidos en la República Mexicana entre 2006 y 2014.

Los datos vienen en dos shapefiles, uno a nivel estatal y otro a nivel municipal. Importemos los archivos en GeoPandas para analizarlos:


In [1]:
from geopandas import GeoDataFrame
estatal = GeoDataFrame.from_file('data/des_rezago_estado.shp')
municipal = GeoDataFrame.from_file('data/muns_geo_des.shp')

Vamos a ver un poco los datos:


In [2]:
estatal.head()


Out[2]:
2006 2007 2008 2009 2010 2011 2012 2013 2014 POB1 analfabeta cvegeo ed_basica estado geometry no_escuela pob_alimen pob_capaci pob_patrim rezago
0 0 25 7 20 18 30 14 15 62 1184996 4.15 01 41.83 Aguascalientes POLYGON ((-102.2878651817759 22.41649003941765... 4.53 14.9 23.6 51.1 1.14451
1 0 7 25 11 8 19 128 177 381 3155070 3.07 02 38.94 Baja California (POLYGON ((-115.2104851485454 28.3722493563768... 4.77 1.3 2.3 9.2 0.66364
2 0 0 2 1 3 2 3 8 3 637026 3.60 03 38.92 Baja California Sur (POLYGON ((-109.8006324469839 24.1492608586424... 4.03 4.7 8.0 23.5 0.48199
3 0 0 5 0 1 0 0 10 59 822441 10.17 04 49.00 Campeche POLYGON ((-90.37935699678101 20.84832728853007... 5.11 20.0 27.3 51.4 0.32493
4 1 55 102 117 227 258 136 233 103 2748391 3.28 05 38.13 Coahuila de Zaragoza POLYGON ((-102.3107926469074 29.87694857356086... 3.84 8.6 15.2 41.0 1.25058

Como estos datos tienen 22 columnas, no los podemos ver todos. Vamos a listar las columnas para ver qué datos tenemos:


In [3]:
for c in estatal.columns:
    print c


2006
2007
2008
2009
2010
2011
2012
2013
2014
POB1
analfabeta
cvegeo
ed_basica
estado
geometry
no_escuela
pob_alimen
pob_capaci
pob_patrim
rezago

En las columnas 2006-2014 tenemos los datos de desaparecidos para cada año. En las demás columnos tenemos alguna información sobre las condiciones socioeconómicas de cada unidad espacial:

  • analfabeta porcentaje de la población que no sabe ller y escribir
  • ed_basica porcentaje de la población que sólo termino la educación básica
  • no_escuela porcentaje de los niños en edad escoar que no asisten a la escuela
  • pob_alimentaria porcentaje de la población en pobreza alimentaria
  • pob_capaci porcentaje de la población en pobreza de capacidades
  • pob_patrim porcentaje de la población en pobreza patrimonial
  • rezago índice de rezago

Los datos son del CONEVAL a partir del censo de 2010


In [4]:
municipal.head()


Out[4]:
2006 2007 2008 2009 2010 2011 2012 2013 2014 POB1 ... cvegeo_x ed_basica geometry no_escuela nom_estado nom_mun pob_alimen pob_capaci pob_patrim rezago
0 0 22 6 19 17 26 11 15 48 797010 ... 01001 3.83 POLYGON ((-102.1064122399267 22.06035441303033... 3.19 Aguascalientes Aguascalientes 12.1 20.4 48.0 -1.63691
1 0 0 0 0 0 0 2 0 1 45492 ... 01002 5.49 POLYGON ((-102.051893439036 22.29143529350413,... 6.75 Aguascalientes Asientos 19.9 28.9 56.8 -0.95642
2 0 0 0 0 0 0 0 0 4 54136 ... 01003 8.93 POLYGON ((-102.6856884472506 22.09962730886253... 8.15 Aguascalientes Calvillo 24.9 35.2 62.5 -1.12218
3 0 1 0 0 0 0 0 0 0 15042 ... 01004 4.18 POLYGON ((-102.287865181776 22.41649003941679,... 6.71 Aguascalientes Cosío 14.8 22.6 49.8 -1.07846
4 0 1 0 1 0 3 1 0 4 99590 ... 01005 5.69 POLYGON ((-102.3356775711373 22.05066521496391... 5.33 Aguascalientes Jesús María 18.7 28.4 55.8 -1.21094

5 rows × 22 columns

El primer ejercicio que vamos a hacer es una regresión lineal del total de desaparecidos (sobre todos los años), contra alguna variable socioeconómica para observar cómo cambia el resultado con la escala de análisis.

El primer paso es crear y calcular una columna con el total de desaparecidos:


In [5]:
des_estado = estatal[['cvegeo','2006','2007','2008','2009','2010','2011','2012','2013','2014']]
des_estado.head()


Out[5]:
cvegeo 2006 2007 2008 2009 2010 2011 2012 2013 2014
0 01 0 25 7 20 18 30 14 15 62
1 02 0 7 25 11 8 19 128 177 381
2 03 0 0 2 1 3 2 3 8 3
3 04 0 0 5 0 1 0 0 10 59
4 05 1 55 102 117 227 258 136 233 103

Aquí simplemente seleccionamos las columnas que nos interesan


In [6]:
des_estado['total_des'] = des_estado.sum(axis=1)
des_estado.head()


/home/plablo/virtualenvs/analisis-espacial/lib/python2.7/site-packages/ipykernel/__main__.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  if __name__ == '__main__':
Out[6]:
cvegeo 2006 2007 2008 2009 2010 2011 2012 2013 2014 total_des
0 01 0 25 7 20 18 30 14 15 62 191
1 02 0 7 25 11 8 19 128 177 381 756
2 03 0 0 2 1 3 2 3 8 3 22
3 04 0 0 5 0 1 0 0 10 59 75
4 05 1 55 102 117 227 258 136 233 103 1232

Y aquí añadimos una nueva columna a nuestra selección con la suma de desaparecidos.

Ahora vamos a unir la suma a nuestros datos originales:


In [7]:
import pandas as pd
estatal = pd.merge(estatal,des_estado[['total_des','cvegeo']],on='cvegeo' )
estatal.head()


Out[7]:
2006 2007 2008 2009 2010 2011 2012 2013 2014 POB1 ... cvegeo ed_basica estado geometry no_escuela pob_alimen pob_capaci pob_patrim rezago total_des
0 0 25 7 20 18 30 14 15 62 1184996 ... 01 41.83 Aguascalientes POLYGON ((-102.2878651817759 22.41649003941765... 4.53 14.9 23.6 51.1 1.14451 191
1 0 7 25 11 8 19 128 177 381 3155070 ... 02 38.94 Baja California (POLYGON ((-115.2104851485454 28.3722493563768... 4.77 1.3 2.3 9.2 0.66364 756
2 0 0 2 1 3 2 3 8 3 637026 ... 03 38.92 Baja California Sur (POLYGON ((-109.8006324469839 24.1492608586424... 4.03 4.7 8.0 23.5 0.48199 22
3 0 0 5 0 1 0 0 10 59 822441 ... 04 49.00 Campeche POLYGON ((-90.37935699678101 20.84832728853007... 5.11 20.0 27.3 51.4 0.32493 75
4 1 55 102 117 227 258 136 233 103 2748391 ... 05 38.13 Coahuila de Zaragoza POLYGON ((-102.3107926469074 29.87694857356086... 3.84 8.6 15.2 41.0 1.25058 1232

5 rows × 21 columns

Repetimos para los municipios (ahora en un solo paso):


In [8]:
des_mun = municipal[['cvegeo_x','2006','2007','2008','2009','2010','2011','2012','2013','2014']]
des_mun['total_des'] = des_mun.sum(axis=1)
municipal = pd.merge(municipal,des_mun[['total_des','cvegeo_x']],on='cvegeo_x' )
municipal.head()


/home/plablo/virtualenvs/analisis-espacial/lib/python2.7/site-packages/ipykernel/__main__.py:2: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  from ipykernel import kernelapp as app
Out[8]:
2006 2007 2008 2009 2010 2011 2012 2013 2014 POB1 ... ed_basica geometry no_escuela nom_estado nom_mun pob_alimen pob_capaci pob_patrim rezago total_des
0 0 22 6 19 17 26 11 15 48 797010 ... 3.83 POLYGON ((-102.1064122399267 22.06035441303033... 3.19 Aguascalientes Aguascalientes 12.1 20.4 48.0 -1.63691 164
1 0 0 0 0 0 0 2 0 1 45492 ... 5.49 POLYGON ((-102.051893439036 22.29143529350413,... 6.75 Aguascalientes Asientos 19.9 28.9 56.8 -0.95642 3
2 0 0 0 0 0 0 0 0 4 54136 ... 8.93 POLYGON ((-102.6856884472506 22.09962730886253... 8.15 Aguascalientes Calvillo 24.9 35.2 62.5 -1.12218 4
3 0 1 0 0 0 0 0 0 0 15042 ... 4.18 POLYGON ((-102.287865181776 22.41649003941679,... 6.71 Aguascalientes Cosío 14.8 22.6 49.8 -1.07846 1
4 0 1 0 1 0 3 1 0 4 99590 ... 5.69 POLYGON ((-102.3356775711373 22.05066521496391... 5.33 Aguascalientes Jesús María 18.7 28.4 55.8 -1.21094 10

5 rows × 23 columns

Para empezar, podemos pensar que la cantidad de desaparecidos puede estar correlacionada con la cantidad de habitantes. Probemos modelar esto a nivel estatal con una regresión lineal simple:


In [9]:
import statsmodels.formula.api as sm
model = sm.OLS(estatal['total_des'], estatal['POB1'])
result = model.fit()
print result.summary()


                            OLS Regression Results                            
==============================================================================
Dep. Variable:              total_des   R-squared:                       0.362
Model:                            OLS   Adj. R-squared:                  0.341
Method:                 Least Squares   F-statistic:                     17.58
Date:                Wed, 30 Mar 2016   Prob (F-statistic):           0.000213
Time:                        17:14:49   Log-Likelihood:                -264.36
No. Observations:                  32   AIC:                             530.7
Df Residuals:                      31   BIC:                             532.2
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
POB1           0.0002   3.68e-05      4.193      0.000      7.92e-05     0.000
==============================================================================
Omnibus:                       54.060   Durbin-Watson:                   2.280
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              358.575
Skew:                           3.529   Prob(JB):                     1.37e-78
Kurtosis:                      17.803   Cond. No.                         1.00
==============================================================================

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

Lo primero que hicimos fue importar el paquete que contiene los modelos estadísticos. Luego utilizamos un Ordinary Least Squares para hacer nuestra regresión lineal.

Examinando los resultados, lo primero que podemos ver es que la población explica relativamente poco la cantidad de desaparecidos, aunque la relación es significativa.

¿Sucederá lo mismo a nivel municipal?


In [10]:
model = sm.OLS(municipal['total_des'], municipal['POB1'])
result = model.fit()
#model = ols(y=estatal['total_des'], x=estatal['POB1'])
print result.summary()


                            OLS Regression Results                            
==============================================================================
Dep. Variable:              total_des   R-squared:                       0.377
Model:                            OLS   Adj. R-squared:                  0.377
Method:                 Least Squares   F-statistic:                     1484.
Date:                Wed, 30 Mar 2016   Prob (F-statistic):          2.45e-254
Time:                        17:14:49   Log-Likelihood:                -12616.
No. Observations:                2454   AIC:                         2.523e+04
Df Residuals:                    2453   BIC:                         2.524e+04
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
POB1           0.0002   5.94e-06     38.525      0.000         0.000     0.000
==============================================================================
Omnibus:                     5183.169   Durbin-Watson:                   1.819
Prob(Omnibus):                  0.000   Jarque-Bera (JB):         22846988.603
Skew:                          17.810   Prob(JB):                         0.00
Kurtosis:                     474.353   Cond. No.                         1.00
==============================================================================

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

En este caso, la población a nivel municipal explica aproximadamente el mismo porcentaje de la varianza del total de desaparecidos que a nivel estatal.

Ejercicio:

Hagan varias regresiones, usando diferentes variables que crean que pueden explicar la cantidad de desaparecidos. Comparen los resultados a nivel estatal y municipal

También podemos hacer pensar en modelos un poco más complicados, por ejemplo, regresiones multivariadas. En un primer experimento, podemos modelar la cantidad de desaparecidos a partir de la población y de el índice de rezago, primero a nivel estatal:


In [11]:
import statsmodels.formula.api as sm
model = sm.ols(formula="total_des ~ POB1 + rezago",data=estatal).fit()
print model.summary()


                            OLS Regression Results                            
==============================================================================
Dep. Variable:              total_des   R-squared:                       0.094
Model:                            OLS   Adj. R-squared:                  0.031
Method:                 Least Squares   F-statistic:                     1.503
Date:                Wed, 30 Mar 2016   Prob (F-statistic):              0.239
Time:                        17:14:49   Log-Likelihood:                -263.50
No. Observations:                  32   AIC:                             533.0
Df Residuals:                      29   BIC:                             537.4
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept    364.9309    303.269      1.203      0.239      -255.325   985.187
POB1           0.0001    5.9e-05      1.730      0.094     -1.86e-05     0.000
rezago       -63.8026    263.004     -0.243      0.810      -601.706   474.100
==============================================================================
Omnibus:                       56.834   Durbin-Watson:                   2.381
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              403.695
Skew:                           3.767   Prob(JB):                     2.18e-88
Kurtosis:                      18.685   Cond. No.                     9.42e+06
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 9.42e+06. This might indicate that there are
strong multicollinearity or other numerical problems.

Nota: Como pueden ver, statsmodels nos está avisando que tenemos un Condition Number demasiado grande y que esto puede estar indicando que tenemos un problema de colineridad. Esto querría decir que algunas de nuestras varaibles están muy correlacionadas y por lo tanto no deberían usarse en este modelo.

Para ver si este es el caso, podemos examinar la matriz de correlación, en particular sus eigenvalores para ver si tenemos coinearidad:


In [12]:
import numpy as np 
corr = estatal[['POB1','rezago','total_des']].corr()
w, v = np.linalg.eig(corr)
print w


[ 1.37833882  0.64155697  0.98010421]

Lo que hicimos aquí fue importar la librería numpy, que incluye métodos de álgebra lineal. Luego calculamos la matriz de correlaciones usando Pandasy, finalomente, calculamos los eigenvalores de dicha matriz. Como ninguno de los eigenvalores es cercano a cero, podemos concluir que no tenemos un problema de colinearidad y que, por lo tanto, el Condition Number grande se debe a problemas numéricos. En este caso, podemos pensar que estos problemas derivan del hecho de que la variable POB1 tiene valores mucho más grandes que las otras dos. Intentemos reescalar las variables:


In [13]:
vars_estatal =  estatal[['POB1','rezago','total_des']]
vars_estatal_norm = (vars_estatal - vars_estatal.mean()) / (vars_estatal.std())
print vars_estatal_norm.min()
print vars_estatal_norm.max()
print vars_estatal_norm.mean()
print vars_estatal_norm.std()


POB1        -0.963812
rezago      -1.046468
total_des   -0.682803
dtype: float64
POB1         3.912732
rezago       2.716219
total_des    4.602350
dtype: float64
POB1        -3.469447e-18
rezago       1.769418e-16
total_des   -6.938894e-18
dtype: float64
POB1         1.0
rezago       1.0
total_des    1.0
dtype: float64

Lo que hicimos aquí fue reescalar los valores de nuestras variables para que la media esté centrada en cero y lo que cuantificamos es la desviación de la media con respecto al rango.

Ahora veamos si esta transformación de los datos nos sirve para resolver el problema del Condition Number:


In [14]:
model = sm.ols(formula="total_des ~ POB1 + rezago",data=vars_estatal_norm)
result = model.fit()
print result.summary()


                            OLS Regression Results                            
==============================================================================
Dep. Variable:              total_des   R-squared:                       0.094
Model:                            OLS   Adj. R-squared:                  0.031
Method:                 Least Squares   F-statistic:                     1.503
Date:                Wed, 30 Mar 2016   Prob (F-statistic):              0.239
Time:                        17:14:50   Log-Likelihood:                -43.320
No. Observations:                  32   AIC:                             92.64
Df Residuals:                      29   BIC:                             97.04
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept   1.388e-17      0.174   7.98e-17      1.000        -0.356     0.356
POB1           0.3126      0.181      1.730      0.094        -0.057     0.682
rezago        -0.0438      0.181     -0.243      0.810        -0.413     0.326
==============================================================================
Omnibus:                       56.834   Durbin-Watson:                   2.381
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              403.695
Skew:                           3.767   Prob(JB):                     2.18e-88
Kurtosis:                      18.685   Cond. No.                         1.24
==============================================================================

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

Bien, ahora tenemos un Condition Number perfectamente aceptable y, por lo tanto, podemos tener confianza en nuestros resultados.

Repliquemos el proceso para la escala municipal:


In [15]:
vars_municipal =  municipal[['POB1','rezago','total_des']]
vars_municipal_norm = (vars_municipal - vars_municipal.mean()) / (vars_municipal.std())
model = sm.ols(formula="total_des ~ POB1 + rezago",data=vars_municipal_norm)
result = model.fit()
print result.summary()


                            OLS Regression Results                            
==============================================================================
Dep. Variable:              total_des   R-squared:                       0.361
Model:                            OLS   Adj. R-squared:                  0.360
Method:                 Least Squares   F-statistic:                     691.8
Date:                Wed, 30 Mar 2016   Prob (F-statistic):          6.31e-239
Time:                        17:14:50   Log-Likelihood:                -2932.4
No. Observations:                2454   AIC:                             5871.
Df Residuals:                    2451   BIC:                             5888.
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept   3.086e-16      0.016   1.91e-14      1.000        -0.032     0.032
POB1           0.5909      0.017     34.986      0.000         0.558     0.624
rezago        -0.0310      0.017     -1.837      0.066        -0.064     0.002
==============================================================================
Omnibus:                     5166.321   Durbin-Watson:                   1.824
Prob(Omnibus):                  0.000   Jarque-Bera (JB):         22602566.489
Skew:                          17.673   Prob(JB):                         0.00
Kurtosis:                     471.831   Cond. No.                         1.35
==============================================================================

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

Ahora sí estamos obteniendo algunos resultados interesantes: mientras que a nivel estatal la $ R^2 $ es 0.094, en el caso municipal es de 0.36 ¡Un orden de magnitud más grande! Además, la influencia del rezago (el valor del coeficiente), es un orden de magnitud menor para el caso municipal que para el caso estatal. ¿Qué quiere decir esto? ¿Cuál es la verdadera influencia del rezago en la cantidad de desaparecidos?

Ejercicio:

Utilicen diferentes combinaciones de las variables disponibes para tratar de explicar mejor el total de desaparecidos, repitan sus ejercicios a nivel estatal y municipal. Recuerden que tienen que reescalar los datos

Un último refinamiento

Hasta el momento hemos trabajado con los datos de total de desaparecidos ¿Sería muy diferente si trabajáramos con tasas? Repitamos los ejercicios usando ahora, como variable dependiente, la tasa de desaparecidos por cada 100,000 habitantes. El primer paso es, por supuesto, calcular dicha tasa y agregarla como columna a nuestros datos:


In [16]:
tasa = estatal['total_des'].divide(estatal['POB1'])*100000
tasa.head()


Out[16]:
0    16.118198
1    23.961434
2     3.453548
3     9.119195
4    44.826227
dtype: float64

La sintaxis es quizá un poco extraña, pero lo que estamos haciendo es realmente sencillo: a la columna total_des la estamos dividiendo por la columna POB1, elemento por elemento. Es importante ver que lo que obtenemos no es un DataFrame sino una serie (SERIES), que es un tipo más simple quie sólo tiene una columna y un índice. Para poder unir el resultado a los datos, necesitamos convertir la serie en un DataFrame y proceder de la misma forma en que lo hicimos con el total de desaparecidos:


In [17]:
tasa_df = pd.DataFrame(tasa,columns=['tasa'])
estatal = pd.merge(estatal,tasa_df,left_index=True, right_index=True)
estatal.head()


Out[17]:
2006 2007 2008 2009 2010 2011 2012 2013 2014 POB1 ... ed_basica estado geometry no_escuela pob_alimen pob_capaci pob_patrim rezago total_des tasa
0 0 25 7 20 18 30 14 15 62 1184996 ... 41.83 Aguascalientes POLYGON ((-102.2878651817759 22.41649003941765... 4.53 14.9 23.6 51.1 1.14451 191 16.118198
1 0 7 25 11 8 19 128 177 381 3155070 ... 38.94 Baja California (POLYGON ((-115.2104851485454 28.3722493563768... 4.77 1.3 2.3 9.2 0.66364 756 23.961434
2 0 0 2 1 3 2 3 8 3 637026 ... 38.92 Baja California Sur (POLYGON ((-109.8006324469839 24.1492608586424... 4.03 4.7 8.0 23.5 0.48199 22 3.453548
3 0 0 5 0 1 0 0 10 59 822441 ... 49.00 Campeche POLYGON ((-90.37935699678101 20.84832728853007... 5.11 20.0 27.3 51.4 0.32493 75 9.119195
4 1 55 102 117 227 258 136 233 103 2748391 ... 38.13 Coahuila de Zaragoza POLYGON ((-102.3107926469074 29.87694857356086... 3.84 8.6 15.2 41.0 1.25058 1232 44.826227

5 rows × 22 columns

La única diferencia es que ahora utilizamos los índices (left_index=True, right_index=True), como la condición para el merge, ya que no tenemos columnas en común pero sabemos que los datos están bien ordenados.

Una primera pregunta es si la tasa de desaparecidos está correacionada con la población:

Como era de esperarse, la influencia de la cantidad de población sobre la tasa es menor que sobre el total ¿por qué?

Ahora sí, podemos volver a correr nuestros modelos:


In [18]:
vars_estatal =  estatal[['POB1','rezago','total_des','tasa']]
vars_estatal_norm = (vars_estatal - vars_estatal.mean()) / (vars_estatal.max() - vars_estatal.min())
model = sm.ols(formula="tasa ~ POB1 + rezago",data=vars_estatal_norm)
result = model.fit()
print result.summary()


                            OLS Regression Results                            
==============================================================================
Dep. Variable:                   tasa   R-squared:                       0.000
Model:                            OLS   Adj. R-squared:                 -0.068
Method:                 Least Squares   F-statistic:                  0.006383
Date:                Wed, 30 Mar 2016   Prob (F-statistic):              0.994
Time:                        17:14:51   Log-Likelihood:                 10.075
No. Observations:                  32   AIC:                            -14.15
Df Residuals:                      29   BIC:                            -9.753
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept  -1.778e-17      0.033  -5.42e-16      1.000        -0.067     0.067
POB1          -0.0184      0.166     -0.111      0.912        -0.358     0.321
rezago         0.0002      0.128      0.002      0.999        -0.262     0.262
==============================================================================
Omnibus:                       58.224   Durbin-Watson:                   2.358
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              439.486
Skew:                           3.864   Prob(JB):                     3.69e-96
Kurtosis:                      19.428   Cond. No.                         5.21
==============================================================================

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

¡Ahora no explicamos absolutamente nada de la variable dependiente!

¿Y en la escala municipal?


In [19]:
tasa = municipal['total_des'].divide(municipal['POB1'])*100000
tasa_df = pd.DataFrame(tasa,columns=['tasa'])
tasa_df.head()
municipal = pd.merge(municipal,tasa_df,left_index=True, right_index=True)
vars_municipal =  municipal[['POB1','rezago','total_des','tasa']]
vars_municipal_norm = (vars_municipal - vars_municipal.mean()) / (vars_municipal.max() - vars_municipal.min())
model = sm.ols(formula="tasa ~ POB1 + rezago",data=vars_municipal_norm)
result = model.fit()
print result.summary()


                            OLS Regression Results                            
==============================================================================
Dep. Variable:                   tasa   R-squared:                       0.044
Model:                            OLS   Adj. R-squared:                  0.044
Method:                 Least Squares   F-statistic:                     56.87
Date:                Wed, 30 Mar 2016   Prob (F-statistic):           7.18e-25
Time:                        17:14:51   Log-Likelihood:                 5098.1
No. Observations:                2454   AIC:                        -1.019e+04
Df Residuals:                    2451   BIC:                        -1.017e+04
Df Model:                           2                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
Intercept  -7.818e-18      0.001  -1.28e-14      1.000        -0.001     0.001
POB1           0.0026      0.009      0.298      0.766        -0.015     0.020
rezago        -0.0420      0.004    -10.107      0.000        -0.050    -0.034
==============================================================================
Omnibus:                     5157.631   Durbin-Watson:                   1.566
Prob(Omnibus):                  0.000   Jarque-Bera (JB):         24261762.774
Skew:                          17.558   Prob(JB):                         0.00
Kurtosis:                     488.845   Cond. No.                         14.5
==============================================================================

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

Obviemente, también en la escala municipal explicamos mucho menos con nuestro modelo!

Ejercicio:

Planteen un modelo usando las variables disponibles que explique mejor las tasas de desaparecidos. Igual que en el ejercicio anterior, repitan el análisis para las dos escalas.


In [ ]: