analise-identificao-urnas-eletronicas

Stars
19
Committers
1

Sumrio

Introduo

A partir das constantes aes do Partido Liberal (PL), liderado atualmente por Valdemar da Costa Neto, para desqualificar o processo eleitoral e descredibilizar as instituies, afim de garantir mais um mandato para seu candidato Jair Messias Bolsonaro por meios no democrticos, foram apresentados uma srie de relatrios e discursos, afim de alegar a total impossibilidade de auditoria das urnas cujos modelos so anteriores a 2020.

Ser apresentado uma prova de conceito afim de criar um hash nico de trabalho das urnas para identific-las e diferenci-las nas anlises de logs para auditoria unitria ou em massa, e tambm correlacionar as mesmas em outros datasets e boletins pblicos.


IMPORTANTE

Essa anlise, proposta de auditoria e identificao de urnas, feita inicialmente por um civil, por vontade prpria, livre que qualquer financiamento de qualquer grupo ou partido poltico. Afim de estabelecer modelos tcnicos para auditoria de dados e resultados eleitorais de forma otimizada e segura.


Objetivo

O Objetivo desta anlise exemplificar que possvel, sim, auditar todos os modelos de urnas eletrnicas sem a necessidade da identificao da mesma via log.

Sero apresentadas tcnicas e ferramentas de mercado, ferramentas de anlise estatstica e cincia de dados com exemplos prticos e com todos os scripts de anlise e datasets pblicos e abertos.

Tanto quanto os dados, todas as ferramentas utilizadas so Open Source e esto disponveis para todos acessarem e utilizarem de forma livre.


Problema apresentado no relatrio

Esta prova de conceito foi construda com base no relatrio preliminar emitido pelo PL no dia 15/11/2022 e no relatrio consolidado emitido dia 22/11/2022.

Ambos o relatrios apresentam pontos de auditoria referentes aos modelos anteriores ao UE2022, contestando a falta de possibilidade de auditar e correlacionar dados.

"Arquivo digital Log de Urna: um pronturio digital que requer a autenticao em cada linha de registro de atividade"

"Cada urna eletrnica gera o seu respectivo arquivo digital LOG cuja razo fundamental de existir registrar, como num pronturio mdico, em cada linha do arquivo, uma atividade realizada pela urna, naquele dado instante. Cada linha do LOG inclui duas informaes essenciais e necessrias, para validao do registro, lidas diretamente do hardware:

  • carimbo de tempo, composto por data e hora:minuto:segundo, lidos do relgio do
    equipamento
  • cdigo de identificao da urna eletrnica, lido da memria permanente e indelvel (ROM)
    do equipamento"

O objetivo do relatrio claramente no gerar uma investigao para que o Tribunal Superior Eleitoral (TSE) possa responder tecnicamente, e apresentar alternativas para a possibilidade de auditoria e correlao atravs de fallbacks sistmicos. Pois, no prprio documento preliminar, clara a inteno do Partido Liberal (PL) de invalidar os votos dos cidados que exerceram seu papel democrtico de escolha de representantes pblicos, afim de eleger o eventual candidato de seu partido, Jair Messias Bolsonaro.

"A partir disso, conclui que "os votos vlidos e auditveis do segundo turno" atestariam resultado diferente e dariam 51,05% dos votos a Bolsonaro. O documento indica que as urnas 2020 seriam as nicas que teriam "elementos de auditoria vlida e que atestam a autenticidade do resultado eleitoral com a certeza necessria na concepo do prprio Tribunal Superior Eleitoral"

"Nesta perspectiva tcnica, no possvel validar os resultados gerados em todas as urnas eletrnicas de modelos 2009, 2010, 2011, 2013 e 2015, resultados estes que deveriam ser desconsiderados na totalizao das eleies no segundo turno, em funo do mau funcionamento destas urnas.

Nada mais havendo a considerar damos por encerrado este relatrio"

Referncias

Relatrio Tcnico Preliminar - Logs Invlidos das Urnas Eletrnicas - Fiscalizao das Eleies de 2022 no TSE - por Partido Liberal (PL) - 15/11/2022

Adendo ao Relatrio Tcnico Mau Funcionamento das Urnas Eletrnicas - Fiscalizao das Eleies de 2022 no TSE - por Partido Liberal (PL) - 23/11/2022


Dados Utilizados

Para a realizao das anlises vamos utilizar as mesmas fontes de dados utilizadas no relatrio do PL. Embora numa condio menor em termos de amostras por conta de limitaes de hardware.

