Etiqueta: Pandas

Diagrama de Caja con Python

Diagrama de Caja con Python

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp

La estadística descriptiva nos ayuda a visualizar de forma rápida las características de la distribución en un grupo de datos (dataset), por medio de los valores de importancia de una forma simplificada, logrando tener un mejor entendimiento de la información colectada (Potter, 2016).

Por esta razón el diagrama de caja es una de las visualizaciones de datos utilizadas en la estadística descriptiva, permitiendo realizar análisis sin extraer conclusiones, por medio del resumen de los cinco valores que representa este tipo de diagrama (Faraldo y Pateiro, 2012; Anderson et al., 2016).

Anderson et al. (2016) hacen mención de que estos cinco valores son:

  1. Valor menor del conjunto de datos
  2. Primer Cuartil (Q1)
  3. Mediana (Q2)
  4. Tercer Cuartil (Q3)
  5. Valor mayor del conjunto de datos

Para entender un diagrama de caja y su elaboración con Matplotlib y Plotly utilizando Python, estaremos utilizando como datos de prueba la edad de las zarigüeyas extraído de Kaggle desde el siguiente link: https://www.kaggle.com/abrambeyer/openintro-possum, también el archivo de datos CSV se encuentra disponible en el repositorio de GitHub: https://github.com/sdesignca/blog-ps-diagrama-caja-python

Entendiendo un Diagrama de Caja

Antes de elaborar el diagrama de caja con Matplotlib y Plotly, definiremos de forma breve los conceptos básicos y los cálculos de los valores utilizados para esbozar un diagrama de caja, de una forma práctica. Por lo que estaremos utilizando los siguientes datos que corresponden a la edad de las zarigüeyas hembra:

01 - Edades Zarigueyas

Antes de iniciar a realizar los cálculos de los cinco valores, debemos ordenar los datos de forma ascendente, por lo que los datos nos quedan de la siguiente forma:

02 - Eddes zarigueyas ordenado

Ahora con los datos ordenados, podemos identificar que el valor mínimo de nuestro set de datos es 1 y el valor máximo es el 9. Por lo que calcularemos ahora la mediana (Q2). La cual es la posición central de nuestro conjunto de datos (dataset).

Si la cantidad de datos es par, la mediana corresponde al promedio de los dos valores centrales, por lo que primero se debe calcular la posición del valor central de la siguiente forma:

03 - Formula posición mediana

Donde n es el número de datos con los que contamos.

Luego de tener la posición, y al tener una cantidad de datos par, se debe calcular la mediana de la siguiente forma:

04 - Formula mediana

Pero si llegáramos a tener un conjunto de datos impar, al realizar el cálculo de la posición deberemos redondear el resultado al entero próximo. En nuestro caso contamos con 43 datos, siendo n impar, por que deberemos redondear el resultado que obtendremos, para identificar la posición central de nuestro conjunto de datos:

05 - Cálculo Posición Mediana

Ahora que tenemos la ubicación, debemos identificar el valor que se encuentra en la posición 22, en este caso el valor corresponde al valor 4:

06 - Identificación de Mediana

Por lo tanto:

07 - Cuartil 2

Teniendo la media identificada, debemos calcular el primer y tercer cuartil. Los cuartiles son percentiles específicos, siendo recomendable dividir los datos en cuatro partes iguales. La información que nos proporcionan, es la observación de la distribución de los datos menores o iguales al valor del percentil especifico. Donde es utilizado para el primer cuartil (Q1) del 25% y para el tercer cuartil (Q3) del 75%, en los diagramas de caja.

Para poder ejemplificar dicha distribución, mostraremos la división de los datos. Dichos valores los obtendremos con el calculo del cuartil Q1 y Q2:

08 - Distribución de Datos

Ahora procedemos a calcular el cuartil Q1, con la siguiente formula par el calculo del percentil:

09 - Formula Percentil Cuartil 1

Donde n es el número de datos con los que contamos.

Dado que nuestra n es de 43, y el percentil p que deseamos calcular es del 25%, por lo tanto:

10 - Cálculo Percentil de Cuartil 1

Dado que i no es un entero, y se tuvo que aproximar, el cuartil Q1 corresponde al valor de la posición 11 de nuestros datos, por lo tanto.

11 - Cuartil 1

Ahora debemos calcular el cuartil Q3 que corresponde a un percentil p del 75%.

12 - Cálculo percentil de cuartil 3

En esta ocasión la i no es un entero y se redondeó al entero superior, por lo que percentil Q3 corresponde al valor de la posición 33, por lo tanto.

13 - Cuartil 4

Ahora nos queda calcular el rango intercuartílico o intercuartil (RIC), el cual es la diferencia entre el tercer cuartil (Q3) y el primer cuartil (Q1).

14 - Formula rango intercuartílico

Además del cálculo del RIC, debemos calcular los limites de nuestro diagrama de caja, por lo que utilizamos la siguiente ecuación para el cálculo del límite inferior:

15 - Formula limite inferior

Para calcular el límite superior utilizamos la siguiente ecuación:

16 - Formula limite superior

Por lo que procedemos a iniciar con el calculo de nuestro rango intercuartílico:

17 - Cálculo RIC

Obteniendo nuestro RIC = 2, procedemos a calcular el límite inferior y superior:

18 - Cálculo límites

Con los datos calculados, podemos obtener la siguiente gráfica de caja.

19 - Edad Zarigueyas hembra

Es importante mencionar que los datos que se encuentren fuera de los límites calculados, serán observaciones atípicas en nuestros datos.

Gráfica de Caja con Python

