ricardoadriano commited on
Commit
f9a622e
·
verified ·
1 Parent(s): 036301c

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +108 -71
src/streamlit_app.py CHANGED
@@ -44,7 +44,7 @@ with tabs[0]:
44
  st.sidebar.markdown("### Parâmetros do Teste (Proporção)")
45
  p_pop = st.sidebar.slider("Proporção populacional (H0)", 0.0, 1.0, 0.1, 0.01, key="p_pop")
46
  p_sample = st.sidebar.slider("Proporção amostral", 0.0, 1.0, 0.12, 0.01, key="p_sample")
47
- n = st.sidebar.slider("Tamanho da amostra", 100, 50000, 1000, 10, key="n_sample")
48
  alpha_prop = st.sidebar.slider("Nível de significância (α)", 0.01, 0.10, 0.05, 0.01, key="alpha_prop")
49
 
50
  se = np.sqrt(p_pop*(1-p_pop)/n)
@@ -65,28 +65,62 @@ with tabs[1]:
65
  st.subheader("Análise de Variância - AmesHousing Dataset")
66
  st.markdown("---")
67
 
68
- # Leitura fixa do CSV dentro da pasta Dados
69
  casa_data = pd.read_csv("../Dados/AmesHousing.csv")
70
  casa_data.columns = casa_data.columns.str.strip().str.replace(" ", "_")
71
 
72
- # ------------------------------------------
73
- # Usar o parâmetro "Tamanho da amostra" já definido
74
- # ------------------------------------------
75
  n_amostra = st.session_state.get("n_sample", len(casa_data))
76
-
77
  if n_amostra < len(casa_data):
78
  dados = casa_data.sample(n=n_amostra, random_state=42)
79
  else:
80
  dados = casa_data.copy()
81
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
82
  # -------------------------------------------------
83
  # Análise Exploratória
84
  # -------------------------------------------------
85
  st.markdown("### Distribuição do Preço de Venda")
86
- fig, ax = plt.subplots(figsize=(8,5))
87
- sns.histplot(dados['SalePrice'], kde=True, ax=ax)
88
- ax.set_title("Distribuição do Preço de Venda")
89
- st.pyplot(fig)
 
 
 
90
 
91
  # Boxplots
92
  st.markdown("### Boxplots das Variáveis Selecionadas")
@@ -95,31 +129,33 @@ with tabs[1]:
95
  ["Neighborhood","Garage_Type","Fireplaces"]
96
  )
97
 
98
- fig2, ax2 = plt.subplots(figsize=(12,6))
99
- sns.boxplot(x=variavel, y="SalePrice", data=dados, ax=ax2)
100
- plt.xticks(rotation=90)
101
- ax2.set_title(f"Preço de Venda por {variavel}")
102
- st.pyplot(fig2)
 
103
 
104
  # Scatter interativo (média de preço por bairro)
105
  st.markdown("### Preço Médio de Venda por Bairro")
106
- bairro_grouped = dados.groupby('Neighborhood').agg(
107
- count=('SalePrice','size'),
108
- mean_price=('SalePrice','mean')
109
- ).reset_index()
110
-
111
- bairro_filtered = bairro_grouped[bairro_grouped['count'] >= 5]
112
- fig3 = px.scatter(
113
- bairro_filtered,
114
- x='mean_price',
115
- y='Neighborhood',
116
- size='count',
117
- color='Neighborhood',
118
- title='Preço Médio de Venda vs Bairro (Ames, Iowa)',
119
- labels={'mean_price': 'Preço Médio de Venda', 'Neighborhood':'Bairro'},
120
- opacity=0.8
121
- )
122
- st.plotly_chart(fig3, use_container_width=True)
 
123
 
124
  # -------------------------------------------------
125
  # ANOVA
@@ -131,42 +167,43 @@ with tabs[1]:
131
  key="alpha_ames"
132
  )
133
 
