Saltar al contenido
Tutorial Por Cesar Nuñez intermedio
30 minutos

Análisis de datos con Python y ChatGPT: del Excel al insight en 30 minutos

Python 3.10+ pandas matplotlib openai SDK

Prerequisitos

  • Python básico instalado
  • Un archivo CSV o Excel con datos reales

pandas + matplotlib + ChatGPT es el stack mínimo para hacer análisis de datos útiles. Con estos tres puedes pasar de una hoja de cálculo confusa a insights accionables en menos de una hora.

Si tienes un Excel con datos y no sabes por dónde empezar, este tutorial te lleva desde el archivo crudo hasta un análisis interpretado con IA. No necesitas saber estadística avanzada ni ser analista de datos.

Instalar dependencias

pip install pandas matplotlib openpyxl openai python-dotenv

Crea un archivo .env con tu clave:

OPENAI_API_KEY=sk-...

Cargar y explorar los datos

Para este tutorial usamos un dataset ficticio de ventas. Guarda este CSV como ventas.csv:

fecha,vendedor,producto,monto,region
2026-01-05,Ana García,Software A,1200,México
2026-01-08,Carlos López,Software B,850,Colombia
2026-01-12,Ana García,Software A,1400,México
2026-01-15,María Rodríguez,Software C,2200,Argentina
2026-01-20,Carlos López,Software A,950,Colombia
2026-02-03,María Rodríguez,Software B,1100,Argentina
2026-02-10,Ana García,Software C,3100,México
2026-02-18,Carlos López,Software C,2800,Colombia
2026-02-22,María Rodríguez,Software A,1050,Argentina
2026-03-05,Ana García,Software B,900,México

Ahora cárgalo y explóralo:

import pandas as pd

df = pd.read_csv("ventas.csv", parse_dates=["fecha"])

print("Forma del dataset:", df.shape)
print("\nPrimeras filas:")
print(df.head())

print("\nEstadísticas básicas:")
print(df["monto"].describe())

print("\nValores nulos por columna:")
print(df.isnull().sum())

Output esperado:

Forma del dataset: (10, 5)
Estadísticas básicas:
count      10.000000
mean     1455.000000
std       706.847...
min       850.000000
max      3100.000000

Limpieza básica de datos

Antes de analizar, verifica y limpia:

# Eliminar duplicados
df = df.drop_duplicates()

# Convertir texto a minúsculas en columnas de texto
df["region"] = df["region"].str.strip()
df["vendedor"] = df["vendedor"].str.strip()

# Filtrar montos negativos o cero (errores de carga)
df = df[df["monto"] > 0]

print(f"Dataset limpio: {len(df)} filas")

Análisis y visualización

import matplotlib.pyplot as plt
import matplotlib.ticker as mticker

fig, axes = plt.subplots(1, 3, figsize=(15, 5))

# 1. Ventas por vendedor
ventas_vendedor = df.groupby("vendedor")["monto"].sum().sort_values(ascending=False)
ventas_vendedor.plot(kind="bar", ax=axes[0], color="#4648D4", edgecolor="white")
axes[0].set_title("Ventas por vendedor")
axes[0].set_ylabel("Monto total ($)")
axes[0].tick_params(axis="x", rotation=30)

# 2. Ventas por región
ventas_region = df.groupby("region")["monto"].sum()
ventas_region.plot(kind="pie", ax=axes[1], autopct="%1.0f%%", startangle=90)
axes[1].set_title("Ventas por región")
axes[1].set_ylabel("")

# 3. Ventas mensuales
df["mes"] = df["fecha"].dt.to_period("M")
ventas_mes = df.groupby("mes")["monto"].sum()
ventas_mes.plot(kind="line", ax=axes[2], marker="o", color="#4FDBC8", linewidth=2)
axes[2].set_title("Tendencia mensual")
axes[2].set_ylabel("Monto ($)")

plt.tight_layout()
plt.savefig("analisis_ventas.png", dpi=150, bbox_inches="tight")
plt.show()
print("Gráfico guardado como analisis_ventas.png")

Pedir interpretación a la IA

Aquí es donde la IA multiplica el valor del análisis. Genera un resumen del dataset y pídele interpretación:

from openai import OpenAI
from dotenv import load_dotenv
import os

load_dotenv()
client = OpenAI()

# Preparar resumen del dataset para la IA
resumen = f"""
Dataset de ventas — {len(df)} transacciones entre {df['fecha'].min().date()} y {df['fecha'].max().date()}

VENTAS POR VENDEDOR:
{df.groupby('vendedor')['monto'].agg(['sum', 'count', 'mean']).round(0).to_string()}

VENTAS POR REGIÓN:
{df.groupby('region')['monto'].sum().to_string()}

VENTAS POR PRODUCTO:
{df.groupby('producto')['monto'].agg(['sum', 'count']).to_string()}

TENDENCIA MENSUAL:
{df.groupby(df['fecha'].dt.to_period('M'))['monto'].sum().to_string()}
"""

respuesta = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[
        {
            "role": "system",
            "content": "Eres analista de datos de ventas. Analiza los datos y da 3 insights accionables y concretos. Usa lenguaje directo, sin jerga técnica."
        },
        {
            "role": "user",
            "content": f"Analiza estos datos de ventas y dame los principales hallazgos:\n\n{resumen}"
        }
    ]
)

print("📊 ANÁLISIS DE LA IA:")
print(respuesta.choices[0].message.content)

Output de ejemplo:

📊 ANÁLISIS DE LA IA:
1. Ana García genera el 42% del revenue total pero tiene la menor venta promedio.
   Oportunidad: enfocarse en Software C donde el ticket promedio es 2.5x mayor.

2. Software C tiene 3x el monto promedio de Software A. Si el margen es similar,
   el mix de productos está desbalanceado: Software A representa el 40% de las
   transacciones pero solo el 25% del revenue.

3. Febrero fue el mejor mes (+38% vs enero). Investigar qué cambió: ¿campaña,
   temporada, nuevo cliente? Replicar las condiciones en marzo.

Script completo

El flujo completo en menos de 50 líneas. Guárdalo como analizar.py y úsalo con cualquier CSV que tenga estructura similar:

import pandas as pd
import matplotlib.pyplot as plt
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI()

def analizar_ventas(archivo: str):
    df = pd.read_csv(archivo, parse_dates=["fecha"])
    df = df.drop_duplicates()
    df = df[df["monto"] > 0]
    
    resumen = f"Ventas: {df['monto'].sum():,.0f} total, {len(df)} transacciones\n"
    resumen += f"Por vendedor:\n{df.groupby('vendedor')['monto'].sum().to_string()}\n"
    resumen += f"Por región:\n{df.groupby('region')['monto'].sum().to_string()}"
    
    r = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "Analista de ventas. 3 insights accionables, lenguaje directo."},
            {"role": "user", "content": resumen}
        ]
    )
    print(r.choices[0].message.content)

analizar_ventas("ventas.csv")

El siguiente paso natural es conectar esto con una base de datos real (PostgreSQL, BigQuery) en lugar de un CSV, y programar que el análisis corra automáticamente cada lunes.

#datos#python#pandas#chatgpt#excel#analisis#visualizacion

Notas de la comunidad

¿Te fue útil este contenido?

Tamaño de lectura