Este es el primero de varios talleres introductorios al procesamiento y limpieza de datos. En este estaremos usando como ambiente de trabajo a Jupyter, que permite crear documentos con cĆ³digo y prosa, ademĆ”s de almacenar resultados de las operaciones ejecutadas (cĆ”lculos, graficas, etc). Jupyter permite interactuar con varios lenguajes de programaciĆ³n, en este, usaremos Python, un lenguaje de programaciĆ³n bastante simple y poderoso, con acceso a una gran variedad de librerias para procesamiento de datos. Entre estas, estĆ” Pandas, una libreria que nos da acceso a estructuras de datos muy poderosas para manipular datos.
Ā”Comenzemos entonces!
Para poder ejecutar este Notebook, necesitas tener instalado Python 3, el cual corre en todos los sistemas operativos actuales, sin embargo, para instalar las dependencias: Pandas y Jupyter.
Puedes leerte para mas detalles: [https://es.schoolofdata.org/2017/07/20/preparate-para-aprender-python-guia-de-instalacion-de-bibliotecas/)%5Bes.schoolofdata.org/2017/07/20/preparate-para-aprender-python-guia-de-instalacion-de-bibliotecas/]
Recomiendo utilizar la distribuciĆ³n Anaconda https://www.continuum.io/downloads en su version para Python 3, esta incluye instalado Jupyter, Pandas, Numpy y Scipy, y mucho otro software Ćŗtil. Sigue las instrucciones en la documentacion de Anaconda para configurar un ambiente de desarollo con Jupyter. https://docs.continuum.io/anaconda/navigator/getting-started.html
Una vez instalado, prueba a seguir los paso de https://www.tutorialpython.com/modulos-python/ o tu tutorial de Python Favorito.
Te recomiendo utilizar Python 3.6 o superior, instalar la version mas reciente posible de virtualenv y pip. Usa Git para obtener el codigo, crea un nuevo entorno de desarollo y ahi instala las dependencias necesarias.
~/$ cd notebooks
~/notebooks/$ git clone https://github.com/tian2992/notebooks_dateros.git
~/notebooks/$ cd notebooks_dateros/
~/notebooks/notebooks_dateros/$
~/notebooks/notebooks_dateros/$ virtualenv venv/
~/notebooks/notebooks_dateros/$ source venv/bin/activate
~/notebooks/notebooks_dateros/$ pip install -r requirements.txt
~/notebooks/notebooks_dateros/$ cd 01-Intro
~/notebooks/notebooks_dateros/$ 7z e municipal_guatemala_2008-2011.7z
~/notebooks/notebooks_dateros/$ jupyter-notebook
## En Jupyter Notebooks existen varios tipos de celdas, las celdas de cĆ³digo, como esta:
print(1+1)
print(5+4)
6+4
2 9
10
Y las celdas de texto, que se escriben en Markdown y son hechas para humanos. Pueden incluir negritas, itƔlicas Entre otros tipos de estilos. Tambien pueden incluirse imagenes o incluso interactivos. E incluso Mates como en $ \LaTeX $ con ecuaciones y todo... $$ \begin{align} i\hbar\frac{\partial}{\partial t} \Psi(\mathbf{r},\,t) = \hat H \Psi = \left(-\frac{\hbar^2}{2m}\nabla^2 + V(\mathbf{r})\right)\Psi(\mathbf{r},\,t) \end{align} $$
%pylab inline
import seaborn as sns
import pandas as pd
pd.set_option('precision', 5)
Populating the interactive namespace from numpy and matplotlib
Con estos comandos, cargamos a nuestro entorno de trabajo las librerias necesarias.
Usemos la funcion de pandas read_csv
para cargar los datos. Esto crea un DataFrame
, una unidad de datos en Pandas, que nos da mucha funcionalidad y tiene bastantes propiedades convenientes para el anĆ”lisis. Probablemente esta operaciĆ³n tome un tiempo asi que sigamos avanzando, cuando estĆ© lista, verĆ”s que el numero de la celda habrĆ” sido actualizado.
muni_data = pd.read_csv("municipal_guatemala_2008-2011.zip",
sep=";",
compression='zip',\
error_bad_lines=False)
/usr/lib/python3.6/site-packages/IPython/core/interactiveshell.py:2728: DtypeWarning: Columns (19) have mixed types. Specify dtype option on import or set low_memory=False. interactivity=interactivity, compiler=compiler, result=result)
muni_data.head()
ANNO | ADMINISTRACIĆN | MUNICIPIO | DEPTO | MUN | FUNC1 | FUNC2 | FUNC3 | ECON1 | ECON2 | ... | ORIGEN2 | ORIGEN3 | PROGRAMA1 | PROGRAMA2 | PROYECTO1 | PROYECTO2 | APROBADO | RETRASADO | EJECUTADO | PAGADO | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 21 Ingresos Tributarios Iva Paz | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.- | Q.137,400.00 | Q.137,400.00 | Q.137,400.00 |
1 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 21 Ingresos Tributarios Iva Paz | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.- | Q.- | Q.- | Q.- |
2 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 22 Ingresos Ordinarios De Aporte Constitucional | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.- | Q.- | Q.- | Q.- |
3 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 31 Ingresos Propios | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.240,000.00 | Q.49,588.00 | Q.49,588.00 | Q.49,588.00 |
4 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 42 PrƩstamos Internos | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.- | Q.- | Q.- | Q.- |
5 rows Ć 21 columns
Aqui podemos ver el dataframe que creamos. En Pandas, los DataFrames son unidades bƔsicas, junto con las Series.
Veamos una serie muy sencilla antes de pasar a evaluar muni_data
, el DataFrame que acabamos de crear. Crearemos una serie de numeros aleatorios, y usaremos funciones estadisticas para analizarlo.
serie_prueba_s = pd.Series(np.random.randn(5), name='prueba')
print(serie_prueba_s)
print(serie_prueba_s.describe())
serie_prueba_s.plot()
0 -0.29208 1 0.60887 2 -0.46073 3 0.49752 4 -1.87143 Name: prueba, dtype: float64 count 5.00000 mean -0.30357 std 0.99465 min -1.87143 25% -0.46073 50% -0.29208 75% 0.49752 max 0.60887 Name: prueba, dtype: float64
<matplotlib.axes._subplots.AxesSubplot at 0x7f6a247e3828>
Con esto podemos ver ya unas propiedades muy interesantes. Las series estĆ”n basadas en el concepto estadistico, pero incluyen un tĆtulo (del eje), un Ćndice (el cual identifica a los elementos) y el dato en sĆ, que puede ser numerico (float), string unicode (texto) u otro tipo de dato.
Las series estan basadas tambien en conceptos de vectores, asi que se pueden realizar operaciones vectoriales en las cuales implicitamente se alinean los indĆces, esto es muy util por ejemplo para restar dos columnas, sin importar el tamaƱo de ambas, automaticamente Pandas unirĆ” inteligentemente ambas series. Puedes tambien obtener elementos de las series por su valor de Ćndice, o por un rango, usando la notaciĆ³n usual en Python. Como nota final, las Series comparten mucho del comportamiento de los NumPy Arrays, haciendolos instantaneamente compatibles con muchas librerias y recursos. https://pandas.pydata.org/pandas-docs/stable/dsintro.html#series
serie_prueba_d = pd.Series(np.random.randn(5), name='prueba 2')
print(serie_prueba_d)
print(serie_prueba_d[0:3]) # Solo los elementos del 0 al 3
# Esto funciona porque ambas series tienen indices en comĆŗn.
# Si sumamos dos con tamaƱos distintos, los espacios vacios son marcados como NaN
serie_prueba_y = serie_prueba_d + (serie_prueba_s * 2)
print(serie_prueba_y)
print("La suma de la serie y es: {suma}".format(suma=serie_prueba_y.sum()))
0 0.10866 1 0.11014 2 0.02647 3 -3.46728 4 -0.12676 Name: prueba 2, dtype: float64 0 0.10866 1 0.11014 2 0.02647 Name: prueba 2, dtype: float64 0 -0.47551 1 1.32789 2 -0.89500 3 -2.47223 4 -3.86963 dtype: float64 La suma de la serie y es: -6.384475154382741
Pasemos ahora a DataFrames, como nuestro muni_data DataFrame. Los DataFrames son estructuras bi-dimensionales de datos. Son muy usadas porque proveen una abstracciĆ³n similar a una hoja de calculo o a una tabla de SQL. Los DataFrame tienen Ćndices (etiquetas de fila) y columnas, ambos ejes deben encajar, y el resto serĆ” llenado de datos no validos.
Por ejemplo podemos unir ambas series y crear un DataFrame nuevo, usando un diccionario de Python, por ejemplo. Tambien podemos graficar los resultados.
prueba_dict = {
"col1": serie_prueba_s,
"col2": serie_prueba_d,
"col3": [1, 2, 3, 4, 0]
}
prueba_data_frame = pd.DataFrame(prueba_dict)
print(prueba_data_frame)
# La operacion .sum() ahora retorna un DataFrame, pero Pandas sabe no combinar peras con manzanas.
print("La suma de cada columna es: \n{suma}".format(suma=prueba_data_frame.sum()))
prueba_data_frame.plot()
col1 col2 col3 0 -0.29208 0.10866 1 1 0.60887 0.11014 2 2 -0.46073 0.02647 3 3 0.49752 -3.46728 4 4 -1.87143 -0.12676 0 La suma de cada columna es: col1 -1.51785 col2 -3.34878 col3 10.00000 dtype: float64
<matplotlib.axes._subplots.AxesSubplot at 0x7f6a2e2407f0>
Veamos ahora ya, nuestro DataFrame creado con los datos, muni_data.
#muni_data
# Una grafica bastante inutil, Āæporque?
muni_data.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f6a2e2b0898>
# Veamos los datos, limitamos a solo los primeros 5 filas.
muni_data.head(5)
ANNO | ADMINISTRACIĆN | MUNICIPIO | DEPTO | MUN | FUNC1 | FUNC2 | FUNC3 | ECON1 | ECON2 | ... | ORIGEN2 | ORIGEN3 | PROGRAMA1 | PROGRAMA2 | PROYECTO1 | PROYECTO2 | APROBADO | RETRASADO | EJECUTADO | PAGADO | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 21 Ingresos Tributarios Iva Paz | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.- | Q.137,400.00 | Q.137,400.00 | Q.137,400.00 |
1 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 21 Ingresos Tributarios Iva Paz | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.- | Q.- | Q.- | Q.- |
2 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 22 Ingresos Ordinarios De Aporte Constitucional | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.- | Q.- | Q.- | Q.- |
3 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 31 Ingresos Propios | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.240,000.00 | Q.49,588.00 | Q.49,588.00 | Q.49,588.00 |
4 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 42 PrƩstamos Internos | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.- | Q.- | Q.- | Q.- |
5 rows Ć 21 columns
## La columna 'APROBADO' se ve un poco sospechosa.
## Python toma a los numeros como nĆŗmeros, no con una Q ni un punto (si no lo tiene) ni comas innecesarias.
## Veamos mas a detalle.
muni_data['APROBADO'].head()
0 Q.- 1 Q.- 2 Q.- 3 Q.240,000.00 4 Q.- Name: APROBADO, dtype: object
# Vamos a ignorar esto por un momento, pero los nĆŗmeros de verdad son de tipo float
Veamos cuantas columnas son, podemos explorar un poco mas asi.
muni_data.columns
Index(['ANNO', 'ADMINISTRACIĆN', 'MUNICIPIO', 'DEPTO', 'MUN', 'FUNC1', 'FUNC2', 'FUNC3', 'ECON1', 'ECON2', 'ORIGEN1', 'ORIGEN2', 'ORIGEN3', 'PROGRAMA1', 'PROGRAMA2', 'PROYECTO1', 'PROYECTO2', 'APROBADO', 'RETRASADO', 'EJECUTADO', 'PAGADO'], dtype='object')
muni_data['MUNICIPIO'].unique()[:5] # Listame 5 municipios
array(['ALOTENANGO', 'AMATITLAN', 'ATESCATEMPA', 'AYUTLA', 'CABAĆAS'], dtype=object)
print("Funcion 1: \n {func1} \n Funcion 2: \n {func2} \n Funcion 3: \n{func3}".format(
func1=muni_data["FUNC1"].unique(),
func2=muni_data["FUNC2"].unique(),
func3=muni_data["FUNC3"].unique()
)
)
Funcion 1: ['1 - ADMINISTRACION GENERAL' '3 - SERVICIOS SOCIALES' '2 - DEFENSA Y SEGURIDAD INTERNA' 'Sin Finalidad' '4 - SERVICIOS ECONOMICOS' '5 - DEUDA PUBLICA' '6 - OTROS NO CLASIFICABLES' '01 - SERVICIOS PUBLICOS GENERALES' '08 - SALUD' '07 - URBANIZACION Y SERVICIOS COMUNITARIOS' '05 - ASUNTOS ECONOMICOS' '06 - PROTECCION AMBIENTAL' '10 - EDUCACION' '12 - TRANSACCIONES DE LA DEUDA PUBLICA' '03 - ORDEN PUBLICO Y SEGURIDAD CIUDADANA' '09 - ACTIVIDADES DEPORTIVAS, RECREATIVAS, CULTURA Y RELIGION' '11 - PROTECCION SOCIAL' '04 - ATENCION A DESASTRES Y GESTION DE RIESGOS' '02 - DEFENSA'] Funcion 2: ['109 - OTRAS ACTIVIDADES DE ADMINISTRACION' '306-AGUA Y SANEAMIENTO' '309-MEDIO AMBIENTE' '303-EDUCACION' '202-SEGURIDAD INTERNA' '304-CULTURA Y DEPORTES' '301-SALUD Y ASISTENCIA SOCIAL' 'Sin Funcion' '404-TRANSPORTE' '405-INDUSTRIA Y COMERCIO' '409-OTRAS ACTIVIDADES DE SERVICIOS ECONOMICOS' '106-ADMINISTRACION FISCAL' '406-TURISMO' '310-OTRAS ACTIVIDADES DE SERVICIOS SOCIALES' '402-ENERGIA' '403-COMUNICACIONES' '302-TRABAJO Y PREVISION SOCIAL' '107-AUDITORIA Y CONTROL' '501-INTERESES, COMISIONES Y OTROS GASTOS' '201-DEFENSA' '601-AMORTIZACION DE DEUDA' '407-AGROPECUARIO' '101-LEGISLATIVA' '307-VIVIENDA' '308-DESARROLLO URBANO Y RURAL' '401-MINERIA E HIDROCARBUROS' '408-FINANCIERAS Y SEGUROS' '602-DISMINUCION DE OTROS PASIVOS' '603-OTROS GASTOS' '103-DIRECCION GUBERNAMENTAL' '108-SERVICIOS GENERALES' '104-RELACIONES INTERIORES' '102-JUDICIAL' '305-CIENCIA Y TECNOLOGIA' '105-RELACIONES EXTERIORES' '0101 - Administracion legislative, ejecutiva y asuntos exteriores' '0803 - Servicios hospitalarios' '0703 - Abastecimiento de agua' '0502 - Agricultura, produccion pecuaria, silvicultura, caza y pesca' '0505 - Transporte' '0602 - OrdenaciĆ³n de aguas residuales' '0702 - Desarrollo comunitario' '1002 - EducaciĆ³n media' '1001 - EducaciĆ³n preprimaria y primaria' '0805 - InvestigaciĆ³n y desarrollo relacionados con la Salud' '0503 - Combustibles y energia' '1201 - Intereses y comisiones de la deuda pĆŗblica' '1202 - Amortizaciones de deuda pĆŗblica' '0102 - Administracion fiscal, monetaria y servicios de fiscalizacion' '0501 - Asuntos econĆ³micos y comerciales en general' '0104 - Servicios generales' '0107 - Servicios pĆŗblicos generales n.c.d' '0302 - AdministraciĆ³n de justicia' '0301 - Servicios de policĆa y seguridad ciudadana' '0901 - Servicios deportivos y de recreaciĆ³n ' '0906 - Actividades deportivas, recreativas, cultura y religiĆ³n n.c.d. (SC)' '0705 - InvestigaciĆ³n y desarrollo relacionados con urbanizaciĆ³n y servicios comunitarios' '0106 - InvestigaciĆ³n y desarrollo relacionados con los servicios pĆŗblicos generales' '0606 - ProtecciĆ³n ambiental n.c.d' '0601 - OrdenaciĆ³n de desechos' '1104 - Familia e hijos' '0704 - Alumbrado pĆŗblico' '1102 - Edad avanzada' '0902 - Servicios culturales (SI)' '0806 - Salud n.c.d' '0804 - Servicios de salud pĆŗblica' '0701 - Urbanizacion' '0507 - Otras actividades economicas y financieras' '0303 - DefensorĆa pĆŗblica penal y de los derechos humanos' '1005 - EducaciĆ³n no atribuible a ningĆŗn nivel escolarizado' '0105 - InvestigaciĆ³n bĆ”sica' '0604 - ProtecciĆ³n de la diversidad biolĆ³gica y del paisaje' '0404 - AtenciĆ³n a Desastres y GestiĆ³n de Riesgos n.c.d' '0401 - Servicios de prevenciĆ³n y control de incendios, y servicios de rescate y auxilio' '1007 - InvestigaciĆ³n y desarrollo relacionados con la educaciĆ³n' '1008 - EducaciĆ³n n.c.d' '0603 - ReducciĆ³n de la contaminaciĆ³n' '0402 - GestiĆ³n prospectiva de riesgos a desastres' '0706 - UrbanizaciĆ³n y servicios comunitarios n.c.d' '1106 - Vivienda' '0504 - Mineria, manufacturas y construccion' '0201 - Defensa militar' '0802 - Servicios para paciente externos' '1003 - EducaciĆ³n postmedia bĆ”sica y diversificada no universitaria o superior' '0903 - Servicios de radio y televisiĆ³n y servicios editoriales (SC)' '0605 - InvestigaciĆ³n y desarrollo relacionados con la protecciĆ³n ambiental' '1004 - EducaciĆ³n universitaria o superior' '0103 - Ayuda economica exterior' '1109 - ProtecciĆ³n social n.c.d' '0506 - Comunicaciones' '0801 - Productos, utiles y equipos medicos' '0509 - Asuntos econĆ³micos n.c.d' '0307 - Orden pĆŗblico y seguridad ciudadana n.c.d' '0202 - Defensa civil' '0904 - Servicios religiosos y otros servicios comunitarios (SC)' '1006 - Servicios auxiliares de la educaciĆ³n ' '0905 - InvestigaciĆ³n y desarrollo relacionados con el esparcimiento, cultura y religiĆ³n' '1107 - Otros riesgos de exclusiĆ³n social' '1101 - Enfermedad, funcionamiento corporal y discapacidad' '0403 - InvestigaciĆ³n y desarrollo relacionados con la AtenciĆ³n a Desastres y GestiĆ³n de Riesgos' '1103 - Sobrevivientes (pensionados)' '0205 - Defensa n.c.d.' '0508 - InvestigaciĆ³n y desarrollo relacionados con asuntos econĆ³micos' '1105 - Desempleo' '0306 - InvestigaciĆ³n y desarrollo relacionados con el orden pĆŗblico y seguridad ciudadana' '0304 - AdministraciĆ³n de asuntos penitenciarios'] Funcion 3: ['Sin Division' '010102-Ejecutiva' '080303-Servicios mĆ©dicos y de centros de maternidad' '070301-Abastecimiento de agua' '050204-ProducciĆ³n pecuaria (SC)' '050501-Transporte por carretera' '060201-OrdenaciĆ³n de aguas residuales' '070201-Desarrollo comunitario' '100201-EducaciĆ³n bĆ”sica' '100102-EducaciĆ³n primaria' '100103-AlfabetizaciĆ³n' '080501-InvestigaciĆ³n y desarrollo relacionados con la Salud' '050306-Electricidad' '120101-Intereses y comisiones de la deuda pĆŗblica' '120201-Amortizaciones de deuda pĆŗblica' '010101-Legislativa' '010201-Asuntos fiscales' '050103-Asuntos laborales generales' '010402-Servicios generales de planificaciĆ³n' '010203-Servicios de fiscalizaciĆ³n' '010404-Otros servicios generales' '010701-Servicios pĆŗblicos generales n.c.d' '050202-Silvicultura' '050101-Asuntos econĆ³micos y comerciales en general' '030201-AdministraciĆ³n de justicia' '030101-Servicios de policĆa y seguridad ciudadana' '100101-EducaciĆ³n preprimaria' '100202-EducaciĆ³n diversificada' '090101-Servicios deportivos (SI)' '090601-Actividades deportivas, recreativas, cultura y religiĆ³n n.c.d. (SC)' '070501-InvestigaciĆ³n y desarrollo relacionados con urbanizaciĆ³n y servicios comunitarios' '010601-InvestigaciĆ³n y desarrollo relacionados con los servicios pĆŗblicos generales' '060601-ProtecciĆ³n ambiental n.c.d' '060101-OrdenaciĆ³n de desechos' '110401-Familia e hijos' '070401-Alumbrado pĆŗblico' '110201-Edad avanzada' '090201-Servicios culturales (SI)' '050302-PetrĆ³leo y gas natural' '080601-Salud n.c.d' '080401-Servicios de salud pĆŗblica' '090102-Servicios de recreaciĆ³n (SI)' '070101-Urbanizacion' '010401-AdministraciĆ³n general del recurso humano' '050701-Comercio, distribuciĆ³n, almacenamiento y depĆ³sito' '030301-DefensorĆa pĆŗblica penal' '100501-EducaciĆ³n no atribuible a ningĆŗn nivel escolarizado' '010501-InvestigaciĆ³n bĆ”sica' '050505-Transporte por oleoductos y gasoductos' '050201-Agricultura' '060401-ProtecciĆ³n de la diversidad biolĆ³gica y del paisaje' '080301-Servicios hospitalarios generales' '040401-AtenciĆ³n a Desastres y GestiĆ³n de Riesgos n.c.d' '040101-Servicios de prevenciĆ³n y control de incendios, y servicios de rescate y auxilio' '100701-InvestigaciĆ³n y desarrollo relacionados con la educaciĆ³n' '100801-EducaciĆ³n n.c.d' '010202-Asuntos monetarios' '060301-ReducciĆ³n de la contaminaciĆ³n' '040201-GestiĆ³n prospectiva de riesgos a desastres' '070601-UrbanizaciĆ³n y servicios comunitarios n.c.d' '110601-Vivienda' '050402-Manufacturas' '020101-Defensa militar' '010403-Servicios generales de estadĆstica' '080201-Servicios mĆ©dicos generales' '100301-EducaciĆ³n postmedia bĆ”sica y diversificada no universitaria o superior' '090301-Servicios de radio y televisiĆ³n y servicios editoriales (SC)' '060501-InvestigaciĆ³n y desarrollo relacionados con la protecciĆ³n ambiental' '100401-Primera etapa de la educaciĆ³n universitaria o superior' '010301-Ayuda econĆ³mica a los paĆses en desarrollo y en transiciĆ³n' '050506-Otros sistemas de transporte' '040202-GestiĆ³n correctiva o compensatoria de desastres' '110901-ProtecciĆ³n social n.c.d' '050601-Comunicaciones' '080101-Productos farmacĆ©uticos' '010103-Asuntos exteriores' '080302- Servicios hospitalarios especializados' '050403-ConstrucciĆ³n' '050102-SupervisiĆ³n financiera' '050901-Asuntos econĆ³micos n.c.d' '030701-Orden pĆŗblico y seguridad ciudadana n.c.d' '020201-Defensa civil' '050707-Proyectos de desarrollo polivalentes' '090401-Servicios religiosos y otros servicios comunitarios (SC)' '080202-Servicios mĆ©dicos especializados' '080204-Servicios paramĆ©dicos' '100601-Servicios auxiliares de la educaciĆ³n preprimaria y primaria' '080103-Aparatos y equipos terapĆ©uticos' '090501-InvestigaciĆ³n y desarrollo relacionados con el esparcimiento, cultura y religiĆ³n' '080102-Otros productos mĆ©dicos' '050401-ExtracciĆ³n de recursos minerales excepto los combustibles minerales' '110701-Otros riesgos de exclusiĆ³n social' '100603-Servicios auxiliares de la educaciĆ³n postmedia bĆ”sica y diversificada no universitaria o superior' '050502-Transporte por agua' '050301-CarbĆ³n y otros combustibles minerales sĆ³lidos' '110101-Enfermedad' '080203-Servicios odontolĆ³gicos' '040301-InvestigaciĆ³n y desarrollo relacionados con la AtenciĆ³n a Desastres y GestiĆ³n de Riesgos' '110901-InvestigaciĆ³n y desarrollo relacionados con la ProtecciĆ³n Social' '100402-Segunda etapa de la educaciĆ³n universitaria o superior' '050203-Caza y pesca' '050303-Combustibles nucleares' '050307-EnergĆa no elĆ©ctrica' '050704-IntermediaciĆ³n financiera' '110301-Sobrevivientes (pensionados)' '050305-Otros combustibles' '020501-Defensa n.c.d.' '080304-Servicios de salud y residencias a personas de la tercera edad y residencias de convalecencia' '050702-Hoteles y restaurantes' '050703-Turismo' '050801-InvestigaciĆ³n y desarrollo relacionados con asuntos econĆ³micos, comerciales y laborales en general' '030302-DefensorĆa de los derechos humanos' '110501-Desempleo' '050805-InvestigaciĆ³n y desarrollo relacionados con el transporte' '050803-InvestigaciĆ³n y desarrollo relacionados con combustibles y energĆa' '110102-Funcionamiento corporal y discapacidad' '050706-Seguros y fianzas' '050504-Transporte aĆ©reo' '030601-InvestigaciĆ³n y desarrollo relacionados con el orden pĆŗblico y seguridad ciudadana' '050503-Transporte por ferrocarril' '030401-AdministraciĆ³n de asuntos penitenciarios' '100602-Servicios auxiliares de la educaciĆ³n media' '100604-Servicios auxiliares de la educaciĆ³n universitaria o superior' '010302-Ayuda econĆ³mica prestada a travĆ©s de organismos internacionales' '050802-InvestigaciĆ³n y desarrollo relacionados con agricultura, producciĆ³n pecuaria, silvicultura, caza y p']
Vamos a explorar un poco con indices y etiquetas:
index_geo_data = muni_data.set_index("DEPTO","MUNICIPIO").sort_index()
index_geo_data.loc[
["GUATEMALA","ESCUINTLA","SACATEPEQUEZ"],
['FUNC1','FUNC2','FUNC3','APROBADO','EJECUTADO']
].head()
FUNC1 | FUNC2 | FUNC3 | APROBADO | EJECUTADO | |
---|---|---|---|---|---|
DEPTO | |||||
GUATEMALA | 01 - SERVICIOS PUBLICOS GENERALES | 0101 - Administracion legislative, ejecutiva y... | 010102-Ejecutiva | Q.34,180.00 | NaN |
GUATEMALA | 01 - SERVICIOS PUBLICOS GENERALES | 0101 - Administracion legislative, ejecutiva y... | 010102-Ejecutiva | Q.42,000.00 | NaN |
GUATEMALA | 01 - SERVICIOS PUBLICOS GENERALES | 0101 - Administracion legislative, ejecutiva y... | 010102-Ejecutiva | Q.42,000.00 | NaN |
GUATEMALA | 01 - SERVICIOS PUBLICOS GENERALES | 0101 - Administracion legislative, ejecutiva y... | 010102-Ejecutiva | Q.320,000.00 | NaN |
GUATEMALA | 01 - SERVICIOS PUBLICOS GENERALES | 0101 - Administracion legislative, ejecutiva y... | 010102-Ejecutiva | Q.1,000.00 | NaN |
Ahora que podemos realizar selecciĆ³n basica, pensamos, que podemos hacer con estos datos, y nos enfrentamos a un problema...
muni_data['APROBADO'][3] * 2
' Q.240,000.00 Q.240,000.00 '
Ā”Rayos! porque no puedo manipular estos datos asĆ como los otros, y es porque son de tipo texto y no nĆŗmeros.
# muni_data['APROBADO'].sum() ## No correr, falla...
Necesitamos crear una funcion para limpiar estos tipos de dato que son texto, para poderlos convertir a numeros de tipo punto flotante (decimales).
## Esto es una funcion en Python, con def definimos el nombre de esta funcion, 'clean_q'
## esta recibe un objeto de entrada.
def clean_q(input_object):
from re import sub ## importamos la funciĆ³n sub, que substituye utilizando patrones
## https://es.wikipedia.org/wiki/ExpresiĆ³n_regular
## NaN es un objeto especial que representa un valor numƩrico invalido, Not A Number.
if input_object == NaN:
return 0
inp = unicode(input_object) # De objeto a un texto
cleansed_q = sub(r'Q\.','', inp) # Remueve Q., el slash evita que . sea interpretado como un caracter especial
cleansed_00 = sub(r'\.00', '', cleansed_q) # Igual aqui
cleansed_comma = sub(',', '', cleansed_00)
cleansed_dash = sub('-', '', cleansed_comma)
cleansed_nonchar = sub(r'[^0-9]+', '', cleansed_dash)
if cleansed_nonchar == '':
return 0
return cleansed_nonchar
presupuesto_aprobado = muni_data['APROBADO'].map(clean_q).astype(float)
presupuesto_aprobado.describe()
count 6.74135e+05 mean 3.64625e+05 std 8.43016e+06 min 0.00000e+00 25% 0.00000e+00 50% 1.00000e+03 75% 1.50000e+04 max 1.43719e+09 Name: APROBADO, dtype: float64
muni_data['EJECUTADO'].head()
0 Q.137,400.00 1 Q.- 2 Q.- 3 Q.49,588.00 4 Q.- Name: EJECUTADO, dtype: object
muni_data['FUNC1'].str.upper().value_counts()
1 - ADMINISTRACION GENERAL 150541 01 - SERVICIOS PUBLICOS GENERALES 107911 SIN FINALIDAD 100862 3 - SERVICIOS SOCIALES 96451 4 - SERVICIOS ECONOMICOS 65763 07 - URBANIZACION Y SERVICIOS COMUNITARIOS 40349 05 - ASUNTOS ECONOMICOS 38126 10 - EDUCACION 18584 06 - PROTECCION AMBIENTAL 17359 09 - ACTIVIDADES DEPORTIVAS, RECREATIVAS, CULTURA Y RELIGION 11929 03 - ORDEN PUBLICO Y SEGURIDAD CIUDADANA 7137 08 - SALUD 5707 12 - TRANSACCIONES DE LA DEUDA PUBLICA 3470 11 - PROTECCION SOCIAL 3338 6 - OTROS NO CLASIFICABLES 2565 2 - DEFENSA Y SEGURIDAD INTERNA 1662 04 - ATENCION A DESASTRES Y GESTION DE RIESGOS 1179 5 - DEUDA PUBLICA 1073 02 - DEFENSA 129 Name: FUNC1, dtype: int64
presupuesto_aprobado.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f6a25005cf8>
Bueno, ahora ya tenemos estas series de datos convertidas. Āæcomo las volvemos a agregar al dataset? Ā”Facil! lo volvemos a insertar al DataFrame original, sobreescribiendo esa columna.
for col in ('APROBADO', 'RETRASADO', 'EJECUTADO', 'PAGADO'):
muni_data[col] = muni_data[col].map(clean_q).astype(float)
muni_data['APROBADO'].sum()
245806713741.0
muni_data.head()
ANNO | ADMINISTRACIĆN | MUNICIPIO | DEPTO | MUN | FUNC1 | FUNC2 | FUNC3 | ECON1 | ECON2 | ... | ORIGEN2 | ORIGEN3 | PROGRAMA1 | PROGRAMA2 | PROYECTO1 | PROYECTO2 | APROBADO | RETRASADO | EJECUTADO | PAGADO | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 21 Ingresos Tributarios Iva Paz | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | 0.0 | 137400.0 | 137400.0 | 137400.0 |
1 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 21 Ingresos Tributarios Iva Paz | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | 0.0 | 0.0 | 0.0 | 0.0 |
2 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 22 Ingresos Ordinarios De Aporte Constitucional | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | 0.0 | 0.0 | 0.0 | 0.0 |
3 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 31 Ingresos Propios | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | 240000.0 | 49588.0 | 49588.0 | 49588.0 |
4 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | ... | 42 PrƩstamos Internos | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | 0.0 | 0.0 | 0.0 | 0.0 |
5 rows Ć 21 columns
muni_data['ECON1'].unique()
array(['21 Gastos Corrientes', '22 Gastos de Capital', '23 Aplicaciones Financieras'], dtype=object)
Ahora si, Ā”ya podemos agrupar y hacer indices bien!
index_geo_data = muni_data.set_index("DEPTO","MUNICIPIO").sort_index()
index_geo_data.head(4)
ANNO | ADMINISTRACIĆN | MUNICIPIO | MUN | FUNC1 | FUNC2 | FUNC3 | ECON1 | ECON2 | ORIGEN1 | ORIGEN2 | ORIGEN3 | PROGRAMA1 | PROGRAMA2 | PROYECTO1 | PROYECTO2 | APROBADO | RETRASADO | EJECUTADO | PAGADO | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
DEPTO | ||||||||||||||||||||
ALTA VERAPAZ | 2011 | Municipal | CAHABON | CAHABON | 01 - SERVICIOS PUBLICOS GENERALES | 0101 - Administracion legislative, ejecutiva y... | 010101-Legislativa | 21 Gastos Corrientes | 062 - Dietas Para Cargos Representativos | No Aplica | No Aplica | No Aplica | 1 - ACTIVIDADES CENTRALES | 0 - SIN SUB PROGRAMA | 0 - SIN PPROYECTO | 1 - CONCEJO MUNICIPAL | Q.169,600.00 | Q.169,600.00 | NaN | Q.167,987.50 |
ALTA VERAPAZ | 2009 | Municipal | CHAHAL | CHAHAL | 3 - SERVICIOS SOCIALES | 306-AGUA Y SANEAMIENTO | Sin Division | 22 Gastos de Capital | 331 - Construcciones De Bienes Nacionales De U... | 20 Recursos Del Tesoro Con AfectaciĆ³n Especifica | 21 Ingresos Tributarios Iva Paz | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.- | Q.10,450.00 | Q.- | Q.- |
ALTA VERAPAZ | 2009 | Municipal | CHAHAL | CHAHAL | 3 - SERVICIOS SOCIALES | 301-SALUD Y ASISTENCIA SOCIAL | Sin Division | 22 Gastos de Capital | 331 - Construcciones De Bienes Nacionales De U... | 30 Recursos Propios De Las Instituciones | 31 Ingresos Propios | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.- | Q.45.20 | Q.- | Q.- |
ALTA VERAPAZ | 2009 | Municipal | CHAHAL | CHAHAL | 3 - SERVICIOS SOCIALES | 301-SALUD Y ASISTENCIA SOCIAL | Sin Division | 22 Gastos de Capital | 331 - Construcciones De Bienes Nacionales De U... | 30 Recursos Propios De Las Instituciones | 31 Ingresos Propios | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | Q.- | Q.10.20 | Q.- | Q.- |
mi_muni_d = muni_data.set_index(["ANNO"],["DEPTO","MUNICIPIO"],["FUNC1","ECON1","ORIGEN1"]).sort_index()
mi_muni_d.head()
ADMINISTRACIĆN | MUNICIPIO | DEPTO | MUN | FUNC1 | FUNC2 | FUNC3 | ECON1 | ECON2 | ORIGEN1 | ORIGEN2 | ORIGEN3 | PROGRAMA1 | PROGRAMA2 | PROYECTO1 | PROYECTO2 | APROBADO | RETRASADO | EJECUTADO | PAGADO | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ANNO | |||||||||||||||||||||
0 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | 20 Recursos Del Tesoro Con AfectaciĆ³n Especifica | 21 Ingresos Tributarios Iva Paz | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | 0.0 | 137400.0 | 137400.0 | 137400.0 |
1 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | 20 Recursos Del Tesoro Con AfectaciĆ³n Especifica | 21 Ingresos Tributarios Iva Paz | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | 0.0 | 0.0 | 0.0 | 0.0 |
2 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | 20 Recursos Del Tesoro Con AfectaciĆ³n Especifica | 22 Ingresos Ordinarios De Aporte Constitucional | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | 0.0 | 0.0 | 0.0 | 0.0 |
3 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | 30 Recursos Propios De Las Instituciones | 31 Ingresos Propios | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | 240000.0 | 49588.0 | 49588.0 | 49588.0 |
4 | 2008 | Municipal | ALOTENANGO | SACATEPEQUEZ | ALOTENANGO | 1 - ADMINISTRACION GENERAL | 109 - OTRAS ACTIVIDADES DE ADMINISTRACION | Sin Division | 21 Gastos Corrientes | 011 - Personal Permanente | 40 Credito Interno | 42 PrƩstamos Internos | No Aplica | No Aplica | No Aplica | No Aplica | No Aplica | 0.0 | 0.0 | 0.0 | 0.0 |
## Para obtener mas ayuda, ejecuta:
# help(mi_muni_d)
mi_muni_d.columns
Index(['ADMINISTRACIĆN', 'MUNICIPIO', 'DEPTO', 'MUN', 'FUNC1', 'FUNC2', 'FUNC3', 'ECON1', 'ECON2', 'ORIGEN1', 'ORIGEN2', 'ORIGEN3', 'PROGRAMA1', 'PROGRAMA2', 'PROYECTO1', 'PROYECTO2', 'APROBADO', 'RETRASADO', 'EJECUTADO', 'PAGADO'], dtype='object')
mi_muni_d["DEPTO"].describe()
count 674135 unique 22 top GUATEMALA freq 55520 Name: DEPTO, dtype: object
year_grouped = mi_muni_d.groupby("ANNO").sum()
year_grouped
APROBADO | RETRASADO | EJECUTADO | PAGADO | |
---|---|---|---|---|
ANNO | ||||
2008 | 2.68353e+10 | 2.45634e+11 | 4.14921e+11 | 4.12270e+11 |
2009 | 5.31561e+10 | 2.99390e+11 | 4.81259e+11 | 4.77409e+11 |
2010 | 7.32193e+10 | 3.28068e+11 | 0.00000e+00 | 5.26614e+11 |
2011 | 9.25959e+10 | 3.39514e+11 | 0.00000e+00 | 5.42302e+11 |
year_dep_grouped = mi_muni_d.groupby(["ANNO","DEPTO"]).sum()
year_dep_grouped.head()
sns.set(style="whitegrid")
# Draw a nested barplot to show survival for class and sex
g = sns.factorplot( data=year_dep_grouped,
size=6, kind="bar", palette="muted")
# g.despine(left=True)
g.set_ylabels("cantidad")
<seaborn.axisgrid.FacetGrid at 0x7f6a25d5c7f0>
year_dep_grouped.head()
APROBADO | RETRASADO | EJECUTADO | PAGADO | ||
---|---|---|---|---|---|
ANNO | DEPTO | ||||
2008 | ALTA VERAPAZ | 2.78291e+09 | 1.46371e+10 | 1.63018e+10 | 1.61846e+10 |
BAJA VERAPAZ | 6.13609e+08 | 6.77458e+09 | 6.57817e+09 | 6.56299e+09 | |
CHIMALTENANGO | 9.42927e+08 | 8.63124e+09 | 1.30331e+10 | 1.30252e+10 | |
CHIQUIMULA | 5.74758e+08 | 7.30016e+09 | 7.62139e+09 | 7.59232e+09 | |
EL PROGRESO | 3.53643e+08 | 5.29144e+09 | 7.06977e+09 | 7.03881e+09 |
Ahora ya podemos contestar algunas clases de preguntas agrupando estas entradas individuales de de datos. ĀæQue tal el departamento que tiene mas gasto en Seguridad? ĀæLos tipos de gasto mas elevados como suelen ser pagados?
year_grouped.plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f6a2b6f7898>
year_dep_group = mi_muni_d.groupby(["DEPTO","ANNO"]).sum()
year_dep_group.unstack().head()
APROBADO | RETRASADO | EJECUTADO | PAGADO | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ANNO | 2008 | 2009 | 2010 | 2011 | 2008 | 2009 | 2010 | 2011 | 2008 | 2009 | 2010 | 2011 | 2008 | 2009 | 2010 | 2011 |
DEPTO | ||||||||||||||||
ALTA VERAPAZ | 2.78291e+09 | 5.64744e+09 | 1.95357e+10 | 2.12952e+10 | 1.46371e+10 | 2.09176e+10 | 3.22332e+10 | 3.77961e+10 | 1.63018e+10 | 2.18337e+10 | 0.0 | 0.0 | 1.61846e+10 | 2.15977e+10 | 2.06492e+10 | 2.38565e+10 |
BAJA VERAPAZ | 6.13609e+08 | 1.93412e+09 | 1.55609e+09 | 3.10721e+09 | 6.77458e+09 | 7.40240e+09 | 9.37046e+09 | 1.15378e+10 | 6.57817e+09 | 7.00557e+09 | 0.0 | 0.0 | 6.56299e+09 | 6.97541e+09 | 8.10811e+09 | 1.04986e+10 |
CHIMALTENANGO | 9.42927e+08 | 2.36969e+09 | 2.95906e+09 | 2.63505e+09 | 8.63124e+09 | 9.65804e+09 | 9.83285e+09 | 8.07592e+09 | 1.30331e+10 | 1.19265e+10 | 0.0 | 0.0 | 1.30252e+10 | 1.17757e+10 | 1.27430e+10 | 1.25867e+10 |
CHIQUIMULA | 5.74758e+08 | 7.94670e+08 | 2.40722e+09 | 3.12491e+09 | 7.30016e+09 | 7.01026e+09 | 9.74311e+09 | 8.95407e+09 | 7.62139e+09 | 7.77514e+09 | 0.0 | 0.0 | 7.59232e+09 | 7.68196e+09 | 9.47250e+09 | 9.48921e+09 |
EL PROGRESO | 3.53643e+08 | 9.42015e+08 | 1.98337e+09 | 2.09171e+09 | 5.29144e+09 | 6.41684e+09 | 6.02155e+09 | 6.51524e+09 | 7.06977e+09 | 7.01621e+09 | 0.0 | 0.0 | 7.03881e+09 | 6.94013e+09 | 8.77785e+09 | 8.27554e+09 |
func_p = mi_muni_d.groupby(["FUNC1"]).sum()
func_dep = mi_muni_d.groupby(["FUNC1","DEPTO"]).sum()
func_p
APROBADO | RETRASADO | EJECUTADO | PAGADO | |
---|---|---|---|---|
FUNC1 | ||||
01 - SERVICIOS PUBLICOS GENERALES | 2.12896e+10 | 9.39864e+10 | 0.00000e+00 | 1.46451e+11 |
02 - DEFENSA | 7.65149e+06 | 4.85768e+07 | 0.00000e+00 | 1.15252e+08 |
03 - ORDEN PUBLICO Y SEGURIDAD CIUDADANA | 1.54112e+09 | 4.62692e+09 | 0.00000e+00 | 9.71618e+09 |
04 - ATENCION A DESASTRES Y GESTION DE RIESGOS | 2.02693e+08 | 1.46343e+09 | 0.00000e+00 | 1.90633e+09 |
05 - ASUNTOS ECONOMICOS | 3.53597e+10 | 1.16573e+11 | 0.00000e+00 | 1.08795e+11 |
06 - PROTECCION AMBIENTAL | 6.82913e+09 | 2.43591e+10 | 0.00000e+00 | 3.15289e+10 |
07 - URBANIZACION Y SERVICIOS COMUNITARIOS | 2.35510e+10 | 9.90229e+10 | 0.00000e+00 | 1.12771e+11 |
08 - SALUD | 1.79933e+09 | 6.12886e+09 | 0.00000e+00 | 7.90331e+09 |
09 - ACTIVIDADES DEPORTIVAS, RECREATIVAS, CULTURA Y RELIGION | 2.02757e+09 | 1.08670e+10 | 0.00000e+00 | 1.33765e+10 |
1 - ADMINISTRACION GENERAL | 2.22609e+10 | 1.53756e+11 | 2.87329e+11 | 2.86671e+11 |
10 - EDUCACION | 7.38670e+09 | 2.92963e+10 | 0.00000e+00 | 3.05241e+10 |
11 - PROTECCION SOCIAL | 6.06386e+08 | 7.10021e+09 | 0.00000e+00 | 1.26944e+10 |
12 - TRANSACCIONES DE LA DEUDA PUBLICA | 1.94713e+10 | 6.97031e+10 | 0.00000e+00 | 8.69565e+10 |
2 - DEFENSA Y SEGURIDAD INTERNA | 2.69279e+08 | 1.41168e+09 | 1.11557e+10 | 1.11701e+10 |
3 - SERVICIOS SOCIALES | 2.46567e+10 | 1.48437e+11 | 2.16065e+11 | 2.13887e+11 |
4 - SERVICIOS ECONOMICOS | 2.27707e+10 | 1.67108e+11 | 2.47066e+11 | 2.43517e+11 |
5 - DEUDA PUBLICA | 2.54276e+09 | 1.80157e+10 | 2.89121e+10 | 2.89121e+10 |
6 - OTROS NO CLASIFICABLES | 6.22515e+09 | 4.34632e+10 | 9.32827e+10 | 9.31423e+10 |
Sin Finalidad | 4.70091e+10 | 2.17238e+11 | 1.23702e+10 | 5.18558e+11 |
func_dep_flat = func_dep.unstack()
func_dep_flat.head()
APROBADO | ... | PAGADO | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
DEPTO | ALTA VERAPAZ | BAJA VERAPAZ | CHIMALTENANGO | CHIQUIMULA | EL PROGRESO | ESCUINTLA | GUATEMALA | HUEHUETENANGO | IZABAL | JALAPA | ... | QUETZALTENANGO | QUICHE | RETALHULEU | SACATEPEQUEZ | SAN MARCOS | SANTA ROSA | SOLOLA | SUCHITEPEQUEZ | TOTONICAPAN | ZACAPA |
FUNC1 | |||||||||||||||||||||
01 - SERVICIOS PUBLICOS GENERALES | 2.65028e+09 | 5.44695e+08 | 6.02520e+08 | 1.45687e+09 | 5.06434e+08 | 1.82266e+09 | 4.99280e+09 | 1.26883e+09 | 1.95440e+08 | 4.06992e+08 | ... | 5.56908e+09 | 3.55170e+09 | 3.88756e+09 | 1.42191e+10 | 6.86290e+09 | 5.26960e+09 | 5.25078e+09 | 3.65925e+09 | 1.48548e+09 | 7.83247e+09 |
02 - DEFENSA | 0.00000e+00 | 4.18211e+06 | NaN | 1.25551e+06 | NaN | 8.25311e+05 | 0.00000e+00 | NaN | NaN | 5.80000e+05 | ... | 6.50000e+01 | 4.45000e+04 | NaN | NaN | NaN | 2.81500e+04 | NaN | NaN | NaN | 0.00000e+00 |
03 - ORDEN PUBLICO Y SEGURIDAD CIUDADANA | 4.15592e+08 | 2.73807e+06 | 1.73070e+07 | 1.20563e+08 | 3.46200e+05 | 8.40011e+06 | 7.54022e+07 | 8.85087e+07 | 1.34582e+06 | 4.66579e+07 | ... | 1.11593e+09 | 9.09038e+07 | 3.09004e+08 | 2.05695e+09 | 2.18261e+07 | 1.47161e+07 | 2.27009e+08 | 8.04501e+08 | 3.30255e+07 | 5.84190e+08 |
04 - ATENCION A DESASTRES Y GESTION DE RIESGOS | 1.65910e+06 | 1.21105e+06 | 1.55504e+06 | 1.00000e+05 | 0.00000e+00 | 1.09773e+08 | 1.60380e+07 | 7.50000e+04 | 8.19824e+05 | 1.25000e+05 | ... | 3.74758e+06 | 1.42707e+07 | 2.55000e+04 | 1.97266e+08 | 8.83148e+07 | 1.64157e+05 | 2.05584e+08 | 1.63782e+08 | 2.30420e+07 | 3.34638e+08 |
05 - ASUNTOS ECONOMICOS | 2.18998e+10 | 9.96920e+08 | 8.61639e+08 | 5.23307e+08 | 7.35246e+07 | 1.12597e+09 | 6.27814e+08 | 3.92554e+09 | 4.30563e+08 | 9.99355e+07 | ... | 9.02544e+09 | 5.93387e+09 | 3.12895e+09 | 5.35538e+09 | 5.26815e+09 | 1.59234e+09 | 4.55446e+09 | 2.28815e+09 | 1.23100e+09 | 1.34795e+09 |
5 rows Ć 88 columns
Graficando
func_p.plot(kind="barh", figsize=(8,6), linewidth=2.5)
<matplotlib.axes._subplots.AxesSubplot at 0x7f6a2b77c518>
Vemos entonces que sobre estas categorias, hay una jerarquia bastante clara: los gastos administrativos, servicios economicos y sociales son los mas asignados. Usando un clustermap (una variaciĆ³n de mapas choropleto) podemos ver estos valores.
g = sns.clustermap(func_p)