Para poder iniciar la explicación, supondremos que el lector está familiarizado con la sintaxis de Python y con Jupyter Notebook, además de tener conocimiento sobre la carga de archivos CSV en Python con Pandas, donde los archivos de datos que estaremos utilizando; así como, el archivo de Jupyter con el código, puede ser descargados desde el siguiente repositorio en GitHub: https://github.com/sdesignca/blog-ps-diagrama-caja-python

Por lo que estaremos graficando las edades de las zarigüeyas por sexo (macho y hembra), cargando los datos de la columna “sex” (sexo) y “age” (edad) del archivo “possum.csv”. Iniciando por la importación de la librería Pandas con la siguiente instrucción:

import pandas as pd

Luego de importar la librería, asignaremos a nuestra variable “datos el DataFrame con las columnas deseadas (“sex” y “age”) de nuestro archivo “possum.csv”, el cual se encuentra en el mismo directorio que nuestro archivo de Jupyter Notebook. Si en dado caso nuestro archivo se encuentra en otra ubicación, debemos colocar la ruta (path) de nuestro archivo de datos junto con el nombre del archivo CSV.

datos = pd.read_csv( "possum.csv"
                    ,delimiter=','
                    ,usecols=['sex','age']
                    )

A lo largo de nuestra explicación, no se manipularán los datos contenidos en el DataFrame, por lo cual esta misma variable será utilizada para realizar la gráfica; tanto con Matplolib, como con Plotly.

Gráfica con Pandas y Matplotlib

Matplotlib es una librería utilizada para realizar gráficas estáticas, animadas y visualizaciones interactivas a partir de datos contenidos en listas, vectores y en su extensión matemática, la cual es NumPy (Potter, 2006).

La librería de Pandas trabaja en conjunto con NumPy y Matplotlib, por esta razón es posible utilizar una función propia del objeto creado con Pandas, agilizando el proceso de creación de gráficas, en la que si deseamos realizar cambios en la gráfica, debemos manipular el objeto de Matplotlib.

Para poder realizar la gráfica de caja con Matplotlib, necesitamos tener instalado el paquete, si no lo hemos instalado, podemos hacerlo por medio del comando pip o pip3. En nuestro caso haremos uso de pip3, ejecutando el siguiente comando desde la linea de comandos o terminal, para su instalación:

pip3 install matplotlib

Teniendo instalada la librería de Matplotlib, importamos el paquete en nuestro archivo de Jupyter Notebook de la siguiente forma, colocándole como alias plt:

import matplotlib.pyplot as plt

Haciendo uso de la variable datos, luego de cargar la información del archivo CSV. Utilizaremos el siguiente código para realizar la gráfica de caja, el cual deberemos ejecutar de forma conjunta en Jupyter Notebook, donde luego explicaremos linea por linea su funcionamiento.

ax = datos.boxplot(by='sex',grid=False,rot=45)
ax.set_title('Edad de Zarigüeyas por Sexo');
plt.suptitle('')
ax.set_xlabel("Sexo");
ax.set_ylabel("Edad (años)");
plt.xticks([1,2], ['Hembra', 'Macho'])
plt.show()

Si ejecutamos de forma individual cada instrucción en Jupyter Notebook, primero nos mostrará el diagrama de caja con sus parámetros por defecto (imagen 1), luego nos mostrara por separado el cambio a los ejes que realizamos (imagen 2).

Imagen 1: Gráfica de Matplolib sin modificaciones.

20 - gráfica sin transformacion

Imagen 2: Gráfica de Matplotlib solo con ejes modificados.

21 - gŕafica con eje modificado

Al ejecutar todo el fragmento de código en conjunto, obtenemos la gráfica con las modificaciones que realizamos:

22 - Gráfica de Matplotlib con transformaciones

Si revisamos el código con su funcionamiento, en la siguiente linea, utilizamos el método de boxplot de nuestro DataFrame. Donde nuestra segmentación del sexo de las zarigüeyas se encuentra en la columna sexo (sex); donde f es para las hembras y m es para los machos; por esta razón debemos agrupar los datos por los valores de esta columna. Esto lo hacemos con el parámetro by, donde nos agrupará la información del resto de columnas (en nuestro caso solo tenemos la columna age). El parámetro grid con el valor False, nos quita el grid del fondo de la gráfica, si quisiéramos que el grid apareciera podemos colocar True o eliminarlo, ya que el valor por defecto es True. El parámetro rot, se refiere a la rotación de la etiqueta de los valores (en nuestro caso f y m).

ax = datos.boxplot(by='sex',grid=False,rot=45)

Con la siguiente instrucción le asignamos el título de nuestra gráfica.

ax.set_title('Edad de Zarigüeyas por Sexo');

Con la siguiente instrucción colocamos el subtitulo de nuestra gráfica como vacía. Si no colocamos el subtitulo como vacío, nos aparecerá el valor generado por defecto, que en nuestro caso es la agrupación por sexo de las zarigüeyas.

plt.suptitle('')

Ahora colocamos el identificador de nuestro eje x con el valor “Sexo”:

ax.set_xlabel("Sexo");

Con la siguiente instrucción colocamos el identificador de nuestro eje Y con el valor “Edad (años)”:

ax.set_ylabel("Edad (años)");

Es importante tomar en consideración el siguiente punto, ya que vamos a cambiar con la siguiente instrucción la etiqueta de identificación a nuestras gráficas, por lo que debemos de saber a que valores corresponde el identificador. En nuestro caso, el valor 1 corresponde a la gráfica con los datos de las edades de las zarigüeyas hembra, y el valor 2 corresponde a los datos de las edades de las zarigüeyas macho, por lo que ponemos en el primer parámetro (ticks) los identificadores de los datos, y en el segundo parámetro (labels) le asignamos el nombre que tendrán los identificadores de los componentes de la gráfica.