Sero analisadas 20 Urnas eletrnicas da cidade de Salto - So Paulo, sendo 16 delas anteriores ao modelo EU2022

Referncias dos Dados

Resultados das Urnas - Resultados TSE

Boletim das Urnas - Dados Abertos


Encontrando o problema apresentado nas fontes de dados

Para iniciarmos a anlise vamos tentar chegar na mesma concluso que os analistas contratados pelo PL chegaram no relatrio preliminar. Encontrar o campo que foi apontado como problemtico.

Realizei o Download de logs de 20 urnas usadas em 20 sees eleitorais da cidade de Salto, So Paulo. Cidade na qual resido. Cdigo Municpio 70050.

Os arquivos esto na extenso .dat. Arquivos em texto simples que estavam separando as variveis das observaes a partir da tabs.

Feita a primeira anlise a olho nu, precisei identificar o chartset para fazer a futura anlise com a devida qualidade. O mesmo se encontrava em charset iso-8859-1.

Importando os Dados

Para executar a anlise vou estar utilizando o ferramental da linguagem R, linguagem normalmente utilizada para realizar tarefas de Estatstica, Machine Learning, e Data Science.

O primeiro passo foi juntar todos os datasets reunidos das urnas em um nico dataframe para ajudar na manipulao e anlise.

datasets_logs <- c(
  "logd-00407-0001.dat",
  "logd-00407-0002.dat",
  "logd-00407-0003.dat",
  "logd-00407-0004.dat", 
  "logd-00407-0005.dat",
  "logd-00407-0006.dat",
  "logd-00407-0007.dat",
  "logd-00407-0008.dat",
  "logd-00407-0009.dat",
  "logd-00407-0010.dat",
  "logd-00407-0011.dat",
  "logd-00407-0012.dat",
  "logd-00407-0013.dat",
  "logd-00407-0014.dat",
  "logd-00407-0015.dat",
  "logd-00407-0028.dat",
  "logd-00407-0075.dat",
  "logd-00407-0122.dat",
  "logd-00407-0147.dat",
  "logd-00407-0253.dat"
)

## Criando um Dummy Dataset vazio
logs <- read.table(datasets_logs[1], 
                  header=FALSE, 
                  skip=0, 
                  sep="\t", 
                  nrows = 1,
                  fileEncoding="iso-8859-1"
)

## ...

for (d in datasets_logs) {
  tmp <- read.table(d, 
          header=FALSE, 
          skip=0, 
          sep="\t", 
          fileEncoding="iso-8859-1"
  )
  logs <- rbind(logs, tmp)
}

Os arquivos possuem 6 colunas. Contendo principalmente o datetime do log, o log level algo que a priori parece ser o identificador nico da urna, apontado como fator impossibilitador de auditorias pelo relatrio, a linha de log propriamente dita e um identificador nico que parece ser o log.

Gerando uma tabela de frequncias dos Identificadores Iniciais

Vamos gerar uma tabela de frequncias, para contar a ocorrncia de cada linha de log separando pelos id's de urna encontrados no campo V3.

initial_table <- table(logs$vV)
initial_table

Como foram importados dados de 20 urnas distintas, eram esperados logs agrupados de 20 identificadores, porm temos uma quantidade muito discrepante de logs a partir do Identificador 67305985. Mesmo ID apontado no relatrio. Por fim chegamos na linha de raciocnio do relatrio. De 20 observaes, 16 esto apresentando logs com o mesmo identificador. Dado esse ponto, dito pela consultoria, em nome do Partido Liberal, que seria terminantemente impossvel utilizar os logs para auditar as urnas e conferir informaes.

O objetivo dessa anlise aplicar tcnicas de mercado exploratrias para no s conseguir auditar e checar votos, como tambm enriquecer os dados alm da informao bruta para anlises estatsticas, aplicar modelos de Machine Learning e enriquecer ainda mais os datasets pblicos e confiabilidade.

Veremos como nos passos a seguir.


Simulao de Auditoria de Dados

A partir deste ponto, vou guiar a anlise como se eu mesmo, assumindo um papel de auditor ou cientista de dados, precisasse estabelecer formas de gerar informao til com a massa de dados para anlises em escala.

Data Minning e Enriquecimento dos Dataframes

