Dashboard de ocupação de turmas e salas no Power BI
Como construir um dashboard de ocupação de turmas e salas no Power BI: taxa de ocupação, ponto de equilíbrio, uso de salas e capacidade ociosa com DAX.
A ocupação de turmas é onde a margem da instituição de ensino nasce ou morre
Uma turma com 12 alunos e uma turma com 28 alunos custam quase o mesmo para operar. O professor, a sala, a energia, a coordenação e o material didático não mudam muito entre uma e outra. O que muda é a receita. Por isso a ocupação de turmas não é um indicador operacional secundário: é a variável que decide se o semestre fecha no azul ou no vermelho. E, na maioria das instituições, essa informação vive espalhada entre o ERP acadêmico, a grade horária feita na mão e a planilha de capacidade das salas que só a secretaria entende.
O dashboard de ocupação existe para resolver isso. Ele responde três perguntas que a diretoria precisa fazer toda semana: quais turmas estão abaixo do ponto de equilíbrio, quantas cadeiras estão vazias por sala e horário, e onde há capacidade ociosa que poderia absorver mais matrículas sem custo adicional. Este artigo mostra como modelar esses dados no Power BI e escrever as medidas DAX que sustentam o painel, sem inventar número e sem esconder a parte chata, que é a modelagem.
O modelo dimensional vem antes de qualquer medida
Antes de escrever uma linha de DAX, você precisa de um modelo estrela limpo. Ocupação de turmas cruza três coisas: quantos alunos estão matriculados, qual a capacidade contratada da turma e como essa turma ocupa uma sala física em um horário. Se você jogar tudo numa tabela larga, o motor VertiPaq até engole, mas as medidas viram um pesadelo de manutenção e os filtros começam a se contradizer.
O VertiPaq, o motor colunar do Power BI, comprime cada coluna com base na cardinalidade dela. Colunas com poucos valores distintos, como turno, curso ou status da matrícula, comprimem muito bem e viram dimensões baratas. Colunas de alta cardinalidade, como um identificador único de matrícula, pesam mais e devem ficar na tabela fato. Modelar com isso em mente não é preciosismo: é o que mantém o modelo rápido quando a base cresce de um campus para toda a rede.
O modelo mínimo para ocupação tem esta cara:
| Tabela | Tipo | Grão | Colunas principais |
|---|---|---|---|
| fMatriculas | Fato | Uma linha por aluno por turma | ID Aluno, ID Turma, Status, Data Matrícula, Valor Mensalidade |
| fAlocacaoSala | Fato | Uma linha por turma por sala por horário | ID Turma, ID Sala, ID Horário, Horas Aula |
| dTurma | Dimensão | Uma linha por turma | ID Turma, Nome, Curso, Turno, Capacidade, Custo Fixo |
| dSala | Dimensão | Uma linha por sala | ID Sala, Bloco, Capacidade Física, Tipo |
| dHorario | Dimensão | Uma linha por faixa horária | ID Horário, Dia Semana, Início, Fim, Duração |
| dCalendario | Dimensão | Uma linha por dia | Data, Mês, Semestre, Ano Letivo |
Repare que existem duas tabelas fato: uma para matrículas, outra para alocação de salas. Elas compartilham a dimensão dTurma, e é isso que permite cruzar ocupação pedagógica com uso de espaço físico sem criar relacionamentos ambíguos. Se você tem dúvida sobre quando separar fatos e como evitar relacionamentos muitos-para-muitos que quebram o filtro, vale revisar as boas práticas de modelagem DAX antes de seguir.
A taxa de ocupação por turma é a primeira medida a acertar
A taxa de ocupação é a razão entre matrículas ativas e a capacidade da turma. Parece trivial, mas o detalhe que quebra painéis é a divisão. Turma nova, turma cancelada ou capacidade não preenchida geram divisão por zero, e o Power BI não deveria mostrar erro numa reunião de diretoria. Por isso toda razão usa DIVIDE, que trata o denominador zero devolvendo em branco em vez de infinito.
Matrículas Ativas =
CALCULATE (
COUNTROWS ( fMatriculas ),
fMatriculas[Status] = "Ativa"
)
Capacidade da Turma =
SUM ( dTurma[Capacidade] )
Taxa de Ocupação =
DIVIDE (
[Matrículas Ativas],
[Capacidade da Turma]
)
Com essas três medidas você já tem um cartão com o percentual médio de ocupação e uma tabela por turma. O ganho vem do contexto: ocupação por turno mostra que o noturno enche e o matutino sobra, por curso mostra qual coordenação precisa de plano de captação, por semestre mostra a tendência. Nenhuma dessas leituras exige medida nova, apenas os campos certos das dimensões nos eixos.
O ponto de equilíbrio transforma ocupação em decisão financeira
Taxa de ocupação sozinha não diz se a turma dá lucro. Uma turma pode estar 70% cheia e ainda assim operar no prejuízo se o custo fixo for alto. O ponto de equilíbrio da turma é o número mínimo de alunos que cobre o custo fixo, considerando a margem de contribuição por aluno, ou seja, a mensalidade líquida menos o custo variável de cada matrícula.
Alunos no Ponto de Equilíbrio =
DIVIDE (
[Custo Fixo da Turma],
[Mensalidade Líquida por Aluno] - [Custo Variável por Aluno]
)
Com o ponto de equilíbrio calculado, a comparação com as matrículas ativas vira um semáforo direto. Essa é a medida que muda a conversa: em vez de discutir percentuais abstratos, a coordenação enxerga quantos alunos faltam para a turma parar de dar prejuízo, ou quantos alunos de folga ela tem antes de ser questionada.
Status da Turma =
VAR Ativas = [Matrículas Ativas]
VAR Equilibrio = [Alunos no Ponto de Equilíbrio]
RETURN
SWITCH (
TRUE (),
Ativas < Equilibrio, "Abaixo do equilíbrio",
Ativas < Equilibrio * 1.15, "No limite",
"Saudável"
)
Uma leitura típica do painel fica assim:
| Turma | Capacidade | Matrículas | Taxa de ocupação | Ponto de equilíbrio | Status |
|---|---|---|---|---|---|
| ADM Noturno A | 40 | 34 | 85% | 22 | Saudável |
| Direito Matutino B | 45 | 24 | 53% | 26 | Abaixo do equilíbrio |
| Engenharia Noturno C | 40 | 29 | 73% | 28 | No limite |
| Pedagogia EAD D | 60 | 51 | 85% | 30 | Saudável |
Os números da tabela são ilustrativos e servem só para mostrar o formato da leitura. O que importa é a mecânica: uma turma com 53% de ocupação e ponto de equilíbrio em 26 alunos está queimando caixa, e isso aparece antes de o semestre fechar, quando ainda dá para agir com remanejamento ou captação direcionada.
O uso de salas e a grade horária revelam o custo escondido do espaço
Turma cheia não garante prédio bem aproveitado. Você pode ter todas as turmas saudáveis e ainda assim manter um bloco inteiro ocioso das 7h às 10h porque a grade concentrou tudo no fim da tarde. O uso de sala mede quantas horas de aula uma sala recebe frente às horas em que ela poderia ser usada, e é aqui que a fato fAlocacaoSala cruzada com dHorario faz o trabalho.
Horas Aula Alocadas =
SUM ( fAlocacaoSala[Horas Aula] )
Uso de Sala =
DIVIDE (
[Horas Aula Alocadas],
[Horas Disponíveis da Sala]
)
As horas disponíveis vêm da faixa de operação do campus multiplicada pelos dias letivos, calculados a partir de dHorario e dCalendario. Colocando bloco e faixa horária num heatmap, o vazio salta aos olhos: o quadrante da manhã inteiro claro enquanto a noite está saturada. Essa é a informação que sustenta decisões de infraestrutura, como não construir prédio novo antes de aproveitar o que já existe.
| Bloco | Salas | Uso manhã | Uso tarde | Uso noite |
|---|---|---|---|---|
| Bloco A | 12 | 41% | 78% | 92% |
| Bloco B | 10 | 22% | 55% | 88% |
| Laboratórios | 6 | 30% | 61% | 74% |
De novo, os valores acima são um exemplo de estrutura, não um dado de cliente. Mas o padrão que eles ilustram é recorrente no setor: a manhã sobra, a noite falta. Um painel que expõe isso paga a própria construção em uma única decisão de não alugar espaço adicional.
A capacidade ociosa é o dinheiro que a instituição deixa na mesa
Capacidade ociosa é a diferença entre o que a turma poderia comportar e o que ela de fato tem matriculado. É a medida mais simples do painel e, ao mesmo tempo, a mais estratégica, porque cada cadeira vazia numa turma que já vai acontecer é margem quase pura sendo desperdiçada.
Capacidade Ociosa =
[Capacidade da Turma] - [Matrículas Ativas]
Somada por curso ou por campus, a capacidade ociosa vira a base do plano comercial. Se há centenas de cadeiras vazias distribuídas em turmas que já vão rodar com o professor contratado, o custo marginal de preencher cada uma é baixíssimo, e é para essas turmas que a captação e o financeiro devem direcionar bolsas, descontos e transferências internas. O dashboard não decide isso sozinho, mas transforma uma intuição vaga em uma lista priorizada de onde agir.
Vale um cuidado de leitura: ociosidade alta em turma abaixo do ponto de equilíbrio é problema urgente, enquanto ociosidade em turma saudável é oportunidade tranquila. Por isso o painel mostra as duas medidas lado a lado, nunca isoladas.
A camada de plataforma decide se o painel escala ou trava
Modelar bem e escrever DAX correto resolve o painel de uma escola. Redes com muitos campi e milhões de linhas de matrícula histórica pedem uma conversa sobre plataforma. Aqui entram decisões que vão além do relatório e tocam a arquitetura de dados da instituição.
Em Power BI puro, você licencia por usuário: Power BI Pro para quem publica e consome em capacidade compartilhada, e Power BI Premium por Usuário, o PPU, para quem precisa de recursos avançados sem uma capacidade dedicada. Quando o volume cresce, entra o Microsoft Fabric, anunciado pela Microsoft em 2023, que mede consumo em Capacity Units e é vendido em SKUs que vão de F2 a F2048. No Fabric, o modo Direct Lake lê os dados direto do OneLake, sem importar para o modelo nem consultar a fonte em tempo real, o que combina bem com bases acadêmicas grandes e atualizações diárias. Se você está avaliando essa migração, o guia sobre Microsoft Fabric ajuda a entender quando o salto compensa.
Independente da plataforma, dois pontos não podem ser negligenciados. O primeiro é a engenharia de dados que alimenta o modelo: extrair matrícula, alocação e financeiro do ERP acadêmico de forma confiável é metade do projeto, e é onde a engenharia de dados faz a diferença entre um painel que a diretoria confia e mais uma planilha bonita. O segundo é a governança. Dados de alunos são dados pessoais, e a LGPD, a Lei nº 13.709/2018, impõe controle de acesso e finalidade. Um dashboard de ocupação não precisa expor nome e CPF de aluno para funcionar: ele trabalha com contagens e capacidades, e essa é uma boa prática que reduz risco sem perder informação.
Perguntas frequentes
Qual a diferença entre taxa de ocupação e capacidade ociosa? São dois lados da mesma moeda. A taxa de ocupação é a razão entre matrículas e capacidade, expressa em percentual, boa para comparar turmas de tamanhos diferentes. A capacidade ociosa é o número absoluto de cadeiras vazias, melhor para dimensionar quanto de receita está disponível. Use a taxa para ranquear e a ociosidade para calcular o potencial.
Por que usar DIVIDE em vez do operador de divisão comum?
Porque turmas novas, canceladas ou sem capacidade cadastrada geram divisão por zero, e o operador comum devolve erro ou infinito, o que quebra visuais e cartões. A função DIVIDE trata o denominador zero devolvendo em branco ou um valor alternativo que você define, mantendo o painel apresentável mesmo com dados incompletos.
Preciso de duas tabelas fato mesmo, ou posso juntar tudo? Precisa, se você quer cruzar ocupação pedagógica com uso de sala sem ambiguidade. Matrícula tem grão de aluno por turma, enquanto alocação de sala tem grão de turma por horário. São grãos diferentes, e forçá-los na mesma tabela cria linhas duplicadas que inflam a contagem de alunos. Mantenha os fatos separados compartilhando a dimensão de turma.
Como o ponto de equilíbrio da turma é calculado no painel? É o custo fixo da turma dividido pela margem de contribuição por aluno, que é a mensalidade líquida menos o custo variável de cada matrícula. Você guarda custo fixo na dimensão de turma e os valores unitários como medidas ou parâmetros, e a divisão devolve o número mínimo de alunos que faz a turma parar de dar prejuízo.
Dá para fazer esse dashboard só com Power BI Pro, sem Fabric? Dá, e para a maioria das escolas isoladas é o suficiente. Power BI Pro cobre publicação e consumo em capacidade compartilhada. O Fabric, com suas SKUs de F2 a F2048 e o Direct Lake lendo do OneLake, faz sentido quando você tem muitos campi, histórico grande e precisa de performance sobre volume. Comece simples e escale quando o volume exigir.
Como esse painel respeita a LGPD dos dados de alunos? Trabalhando com agregados. Um dashboard de ocupação vive de contagens e capacidades, não de nome e CPF de aluno individual. Ao manter o grão do relatório em turma e sala, você entrega toda a decisão de gestão sem expor dado pessoal identificável, o que já reduz muito a superfície de risco frente à Lei nº 13.709/2018 e facilita o controle de acesso.
O painel só vale pela decisão que ele destrava
Um dashboard de ocupação de turmas e salas bem construído não é sobre gráficos. É sobre parar de descobrir no fim do semestre que uma turma rodou no prejuízo e um bloco inteiro ficou vazio de manhã. A modelagem dimensional correta e um punhado de medidas DAX honestas colocam essa informação na frente de quem decide, enquanto ainda dá tempo de agir. Se a sua instituição quer sair da planilha e montar esse painel sobre o Power BI com base sólida, fale com a gente e a Fynx ajuda a estruturar do modelo à publicação.
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