plt.xticks([1,2], ['Hembra', 'Macho'])

Luego de las transformaciones realizadas a nuestra gráfica, la mostramos con la siguiente instrucción:

plt.show()

Gráfica con Plotly

Plotly es un framework open-source de Python, utilizado para poder crear aplicaciones web de gráficas interactivas, donde no es necesario el ser un experto en HTML, CSS y Javascript para crear dashboards de gráficas.

Para poder realizar la gráfica de caja con Plotly, necesitamos tener instalado el paquete, si no lo hemos instalado, podemos hacerlo por medio del comando pip o pip3. En nuestro caso haremos uso de pip3, ejecutando el siguiente comando para su instalación:

pip3 install plotly

Luego debemos de importar la librería de plotly con el alias px.

import plotly.express as px

Teniendo importada la librería, utilizaremos el método box de plotly para realizar la gráfica de caja, donde el primer parámetro del método corresponde a la variable que contiene el DataFrame con los datos que deseamos graficar; en nuestro caso dicha variable es datos. El siguiente parámetro que utilizaremos sera x, el cual nos sirve para indicar que datos se encontraran en el eje X de nuestra gráfica, que en nuestro caso es “sex”. El parámetro y nos sirve para indicar que datos del DataFrame estarán en el eje Y.

Con el parámetro points podemos indicar que información deseamos mostrar en nuestra gráfica, con la opción “outliers” (que es el parámetro por defecto) indicamos que nos muestre datos atípicos, con la opción “none” indicamos que no nos muestre los valores atípicos, ni la dispersión de los datos en la gráfica de caja. Y por último, la opción “all” nos muestra la dispersión de datos al lado del diagrama de caja y los valores atípicos.

El parámetro title nos sirve para indicar el nombre que tendrá nuestro diagrama, y el parámetro labels nos sirve para definirle el nombre en forma de diccionario a nuestros ejes.

fig = px.box( datos
             ,x="sex"
             ,y="age"
             ,points="outliers"
             ,title="Edad de Zarigüeyas por Sexo"
             ,labels={
                       "sex": "Sexo"
                      ,"age": "Edad (años)"
                     }
             )

Por último, mostramos nuestra gráfica con el siguiente comando:

fig.show()

Es importante mencionar que en Jupyter Notebook, nuestra gráfica se mostrara sin necesidad de utilizar este último comando.

23 - Gráfica Plotly

Referencias

Anderson, D., Sweeney, D., Williams, T., Camm, J. y Cochran, J. (2016). Estadística para negocios y economía. 12va edición. Ciudad de México, México. CENGAGE Learning. 104, 108 – 110, 131 – 132 pp.

Faraldo, P. y Pateiro, B: (2012). Tema 1. Estadística Descriptiva. Extraído de: http://eio.usc.es/eipc1/BASE/BASEMASTER/FORMULARIOS-PHP-DPTO/MATERIALES/Mat_G2021103104_EstadisticaTema1.pdf

Kathari, S. (2020). Plotly Dash: A beginner’s guide to building an analytics dashboard. Extraído de: https://medium.com/analytics-vidhya/plotly-dash-a-beginners-guide-to-building-an-analytics-dashboard-cedf297e01f1

Potter, K. (2006). Methods for Presenting Statistical Information: The Box Plot. Extraído de: http://www.sci.utah.edu/~kpotter/publications/potter-2006-MPSI.pdf

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp
Diagrama de Barras con Python

Diagrama de Barras con Python

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp

La gráfica de barras es una representación que utilizamos para mostrar datos categóricos de una forma resumida y con una distribución de frecuencia, frecuencia relativa o de frecuencia porcentual, donde un eje de la gráfica se muestran las etiquetas de las clases o categorías; mientras que en el otro eje de la gŕafica se coloca la escala de recurrencia (Anderson et al., 2016; Newbold et al., 2008).

Las variables categóricas nos ayudan a mostrar respuestas a grupos o categorías, las cuales pueden ser respuestas como: sí/no, totalmente en desacuerdo hasta totalmente de acuerdo; entre otras respuestas (Newbold et al., 2008).

Este tipo de gráfica las podemos emplear para llamar la atención sobre la frecuencia de una categoría, ya que nos ayuda a identificar las principales causas de los problemas o áreas de interés. Si el diagrama de barras se acomoda en orden descendente de altura, mostrando en la primera posición la causa que ocurre con mayor frecuencia, obtenemos el diagrama de Pareto, el cual nos ayuda a identificar estos problemas para corregirlos de una forma rápida, buscando el costo mínimo de la corrección (Anderson et al., 2016; Newbold et al., 2008).

Para elaborar el diagrama de barra con Matplotlib y Plotly utilizando Python, estaremos utilizando los datos del reporte de Excel sobre la pesca marina del 2020 de Canadá, que pueden ser descargado desde el siguiente enlace: https://open.canada.ca/data/en/dataset/288b6dc4-16dc-43cc-80a4-2a45b1f93383. El reporte de Excel y el código elaborado se encontrará disponible en el repositorio de GitHub: https://github.com/sdesignca/blog-ps-diagrama-barra-python

Donde supondremos que el lector está familiarzado con la sintaxis de Python y con el uso de Jupter Notebook; así mismo, como los conocimientos básicos de carga de datos a partir de archivos de Excel en Python utilizando Pandas. Si se desea conocer más sobre el método para cargar datos de archivos de Excel con Python, pueden leer sobre el tema en el siguiente enlace: http://www.solutiondesign.tech/cargando-datos-de-un-excel-en-python-con-pandas/

