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

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +46 -26
src/streamlit_app.py CHANGED
@@ -130,11 +130,14 @@ with tabs[1]:
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")
@@ -145,17 +148,20 @@ with tabs[1]:
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
@@ -168,13 +174,13 @@ with tabs[1]:
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)
@@ -185,18 +191,28 @@ with tabs[1]:
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
@@ -204,6 +220,10 @@ with tabs[1]:
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"))
 
130
  )
131
 
132
  if not dados_filtrados.empty:
133
+ if len(dados_filtrados[variavel].dropna().unique()) > 1:
134
+ fig2, ax2 = plt.subplots(figsize=(12,6))
135
+ sns.boxplot(x=variavel, y="SalePrice", data=dados_filtrados, ax=ax2)
136
+ plt.xticks(rotation=90)
137
+ ax2.set_title(f"Preço de Venda por {variavel}")
138
+ st.pyplot(fig2)
139
+ else:
140
+ st.warning(f"Não é possível gerar boxplot: apenas uma categoria em {variavel} após os filtros.")
141
 
142
  # Scatter interativo (média de preço por bairro)
143
  st.markdown("### Preço Médio de Venda por Bairro")
 
148
  ).reset_index()
149
 
150
  bairro_filtered = bairro_grouped[bairro_grouped['count'] >= 5]
151
+ if not bairro_filtered.empty:
152
+ fig3 = px.scatter(
153
+ bairro_filtered,
154
+ x='mean_price',
155
+ y='Neighborhood',
156
+ size='count',
157
+ color='Neighborhood',
158
+ title='Preço Médio de Venda vs Bairro (Ames, Iowa)',
159
+ labels={'mean_price': 'Preço Médio de Venda', 'Neighborhood':'Bairro'},
160
+ opacity=0.8
161
+ )
162
+ st.plotly_chart(fig3, use_container_width=True)
163
+ else:
164
+ st.warning("Não há bairros suficientes após filtros para gerar o gráfico.")
165
 
166
  # -------------------------------------------------
167
  # ANOVA
 
174
  )
175
 
176
  if not dados_filtrados.empty:
177
+ for nome in ["Neighborhood", "Garage_Type", "Fireplaces"]:
178
+ categorias = dados_filtrados[nome].dropna().unique()
179
+ if len(categorias) < 2:
180
+ st.warning(f"ANOVA não pôde ser realizada para **{nome}** (menos de 2 grupos após os filtros).")
181
+ continue
182
 
183
+ modelo = ols(f'SalePrice ~ C({nome})', data=dados_filtrados).fit()
184
  st.markdown(f"#### ANOVA - {nome}")
185
  anova = sm.stats.anova_lm(modelo, typ=2)
186
  st.dataframe(anova)
 
191
  st.markdown("### Validação dos Pressupostos da ANOVA")
192
 
193
  st.markdown("#### Teste de Normalidade (Shapiro-Wilk)")
194
+ for nome in ["Neighborhood","Garage_Type","Fireplaces"]:
195
+ categorias = dados_filtrados[nome].dropna().unique()
196
+ if len(categorias) < 2:
197
+ st.warning(f"Shapiro-Wilk não pôde ser realizado para **{nome}** (menos de 2 grupos após os filtros).")
198
+ continue
199
+
200
+ modelo = ols(f'SalePrice ~ C({nome})', data=dados_filtrados).fit()
201
  residuos = modelo.resid
202
  stat, p = shapiro(residuos.dropna())
203
  st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
204
+ + ("resíduos normais" if p >= alpha else "violação de normalidade"))
205
 
206
  st.markdown("#### Teste de Homocedasticidade (Levene)")
207
  for nome in ["Neighborhood","Garage_Type","Fireplaces"]:
208
  grupos = [grupo["SalePrice"].dropna() for _, grupo in dados_filtrados.groupby(nome)]
209
+ if len(grupos) < 2:
210
+ st.warning(f"Levene não pôde ser realizado para **{nome}** (menos de 2 grupos após os filtros).")
211
+ continue
212
+
213
  stat, p = levene(*grupos)
214
  st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
215
+ + ("variâncias iguais" if p >= alpha else "variâncias diferentes"))
216
 
217
  # -------------------------------------------------
218
  # Kruskal-Wallis
 
220
  st.markdown("### Teste não-paramétrico (Kruskal-Wallis)")
221
  for nome in ["Neighborhood","Garage_Type","Fireplaces"]:
222
  grupos = [grupo["SalePrice"].dropna() for _, grupo in dados_filtrados.groupby(nome)]
223
+ if len(grupos) < 2:
224
+ st.warning(f"Kruskal-Wallis não pôde ser realizado para **{nome}** (menos de 2 grupos após os filtros).")
225
+ continue
226
+
227
  stat, p = kruskal(*grupos)
228
  st.write(f"{nome}: estatística={stat:.3f}, p={p:.3f} "
229
+ + ("diferenças significativas" if p < alpha else "sem diferença significativa"))