Estatística Aplicada & Python

Análise Estatística
Completa com Python

12 tópicos fundamentais de estatística — do web scraping à segmentação de clientes — aplicados sobre dados de Servidores Públicos Federais (API CGU / Portal da Transparência).

Python 3.12 Pandas · NumPy · Matplotlib SciPy · Statsmodels · Scikit-learn Portal da Transparência — CGU 5.000 registros simulados 13 visualizações

Registros Analisados

5.000

Servidores públicos federais

Tópicos Estatísticos

12

Do básico ao avançado

Rem. Média — Fazenda

R$ 15,7k

vs R$ 9,0k — Educação (t-test p < 0.05)

Outliers Salariais

3,0%

150 servidores acima de R$ 22.259

Retenção Mês 1

36,4%

Cohort — queda crítica pós-aquisição

Champions RFM

R$ 4.712

Ticket médio — melhor segmento

Tópicos Cobertos

0

Web Scraping

API REST oficial do Portal da Transparência (CGU). Autenticação com chave, paginação, rate limit e estruturação em DataFrame.

requests · BeautifulSoup
1

Histogramas

Distribuição de frequências, skewness, kurtosis, KDE sobreposta e impacto do número de bins (Regra de Sturges).

matplotlib · scipy.stats
2

Box-Plots

Q1, Q3, IQR, detecção de outliers (1.5×IQR), comparação entre grupos. 150 outliers identificados (3% da base).

matplotlib
3

Correlação de Pearson

Matriz de correlação, heatmap, scatter com regressão linear e teste de significância (p-valor).

scipy.stats · seaborn
4

R² — Coef. Determinação

Poder explicativo do modelo, diferença entre SQR e SQT, visualização da variância explicada vs. residual.

sklearn · LinearRegression
5

IV — Information Value

Weight of Evidence (WoE) e Information Value para seleção de variáveis em modelos de classificação. Implementação manual.

pandas · numpy
6

Causalidade

Correlação ≠ Causalidade. Simulação de variável de confusão. Critérios de Bradford Hill. Correlações espúrias.

numpy · matplotlib
7

Teoria Frequentista

H₀ vs H₁, p-valor, t-test de Welch (Fazenda vs Educação: diferença de R$ 6.716, p < 0.05), IC 95%.

scipy.stats.ttest_ind
8

Distribuição Normal

Regra 68-95-99.7, z-score, PDF gaussiana. Shapiro-Wilk confirma que salários não seguem distribuição normal.

scipy.stats · shapiro
9

Lei dos Grandes Números

Simulação de convergência: lançamento de moeda (n=10.000) e média salarial amostral com tamanhos crescentes.

numpy · simulação
10

Regressão Linear Múltipla

OLS com encoding de variáveis categóricas, diagnóstico de resíduos, QQ-plot, homocedasticidade e coeficientes.

statsmodels · OLS
11

RFM

Segmentação Recência × Frequência × Monetário em 7 segmentos. Champions com ticket médio de R$ 4.712.

pandas · segmentação
12

Cohort Analysis

Retenção por coorte mensal. Queda de 100% → 36,4% no mês 1. Heatmap e curvas de sobrevivência.

pandas pivot_table

Visualizações Analíticas

Remuneração Média por Ministério

Ordenado por mediana — referência para Box-Plots

Distribuição de Escolaridade

Perfil educacional dos 5.000 servidores simulados

Correlações com Remuneração Bruta

Coeficientes de Pearson — variáveis numéricas

Segmentos RFM — Clientes por Grupo

Análise de e-commerce simulado (2.000+ clientes)

Curva de Retenção — Cohort Médio

Taxa de clientes ativos por mês de vida (média geral)

Teste t — Fazenda vs. Educação

Diferença salarial estatisticamente significante (p < 0.05)

Insights Principais

📊

Assimetria Positiva nos Salários

A distribuição salarial apresenta skewness positiva: média (R$ ~10.200) supera a mediana (~R$ 9.400). Outliers de alto salário distorcem a percepção — use sempre mediana para comparações salariais.

🔗

Correlação ≠ Causalidade

A simulação demonstrou como uma variável de confusão (experiência total) gera correlação espúria entre duas variáveis não relacionadas — erro clássico em análises observacionais.

🧪

Diferença Salarial Significante

t-test de Welch: Ministério da Fazenda (R$ 15.754) vs. Educação (R$ 9.038) — diferença de R$ 6.716 com p < 0.001. Rejeitamos H₀ com 99.9% de confiança.

🔔

