Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Criação da tabela de frequências

Não entendi o retorno do Código:

pd.value_counts( pd.cut( x = dados['Renda'], bins = 17, include_lowest = True ), sort = False )

Out:

(-200.001, 11764.706] 75594 (11764.706, 23529.412] 1022 (23529.412, 35294.118] 169 (35294.118, 47058.824] 19 (47058.824, 58823.529] 16 (58823.529, 70588.235] 5 (70588.235, 82352.941] 4 (82352.941, 94117.647] 1 (94117.647, 105882.353] 6 (105882.353, 117647.059] 0 (117647.059, 129411.765] 1 (129411.765, 141176.471] 0 (141176.471, 152941.176] 0 (152941.176, 164705.882] 0 (164705.882, 176470.588] 0 (176470.588, 188235.294] 0 (188235.294, 200000.0] 3 Name: Renda, dtype: int64

Os números à esquerda são as rendas? Se sim, por que há negativos? E quando utilizamos o sort() é para ordenar de acordo com o que? Desculpa mas não ficou claro para mim essa passagem da aula.

5 respostas

Olá, Marcel, tudo bem?

Sou eu de novo! hehehehe

Então, o método value_counts() é responsável por contar a quantidade de vezes que determinada categoria aparece.

Quando estivermos trabalhando com valores numéricos, podemos utilizar o value_counts() com o parâmetro bins e passando a quantidade de intervalos que queremos dividir nossos dados. Entretanto, se desejarmos realizar separações manuais e mais personalizadas, podemos usar o método pd.cut() para selecionar os intervalos fazendo cortes neles de acordo com o que desejamos.

O professor utilizou alguns parâmetros nesse método para que possamos construir a nossa tabela de frequências de maneira satisfatória. Vou explicar abaixo cada parâmetro e se ficar alguma dúvida me avisa, tá?

Para o exemplo da aula, utilizamos o pd.cut()passando para ele, com nossos dados (parâmetro x), a coluna dados["Renda"], o parâmetro bins = 17 para dividirmos os dados em 17 intervalos e o parâmetro include_lowest = True para considerarmos os valores mais à esquerda também (caso haja casos de valor 0). Já o parâmetro sort= False no value_counts() faz com que a nossa tabela de frequências não seja ordenado pela quantidade de valores em um dado intervalo, e sim de maneira crescente em relação aos intervalos. Então, nosso código seguiu esse formato:

Código:

pd.value_counts(
    pd.cut( x = dados['Renda'], bins = 17, include_lowest = True),
    sort = False )

Apresentando a saída:

(-200.001, 11764.706]       75594
(11764.706, 23529.412]       1022
(23529.412, 35294.118]        169
(35294.118, 47058.824]         19
(47058.824, 58823.529]         16
(58823.529, 70588.235]          5
(70588.235, 82352.941]          4
(82352.941, 94117.647]          1
(94117.647, 105882.353]         6
(105882.353, 117647.059]        0
(117647.059, 129411.765]        1
(129411.765, 141176.471]        0
(141176.471, 152941.176]        0
(152941.176, 164705.882]        0
(164705.882, 176470.588]        0
(176470.588, 188235.294]        0
(188235.294, 200000.0]          3
Name: Renda, dtype: int64

O output encontrado no seu exemplo tem como primeira coluna os intervalos das rendas e como segunda coluna a quantidade de registros que se encontram naquele intervalo.

Porque temos um intervalo negativo?

Usando o método describe podemos verificar, como esperado, que não existem valores negativos de renda. Ela varia de 0 até 200.000.

count     76840.000000
mean       2000.383199
std        3323.387730
min           0.000000
25%         788.000000
50%        1200.000000
75%        2000.000000
max      200000.000000
Name: Renda, dtype: float64

Então, o que explica esse intervalo negativo?

O método pd.cut() possui um parâmetro chamado right que por padrão é True, e esse parâmetro indica se os bins devem incluir a ponta dos dados mais à direita ou não, ou seja, se fixamos o último valor como o valor máximo do intervalo (logo, não são aceitos intervalos acima de 200.000) ou distribuímos os nossos dados com o primeiro valor à esquerda como o mínimo (logo, não são aceitos intervalos abaixo de 0).

Como podemos corrigir para não existir valores negativos como nosso intervalo?

Esse problema é facilmente ajustado. Nós só precisamos adicionar o parâmetro right=False no método pd.cut(). Assim o nósso código seria da seguinte forma:

pd.value_counts(
    pd.cut(x = dados['Renda'], bins = 17, include_lowest = True, right = False),
    sort = False )

Com a saída:

