Spaces:
Sleeping
Sleeping
File size: 8,941 Bytes
9f22e36 f9da7f4 c4616a2 9f22e36 c4616a2 9f22e36 053faec 9f22e36 e79b163 9f22e36 f9a622e 9f22e36 f9a622e 9f22e36 f9a622e 53105d2 053faec f9a622e fd3ce55 f9a622e fd3ce55 f9a622e 9f22e36 f9a622e 9f22e36 053faec 9f22e36 f9a622e b9bf3b0 9f22e36 f9a622e b9bf3b0 9f22e36 053faec 9f22e36 f9a622e b9bf3b0 f9a622e b9bf3b0 f9a622e b9bf3b0 f9a622e b9bf3b0 f9a622e b9bf3b0 f9a622e b9bf3b0 f9a622e b9bf3b0 f9a622e fd3ce55 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 |
#!/usr/bin/env python
# coding: utf-8
# =====================================================
# Dashboard - Testes de Hipóteses com AmesHousing
# =====================================================
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
import numpy as np
from scipy import stats
from scipy.stats import shapiro, levene, kruskal
from statsmodels.formula.api import ols
import statsmodels.api as sm
# -----------------------------------------------------
# Configuração da Página
# -----------------------------------------------------
st.set_page_config(
page_title="Dashboard - Testes de Hipóteses com AmesHousing",
layout="wide",
initial_sidebar_state="expanded"
)
st.markdown("<h1 style='text-align:center;color:#003366;'>Simulador de Testes de Hipótese</h1>", unsafe_allow_html=True)
st.markdown("<h3 style='text-align:center;color:#003366;'>Análise do Dataset AmesHousing</h3>", unsafe_allow_html=True)
st.markdown("---")
# -----------------------------------------------------
# Abas do Dashboard
# -----------------------------------------------------
tabs = st.tabs(["Simulações Teóricas", "Análise AmesHousing"])
# -----------------------------------------------------
# Aba 1: Simulações Teóricas
# -----------------------------------------------------
with tabs[0]:
st.subheader("Teste de Hipótese para cálculo do valor das casas")
st.sidebar.markdown("### Parâmetros do Teste (Proporção)")
p_pop = st.sidebar.slider("Proporção populacional (H0)", 0.0, 1.0, 0.1, 0.01, key="p_pop")
p_sample = st.sidebar.slider("Proporção amostral", 0.0, 1.0, 0.12, 0.01, key="p_sample")
n = st.sidebar.slider("Tamanho da amostra", 100, 10000, 1000, 10, key="n_sample")
alpha_prop = st.sidebar.slider("Nível de significância (α)", 0.01, 0.10, 0.05, 0.01, key="alpha_prop")
se = np.sqrt(p_pop*(1-p_pop)/n)
z = (p_sample - p_pop)/se
p_value = 2*(1 - stats.norm.cdf(abs(z)))
st.write(f"**Z** = {z:.4f}")
st.write(f"**p-valor** = {p_value:.4f}")
if p_value < alpha_prop:
st.write("**Rejeitamos H0**: diferença significativa.")
else:
st.write("**Não rejeitamos H0**: sem diferença significativa.")
# -----------------------------------------------------
# Aba 2: Análise AmesHousing
# -----------------------------------------------------
with tabs[1]:
st.subheader("Análise de Variância - AmesHousing Dataset")
st.markdown("---")
# Leitura do CSV
casa_data = pd.read_csv("../Dados/AmesHousing.csv")
casa_data.columns = casa_data.columns.str.strip().str.replace(" ", "_")
# -----------------------------
# Amostragem
# -----------------------------
n_amostra = st.session_state.get("n_sample", len(casa_data))
if n_amostra < len(casa_data):
dados = casa_data.sample(n=n_amostra, random_state=42)
else:
dados = casa_data.copy()
# -----------------------------
# Filtro interativo no sidebar
# -----------------------------
st.sidebar.markdown("### Filtros AmesHousing")
bairros = st.sidebar.multiselect(
"Selecione bairros",
options=sorted(dados["Neighborhood"].dropna().unique()),
default=None
)
# Aplicar filtro
dados_filtrados = dados.copy()
if bairros:
dados_filtrados = dados_filtrados[dados_filtrados["Neighborhood"].isin(bairros)]
# -------------------------------------------------
# Análise Exploratória
# -------------------------------------------------
st.markdown("### Distribuição do Preço de Venda")
if not dados_filtrados.empty:
fig, ax = plt.subplots(figsize=(8,5))
sns.histplot(dados_filtrados['SalePrice'], kde=True, ax=ax)
ax.set_title("Distribuição do Preço de Venda")
st.pyplot(fig)
else:
st.warning("Nenhum dado disponível com os filtros aplicados.")
# Boxplots
st.markdown("### Boxplots das Variáveis Selecionadas")
variavel = st.selectbox(
"Escolha a variável categórica para comparar preços:",
["Neighborhood","Garage_Type","Fireplaces"]
)
if not dados_filtrados.empty:
if len(dados_filtrados[variavel].dropna().unique()) > 1:
fig2, ax2 = plt.subplots(figsize=(12,6))
sns.boxplot(x=variavel, y="SalePrice", data=dados_filtrados, ax=ax2)
plt.xticks(rotation=90)
ax2.set_title(f"Preço de Venda por {variavel}")
st.pyplot(fig2)
else:
st.warning(f"Não é possível gerar boxplot: apenas uma categoria em {variavel} após os filtros.")
# Scatter interativo (média de preço por bairro)
st.markdown("### Preço Médio de Venda por Bairro")
if not dados_filtrados.empty:
bairro_grouped = dados_filtrados.groupby('Neighborhood').agg(
count=('SalePrice','size'),
mean_price=('SalePrice','mean')
).reset_index()
bairro_filtered = bairro_grouped[bairro_grouped['count'] >= 5]
if not bairro_filtered.empty:
fig3 = px.scatter(
bairro_filtered,
x='mean_price',
y='Neighborhood',
size='count',
color='Neighborhood',
title='Preço Médio de Venda vs Bairro (Ames, Iowa)',
labels={'mean_price': 'Preço Médio de Venda', 'Neighborhood':'Bairro'},
opacity=0.8
)
st.plotly_chart(fig3, use_container_width=True)
else:
st.warning("Não há bairros suficientes após filtros para gerar o gráfico.")
# -------------------------------------------------
# ANOVA
# -------------------------------------------------
st.markdown("### ANOVA para Neighborhood, Garage_Type e Fireplaces")
alpha = st.sidebar.slider(
"Nível de significância (α) - ANOVA AmesHousing",
0.01,0.10,0.05,0.01,
key="alpha_ames"
)
if not dados_filtrados.empty:
for nome in ["Neighborhood", "Garage_Type", "Fireplaces"]:
categorias = dados_filtrados[nome].dropna().unique()
if len(categorias) < 2:
st.warning(f"ANOVA não pôde ser realizada para **{nome}** (menos de 2 grupos após os filtros).")
continue
modelo = ols(f'SalePrice ~ C({nome})', data=dados_filtrados).fit()
st.markdown(f"#### ANOVA - {nome}")
anova = sm.stats.anova_lm(modelo, typ=2)
st.dataframe(anova)
# -------------------------------------------------
# Validação dos Pressupostos
# -------------------------------------------------
st.markdown("### Validação dos Pressupostos da ANOVA")
st.markdown("#### Teste de Normalidade (Shapiro-Wilk)")
for nome in ["Neighborhood","Garage_Type","Fireplaces"]:
categorias = dados_filtrados[nome].dropna().unique()
if len(categorias) < 2:
st.warning(f"Shapiro-Wilk não pôde ser realizado para **{nome}** (menos de 2 grupos após os filtros).")
continue
modelo = ols(f'SalePrice ~ C({nome})', data=dados_filtrados).fit()
residuos = modelo.resid
stat, p = shapiro(residuos.dropna())
st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
+ ("resíduos normais" if p >= alpha else "violação de normalidade"))
st.markdown("#### Teste de Homocedasticidade (Levene)")
for nome in ["Neighborhood","Garage_Type","Fireplaces"]:
grupos = [grupo["SalePrice"].dropna() for _, grupo in dados_filtrados.groupby(nome)]
if len(grupos) < 2:
st.warning(f"Levene não pôde ser realizado para **{nome}** (menos de 2 grupos após os filtros).")
continue
stat, p = levene(*grupos)
st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
+ ("variâncias iguais" if p >= alpha else "variâncias diferentes"))
# -------------------------------------------------
# Kruskal-Wallis
# -------------------------------------------------
st.markdown("### Teste não-paramétrico (Kruskal-Wallis)")
for nome in ["Neighborhood","Garage_Type","Fireplaces"]:
grupos = [grupo["SalePrice"].dropna() for _, grupo in dados_filtrados.groupby(nome)]
if len(grupos) < 2:
st.warning(f"Kruskal-Wallis não pôde ser realizado para **{nome}** (menos de 2 grupos após os filtros).")
continue
stat, p = kruskal(*grupos)
st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
+ ("diferenças significativas" if p < alpha else "sem diferença significativa"))
|