Gráfica de Barras con Python

Antes de iniciar con la elaboración de las gráficas importaremos la librería de Pandas con el alias pd, de la siguiente forma:

import pandas as pd

Luego de importar la librería de Pandas, cargaremos los registros del archivo de Excel “marine-finfish-data-2020.xlsx” y asignaremos el DataFrame a la variable datos. Se ha de mencionar que este archivo de Excel es un reporte con formato predefinido, por lo cual deberemos realizar la manipulación de la información para cargar los datos que deseamos, por medio de la función read_excel, donde estaremos omitiendo la lectura específica de filas y columnas, para cargar unicamente los datos del Peróxido de Hidrógeno (Hydrogen peroxide) de la provincia de New Brunswick, Canadá.

Imagen 1: Reporte de Excel con información de la pesca marina del 2020 de las provincias de Canadá.

01 - Reporte Excel

En la función read_excel, necesitamos especificar las filas que deseamos omitir en la carga de datos por medio del parámetro skiprows. Como este es un reporte que al descargar desde el sitio obtendremos el mismo formato, utilizaremos el siguiente fragmento de código para agregar a una lista o arreglo los números de filas que omitiremos para cargar únicamente la información de New Brunswick:

# omitimos el título del reporte y la información de donde se obtuvieron los datos
SKIPROWS = [0,1]

# omitimos la información luego del encabezado hasta New Brunswick
for row in range(3,68):
SKIPROWS.append(row)

# omitimos la información luego de los datos luego New Brunswick hasta el final
for row in range(96,109):
    SKIPROWS.append(row)

Teniendo las filas que desamos omitir en la variable SKIPROWS, utilizaremos el método read_excel para cargar la información de New Brunswick, en el cual cargaremos únicamente las columnas B (Facility Name) y H (Hydrogen peroxide). Si existe alguna duda sobre la carga de información desde un archivo de Excel, pueden leer el árticulo Cargando Datos de un Excel en Python con Pandas” en nuestro blog.

datos = pd.read_excel( "marine-finfish-data-2020.xlsx"
                      ,sheet_name="Marine Finfish 2020 Data"
                      ,skiprows= SKIPROWS
                      ,usecols="B,H")

Al ver la información cargados en la variable datos con la función head(), podemos observar que para la provincia de New Brunswick no hay valores para unas instalaciones.

datos.head()

Imagen 2: Primeros cinco registros del DataFrame contenido en la variable datos.

02 - Primer Análisis de Instalaciones

Por lo que eliminaremos los registros nulos (NaN) de la información del DataFrame, con la función dropna, en la que enviaremos el valor True en el parámetro inplace, el cual nos servirá para indicar que la eliminación de los datos nulos se aplique al dataframe de la variable, conservando únicamente las instalaciones con registros.

datos.dropna(inplace=True)

Para poder elaborar la gŕafica de Pareto, vamos a ordenar nuestra información por los datos de la columna Hydrogen peroxide utilizando el parámetro by de la función sort_value, donde indicaremos que se ordene de forma descendente, pasando en el parámetro ascending el valor False y por último indicaremos que los cambios sean aplicados a nuestra variable datos por medio del parámetro inplace con el valor True.

datos.sort_values( by='Hydrogen peroxide'
                  ,ascending=False
                  ,inplace=True)

Aplicando este ordenamiento, tenemos listos nuestros datos para ser graficados, por esta razón a lo largo de nuestra explicación, ya no se volverán a manipular los datos contenidos en el DataFrame de nuestra variable datos, por lo cual dicha variable será utilizada para realizar la gráfica con Matplotlib y Plotly.

Gráfica con Pandas y Matplotlib

Matplotlib es una librería utilizada en Python para realizar gráficas estáticas y animadas, a partir de datos contenidos en listas, vectores y en la extensión matemática NumPy (Potter, 2006).

Para poder realizar la gráfica de barras con Matplotlib y Pandas, necesitamos tener instalado el paquete, si no lo hemos instalado, podemos hacerlo por medio del comando pip o pip3. En mi caso usé pip3, por medio del siguiente comando desde la terminal o linea de comandos para su instalación:

                 pip3 install matplotlib

Teniendo instalada la librería de Matplotlib, importamos el paquete en nuestro archivo de Jupyter Notebook con el alias plt:

import matplotlib.pyplot as plt

Haciendo uso de la variable datos, utilizaremos el siguiente código para realizar la gráfica de barras, el cual deberemos ejecutar de forma conjunta en Jupyter Notebook, o de lo contrario la manipulación posterior a la creación de la gráfica será mostrada por separado en nuestro Jupyter Notebook:

ax = datos.plot(x="Facility Name", y="Hydrogen peroxide", kind="bar", grid=False)
ax.set_title('Presencia de Peróxido de Hidrógeno en New Brunswick, Canadá.')
ax.set_xlabel("Instalaciones")
ax.set_ylabel("Peróxido de Hidrógeno")
plt.show()

Revisando el funcionamiento del código, podemos ver en la primera linea que le asignamos a la variable ax la gráfica de Matplolib, en la que el parametro x corresponde al eje X de la gráfica, donde estaremos utilizando como dato la columna que contiene el nombre de la instalación (“Facility Name”). El parámetro “y es utilizado para indicar los datos del eje Y, donde estaremos utilizando la información de la columna que contiene los valores del peróxido de hidrógeno (“Hydrogen peroxide”), en el parámetro kind, indicaremos que será una gráfica de barras, por lo que enviamos la cadena o string “bar” y nuestra gráfica será generada sin un grid, por lo que enviamos en el parámetro grid el valor False.

