Python para análise de dados: do CSV ao insight
A análise de dados em Python tem um fluxo bem definido: carregar, explorar, limpar, transformar, analisar e visualizar. Dominar esse ciclo com pandas e matplotlib resolve 80% dos problemas reais.
As ferramentas de dados em Python
Três bibliotecas cobrem quase todos os casos:
- pandas — manipulação de dados tabulares (DataFrames). A biblioteca central da análise.
- NumPy — operações numéricas vetorizadas, base do pandas e do scikit-learn.
- matplotlib / seaborn — visualização. matplotlib para controle total; seaborn para gráficos estatísticos com menos código.
pip install pandas numpy matplotlib seaborn
Carregar e explorar os dados
O primeiro passo é sempre entender o formato e a qualidade do dataset antes de transformar qualquer dado.
import pandas as pd
import numpy as np
# Cargar desde CSV
df = pd.read_csv("ventas.csv", parse_dates=["fecha"])
# Primeras filas
print(df.head())
# Forma y tipos
print(df.shape) # (filas, columnas)
print(df.dtypes) # tipo de cada columna
print(df.info()) # nulos + tipos en una línea
# Estadísticas descriptivas
print(df.describe())
# Valores nulos por columna
print(df.isnull().sum())
Limpar e transformar
A limpeza é a etapa que mais consome tempo em projetos reais. Os problemas mais comuns são valores nulos, tipos incorretos e duplicatas.
# Eliminar filas con nulos en columnas críticas
df = df.dropna(subset=["cantidad", "precio_unit"])
# Rellenar nulos opcionales con la mediana
df["descuento"] = df["descuento"].fillna(df["descuento"].median())
# Convertir tipos
df["fecha"] = pd.to_datetime(df["fecha"])
df["cantidad"] = df["cantidad"].astype(int)
# Eliminar duplicados
df = df.drop_duplicates()
# Crear columna calculada
df["total"] = df["cantidad"] * df["precio_unit"]
# Extraer componentes de fecha
df["mes"] = df["fecha"].dt.month
df["anio"] = df["fecha"].dt.year
Analisar: groupby e agregações
groupby é a operação mais poderosa do pandas. Permite responder a perguntas como “quanto vendemos de cada produto em cada mês?” em uma única linha.
# Ventas totales por producto
ventas_producto = (
df.groupby("producto")["total"]
.agg(["sum", "mean", "count"])
.rename(columns={"sum": "total_ventas", "mean": "ticket_medio", "count": "n_transacciones"})
.sort_values("total_ventas", ascending=False)
)
print(ventas_producto)
# Evolución mensual
evolucion = df.groupby(["anio", "mes"])["total"].sum().reset_index()
print(evolucion)
# Pivot table: producto vs mes
pivot = df.pivot_table(
values="total",
index="producto",
columns="mes",
aggfunc="sum",
fill_value=0
)
print(pivot)
Visualizar resultados
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# Gráfica de barras — top productos
ventas_producto["total_ventas"].head(10).plot(
kind="bar", ax=axes[0], color="#4f8cff", edgecolor="white"
)
axes[0].set_title("Top 10 productos por ventas")
axes[0].set_xlabel("")
axes[0].set_ylabel("Total €")
axes[0].tick_params(axis="x", rotation=45)
# Evolución temporal
evolucion.plot(
x="mes", y="total", kind="line",
ax=axes[1], marker="o", color="#4f8cff"
)
axes[1].set_title("Evolución mensual de ventas")
axes[1].set_xlabel("Mes")
axes[1].set_ylabel("Total €")
plt.tight_layout()
plt.savefig("informe_ventas.png", dpi=150)
plt.show()
Exportar resultados
# Exportar a Excel con múltiples hojas
with pd.ExcelWriter("informe.xlsx", engine="openpyxl") as writer:
ventas_producto.to_excel(writer, sheet_name="Por producto")
evolucion.to_excel(writer, sheet_name="Evolución mensual", index=False)
pivot.to_excel(writer, sheet_name="Pivot producto-mes")
# Exportar a CSV limpio
df.to_csv("ventas_limpias.csv", index=False, encoding="utf-8")
# Cargar en PostgreSQL
from sqlalchemy import create_engine
engine = create_engine("postgresql://user:pass@localhost/ventas_db")
df.to_sql("ventas", engine, if_exists="replace", index=False)
Próximos passos
- Polars — alternativa ao pandas, significativamente mais rápida em datasets grandes (>1 milhão de linhas), graças à execução lazy e ao suporte multicore nativo.
- DuckDB — SQL diretamente sobre DataFrames ou arquivos Parquet, ideal para análises ad hoc sem servidor.
- scikit-learn — quando a análise exploratória revela padrões que vale a pena modelar com machine learning.
- Jupyter + nbconvert — para fluxos de análise documentados e reproduzíveis que podem ser exportados para HTML ou PDF.