Saúde
Gestão hospitalar: ocupação, tempo de permanência e qualidade assistencial
Contexto
Hospital geral de 240 leitos, pronto-socorro com 320 atendimentos por dia e 11 especialidades cirúrgicas. A diretoria clínica e a diretoria financeira discutiam com números diferentes: uma olhava desfecho, a outra olhava custo. O objetivo é um painel único que mostre eficiência operacional sem perder de vista a qualidade assistencial.
Perguntas que o painel deve responder
- Quais unidades estão acima da ocupação de segurança neste momento?
- Quais especialidades têm permanência acima da média sem justificativa de gravidade?
- Onde está a fila do pronto-socorro e qual etapa a causa?
- Quais convênios mais glosam e em quais procedimentos?
- A reinternação está concentrada em algum diagnóstico ou em alguma equipe?
Indicadores e metas
| Indicador | Meta | Por que importa |
|---|---|---|
| Taxa de Ocupação | 85% a 90% | Acima de 90% o hospital perde capacidade de resposta; abaixo de 80%, ociosidade custosa |
| Tempo Médio de Permanência | ≤ 4,2 dias | Cada dia a mais é leito indisponível e risco de infecção |
| Giro de Leito | ≥ 6,5/mês | Traduz ocupação e permanência em capacidade de atendimento |
| Tempo de Porta-Médico (PS) | ≤ 18 min | Indicador de experiência e de segurança no pronto-socorro |
| Taxa de Reinternação em 30 dias | ≤ 7% | Principal indicador de qualidade do desfecho e da alta |
| Taxa de Infecção Hospitalar | ≤ 3,5% | Indicador crítico de segurança do paciente |
| Taxa de Cancelamento Cirúrgico | ≤ 5% | Desperdício de sala, equipe e expectativa do paciente |
| Glosa sobre Faturamento | ≤ 4% | Receita reconhecida que nunca entra no caixa |
Modelo de dados
Saúde combina eventos (internação, atendimento, cirurgia) com posições diárias (censo de leitos). A fato de censo é o que permite calcular ocupação corretamente — não tente derivar ocupação apenas das internações.
| Tabela | Granularidade | Uso |
|---|---|---|
| fInternacoes | Internação | Entrada, alta, diagnóstico, desfecho, equipe |
| fCensoDiario | Dia × Leito | Ocupado, vago, bloqueado — base da ocupação |
| fAtendimentosPS | Atendimento | Chegada, triagem, médico, alta, classificação de risco |
| fCirurgias | Procedimento | Agendada, realizada, cancelada, motivo |
| fFaturamento | Conta × Item | Valor apresentado, glosado, recebido |
| dPaciente | Paciente | Sem nome no modelo publicado; use código |
| dLeito / dUnidade / dEspecialidade / dCID / dConvenio / dProfissional | Dimensões | — |
Medidas DAX
Ocupação e giro de leito
Leitos Operacionais =CALCULATE( DISTINCTCOUNT( fCensoDiario[IdLeito] ), fCensoDiario[Status] <> "Bloqueado" ) Leitos-Dia Disponíveis =SUMX( VALUES( dCalendario[Date] ), [Leitos Operacionais] ) Leitos-Dia Ocupados =CALCULATE( COUNTROWS( fCensoDiario ), fCensoDiario[Status] = "Ocupado" ) Taxa de Ocupação % =DIVIDE( [Leitos-Dia Ocupados], [Leitos-Dia Disponíveis] ) Giro de Leito =DIVIDE( [Altas], AVERAGEX( VALUES( dCalendario[Date] ), [Leitos Operacionais] ) ) Intervalo de Substituição =-- Horas que o leito fica vago entre uma alta e a próxima internaçãoDIVIDE( ( [Leitos-Dia Disponíveis] - [Leitos-Dia Ocupados] ) * 24, [Altas])Leitos bloqueados (manutenção, isolamento) devem sair do denominador: incluí-los mascara a ocupação real e faz o hospital parecer folgado quando está no limite.
Tempo de permanência
Altas = CALCULATE( COUNTROWS( fInternacoes ), NOT ISBLANK( fInternacoes[DataAlta] ) ) Tempo Médio de Permanência =AVERAGEX( FILTER( fInternacoes, NOT ISBLANK( fInternacoes[DataAlta] ) ), DATEDIFF( fInternacoes[DataEntrada], fInternacoes[DataAlta], DAY )) TMP Ajustado pela Gravidade =-- Compara a permanência observada com a esperada para o mesmo CID e faixa etáriaVAR Observado = [Tempo Médio de Permanência]VAR Esperado = AVERAGEX( VALUES( dCID[Codigo] ), CALCULATE( AVERAGE( dCID[PermanenciaEsperadaDias] ) ) )RETURN DIVIDE( Observado, Esperado ) Permanência Prolongada =CALCULATE( COUNTROWS( fInternacoes ), FILTER( fInternacoes, DATEDIFF( fInternacoes[DataEntrada], COALESCE( fInternacoes[DataAlta], TODAY() ), DAY ) > RELATED( dCID[PermanenciaEsperadaDias] ) * 1.5 ))Comparar permanência bruta entre especialidades é injusto: UTI neurológica e maternidade não são comparáveis. O índice ajustado (observado/esperado) é a métrica defensável clinicamente.
Pronto-socorro: tempos por etapa
Tempo Porta-Triagem =AVERAGEX( fAtendimentosPS, DATEDIFF( fAtendimentosPS[HoraChegada], fAtendimentosPS[HoraTriagem], MINUTE ) ) Tempo Porta-Médico =AVERAGEX( fAtendimentosPS, DATEDIFF( fAtendimentosPS[HoraChegada], fAtendimentosPS[HoraMedico], MINUTE ) ) Tempo Total de Permanência no PS =AVERAGEX( fAtendimentosPS, DATEDIFF( fAtendimentosPS[HoraChegada], fAtendimentosPS[HoraSaida], MINUTE ) ) Dentro da Meta por Classificação % =VAR MetaMinutos = SWITCH( SELECTEDVALUE( fAtendimentosPS[ClassificacaoRisco] ), "Vermelho", 0, "Laranja", 10, "Amarelo", 60, "Verde", 120, 240 )RETURNDIVIDE( CALCULATE( COUNTROWS( fAtendimentosPS ), FILTER( fAtendimentosPS, DATEDIFF( fAtendimentosPS[HoraChegada], fAtendimentosPS[HoraMedico], MINUTE ) <= MetaMinutos ) ), COUNTROWS( fAtendimentosPS )) Evasão do PS % =DIVIDE( CALCULATE( COUNTROWS( fAtendimentosPS ), fAtendimentosPS[Desfecho] = "Evasão" ), COUNTROWS( fAtendimentosPS ))A meta de tempo muda conforme a classificação de risco (protocolo de Manchester). Uma média única esconde exatamente o caso que não podia esperar.
Qualidade assistencial
Reinternação 30 dias =CALCULATE( COUNTROWS( fInternacoes ), FILTER( fInternacoes, VAR Pac = fInternacoes[IdPaciente] VAR Entrada = fInternacoes[DataEntrada] VAR AltaAnterior = CALCULATE( MAX( fInternacoes[DataAlta] ), ALLEXCEPT( fInternacoes, fInternacoes[IdPaciente] ), fInternacoes[DataAlta] < Entrada ) RETURN NOT ISBLANK( AltaAnterior ) && DATEDIFF( AltaAnterior, Entrada, DAY ) <= 30 )) Taxa de Reinternação % = DIVIDE( [Reinternação 30 dias], [Altas] ) Taxa de Infecção Hospitalar % =DIVIDE( CALCULATE( COUNTROWS( fInternacoes ), fInternacoes[InfeccaoHospitalar] = TRUE() ), [Altas]) Densidade de Incidência de IRAS =-- Padrão internacional: casos por 1.000 pacientes-diaDIVIDE( [Casos de IRAS], [Leitos-Dia Ocupados] ) * 1000 Taxa de Mortalidade Institucional % =DIVIDE( CALCULATE( COUNTROWS( fInternacoes ), fInternacoes[Desfecho] = "Óbito", fInternacoes[HorasInternado] > 24 ), [Altas])Mortalidade institucional exclui óbitos nas primeiras 24 horas, que refletem a gravidade na chegada e não a qualidade do cuidado prestado. Esse tipo de precisão é o que dá credibilidade ao painel junto ao corpo clínico.
Centro cirúrgico
Cirurgias Realizadas = CALCULATE( COUNTROWS( fCirurgias ), fCirurgias[Status] = "Realizada" ) Taxa de Cancelamento % =DIVIDE( CALCULATE( COUNTROWS( fCirurgias ), fCirurgias[Status] = "Cancelada" ), COUNTROWS( fCirurgias )) Taxa de Ocupação de Sala % =DIVIDE( SUMX( fCirurgias, DATEDIFF( fCirurgias[HoraInicio], fCirurgias[HoraFim], MINUTE ) ), [Minutos de Sala Disponíveis]) Atraso do Primeiro Horário =AVERAGEX( FILTER( fCirurgias, fCirurgias[EhPrimeiroHorario] = TRUE() ), DATEDIFF( fCirurgias[HoraAgendada], fCirurgias[HoraInicio], MINUTE ))O atraso do primeiro horário é o indicador de maior efeito cascata do hospital: 30 minutos de atraso às 7h viram duas horas às 17h e um cancelamento no fim do dia.
Faturamento e glosas
Valor Apresentado = SUM( fFaturamento[ValorApresentado] )Valor Glosado = SUM( fFaturamento[ValorGlosado] )Valor Recebido = SUM( fFaturamento[ValorRecebido] ) Taxa de Glosa % = DIVIDE( [Valor Glosado], [Valor Apresentado] ) Glosa Recuperada % =DIVIDE( SUM( fFaturamento[ValorRecuperado] ), [Valor Glosado] ) Principal Motivo de Glosa =CONCATENATEX( TOPN( 1, VALUES( dMotivoGlosa[Motivo] ), [Valor Glosado], DESC ), dMotivoGlosa[Motivo])Glosa é dinheiro já trabalhado e não recebido. Abrir por convênio, procedimento e motivo transforma o indicador em plano de ação para o faturamento.
Layout do painel
- 1Página 1 — Painel do Dia (atualização de 15 em 15 minutos): mapa de leitos por unidade com cor por status, cartões de ocupação atual, pacientes aguardando leito no PS, cirurgias do dia e altas previstas.
- 2Página 2 — Eficiência: linha de ocupação com faixas de referência (80% e 90%); TMP por especialidade com índice observado/esperado; giro de leito e intervalo de substituição.
- 3Página 3 — Pronto-Socorro: funil de tempos por etapa; percentual dentro da meta por classificação de risco; mapa de calor de atendimentos por hora e dia da semana (dimensiona escala de equipe); evasão.
- 4Página 4 — Qualidade: reinternação por especialidade e por CID; densidade de IRAS por 1.000 pacientes-dia com carta de controle; mortalidade institucional; todos com linha de referência da meta institucional.
- 5Página 5 — Centro Cirúrgico: ocupação de sala por hora; cancelamentos por motivo em Pareto; atraso do primeiro horário por equipe.
- 6Página 6 — Faturamento: glosa por convênio e motivo em Pareto; percentual recuperado; prazo médio de recebimento por convênio.
- 7RLS por unidade e especialidade. Nenhum dado identificável de paciente no modelo publicado.
Desafio final
Implemente a taxa de reinternação em 30 dias — é o cálculo mais difícil deste caso, porque exige comparar cada internação com a alta anterior do mesmo paciente. Depois construa a carta de controle de IRAS com média e limites de 3 desvios, e identifique se houve algum ponto fora de controle nos últimos 24 meses.