ax = datos.plot(x="Facility Name", y="Hydrogen peroxide", kind="bar", grid=False)

Ahora manipulamos el objeto de nuestra gráfica utilizando la variable ax, donde le colocaremos un título descriptivo a nuestra grafica.

ax.set_title('Presencia de Peróxido de Hidrógeno en New Brunswick, Canadá.')

Con la siguiente función podemos agregar a nuestra gráfica un identificador para el eje X.

ax.set_xlabel("Instalaciones")

Con la siguiente función podemos agregar a nuestra gráfica un identificador para el eje Y.

ax.set_ylabel("Peróxido de Hidrógeno")

Y con la siguiente instrucción mostramos la gráfica. Es importante mencionar que en Jupyter Notebook no es necesario agregar esta instrucción, ya que el interprete mostrará la gráfica generada.

plt.show()

Por lo que obtendremos como resultado la gráfica de la imagen 3.

Imagen 3: Diagrama de pareto de la presencia de Peróxido de Hidrógeno en New Brunswick, Canadá.

03 - Diagrama de Barras Matplotlib

Gráfica con Plotly

Podemos utilizar Plotly para poder crear aplicaciones web de gráficas interactivas para crear dashboards dinámicos, pudiendo aprovechar esta librería en conjunto con Dash.

Para poder realizar la gráfica de barras con Plotly, necesitamos tener instalado el paquete, si no lo hemos instalado, podemos hacerlo por medio del comando pip o pip3. En mi caso haré uso de pip3, ejecutando el siguiente comando para su instalación:

                  pip3 install plotly

Luego debemos de importar la librería de plotly con el alias px.

import plotly.express as px

Teniendo importada la librería, utilizaremos el método bar() de plotly para realizar la gŕafica, donde el primer parámetro del método corresponde a la variable que contiene el DataFrame con los datos que deseamos gráficar; en nuestro caso es datos. Luego por medio del parametro x, indicaremos los datos eje X de nuestra gráfica, la cual corresponde al nombre de la columna que contiene el nombre de las instalaciones (Facility Name). El parámetro y nos sirve para indicar que datos del DataFrame que corresponderán al eje Y, el cual es la cantidad de peróxido de hidrógeno (Hydrogen peroxide) .

El parámetro title nos sive para colocar un nombre descriptivo a nuestra gráfica, y el parámetro labels nos sirve para cambiarle el nombre a los ejes de nuestra gráfica. Estos deben ser enviados como un diccionario de Python, por si se desea utilizar una variable para defirnir los nombres de forma separada.

fig = px.bar( datos
             ,x="Facility Name"
             ,y="Hydrogen peroxide"
             ,title="Presencia de Peróxido de Hidrógeno"
             ,labels={
                      "Facility Name": "Instalaciones",
                      "Hydrogen peroxide": "Peróxido de Hidrógeno"
                     }
               )

Por último, mostramos nuestra gráfica con el siguiente comando:

fig.show()

Es importante mencionar que en Jupyter Notebook, nuestra gráfica se mostrará sin necesidad de utilizar este último comando.

04 - Diagrama Barras Plotly

Referencias

Anderson, D., Sweeney, D., Williams, T., Camm, J. y Cochran, J. (2016). Estadística para negocios y economía. 12va edición. Ciudad de México, México. CENGAGE Learning.

Newbold, P., Carlson, W. y Thorne, B. (2008). Estadística para administración y economía. Madrid, España: PEARSON. 10, 14 – 15 pp.

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp
Cargando Datos de un Excel en Python con Pandas

Cargando Datos de un Excel en Python con Pandas

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp

Como vimos en la entrada anterior (Cargando Datos de un CSV en Python con Pandas), pandas es un paquete para Python que nos facilita la manipulación de los datos; sin embargo, dichos datos son cargados en memoria, por lo que la velocidad de respuesta en su uso, dependerá de la cantidad de datos y los recursos del equipo que estemos utilizando

Cargando Datos de un Excel

La función read_excel es la función de pandas para cargar datos de un archivo de Excel, donde posee diversos parámetros para manipular los datos al momento de cargarlos en la memoria, donde nos enfocaremos en los principales parámetros que pueden llegar a sernos de utilidad en la práctica (McKinney, 2018; Harrison y Petrou, 2020).

Según la documentación de Pandas, al igual que Harrison y Petrou (2020), internamente esta librería hace uso de los paquetes xlrd y openpyxl para leer archivos XLS y XLSX, si en dado caso no lo llegáramos a tener instalado, deberá realizarse de forma manual con pip o conda. Dentro de esta función de lectura de archivos, también podemos especificar con el parámetro engine, que paquete utilizar al momento de cargar los datos, teniendo disponibles las siguientes opciones:

  • xlrd

  • openpyxl

  • odf

  • pyxlsb

Antes de dar inicio a la explicación del funcionamiento de esta función, es importante recalcar que una hoja de cálculo, no es necesariamente un set de datos y no es requerido que las personas registre la información en un formato determinado, por lo que en algunos casos los tipos de datos no concuerdan con lo que ha registrado la persona o el software que creo la información.

Para poder iniciar la explicación, supondremos que el lector está familiarizado con la sintaxis de Python y con Jupyter Notebook, donde los archivos de datos que estaremos utilizando; así como, el archivo de Jupyter, puede ser accedidos y descargados desde el siguiente repositorio en GitHub: https://github.com/sdesignca/blog-cargando-excel-pandas

Para iniciar, importamos la librería de pandas en nuestro archivo de Jupyter Notebook, donde le colocaremos el alías, o sobre nombre pd.

import pandas as pd