[0.0, 11764.706)            75594
[11764.706, 23529.412)       1022
[23529.412, 35294.118)        169
[35294.118, 47058.824)         19
[47058.824, 58823.529)         16
[58823.529, 70588.235)          5
[70588.235, 82352.941)          4
[82352.941, 94117.647)          1
[94117.647, 105882.353)         6
[105882.353, 117647.059)        0
[117647.059, 129411.765)        1
[129411.765, 141176.471)        0
[141176.471, 152941.176)        0
[152941.176, 164705.882)        0
[164705.882, 176470.588)        0
[176470.588, 188235.294)        0
[188235.294, 200200.0)          3
Name: Renda, dtype: int64

Note que agora os intervalos mais à esquerda são fechados "[" e os mais à direita são abertos ")".

Espero ter ajudado e qualquer dúvida é só chamar!

Forte abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!

Não sei se entendi direito, então o parâmetro right por padrão (True) não aceita os intervalos acima do máximo (acima de 200.000), porém aceita os intervalos abaixo do mínimo (abaixo de 0), se colocarmos como False, inverte-se, aceita-se então intervalos acima do máximo (acima de 200.000) e não aceita intervalos abaixo do mínimo (abaixo de 0). Se for isso, teria como ter a opção que não aceita os intervalos acima do valor máximo e abaixo dos valores mínimos? Aparentemente na doc. do pandas parece que não eu acho...

solução!

Olá, Marcel, tudo bem?

Desculpe a demora em respondê-lo.

O parâmetro right se você olhar a documentação apenas serve para indicar se a descrição de nossos intervalos incluem ou não limites mais à direita.

Como você pode notar no uso do describe no tópico que eu respondi mais acima, não existem valores acima de 200.000 ou abaixo de 0. Ou seja, essa questão de intervalo em essência não condiz com ter o máximo ou mínimo nos nossos dados, eles serão inclusos, mas sim em definir onde teremos o nosso intervalo aberto.

O que isso significa?

Intervalos tentam "discretizar" ou definir pequenos cortes de nossos dados. E nesses cortes existem limites de inclusão.

Imagine, por exemplo, que estamos dividindo intervalos da idade de uma população e queremos incluir uma idade nele. Supondo que os intervalos são de 10 em 10, Se quisermos colocar alguém de 20 anos, teremos dois intervalos possíveis "10 - 20" e "20-30".

E aí, em qual iremos encaixar essa idade?

É nesse ponto que entra o parâmetro right do pd.cut(). Ele definirá se eu encaixo os 20 anos no intervalo à esquerda ou no intervalo à direita.

Para conseguir responder essa pergunta e compreender essa situação, precisaremos entender a notação matemática de intervalos, que explica que o uso de parênteses ( "(" ou ")" ) indica intervalos abertos, ou seja, o valor próximo aos parênteses não é incluso no intervalo. E o uso de colchetes ( "[" ou "]" ) indica intervalos fechados, ou seja, o valor próximo ao colchete é incluso.

Visualmente, esse exemplo seria:

Exemplo1º Intervalo2º IntervaloDescrição
1º Caso(10, 20](20, 30]aberto à esquerda
2º Caso[10,20)[20,30)aberto à direita

Se quisermos posicionar a idade 20, teremos as duas opções como apresentadas na tabela. Se escolhermos o 1º caso (intervalos abertos à esquerda) a idade seria adicionada no 1º intervalo, já que o 20 está incluso neste intervalo e aberto no 2º intervalo. Mas, se quisermos escolher o 2º caso (intervalos aberto à direita) a idade seria adicionada no 2º intervalo, já que a idade está inclusa neste intervalo e aberta no 1º intervalo.

Trazendo esse exemplo para ao parâmetro right, temos que o uso de right=True contempla o 1º Caso e o right=False o 2º Caso.

Mas por que raios tinha aquele -200.001 como intervalo, sendo que meus valores começam do zero?

Justamente, pelo fato do pd.cut(), por padrão, pegar valores mais à direita (intervalo fechado à direita "]" ) era necesssário deixar o intervalo a esquerda aberto ( "(" ) em um valor negativo, pois, assim o zero estaria incluso. Por isso apareceu esse valor negativo. O que fizemos usando right=False foi justamente deixar essa questão de intervalos em aberto à direita ( ")" ) o que nos previne a existência de um intervalo antes do valor 0 (que é o nosso valor mínimo).

Espero ter ajudado e qualquer dúvida é só chamar!

Abraços e bons estudos!

Ah entendi Afonso. Valeu pela paciência e a explicação! Feliz Natal e Feliz Ano Novo para você, muita paz, saúde, alegria e festa :)

Tranquilo!

Que bom que eu consegui te ajudar nessa dúvida. Feliz Natal e Ano Novo para você também!!! hehehe