genderBR v1.3.0

Classificação de sexo a partir de nomes próprios brasileiros

R
Pacote
Author

Fernando Meireles

Published

April 7, 2026



Saber o sexo de uma pessoa – ou, mais precisamente, sexo biológico burocraticamente atribuído ao nascer – é uma informação útil para pesquisa aplicada em várias áreas. Com ela, é possível quantificar fenômenos como a diferença salarial média entre homens e mulheres; presença de mulheres em espaços de decisão; concentração de mulheres em determinadas áreas do conhecimento; e assim por diante. Um problema maior, contudo, frequentemente impede essas análises: ausência de informações.

Bases de dados como a de filiados a partidos no Brasil, ou a de sócio de empresas mantida pela Receita Federal, registram o nome das milhares das pessoas nelas incluídas, mas não a informação seus sexos informados. No Brasil, assim como em outros países, primeiros nomes guardam marcados que permitem inferir a informação: convencionalmente, Maria é um nome considerado feminino; João, masculino. Se tivermos nomes de pessoas, mas não seus sexos, podemos classificar manualmente aqueles para atribuir a informação faltante. Se nossa base tiver milhares ou milhões de registros, no entanto, o problema persiste.

Foi para resolver esse problema que, em 2017, surgiu o pacote para R genderBR. Sua proposta é bem simples: ele imputa uma classificação de sexo binária a partir de nomes próprios. Para tanto, usa dados do Censo do IBGE, que armazena a contagem de pessoas de cada sexo no país com determinado nome, o que garante cobertura para quase totalidade dos primeiros nomes usados pela população brasileira.

Desde então, o pacote acumula 43 mil downloads no CRAN e quase 80 citações no Google Scholar. Mesmo assim, ele tinha a limitação de não conseguir classificar nomes não contidos na base do Censo de 2010 – o que significava que, no mais das vezes, cerca de 5% de nomes classificados em tarefas comuns ficavam de fora.

Atualização: v1.3.0

Na sua nova versão, lançada em março deste ano e já disponível no CRAN (o principal repositório de pacotes para R), o genderBR inclui duas grandes novidades:

  • Incorporação dos dados do Censo de 2022, atualizando a contagem de usos de cada um dos 123733 primeiros nomes no Brasil utilizados por mais de 20 pessoas;
  • Adição de um modelo de aprendizado profundo, treinado em cima de todos os 141742 próprios contidos nas bases dos Censo de 2010 e de 2022, para fazer a classificação de sexo binária – o que permite generalizar a classificação para nomes não contidos nas bases do Censo.

Com o R aberto, a nova versão do pacote pode ser instalada com:

install.packages("genderBR")

O que o genderBR faz

O genderBR imputa uma classificação binária de sexo a partir de nomes próprios brasileiros usando dados dos Censos do IBGE de 2010 e 2022. A base interna do pacote cobre mais de 142 mil nomes únicos. A função principal, get_gender, recebe um nome (ou um vetor de nomes) e retorna a predição:

library(genderBR)

nomes <- c("Guilherme", "Maria", "Ana", "Arnaldo", "Martha", "Carlos")
get_gender(nomes)
[1] "Male"   "Female" "Female" "Male"   "Female" "Male"  

Por padrão, a função usa os dados internos do pacote (internal = TRUE), o que permite predições offline quase instantaneamente – mesmo para bases grandes. Para retornar a probabilidade de um nome ser usado por uma pessoa do sexo feminino (de acordo com dados do Censo de 2022 e, quando indisponíveis, do Censo de 2010), bastar usar prob = TRUE:

get_gender(nomes, prob = TRUE)
[1] 0,007027704 0,995115136 0,995264457 0,002405403 0,996589940 0,004324201

Também é possível escolher qual Censo usar para obter as probabilidades:

get_gender(nomes, prob = TRUE, year = 2010)
[1] 0,007510383 0,996643040 0,996721856 0,002919058 0,995692666 0,004076039

Ampliando a classificação de nomes

Apesar da cobertura ampla dos dados do Censo, se um nome não está na base, não há como classificá-lo. Portanto, nomes com grafias incomuns, nomes estrangeiros, nomes adaptados ou raros ficavam de fora ao usar a versão anterior do genderBR para atribuir sexo biológico a nomes brasileiros.