Luego ubicaremos el path o la ruta donde se encuentra nuestro primer archivo de ejemplo “datos.xlsx”, en mi caso el archivo “datos.csv” se encuentra en la misma ubicación que el archivo de Jupyter, por lo que solo necesitamos colocar el nombre del archivo con su extensión como un parámetro de tipo String o cadena a la función read_excel. Está información se cargará y se asignará a la variable datos.

datos = pd.read_excel("datos.xlsx")

Mostraremos el contenido de la variable datos con la función head() del paquete de pandas:

datos.head()

Como puede observarse, la información es asignada a la variable:

01 - Cargando Datos Primer Excel

Sin embargo, como se mencionó anteriormente, una hoja de cálculo no es necesariamente un set de datos, donde podemos tener la necesidad de poder realizar una exploración de información y un análisis a partir de archivos que pueden ser generados por un software o persona, en la cual siempre mantiene su estructura. Para ejemplificar esto utilizaremos el archivo “WasteBySector.xlsx”, el cual es un reporte generado por “The Organisation for Economic Co-operation and Development (OECD)” sobre la generación de desperdicio por país, accesible desde el siguiente enlace: https://stats.oecd.org o disponible en nuestro repositorio en GitHub: https://github.com/sdesignca/blog-cargando-excel-pandas

Al abrir el reporte de Excel podemos observar que posee la siguiente estructura:

01 - Estructura de Segundo Excel

En este caso, vemos que el archivo tiene una estructura distinta al del primer ejemplo, donde la información que necesitamos extraer son los países y la cantidad de desperdicio generado por países en los diferentes años, en la cual utilizaremos varios parámetros de la función read_excel. Para ello pasaremos como String o cadena el nombre del archivo con su extensión, el cual es “WasteBySector.xlsx”.

En algunos casos la hoja de calculo puede tener varias hojas, por lo que con el parámetro sheet_name podemos seleccionar la hoja de la cual deseamos cargar la información, donde podemos pasar el número de la hoja, el nombre de la hoja o una lista de las hojas de las cuales deseamos cargar la información, en nuestra hoja de ejemplo solo existe una por lo que no es necesario colocar el nombre, pero con el fin de ejemplificarlo pasaremos como parámetro el nombre que tiene nuestra hoja: “OECD.Stat export”.

Al analizar la estructura del Excel, hay secciones que no son de nuestro interés para un análisis. Si empezamos a analizar la parte superior del Excel debemos omitir las primeras cuatro filas, es importante ver que la primera fila esta oculta en nuestro archivo, sin embargo esto no significa que no sea tomada en cuanta por la función al momento de cargar información. Para poder omitir las filas usamos el parámetro skiprows, con el valor 4.

02 - Analizando Excel

Ahora si vemos la parte inferior de los datos de nuestro Excel, también contiene información que no necesitamos para nuestro análisis, por lo cual utilizaremos el parámetro skipfooter, donde enviaremos el valor 4, ya que debemos de omitir las ultimas cuatro filas al momento de cargar nuestra información.

03 - Analizando Footer Excel

Por lo que tendríamos a este momento la siguiente instrucción:

datos = pd.read_excel("WasteBySector.xlsx",
                        sheet_name='OECD.Stat export',
                        skiprows=4,
                        skipfooter=4,
                        usecols="A,C:K")

Ahora con la función head(30) mostraremos los datos que se han cargado a nuestra variable datos, es importante mencionar que el valor 30 nos mostrará los primeros 30 registros que contenga nuestra variable, donde hemos utilizado este valor para mostrar que no han sido cargados los datos de las primeras cuatro filas y las ultimas cuatro filas.

datos.head(30)

Podemos observar en el resultado que obtendremos, aún hay información que debemos ajustar, como cambiar el nombre de la columna “Year” (año) por “Country” (País), eliminar la primera fila de los datos y la segunda columna (“Unnamed: 1”).

04 - Primeros Datos Cargados

Primero usaremos el parámetro usecols dentro de la función reas_excel para cargar unicamente las columnas don los datos que son de nuestro interés, donde podemos pasar una cadena o String con el rango de las columnas o una lista de las columnas que deseamos cargar. En nuestro caso utilizaremos la opción de String, donde indicaremos que cargue unicamente la información letra de la columna A y la información de la columna C hasta la K.

datos = pd.read_excel("WasteBySector.xlsx",
                        sheet_name='OECD.Stat export',
                        skiprows=4,
                        skipfooter=4,
                        usecols="A,C:K")

Si mostramos los datos asignado a nuestra variable con el comando head()

datos.head()

Se observa que la columna “Unamed: 1” ya no fue tomada en cuenta al cargar la información:

05 - Extrayendo columnas de Interes

Luego cambiaremos el nombre de la columna “Year” (año) a “Country” (país) con la siguiente instrucción. Donde el parámetro inplace con el valor True, indica que deseamos que sea cambiado de forma permanente en la información contenida en nuestra variable datos, de lo contrario este cambio no será permanente para la siguiente instrucción que realicemos con nuestro set de datos :

datos.rename(columns={'Year':'Country'},inplace=True)

Al mostrar nuevamente la información en nuestra variable, veremos que se ha renombrado el nombre de la columna.

06 - Cambio de nombre de columna

A este punto no se ha discutido sobre las estructura de DataFrame y Serie de Pandas; sin embargo, debemos hacer la mención de que ambas estructuras manejan de forma interna una secuencia de indexado de los registros. Es importante mencionarlo, ya que utilizaremos este indexado para la siguiente instrucción que utilizaremos.

07 - Identificando Index en DataFrame

Ahora proseguimos con la eliminación de la primera fila:

