Análisis de datos con Python y ChatGPT: del Excel al insight en 30 minutos
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.