Para contornar o problema, a nova versão do pacote inclui uma rede neural treinada nos dados do IBGE, o que permite generalizar a classificação de sexo para nomes que não estão nos dados do Censo. Um exemplo: o nome Zusjane não existe no Censo do IBGE.

get_gender("Zusjane")
[1] NA

Ao usar a função get_gender, nenhuma classificação é atribuída. Com a rede neural, habilitada com o argumento nn = TRUE, o pacote faz a classificação:

get_gender("Zusjane", nn = TRUE)
[1] "Female"
get_gender("Zusjane", nn = TRUE, prob = TRUE)
[1] 0,9993508

Por detrás dos panos, o modelo usado para fazer a classificação é um Gated Recurrent Unit (GUR) bidirecional que opera no nível do caractere – isto é, o modelo lê cada nome letra por letra e aprende padrões associados a nomes considerados femininos e masculinos, de acordo com dados dos Censos. Treinado em todos os 142 mil nomes do IBGE, o modelo consegue 96,5% de acurácia nos dados de teste. Os pesos do modelo estão disponíveis no Hugging Face e são baixados automaticamente pelo pacote no seu primeiro uso.

Desempenho: três backends, três velocidades

O genderBR oferece três formas de classificar nomes: dados do Censo (armazenados internamente no pacote para uso offline e otimizados para consultas rápidas); a nova rede neural (método offline, rápido); e a API do IBGE (método online, mais lento). Para ilustrar as diferenças de performance, o código abaixo cronometra a classificação de 20 nomes com cada método:

nomes20 <- c(
  "Joao", "Maria", "Pedro", "Ana", "Lucas",
  "Juliana", "Gabriel", "Fernanda", "Rafael", "Camila",
  "Bruno", "Patricia", "Carlos", "Larissa", "Felipe",
  "Beatriz", "Gustavo", "Aline", "Rodrigo", "Mariana"
)

t_interno <- system.time(get_gender(nomes20, internal = TRUE))["elapsed"]
t_nn <- system.time(get_gender(nomes20, nn = TRUE))["elapsed"]
t_api <- system.time(get_gender(nomes20, internal = FALSE))["elapsed"]

tibble(
  Método = c("Dataset interno", "Rede neural", "API do IBGE"),
  `Tempo (segundos)` = c(t_interno, t_nn, t_api)
) |>
  knitr::kable(digits = 4)
Método Tempo (segundos)
Dataset interno 0,002
Rede neural 0,011
API do IBGE 1,339

Como se vê, tanto usar dados internos (internal = TRUE, o padrão) quanto usar a rede neural (nn = TRUE) leva frações de segundo, ao contrário de usar o serviço online do IBGE.

Ganhos de escala no método interno são grandes porque ele consome quase o mesmo tempo para predizer o sexo de 100 ou de 10 mil nomes. Com a API do IBGE, por outro lado, o tempo cresce de forma linear: cada nome exige uma requisição, e cada requisição leva uma fração de segundo.

Considerando tarefas de classificação de diferentes tamanhos – classificar 25, 50, 100 ou 200 nomes –, as diferenças de tempo são ainda mais evidentes (note que foi necessário usar uma escala escala logarítmica para visualizar melhor as diferenças):

Mesmo ao classificar 200 nomes, dados internos e rede neural levam fração de segundo, enquanto que o serviço online do IBGE passa a gastar quase dois minutos. Apesar disso, ao classificar milhares ou milhões de nomes a rede neural consome muita memória do computador, podendo travar ou interromper a execução.

A recomendação geral, portanto, é sempre usar dados internos do Censo e, quando nomes a serem classificados não estiverem contidos neles, usar a rede neural com nn = TRUE.

Funciona? Uma validação

O uso do genderBR já foi validado outras vezes, e por diferentes pesquisadores, mas a nova rede neural é uma adição importante que não foi testada. Para dar uma ideia da sua utilidade, apliquei o pacote para classificar todas os 463681 candidatos e candidatas que disputaram as eleições municipais de 2024, usando os dados do TSE.

O procedimento adotado foi o seguinte: primeiro, usei a função get_gender para pegar a probabilidade dos nomes serem femininos usando o dataset interno do pacote, o que é rápido e cobre a maioria dos nomes brasileiros; depois, usei a rede neural para obter a probabilidade dos nomes que ficaram sem classificação, ou seja, aqueles ausentes da base do Censo. Isso feito, usei duas formas de classificação dos nomes: se a probabilidade de um nome ser feminino for maior que um threshold (e.g., 0,5 ou 0,9), o nome foi classificado como Feminino; se a probabilidade for menor que o threshold, o nome foi classificado como Masculino; e se a probabilidade estiver entre os dois limites, o nome foi classificado como Desconecido. Por fim, comparei o resultado das classificações com o sexo autodeclarado pelos próprios candidatos e candidatas a título de validação.

