Boa tarde, Marcelo, tudo bem com você?
Antes de mais nada, desculpe pela demora para responder.
Muito boa a sua pergunta, em outras situações poderemos ter que apresentar nossos dados de outra forma. Para aprendermos a fazer isso, vamos pensar o que significa o parâmetro normalize
da função pandas.crosstab()
? Neste caso, significa que os dados serão normalizados dividindo todos os valores pela soma dos valores.
Legal, como você percebeu quando utilizamos o parâmetro normalize = True
a normalização está sendo feita em relação a todos os dados. Para validar basta realizar a soma entre todos os valores do DataFrame percentual
, linhas + colunas. A forma mais rápida de fazermos isso é percentual.sum().sum()
, onde o primeiro .sum()
retorna a soma das linhas e o segundo pega o retorno anterior e soma com a soma das colunas.
Como está em porcentagem (%), a saída será:
100.00
Tudo bem, mas como fazemos normalização com outras relações no crosstab? Será que o normalize
pode receber outros valores diferentes de True
ou False
? Olha só que interessante, quando olhamos na documentação pandas.crosstab descobrimos que ele aceita também os seguintes valores: 'all', 'index', 'columns', ou {0,1}.
Para os casos de normalize = True ou normalize = 'all': É a normalização que vimos acima, em relação a todos.
Para os casos de normalize = 0 ou normalize = 'index': Normalizará em cada linha.
Para os casos de normalize = 1 ou normalize = 'columns': Normalizará em cada coluna.
Por fim, vamos exemplificar os dois últimos casos com os códigos a seguir. Primeiro em relação a linha:
normaliza_por_index = pd.crosstab(dados.Sexo,
dados.Cor,
normalize = 'index') * 100
normaliza_por_index.rename(index = sexo, inplace = True)
normaliza_por_index.rename(columns = cor, inplace = True)
normaliza_por_index
Saída:
Sexo\Cor | Indígena | Branca | Preta | Amarela | Parda |
---|
Masculino | 0.480751 | 41.678873 | 10.332394 | 0.441315 | 47.066667 |
Feminino | 0.428148 | 40.784231 | 12.246715 | 0.495973 | 46.044934 |
Para validar basta realizar a soma normaliza_por_index.sum(axis='columns')
cuja saída será:
Sexo | |
---|
Masculino | 100.0 |
Feminino | 100.0 |
dtype: float64 | |
Vamos fazer o segundo em relação às colunas:
normaliza_por_coluna = pd.crosstab(dados.Sexo,
dados.Cor,
normalize = 'columns') * 100
normaliza_por_coluna.rename(index = sexo, inplace = True)
normaliza_por_coluna.rename(columns = cor, inplace = True)
normaliza_por_coluna
Saída:
Sexo\Cor | Indígena | Branca | Preta | Amarela | Parda |
---|
Masculino | 71.708683 | 69.759547 | 65.570254 | 66.761364 | 69.764788 |
Feminino | 28.291317 | 30.240453 | 34.429746 | 33.238636 | 30.235212 |
Para validar basta fazer a soma normaliza_por_coluna.sum()
cuja saída será:
Cor | |
---|
Indígena | 100.0 |
Branca | 100.0 |
Preta | 100.0 |
Amarela | 100.0 |
Parda | 100.0 |
dtype: float64 | |
Espero ter ajudado, abraço e bons estudos!