08 - Identificando Fila a Eliminar

Para hacer esto, utilizamos la función drop, donde utilizaremos el parámetro labels con el valor 0, para indicar que son los registros de la primera fila, aquí también puede ser enviada una lista de índices o columnas. Luego indicamos que eliminaremos la filas pasando el valor “index” en el parámetro axis, si quisiéramos eliminar la columna, deberíamos enviar el parámetro “columns” y por último enviaremos en el parámetro inplace con el valor True, para que el cambio se preserve en la información de nuestra variable datos:

datos.drop(labels=0,axis="index",inplace=True)

Si mostramos los datos con la función head(), veremos que se ha eliminado del DataFrame la primera fila:

09 - Set de Datos sin primera fila

Ahora reindexaremos los datos del DataFrame asignado a nuestra variable datos utilizando la función reset_index. En esta función utilizaremos el parámetro drop con el valor True, si no utilizamos esta propiedad de la función, al momento de realizar el reindexado, la secuencia de indices anteriores no sera eliminado y será creado como una nueva columna dentro de nuestro DataFrame, por lo que esta propiedad elimina por completo la secuencia de índices que vamos a remplazar. Y por último agregaremos el parámetro inplace con el valor True para que se preserven los cambios en la estructura de nuestra variable datos:

datos.reset_index(drop=True,inplace=True)

Utilizaremos la función info() para poder obtener la información de la memoria utilizada, la cantidad de columnas y el detalle sobre las columnas de nuestro DataFrame, en la cual se mostrará el índice, el nombre, la cantidad de datos no nulos y el tipo de dato de las columnas.

10 - Información de DataFrame sin Transformación

Podemos observar en el resultado que de las nueve columnas con datos decimales (flotantes o floats), solo uno fue reconocido como tipo float64; donde el resto de columnas, incluyendo la del nombre de los países es del tipo object (objeto). Por lo que ahora nos corresponde realizar la transformación del tipo de dato de las columnas de datos numéricos, la cual es posible con la función to_numeric, donde el primer argumento corresponde a los datos que deseamos convertir y el segundo parámetro que utilizaremos es errors con el valor “coerce”, el cual indicará si hay un error al hacer la conversión, sea colocado un valor NaN (nulo).

for columna in datos.columns[1:]:
     datos[columna] = pd.to_numeric(datos[columna],
                                    errors='coerce'
                                                                       )

Hay que hacer mención que la propiedad columns nos permite acceder al listado de las columnas del DataFrame, en este caso para convertir los datos a decimales o floats, omitimos la primera columna, por lo que indicamos que sean tomadas desde la segunda columna (con el valor de índice 1), hasta la ultima columna existente, quedando la restricción de la siguiente forma [ 1: ]

Al obtener nuevamente la información del DataFrame con la función info(), observaremos que las columnas de datos numéricos ya es de tipo float, y nos da un dato más real de los datos que no son nulos en cada una de las columnas.

11 - Información de DataFrame con Transformación

Luego de todo este proceso de transformación, nuestro set de datos queda de la siguiente forma:

12 - Set de Datos Final

Referencias

Harrison, M., y Petrou, T. (2020). Pandas 1.x: coockbook. 2da. Edicion. Birmingham, U.K: Packt Publishing. 86 – 93 pp.

McKinney, W. (2018). Python for Data Analysis. 2 da edicion. California, E.E.U.U.: . 186 – 187 pp.

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp
Cargando Datos de un CSV en Python con Pandas

Cargando Datos de un CSV en Python con Pandas

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp

¿Qué es Pandas?

Es un paquete que se ha tornado esencial para el análisis de información en Python, ganando popularidad desde el 2010. Dicho paquete fue elaborado por Wes Mckinney en el 2008, donde su nombre se deriva de “panel data”, término utilizado para el conjunto de datos estructurados y multidimencionales (Harrison y Petrou, 2020; Stepanek, 2020).

Este paquete facilita la manipulación, preparación y la limpieza de datos estructurados, como archivos CSV, hojas de cálculo (como Excel) o bases de datos estructuradas. Esta librería cuenta con dos tipos de estructuras; la estructura de Serie, conformada por una secuencia de valores similares al tipo de NumPy. Y la otra estructura disponible en este paquete es el DataFrame, el cual representa una tabla de datos que contiene una colección de columnas que pueden ser de diferentes tipos (numérico, alfanumérico, booleano, etc.), teniendo está estructura índices de columnas y filas, en la que la información puede ser almacenada en bloques de una o más dimensiones, haciendo más fácil su selección, combinación y transformación de información (Harrison y Petrou, 2020; Walker, 2020, McKinney, 2018).

Cargando Datos de un CSV

La función para poder cargar a memoria los datos de un archivo CSV con pandas se llama read_csv, la cual cuenta con diversos parámetros para poder manipular la lectura del archivo y obtener los datos. Viendo los principales parámetros de manipulación que nos pueden llegar a servir en la práctica.

Esta función de Pandas es una de las más completas, en términos de opciones para normalizar los datos, pudiendo incluso manejar dos motores de análisis; uno de estos es el motor de C, el cual es más eficaz que el motor de Python, ya que cuenta con mayor precisión en valores flotantes, que puede ser especificado utilizando el parámetro float_precision dentro de la función read_csv. Sin embargo, se debe indicar mediante el parámetro engine con una ‘c’ dentro de dicha función, de lo contrario utilizará por defecto el motor de Python.

Para poder iniciar la ejemplificación del uso de esta función, supondremos que el lector está familiarizado con la sintaxis de Python y con Jupyter Notebook, donde el archivo de datos que estaremos utilizando; así como, el archivo de Jupyter, puede ser accedido y descargado desde el siguiente repositorio en GitHub: https://github.com/sdesignca/blog-cargando-csv-pandas