Como os arquivos de logs so verbosos, mas no possuem muitas observaes em na dimenso de variveis, a ideia inicial percorrer superficialmente os dados gerados nas linhas de logs para ver que tipo de informaes encontramos.

Usando um editor de texto, abrimos um dos arquivos da amostra, encontramos informaes interessantes como Modelo de Urna, Municpio, Zona Eleitoral, Seo Eleitoral, Local de Votao

Para um check-up mais leigo, esses dados j serviriam. Pois, o prprio Tribunal Supremo Eleitoral utiliza a sequncia de Municpio/Zona/Seo para se organizar e disponibilizar os dados no portal.

Vamos normalizar e enriquecer as linhas de log do Dataframe.

Para realizar essa ao, vamos utilizar o ferramental para aplicar Regex nas linhas de logs procurando por determinadas ocorrncias de padro de texto, e recuperando os valores.

Antes disso, vamos criar e renomear as variveis do dataframe para uma melhor identificao visual e facilitar a manipulao dos dados.

# ...
names(logs) <- c("datetime", "log_level", "id_urna", "cod", "log", "log_id", "modelo_urna", "municipio", "zona_eleitoral", "local_votacao", "secao_eleitoral")
# ...

Em seguida vamos reimportar todos os datasets, j percorrendo cada um deles e aplicando as regras de regex, normalizao para as novas variveis a partir dos valores recuperados.

## Fazendo o merge de todos os datasets
for (d in datasets_logs) {
  tmp <- read.table(d, 
          header=FALSE, 
          skip=0, 
          sep="\t", 
          fileEncoding="iso-8859-1"
  )
  names(tmp) <- c("datetime", "log_level", "id_urna", "cod", "log", "log_id")
  
  ## Enriquecimento inicial - Numero do modelo da urna
  str_find_pattern <- "Identificao do Modelo de Urna: "
  tmp$modelo_urna <- str_remove(grep(str_find_pattern, tmp$log,  value = TRUE)[1],str_find_pattern)
  
  ## Enriquecimento inicial - Municipio
  str_find_pattern <- "Municpio: "
  tmp$municipio <- str_remove(grep(str_find_pattern, tmp$log,  value = TRUE)[1],str_find_pattern)
  
  ## Enriquecimento inicial - Zona Eleitoral
  str_find_pattern <- "Zona Eleitoral: "
  tmp$zona_eleitoral <- str_remove(grep(str_find_pattern, tmp$log,  value = TRUE)[1],str_find_pattern)
  
  ## Enriquecimento inicial - Local de Votao
  str_find_pattern <- "Local de Votao: "
  tmp$local_votacao <- str_remove(grep(str_find_pattern, tmp$log,  value = TRUE)[1],str_find_pattern)
  
  ## Enriquecimento inicial - Sesso Eleitoral
  str_find_pattern <- "Seo Eleitoral:"
  tmp$secao_eleitoral <- str_trim(
    str_remove(grep(str_find_pattern, tmp$log,  value = TRUE)[1],str_find_pattern), 
    side = c("both", "left", "right")
  )
  
  logs <- rbind(logs, tmp)
}

A partir desse ponto, j evolumos nosso dataframe

A partir desse ponto, evolumos o dataframe disso:

Para isso, um dataframe mais rico e amigvel:

Portanto, vamos explorar estatisticamente essa transformao para validarmos se est cobrindo o total de 20 observaes de urnas.

Primeiramente vamos avaliar a quantidade de sees eleitorais.

Quantidade de Modelos

Inicialmente conseguimos identificar a quantidade de modelos de urnas utilizados na amostra, totalizando

Modelos Quantidade %
UE2009 8 40%
UE2010 6 30%
UE2015 2 10%
UE2020 4 20%

Logs por Modelo de Urna

Uma observao ainda crua, mas que j pode ser extrada a quantidade de logs por cada modelo de urna observado

Logs por Seo Eleitoral

Por fim conseguimos pela primeira vez identificar 20 observaes de 20 urnas a partir do enriquecimento dos dados que mineramos dos logs


Hashing de Identificao de Urnas atravs da metadados categricos

A partir do momento que coletamos dados minerados, podemos comear a pensar numa forma de gerar um identificador nico para cada modelo de urna atravs de uma tcnica de Hashing de metadados.

Uma funo hash um algoritmo que mapeia dados de comprimento varivel para dados de comprimento fixo. Os valores retornados por uma funo hash so chamados valores hash, cdigos hash, somas hash, checksums ou simplesmente hashes

