O pacote oferece quatro medidas com a mesma facilidade. Elas não são intercambiáveis, e nenhuma delas é “a melhor” — cada uma responde a uma pergunta diferente, e a facilidade de trocar uma pela outra é o principal risco de usar este pacote.
Esta vinheta é sobre escolher. A ordem dos avisos abaixo é a ordem em que as pessoas erram.
1. Escolha a régua pela pergunta
A tabela abaixo não está digitada aqui: ela é a tabela
reguas, que viaja com o pacote e pode ser consultada de
dentro do R.
| se você quer saber… | use | o que ela mede |
|---|---|---|
| quanto uma posição converte educação em renda | tse_para_isei() |
status socioeconômico, contínua |
| o quanto uma ocupação é socialmente estimada | tse_para_prestigio() |
prestígio, isto é, reputação e não recurso, contínua |
| a relação de emprego: quem contrata, quem é contratado | tse_para_egp() |
classe relacional, categórica |
| a estrutura de classes do dado eleitoral brasileiro | tse_para_classe() |
esquema próprio, que cobre os 17 códigos sem ISCO, categórica |
As outras cinco réguas — ISEI-08, ISEI-BR, prestígio-08, estrato e a partição da classe alta — estão na mesma tabela, com a mesma coluna dizendo quando cada uma é a escolha errada:
reguas[, c("medida", "pergunta", "quando_nao_usar")]ISEI e prestígio não são a mesma coisa
Correlacionam-se forte, e é justamente por isso que a diferença passa despercebida:
cw <- crosswalk_tse()
ok <- !is.na(cw$isei88) & !is.na(cw$siops88)
round(cor(cw$isei88[ok], cw$siops88[ok]), 3)
#> [1] 0.944Mas onde discordam, discordam na direção que importa:
cw$dif <- cw$siops88 - cw$isei88
d <- cw[ok, c("rotulo", "isei88", "siops88", "dif")]
rbind(head(d[order(d$dif), ], 3),
head(d[order(-d$dif), ], 3))
#> rotulo isei88 siops88 dif
#> 105 MINISTRO DO PODER JUDICIARIO E MAGISTRADO 90 76 -14
#> 168 MAGISTRADO 90 76 -14
#> 14 VETERINARIO 85 73 -12
#> 107 JARDINEIRO 23 38 15
#> 238 AGRICULTOR 23 38 15
#> 241 PESCADOR 23 38 15O magistrado tem ISEI 90 e prestígio 76: a posição converte credencial em retorno melhor do que a sociedade a estima. O enfermeiro faz o inverso — ISEI 43, prestígio 54.
A consequência é direta. Uma pesquisa sobre “quem tem posição de topo no recrutamento” e outra sobre “quem é socialmente valorizado” vão ordenar as profissões de saúde de formas diferentes, e as duas estarão certas. Escolha antes de rodar, e diga qual escolheu.
2. NA não é zero, e a ausência é generificada
Dezessete dos 275 códigos não designam ocupação alguma — não informada, fora da PEA, vínculo sem função —, e por isso não têm ISEI, prestígio nem EGP:
Isso não é falha de cobertura: é a resposta correta. O erro é tratar esses casos como zero, ou tirá-los da conta sem dizer.
E há uma armadilha específica: o padrão de ausência é
fortemente generificado. Entre as candidaturas ao TSE,
cerca de 15% das mulheres caem na classe
"Fora da PEA por posição" — os códigos 581 e 931 —, contra
pouco mais de 1% dos homens.
Vale nomear a classe, porque a assimetria é dela e só dela: a outra
residual, "Inativo com trajetória", fica em torno de 4% nos
dois sexos. Quem somar as duas dilui justamente o
padrão que importa aqui.
Uma média de ISEI por gênero, com na.rm = TRUE, compara
então duas subpopulações truncadas de formas diferentes, e parte da
“vantagem feminina em status” que aparece pode vir daí. Quanto
exatamente, esta vinheta não mede — o ponto é que a comparação não é
entre iguais, e que a cobertura tem de ser relatada ao lado da
média.
Quem for comparar médias por grupo precisa reportar a cobertura junto:
# sempre, não às vezes
tapply(isei, genero, function(x) c(media = mean(x, na.rm = TRUE),
cobertura = mean(!is.na(x))))isei_retrospectivo() recupera parte disso carregando a
ocupação anterior da própria pessoa — a cobertura feminina sobe cerca de
seis pontos (os valores exatos estão em
?isei_retrospectivo). Não resolve; reduz.
3. A régua categórica cobre onde a contínua não chega
Os mesmos 17 códigos sem ISEI têm classe:
table(cw$classe[is.na(cw$isco88)])
#>
#> Fora da PEA por posição Inativo com trajetória
#> 2 6
#> Militares e segurança pública Não informado
#> 1 4
#> Vínculo público não especificado
#> 4“Inativo com trajetória” e “Vínculo público não especificado” são posições sociais reconhecíveis; elas só não são pontos numa escala de status. Se a sua pergunta comporta uma categoria residual nomeada, o esquema categórico diz mais do que a escala contínua.
4. Categoria residual não é estrato
table(cw$estrato)
#>
#> Classe alta Classe média
#> 88 70
#> Classes populares Fora da PEA / não informado
#> 101 12
#> Vínculo público não especificado
#> 4“Fora da PEA / não informado” e “Vínculo público não especificado” não são estratos. Somá-los a “Classes populares” — a tentação óbvia, porque parecem “baixo” — inventa uma classe popular que não foi medida. Eles ficam à parte de propósito.
5. Não publique EGP de onze classes a partir do TSE
O EGP exige posição no emprego e número de subordinados. O TSE não pergunta o segundo:
tse_para_egp(c(111, 169, 601))
#> Warning: EGP calculado sem `n_supervisionados`. A divisão entre IVa (com
#> empregados) e IVb (sem) fica indeterminada — todos caem em IVb — e V fica
#> subestimada; para publicar prefira n_classes = 7 ou 5; veja ?isco88_para_egp.
#> [1] "I: dirigentes e profissionais superiores"
#> [2] "IVb: conta própria sem empregados"
#> [3] "IVc: proprietário rural"O aviso diz o que falta. Repare no que ele não diz mais: a pequena burguesia aparece, porque o dicionário do TSE marca quem trabalha por conta própria, e o pacote usa essa marca.
c(conta_propria = sum(tse_isco$conta_propria, na.rm = TRUE),
proprietario = sum(tse_isco$proprietario, na.rm = TRUE))
#> conta_propria proprietario
#> 12 10São marcas distintas, e é a primeira que o EGP usa. O agricultor e o
pescador trabalham por conta própria — o SEMPL = 2 que o
esquema exige para chegar a IVc — sem pertencerem à classe proprietária.
O que continua indeterminado é a divisão entre IVa (com empregados) e
IVb (sem).
Para publicar, colapse:
table(tse_para_egp(tse_isco$cod_tse, n_classes = 5, avisar = FALSE),
useNA = "no")
#>
#> I-III: colarinho branco IVab: pequena burguesia
#> 179 5
#> IVc+VIIb: agrícolas V+VI: trabalhadores qualificados
#> 8 38
#> VIIa: trabalhadores não qualificados
#> 28Em cinco classes, IVa e IVb se fundem em IVab e a indeterminação desaparece.
A PNAD Contínua vai mais longe: ela tem posição na ocupação e número
de empregados, o que separa IVa de IVb — a distinção
que aqui ficou indeterminada. Mas nem ela fecha o esquema: falta a
supervisão exercida sobre assalariados, que é o que define V. Nenhuma
das quatro portas do pacote a tem. Veja cod_para_egp().
6. Série longa: o cadastro do TSE mudou embaixo do dado
Entre 2000 e 2002 o TSE reeditou a tabela de ocupações. Sete códigos passaram a designar outra ocupação:
q <- tse_quebra_2002[tse_quebra_2002$tipo == "reutilizado", ]
q[, c("cod_tse", "rotulo_ate_2000", "rotulo_apos_2002")]
#> cod_tse rotulo_ate_2000
#> 5 214 DELEGADO DE POLICIA
#> 6 391 CHEFE INTERMEDIARIO
#> 7 215 OCUPANTE DE CARGO DE DIRECAO E ASSESSORAMENTO SUPERIOR
#> 8 216 OFICIAIS DAS FORCAS ARMADAS E FORCAS AUXILIARES
#> 9 521 GOVERNANTA DE HOTEL, CAMAREIRO, PORTEIRO, COZINHEIRO E GARCOM
#> 13 158 DESENHISTA TÉCNICO
#> 25 211 PROCURADOR E ASSEMELHADOS
#> rotulo_apos_2002
#> 5 ESCULTOR E PINTOR
#> 6 TAQUÍGRAFO E ESTENÓGRAFO
#> 7 ARTISTA PLÁSTICO E ASSEMELHADOS
#> 8 EMBALADOR, EMPACOTADOR E ASSEMELHADOS
#> 9 GOVERNANTA
#> 13 TÉCNICO EM INFORMÁTICA
#> 25 ESTIVADOR, CARREGADOR E ASSEMELHADOSTraduzir uma candidatura de 1998 pelo dicionário atual classifica um ocupante de cargo de direção como artista plástico. Passe o ano e o problema se resolve:
tse_para_classe(c("215", "215"), ano = c(2000, 2020))
#> Warning: 1 candidatura(s) usam código(s) que o TSE REUTILIZOU depois (215): naquele ano designavam outra ocupação, e voltam NA.
#> Veja ?tse_vigencia.
#> [1] NA "Profissionais de nível superior"E o problema maior nem é esse. Mais frequente que a reutilização é a troca de inventário — códigos que sumiram e códigos que nasceram:
table(tse_diff_cadastro(2000, 2002)$mudanca)
#>
#> criado extinto rotulo
#> 69 21 36Comparando os períodos inteiros, o cadastro perde e ganha códigos:
r <- tse_ocupacao_rotulos
extintos <- setdiff(r$cod_tse[r$ate <= 2000], r$cod_tse[r$ate > 2000])
criados <- setdiff(r$cod_tse[r$de >= 2002], r$cod_tse[r$de < 2002])
c(extintos = length(extintos), criados = length(criados))
#> extintos criados
#> 13 122São 12,4% das candidaturas de 1998–2000 nos treze extintos, e 33,1%
das de 2002 em diante nos cento e vinte e dois criados — entre eles
COMERCIANTE e EMPRESÁRIO. Estas duas
participações são o único par de números desta vinheta que o pacote não
recalcula sozinho: tse_ocupacao_rotulos traz n
por vigência, não por ano, e por isso elas saem da microbase, em
data-raw/11_confere_retrospectivo.R. Uma série que
atravesse 2002 mede “Proprietários e empregadores” com dois vocabulários
incomensuráveis.
Não há um ano seguro para começar depois disso. A troca de inventário não se esgota em 2002:
for (p in list(c(2002, 2004), c(2004, 2006), c(2006, 2008))) {
cat(p[1], "->", p[2], ": ")
print(table(tse_diff_cadastro(p[1], p[2])$mudanca))
}
#> 2002 -> 2004 :
#> criado
#> 20
#> 2004 -> 2006 :
#> criado extinto rotulo
#> 34 3 13
#> 2006 -> 2008 :
#> criado
#> 6De 2002 para 2004 nada se extingue, mas de 2004 para 2006 três
códigos somem e treze trocam de rótulo — e dois dos sete reutilizados só
reaparecem em 2006 e 2008. O caminho honesto não é escolher um ano de
início: é declarar a descontinuidade e passar o
ano, que é o que resolve os reutilizados código a
código.
7. Não misture ISEI-88 e ISEI-08 na mesma série
data.frame(
cod = c("111", "113", "411"),
rotulo = tse_para_rotulo(c("111", "113", "411")),
isei88 = tse_para_isei(c("111", "113", "411")),
isei08 = round(tse_para_isei08(c("111", "113", "411")), 1))
#> cod rotulo isei88 isei08
#> 1 111 MÉDICO 88 88.7
#> 2 113 ENFERMEIRO 43 68.7
#> 3 411 VENDEDOR DE COMÉRCIO VAREJISTA E ATACADISTA 43 29.7O médico fica onde estava; o enfermeiro sobe 26 pontos — e não por
ter mudado de lugar na classificação. A ISCO-88 já o punha entre os
profissionais de nível superior (2230 na ISCO-88), e já o
separava da enfermagem técnica (3231 na ISCO-88). O que ela
fazia era pontuá-lo em 43, abaixo dos escriturários,
que recebem 45. O que mudou foi a escala: o ISEI-08, reestimado por
Ganzeboom sobre o ISSP de 2002-2007, cobre homens e mulheres e o põe em
68,7. O vendedor cai 13 pelo mesmo mecanismo, em sentido contrário, com
a reorganização do subgrupo 52 por cima. Não é erro de
nenhuma das duas réguas: são recortes diferentes. Numa série que troque
de âncora no meio, os dois deslocamentos aparecem como mobilidade que
não houve.
Fique na ISCO-88 para comparar candidaturas entre si
— é onde o pacote está ancorado. Use a ISCO-08 para juntar o dado
eleitoral a fontes que já a usam, e para análise de gênero, onde o
ISEI-08 reavalia para cima as ocupações de cuidado que o escalonamento
de 1992, estimado só sobre homens, subestimava (veja
vignette("validacao")).
Desde a versão 0.5.0 há uma terceira régua,
tse_para_isei_br(), estimada na PNAD Contínua em vez de
importada. O aviso vale para ela igualmente, e com uma razão a mais: as
três não foram estimadas na mesma população nem no mesmo ano. A
brasileira é de um ano só, 2025, e serve para perguntar como o mercado
de trabalho brasileiro ordena as ocupações. Para
comparação internacional, ou para qualquer série longa, ela não
serve.
8. Verifique antes, não depois
As duas travas são opt-in e ficam fora do caminho feliz. Chame-as:
checa_cobertura(c(111, 169, 257))
#> cobertura ok: 3 códigos observados, todos no dicionário.
invisible(checa_periodo(c("215", "111"), c(2000, 2020)))
#> Warning: 1 candidatura(s) até 2000 usam código(s) que o TSE reutilizou em 2002
#> (215). Elas estão classificadas pelo cadastro NOVO e portanto erradas; veja
#> ?checa_periodo.checa_cobertura() falha com erro se
aparecer código fora do dicionário. O modo silencioso de errar uma
medida de classe não é classificar mal um caso: é um código novo cair
num rótulo residual sem ninguém perceber.
9. Nem todo escore tem a mesma procedência
Um ISEI de 68 sai impresso do mesmo jeito venha de onde vier. Mas “advogado” pressupõe inscrição na OAB, e “empresário” não pressupõe registro nenhum:
crosswalk_tse(c("131", "257"))[, c("cod_tse", "rotulo", "isei88", "componente_alta")]
#> cod_tse rotulo isei88 componente_alta
#> 1 131 ADVOGADO 85 Alta credenciada
#> 2 257 EMPRESARIO 68 Alta proprietáriaOs dois entram na classe alta, e os dois escores saem com a mesma tipografia — mas não com a mesma procedência. Para chegar a 85, é preciso estar inscrito na OAB; para chegar a 68, basta escrever “empresário” no formulário.
E o que esse 68 cobre:
p <- tse_autorrotulo_patrimonio
p[p$cod_tse == "257", c("cargo", "n", "p10", "mediana", "p90")]
#> cargo n p10 mediana p90
#> 25 VEREADOR 80829 16285 185000 996021
#> 26 PREFEITO 10691 129521 812544 5089263
#> 27 DEPUTADO ESTADUAL 5275 31723 410824 3300418
#> 28 DEPUTADO DISTRITAL 289 34773 420496 3867513
#> 29 DEPUTADO FEDERAL 2772 39985 646282 5935381
#> 30 SENADOR 95 352110 4678498 75937286
#> 31 GOVERNADOR 66 225763 3548117 74426844
#> 32 TODOS 100017 19804 229468 1496826Entre os que se declaram empresário, o patrimônio mediano vai de R$ 185 mil (candidatos a vereador) a R$ 4,7 milhões (candidatos a senador), e dentro do código os extremos distam dezenas de vezes:
todos <- p[p$cod_tse == "257" & p$cargo == "TODOS", ]
round(todos$p90 / todos$p10, 1)
#> [1] 75.6Não é erro de medida: é uma mistura de duas populações — o microempreendedor e o capitalista — sob um rótulo só. Nenhum escore único está certo para as duas, e por isso trocar o 68 por outro número não resolveria.
Compare com o 131, que é ancorado na OAB. O gradiente por cargo existe nos dois — quem disputa posto mais alto é mais rico —, mas a distância entre os extremos é bem menor onde o rótulo pressupõe registro externo:
a <- p[p$cod_tse %in% c("131", "257") & p$cargo == "TODOS", ]
data.frame(a["rotulo"], razao_p90_p10 = round(a$p90 / a$p10, 1))
#> rotulo razao_p90_p10
#> 8 ADVOGADO 47.8
#> 32 EMPRESARIO 75.6Isso não invalida o código; torna-o menos confiável que os ancorados, de um jeito que a tabela não mostra. A saída é sensibilidade, não conserto:
d <- data.frame(cod = c("131", "257", "111", "265"))
d$isei <- tse_para_isei(d$cod)
d$isei_ancorado <- ifelse(d$cod %in% tse_codigos_autorrotulo, NA, d$isei)
d
#> cod isei isei_ancorado
#> 1 131 85 85
#> 2 257 68 NA
#> 3 111 88 88
#> 4 265 66 66São 13,3% das candidaturas. Rode com as duas colunas e relate as duas: se a sua conclusão só aparece na primeira, ela depende de autodeclaração sem âncora.
Resumo
- Escolha a régua pela pergunta, e diga qual escolheu.
-
NAé resposta, não ausência de resposta — e a ausência é generificada. - Categoria residual não é estrato.
- EGP de onze classes a partir do TSE, não; de cinco, sim.
- Série que atravessa 2002 precisa de
ano, ou de uma nota de rodapé. - Uma âncora por série.
-
checa_cobertura()antes de analisar, sempre. - Rótulo de propriedade não tem a confiabilidade de rótulo com
registro — rode também sem
tse_codigos_autorrotulo.