Para iniciar, importamos la librería de pandas en nuestro archivo, donde le colocaremos el alías pd.

import pandas as pd

Luego ubicaremos el path o la ruta donde se encuentra ubicado nuestro archivo “Datos.csv”. En nuestro caso el archivo se encuentra en la misma ubicación donde está nuestro archivo de Jupyter, por lo que solo necesitamos colocar el nombre del archivo con su extensión como un parámetro de tipo String o cadena, a la función read_csv y la información cargada la asignara a la variable datos.

datos = pd.read_csv("Datos.csv")

En unos casos, podemos llegar a tener otro tipo de delimitador en nuestros archivos CSV, por ejemplo un punto y coma (;), por lo que podemos utilizar el parámetro delimiter y especificar cual será el carácter que está delimitando la información entre si. En el archivo CSV de ejemplo el delimitador es una coma (,), este es el parámetro por defecto que toma la función read_csv, sin embargo para ejemplificar su uso dentro de la función incluiremos la coma (,) con el parámetro delimiter.

datos = pd.read_csv("Datos.csv",delimiter=',')

Al ejecutar esta instrucción y asignarla a la variable datos. Mostraremos su contenido utilizando la función head() de Python:

datos.head()

Al ser ejecutado, mostrará la información cargada en la variable desde el archivo; sin embargo, los caracteres especiales no son desplegados:

01 - Resultado primera carga de datos

Para poder corregir esto, vamos a pasar el parámetro encoding en la función read_csv, con el valor latin1 (si se desean conocer que otras opciones están disponibles se puede visitar el link https://docs.python.org/3/library/codecs.html#standard-encodings), quedando la instrucción:

datos = pd.read_csv("Datos.csv",delimiter=',',encoding='latin1')

Al mostrar nuevamente los valores con la función head(), obtendremos la información cargada en el DataFrame con la codificación latina, mostrando así los caracteres especiales contenidos:

02 - Resultado carga de datos con encodign

En este punto, ya tenemos nuestra información cargada en nuestra variable datos, con los caracteres especiales disponibles; sin embargo, tenemos una columna que contiene fechas y podríamos pensar que estos valores son de tipo fecha (o datetime), por lo que revisaremos el tipo de dato de cada una de las columnas con la siguiente propiedad del DataFrame de Pandas:

datos.dtypes

Obteniendo el siguiente resultado:

03 - Primer resultado sin fechas parseadas

Como se puede observar, la columna “Fecha de Ingreso” es de tipo object, para poder cambiar esto, podemos convertir el tipo de la columna, luego de cargar la información; sin embargo, en este documento, estamos mostrando el uso de la función read_csv, por lo que vamos a convertir esta columna a tipo fecha desde el momento en el que se carga la información utilizando el parámetro parse_dates, donde enviamos como parámetro un arreglo con el nombre de las columnas que deseamos convertir a tipo fecha, en nuestro caso el arreglo seria [‘Fecha de Ingreso’]:

datos = pd.read_csv("Datos.csv"
                     ,delimiter=','
                     ,encoding='latin1'
                     ,parse_dates=['Fecha de Ingreso']
                     )

Luego de ejecutar nuevamente esta instrucción y cargar los datos del archivo a la variable datos, verificamos nuevamente el tipo de datos de las columnas:

datos.dtypes

Al obtener el resultado, podemos observar que la columna “Fecha de Ingreso” ya es de tipo fecha o datetime

04 - Resultado con fechas parseadas

Sin embargo en un análisis no siempre es necesaria toda la información contenida en un archivo, por lo que podemos pasar como parámetro las columnas que deseamos sean cargadas en la memoria. Esto lo hacemos pasando un arreglo con el nombre de las columnas que contiene nuestro archivo CSV en el parámetro usecols, en nuestro caso vamos a cargar únicamente las columnas “Código”, “Fecha de Ingreso”, “Sueldo Base” y “Bonificación”:

datos = pd.read_csv("Datos.csv"
                    ,delimiter=','
                    ,encoding='latin1'
                    ,parse_dates=['Fecha de Ingreso']
                    ,usecols=['Código','Fecha de Ingreso','Sueldo Base','Bonificación']
                    )

Al ejecutar este comando y hacer uso de la función head() sobre la variable que contiene el DataFrame, obtenemos unicamente la información de las columnas que hemos especificado.

05 - Resultado carga de datos con columnas especificas

Estos suelen ser los parámetros de más ayuda al momento de cargar un archivo CSV, sin embargo existen más parámetros dentro de la función read_csv que nos pueden llegar a ser de utilidad, por lo que si se desea profundizar en las demás opciones que no fueron cubiertas, puede visitarse el siguiente link de documentación:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html

Referencias

Harrison, M., y Petrou, T. (2020). Pandas 1.x: coockbook. 2da. Edicion. Birmingham, U.K: Packt Publishing. 86 – 93 pp.

McKinney, W. (2018). Python for Data Analysis. 2 da edicion. California, E.E.U.U.: . 124 – 130 pp.

Stepanek, H. (2020). Thinking in Pandas: How to use the Python Data Analysis Library the Right Way. Portland, E.E.U.U: Apress. 67 – 69 pp.

Walker, M. (2020). Python Data Cleaning: cookbook. Birmingham, U.K: Packt Publishing. 2 – 8 pp.

Compartelo

RSS
Siguenos por Email
LinkedIn
Facebook
Twitter
Whatsapp
Theme: Overlay by Kaira
Guatemala