As tcnicas de Hashing amplamente conhecida em diversas reas e tem muitos usos no universo de tecnologia e engenharia de software. Mas principalmente para garantir integridade de algum dado. O conceito de Hash para olhos mais leigos : transformar uma abundante quantidade de dados, em uma pequena quantidade de informaes.

Basicamente trocar um nmero grande de caracteres, palavras, nmeros por um hash correspondente aqueles dados sem volta. Apenas sendo possvel chegar ao resultado inicial atravs de coliso.

Um exemplo prtico, sem relao com a anlise:


 echo "AAAAAAAAAAAAAAAAAAAA" | md5
0a1f01f5d83b5dc40dec529fffdb3e6d


 echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque sit amet lorem nec tortor venenatis vulputate. Donec eu pretium leo. Cras auctor tristique mi ut pharetra. Proin eget nulla id risus vestibulum dictum porttitor vel mauris." | md5
145ff0b0832aaf363cb04eb80cd6ac82

Dessa forma conseguimos fornecemos uma string pequena, ou gigante, como argumento para uma funo hash, neste caso, MD5, e ela nos retorna o conjunto de caracteres correspondentes em formato de hash.

Esta tcnica utilizada para checar integridade, pois se 1 byte for alterado, o resultado do hashing completamente diferente.

Exemplo:

 echo "AAAAAAAAAAAAAAAAAAAA" | md5
0a1f01f5d83b5dc40dec529fffdb3e6d

 echo "AAAAAAAAAAAAAAAAAAAa" | md5
7159e41ca576aef10be31376206dbd86

 echo "AAAAAAAAAAAAAAAAAAAB" | md5
b8a1a140172867f6d0d3a07fa7e7310c

O objetivo utilizar os metadados que no mudam, e no se repetem inicialmente em hashes e gerar um novo identificador nico para a urna de determinada seo eleitoral.

Qual o motivo de eu ter escolhido uma estratgia de Hashing??

Durante minha carreira eu j tive a oportunidade de auditar alguns sistemas grandes e distribudos de diversos segmentos de mercado.

Essa tcnica foi a primeira que me veio em mente, pois me lembrou de episdios onde haviam diversos logs distribudos e sem padro, de softwares como Snort, pFSense, Nginx, Apaches, Aplicaes e no existia algo parecido com um trace-id para fazer uma identificao de ponta a ponta para seguir algum vetor de ataque de segurana, ou problema funcional.

Dessa forma, a estratgia de hashing nos permite pegar dados que so comuns entre diversas fontes, e criar um trace-id para efetuarmos uma determinada anlise ou responder alguma pergunta especifica de observabilidade para um ambiente em determinada situao.

Softwares de APM, muito conhecidos de mercado utilizam estratgias parecidas para quando no conseguem enviar ou receber um id de identificao de origem entre sistemas que se comunicam.

Dessa forma, achei muito vivel utilizar a tcnica de hashing de metadados para criar correlaes entre urnas e documentos pblicos.

Criando um Hashing Identificador para a Urna / Seo

Vamos gerar uma seed de caracteres concatenando informaes como municipio, zona_eleitoral, local_votacao, secao_eleitoral, modelo_urna, id_urna.

dessa forma MUNICIPIO-ZONA-LOCAL-SECAO-MODELO-ID, tendo um resultado final parecido com 70050-0221-1015-0001-UE2020-2122186, e logo depois criar outro campo no nosso dataframe chamado hash_urna, onde vamos armazenar o nosso identificador nico. Dessa forma conseguindo ver de qual urna """hasheada""", veio determinado log. Para realizar isso vamos usar a biblioteca digest do R.

## Gerando uma seed para vincular a auditoria das urnas
logs$urna_seed <- paste(
  logs$municipio,
  logs$zona_eleitoral,
  logs$local_votacao,
  logs$secao_eleitoral,
  logs$modelo_urna,
  logs$id_urna, 
  sep = "-")

logs$hash_urna <- sapply(logs$urna_seed, digest, algo="md5")

Comparao da Auditoria via ID e Auditoria via Hashing de urnas

Primeiramente vamos gerar a comparao com base no erro apontado do PL de no identificao, se baseando no dado que chamamos de id_urna. Vamos gerar a tabela de frequncia dos logs baseados nesse valor

## Tabela de frequencias id_urna
freq_table_id <- sort(table(logs$id_urna))
freq_table_id <- as.data.frame(freq_table_id)
names(freq_table_id) <- c("id_urna", "frequencia")
freq_table_id

