genderBR: predizendo sexo a partir de nomes próprios

No R e usando dados do Censo de 2010

05 Sep 2017 por Fernando Meireles


Várias questões importantes nas Ciências Sociais estão ligadas ao sexo das pessoas. Se quisermos saber se mulheres recebem menores salários, se estão sub-representadas na política, se sofrem mais com as violências urbana e doméstica, entre outros, precisamos identificar o sexo das pessoas que investigamos. Entretanto, esse dado nem sempre é fácil de obter: vários bancos usados para responder às perguntas acima não contêm informações sobre o sexo das pessoas estudadas – embora alguns destes contenham outras que podem ser usada para inferir seus sexos.

O pacote genderBR para o R, que acabou de ser publicado no CRAN, serve para isso: ele usa uma informação relativamente simples de obter – nome próprio – e, a partir dela, prediz o sexo de uma pessoa com dados do Censo de 2010 realizado pelo IBGE. Se o nome João, por exemplo, é usado majoritariamente por individuos do sexo masculino no Brasil, temos alguma confiança em dizer que outro brasileiro qualquer com o mesmo nome provavelmente também seja do sexo masculino. Entre outras vantagens, este método é replicável, baseado em dados públicos e, o que é mais importante, muito mais rápido do que qualquer classificação manual de sexos a partir de nomes próprios. O passo-a-passo a seguir exemplifica isso.

Como instalar

Como o pacote genderBR está no CRAN e, portanto, pode ser instalado diretamente pelo R com:

install.packages("genderBR")

Ou, para versões beta do pacote, ele pode ser instalado com devtools:

if(!require("devtools")) install.packages("devtools")
devtools::install_github("meirelesff/genderBR")

Feito isso, para usar o pacote, basta carregá-lo:

library(genderBR)

Como usar

O pacote genderBR possui uma função principal, get_gender, que prediz o sexo de uma pessoa baseado no seu primeiro nome (com ou sem letras maiúsculas, acentos e sobrenomes), como no exemplo abaixo:

get_gender("maria")
## [1] "Female"
get_gender("MARIA")
## [1] "Female"
get_gender("Maria da Silva Conceição")
## [1] "Female"

A função funciona igualmente com um vetor de nomes:

get_gender(c("isabel", "marta", "silvia", "rodrigo", "roberto", "thiago"))
## [1] "Female" "Female" "Female" "Male"   "Male"   "Male"

Resumidamente, esta chamada envia uma requisição GET a API do Censo 2010 (que pode demorar a responder), calcula a proporção de mulheres que possuem o nome passado e, então, faz uma predição baseado num ponto de corte: por padrão, se mais de 0.9 das pessoas com o nome passado são do sexo feminino, segundo o Censo de 2010, a função prediz o sexo deste nome como Female; se mais 0.9 das pessoas com esse nome forem do sexo masculino, a predição será Male; por fim, nomes com proporções menores que 0.9 ou não encontrados na base do IBGE são classificados como missing (e.g., NA) Exemplos:

# Male
get_gender("joao")
## [1] "Male"
# NA
get_gender("muriel")
## [1] NA
# NA
get_gender("ashdfjg")
## [1] NA

É possível modificar a proporção usada para classificar corretamente um nome. Por exemplo, podemos considerar como do sexo masculino apenas pessoas cujo primeiro nome seja usado por 0.95 (95%) de pessoas identificadas como do sexo masculino pelo IBGE:

get_gender("augusto", threshold = 0.95)
## [1] "Male"

Além deste resulto básico, a função get_gender também permite saber a proporção de mulheres que usam um dado primeiro nome no país – com isto, é possível usar qualquer outra medida para predizer o sexo de uma pessoa. No exemplo abaixo, percebe-se que a probabilidade de alguém com o nome Muriel ser do sexo feminino no universo de entrevistados do Censo de 2010 é igual a 43%.

get_gender("muriel", prob = TRUE)
## [1] 0.4303515

Por fim, podemos obter os resultados por estado – partido da ideia de que o uso de um dado nome próprio entre sexos pode variar de região para região. Um bom exemplo é o do político goiano Iris Rezende, casado com sua xará Iris de Araújo.