134
- modelos = {
135
- "Neighborhood": ols('SalePrice ~ C(Neighborhood)', data=dados).fit(),
136
- "Garage_Type": ols('SalePrice ~ C(Garage_Type)', data=dados).fit(),
137
- "Fireplaces": ols('SalePrice ~ C(Fireplaces)', data=dados).fit()
138
- }
139
-
140
- for nome, modelo in modelos.items():
141
- st.markdown(f"#### ANOVA - {nome}")
142
- anova = sm.stats.anova_lm(modelo, typ=2)
143
- st.dataframe(anova)
144
-
145
- # -------------------------------------------------
146
- # Validação dos Pressupostos
147
- # -------------------------------------------------
148
- st.markdown("### Validação dos Pressupostos da ANOVA")
149
-
150
- st.markdown("#### Teste de Normalidade (Shapiro-Wilk)")
151
- for nome, modelo in modelos.items():
152
- residuos = modelo.resid
153
- stat, p = shapiro(residuos.dropna())
154
- st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
155
- + ("resíduos normais" if p >= alpha else "violação de normalidade"))
156
-
157
- st.markdown("#### Teste de Homocedasticidade (Levene)")
158
- for nome in ["Neighborhood","Garage_Type","Fireplaces"]:
159
- grupos = [grupo["SalePrice"].dropna() for _, grupo in dados.groupby(nome)]
160
- stat, p = levene(*grupos)
161
- st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
162
- + ("variâncias iguais" if p >= alpha else "variâncias diferentes"))
163
-
164
- # -------------------------------------------------
165
- # Kruskal-Wallis
166
- # -------------------------------------------------
167
- st.markdown("### Teste não-paramétrico (Kruskal-Wallis)")
168
- for nome in ["Neighborhood","Garage_Type","Fireplaces"]:
169
- grupos = [grupo["SalePrice"].dropna() for _, grupo in dados.groupby(nome)]
170
- stat, p = kruskal(*grupos)
171
- st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
172
- + ("diferenças significativas" if p < alpha else "sem diferença significativa"))
 
 
44
  st.sidebar.markdown("### Parâmetros do Teste (Proporção)")
45
  p_pop = st.sidebar.slider("Proporção populacional (H0)", 0.0, 1.0, 0.1, 0.01, key="p_pop")
46
  p_sample = st.sidebar.slider("Proporção amostral", 0.0, 1.0, 0.12, 0.01, key="p_sample")
47
+ n = st.sidebar.slider("Tamanho da amostra", 100, 10000, 1000, 10, key="n_sample")
48
  alpha_prop = st.sidebar.slider("Nível de significância (α)", 0.01, 0.10, 0.05, 0.01, key="alpha_prop")
49
 
50
  se = np.sqrt(p_pop*(1-p_pop)/n)
 
65
  st.subheader("Análise de Variância - AmesHousing Dataset")
66
  st.markdown("---")
67
 
68
+ # Leitura do CSV
69
  casa_data = pd.read_csv("../Dados/AmesHousing.csv")
70
  casa_data.columns = casa_data.columns.str.strip().str.replace(" ", "_")
71
 
72
+ # -----------------------------
73
+ # Amostragem
74
+ # -----------------------------
75
  n_amostra = st.session_state.get("n_sample", len(casa_data))
 
76
  if n_amostra < len(casa_data):
77
  dados = casa_data.sample(n=n_amostra, random_state=42)
78
  else:
79
  dados = casa_data.copy()
80
 
81
+ # -----------------------------
82
+ # Filtros interativos no sidebar
83
+ # -----------------------------
84
+ st.sidebar.markdown("### Filtros AmesHousing")
85
+
86
+ garagens = st.sidebar.multiselect(
87
+ "Selecione tipos de garagem",
88
+ options=sorted(dados["Garage_Type"].dropna().unique()),
89
+ default=None
90
+ )
91
+
92
+ lareiras = st.sidebar.multiselect(
93
+ "Selecione número de lareiras",
94
+ options=sorted(dados["Fireplaces"].dropna().unique()),
95
+ default=None
96
+ )
97
+
98
+ bairros = st.sidebar.multiselect(
99
+ "Selecione bairros",
100
+ options=sorted(dados["Neighborhood"].dropna().unique()),
101
+ default=None
102
+ )
103
+
104
+ # Aplicar filtros
105
+ dados_filtrados = dados.copy()
106
+ if garagens:
107
+ dados_filtrados = dados_filtrados[dados_filtrados["Garage_Type"].isin(garagens)]
108
+ if lareiras:
109
+ dados_filtrados = dados_filtrados[dados_filtrados["Fireplaces"].isin(lareiras)]
110
+ if bairros:
111
+ dados_filtrados = dados_filtrados[dados_filtrados["Neighborhood"].isin(bairros)]
112
+
113
  # -------------------------------------------------
114
  # Análise Exploratória
115
  # -------------------------------------------------