Agora vamos aplicar a mesma tecnica baseado no nosso campo identificador hash_urna.

## Tabela de frequencias - hash_urna
freq_table_hash <- sort(table(logs$hash_urna))
freq_table_hash <- as.data.frame(freq_table_hash)
names(freq_table_hash) <- c("identificado_urna", "frequencia")
freq_table_hash

Dessa forma conseguimos chegar num identificador da urna em seu horrio de atividade. Conseguimos identificar e trabalhar nos dados da mesma atravs do campo que substitumos com o hash_urna.


Comparao da Auditoria via ID e Auditoria via Hashing dos modelos apontados como problemticos

A ideia deste tpico realizar o mesmo teste de frequencia, mas tendo como amostra somente os modelos anteriores ao UE2022 cujo identificador foi dado como empecilho para validao dos dados.

Primeiro passo selecionar somente os modelos com o id_urna igual a 67305985.

### Codigo das urnas apontado como erro
codigo_urna_analise <- 67305985
urnas_analise <- subset(logs, id_urna == codigo_urna_analise)

Segundo passos repetir o teste da tabela de frequncia para pegar as urnas "no identificveis"

### Tabela de frequencia do id_urna dos modelos antigos
freq_table_urnas_analise <- table(urnas_analise$id_urna)
freq_table_urnas_analise <- as.data.frame(freq_table_urnas_analise)
names(freq_table_urnas_analise) <- c("id_urna", "frequencia")
freq_table_urnas_analise

Geramos o grfico de teste

Terceiro passo gerar a tabela de frequncia com as urnas agora, identificveis

### Tabela de frequencia do hash_urna dos modelos antigos
freq_table_urnas_analise <- table(urnas_analise$hash_urna)
freq_table_urnas_analise <- as.data.frame(freq_table_urnas_analise)
names(freq_table_urnas_analise) <- c("hash_urna", "frequencia")
freq_table_urnas_analise

GameDays de Auditoria - Sempre em Construo

Essa seo feita para validarmos o modelo de auditoria respondendo a perguntas que um auditor faria. A ideia no usar apenas a tcnica de hashing, mas tambm vrios modelos de Machine Learning para explorao dos dados.


Correlao entre Urna Identificada vs Boletim de Urna

Um teste interessante correlao entre o Boletim de Urna e a prpria Urna. O Boletim de Urna um dataset totalmente diferente dos logs, disponibilizado de outra fonte, ainda do TSE.

Os boletins so emitidos por estado. Sendo assim iremos realizar o teste com base no boletim do Segundo Turno de So Paulo.

