EstevezAlvarez
Python Análise de dados Pandas

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.

Carregar CSV / DB / API Explorar shape, dtypes, nulls Limpar nulos, tipos, outliers Transformar groupby, merge, pivot Analisar estatísticas, KPIs Visualizar gráficos, relatórios
O fluxo padrão de análise: carga de dados → exploração → limpeza → transformação → análise estatística → visualização.

As ferramentas de dados em Python

Três bibliotecas cobrem quase todos os casos:

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())
fecha producto cantidad precio_unit total índice 0 2026-01-03 Manzana 50 1.20 60.00 1 2026-01-03 Naranja 30 0.90 27.00 2 2026-01-04 Manzana NaN 1.20 NaN ← nulo (NaN) datetime64 object (str) float64 float64 float64 int64 dtype → df.shape = (3, 5) · 3 linhas, 5 colunas · 1 valor nulo em 'cantidad'
Anatomia de um DataFrame: índice (linha), colunas com tipo (dtype) e valores NaN em células vazias que precisam ser tratados antes da análise.

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

  1. 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.
  2. DuckDB — SQL diretamente sobre DataFrames ou arquivos Parquet, ideal para análises ad hoc sem servidor.
  3. scikit-learn — quando a análise exploratória revela padrões que vale a pena modelar com machine learning.
  4. Jupyter + nbconvert — para fluxos de análise documentados e reproduzíveis que podem ser exportados para HTML ou PDF.