📊 Matplotlib: Visualización con Python
Matplotlib es una biblioteca completa para crear visualizaciones estáticas, animadas e interactivas.
Documentación oficial
🎨 Seaborn
Seaborn es una biblioteca de visualización de datos de Python basada en matplotlib. Proporciona una interfaz de alto nivel para crear gráficos estadísticos atractivos e informativos.
Documentación oficial
In [ ]: # importar matplotlib para la visualización
import pandas as pd
import numpy as np
import [Link] as plt
import seaborn as sns
** Whitegrid (Seaborn Plot): dar estilo a gráficos usando fondo blanco y líneas de cuadrícula. Legibilidad a la visualización
In [ ]: [Link](style="whitegrid", palette="muted")
1 - Lectura de datos desde archivos
In [ ]: # Lee los archivos CSv, TXT y Json método read (¿qué biblioteca?)
ventas = pd.read_csv("[Link]")
clientes = pd.read_csv("[Link]", sep="\t")
productos = pd.read_json("[Link]")
display([Link](), [Link](), [Link]())
id_venta fecha monto
0 1 01/10/2025 250.50
1 2 02/10/2025 300.75
2 3 03/10/2025 150.00
3 4 04/10/2025 200.00
4 5 05/10/2025 198.65
id_cliente nombre edad
0 101 Juan Pérez 30
1 102 Ana López 25
2 103 Carlos Ruiz 40
3 104 Luis García 52
4 105 Marta Sánchez 28
id_producto nombre precio
0 1 Laptop 1200.99
1 2 Mouse 25.50
2 3 Teclado 45.75
3 4 Monitor 299.99
4 5 Impresora 150.00
Matplotlib: Visualización con Python matploit es una biblioteca completa para crear visualizaciones estáticas, animadas e interactivas.
Seaborn Seaborn es una biblioteca de visualizaci+on de datos de Python basada en matplotib. Proporciona una interfaz de alto nivel para crear gráficos estadistícos atractivos e infomrativos
In [ ]: # Importar matplotlib para la visualización
import pandas as pd
import numpy as np
import [Link] as plt
import seaborn as sns
2 - Escritura y fusión de datasets
In [ ]: # Añadir columnas para poder ralacionar las tablas
ventas["id_cliente"] = [101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115]
ventas["id_producto"] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10 , 11, 12, 13, 14, 15]
# Fusión de tablas ¿a que biblioteca se lo debemos?
ventas_clientes = [Link](ventas, clientes, on="id_cliente", how="left")
ventas_completas = [Link](ventas_clientes, productos, on="id_producto", how="left")
# Exportar dataset creado
ventas_completas.to_csv("ventas_completas.csv", index=False)
display(ventas_completas.head())
id_venta fecha monto id_cliente id_producto nombre_x edad nombre_y precio
0 1 01/10/2025 250.50 101 1 Juan Pérez 30 Laptop 1200.99
1 2 02/10/2025 300.75 102 2 Ana López 25 Mouse 25.50
2 3 03/10/2025 150.00 103 3 Carlos Ruiz 40 Teclado 45.75
3 4 04/10/2025 200.00 104 4 Luis García 52 Monitor 299.99
4 5 05/10/2025 198.65 105 5 Marta Sánchez 28 Impresora 150.00
In [ ]:
3 - Análisis exploratorio y visualización básica
In [ ]: # Cargar dataset consolidado
ventas_completas = pd.read_csv("ventas_completas.csv")
# Información general
print("Información general:")
ventas_completas.info()
display(ventas_completas.describe())
Información general:
<class '[Link]'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 9 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id_venta 15 non-null int64
1 fecha 15 non-null object
2 monto 15 non-null float64
3 id_cliente 15 non-null int64
4 id_producto 15 non-null int64
5 nombre_x 15 non-null object
6 edad 15 non-null int64
7 nombre_y 15 non-null object
8 precio 15 non-null float64
dtypes: float64(2), int64(4), object(3)
memory usage: 1.2+ KB
id_venta monto id_cliente id_producto edad precio
count 15.000000 15.000000 15.000000 15.000000 15.000000 15.000000
mean 8.000000 197.924667 108.000000 8.000000 34.266667 265.472000
std 4.472136 128.039801 4.472136 4.472136 7.869168 351.342788
min 1.000000 23.000000 101.000000 1.000000 24.000000 19.990000
25% 4.500000 75.500000 104.500000 4.500000 28.500000 55.375000
50% 8.000000 200.000000 108.000000 8.000000 33.000000 99.990000
75% 11.500000 291.875000 111.500000 11.500000 39.000000 324.995000
max 15.000000 439.090000 115.000000 15.000000 52.000000 1200.990000
In [ ]: #Total de ventas por cliente / resetear el índice
ventas_por_cliente = ventas_completas.groupby("nombre_x") ["monto"].sum().reset_index()
ventas_por_cliente = ventas_por_cliente.sort_values(by="monto", ascending=False)
[Link](figsize=(30,5))
[Link](data=ventas_por_cliente, x="nombre_x", y="monto", palette="cubehelix")
[Link]("Monto total vendido por cliente")
[Link]("Cliente")
[Link]("Monto total ($)")
[Link]()
/tmp/[Link]: FutureWarning:
Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.
[Link](data=ventas_por_cliente, x="nombre_x", y="monto", palette="cubehelix")
In [ ]: # Total de ventas por producto
ventas_por_producto = ventas_completas.groupby("nombre_y")["monto"].sum().reset_index()
ventas_por_producto.columns = ["producto", "monto total"]
[Link](figsize=(6, 6))
[Link](ventas_por_producto["monto total"], labels=ventas_por_producto["producto"], autopct="%1.1f%%", startangle=90, colors=sns.color_palette("pastel"))
[Link]("Distribución de ventas por producto")
[Link]()
4 - Análisis avanzado: correlaciones, outliers y visualización multivariable
In [ ]: # Crear columnas adicionales (monto con IVA)
ventas_completas ["monto_con_iva"] = ventas_completas ["monto"] * 1.16
# Matriz de correlación
num_cols = ["monto", "edad", "precio", "monto_con_iva"]
corr = ventas_completas [num_cols].corr()
[Link](figsize=(6,4))
[Link](corr, annot=True, cmap="coolwarm", fmt=".2f")
[Link]("Mapa de correlaciones")
[Link]()
Detección de outliers
In [ ]: # Detección de outliers
#variar tamaño de imgaen
[Link](figsize=(14,9))
[Link](data=ventas_completas, x="nombre_x", y="monto", palette="Set2")
[Link]("Detección de outliers en el monto por cliente")
[Link]("Cliente")
[Link]("Monto ($)")
[Link]()
/tmp/[Link]: FutureWarning:
Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.
[Link](data=ventas_completas, x="nombre_x", y="monto", palette="Set2")
In [ ]: # Visualización multivariable: pairplot
[Link](ventas_completas[["monto", "precio", "edad"]], diag_kind="kde", corner=True)
[Link]("Relaciones entre variables númericas", y=1.02)
[Link]()
INFORME DE ANÁLISIS EXPLORATORIO
1. Descripción de Archivos Leídos
2. Gráficos Generados
3. Interpretación de Correlaciones Relevantes
4. Identificación de Posible Outlier
5. Reflexión sobre la Utilidad del Flujo de Análisis
Informe de análisis exploratorio
Este informe presenta el flujo de análisis de datos utilizando las bibliotecas pandas, matplotlib y seaborn. El objetivo es integrar datos de distintos archivos, generar visualizaciones e interpretar
correlaciones y valores atípicos.
Descripción de los archivos leídos
1. [Link]
• Tipo de archivo: Texto delimitado por tabuladores (.txt)
• Contenido: Información de clientes con los campos id_cliente , nombre y edad .
• Ejemplo:
101 Juan Pérez 30
2. [Link]
• Tipo de archivo: JSON (JavaScript Object Notation)
• Contenido: Datos de productos tecnológicos con los campos id_producto , nombre y precio .
• Ejemplo:
{"id_producto": 1, "nombre": "Laptop", "precio": 1200.99}
3. [Link]
• Tipo de archivo: CSV (valores separados por comas)
• Contenido: Registros de ventas realizadas durante octubre de 2025, con los campos id_venta , fecha y monto .
• Ejemplo:
1,01/10/2025,250.5
Los tres archivos fueron fusionados utilizando la biblioteca pandas mediante el método merge() , generando un dataset final llamado ventas_completas.csv.
Lectura y fusión de archivos
In [ ]: # Lectura de datos
ventas = pd.read_csv("[Link]")
clientes = pd.read_csv("[Link]", sep="\t")
productos = pd.read_json("[Link]")
# Agregar columnas de relación
ventas["id_cliente"] = range(101, 116)
ventas["id_producto"] = range(1, 16)
# Fusión de los tres datasets
ventas_clientes = [Link](ventas, clientes, on="id_cliente", how="left")
ventas_completas = [Link](ventas_clientes, productos, on="id_producto", how="left")
# Guardar dataset consolidado
ventas_completas.to_csv("ventas_completas.csv", index=False)
# Mostrar muestra de datos
ventas_completas.head()
Out[ ]: id_venta fecha monto id_cliente id_producto nombre_x edad nombre_y precio
0 1 01/10/2025 250.50 101 1 Juan Pérez 30 Laptop 1200.99
1 2 02/10/2025 300.75 102 2 Ana López 25 Mouse 25.50
2 3 03/10/2025 150.00 103 3 Carlos Ruiz 40 Teclado 45.75
3 4 04/10/2025 200.00 104 4 Luis García 52 Monitor 299.99
4 5 05/10/2025 198.65 105 5 Marta Sánchez 28 Impresora 150.00
Análisis exploratorio inicial
Se realizó una revisión general del dataset para conocer su estructura y principales estadísticas descriptivas.
Información y descripción del dataset
In [ ]: # Mostrar encabezado para la sección de información general
print("Información general:")
# Mostrar información básica del DataFrame ventas_completas
# Esto incluye: número de filas y columnas, tipos de datos, memoria utilizada, etc.
ventas_completas.info()
# Mostrar estadísticas descriptivas del DataFrame
# Esto incluye: conteo, media, desviación estándar, valores mínimos y máximos, percentiles
# Útil para entender la distribución de los datos numéricos
display(ventas_completas.describe())
Información general:
<class '[Link]'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 10 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id_venta 15 non-null int64
1 fecha 15 non-null object
2 monto 15 non-null float64
3 id_cliente 15 non-null int64
4 id_producto 15 non-null int64
5 nombre_x 15 non-null object
6 edad 15 non-null int64
7 nombre_y 15 non-null object
8 precio 15 non-null float64
9 monto_con_iva 15 non-null float64
dtypes: float64(3), int64(4), object(3)
memory usage: 1.3+ KB
id_venta monto id_cliente id_producto edad precio monto_con_iva
count 15.000000 15.000000 15.000000 15.000000 15.000000 15.000000 15.000000
mean 8.000000 197.924667 108.000000 8.000000 34.266667 265.472000 229.592613
std 4.472136 128.039801 4.472136 4.472136 7.869168 351.342788 148.526169
min 1.000000 23.000000 101.000000 1.000000 24.000000 19.990000 26.680000
25% 4.500000 75.500000 104.500000 4.500000 28.500000 55.375000 87.580000
50% 8.000000 200.000000 108.000000 8.000000 33.000000 99.990000 232.000000
75% 11.500000 291.875000 111.500000 11.500000 39.000000 324.995000 338.575000
max 15.000000 439.090000 115.000000 15.000000 52.000000 1200.990000 509.344400
Gráficos Generados
Visualización: ventas por cliente
In [ ]: # Agrupar las ventas por cliente y calcular el monto total vendido a cada uno
# - groupby("nombre_x"): agrupa los datos por la columna de nombre del cliente
# - ["monto"].sum(): calcula la suma del monto para cada grupo/cliente
# - reset_index(): convierte el resultado de nuevo en un DataFrame normal
ventas_por_cliente = ventas_completas.groupby("nombre_x")["monto"].sum().reset_index()
# Ordenar los clientes por monto total de forma descendente (de mayor a menor)
# - by="monto": especifica la columna por la cual ordenar
# - ascending=False: orden descendente (de mayor a menor venta)
ventas_por_cliente = ventas_por_cliente.sort_values(by="monto", ascending=False)
# Crear una figura para el gráfico con tamaño personalizado
# - figsize=(12,5): ancho de 12 pulgadas y alto de 5 pulgadas
[Link](figsize=(12,5))
# Crear un gráfico de barras usando seaborn
# - data=ventas_por_cliente: DataFrame con los datos a graficar
# - x="nombre_x": eje X con los nombres de clientes
# - y="monto": eje Y con los montos totales
# - palette="cubehelix": esquema de colores que varía sistemáticamente
[Link](data=ventas_por_cliente, x="nombre_x", y="monto", palette="cubehelix")
# Agregar título al gráfico
[Link]("Monto total vendido por cliente")
# Etiquetar el eje X
[Link]("Cliente")
# Etiquetar el eje Y
[Link]("Monto total ($)")
# Rotar las etiquetas del eje X 45 grados para mejor legibilidad
# Esto evita que los nombres de clientes se solapen
[Link](rotation=45)
# Mostrar el gráfico
[Link]()
/tmp/[Link]: FutureWarning:
Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.
[Link](data=ventas_por_cliente, x="nombre_x", y="monto", palette="cubehelix")
Visualización: ventas por producto
In [ ]: # Agrupar las ventas por producto y calcular el monto total vendido de cada uno
# - groupby("nombre_y"): agrupa los datos por la columna de nombre del producto
# - ["monto"].sum(): calcula la suma del monto para cada producto
# - reset_index(): convierte el resultado en un DataFrame normal
ventas_por_producto = ventas_completas.groupby("nombre_y")["monto"].sum().reset_index()
# Renombrar las columnas para mayor claridad
# - "nombre_y" se convierte en "producto"
# - "monto" se convierte en "monto_total"
ventas_por_producto.columns = ["producto", "monto_total"]
# Crear una figura cuadrada para el gráfico circular
# - figsize=(6,6): figura cuadrada de 6x6 pulgadas
[Link](figsize=(6,6))
# Crear un gráfico circular (pie chart)
# - ventas_por_producto["monto_total"]: valores para cada segmento del gráfico
# - labels=ventas_por_producto["producto"]: etiquetas con nombres de productos
# - autopct="%1.1f%%": muestra el porcentaje con 1 decimal en cada segmento
# - startangle=90: comienza el primer segmento en el ángulo 90° (arriba)
[Link](ventas_por_producto["monto_total"],
labels=ventas_por_producto["producto"],
autopct="%1.1f%%",
startangle=90)
# Agregar título al gráfico
[Link]("Distribución de ventas por producto")
# Mostrar el gráfico circular
[Link]()
Análisis de correlaciones
Se agregaron columnas adicionales como monto_con_iva para observar la relación entre las variables numéricas. El mapa de calor muestra la fuerza de las correlaciones entre:
Monto de venta
Edad del cliente
Precio del producto
Monto con IVA
Cálculo y visualización de correlaciones
In [ ]: # Crear columna adicional: monto con IVA (Impuesto al Valor Agregado)
# - Multiplica el monto original por 1.16 (equivalente a agregar 16% de IVA)
# - Esto calcula el precio final que paga el cliente incluyendo impuestos
ventas_completas["monto_con_iva"] = ventas_completas["monto"] * 1.16
# Calcular matriz de correlación entre variables numéricas
# - num_cols: lista de columnas numéricas a incluir en el análisis
# - ventas_completas[num_cols]: selecciona solo las columnas numéricas especificadas
# - .corr(): calcula la matriz de correlación (coeficientes de Pearson)
num_cols = ["monto", "edad", "precio", "monto_con_iva"]
corr = ventas_completas[num_cols].corr()
# Graficar mapa de calor (heatmap) de correlaciones
[Link](figsize=(6,4))
# Crear el heatmap de correlaciones
# - corr: matriz de correlación a visualizar
# - annot=True: muestra los valores numéricos en cada celda
# - cmap="coolwarm": esquema de colores (azul para negativas, rojo para positivas)
# - fmt=".2f": formato de 2 decimales para los valores mostrados
[Link](corr, annot=True, cmap="coolwarm", fmt=".2f")
# Agregar título al gráfico
[Link]("Mapa de correlaciones")
# Mostrar el gráfico
[Link]()
Interpretación de correlaciones
1. Precio y monto: correlación positiva.
A mayor precio del producto, mayor es el monto total de venta.
2. Edad y monto: correlación débil.
La edad del cliente no influye de manera significativa en el valor de compra.
Detección de valores atípicos (outliers)
Se utilizó un gráfico boxplot para identificar clientes con montos de venta fuera del rango típico.
In [ ]: # Crear una figura para el gráfico con tamaño personalizado
# - figsize=(12,6): ancho de 12 pulgadas, alto de 6 pulgadas (formato rectangular)
[Link](figsize=(12,6))
# Crear un gráfico de caja (boxplot) para detectar valores atípicos (outliers)
# - data=ventas_completas: DataFrame fuente de los datos
# - x="nombre_x": variable categórica en el eje X (nombres de clientes)
# - y="monto": variable numérica en el eje Y (montos de venta)
# - palette="Set2": esquema de colores predefinido de seaborn
[Link](data=ventas_completas, x="nombre_x", y="monto", palette="Set2")
# Agregar título descriptivo al gráfico
[Link]("Detección de outliers en el monto por cliente")
# Etiquetar el eje X claramente
[Link]("Cliente")
# Etiquetar el eje Y con la unidad monetaria
[Link]("Monto ($)")
# Rotar las etiquetas del eje X 45 grados para mejor legibilidad
# Evita que los nombres de clientes se solapen cuando son largos
[Link](rotation=45)
# Mostrar el gráfico
[Link]()
/tmp/[Link]: FutureWarning:
Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.
[Link](data=ventas_completas, x="nombre_x", y="monto", palette="Set2")
Análisis del outlier
Interpretación del outlier
Se detectó un cliente con un monto de venta significativamente más alto que los demás. Esto podría deberse a:
Una compra de alto valor (por ejemplo, Laptop o Smartphone).
Un error de captura de datos.
Es recomendable revisar el registro antes de tomar decisiones basadas en él.
Visualización multivariable
Para explorar relaciones entre variables numéricas se utilizó un pairplot de Seaborn.
Pairplot multivariable
In [ ]: # Crear un pairplot (gráfico de pares) para análisis multivariable
# - ventas_completas[["monto", "precio", "edad"]]: selecciona las 3 variables numéricas a analizar
# - diag_kind="kde": en la diagonal muestra estimaciones de densidad kernel en lugar de histogramas
# - corner=True: muestra solo la mitad inferior de la matriz (evita duplicados)
[Link](ventas_completas[["monto", "precio", "edad"]], diag_kind="kde", corner=True)
# Agregar título general al conjunto de gráficos
# - y=1.02: ajusta la posición vertical del título para que no se solape con los gráficos
[Link]("Relaciones entre variables numéricas", y=1.02)
# Mostrar la matriz completa de gráficos
[Link]()
Reflexión sobre la utilidad del flujo de análisis
El flujo de análisis aplicado —lectura, fusión, visualización y correlación— demuestra la utilidad de Python para transformar datos en conocimiento.
Beneficios:
Integración de múltiples fuentes de datos (CSV, TXT, JSON).
Identificación de patrones de compra por cliente y producto.
Detección de relaciones entre variables y valores atípicos.
Generación de gráficos que facilitan la interpretación visual.
Conclusión:
El análisis con pandas, matplotlib y seaborn permite obtener conclusiones relevantes y respaldar la toma de decisiones basadas en datos reales.