# Probabilidade do nome Iris ser usado por uma mulher em SP
get_gender("iris", prob = TRUE, state = "SP")
## [1] 0.9491027
# Probabilidade do nome Iris ser usado por uma mulher em GO
get_gender("iris", prob = TRUE, state = "GO")
## [1] 0.5

Como o exemplo acima mostra, o nome Iris é muito mais comum para pessoas do sexo masculino em Goiás do que em São Paulo.

Outras funções

Além da função get_gender, o pacote genderBR possui outras duas funções que podem ser úteis em algumas situações. A primeira delas, get_states, serve para retornar um data.frame com o nome, a sigla e o código do IBGE de todos os estados brasileiros, o que pode ajudar nas consultas à função get_gender.

Já a segunda função, map_gender, serve para mapear os usos de um nome qualquer entre todos os estados do Brasil:

map_gender("mario", gender = "f")
## # A tibble: 19 x 6
##                   nome    uf  freq populacao  sexo  prop
##  *               <chr> <int> <int>     <int> <chr> <dbl>
##  1            Amazonas    13    60   3483985     f  1.72
##  2               Piauí    22    30   3118360     f  0.96
##  3      Rio de Janeiro    33   140  15989929     f  0.88
##  4 Rio Grande do Norte    24    23   3168027     f  0.73
##  5           São Paulo    35   293  41262199     f  0.71
##  6               Ceará    23    56   8452381     f  0.66
##  7      Santa Catarina    42    41   6248436     f  0.66
##  8         Mato Grosso    51    19   3035122     f  0.63
##  9          Pernambuco    26    54   8796448     f  0.61
## 10            Maranhão    21    40   6574789     f  0.61
## 11                Pará    15    46   7581051     f  0.61
## 12      Espírito Santo    32    21   3514952     f  0.60
## 13               Bahia    29    84  14016906     f  0.60
## 14             Alagoas    27    17   3120494     f  0.54
## 15             Paraíba    25    20   3766528     f  0.53
## 16              Paraná    41    55  10444526     f  0.53
## 17   Rio Grande do Sul    43    48  10693929     f  0.45
## 18        Minas Gerais    31    79  19597330     f  0.40
## 19               Goiás    52    20   6003788     f  0.33

Nela, basta passar as letras f, para Female, ou m, para Male, e a função retorna o total de pessoas em cada estado com o nome fornecido, além do total de usos daquele nome no sexo indicado.

Avaliando as predições

O método é confiável? Depois de ter feitos alguns testes, a precisão média do método sempre foi maior que 95%, sem sinal de viés. Aqui, vou exemplificar isso com um exemplo simples: os dados de candidaturas do TSE (extraídos com o electionsBR).

Basicamente, candidatos a cargos eletivos no Brasil reportam seus sexos no formulário de registro de suas candidaturas, informação que, posteriormente, é disponibilizada pelo TSE. Apesar de possíveis erros de mensuração – afinal, estes dados são auto-reportados e, como tal, estão sujeitos até mesmo a erros de imputação –, o genderBR faz um bom trabalho de classificar o sexo dos 104122 candidatos a cargos federais nas cinco eleições entre 1998 e 2014, como mostra a tabela abaixo.

Sexo declarado Sexo predito N %
Male Female 410 0.5%
Male Male 79485 95.5%
Male Unissex 1121 1.3%
Male Unknown 2201 2.6%
Female Female 19796 94.7%
Female Male 106 0.5%
Female Unissex 348 1.7%
Female Unknown 655 3.1%

Especificamente, o método classificou 99.5% das observações corretamente (desconsiderando os missings, que são mostrados aqui como Unissex, quando a proporção de usos do nome pelo sexo feminino ou masculino é menor que 0.9, ou Unknown, quando o nome não foi encontrado na base do TSE), e apenas 2.74% ficaram como missing. No geral, portanto, o método funciona.


« electionsBR: versão 0.3.0
Predizendo sexo a partir de nomes próprios com o genderBR »