Salários Não Seguem Normal

Shapiro-Wilk (n=500) confirmou que remuneração não segue distribuição normal (p << 0.05). Distribuição log-normal é mais adequada para modelagem — impacta escolha de testes estatísticos.

🎯

Champions: Alto Valor, Pequena Base

Segmento Champions (RFM) tem ticket médio de R$ 4.712 — 24× maior que Lost/Hibernating (R$ 134). Estratégia: proteger Champions e reativar At Risk (recência 159 dias, ticket R$ 1.226).

👥

Janela Crítica de Retenção

A queda de 100% → 36,4% ocorre no mês 1 do cohort — o primeiro mês após aquisição é a janela mais crítica para engajamento. A partir do mês 6, a retenção colapsa para menos de 22%.

Segmentação RFM — Resumo por Grupo

Segmento Recência Média (dias) Frequência Média Ticket Médio (R$) Estratégia Recomendada
Champions 24,810,64.712,70 Programas de fidelidade VIP, early access
Loyal Customers 71,05,01.219,00 Upsell, cross-sell, manter engajamento
Potential Loyalists 73,82,0354,90 Aumentar frequência com ofertas segmentadas
New Customers 20,61,2190,40 Onboarding, segunda compra incentivada
At Risk 159,35,21.226,90 Campanha de reativação urgente — alto valor histórico
Need Attention 223,42,9378,40 Pesquisa de satisfação, oferta personalizada
Lost / Hibernating 390,81,4134,70 Win-back com desconto agressivo ou abandono

Web Scraping — API Portal da Transparência

Passo 1

Cadastro na API

Acesse portaltransparencia.gov.br/api, cadastre seu e-mail e receba sua chave gratuita em até 24h.

Passo 2

Requisição paginada

Endpoint /servidores retorna até 500 registros/página. Loop com sleep de 0.5s para respeitar rate limit.

Passo 3

Estruturação

Resposta JSON → pd.DataFrame. Limpeza de tipos, tratamento de nulos e exportação para CSV.

Passo 4

Análise

Dataset limpo alimenta as 12 seções de análise estatística — histogramas, correlações, regressões e segmentações.

# ── Coleta de Servidores Públicos Federais — API CGU ───────────────────── import requests, time, pandas as pd API_KEY = "SUA_CHAVE_AQUI" BASE_URL = "https://api.portaltransparencia.gov.br/api-de-dados" HEADERS = {"chave-api-dados": API_KEY, "Accept": "application/json"} def coletar_servidores(paginas=10, tam_pagina=500): registros = [] for pagina in range(1, paginas + 1): resp = requests.get( f"{BASE_URL}/servidores", headers=HEADERS, params={"pagina": pagina, "tamanhoPagina": tam_pagina}, timeout=30 ) if resp.status_code == 200: dados = resp.json() if not dados: break registros.extend(dados) time.sleep(0.5) # respeitar rate limit return pd.DataFrame(registros) df = coletar_servidores(paginas=10) df.to_csv("servidores_federais.csv", index=False, encoding="utf-8-sig")

Estrutura do Repositório

analise-estatistica-completa-python/
├── analise_estatistica_completa.ipynb # Notebook principal (36 células, 12 seções)
├── fig_01_histogramas.png # Distribuição salarial + KDE + skewness
├── fig_01b_histogramas_comparacao.png # KDE por ministério + impacto bins
├── fig_02_boxplots.png # IQR, outliers por órgão e escolaridade
├── fig_03_correlacao_pearson.png # Matriz heatmap + scatter com regressão
├── fig_04_r2.png # Coeficiente de determinação visual
├── fig_05_iv_woe.png # WoE por categoria — 3 variáveis
├── fig_06_causalidade.png # Correlação espúria vs relações reais
├── fig_07_frequentista.png # Distribuição nula + região de rejeição
├── fig_08_normal.png # Regra 68-95-99.7 + Shapiro-Wilk
├── fig_09_lei_grandes_numeros.png # Convergência da média amostral
├── fig_10_regressao.png # Diagnóstico OLS: resíduos, QQ, coefs
├── fig_11_rfm.png # Segmentação RFM — scatter + heatmap
├── fig_12_cohort.png # Heatmap de retenção + curvas por coorte
├── README.md
├── index.html
└── LICENSE # MIT 2025 Thiago Galetto

⚠️ O dataset de servidores federais não está incluído. Para coletar dados reais, obtenha uma chave gratuita em portaldatransparencia.gov.br/api e execute a Seção 0 do notebook.