[Boletim das Urnas - SP - Boletim de Urna - Segundo turno - 31.10.2022

](https://dadosabertos.tse.jus.br/dataset/resultados-2022-boletim-de-urna/resource/5729e0c0-c756-4ecf-8556-d98340135428)

Primeiro passo importar o boletim, que veio em formato CSV diferente dos logs que so distribudos em DAT.

boletim <- read.csv("bweb_2t_SP_311020221535/bweb_2t_SP_311020221535.csv", 
                    sep = ";", 
                    dec = ".", 
                    fileEncoding="iso-8859-1"
)

colnames(boletim)

Durante a primeira anlise podemos ver que o nmero de informaes em forma de variveis do boletim bem maior que o dos logs de forma crua. Porm, no temos informaes como codigo da urna, modelo da urna.

Mas temos informaes que podemos cruzar com o outro dataset dos logs, como CD_MUNICIPIO, NR_ZONA, NR_SECAO, NR_LOCAL_VOTACAO

Hashing do Boletim

Antes de aplicarmos a tcnica de hashing, vamos efetuar alguns procedimentos para facilitar o cruzamento dos dados. A primeira dessas coisas ser efetuar a normalizao de alguns campos para ficarem iguais aos que existem nos logs.

# Normalizando o NR_ZONA com padding de 4 zeros
boletim$NR_ZONA_NORM <- sprintf("%04d",boletim$NR_ZONA)

# Normalizando o NR_SECAO com padding de 4 zeros
boletim$NR_SECAO_NORM <- sprintf("%04d",boletim$NR_SECAO)

colnames(boletim)

Em seguida recuperamos somente os boletins do Municpio isolado da amostra, sendo ele 70050 da cidade de Salto, So Paulo.

boletim_salto_sp <- subset(boletim, CD_MUNICIPIO == 70050)
boletim_salto_sp

Vamos aplicar a tcnica de hashing inicialmente no primeiro dataframe dos logs. Inicialmente criando uma seed e posteriormente gerar um hash MD5 dela no campo hash_identificacao_boletim. Vamos utilizar somente as informaes que existem no boletim.

logs$boletim_seed <- paste(
  logs$municipio,
  logs$zona_eleitoral,
  logs$local_votacao,
  logs$secao_eleitoral,
  sep = "-")


## Gerando um hash de identificao do Boletim
logs$hash_identificacao_boletim <- sapply(logs$boletim_seed, digest, algo="md5")

O mesmo passo ser repetido no dataframe do Boletim de Urna.

boletim_salto_sp$SEED_IDENTIFICACAO <- paste(
  boletim_salto_sp$CD_MUNICIPIO,
  boletim_salto_sp$NR_ZONA_NORM,
  boletim_salto_sp$NR_LOCAL_VOTACAO,
  boletim_salto_sp$NR_SECAO_NORM,
  sep = "-"
)

## Gerando a hash de identificao da urna no boletim
boletim_salto_sp$HASH_IDENTIFICACAO <- sapply(boletim_salto_sp$SEED_IDENTIFICACAO, digest, algo="md5")

Criamos agora o campo HASH_IDENTIFICACAO no Boletim de Urna.

Agora precisamos criar um dataframe de join, isolando todos os hash_urnas

# Separando os hashes unicos pra melhorar a performance do update do dataset
unique_hashes <- logs %>% distinct(hash_identificacao_boletim, hash_urna, hash_urna, modelo_urna)
unique_hashes <- as.data.frame(unique_hashes)
unique_hashes

Agora vamos percorrer esse data frame de comparao para fazer um update em todas as linhas do Boletim que fizeram parte da contabilizao das urnas utilizadas na amostra, adicionando

# Adicionando as informaes da urna no boletim com base no HASH_IDENTIFICAO

# Adiciona o HASH_URNA e MODELO_URNA
for (i in 1:nrow(unique_hashes)) {
  h <- unique_hashes[i, "hash_identificacao_boletim"]
  boletim_salto_sp$HASH_URNA[boletim_salto_sp$HASH_IDENTIFICACAO == h] <- unique_hashes[i, "hash_urna"]

  boletim_salto_sp$MODELO_URNA[boletim_salto_sp$HASH_IDENTIFICACAO == h] <- unique_hashes[i, "modelo_urna"]  
}

Agora vamos isolar as linhas do boletim que correspondem as nossas urnas de amostra

# Removendo as urnas que no foram includas na anlise
boletim_salto_sp_amostra <- as.data.frame(boletim_salto_sp[rowSums(is.na(boletim_salto_sp)) == 0,])
table(boletim_salto_sp_amostra$HASH_IDENTIFICACAO)

Agora vamos checar se conseguimos correlacionar a amostra com seu devido boletim.

boletim_salto_sp_amostra_resumido <- boletim_salto_sp_amostra %>% 
  select(HASH_URNA, MODELO_URNA, DS_ELEICAO, DS_CARGO_PERGUNTA, DS_TIPO_VOTAVEL, NM_VOTAVEL, QT_VOTOS)

View(boletim_salto_sp_amostra_resumido)

Agora conseguimos saber de qual urna foram apuradas as informaes do Boletim.


Me diga qual, urna estava na seo X do local Y da zona Z??

Para responder isso podemos criar um subset baseado nos critrios levantados.

## "Me diga qual urna estava na seo X do local Y da zona Z"

urna_x <- subset(logs, secao_eleitoral == "0001" | local_votacao == "1015" | zona_eleitoral == "0221")
urna_x_view <- urna_x %>% select(hash_urna,datetime, modelo_urna, municipio, zona_eleitoral, secao_eleitoral)

View(head(urna_x_view, 1))

Me d somente os logs de uma determinada urna!

Para responder essa pergunta podemos criar um subset procurando pela respectiva hash_urna.

## "Me d somente os logs da urna hash_id:1a2097e964d5e77e355e30744484aa2c"

urna_x <- subset(logs, hash_urna == "1a2097e964d5e77e355e30744484aa2c")
urna_x_view <- urna_x %>% select(hash_urna,datetime, modelo_urna, municipio, zona_eleitoral, secao_eleitoral,  log)

View(urna_x_view)