Dashboard de ocupação de leitos no Power BI
Como construir um dashboard de ocupação de leitos no Power BI com KPIs reais, modelagem estrela, medidas DAX e atualização a partir do HIS.
O leito parado custa caro e ninguém enxerga em tempo real
Em quase todo hospital que a Fynx acompanha, a informação sobre ocupação existe, mas chega tarde. O coordenador de internação abre uma planilha atualizada manualmente pela manhã, a diretoria recebe um relatório consolidado no fim do mês e a enfermagem trabalha com quadros de acrílico na parede. Um dashboard de ocupação de leitos no Power BI resolve esse descompasso: transforma o censo que já está no sistema de gestão hospitalar em um painel que responde, agora, quantos leitos estão livres, ocupados, bloqueados e quanto tempo cada paciente está internado.
Este artigo é técnico e assume que você vai colocar a mão na massa. Vou tratar dos KPIs que realmente importam, da modelagem de dados por trás deles, das medidas DAX que os calculam, de como atualizar a partir do HIS e de onde o Power Platform entra para fechar o ciclo entre enxergar o problema e agir sobre ele.
Os KPIs de ocupação que sustentam a decisão
Um painel bonito com métricas erradas atrapalha. Antes de desenhar qualquer visual, defina o que cada indicador significa e em que granularidade ele faz sentido. Estes são os KPIs que compõem o núcleo de um dashboard de ocupação de leitos hospitalar.
| KPI | O que mede | Como calcular (base) |
|---|---|---|
| Taxa de ocupação | Percentual de leitos operacionais em uso | Pacientes-dia / leitos-dia disponíveis |
| Giro de leito | Quantos pacientes passam por leito no período | Total de altas / leitos operacionais |
| Tempo médio de permanência | Dias médios que o paciente fica internado | Pacientes-dia / número de saídas |
| Leitos bloqueados | Leitos indisponíveis por manutenção, isolamento ou reforma | Contagem de leitos com status de bloqueio |
| Censo diário | Foto do total de pacientes internados por dia | Contagem de internações ativas na data |
| Intervalo de substituição | Tempo médio que o leito fica vago entre uma alta e a próxima admissão | (Leitos-dia disponíveis menos pacientes-dia) / saídas |
Três observações que separam um painel amador de um confiável.
A taxa de ocupação precisa usar leitos operacionais no denominador, não leitos instalados. Um leito bloqueado para manutenção não deveria inflar a base e mascarar a ocupação real. A diretoria toma decisões muito diferentes dependendo de qual número aparece.
O tempo médio de permanência só faz sentido segmentado. A média geral do hospital esconde tudo. Um paciente de UTI e um de day clinic no mesmo indicador não dizem nada. Segmente por clínica, especialidade e tipo de leito, sempre.
Os leitos bloqueados são o KPI mais negligenciado e o que mais devolve dinheiro rápido. Bloqueio que deveria durar duas horas e dura dois dias é receita perdida e é visível assim que o painel escancara o tempo em cada status.
A modelagem certa é um esquema estrela, não uma planilha achatada
O erro mais comum é jogar a exportação bruta do HIS em uma tabela única e gigante e sair criando visuais em cima dela. Isso funciona no protótipo e quebra na escala. O Power BI foi feito para modelo dimensional.
O motor por trás do Power BI é o VertiPaq, um mecanismo colunar que comprime cada coluna de acordo com a sua cardinalidade. Colunas com poucos valores distintos comprimem muito bem, colunas com alta cardinalidade ocupam muito espaço e degradam a performance. Uma tabela achatada com data, hora, identificador de paciente, texto de diagnóstico e status tudo junto tem cardinalidade péssima. Separar dimensões de fatos não é purismo acadêmico, é o que deixa o modelo leve.
Um desenho enxuto para ocupação de leitos costuma ter estas tabelas.
| Tabela | Tipo | Papel |
|---|---|---|
fCensoDiario | Fato | Snapshot diário de cada leito com seu status na data |
fInternacoes | Fato | Um registro por internação, com admissão e alta |
dCalendario | Dimensão | Calendário contínuo marcado como tabela de datas |
dLeito | Dimensão | Leito, tipo, ala, andar, unidade |
dPaciente | Dimensão | Atributos não sensíveis do paciente |
dClinica | Dimensão | Especialidade, clínica, convênio |
A escolha entre um fato de eventos (fInternacoes, um registro por internação) e um fato snapshot (fCensoDiario, uma foto por leito por dia) não é ou um ou outro. Você precisa dos dois. O snapshot diário é o que permite calcular taxa de ocupação histórica sem lógica de intervalos custosa em DAX, porque a granularidade leito-dia já está materializada. O fato de eventos é o que sustenta tempo de permanência e giro. Manter uma dCalendario marcada como tabela de datas é obrigatório para que as funções de time intelligence funcionem sem surpresa.
Se você quer se aprofundar na parte de modelagem, vale ler o guia de boas práticas de modelagem e DAX no Power BI, que trata em detalhe da relação entre cardinalidade, granularidade e performance.
As medidas DAX que dão vida ao painel
Com o modelo estrela pronto, as medidas ficam curtas e legíveis. Evite calcular ocupação varrendo intervalos de datas em DAX puro se você já tem o snapshot diário: é mais barato contar linhas do fato snapshot.
Assumindo o fCensoDiario com uma linha por leito por dia e uma coluna Status, o total de leitos-dia disponíveis exclui bloqueados:
Leitos-dia Disponíveis = CALCULATE ( COUNTROWS ( fCensoDiario ), fCensoDiario[Status] <> "Bloqueado" )
Os pacientes-dia contam apenas o status ocupado:
Pacientes-dia = CALCULATE ( COUNTROWS ( fCensoDiario ), fCensoDiario[Status] = "Ocupado" )
A taxa de ocupação vira uma divisão segura, usando DIVIDE para não estourar em divisão por zero:
Taxa de Ocupacao = DIVIDE ( [Pacientes-dia], [Leitos-dia Disponíveis] )
O tempo médio de permanência sai do fato de eventos, considerando internações com alta no período:
Tempo Medio Permanencia = DIVIDE ( SUMX ( fInternacoes, DATEDIFF ( fInternacoes[DataAdmissao], fInternacoes[DataAlta], DAY ) ), COUNTROWS ( fInternacoes ) )
O giro de leito relaciona altas com leitos operacionais no contexto filtrado:
Giro de Leito = DIVIDE ( COUNTROWS ( fInternacoes ), DISTINCTCOUNT ( dLeito[LeitoID] ) )
Duas recomendações de ofício. Sempre use DIVIDE no lugar do operador de barra, porque período sem movimento acontece e você não quer erro no visual. E deixe as medidas base (Pacientes-dia, Leitos-dia Disponíveis) explícitas para reaproveitar, em vez de repetir a mesma lógica dentro de cada indicador. Isso reduz erro e facilita manutenção quando a regra de negócio muda.
A atualização precisa vir do HIS, sem planilha no meio
Um dashboard de ocupação de leitos só entrega valor se os dados chegam frescos. Aqui a arquitetura importa mais que o visual.
Sistemas de gestão hospitalar, os HIS como MV, Tasy, Pixeon e similares, guardam os dados em banco relacional, tipicamente Oracle ou SQL Server. O caminho mais robusto é o Power BI consumir de uma camada intermediária, não direto das tabelas transacionais de produção. Consultar o banco operacional em horário de pico para alimentar um painel é pedir para brigar com o DBA, e ele tem razão.
O desenho que recomendo na prática.
- Uma camada analítica separada, seja um data warehouse, um schema de leitura ou um lakehouse, alimentada por processo de extração agendado fora do pico.
- O Power BI lendo dessa camada por Import quando a latência de algumas horas é aceitável, o que cobre a maioria dos indicadores gerenciais.
- Modo DirectQuery ou um snapshot de alta frequência quando a operação exige censo quase em tempo real para gestão de leitos ativa.
Para quem já está no Microsoft Fabric, anunciado pela Microsoft em 2023, o modo Direct Lake muda o jogo: o modelo lê os arquivos diretamente do OneLake sem a etapa de importação e sem a latência do DirectQuery tradicional, combinando frescor com performance de Import. É a opção que melhor equilibra atualização e velocidade para censo hospitalar em volume, quando a organização já tem capacidade Fabric provisionada. O consumo no Fabric é medido em Capacity Units, com SKUs que vão de F2 a F2048, e o dimensionamento deve ser feito com base na carga real de atualização e consulta.
Se a atualização e a arquitetura de dados são o gargalo do seu projeto, esse é exatamente o terreno de um trabalho de engenharia de dados bem feito, que constrói a camada analítica que sustenta o painel sem sufocar o transacional.
Governança e LGPD não são opcionais em dado hospitalar
Dado de internação é dado pessoal e, na maioria dos casos, dado sensível de saúde. A Lei nº 13.709/2018, a LGPD, trata dado referente à saúde como categoria especial, com exigência de base legal e cuidado reforçado. Isso tem consequência direta no desenho do painel.
Na prática, um dashboard de ocupação de leitos gerencial não precisa expor identidade de paciente. A diretoria quer taxa de ocupação por ala, giro por clínica e tempo de permanência por especialidade, não o nome de quem está no leito 214. Modele para o menor privilégio: mantenha os atributos identificáveis fora do modelo analítico sempre que o KPI não exigir, e onde a operação exigir rastreio individual, aplique segurança em nível de linha, a Row-Level Security do Power BI, para que cada perfil veja só o que lhe compete.
Tratei desse assunto com mais profundidade no artigo sobre governança de dados no Power BI e LGPD, que vale a leitura antes de publicar qualquer painel com dado de paciente. E a disciplina contínua de catálogo, papéis e auditoria é o que um serviço de governança de dados coloca de pé para que o painel não vire um vazamento esperando para acontecer.
Do painel à ação com Power Platform
Enxergar o leito bloqueado é metade do trabalho. A outra metade é fazer alguém desbloqueá-lo. É aqui que o Power Platform fecha o ciclo, e onde muito projeto de BI para na primeira metade.
Alguns usos concretos que fazem diferença na operação.
- Um Power Automate que dispara alerta quando a taxa de ocupação de uma ala ultrapassa um limite crítico, notificando o plantão por Teams ou e-mail sem ninguém precisar estar olhando o painel.
- Um Power App simples de baixo custo para a enfermagem registrar mudança de status de leito, de higienização para disponível, alimentando de volta a camada de dados e reduzindo o intervalo de substituição.
- Fluxos que abrem chamado de manutenção automaticamente quando um leito entra em bloqueio, com o relógio correndo desde o primeiro minuto.
Esse casamento entre painel que mostra e aplicativo que age é o que transforma BI em operação de fato. Se quiser entender o ecossistema, o guia de Power Platform com Power Apps e Automate dá o panorama, e um projeto de Power Platform desenha essas automações sob medida para o fluxo do hospital.
Como começar sem transformar em projeto de dois anos
Um erro clássico é querer modelar o hospital inteiro antes de entregar o primeiro valor. Faça o inverso. Comece por uma unidade ou clínica, com o snapshot diário e os quatro KPIs de maior impacto: taxa de ocupação, tempo de permanência, leitos bloqueados e censo diário. Prove valor em semanas, não em trimestres, e expanda a partir do que a operação pedir.
Sobre licenciamento, para dar contexto sem prometer número: o Power BI se distribui principalmente por Power BI Pro e Power BI Premium por Usuário, a PPU, ambas licenças por usuário, além da capacidade dedicada via Fabric. Preços variam por contrato, região e canal, e devem ser confirmados na fonte oficial da Microsoft. Vale lembrar que a Microsoft é reconhecida como Líder no Quadrante Mágico do Gartner para plataformas de Analytics e BI, e a ampla penetração do ecossistema Microsoft no Brasil explica boa parte da adoção do Power BI no país. Um trabalho de Power BI bem conduzido escolhe a licença certa para o tamanho da operação, sem pagar por capacidade que você não vai usar.
Perguntas frequentes
Qual a diferença entre taxa de ocupação sobre leitos instalados e sobre leitos operacionais?
Leitos instalados é a capacidade física total, incluindo leitos bloqueados e desativados. Leitos operacionais são os que estão de fato disponíveis para internar. A taxa de ocupação relevante para gestão usa leitos operacionais no denominador, porque medir ocupação contra leitos que você não pode usar subestima o quanto o hospital está cheio e leva a decisões erradas de capacidade.
Preciso de dados em tempo real para um dashboard de ocupação de leitos?
Depende do uso. Para relatório gerencial e diretoria, uma atualização a cada poucas horas via Import atende com folga e é mais barata e estável. Para gestão ativa de leitos, onde a equipe realoca pacientes ao longo do dia, aí sim faz sentido DirectQuery, Direct Lake no Fabric ou um snapshot de alta frequência. Não pague o custo de tempo real onde a decisão é diária.
Posso conectar o Power BI direto no banco do HIS?
Tecnicamente sim, mas raramente é boa ideia consultar o banco transacional de produção em horário de pico. O caminho robusto é extrair para uma camada analítica separada, um data warehouse ou lakehouse, e o Power BI lê dessa camada. Isso protege a performance do sistema assistencial e dá a você liberdade para modelar sem mexer na base operacional.
Como calcular tempo médio de permanência corretamente em DAX?
Use o fato de eventos com uma linha por internação, calcule a diferença em dias entre admissão e alta com DATEDIFF dentro de um SUMX e divida pelo número de saídas com DIVIDE. O ponto crítico é decidir quais internações entram na conta, normalmente as que tiveram alta no período analisado, e segmentar por clínica ou tipo de leito, porque a média global não informa quase nada.
O dashboard de ocupação de leitos precisa se preocupar com LGPD?
Sim. Dado de internação é dado pessoal, e informação de saúde é tratada como dado sensível pela Lei nº 13.709/2018. Na maioria dos painéis gerenciais você não precisa expor identidade de paciente para calcular ocupação, giro e permanência. Modele com o mínimo de dado identificável, aplique segurança em nível de linha onde necessário e registre a base legal do tratamento.
Vale a pena usar Microsoft Fabric para esse tipo de painel?
Vale quando a organização já tem ou pretende ter capacidade Fabric e o volume de censo justifica. O modo Direct Lake lê direto do OneLake, entregando frescor sem a latência do DirectQuery e sem a etapa de importação, o que é ideal para dados hospitalares em volume. Para um projeto pequeno e pontual, Power BI Pro com Import resolve sem a complexidade e o custo de uma capacidade dedicada.
Conclusão
Um dashboard de ocupação de leitos que funciona não é o que tem mais visuais, é o que junta KPIs bem definidos, um modelo estrela leve, medidas DAX corretas, atualização confiável a partir do HIS e respeito à LGPD, com o Power Platform fechando o ciclo entre ver e agir. Comece pequeno, prove valor rápido e expanda com governança desde o primeiro dia.
Se você quer tirar esse painel do papel com quem já entregou mais de 2.000 soluções Microsoft, fale com a gente.
Quer aplicar isso na sua empresa?
A Fynx implementa BI, Power BI e Power Platform de ponta a ponta. Conte seu cenário e devolvemos um diagnóstico direto ao ponto.
Falar com um especialista