O processo de classificação de quase meio milhão de candidatos levou apenas 0,8 segundos para o método baseado no Censo e 1,6 segundos para a rede neural, que classificou 13646 nomes não contidos no Censo. Os resultados são os que seguem.

Classificação Threshold Acurácia Cobertura
Censo 0,5 99.0% 97.1%
Censo 0,6 99.2% 96.5%
Censo 0,7 99.4% 96.1%
Censo 0,8 99.6% 95.5%
Censo 0,9 99.7% 94.6%
Rede neural (faltantes) 0,5 89.5% 100.0%
Rede neural (faltantes) 0,6 90.4% 97.3%
Rede neural (faltantes) 0,7 91.4% 94.6%
Rede neural (faltantes) 0,8 92.5% 91.3%
Rede neural (faltantes) 0,9 93.8% 85.9%
Combinado 0,5 98.7% 100.0%
Combinado 0,6 99.0% 99.4%
Combinado 0,7 99.2% 98.9%
Combinado 0,8 99.4% 98.2%
Combinado 0,9 99.5% 97.1%


Comentários:

  • Usar apenas dados internos, do Censo, já dá mais de 99% de acurácia na predição de sexo a partir de nomes próprios brasileiros, mas a cobertura do método é limitada: se considerarmos como feminino ou masculino apenas os nomes com probabilidade de serem femininos ou masculinos maior que 0,9, por exemplo, conseguimos classificar apenas 94,6% de todos os nomes. O restante é missing.

  • A rede neural, por sua vez, classifica todos os nomes não classificados pelo método anterior quando usamos um threshold de 0,5. A acurácia, contudo, é menor do que a do método baseado no Censo: 89,5% dos nomes classificados pela rede neural estavam corretos. Dado que estes são nomes raros, que não estão na base do Censo e que, portanto, o modelo nunca os viu antes, o resultado é bom. Ao aumentar o threshold, a acurácia sobe, mas a cobertura cai ligeiramente.

  • Se combinarmos os dois métodos – i.e., classificamos todos os nomes com dados internos, depois classificamos apenas nomes faltantes com a rede neural –, conseguimos o melhor dos dois mundos: alta acurácia (98,7% com threshold de 0,5) e cobertura total, de 100% dos nomes.

  • Dados do TSE são autopreenchidos, então é possível que haja erros de digitação ou grafias incomuns, além de declarações de sexo erradas. Conseguir 99% de acurácia e cobertura total, nesse caso, pode ser antes um piso do que um teto para o desempenho do genderBR.

E quais casos a rede neural errou? A tabela abaixo mostra 10 destes sorteados ao acaso. Como se pode ver, não são nomes fáceis de classificar nem mesmo para humanos.

Nome Sexo declarado Prob. feminino (NN)
Durcinei Masculino 0,668
Markesnane Masculino 0,970
Ladislê Masculino 0,996
Kericlis Masculino 0,652
Gelcioni Feminino 0,104
Oquemiler Masculino 0,608
Elionenai Masculino 0,851
Jusecleide Masculino 0,999
Orda Feminino 0,306
Waldirez Masculino 0,501

Uso responsável

O genderBR infere sexo, de forma binária,a partir de nomes. Essa classificação binária, derivada de convenções de nomeação e registro de crianças ao nascer, no entanto, certamente não reflete a complexidade das identidades de gênero, tampouco suas mudanças ao longo da vida das pessoas. Por isso mesmo, ao usar o pacote deve-se ter em mente que impor classificações binárias a indivíduos ou grupos pode resultar em danos ou discriminação a estes.

O melhor uso acadêmico do pacote é o de estimar proporções de mulheres e homens em populações agregadas, apenas para fins de estudo de fenômenos sociais que, sem o pacote, ficariam sem análise. Em outras palavras, considere o pacote como um último recurso, a ser usado apenas quando na ausência de dados autorreportados e quando inferi-lo a partir de nomes próprios não oferece risco às pessoas estudadas.