Todos os estudos de caso

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

IndicadorMetaPor que importa
Taxa de Ocupação85% a 90%Acima de 90% o hospital perde capacidade de resposta; abaixo de 80%, ociosidade custosa
Tempo Médio de Permanência≤ 4,2 diasCada dia a mais é leito indisponível e risco de infecção
Giro de Leito≥ 6,5/mêsTraduz ocupação e permanência em capacidade de atendimento
Tempo de Porta-Médico (PS)≤ 18 minIndicador 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.

TabelaGranularidadeUso
fInternacoesInternaçãoEntrada, alta, diagnóstico, desfecho, equipe
fCensoDiarioDia × LeitoOcupado, vago, bloqueado — base da ocupação
fAtendimentosPSAtendimentoChegada, triagem, médico, alta, classificação de risco
fCirurgiasProcedimentoAgendada, realizada, cancelada, motivo
fFaturamentoConta × ItemValor apresentado, glosado, recebido
dPacientePacienteSem nome no modelo publicado; use código
dLeito / dUnidade / dEspecialidade / dCID / dConvenio / dProfissionalDimensões—

Medidas DAX

Ocupação e giro de leito

DAX
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

DAX
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

DAX
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

DAX
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

DAX
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

DAX
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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 5Página 5 — Centro Cirúrgico: ocupação de sala por hora; cancelamentos por motivo em Pareto; atraso do primeiro horário por equipe.
  6. 6Página 6 — Faturamento: glosa por convênio e motivo em Pareto; percentual recuperado; prazo médio de recebimento por convênio.
  7. 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.