import gradio as gr
import pandas as pd
import numpy as np
import json
from datetime import datetime
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import warnings
from scipy import stats
warnings.filterwarnings('ignore')
# ========== SISTEMA DE ANÁLISE DE DADOS AVANÇADO ==========
class AnalisadorDadosAvancado:
"""Sistema avançado de análise e visualização de dados com 5-sigma de precisão"""
def __init__(self):
self.df = None
self.analises_realizadas = []
self.historico_analises = {}
def carregar_dados(self, dados, tipo="json"):
"""Carrega dados de diferentes fontes com validação robusta"""
try:
if tipo == "json":
if hasattr(dados, 'name'):
with open(dados.name, 'r', encoding='utf-8') as f:
conteudo = f.read()
dados_json = json.loads(conteudo)
self.df = pd.DataFrame(dados_json)
else:
dados_json = json.loads(dados)
self.df = pd.DataFrame(dados_json)
elif tipo == "csv":
self.df = pd.read_csv(dados.name, encoding='utf-8')
elif tipo == "excel":
self.df = pd.read_excel(dados.name)
# Validação de dados
if self.df is None or self.df.empty:
return False, "❌ Arquivo vazio - nenhum dado para processar"
# Converter colunas numéricas de forma mais robusta
for col in self.df.columns:
if self.df[col].dtype == 'object':
try:
self.df[col] = pd.to_numeric(self.df[col], errors='ignore')
except:
pass
self.analises_realizadas.append(f"Dados carregados - {self.df.shape[0]} linhas × {self.df.shape[1]} colunas")
return True, f"✅ Dados carregados com sucesso!\n📊 {self.df.shape[0]} linhas × {self.df.shape[1]} colunas"
except json.JSONDecodeError as e:
return False, f"❌ Erro no formato JSON: {str(e)}\nVerifique se o JSON está bem formatado."
except Exception as e:
return False, f"❌ Erro ao carregar dados: {str(e)}"
def analise_exploratoria(self):
"""Realiza análise exploratória completa com estatísticas de 5-sigma"""
if self.df is None or self.df.empty:
return {"erro": "Nenhum dado carregado"}
colunas_numericas = self.df.select_dtypes(include=[np.number]).columns.tolist()
colunas_categoricas = self.df.select_dtypes(include=['object', 'category']).columns.tolist()
analise = {
'dimensoes': f"{self.df.shape[0]} linhas × {self.df.shape[1]} colunas",
'tipos_dados': {str(k): str(v) for k, v in self.df.dtypes.to_dict().items()},
'valores_nulos': {str(k): int(v) for k, v in self.df.isnull().sum().to_dict().items()},
'percentual_nulos': {str(k): float(v) for k, v in (self.df.isnull().sum() / len(self.df) * 100).to_dict().items()},
'estatisticas_descritivas': self.df.describe().to_dict() if len(colunas_numericas) > 0 else {},
'colunas_numericas': colunas_numericas,
'colunas_categoricas': colunas_categoricas,
'memoria_uso': f"{self.df.memory_usage(deep=True).sum() / 1024**2:.2f} MB",
'valores_unicos': {str(col): int(self.df[col].nunique()) for col in self.df.columns}
}
self.analises_realizadas.append("Análise exploratória realizada")
self.historico_analises['exploratoria'] = analise
return analise
def analise_estatistica_cinco_sigma(self):
"""Análise estatística com precisão 5-sigma (99.99994% confiança)"""
if self.df is None or self.df.empty:
return {"erro": "Nenhum dado carregado"}
analise_avancada = {}
colunas_numericas = self.df.select_dtypes(include=[np.number]).columns
if len(colunas_numericas) == 0:
return {"erro": "Nenhuma coluna numérica encontrada para análise"}
for col in colunas_numericas:
dados = self.df[col].dropna()
if len(dados) < 2:
continue
try:
# Estatísticas básicas
media = float(dados.mean())
mediana = float(dados.median())
desvio = float(dados.std())
if desvio == 0:
desvio = 0.0001 # Evitar divisão por zero
# 5-sigma bounds (99.99994% confiança)
limite_inf_5sigma = media - 5 * desvio
limite_sup_5sigma = media + 5 * desvio
# 3-sigma bounds (99.7% confiança)
limite_inf_3sigma = media - 3 * desvio
limite_sup_3sigma = media + 3 * desvio
# Outliers em diferentes níveis
outliers_5sigma = int(len(dados[(dados < limite_inf_5sigma) | (dados > limite_sup_5sigma)]))
outliers_3sigma = int(len(dados[(dados < limite_inf_3sigma) | (dados > limite_sup_3sigma)]))
# IQR para outliers tradicionais
q1 = float(dados.quantile(0.25))
q3 = float(dados.quantile(0.75))
iqr = q3 - q1
if iqr > 0:
outliers_iqr = int(len(dados[(dados < q1 - 1.5*iqr) | (dados > q3 + 1.5*iqr)]))
else:
outliers_iqr = 0
# Testes de normalidade
if len(dados) >= 3:
try:
shapiro_stat, shapiro_p = stats.shapiro(dados.sample(min(5000, len(dados))))
shapiro_stat = float(shapiro_stat)
shapiro_p = float(shapiro_p)
except:
shapiro_stat, shapiro_p = 0.0, 1.0
else:
shapiro_stat, shapiro_p = 0.0, 1.0
# Intervalo de confiança 99.99994% (5-sigma)
try:
ic_5sigma = stats.t.interval(0.9999994, len(dados)-1,
loc=media,
scale=stats.sem(dados))
ic_5sigma_inf = float(ic_5sigma[0])
ic_5sigma_sup = float(ic_5sigma[1])
except:
ic_5sigma_inf = limite_inf_5sigma
ic_5sigma_sup = limite_sup_5sigma
analise_avancada[col] = {
'media': media,
'mediana': mediana,
'desvio_padrao': desvio,
'assimetria': float(dados.skew()),
'curtose': float(dados.kurtosis()),
'variancia': float(dados.var()),
'coef_variacao': float(desvio / media * 100 if media != 0 else 0),
'intervalo': f"{float(dados.min()):.2f} - {float(dados.max()):.2f}",
'amplitude': float(dados.max() - dados.min()),
'q1': q1,
'q3': q3,
'iqr': iqr,
'outliers_iqr': outliers_iqr,
'outliers_3sigma': outliers_3sigma,
'outliers_5sigma': outliers_5sigma,
'limite_inf_5sigma': limite_inf_5sigma,
'limite_sup_5sigma': limite_sup_5sigma,
'ic_5sigma_inf': ic_5sigma_inf,
'ic_5sigma_sup': ic_5sigma_sup,
'normalidade_shapiro_stat': shapiro_stat,
'normalidade_shapiro_p': shapiro_p,
'eh_normal': shapiro_p > 0.05,
'confianca_5sigma': '99.99994%'
}
except Exception as e:
print(f"Erro ao processar coluna {col}: {str(e)}")
continue
if len(analise_avancada) == 0:
return {"erro": "Não foi possível analisar nenhuma coluna"}
self.analises_realizadas.append("Análise 5-sigma realizada")
self.historico_analises['cinco_sigma'] = analise_avancada
return analise_avancada
def gerar_visualizacoes_interativas(self):
"""Gera visualizações interativas de alta qualidade"""
if self.df is None or self.df.empty:
return None, "❌ Nenhum dado carregado"
try:
colunas_numericas = self.df.select_dtypes(include=[np.number]).columns
colunas_categoricas = self.df.select_dtypes(include=['object', 'category']).columns
if len(colunas_numericas) == 0 and len(colunas_categoricas) == 0:
return None, "❌ Nenhuma coluna válida para visualização"
figuras = []
# 1. Heatmap de correlação com anotações
if len(colunas_numericas) > 1:
try:
corr_matrix = self.df[colunas_numericas].corr()
fig_corr = px.imshow(
corr_matrix,
title="🔥 Mapa de Correlação - Análise 5-Sigma",
color_continuous_scale="RdBu_r",
aspect="auto",
text_auto='.2f'
)
fig_corr.update_layout(
height=600,
title_font_size=20,
title_x=0.5
)
figuras.append(fig_corr)
except Exception as e:
print(f"Erro no heatmap: {e}")
# 2. Distribuições com limites 5-sigma
if len(colunas_numericas) > 0:
for col in list(colunas_numericas)[:4]:
try:
dados = self.df[col].dropna()
if len(dados) < 2:
continue
media = dados.mean()
desvio = dados.std()
fig = go.Figure()
# Histograma
fig.add_trace(go.Histogram(
x=dados,
name='Distribuição',
nbinsx=50,
marker_color='lightblue',
opacity=0.7
))
# Linhas de referência (5-sigma)
fig.add_vline(x=media, line_dash="dash", line_color="red",
annotation_text="Média", annotation_position="top")
if desvio > 0:
fig.add_vline(x=media - 5*desvio, line_dash="dot", line_color="orange",
annotation_text="-5σ", annotation_position="bottom left")
fig.add_vline(x=media + 5*desvio, line_dash="dot", line_color="orange",
annotation_text="+5σ", annotation_position="bottom right")
fig.update_layout(
title=f"📊 Distribuição com Limites 5-Sigma: {col}",
xaxis_title=col,
yaxis_title="Frequência",
height=500,
showlegend=True
)
figuras.append(fig)
except Exception as e:
print(f"Erro no histograma {col}: {e}")
continue
# 3. Box plots comparativos
if len(colunas_numericas) > 0:
try:
fig_box = go.Figure()
for col in list(colunas_numericas)[:10]: # Máximo 10 variáveis
dados_col = self.df[col].dropna()
if len(dados_col) > 0:
fig_box.add_trace(go.Box(
y=dados_col,
name=str(col),
boxmean='sd'
))
fig_box.update_layout(
title="📦 Box Plots Comparativos - Variáveis Numéricas",
yaxis_title="Valores",
height=500,
showlegend=True
)
figuras.append(fig_box)
except Exception as e:
print(f"Erro no boxplot: {e}")
# 4. Gráfico de barras para categóricas
if len(colunas_categoricas) > 0:
for col_cat in list(colunas_categoricas)[:2]:
try:
contagem = self.df[col_cat].value_counts().head(15)
if len(contagem) > 0:
fig_bar = px.bar(
x=contagem.index,
y=contagem.values,
title=f"📊 Top 15 - {col_cat}",
labels={'x': col_cat, 'y': 'Contagem'},
color=contagem.values,
color_continuous_scale='Viridis'
)
fig_bar.update_layout(height=500, showlegend=False)
figuras.append(fig_bar)
except Exception as e:
print(f"Erro no gráfico de barras {col_cat}: {e}")
continue
if len(figuras) == 0:
return None, "❌ Não foi possível gerar visualizações"
self.analises_realizadas.append("Visualizações interativas geradas")
return figuras, f"✅ {len(figuras)} visualizações criadas com sucesso!"
except Exception as e:
return None, f"❌ Erro nas visualizações: {str(e)}"
def gerar_relatorio_executivo(self):
"""Gera relatório executivo completo em HTML"""
if self.df is None or self.df.empty:
return "
❌ Nenhum dado carregado para análise
"
try:
analise_exp = self.analise_exploratoria()
if 'erro' in analise_exp:
return f"❌ {analise_exp['erro']}
"
# Garantir que a análise 5-sigma foi executada
if 'cinco_sigma' not in self.historico_analises:
analise_sigma = self.analise_estatistica_cinco_sigma()
else:
analise_sigma = self.historico_analises['cinco_sigma']
if 'erro' in analise_sigma:
return f"❌ {analise_sigma['erro']}
"
html_relatorio = f"""
📊 RELATÓRIO EXECUTIVO
Análise de Dados com Precisão 5-Sigma (99.99994% Confiança)
📅 {datetime.now().strftime('%d/%m/%Y %H:%M:%S')}
🎯 Indicadores Chave (KPIs)
📈
Total de Registros
{self.df.shape[0]:,}
🔢
Variáveis Numéricas
{len(analise_exp['colunas_numericas'])}
📝
Variáveis Categóricas
{len(analise_exp['colunas_categoricas'])}
💾
Memória Utilizada
{analise_exp['memoria_uso']}
🔬 ANÁLISE ESTATÍSTICA 5-SIGMA
"""
for col, stats in analise_sigma.items():
status_normalidade = "✅ Normal" if stats['eh_normal'] else "⚠️ Não-Normal"
cor_normalidade = "#27ae60" if stats['eh_normal'] else "#e74c3c"
html_relatorio += f"""
📊 {col}
{status_normalidade}
📈 Média: {stats['media']:.4f}
📊 Mediana: {stats['mediana']:.4f}
📉 Desvio Padrão: {stats['desvio_padrao']:.4f}
📐 Coef. Variação: {stats['coef_variacao']:.2f}%
🎯 Limites 5-Sigma (Confiança: {stats['confianca_5sigma']})
Limite Inferior: {stats['limite_inf_5sigma']:.4f}
Limite Superior: {stats['limite_sup_5sigma']:.4f}
IC 5σ Inferior: {stats['ic_5sigma_inf']:.4f}
IC 5σ Superior: {stats['ic_5sigma_sup']:.4f}
{stats['outliers_iqr']}
Outliers IQR
{stats['outliers_3sigma']}
Outliers 3σ (99.7%)
{stats['outliers_5sigma']}
Outliers 5σ (99.99994%)
Assimetria: {stats['assimetria']:.4f}
Curtose: {stats['curtose']:.4f}
Q1: {stats['q1']:.4f}
Q3: {stats['q3']:.4f}
IQR: {stats['iqr']:.4f}
Amplitude: {stats['amplitude']:.4f}
📋 Teste Shapiro-Wilk:
Estatística = {stats['normalidade_shapiro_stat']:.6f},
p-valor = {stats['normalidade_shapiro_p']:.6f}
"""
html_relatorio += """
💡 INSIGHTS AUTOMÁTICOS
"""
insights = self.gerar_insights_automaticos()
cores_insights = ['#3498db', '#e74c3c', '#2ecc71', '#f39c12', '#9b59b6', '#1abc9c']
for i, insight in enumerate(insights):
cor = cores_insights[i % len(cores_insights)]
html_relatorio += f"""
"""
html_relatorio += f"""
✨ DataAnalyzer Pro - Análise 5-Sigma
Precisão Estatística de 99.99994% | Confiança de 5 Desvios Padrão
Relatório gerado em {datetime.now().strftime('%d/%m/%Y às %H:%M:%S')}
© 2025 DataAnalyzer Pro - Todos os direitos reservados
"""
return html_relatorio
except Exception as e:
return f"❌ Erro ao gerar relatório: {str(e)}
"
def gerar_insights_automaticos(self):
"""Gera insights automáticos com análise 5-sigma"""
insights = []
try:
if self.df is None or 'cinco_sigma' not in self.historico_analises:
self.analise_estatistica_cinco_sigma()
if 'cinco_sigma' not in self.historico_analises:
return ["✅ Execute a análise estatística para gerar insights automáticos"]
analise_sigma = self.historico_analises['cinco_sigma']
if 'erro' in analise_sigma:
return ["⚠️ Não foi possível gerar insights devido a erro na análise"]
for col, stats in analise_sigma.items():
# Insight sobre normalidade
if stats['eh_normal']:
insights.append(f"✅ {col}: Distribuição normal confirmada (p-valor Shapiro: {stats['normalidade_shapiro_p']:.4f}). Métodos paramétricos podem ser aplicados com segurança.")
else:
insights.append(f"⚠️ {col}: Distribuição não-normal detectada. Considere transformações ou métodos não-paramétricos.")
# Insight sobre variabilidade
cv = stats['coef_variacao']
if cv < 10:
insights.append(f"📊 {col}: Baixa variabilidade (CV: {cv:.2f}%) - Dados muito homogêneos.")
elif cv > 30:
insights.append(f"📈 {col}: Alta variabilidade (CV: {cv:.2f}%) - Considere segmentação dos dados.")
# Insight sobre outliers 5-sigma
if stats['outliers_5sigma'] > 0:
insights.append(f"🎯 {col}: {stats['outliers_5sigma']} valores extremos detectados fora dos limites 5-sigma (eventos raríssimos).")
elif stats['outliers_3sigma'] > 0:
insights.append(f"⚡ {col}: {stats['outliers_3sigma']} outliers moderados (fora de 3σ) mas dentro de 5σ.")
# Insight sobre assimetria
skew = abs(stats['assimetria'])
if skew > 1:
direcao = "positiva (cauda à direita)" if stats['assimetria'] > 0 else "negativa (cauda à esquerda)"
insights.append(f"📐 {col}: Assimetria {direcao} forte (|skew|={skew:.2f}). Considere transformação logarítmica.")
# Insight sobre curtose
if abs(stats['curtose']) > 3:
tipo = "leptocúrtica (caudas pesadas)" if stats['curtose'] > 0 else "platicúrtica (caudas leves)"
insights.append(f"📉 {col}: Distribuição {tipo} - valores extremos {'mais' if stats['curtose'] > 0 else 'menos'} prováveis que distribuição normal.")
# Insight geral sobre qualidade dos dados
total_outliers_5sigma = sum(s['outliers_5sigma'] for s in analise_sigma.values() if isinstance(s, dict))
if total_outliers_5sigma == 0:
insights.append(f"🏆 Excelente! Nenhum outlier 5-sigma detectado em {len(analise_sigma)} variáveis. Dados de altíssima qualidade estatística.")
return insights[:10] if insights else ["✅ Análise concluída com sucesso"]
except Exception as e:
return [f"⚠️ Erro ao gerar insights: {str(e)}"]
# ========== INTERFACE GRADIO ==========
analisador = AnalisadorDadosAvancado()
def interface_carregar_dados(arquivo, tipo_dados, json_texto):
"""Interface para carregamento de dados"""
try:
if tipo_dados == "json_arquivo" and arquivo is not None:
sucesso, mensagem = analisador.carregar_dados(arquivo, "json")
elif tipo_dados == "json_texto" and json_texto.strip():
sucesso, mensagem = analisador.carregar_dados(json_texto, "json")
elif tipo_dados == "csv" and arquivo is not None:
sucesso, mensagem = analisador.carregar_dados(arquivo, "csv")
elif tipo_dados == "excel" and arquivo is not None:
sucesso, mensagem = analisador.carregar_dados(arquivo, "excel")
else:
return None, "⚠️ Selecione um arquivo ou insira dados JSON"
if sucesso:
analise = analisador.analise_exploratoria()
if 'erro' in analise:
return None, f"❌ {analise['erro']}"
resumo = f"""
## ✅ Dados Carregados com Sucesso!
### 📊 Resumo Geral
- **Dimensões:** {analise['dimensoes']}
- **Variáveis Numéricas:** {len(analise['colunas_numericas'])}
- **Variáveis Categóricas:** {len(analise['colunas_categoricas'])}
- **Uso de Memória:** {analise['memoria_uso']}
### 🔍 Variáveis Detectadas
**Numéricas:** {', '.join(analise['colunas_numericas'][:5])}{'...' if len(analise['colunas_numericas']) > 5 else ''}
**Categóricas:** {', '.join(analise['colunas_categoricas'][:5])}{'...' if len(analise['colunas_categoricas']) > 5 else ''}
"""
return analisador.df.head(20), resumo
else:
return None, mensagem
except Exception as e:
return None, f"❌ Erro: {str(e)}"
def interface_visualizacoes():
"""Interface para geração de visualizações"""
try:
if analisador.df is None:
return None, None, "❌ Carregue dados primeiro na aba '1. Carregar Dados'"
figuras, mensagem = analisador.gerar_visualizacoes_interativas()
if figuras and len(figuras) > 0:
fig1 = figuras[0] if len(figuras) > 0 else None
fig2 = figuras[1] if len(figuras) > 1 else figuras[0]
return fig1, fig2, mensagem
else:
return None, None, mensagem
except Exception as e:
return None, None, f"❌ Erro: {str(e)}"
def interface_relatorio():
"""Interface para geração de relatório"""
try:
if analisador.df is None:
return "❌ Carregue dados primeiro na aba '1. Carregar Dados'
"
relatorio = analisador.gerar_relatorio_executivo()
return relatorio
except Exception as e:
return f"❌ Erro ao gerar relatório: {str(e)}
"
def interface_analise_estatistica():
"""Interface para análise estatística 5-sigma"""
try:
if analisador.df is None:
return "❌ Carregue dados primeiro na aba '1. Carregar Dados'"
analise = analisador.analise_estatistica_cinco_sigma()
if isinstance(analise, dict) and 'erro' in analise:
return f"❌ {analise['erro']}"
resultado = "# 📊 ANÁLISE ESTATÍSTICA 5-SIGMA\n\n"
resultado += "*Precisão de 99.99994% de confiança estatística*\n\n"
resultado += "---\n\n"
for col, stats in analise.items():
if not isinstance(stats, dict):
continue
status = "✅ Normal" if stats['eh_normal'] else "⚠️ Não-Normal"
resultado += f"## 📈 {col} {status}\n\n"
resultado += f"### Estatísticas Centrais\n"
resultado += f"- **Média:** {stats['media']:.6f}\n"
resultado += f"- **Mediana:** {stats['mediana']:.6f}\n"
resultado += f"- **Desvio Padrão:** {stats['desvio_padrao']:.6f}\n"
resultado += f"- **Coeficiente de Variação:** {stats['coef_variacao']:.2f}%\n\n"
resultado += f"### Análise 5-Sigma (Confiança: {stats['confianca_5sigma']})\n"
resultado += f"- **Limite Inferior 5σ:** {stats['limite_inf_5sigma']:.6f}\n"
resultado += f"- **Limite Superior 5σ:** {stats['limite_sup_5sigma']:.6f}\n"
resultado += f"- **IC 5σ Inferior:** {stats['ic_5sigma_inf']:.6f}\n"
resultado += f"- **IC 5σ Superior:** {stats['ic_5sigma_sup']:.6f}\n\n"
resultado += f"### Detecção de Outliers\n"
resultado += f"- **Outliers IQR (Método Tradicional):** {stats['outliers_iqr']}\n"
resultado += f"- **Outliers 3σ (99.7% confiança):** {stats['outliers_3sigma']}\n"
resultado += f"- **Outliers 5σ (99.99994% confiança):** {stats['outliers_5sigma']}\n\n"
resultado += f"### Forma da Distribuição\n"
resultado += f"- **Assimetria (Skewness):** {stats['assimetria']:.6f}\n"
resultado += f"- **Curtose (Kurtosis):** {stats['curtose']:.6f}\n"
resultado += f"- **Teste Shapiro-Wilk:** Estatística={stats['normalidade_shapiro_stat']:.6f}, p-valor={stats['normalidade_shapiro_p']:.6f}\n\n"
resultado += f"### Quartis e Dispersão\n"
resultado += f"- **Q1 (25%):** {stats['q1']:.6f}\n"
resultado += f"- **Q3 (75%):** {stats['q3']:.6f}\n"
resultado += f"- **IQR (Intervalo Interquartil):** {stats['iqr']:.6f}\n"
resultado += f"- **Amplitude Total:** {stats['amplitude']:.6f}\n\n"
resultado += "---\n\n"
return resultado
except Exception as e:
return f"❌ Erro na análise: {str(e)}"
# ========== CONFIGURAÇÃO DA INTERFACE GRADIO ==========
with gr.Blocks(
theme=gr.themes.Soft(
primary_hue="indigo",
secondary_hue="purple",
neutral_hue="slate",
),
title="📊 DataAnalyzer Pro - Análise 5-Sigma",
css="""
.gradio-container {
max-width: 1600px !important;
font-family: 'Inter', 'Segoe UI', sans-serif;
}
"""
) as demo:
gr.Markdown("""
# 📊 DataAnalyzer Pro - Sistema de Análise 5-Sigma
## *Precisão Estatística de 99.99994% | Análise de Dados de Nível Científico*
> **5-Sigma**: O padrão ouro em análise estatística - usado em descobertas científicas como o Bóson de Higgs.
> Representa uma confiança de 99.99994%, equivalente a apenas 1 falso positivo em 3.5 milhões de observações.
""")
with gr.Tab("📁 1. Carregar Dados"):
gr.Markdown("""
### 🔧 Importação de Dados
Suporte completo para **JSON**, **CSV** e **Excel** com validação automática e detecção de tipos.
""")
with gr.Row():
with gr.Column(scale=1):
tipo_dados = gr.Radio(
choices=["json_arquivo", "json_texto", "csv", "excel"],
label="📂 Formato dos Dados",
value="json_arquivo",
info="Escolha o formato do seu dataset"
)
arquivo_upload = gr.File(
label="📤 Upload de Arquivo",
file_types=[".json", ".csv", ".xlsx", ".xls"],
visible=True
)
json_input = gr.Textbox(
label="📝 Dados JSON (Colar aqui)",
placeholder='[{"variavel1": 100, "variavel2": "categoria"}, ...]',
lines=8,
visible=False
)
carregar_btn = gr.Button("🚀 Carregar e Analisar", variant="primary", size="lg")
with gr.Column(scale=2):
gr.Markdown("### 👁️ Pré-visualização dos Dados")
preview_tabela = gr.Dataframe(
label="Primeiras 20 linhas do dataset",
interactive=False,
wrap=True
)
info_carregamento = gr.Markdown(
value="💡 **Aguardando dados...** Faça upload de um arquivo ou cole dados JSON."
)
with gr.Tab("📈 2. Visualizações Interativas"):
gr.Markdown("""
### 🎨 Visualizações com Plotly
Gráficos interativos de alta qualidade incluindo limites 5-sigma, distribuições e análises multivariadas.
""")
with gr.Row():
gerar_viz_btn = gr.Button("🎨 Gerar Todas as Visualizações", variant="primary", size="lg")
with gr.Row():
with gr.Column():
visualizacao_1 = gr.Plot(label="📊 Visualização 1")
with gr.Column():
visualizacao_2 = gr.Plot(label="📊 Visualização 2")
info_visualizacoes = gr.Markdown(value="Clique no botão acima para gerar visualizações interativas")
with gr.Tab("🔬 3. Análise Estatística 5-Sigma"):
gr.Markdown("""
### 📐 Análise com Precisão Científica
**O que é 5-Sigma?**
- 📊 **Confiança:** 99.99994% (praticamente certeza absoluta)
- 🎯 **Aplicação:** Usado em física de partículas, controle de qualidade Six Sigma
- ⚡ **Outliers:** Detecta apenas eventos extremamente raros
- 🔬 **Comparação:** 3-sigma = 99.7% | 5-sigma = 99.99994%
""")
with gr.Row():
analise_estat_btn = gr.Button("📐 Executar Análise 5-Sigma Completa", variant="primary", size="lg")
resultado_estatistica = gr.Markdown(
label="📋 Resultados da Análise",
value="Clique no botão para iniciar a análise estatística com precisão 5-sigma"
)
with gr.Tab("📋 4. Relatório Executivo"):
gr.Markdown("""
### 📄 Relatório Automático Completo
Relatório HTML profissional com todos os KPIs, estatísticas 5-sigma, visualizações e insights automáticos.
""")
with gr.Row():
gerar_relatorio_btn = gr.Button("📄 Gerar Relatório Executivo Completo", variant="primary", size="lg")
relatorio_output = gr.HTML(
label="📊 Relatório Interativo",
value="""
📊 Relatório Executivo
Clique no botão acima para gerar o relatório completo
✨ Análise 5-Sigma | KPIs | Insights Automáticos
"""
)
# ========== EVENTOS E INTERAÇÕES ==========
def atualizar_inputs(tipo_dados):
if tipo_dados == "json_texto":
return gr.update(visible=False), gr.update(visible=True)
else:
return gr.update(visible=True), gr.update(visible=False)
tipo_dados.change(
atualizar_inputs,
inputs=[tipo_dados],
outputs=[arquivo_upload, json_input]
)
carregar_btn.click(
interface_carregar_dados,
inputs=[arquivo_upload, tipo_dados, json_input],
outputs=[preview_tabela, info_carregamento]
)
gerar_viz_btn.click(
interface_visualizacoes,
outputs=[visualizacao_1, visualizacao_2, info_visualizacoes]
)
analise_estat_btn.click(
interface_analise_estatistica,
outputs=[resultado_estatistica]
)
gerar_relatorio_btn.click(
interface_relatorio,
outputs=[relatorio_output]
)
# ========== EXECUÇÃO ==========
if __name__ == "__main__":
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=True,
show_error=True
)