Agora que estamos na época, diga-me: como você escolhe seu candidato às eleições?
Essa é uma escolha pessoal (mas de arrependimento coletivo :-) ) e não tem uma fórmula. Cada um vota de acordo com sua consciência e opinião.
Não deixa de ser curioso, portanto, os argumentos que cada político apõe à sua campanha. Um dos candidatos a vereador em São Paulo, por exemplo, promete acompanhar de perto os gastos públicos. Para dar um exemplo do que está falando, ele soltou uma lista das emendas aprovados na câmara dos vereadores, que geraram despesas.
Hmmm… Dados tabulados… Planilha…
É claro que eu não pude resistir e, morando em São Paulo, eu tinha que fazer um exame mais visual desses dados.
Assim Não Vai Rolar…
Eu poderia usar o Calc (=Excel do LibreOffice) ou qualquer outra ferramenta. Optei pelo [BA Server 5.4][ba54] que me permite importar um arquivo CSV e montar um cubo. Assim eu poderia examinar os dados e montar um post para o blog. Eu estava farejando um caso neste assunto.
Eu me propus a uma tarefa muito simples:
Examinar os gastos das emendas de vereadores, no período 2013-2015, contra as principais dimensões: Vereador, Destino da Verba e Tempo.
Não queria achar nenhum padrão oculto nem nada, apenas exercitar um pouco de ETL/OLAP com o Pentaho e aproveitar para ver como o dinheiro está sendo gasto.
Expertei a planilha para CSV e importei no BA Server usando o wizard de nova fonte de dados. Isso me deixou com um cubo OLAP, “pronto” para explorar.
Primeira Visão: Por Vereador
Coloquei entre aspas porque estava pronto coisíssima nenhuma. Vejam:
O nome do verador pode aparecer de mais de uma forma, resultando em linhas que não são agregadas. Assim parece que temos dois vereadores “tipo Netinho”, cada qual com um total de gastos, quando na verdade é um só político:
Vereador | Gasto |
---|---|
Netinho de Paula | 180.000,00 |
Netinho De Paula | 660.000,00 |
Netinho de Paula”_” | 560.000,00 |
O “_” é para indicar que o nome possui um espaço extra ao final, dando três “nomes” diferentes para a mesma pessoa.
E apesar de o objetivo ser examinar os valores por vereador, se eu quisesse ver por partido, quantidade de votos etc. não daria, pois essa informação não consta na planilha.
Segunda Visão: Por Objeto
Vamos lá:
Nossa, pior ainda! Até há um padrão de nomes, mas não é consistente (nomes duplicados de formas diferentes, como no caso dos vereadores) nem prático (não dá para analisar um gráfico com um item “Reforma do CDC Moinho Velho, no bairro do Ipiranga, incluindo troca do piso do salão de festas, do salão sede, do vestiário e sanitários, troca do telhado, instalação de forro de gesso no salão de festas, reforma da parte elétrica/luminárias, além de pintura geral – Rua Elba 980 – Ipiranga”!!)
E também não dá para separar por categorias, como Saúde, Esporte, Reforma, Compra etc. Até temos que orgão recebeu o dinheiro, mas não vai além disso. Não dá para, por exemplo, comparar os gastos de subprefeituras com secretarias municipais.
Terceira Visão: Por Ano
Até temos um padrão melhor, graças ao fato de termos uma coluna só para ano:
… mas não dá para quebrar por mês, por exemplo, ou para saber qual dia da semana tem mais aprovações.
Também não dá para quebrar por região da cidade ou qualquer outro parâmetro, como quantidade de eleitores, por exemplo. Imagine saber quais são os projetos que atendem mais pessoas? Será que tem algum padrão bairrista, onde somas vultosas são gastas com projetos populistas, mas de baixa serventia pública? Isto é, que é bonito pra chuchu, mas atende pouca gente?
Data Quality To The Rescue!
Eu sempre quis fazer um post com exemplos de Data Quality, e estava apostando que esta planilha seria um bom caso.
Há uma renca infinita de operações e técnicas de limpeza de dados, mas na maior parte dos projetos sempre usamos as mesmas técnicas. Duas destas técnicas mais frequentes são muito úteis, e se aplicam diretamente ao ETL: normatização e classificação dos dados.
Por exemplo, o “multi-vereador” que vimos acima passaria a ter um único nome, e as agregações passariam a funcionar. Isso é normatização: damos uma norma aos membros de um conjunto, que obtemos montando – manual ou automaticamente – um dicionário para traduzir todas as formas de cada elemento em uma forma só.
Já a classificação é uma técnica que automatica extrai atributos de um certo elemento. Por exemplo, podemos usar a data, que existe na planilha, para conseguir as informações de mês e dia da aprovação do gasto.
Em outro exemplo, podemos fazer buscas por textos específicos em cada linha tratada, e assim gerar uma classificação automática para os dados. Vou usar essa técnica para tratar os objetos de cada emenda, e descobrir se pertencem à área da Saúde, Esporte ou Cultura, se são Melhorias ou Compras e assim por diante.
Vamos lá.
Normatização com Dicionários
Com relação ao nome dos vereadores, precisamos montar um dicionário que “traduz” cada variação de nome para um padrão. E já que estamos nesta, podemos fazer um pouco mais: podemos enriquecer essa planilha com outros dados do vereador, como partido, quantidade de votos conquistados etc.
Na verdade podemos fazer a mesma coisa com tudo nesta planilha:
- Orgão: tipo (Secretaria, Subprefeitura, Autarquia etc.);
- Região da cidade atendida: Centro, Sul, Leste, Oeste, Norte;
- Objeto: usufrutuário, prazos etc.
Imagino que a Câmara dos Vereadores registre esses e muitos outros atributos em seus sistemas, mas o que temos é só essa planilha e por isso não dá para extrapolar demais.
O nome do vereador na planilha original vem com maiúsculas e minúsculas. A primeira coisa mais fácil a fazer é mudar todos para caixa baixa ou alta – prefiro alta.
Daí podemos pegar o partido, votação etc. do vereador em algum site. Eu achei uma página do UOL sobre as eleições de 2012 que trazia tudo: nome do vereador, partido e quantidade de votos. Com isso tudo em mãos eu construí uma planilha Excel com o seguinte layout:
Coluna | Função |
---|---|
VEREADOR_ORIGINAL | Nome do vereador na planilha original |
VEREADOR_CORRIGIDO | Nome corrigido |
PARTIDO | Partido pelo qual ganhou a eleição |
VOTOS | Quantidade de votos recebidos pelo vereador |
VOTOS PARTIDO | Quantidade de votos recebidos pela legenda |
A tabela abaixo mostra como essa tabela foi preenchida:
VEREADOR_ORIGINAL | VEREADOR_CORRIGIDO | PARTIDO | VOTOS |
---|---|---|---|
Abou Anni | ABOU ANNI | PV | – |
Adilson Amadeu | ADILSON AMADEU | PTB | 40100 |
Adolfo Quintas | ADOLFO QUINTAS | PSDB | – |
Alessandro Guedes | ALESSANDRO GUEDES | PT | – |
Alfredinho | Alfredo Alves Cavalcante (ALFREDINHO) | PT | 36634 |
Andrea Matarazzo | ANDREA MATARAZZO | PSDB | 117617 |
Porque há casos de nenhum voto? Não sei. Provavelmente é um vereador suplente, que não constava na lista que eu usei. Dá para corrigir, mas o propósito deste post é exemplificar algumas técnicas de Data Quality e por isso não me preocupa se sobrar algumas lacunas.
Depois eu fiz mais duas colunas: faixa_votos_1
e faixa_votos_2
. A primeira qualifica o vereador em faixas de 10.000 em 10.000 votos. A segunda faz uma divisão em três categorias: menos de 50.000 votos, entre 50.000 e 100.000 votos, e uma última de mais de 100.000 votos.
Depois eu apliquei a mesma idéia para o orgão e criei este dicionário:
Coluna | Função |
---|---|
| ORGAO_EXECUTOR_ORIGINAL | Orgão na planilha original |
| ORGAO_EXECUTOR_CORRIGIDO | Nome do orgão corrigido |
| TIPO_ORGAO | Tipo: secretaria, autarquia etc. |
| REGIAO_CIDADE | Região que atende, ou Geral quando não tem |
Que, preenchido à mão, ficou assim:
ORGAO_EXECUTOR_ORIGINAL | ORGAO_EXECUTOR_CORRIGIDO | TIPO_ORGAO | REGIAO_CIDADE |
---|---|---|---|
Autarquia Hospitalar Municipal | AUTARQUIA HOSPITALAR MUNICIPAL | AUTARQUIA | GERAL |
Fundo de Preservação do Patrimônio Histórico e Cultural | FUNDO DE PRESERVAÇÃO DO PATRIMÔNIO HISTÓRICO E CULTURAL | FUNDO | GERAL |
Fundo Municipal de Assistência Social | FUNDO MUNICIPAL DE ASSISTÊNCIA SOCIAL | FUNDO | GERAL |
Secretaria Municipal de Coordenação das Subprefeituras | SECRETARIA MUNICIPAL DE COORDENAÇÃO DAS SUBPREFEITURAS | SECRETARIA MUNICIPAL | GERAL |
Secretaria Municipal do Verde e do Meio Ambiente | SECRETARIA MUNICIPAL DO VERDE E DO MEIO AMBIENTE | SECRETARIA MUNICIPAL | GERAL |
Serviço Funerário do Município de São Paulo | SERVIÇO FUNERÁRIO DO MUNICÍPIO DE SÃO PAULO | AUTARQUIA | GERAL |
Subprefeitura Pinheiros | SUBPREFEITURA PINHEIROS | SUBPREFEITURA | OESTE |
Subprefeitura Sé | SUBPREFEITURA SÉ | SUBPREFEITURA | CENTRO |
Subprefeitura Vila Mariana | SUBPREFEITURA VILA MARIANA | SUBPREFEITURA | SUL |
Subprefeitura Vila Maria/Vila Guilherme | SUBPREFEITURA VILA MARIA/VILA GUILHERME | SUBPREFEITURA | NORTE |
Subprefeitura Vila Prudente/Sapopemba | SUBPREFEITURA VILA PRUDENTE | SUBPREFEITURA | LESTE |
Classificação Automática
Resolvidas essas dimensões, restou apenas o objeto de cada emenda. O que contém a lista de objetos de emendas? Coisas assim:
- Contenção Margem com Gabiões – Rua Magdeburgo – Processo nº 2013-0.102.577-8;
- Readequação área de lazer Rua Constantino Cavafi – Processo nº 2013-0.102.541-7;
- 26º Campeonato de Moto Aquática – Jet Ski – Associação Brasileira de Jet Ski Profissional e Não Profissional;
- E172 – Realização de Duas Etapas da Copa São Paulo de Jet Ski na Represa do Guarapiranga;
- Execução de Obras de microdrenagem nas Ruas Rodrigues dos Santos, joão Teodoro e Ruas limitrofes no Bairro do Brás;
- Associação Beneficente Nossa Senhora do Pari – Melhorias e Ampliação de Atendimento para adequação, ampliação e reforma do mobiliário e equipamentos hospitalares referente ao setor de Nutrição e Dietética;
E assim por diante. A única forma de fazer uma classificação precisa, bem-feita, é manualmente. São quase 1.800 projetos aprovados. Se eu levar um minuto para qualificar cada um, são 1.800 minutos ou 30 horas trabalhando sem parar.
No $%#%!@% way.
Logo, ou achamos o sistema de origem e vemos o que mais dá para puxar, ou montamos uma aproximação. Por exemplo, podemos montar uma tabela com uma coluna para cada atributo, como “É uma compra de material/produto?”, “É um pagamento de serviço?”, “É um gasto com saúde?” e por aí vamos. Daí, para cada objeto que entrar nesta tabela na primeira coluna, respondemos as perguntas em outras colunas. No final teríamos algo assim:
Objeto | Compra? | Cultura? | Saúde? | Esportes? |
---|---|---|---|---|
E2538 – Fundação Antonio Prudente(…) | Não | Não | Sim | Não |
Implantação de equipamento de Ginástica (…) | Sim | Não | Não | Sim |
Realização de obras e pavimentação de vias, visando a melhoria (…) | Não | Não | Não | Não |
Incentivo à pratica de esportes | Não | Não | Não | Sim |
Isso permitiria uma classificação rudimentar, inicial, que desse ao menos uma visão geral. Com ela podemos responder perguntas como “quanto do gasto é compra de material novo, e quanto é manutenção?” Ou “quanto estamos alocando de dinheiro para Saúde, Educação e Lazer?”
Uma forma de se fazer seria colocar essas linhas em uma planilha Calc e uma coluna para cada pergunta. Daí, usando fórmulas como IF() e FIND(), buscamos as ocorrências de termos-chaves. Sempre que encontrarmos um, marcamos com “SIM”. Se não encontramos nada, com “NÃO”.
E, de fato, foi a primeira coisa que eu fiz:
Era uma solução muito tosca, mas me ajudou a entender a mecânica da coisa. Com isso eu pude subir para o nível seguinte: usar RegEx, isto é, Expressões Regulares para fazer essa detecção. Usando expressões regulares eu poderia montar um processo de detecção automático e mais robusto que uma planilha Excel.
Assim, aproveitei o que eu aprendi com o livro RegEx Com Python e, com o auxílio do passo Regex Evaluation consegui extrair essa informações do nome do objeto de cada emenda parlamentar.
Eu parei de criar atributos e de refinar minhas RegExes quando comecei a ter um resultado aproveitável, mas poderia ter ido mais longe e conseguido bem mais coisa – até mesmo reconstruir a descrição da emenda aprovada. Mas, de novo, não era essa a meta e por isso não avancei.
Transformação Eleições 2016
A figura abaixo dá a visão geral da transformação que lê a planilha e gera um CSV pronto para importação no BA Server:
Essa transformação, e todos os dicionários, resultados e um pouco mais, estão disponíveis para download aqui, como um zip. Descompacte em um diretório qualquer e abra os arquivos .KTR
com o Spoon do PDI 5.4. Falarei mais sobre a outra transformação na Conclusão.
Agora Sim!
Muito bem, com um novo e melhorado conjunto de dados, recarreguei o CSV no BA Server e gastei um tempinho refinando o mapeamento. Vejamos o que podemos fazer agora.
Por Vereador: bem melhor! Agora dá para ver todo mundo, numa só posição.
Veja que existe apenas um vereador que aprovou menos de um milhão de Reais em emendas. Até dá para dizer que existe duas faixas:
- Uma turma que libera muito, com totais sempre maiores que R$ 5.000.000,00;
- E outra que é mais modesta, que fica entre os R$2M e R$4M.
Mesmo assim não temos nenhum “calombo”, que seriam vereadores que liberam (ui!) muito mais que a média (ai!). Eu diri até que eles se espalham em uma graduação mais ou menos suave.
Por Objeto: Agora sim! Mesmo sendo uma classificação incipiente, consegui ver que os dez maiores valores em gastos concentram-se em coisas que não é nem para Saúde, nem para Esportes ou para Cultura.
Os dois picos são muito curiosos… Daí eu fui olhar por orgão:
Uia. Quem mais recebe dinheiro de emenda parlamentar… é a Secretaria de Esportes e Lazer, mas os picos do gráfico anterior mostram que o grosso do dinheiro não vai para isso… Confuso! Com certeza culpa da classificação porca e apressada que minhas expressões regulares toscas.
Eu explorei essas visões um pouco mais do que eu vou mostrar aqui. A menos que eu tenha cometido um erro grosseiro, parece que há mesmo uma concentração de emendas para Secretaria de Esportes. Eu fiquei pensando sobre o quê explicaria isso, e bolei uma hipótese: eventos e ações voltadas para Esportes causam um impacto mais marcante, e não constumam ser caras. Assim, se um político precisa prometer algo que tenha condições de cumprir, prometer fazer um evento esportivo parece uma opção de boa relação custo-benefício.
Mas é só uma hipótese, sem nenhum embasamento sério nos fatos. Tipo assim, um chutão. ;-)
E eu continuei a cutucar os dados, até que me deparei com uma visão interessante:
Lemos esse gráfico assim: “O maior valor foi liberado para emendas criadas por parlamentares com representação menor que 50.000 votos”. Legal, não é? Como a maior quantidade de vereadores tem menos que 50.000 votos, ter a grana concentrada nessa parcela de políticos significa que o dinheiro está sendo empregado em projetos da maioria dos vereadores, e que são projetos de baixa representatividade, ou seja, tocados por políticos que representam poucos eleitores.
Eu sou partidário do voto distrital, e não da forma atual. Esse gráfico reforça meu viés pelo voto distrital, mas evitaria tomá-lo como uma prova inconteste da vantagem dessa opção.
Essa é uma visão difícil de ler, mas é bem curiosa:
Imagino que era para ser um gráfico de árvore, mas ficou meio estranho…
Ele representa o valor gasto por orgão, dentro de cada tipo (Fundo, Subprefeitura etc.) De novo, observe como parece haver alguma desproporção entre os valores alocados à Secretaria Municipal de Esporte e Lazer e, por exemplo, a de Saúde. Até a de Cultura é maior que a de saúde!
E o gasto ao longo do tempo? Não parece nada de mais, um comportamento quase aleatório:
Eu poderia prosseguir aqui até a próxima eleição… de 2018. Mas não é preciso tanto. ;-)
Conclusão
Diz o ditado: Lixo Entra, Lixo Sai. Análises de dados dependem de dados Limpos, bem tratados etc. Existem muitas formas de se cuidar dos dados para que eles possam nos contar a verdade por trás de si. O ramo que responde por essas técnicas chama-se Data Quality e costuma ser uma disciplina complexa.
Vimos que, mesmo sendo trabalhoso, qualquer melhoria pode render ganhos significativos. Por isso considere sempre fazer ao menos uma avaliação da qualidade dos seus dados que o cliente vai examinar.
Coceira…
Com os dados ali, prontinhos, e os assuntos separados em tópicos, eu fiquei com a mão coçando para andar mais um pouco e transformar aquilo em uma estrela dimensional. Como a melhor maneira de se livrar da tentação é ceder, eu cedi.
Peguei a transformação anterior e coloquei alguns passos que alimentam junk dimensions. Isso deu origem a dimensões instantâneas de Vereador e Orgão.
Depois eu juntei todos os atributos em uma dimensão junk de verdade, e mais adiante adicionei outra para os objetos das emendas. Eu poderia degenerá-lo mas, francamente, a idéia daquele texto todo na fato, uuhhh calafrios, não me agradou.
Por fim criei uma dimensão data completa, usando um passo Database Lookup. Pronto! Um Table Output no final, sair clicando em todos os botões SQL para criar tabelas, rodar e…. PIMBA! Tudo no ar!
Eu peguei o Power*Architect e fiz uma engenharia reversa no banco. Ajustei alguns detalhes (como os relacionamentos) e voilà! Modelo dimensional de valores de ementas!
Esse diagrama e a transformação que o alimenta estão no mesmo pacote deste post. Fique à vontade para brincar, explorar e descobrir. Apenas mantenha em mente o seguinte:
Eu, Fábio, não sou responsável pelo conteúdo de dados deste pacote, nem por qualquer interpretação que alguém tirar dele.
Me incluam fora dessa! ;-)
Até a próxima!