In [1]:
%matplotlib nbagg
%pylab


Using matplotlib backend: nbAgg
Populating the interactive namespace from numpy and matplotlib

Levanto la data


In [2]:
import pandas as pd
from urllib import urlopen

with open('indicadores.csv', 'w') as f:
    f.write(urlopen('http://blog.jazzido.com/indicadoresEducativosAR/indicadores.csv').read())
    
df = pd.read_csv('indicadores.csv').set_index('id')

Acceso a los datos


In [3]:
def get_series(df, nivel, variable):
    """
    Construye un diccionario, donde los keys son los lugares (i.e. buenos aires) y los values son una serie de tiempo
    que corresponde a los valores asociados al nivel y variable
    """
    res = {}
    for place, row in df.iterrows():
        index = []
        values = []
        for year in xrange(2003, 2010):
            key = '{variable}{year}_{nivel}'.format(**locals())
            index.append(year)
            values.append(row[key])
        res[place] = pd.Series(values,index=index)
    return res

Calculo de una estadística sencilla

El porcentaje de cambio entre el 2003 y el 2009 respecto a la tasa de promocion por provincia

Calculo el cambio relativo entre 2003 y 2009 para algunos niveles


In [4]:
from collections import defaultdict

def get_stats(relativas):
    niveles = 'egb_1 egb_2 egb_3 egb_4 egb_5 egb_6 egb_7 egb_8 egb_9'.split()
    diffs = defaultdict(dict)

    for nivel in niveles:
        for place, series in get_series(df, nivel, 'promocion').iteritems():
            diff = (series.loc[2009] - series.loc[2003])
            if relativas: diff /= series.loc[2003]
                
            diffs[place][nivel] = diff

    return diffs

Luego visualizo esto en un grafico de barras por provincia

Es muy interesante ver como algunas provincias son parejas (como Santiago del Estero) en los distintos niveles, mientras otras estan totalmente desbalanceadas (como La Rioja)


In [6]:
# Imprimo los resultados, de "mejores" a "peores"
def plot_diff(place, place_data, relativas):
    place_data = sorted(place_data.iteritems(), key=lambda x:int(x[0].split('_')[1]))
    for i, (nivel, diff) in enumerate(place_data):
        bar(i, diff * (100 if relativas else 1), alpha=0.5)

    ylabel_text = 'Porcentaje de cambio' if relativas else 'Cambio absoluto'
    title_text = '{} entre 2003 y 2009 en promocion'.format(ylabel_text)

    title(title_text)
    ylabel(ylabel_text)
        
    xticks(range(len(place_data)), zip(*place_data)[0], rotation=45)
    grid()

relativas = True
rel_diffs = get_stats(relativas=relativas)

for place, place_data in sorted(rel_diffs.iteritems(), key=lambda x:-sum(x[1].values())):
    figure()
    suptitle(place)
    plot_diff(place, place_data, relativas=relativas)


/Library/Python/2.7/site-packages/matplotlib/pyplot.py:516: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_open_warning`).
  max_open_warning, RuntimeWarning)

In [16]:
import seaborn as sns
all_values = []
for place, place_data in rel_diffs.iteritems():
    all_values.extend(place_data.itervalues())
figure()
sns.distplot(all_values, hist=True, bins=20)
percentiles = np.percentile(all_values, [5, 50, 95])
vlines(percentiles, 0, 12, linestyles='--', alpha=0.5)


Out[16]:
<matplotlib.collections.LineCollection at 0x11144ae10>

In [31]:
print "Provincias destacadas"
print
lbound, _, ubound = percentiles

to_print = []

for place, place_data in rel_diffs.iteritems():
    worst_level, worst_score = min(place_data.items(), key=lambda x:x[1])
    best_level, best_score = max(place_data.items(), key=lambda x:x[1])
    
    if worst_score <= lbound:
        to_print.append(
            {
                'text': '{:<30s}Tiene problemas en {}'.format(place, worst_level),
                'order': 0
            }
        )
        
    if best_score >= ubound:
        to_print.append(
            {
                'text': '{:<30s}Anda bien en {}'.format(place, best_level),
                'order': 1
            }
        )

to_print.sort(key=lambda x:x['order'])
for doc in to_print:
    print doc['text']


Provincias destacadas

CHUBUT                        Tiene problemas en egb_9
TUCUMAN                       Tiene problemas en egb_7
SANTA FE                      Tiene problemas en egb_9
SANTIAGO DEL ESTERO           Tiene problemas en egb_8
FORMOSA                       Tiene problemas en egb_7
SALTA                         Tiene problemas en egb_7
TIERRA DEL FUEGO              Tiene problemas en egb_7
CORRIENTES                    Tiene problemas en egb_8
RIO NEGRO                     Anda bien en egb_9
ENTRE RIOS                    Anda bien en egb_9
TUCUMAN                       Anda bien en egb_9
LA RIOJA                      Anda bien en egb_9
FORMOSA                       Anda bien en egb_1
MISIONES                      Anda bien en egb_9