116
  st.markdown("### Distribuição do Preço de Venda")
117
+ if not dados_filtrados.empty:
118
+ fig, ax = plt.subplots(figsize=(8,5))
119
+ sns.histplot(dados_filtrados['SalePrice'], kde=True, ax=ax)
120
+ ax.set_title("Distribuição do Preço de Venda")
121
+ st.pyplot(fig)
122
+ else:
123
+ st.warning("Nenhum dado disponível com os filtros aplicados.")
124
 
125
  # Boxplots
126
  st.markdown("### Boxplots das Variáveis Selecionadas")
 
129
  ["Neighborhood","Garage_Type","Fireplaces"]
130
  )
131
 
132
+ if not dados_filtrados.empty:
133
+ fig2, ax2 = plt.subplots(figsize=(12,6))
134
+ sns.boxplot(x=variavel, y="SalePrice", data=dados_filtrados, ax=ax2)
135
+ plt.xticks(rotation=90)
136
+ ax2.set_title(f"Preço de Venda por {variavel}")
137
+ st.pyplot(fig2)
138
 
139
  # Scatter interativo (média de preço por bairro)
140
  st.markdown("### Preço Médio de Venda por Bairro")
141
+ if not dados_filtrados.empty:
142
+ bairro_grouped = dados_filtrados.groupby('Neighborhood').agg(
143
+ count=('SalePrice','size'),
144
+ mean_price=('SalePrice','mean')
145
+ ).reset_index()
146
+
147
+ bairro_filtered = bairro_grouped[bairro_grouped['count'] >= 5]
148
+ fig3 = px.scatter(
149
+ bairro_filtered,
150
+ x='mean_price',
151
+ y='Neighborhood',
152
+ size='count',
153
+ color='Neighborhood',
154
+ title='Preço Médio de Venda vs Bairro (Ames, Iowa)',
155
+ labels={'mean_price': 'Preço Médio de Venda', 'Neighborhood':'Bairro'},
156
+ opacity=0.8
157
+ )
158
+ st.plotly_chart(fig3, use_container_width=True)
159
 
160
  # -------------------------------------------------
161
  # ANOVA
 
167
  key="alpha_ames"
168
  )
169
 
170
+ if not dados_filtrados.empty:
171
+ modelos = {
172
+ "Neighborhood": ols('SalePrice ~ C(Neighborhood)', data=dados_filtrados).fit(),
173
+ "Garage_Type": ols('SalePrice ~ C(Garage_Type)', data=dados_filtrados).fit(),
174
+ "Fireplaces": ols('SalePrice ~ C(Fireplaces)', data=dados_filtrados).fit()
175
+ }
176
+
177
+ for nome, modelo in modelos.items():
178
+ st.markdown(f"#### ANOVA - {nome}")
179
+ anova = sm.stats.anova_lm(modelo, typ=2)
180
+ st.dataframe(anova)
181
+
182
+ # -------------------------------------------------
183
+ # Validação dos Pressupostos
184
+ # -------------------------------------------------
185
+ st.markdown("### Validação dos Pressupostos da ANOVA")
186
+
187
+ st.markdown("#### Teste de Normalidade (Shapiro-Wilk)")
188
+ for nome, modelo in modelos.items():
189
+ residuos = modelo.resid
190
+ stat, p = shapiro(residuos.dropna())
191
+ st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
192
+ + ("resíduos normais" if p >= alpha else "violação de normalidade"))
193
+
194
+ st.markdown("#### Teste de Homocedasticidade (Levene)")
195
+ for nome in ["Neighborhood","Garage_Type","Fireplaces"]:
196
+ grupos = [grupo["SalePrice"].dropna() for _, grupo in dados_filtrados.groupby(nome)]
197
+ stat, p = levene(*grupos)
198
+ st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
199
+ + ("variâncias iguais" if p >= alpha else "variâncias diferentes"))
200
+
201
+ # -------------------------------------------------
202
+ # Kruskal-Wallis
203
+ # -------------------------------------------------
204
+ st.markdown("### Teste não-paramétrico (Kruskal-Wallis)")
205
+ for nome in ["Neighborhood","Garage_Type","Fireplaces"]:
206
+ grupos = [grupo["SalePrice"].dropna() for _, grupo in dados_filtrados.groupby(nome)]
207
+ stat, p = kruskal(*grupos)
208
+ st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
209
+ + ("diferenças significativas" if p < alpha else "sem diferença significativa"))