¡Hola! en este pequeño tutorial te ayudaré a graficar usando una librería de Python llamada Matplotlib y Pandas para el análisis y manipulación de datos.
Este metodo es un poco más complejo pero no imposible. Si estás interesado en hacerlo usando Pandas aunque no conozcas esta librería, no te preocupes, a cada paso que demos te iré explicando que hará cada linea de codigo y así podrás tener un conocimiento más claro sobre esta librería junto a la librería para graficar de Matplotlib.
DESTACO QUE ESTA GUIA FUE CREADA EN UN SISTEMA OPERATIVO LINUX UBUNTU
Los unicos comandos que cambiarán son la creación del entorno virtual env y la activación del mismo. El resto del codigo es el mismo.
Recuerda tambien tener el archivo csv de la superstore dado para el ejemplo de graficación.
Lo primero que necesitarás es un entorno (env) para poder trabajar. En mi caso trabajaré de forma local usando Jupyter Notebook.
Para crear nuestro entorno virtual usamos:
python3 -m venv env
donde env
será el nombre de nuestro entorno. Por comodidad usaré env
Para activar el entorno virtual escribimos en la terminal
source env/bin/activate
<h3>Instalación de librerias</h3>
Ahora necesitarás instalar las siguientes librerías
Para instalar usas
pip install <nombre_libreria>
Puedes hacer el proceso más rapido creando un archivo llamado requirements.txt
donde pondrás el nombre de una librería por linea.
Posteriormente usarás
pip install -r requirements.txt
De esta forma, todas las librerías que pongas en el requirements.txt se instalarán de forma automatica.
Jupyter es un “entorno” que nos permite escribir codigo y ejecutarlo de manera asincrona, esto quiere decir, que no tenemos que ejecutar todo el script para poder ver el resultado, solo deberemos ejecutar la linea de codigo que queremos y este nos devolverá un resultado.
Para activar el Jupyter Notebook usamos en la terminal:
jupyter notebook
Una vez ejecutado y pasado unos segundos, se abrirá una ventana en el navegador como la siguiente:
Estando ahí le daremos a New
y luego a Python3.x.x ('env')
en mi caso, por mi versión de Python aparece Python3.8.5 64-bit ('env)
.
Debe aparecerles su versión de python, la arquitectura de su procesador y el nombre de su entorno.
Lo primero que haremos es importar nuestras librerías.
import pandas as pdimport numpy as npimport randomimport matplotlib.pyplot as plot
Cada vez que queramos ejecutar una linea de codigo usamos Ctrl + Enter
. En caso de querer ejecutar y pasar a la siguiente linea de código usamos Shift + Enter
Ejecutamos ese bloque de codigo usando Shift + Enter
y pasamos a empezar a ver nuestro Data Set
Usamos:
df = pd.DataFrame(pd.read_csv('nombre_del_archivo.csv')
Ahora si queremos ver el resultado de esto, llamamos a nuestra variable df
para ver su contenido
Lo primero que vemos al ejecutar ḑf
son una serie de filas y columnas.
Lo primero raro es que hay una columna llamada Row ID y a su izquierda a una columna sin nombre que tiene una enumeración.
Dentro del archivo original, el Row ID es la columna indice, pero Pandas no detecta esto y la crea por cada registro (fila) que exista en el Data Frame.
Para evitar que se duplique usamos el siguiente comando:
df = df.set_index('Row ID')
<h4>Datos en el Data Frame</h4>
Usamos el comando
df.dtypes
Veremos que la mayoria de las columnas tienen a su derecha un nombre, la mayoria son object y eso está mal, pues tenemos valores numericos, de fecha, numeros enteros y flotantes.
Para acomodar esto usamos:
df = df.convert_dtypes()
Esto hará una conversión aproximada a los tipos de datos que tenemos. Si volvemos a usar df.dtypes
ahora el resultado será distinto.
Sin embargo ‘Order Date’ y ‘Ship Date’ todavía no tiene el tipo de dato correcto.
Estos son datos datetime
arreglamos esto rapido usando:
df['OrderDate'] = pd.to_datetime(
df['OrderDate'],
dayfirst = True,
errors = 'coerce'
)
df['Ship Date'] = pd.to_datetime(
df['Ship Date'],
dayfirst = True,
errors = 'coerce'
)
Si ejecutamos de nuevo df.dtypes
ya estará todo listo.
Esto se responde de una manera sencilla. Tenemos que ver el total de registros que en su columna Category tengan el nombre de alguna categoria. En otras palabras ver cuantas veces se repite esa categoria en el total de registros.
Eso lo obtenemos usando:
df['Category'].value_counts()
Veremos que esto nos devuelve una especie de tabla donde vemos el nombre de las categorias que tenemos y la cantidad de ventas realizadas por categoria. Pero vamos a graficar. Borra esa linea de codigo anterior o agrega lo siguiente:
df['Category'].value_counts().plot(kind="bar", fontsize = 15, color=['red', 'orange', 'blue'], figsize=(10,10))
plot.xticks(rotation = 45)
plot.xlabel('Categorias')
plot.ylabel('Cantidad de ventas')
plot.title('Categorias más vendidas')
plot.grid(axis='y')
plot.savefig('cat-sold.png')
Quedará algo como esto:
Primera pregunta, resuelta.
<h3>Pregunta 2: ¿Quién es el cliente que compra más?</h3>Esta pregunta se resuelve de dos formas.
En mi caso optaré por la 1 usando el siguiente codigo:
cs = df.groupby('Customer Name')['Sales'].sum()
pr = cs.loc[cs > 12000]
pr.sort_values().plot(kind='barh', figsize=(20,10), fontsize=18, color=choice_c)
plot.grid(axis='x')
plot.title('Clientes más frecuentes', fontsize=18)
plot.ylabel('Cliente', fontsize=18)
plot.xlabel('Totalde compras', fontsize=18)
plot.savefig('customers.png')
Fijate que en color= hay una variable no definida todavía llamada choice_c. Es para generar un recorrido aleatorio de colores según la cantidad de clientes existentes. Te dejo esa función para que la definas y la uses:
color_w = ['b', 'g', 'r', 'c', 'm', 'y', 'k']
choice_c = []
foriin pr:
c = random.choice(color_w)
choice_c.append(c)
Una vez graficado te debería quedar algo así:
groupby('Customer Name')['Sales'].sum()
puedo agrupar los clientes en función a la suma (sum) de cuanto han gastado (‘Sales’).sort_values()
para que los ordene y uso plot(kind='barh')
en este caso “barh” es para graficar barras horizontales.El resto de comandos se explicaron en la grafica anterior.
Segunda pregunta, resuelta.
<h3>Pregunta 3: ¿En qué Trimestre (Q) se realizan más ventas?</h3>Para responder esta pregunta necesitamos 2 cosas
Para esto vamos a usar dos columnas y creamos un Data Frame a partir de dos columnas, usando:
new_data = df[['Order Date', 'Sales']]
Podemos usar new_data
para ver su contenido.
Ahora que tenemos estos datos apartados, necesitamos quitar ese Row ID pues, lo que nos guiará para graficar esta información son los años, serán nuestros indices y nuestros valores en el eje X de la grafica.
Para eso usamos:
new_data.set_index('OrderDate', inplace=True)
usando inplace=True
le decimos que cambie el indice y se guarde de una vez se ejecute el codigo.
Si vuelves a usar new_data
verás que ya el Row ID no existe y ahora nuestro indice son las fechas de cada transacción.
Pero ahora solo queremos saber en que año fue y en que trimestre del año pasó un conjunto de transacciones. Para esto debemos crear dos columnas, una que nuestros muestre el año y otros que no muestre el trimestre de ese año.
Usamos
new_data['freq'] = new_data.index.quarter
new_data['year'] = new_data.index.year
donde freq son los trimestres (Q) del año.
Si ejecutamos new_data
otra vez, verás que tenemos dos columnas nuevas.
Ahora tenemos un nuevo reto:
Para lograr esto debemos hacer una transformación, en Pandas llamado Pivot. Usaremos lo siguiente:
pivot = pd.pivot_table(
new_data,
index='year',
values='Sales',
aggfunc='count',
columns='freq'
)
Donde:
Ahora si llamamos a pivot veremos la mágia lista.
Por ultimo nos queda graficar para ver que ha pasado de manera visual. Usamos:
pivot.plot(kind='bar', figsize=(10,10), fontsize=18)
plot.xlabel('Años', fontsize=18)
plot.ylabel('Total de ventas', fontsize=18)
plot.title('Ventas por cada cuarto de año', fontsize=18)
plot.legend(labels=['Q1', 'Q2', 'Q3', 'Q4'], fontsize=18)
plot.xticks(rotation=0)
plot.grid(axis='y')
plot.savefig('solds-per-q.png')
Quedará algo así:
Y el unico comando nuevo aquí es:
plot.legend(labels=) en el cual reescribimos el nombre de nuestros valores en nuestra grafica, para que sea más intuitivo.
Pregunta tres, resuelta.
Espero te haya servido esta guiá de graficacion y tratado de datos con Pandas y Matplotlib.
¿Tienes algunas mejoras al codigo? Te leo en la caja de comentarios
La modificación para la primer pregunta
¿Cuál es la categoría de productos más vendida?
Se refiere a la cantidad de dinero
df.groupby('Category')['Sales'].sum().plot(kind="bar", fontsize = 15, color=['red', 'orange', 'blue'], figsize=(10,10)) plot.xticks(rotation = 45) plot.xlabel('Categorias') plot.ylabel('Cantidad de ventas') plot.title('Categorias más vendidas') plot.grid(axis='y') plot.savefig('cat-sold.png')``` 
Esto es oro puro!
El ultimo Quater tiene un total de 3698 ventas. Mi grafica quedó de esta manera:

Dejo el detalle de mi notebook aquí
Gracias por compartir el notebook.
Muy bueno. Aún así la primera consigna habla de la más vendida refiriéndose al monto de ventas, no a la cantidad de ventas. En el gráfico del ejemplo que genera en Excel con tabla dinámica, muestra que Tecnología es la más vendida. En este caso el código Python debería ser así para contestar la primera pregunta:
df = pd.DataFrame(pd.read_csv('superstore.csv', encoding = 'ISO-8859-1')) df = df.set_index('Row ID') df = df.convert_dtypes() df['Order Date'] = pd.to_datetime(df['Order Date'], dayfirst = True, errors = 'coerce') df['Ship Date'] = pd.to_datetime(df['Ship Date'], dayfirst = True, errors = 'coerce') df['Sales'] = pd.to_numeric(df['Sales'], errors = 'coerce') # Cuál es la categoría de productos más vendida? categ_sales = df[['Category', 'Sales']].groupby('Category').sum() categ_sales.plot(kind='bar') plot.xlabel('Categorías') plot.ylabel('Cantidad de ventas') plot.ylim(ymin=categ_sales['Sales'].min() / 1.5) plot.title('Categorias más vendidas') plot.grid(axis='y') plot.savefig('cat-sold.png')
El aporte muy excelente.
Está hermoso! Felicidades 🤟🤩
Gracias por la explicación paso a paso en Pandas.
Me funcionó el procedimiento de la primera y la tercera sin problema, pero en el segunda pregunta tengo un error: (ValueError: Invalid color argument: [])… con el segundo bloque de código que tienes de la variable “choice_c”… tienes el .ipynb publicado en alguna parte para verificar el orden? Mil gracias por tomarse el trabajo de desarrollarlo en Python.
¡Muy completo!
Gracias por compartir
Mostro, idolo!🥇🥇🥇