Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 9 additions & 79 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,82 +1,12 @@
# Dashboard de Unidades Básicas de Saúde (UBS)
## Integrantes do Grupo
Eric Akio Uchiyamada
RA: 10395287

Este projeto é um **dashboard interativo** desenvolvido com **Streamlit** para visualizar a frequência das **Unidades Básicas de Saúde (UBS)** por estado no Brasil.
Oliver Kieran Galvão McCormack
RA: 10395672

## 🏗️ Funcionalidades
- **Gráfico de barras** interativo mostrando a frequência de UBS por estado.
- **Filtro** para visualizar dados de estados específicos.
- **Visualização de dados** filtrados diretamente na interface.
Pedro Machado Gomes Caixeta
RA: 10314309

## 📂 Estrutura do Projeto
```
├── ubs_dashboard.py # Código do dashboard em Streamlit
├── ubs_atualizado.csv # Arquivo de dados atualizado
├── requirements.txt # Dependências necessárias
└── README.md # Documentação do projeto
```

## 🚀 Como Executar
### 1️⃣ Clonar o repositório
```bash
git clone https://github.com/seu-usuario/ubs-dashboard.git
cd ubs-dashboard
```

### 2️⃣ Criar um ambiente virtual (opcional, mas recomendado)
```bash
python -m venv env
source env/bin/activate # Para Linux/Mac
env\Scripts\activate # Para Windows
```

### 3️⃣ Instalar as dependências
```bash
pip install -r requirements.txt
```

### 4️⃣ Executar a aplicação
```bash
streamlit run ubs_dashboard.py
```

## 📦 Dependências
As principais bibliotecas utilizadas no projeto são:
- `streamlit` → Interface do dashboard
- `pandas` → Manipulação de dados
- `plotly` → Visualização de gráficos interativos



# 📌 Exercício de Refatoração do BI - Dashboard de UBS

## 🎯 Objetivo
Refatorar e aprimorar o **Dashboard de Unidades Básicas de Saúde (UBS)**, implementando **três novas visualizações** e garantindo que a entrega seja feita corretamente no **GitHub**.

---

## 🚀 Tarefas

### 1️⃣ Mapa Interativo das UBS por Estado
- Criar um **mapa de dispersão** usando `latitude` e `longitude` para plotar a localização das UBS.
- Adicionar um **filtro por estado** para exibir apenas UBS da região desejada.

### 2️⃣ Gráfico de Pizza da Distribuição de UBS por Estado
- Criar um **gráfico de pizza** mostrando opercentual de UBS por estado.
- Utilizar `plotly.express.pie()` para exibir os dados.

### 3️⃣ Histograma da Quantidade de UBS por Município
- Criar um **histograma** que exiba a **quantidade de UBS por município**.
- Utilizar `plotly.express.histogram()` agrupando os municípios por contagem de UBS.
- Adicionar um controle deslizante (`st.slider()`) para filtrar municípios com um número mínimo de UBS.

---

## 📦 Entrega
- A implementação deve ser realizada em um **repositório GitHub do grupo**.
- O repositório deve conter:
- Código-fonte do dashboard (`.py`).
- Arquivo de dados atualizado (`.csv`).
- Arquivo `README.md` contendo:
- Descrições adicionais
- **Nome dos integrantes do grupo**.
- Dependências do projeto (adicionar no requirements.txt).
## Observações Adicionais
Foi necessário tirar a versão específica do numpy pra conseguir rodar localmente na minha máquina, entao deixei pra pegar qualquer versão no requirements.txt
76 changes: 61 additions & 15 deletions ubs_dashboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,69 @@
# Carregar o arquivo atualizado
df = pd.read_csv("ubs_atualizado.csv", sep=";")

# Contar a frequência de UBS por estado
df_freq = df['Nome_UF'].value_counts().reset_index()
df_freq.columns = ['Estado', 'Frequência']
# Exercicio 1: Mapa Interativo das UBS por Estado
df['LATITUDE'] = pd.to_numeric(df['LATITUDE'].str.replace(',', '.'), errors='coerce')
df['LONGITUDE'] = pd.to_numeric(df['LONGITUDE'].str.replace(',', '.'), errors='coerce')

# Criar o dashboard
st.title("Dashboard de Unidades Básicas de Saúde (UBS)")
# Remover linhas com valores inválidos após a conversão
df = df.dropna(subset=['LATITUDE', 'LONGITUDE'])

# Gráfico de barras
grafico = px.bar(df_freq, x='Estado', y='Frequência',
title='Frequência de UBS por Estado',
labels={'Estado': 'Estado', 'Frequência': 'Número de UBS'},
text_auto=True)

# Verifica se as colunas de latitude e longitude existem
if 'LATITUDE' in df.columns and 'LONGITUDE' in df.columns:
# Criar o dashboard
st.title("Dashboard de Unidades Básicas de Saúde (UBS)")

# Contar a frequência de UBS por estado
df_freq = df['Nome_UF'].value_counts().reset_index()
df_freq.columns = ['Estado', 'Frequência']

# Gráfico de barras
grafico = px.bar(df_freq, x='Estado', y='Frequência',
title='Frequência de UBS por Estado',
labels={'Estado': 'Estado', 'Frequência': 'Número de UBS'},
text_auto=True)
st.plotly_chart(grafico)

# Filtro para estados específicos
estados = st.multiselect("Selecione os estados", df_freq['Estado'].unique())

if estados:
df_filtrado = df[df['Nome_UF'].isin(estados)]
st.write(df_filtrado)

# Criar um mapa com os pontos das UBS filtradas
df_mapa = df_filtrado[['LATITUDE', 'LONGITUDE']]
st.map(df_mapa)
else:
# Se nenhum estado for selecionado, mostrar todas as UBS no mapa
df_mapa = df[['LATITUDE', 'LONGITUDE']]
st.map(df_mapa)
else:
st.error("As colunas 'latitude' e 'longitude' não foram encontradas no dataset.")

#Exercicio 2: Gráfico de Pizza da Distribuição de UBS por Estado
grafico = px.pie(df_freq, names='Estado', values='Frequência', title='UBS por Estado')
st.plotly_chart(grafico)

# Filtro para estados específicos
estados = st.multiselect("Selecione os estados", df_freq['Estado'].unique())
if estados:
df_filtrado = df[df['Nome_UF'].isin(estados)]
st.write(df_filtrado)
#Exercicio 3: Histograma da Quantidade de UBS por Município
# Contar a quantidade de UBS por município
df_municipios = df['Nome_Município'].value_counts().reset_index()
df_municipios.columns = ['Município', 'Quantidade_UBS']

# Controle deslizante para filtrar municípios com um número mínimo de UBS
min_ubs = st.slider("Selecione o número mínimo de UBS por município",
min_value=int(df_municipios['Quantidade_UBS'].min()),
max_value=int(df_municipios['Quantidade_UBS'].max()),
value=int(df_municipios['Quantidade_UBS'].min()))

# Filtrar os municípios
df_filtrado = df_municipios[df_municipios['Quantidade_UBS'] >= min_ubs]

# Criar gráfico de barras para visualizar os municípios com o filtro aplicado
grafico_barras = px.bar(df_filtrado, x='Município', y='Quantidade_UBS',
title="Número de UBS por Município",
labels={'Município': 'Município', 'Quantidade_UBS': 'Número de UBS'},
text_auto=True)

st.plotly_chart(grafico_barras)