En general cuando se tienen algo de información, una vez que se carga lo que se hace es explorarla. Esto desde mi práctica es al inicio conocer el tipo de varibles, rangos, missing values, etc. Después hacer un poco de exploración gráfica para ir conociendo las posibles relaciones entre variables, en caso de tratar de construir algún modelo o para hacer algunas modificaciones entre los datos. En lo personal, pienso que primero uno debe de jugar un poco con los datos y luego empezar a preguntarse cosas.
Cargo datos relacionados con los ingresos proporcionados por SHCP, se eligen algunas columnas para trabajar la información y se exploran las relaciones entre los montos registrados por mes, año, mes-año y año-sector. La intención es responder las siguientes preguntas sencillas:
Para conocer los detalles de los datos usados en el ejemplo se puede consultar información en el link siguiente:
In [26]:
#Se prepara el entorno de trabajo
%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
#matplotlib.style.use('ggplot') se puede correr este código para usar gráficos del tipo de ggplot2 en R
plt.rcParams['figure.figsize']=(20,7)
# -*- coding: utf-8 -*-
In [34]:
#Se cargan los datos desde un directorio
Ingresos=pd.read_csv('/Datos/Ingreso.csv')
In [35]:
Ingresos.head()
Out[35]:
In [25]:
#Cantidad de filas y columnas.
Ingresos.shape
Out[25]:
In [5]:
#Descripción en general de las variables
Ingresos.info()
In [6]:
#Con dtypes es facil ver el tipo de dato que se tienen en las variables
Ingresos.dtypes
Out[6]:
In [36]:
#Se seleccionan las columnas que yo considero más importates. En este caso Ciclo, Mes, Nombre, Tema, Sector
# y Monto, son a mi parecer los más relevantes.
#Si solo se deseara elegir una sola columna, se usaría Ingresos['Nombre de la columna']
Ingresos_2=Ingresos[['CICLO','MES','NOMBRE','TEMA','SECTOR','MONTO']]
In [37]:
Ingresos_2.head()
Out[37]:
Con la muestra de datos que se define en Ingresos_2, la idea es procesarla y explorar los datos. Esto de manera sencilla implica conocer los tipos de variables, que ya se hizo con el comando info(). Pero lo que se puede buscar es hacer un análisis exploratorio sencillo. Esto tanto de manera gráfica, como de manera de estruturas de datos. Para revisar las posibles relaciones entre los montos y los años o alguna otra variable, se hace uso de agrupaciones. Con esto se hace cierto resumen entre las variables.
In [8]:
#Para responder ¿cuál es el año con mayor monto registrado? se hace la siguente agrupación.
Grupo_1=Ingresos_2.groupby('CICLO')
In [9]:
#La cantidad de registros para cada año
Grupo_1.size()
Out[9]:
In [10]:
Grupo_1.sum()
Out[10]:
La misma idea se puede hacer con respecto a los meses para conocer como se comportan los montos. Esto ayuda a responder la pregunta, *¿qué mes tiene la media más alta en montos?
In [11]:
Grupo_2=Ingresos_2.groupby('MES')
In [12]:
#La cantidad de registros en cada mes
Grupo_2.size()
Out[12]:
In [13]:
Grupo_2.mean()
Out[13]:
Lo que se observa del grupo anterior es que al ver la media, muestra los valores para MONTO y CICLO. La cuestion es que CICLO es tomada como una variable numérica cuando se cargan los datos y al hacer la agrupación respecto a los meses muestra la media de las variables numéricas. Para que solo se muestren los valores de la suma de los montos, se hace del siguiente modo:
In [14]:
Grupo_2.mean()['MONTO']
Out[14]:
In [15]:
#Si uno desea saber cual es el mes con la media de montos mayor, basta elegir el máximo de los valores de las medias al
#ordenarlas. En este caso corresponde al mes de Diciembre.
Grupo_2['MONTO'].mean().sort_values()[-1:]
Out[15]:
In [16]:
#Agrupamos la información por años y mes para conocer como se comportan los montos
Grupo_3=Ingresos_2.groupby(['CICLO','MES'])
In [17]:
#Vemos el valor de la suma de los montos
Grupo_3.sum()
Out[17]:
Para elegir los 5 registros con los montos más alta, hacemos la siguiente selección al Grupo_3
In [18]:
Grupo_3.sum().sort_values(by='MONTO')[-5:]
Out[18]:
In [38]:
#Se puede revisar como se comporta por CICLO y SECTOR, elegimos los 15 registros con valor más
# alto en la suma de su MONTO
Ingresos_2.groupby(['CICLO','SECTOR']).sum().sort_values(by='MONTO')[-15:]
Out[38]:
In [20]:
#Graficamos el resultado anterior.
Ingresos_2.groupby(['CICLO','SECTOR']).sum().sort_values(by='MONTO')[-15:].plot(kind='bar')
Out[20]:
Los anteriores ejemplos, muestran como resolver preguntas sencillas donde se involugra algun variable categórica y su relación con otra numérica. Se pueden hacer agrupaciones más sofisticadas, donde se buscar ver la relación de más de 2 variables; ejemplo de Ciclo, Mes y Sector.
Lo que se puede hacer con los ejemplos anteriores; las agrupaciones, es mostrar ejemplos de como explorar gráficamente las muestras de datos procesadas y los datos originales. La única finalidad de las siguientes gráficas es explorar el comportamiento de los datos, sin tener una pregunta a investigar de manera inicial.
In [23]:
Grupo_1['MONTO'].agg([np.size,sum,max,min])
Out[23]:
In [25]:
#El comportamiento entre máximo y mínimos
Grupo_1['MONTO'].agg([max,min]).plot(kind='bar')
Out[25]:
In [29]:
#Se explora como se comporta la agrupación por mes por medio de una gráfica de barras.
Grupo_2['MONTO'].agg([max,min,np.mean])
Out[29]:
In [38]:
#Los datos originales, permiten explorar gráficamente como se relacionan los valors de los montos con respecto a los meses.
sns.barplot(data=Ingresos_2,x="MES",y="MONTO",palette="PRGn")
Out[38]:
In [61]:
#También se puede explorar con los datos agrupados por Año-Mes el comportamiento de los máximos, mínimos y la media de los montos
Grupo_3['MONTO'].agg([max,min,np.mean]).plot(title='Comportamiento de la suma de los Montos')
Out[61]:
Nota: Los anteriores ejemplos solo muestran como hacer agrupaciones para concentrar información con respecto alga o algunas variables, esto ayuda hacer una exploración sencilla sobre los datos. Se pueden hacer más fina la exploración y procesamiento, pero no es la intención del ejemplo. Las preguntas que se responden no son para nada cosas sofisticadas y los gráficos que agrego son solo a manera de ejemplos de qué tipo de gráficos construir con el tipo de datos que se cargaron, esto gráficos se pueden adherir algun reporte para visualizar el tipo de respuestas a las preguntas; ¿cuál fue el mes con mayor media de ingresos?, ¿en qué año y mes se registan los máximos mas altos en los ingresos?, etc.
Para mayor detalle de las propiedades del módulo Pandas la recomendación es consultar la página oficial