Você está na página 1de 125

01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

O que é pandas?
O pandas é uma biblioteca muito usada para análise de dados em Python,
que é uma das linguagens de programação mais populares da atualidade.
(revisado em 2020)

Uma das principais vantagens de usar Python e o pandas é que você


pode manipular uma quantidade relativamente grande de dados (arquivos de
até alguns GB) com facilidade, rapidez e com infinitas possibilidades de
análise, uma vez que você pode programar qualquer coisa e pegar ideias
emprestadas de outras bibliotecas.

O que vamos aprender neste caderno?


Vamos aprender o básico de manipulação e visualização de dados para
conseguirmos fazer por conta próprias as nossas próprias análises. A ideia é
que os comandos aqui sirvam de consulta para o futuro.

Dicas de Jupyter Notebook


Este programa que estamos usando no navegado se chama Jupyter Notebook
e é um interpretador de Python interativo, podemos digitar um comando de
Python e apertar Shift + Enter e esse comando é executado e seu resultado é
impresso na tela.

Existem alguns atalhos bastante úteis para trabalhar com Jupyter Notebook:

0. 'Esc' - Saí do modo edição da célula atual


1. 'Enter' - Edita a célula selecionada
2. 'Shift + Enter' - Executa a célula selecionada
3. 'A' - Adiciona uma nova célula acima da célula atual (nã
o pode estar em modo de edição)
4. 'B' - Adiciona uma nova célula abaixo da célula atual (n
ão pode estar em modo de edição)
5. 'X' - Deleta a célula selecionada (não pode estar em mod
o de edição)
6. 'Z' - Desfaz a deleção de uma célula (não pode estar em
modo de edição)
7. 'Ctrl + Z' - Desfaz as últimas edições
8. 'Ctrl + Shift + Z' - Refaz o último comando de desfazer
9. 'H' - Abre um arquivo de ajuda com todos os atalhos (não
pode estar em modo de edição)
10. 'Tab' - Faz sugestões para completar o código

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 1/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

11. '?função' - Mostra a documentação de uma dada função

(Modo de edição é quando você consegue editar uma célula, e modo de

Iniciando com Python

As variáveis podem conter números int e float , textos str , valores


booleanos bool , entre outras.

In [1]:

x = 10
In [2]:

Out[2]:
x
10

In [3]:

y = 5
In [4]:

Out[4]:
x + y
15

In [5]:

nome = 'José'
In [6]:

sobrenome = 'da Silva'


In [7]:

nome_completo = nome + ' ' + sobrenome


In [8]:

Out[8]:
nome_completo
'José da Silva'

Exercícios: Python Básico

1. Criar as variáveis nome e idade e atribuir valores a elas


https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 2/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

2. Juntar as variáveis por meio do comando: nome + ' ' + idade

Preparando o Ambiente
Importando as bibliotecas que iremos usar no treinamento:

In [9]:

import pandas as pd
import seaborn
Importando os dadosas sns de um arquivo '.csv' contendo dados do IGM
a partir
preparado especificamente para usarmos neste treinamento.

Em nosso código esse arquivo ficará salvo com o nome de igm

Esse arquivo foi construído a partir de uma série de colunas que compõe o
IGM e também de notas do ENEM.

In [10]:

igm = pd.read_csv('../input/igm_modificado.csv')

Temos uma variável chamada igm que está guardando algo, para
descobrirmos basta digitar igm e apertar Shift + Enter :

Primeiro Contato com os Dados

Uma das primeiras coisas a se fazer quando se pega um conjunto de dados


novo é uma rápida visualização a fim de entender melhor o que tem dentro
dele.

In [11]:

Out[11]:
igm

regiao estado municipio codigo_mun

0 SUDESTE SP ILHABELA 3520400

SANTANA DE
1 SUDESTE SP 3547304
PARNAIBA

2 SUL SC BOMBINHAS 4202453

SAO BERNARDO
3 SUDESTE SP 3548708
DO CAMPO

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 3/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

regiao estado municipio codigo_mun


CENTRO-
4 DF BRASILIA 5300108
OESTE

5 SUDESTE SP SANTOS 3548500

6 SUDESTE SP INDAIATUBA 3520509

7 SUL RS GRAMADO 4309100

BALNEARIO
8 SUL SC 4202008
CAMBORIU

9 SUL SC RIO DO SUL 4214805

10 SUDESTE SP SAO SEBASTIAO 3550704

11 SUDESTE SP JUNDIAI 3525904

12 SUL SC FLOR DO SERTAO 4205357

13 SUL SC CONCORDIA 4204301

14 SUDESTE ES VITORIA 3205309

CENTRO-
15 GO OUVIDOR 5215504
OESTE

16 SUDESTE SP SAO PAULO 3550308

17 SUDESTE SP PIRACICABA 3538709

CORDILHEIRA
18 SUL SC 4204350
ALTA

19 SUL SC CHAPECO 4204202

20 SUL RS TUPANDI 4322251

21 SUDESTE RJ NITEROI 3303302

CENTRO- CHAPADAO DO
22 GO 5205471
OESTE CEU

23 SUDESTE SP SOROCABA 3552205

24 SUL PR SANTA HELENA 4123501

CASIMIRO DE
25 SUDESTE RJ 3301306
ABREU

26 SUDESTE SP BARRETOS 3505500

CARLOS
27 SUL RS 4304804
BARBOSA

28 SUDESTE SP BURITIZAL 3508207

CENTRO-
29 MS BATAGUASSU 5001904
OESTE
... ... ... ... ...
APARECIDA DO
5540 NORTE TO 1701101
RIO NEGRO
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 4/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

regiao estado municipio codigo_mun


PINDORAMA DO
5541 NORTE TO 1717008
TOCANTINS

5542 NORTE TO ARAGUANA 1702158

5543 NORTE TO PARANA 1716208

5544 NORTE TO PALMEIRANTE 1715705

5545 NORTE TO FIGUEIROPOLIS 1707652

5546 NORTE TO SAMPAIO 1718808

5547 NORTE TO MATEIROS 1712702

5548 NORTE TO ITACAJA 1710508

5549 NORTE TO NATIVIDADE 1714203

5550 NORTE TO CRISTALANDIA 1706100

MIRACEMA DO
5551 NORTE TO 1713205
TOCANTINS

5552 NORTE TO ARAGUACEMA 1701903

SANTA MARIA DO
5553 NORTE TO 1718881
TOCANTINS

5554 NORTE TO AUGUSTINOPOLIS 1702554

5555 NORTE TO AGUIARNOPOLIS 1700301

5556 NORTE TO TOCANTINIA 1721109

5557 NORTE TO BABACULANDIA 1703008

SANTA FE DO
5558 NORTE TO 1718865
ARAGUAIA
SAO MIGUEL DO
5559 NORTE TO 1720200
TOCANTINS

5560 NORTE TO ANGICO 1701051

5561 NORTE TO ARAPOEMA 1702307

5562 NORTE TO CASEARA 1703909

5563 NORTE TO PIRAQUE 1717206

5564 NORTE TO ITAPIRATINS 1710904

5565 NORTE TO RIO DOS BOIS 1718709

AXIXA DO
5566 NORTE TO 1702901
TOCANTINS

5567 NORTE TO FILADELFIA 1707702

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 5/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

regiao estado municipio codigo_mun


PONTE ALTA DO
5568 NORTE TO 1717909
TOCANTINS

5569 NORTE TO SILVANOPOLIS 1720655

5570 rows × 32 columns

Dissecando o DataFrame (Tipo de Dados)

A visualização do DataFrame acima é composta pelos seguintes elementos:

1. Index
2. Elemento do Index
3. Colunas
4. Nome da coluna (pode ter espaço, acento e etc, mas nome
curto, simples, e representativo facilita o código)
5. '...'
6. Células (Dados)
7. NaNs

Para vermos apenas uma pequena parte, temos o comando .head() irá
mostrar por padrão as 5 primeiras linhas do que existe dentro de um conjunto
de dados dentro de um objeto do pandas.

In [12]:

Out[12]:
igm.head()

regiao estado municipio codigo_mun capital por


Peq
0 SUDESTE SP ILHABELA 3520400 0
por
SANTANA
Gra
1 SUDESTE SP DE 3547304 0
por
PARNAIBA
Peq
2 SUL SC BOMBINHAS 4202453 0
por
SAO
Gra
3 SUDESTE SP BERNARDO 3548708 0
por
DO CAMPO
CENTRO- Gra
4 DF BRASILIA 5300108 1
OESTE por
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 6/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Outras formas de selecionar uma pequena amostra de


dados:

O comando inverso ao head() é o tail() , que irá mostrar as


5 últimas linhas do DataFrame por padrão:

In [13]:

Out[13]:
igm.tail()

regiao estado municipio codigo_mun capital

5565 NORTE TO RIO DOS BOIS 1718709 0

AXIXA DO
5566 NORTE TO 1702901 0
TOCANTINS

5567 NORTE TO FILADELFIA 1707702 0

PONTE ALTA
5568 NORTE TO DO 1717909 0
TOCANTINS

5569 NORTE TO SILVANOPOLIS 1720655 0

Apesar da convenção no Python ser utilizar o .head() ou o .tail() para


olhar um DataFrame novo, algo muito mais inteligente de se fazer para ter
uma ideia representativa do DataFrame é utilizar o sample(5) , que
seleciona 5 linhas aleatórias do seu DataFrame . Se você executar o
comando algumas vezes vai obter resultados diferentes a cada iteração.

In [14]:

Out[14]:
igm.sample(5)

regiao estado municipio codigo_mun capital


CENTRO- ARAL
1246 MS 5001243 0
OESTE MOREIRA

5335 SUDESTE SP ANDRADINA 3502101 0

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 7/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

regiao estado municipio codigo_mun capital

3444 SUDESTE MG ITUIUTABA 3134202 0

ROLIM DE
1992 NORTE RO 1100288 0
MOURA

4197 NORTE AP ITAUBAL 1600253 0

Melhorando a visualização da tabela

Um truque para visualizar melhor os dados é invertendo as linhas pelas


colunas (matrix transposta), para isso basta colocar um .T depois do nosso
comando que gera uma visualização de DataFrame.

Encadeamento de funcionalidades

Podemos juntar diversos comando na mesma linha, isto é, logo após


o sample(5) , pode usar o .T , e essas funcionalidades irão funcionar em
cascata e de forma sequêncial, primeiro o sample(5) , e depois o .T

In [15]:

Out[15]:
igm.sample(5).T

3177 1973 1134


regiao NORTE SUDESTE SUL
estado PA SP RS
IGARAPE- SAO
municipio CUNHA
ACU JERONIMO
codigo_mun 1503200 3513603 4318408
capital 0 0 0
Pequeno Pequeno Pequeno
porte
porte 2 porte 2 porte 2
populacao 37,547 22,007 23,649
area 785.98 1,407.25 936.38
densidade_dem 45.7 15.5 23.6
pib 243056 167291 413216
pib_pc 6589.91 7518.35 17762.8
participacao_transf_receita 94 89 70

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 8/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

3177 1973 1134


servidores 740 13 419
comissionados 120 35 53
comissionados_por_servidor 16% 269% 13%
perc_pop_econ_ativa 0.81 1.02 1.02
taxa_empreendedorismo 0.34 0.25 0.27
anos_estudo_empreendedor 5.45253 5.56399 6.77246
jornada_trabalho 38.2904 46.6622 41.2687
gasto_pc_saude 348.48 488.67 246.03
hab_p_medico 2474.13 963.783 2127.18
exp_vida 69.55 74.54 74.34
gasto_pc_educacao 471.09 621.14 375.11
exp_anos_estudo 8.47 10.3 9.54
nota_ciencias 456.295 472.714 447.469
nota_humanas 499.372 525.376 517.544
nota_linguagem 486.732 525.145 509.465
nota_mat 443.682 483.89 467.823
nota_redacao 495.556 542.479 497.44
idhm 0.363 0.575 0.604
ranking_igm 3178º 1974º 1135º
indice_governanca 0.359 0.479 0.543

Selecionando Linhas no pandas

Outra forma de vermos os 5 primeiros registros podemos usar o comando:

In [16]:

Out[16]:
igm[0:5].T

0 1 2

regiao SUDESTE SUDESTE SUL

estado SP SP SC
SANTANA
municipio ILHABELA DE BOMB
PARNAIBA
codigo_mun 3520400 3547304 420245
capital 0 0 0
Pequeno Grande Pequen
porte
porte 2 porte porte 1

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 9/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

0 1 2
populacao 32,782 129,261 18,052
area 347.52 179.95 35.92
densidade_dem 81.1 604.7 398
pib 3.25671e+06 7.3736e+06 377357
pib_pc 105113 60939.9 23135.
participacao_transf_receita 77 51 32
servidores 1495 6157 583
comissionados 74 587 48
comissionados_por_servidor 5% 10% 8%
perc_pop_econ_ativa 1.18 1.04 1.09
taxa_empreendedorismo 0.22 0.25 0.32
anos_estudo_empreendedor 8.43613 10.8695 8.8366
jornada_trabalho 42.7262 42.5429 40.314
gasto_pc_saude 1529.48 1017.67 830.7
hab_p_medico 394.988 400.728 1126.4
exp_vida 75.56 75.92 76.86
gasto_pc_educacao 1734.52 1704.93 1370.9
exp_anos_estudo 10.63 10.01 10.44
nota_ciencias 482.054 483.998 472.10
nota_humanas 541.226 542.76 541.95
nota_linguagem 530.651 535.765 523.25
nota_mat 507.953 499.911 474.50
nota_redacao 499.361 547.507 515
idhm 0.747 0.885 0.807
ranking_igm 1º 2º 3º
indice_governanca 0.767 0.759 0.758

Outra forma de vermos os cinco últimos comandos é:

In [17]:

Out[17]:
igm[-5:].T

5565 5566 5567


regiao NORTE NORTE NORTE
estado TO TO TO
RIO
AXIXA DO
municipio DOS FILADELF
TOCANTINS
BOIS
codigo_mun 1718709 1702901 1707702
capital 0 0 0

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 10/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

5565 5566 5567


Pequeno Pequeno Pequeno
porte
porte 1 porte 1 porte 1
populacao 2,787 9,741 8,871
area 845.07 150.21 1,988.08
densidade_dem 3 61.8 4.3
pib 27136.7 80205.4 78500.7
pib_pc 9995.11 8326.98 8920.54
participacao_transf_receita NaN NaN NaN
servidores 98 429 405
comissionados 29 56 138
comissionados_por_servidor 30% 13% 34%
perc_pop_econ_ativa 0.83 0.77 0.7
taxa_empreendedorismo 0.23 0.3 0.18
anos_estudo_empreendedor 5.92872 5.40602 5.51901
jornada_trabalho 39.7767 39.2149 33.7331
gasto_pc_saude NaN NaN NaN
hab_p_medico 1370 1933.8 1470.67
exp_vida 72.69 69 72.52
gasto_pc_educacao NaN NaN NaN
exp_anos_estudo 9.26 10.11 9.38
nota_ciencias 450.613 437.36 431.232
nota_humanas 457.1 470.188 456.076
nota_linguagem 473.129 463.167 453.89
nota_mat 458.921 442.091 426.578
nota_redacao 494.286 444.198 399.024
idhm 0.413 0.439 0.425
ranking_igm NaN NaN NaN
indice_governanca NaN NaN NaN

A vantagem da forma explicitada acima é que podemos selecionar qualquer


local da tabela, não estando restritos as primeiras linhas. Por exemplo, o
comando a seguir seleciona as linhas 20 até 29:

In [18]:

Out[18]:
igm[20:30].T

20 21 22
CENTRO
regiao SUL SUDESTE
OESTE
estado RS RJ GO

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 11/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

20 21 22
CHAPAD
municipio TUPANDI NITEROI
DO CEU
codigo_mun 4322251 3303302 5205471
capital 0 0 0
Pequeno Pequeno
porte Grande porte
porte 1 porte 1
populacao 4,421 497,883 8,853
area 59.54 133.92 2,185.12
densidade_dem 65.9 3,640.80 3.2
pib 315220 1.99085e+07 920448
pib_pc 74204.2 40284.3 114455
participacao_transf_receita 83 44 69
servidores 211 8069 319
comissionados 47 2313 152
comissionados_por_servidor 22% 29% 48%
perc_pop_econ_ativa 1.37 1.04 1.13
taxa_empreendedorismo 0.32 0.23 0.17
anos_estudo_empreendedor 6.07866 11.4691 7.67473
jornada_trabalho 48.1071 39.6601 41.4746
gasto_pc_saude 1051.32 387.87 1166.68
hab_p_medico 430.9 1182.51 1039.75
exp_vida 75.18 76.23 75.2
gasto_pc_educacao 1515.19 315.29 1435.33
exp_anos_estudo 8.73 9.68 9.45
nota_ciencias 489.912 525.791 464.188
nota_humanas 557.019 583.141 511.89
nota_linguagem 541.564 554.622 506.294
nota_mat 544.64 555.132 484.97
nota_redacao 549.6 639.916 480
idhm 0.656 0.94 0.714
ranking_igm 21º 22º 23º
indice_governanca 0.693 0.693 0.691

Slicing no Pandas

O nome dessa operação de colocar algo entre colchetes é slicing, e isso como
convenção geral é uma forma de selecionar um subconjunto de dados.

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 12/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

[20:30] vai selecionar exatamente 10 elementos (30 - 20). O número da direita


menos o número da esquerda é sempre o total de elementos que serão
selecionados, e isso é uma convenção no Python.

O número 20 é selecionado por ser um intervalo fechado na esquerda, e o


número 30 não é selecionado por ser um intervalo aberto na direita. O que é
outra convenção do Python.

Selecionando colunas

Para selecionarmos colunas no pandas, basta dizermos o nome do


DataFrame seguido por colchetes com o nome da coluna dentro:

Nome do Dataframe: igm

Colchetes com a coluna dentro: ['Porte do Município']

Comando completo: igm['Porte do Município']

In [19]:
Out[19]:
igm['porte']
0 Pequeno porte 2
1 Grande porte
2 Pequeno porte 1
3 Grande porte
4 Grande porte
5 Grande porte
6 Grande porte
7 Pequeno porte 2
8 Grande porte
9 Médio porte
10 Médio porte
11 Grande porte
12 Pequeno porte 1
13 Médio porte
14 Grande porte
15 Pequeno porte 1
16 Grande porte
17 Grande porte
18 Pequeno porte 1
19 Grande porte
20 Pequeno porte 1
21 Grande porte
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 13/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

22 Pequeno porte 1
23 Grande porte
24 Pequeno porte 2
25 Pequeno porte 2
26 Grande porte
27 Pequeno porte 2
28 Pequeno porte 1
29 Pequeno porte 2
...
5540 Pequeno porte 1
5541 Pequeno porte 1
5542 Pequeno porte 1
5543 Pequeno porte 1
5544 Pequeno porte 1
5545 Pequeno porte 1
5546 Pequeno porte 1
5547 Pequeno porte 1
5548 Pequeno porte 1
5549 Pequeno porte 1
5550 Pequeno porte 1
5551 Pequeno porte 1
5552 Pequeno porte 1
5553 Pequeno porte 1
5554 Pequeno porte 1
5555 Pequeno porte 1
5556 Pequeno porte 1
5557 Pequeno porte 1
5558 Pequeno porte 1
5559 Pequeno porte 1
5560 Pequeno porte 1
5561 Pequeno porte 1
5562 Pequeno porte 1
5563 Pequeno porte 1
5564 Pequeno porte 1
5565 Pequeno porte 1
5566 Pequeno porte 1
5567 Pequeno porte 1
5568 Pequeno porte 1
5569 Pequeno porte 1
Name: porte, Length: 5570, dtype: object

Selecionando Múltiplas Colunas

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 14/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Podemos selecionar multiplas colunas com o comando igm[['municipio',


'indice_governanca']] :

In [20]:

Out[20]:
igm[['municipio', 'indice_governanca']]

municipio indice_governanca
0 ILHABELA 0.767
1 SANTANA DE PARNAIBA 0.759
2 BOMBINHAS 0.758
3 SAO BERNARDO DO CAMPO 0.756
4 BRASILIA 0.736
5 SANTOS 0.731
6 INDAIATUBA 0.727
7 GRAMADO 0.727
8 BALNEARIO CAMBORIU 0.726
9 RIO DO SUL 0.720
10 SAO SEBASTIAO 0.714
11 JUNDIAI 0.712
12 FLOR DO SERTAO 0.707
13 CONCORDIA 0.703
14 VITORIA 0.702
15 OUVIDOR 0.700
16 SAO PAULO 0.694
17 PIRACICABA 0.693
18 CORDILHEIRA ALTA 0.693
19 CHAPECO 0.693
20 TUPANDI 0.693
21 NITEROI 0.693
22 CHAPADAO DO CEU 0.691
23 SOROCABA 0.691
24 SANTA HELENA 0.690
25 CASIMIRO DE ABREU 0.689
26 BARRETOS 0.689
27 CARLOS BARBOSA 0.688
28 BURITIZAL 0.688
29 BATAGUASSU 0.685
... ... ...
5540 APARECIDA DO RIO NEGRO NaN
5541 PINDORAMA DO TOCANTINS NaN
5542 ARAGUANA NaN
5543 PARANA NaN
5544 PALMEIRANTE NaN

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 15/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

municipio indice_governanca
5545 FIGUEIROPOLIS NaN
5546 SAMPAIO NaN
5547 MATEIROS NaN
5548 ITACAJA NaN
5549 NATIVIDADE NaN
5550 CRISTALANDIA NaN
5551 MIRACEMA DO TOCANTINS NaN
5552 ARAGUACEMA NaN
5553 SANTA MARIA DO TOCANTINS NaN
5554 AUGUSTINOPOLIS NaN
5555 AGUIARNOPOLIS NaN
5556 TOCANTINIA NaN
5557 BABACULANDIA NaN
5558 SANTA FE DO ARAGUAIA NaN
5559 SAO MIGUEL DO TOCANTINS NaN
5560 ANGICO NaN
5561 ARAPOEMA NaN
5562 CASEARA NaN
5563 PIRAQUE NaN
5564 ITAPIRATINS NaN
5565 RIO DOS BOIS NaN
5566 AXIXA DO TOCANTINS NaN
5567 FILADELFIA NaN
5568 PONTE ALTA DO TOCANTINS NaN
5569 SILVANOPOLIS NaN

5570 rows × 2 columns

Exercícios: Seleções Básicas

1. Selecionar as 10 primeiras linhas mostrando as


colunas municipio, estado e idhm.
2. Selecionar das linhas 15 a 24 os valores da coluna municipio

Dissecando Series (Tipo de Dados)

In [21]:
Out[21]:
type(igm['porte'])
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 16/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

pandas.core.series.Series

Quando selecionamos uma coluna, o nosso resultado é um objeto do


tipo Series , que é basicamente a forma do pandas representar uma coluna.
Uma Series é composta pelos seguintes elementos:

1. Index
2. Index label
3. Hidden values
4. Series Name
5. Lenght
6. dtype

Fazendo Operações de Agregamento:

Vamos contar quantos valores da coluna porte temos para cada tipo com o
comando value_counts() :

In [22]:

Out[22]:
igm['porte'].value_counts()
Pequeno porte 1 3810
Pequeno porte 2 1101
Médio porte 350
Grande porte 309
Name: porte, dtype: int64

Plotando Nosso Primeiro Gráfico

Para garantir que nossos gráficos vão ser plotados em todas as versões
do Jupyter Notebook precisamos rodar o comando abaixo:

In [23]:

%matplotlib inline

Com bastante facilidade podemos plotar um gráfico com os valores acima,


https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 17/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

basta colocar .plot.bar() na sequência.

In [24]:

Out[24]:
igm['porte'].value_counts().plot.bar()
<matplotlib.axes._subplots.AxesSubplot at 0x7f78
6d8381d0>

Exercícios: Series

1. Contar o número de munícipios por estado


2. Plotar gráfico de número de munícipios por estado

Operações de Agregamento Numéricas

Vamos criar uma variável chamada ind_des para guarda a


nossa Series relativa a coluna indice_governanca

In [25]:

ind_des = igm['indice_governanca']

Vamos contar a quantidade de elementos em ind_des

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 18/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Para verificarmos quais são os valores em branco podemos usar


o isnull() , que nos retornar uma Series com
valores True ou False de acordo com se os valores estiverem em branco
ou não.

In [26]:
Out[26]:
ind_des.count()
3303

Note que o .count() não contabiliza valores em branco, se quisermos ver


os valores em branco temos que usar o atributo .size , que não tem
paranteses

In [27]:

Out[27]:
ind_des.size
5570

In [28]:
Out[28]:
ind_des.isnull()
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 False
12 False
13 False
14 False
15 False
16 False
17 False
18 False

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 19/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

19 False
20 False
21 False
22 False
23 False
24 False
25 False
26 False
27 False
28 False
29 False
...
5540 True
5541 True
5542 True
5543 True
5544 True
5545 True
5546 True
5547 True
5548 True
5549 True
5550 True
5551 True
5552 True
5553 True
5554 True
5555 True
5556 True
5557 True
5558 True
5559 True
5560 True
5561 True
5562 True
5563 True
5564 True
5565 True
5566 True
5567 True
5568 True
5569 True
Name: indice_governanca, Length: 5570, dtype:
bool

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 20/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Uma forma de melhor utilizarmos essa informação é contabilizando o total de


valores em branco, note que True tem valor 1 e False tem valor 0 ,
portanto se somarmos todos os elementos, teremos o total de valores em
branco.

In [29]:

Out[29]:
ind_des.isnull().sum()
2267

Podemos remover esses valores em branco com um simples comando,


o dropna() .

In [30]:

Out[30]:
ind_des.dropna()
0 0.767
1 0.759
2 0.758
3 0.756
4 0.736
5 0.731
6 0.727
7 0.727
8 0.726
9 0.720
10 0.714
11 0.712
12 0.707
13 0.703
14 0.702
15 0.700
16 0.694
17 0.693
18 0.693
19 0.693
20 0.693
21 0.693
22 0.691
23 0.691
24 0.690
25 0.689
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 21/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

26 0.689
27 0.688
28 0.688
29 0.685
...
3273 0.330
3274 0.329
3275 0.328
3276 0.326
3277 0.323
3278 0.323
3279 0.322
3280 0.320
3281 0.319
3282 0.319
3283 0.319
3284 0.317
3285 0.316
3286 0.315
3287 0.314
3288 0.313
3289 0.310
3290 0.308
3291 0.308
3292 0.308
3293 0.307
3294 0.305
3295 0.304
3296 0.299
3297 0.298
3298 0.296
3299 0.282
3300 0.279
3301 0.278
3302 0.258
Name: indice_governanca, Length: 3303, dtype:
float64

Ele retornou os valores, e podemos ver que não tem nenhum valor em branco,
mas vamos verificar de fato para ver se mudamos os nossos valores:

In [31]:
Out[31]:

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 22/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

ind_des.isnull().sum()
2267

Não mudou, por que isso aconteceu? Uma série de funções no pandas não
alteram o objeto em questão, porque muitas vezes estamos fazendo
transformações temporárias para gerar uma visualização ou análise, para
mudar o objeto temos que passar um parâmetro a mais que é
o inplace=True .

In [32]:

ind_des.dropna(inplace=True)

Vamos verificar novamente se temos valores em branco no nosso conjunto de


dados:

In [33]:

Out[33]:
ind_des.isnull().sum()
0

Selecionando o valor mínimo do índice de desempenho

In [34]:

Out[34]:
ind_des.min()
0.258

Selecionando o valor máximo do índice de desempenho

In [35]:

Out[35]:
ind_des.max()
0.767

Olhando a média dos valores:

In [36]:

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 23/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Out[36]:
ind_des.mean()

0.5019585225552526

Olhando o desvio padrão dos valores:

In [37]:
Out[37]:
ind_des.std()
0.08370404317359417

Tendo uma visão geral do Índice de Governança

Um comando muito útil para avaliar uma Series é o .describe() , que irá
calcular os quartis, valores máximo, mínimo, a média e o desvio padrão.

In [38]:
Out[38]:
ind_des.describe()
count 3303.000000
mean 0.501959
std 0.083704
min 0.258000
25% 0.438000
50% 0.504000
75% 0.566000
max 0.767000
Name: indice_governanca, dtype: float64

Usando o .describe() em um DataFrame

O bom é que o describe() também funciona em um DataFrame , e por


padrão apenas para as colunas numéricas:

In [39]:

Out[39]:
igm.describe()
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 24/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

codigo_mun capital pib pib_pc


count 5.570000e+03 5570.000000 5.570000e+03 5570.000000
mean 3.253591e+06 0.004847 9.544801e+05 17374.48310
std 9.849103e+05 0.069461 9.502661e+06 20133.34119
min 1.100015e+06 0.000000 9.678440e+03 3241.290000
25% 2.512126e+06 0.000000 5.922529e+04 7077.357500
50% 3.146280e+06 0.000000 1.301531e+05 12621.81000
75% 4.119190e+06 0.000000 3.426808e+05 21262.38750
max 5.300108e+06 1.000000 5.707062e+08 715193.7000

Exercícios: Agregações Númericas

1. Utilize o .min(), .max(), e .mean() para avaliar os dados da


coluna exp_vida
2. Utilize o .describe() para avaliar os dados da coluna idhm

Plotando um Histograma do Índice de


Governança

In [40]:

Out[40]:
ind_des.hist()
<matplotlib.axes._subplots.AxesSubplot at 0x7f78
6c787240>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 25/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Primeiros Gráficos com o Seaborn


O Python tem diversas ferramentas para plotar gráficos, uma das mais fáceis
e poderosas de usar é o seaborn que foi importado no começo do nosso
código com o comando import seaborn as sns.

In [41]:

sns.kdeplot(ind_des)
/opt/conda/lib/python3.6/site-packages/scipy/sta
ts/stats.py:1713: FutureWarning: Using a non-tup
le sequence for multidimensional indexing is dep
recated; use `arr[tuple(seq)]` instead of `arr[s
eq]`. In the future this will be interpreted as
an array index, `arr[np.array(seq)]`, which will
result either in an error or a different result.
return np.add.reduce(sorted[indexer] * weight
s, axis=axis) / sumval

Out[41]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
6c582978>

Um gráfico ligeiramente diferente, mas que a além da linha plota as bins do


histograma.

In [42]:

sns.distplot(ind_des.dropna())
/opt/conda/lib/python3.6/site-packages/scipy/s
tats/stats.py:1713: FutureWarning: Using a non
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 26/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

-tuple sequence for multidimensional indexing


is deprecated; use `arr[tuple(seq)]` instead o
f `arr[seq]`. In the future this will be inter
preted as an array index, `arr[np.array(seq)]
`, which will result either in an error or a d
ifferent result.
return np.add.reduce(sorted[indexer] * weigh
ts, axis=axis) / sumval

Out[42]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
6d7b4668>

Exercícios: Histogramas

1. Plote um histograma do gasto_pc_educacao


2. Plote um sns.kdeplot() do gasto_pc_educacao
3. Plote um sns.distplot() do gasto_pc_educacao
4. Utilize o .describe() para ver os valores numéricos
do gasto_pc_educacao

Fazendo Filtros

Tem alguns jeitos de selecionar subconjuntos, podemos escolher todas as


cidades que pertençam a região nordeste utilizando o comando abaixo:

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 27/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

In [43]:

Out[43]:
igm[igm['regiao']=='NORDESTE']

regiao estado municipio codigo_mun ca

67 NORDESTE PE IPOJUCA 2607208 0

77 NORDESTE CE FORTALEZA 2304400 1

MATA DE SAO
236 NORDESTE BA 2921005 0
JOAO
JOAO
241 NORDESTE PB 2507507 1
PESSOA

261 NORDESTE CE EUSEBIO 2304285 0

308 NORDESTE PI TERESINA 2211001 1

319 NORDESTE SE ARACAJU 2800308 1

354 NORDESTE BA SALVADOR 2927408 1

396 NORDESTE PE RECIFE 2611606 1

404 NORDESTE BA MAETINGA 2919959 0

410 NORDESTE MA SAO LUIS 2111300 1

441 NORDESTE RN NATAL 2408102 1

453 NORDESTE CE SOBRAL 2312908 0

481 NORDESTE PB CABEDELO 2503209 0

566 NORDESTE BA CAIRU 2905404 0

567 NORDESTE CE MARACANAU 2307650 0

598 NORDESTE CE HORIZONTE 2305233 0

JUAZEIRO DO
680 NORDESTE CE 2307304 0
NORTE
SAO
749 NORDESTE RN GONCALO DO 2412005 0
AMARANTE
LUIS
826 NORDESTE BA EDUARDO 2919553 0
MAGALHAES
FEIRA DE
837 NORDESTE BA 2910800 0
SANTANA

874 NORDESTE BA CAMACARI 2905701 0

906 NORDESTE RN EXTREMOZ 2403608 0

AGUA
972 NORDESTE PI 2200202 0
BRANCA

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 28/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

regiao estado municipio codigo_mun ca


MADRE DE
994 NORDESTE BA 2919926 0
DEUS

1002 NORDESTE CE BEBERIBE 2302206 0

BARRA DOS
1028 NORDESTE SE 2800605 0
COQUEIROS

1029 NORDESTE BA MARACAS 2920502 0

1061 NORDESTE PE TRIUNFO 2615706 0

1130 NORDESTE AL ARAPIRACA 2700300 0

... ... ... ... ... ...

5154 NORDESTE RN ANGICOS 2400802 0

LAGOA
5155 NORDESTE RN 2406205 0
D'ANTA

5156 NORDESTE RN LUIS GOMES 2407005 0

5157 NORDESTE RN GUAMARE 2404507 0

MONTE
5158 NORDESTE RN 2407807 0
ALEGRE
RAFAEL
5159 NORDESTE RN 2410504 0
FERNANDES
RAFAEL
5160 NORDESTE RN 2410603 0
GODEIRO

5227 NORDESTE SE PEDRA MOLE 2805000 0

5228 NORDESTE SE CUMBE 2801900 0

5229 NORDESTE SE LARANJEIRAS 2803609 0

5230 NORDESTE SE MALHADOR 2803906 0

5231 NORDESTE SE MURIBECA 2804300 0

5232 NORDESTE SE SIMAO DIAS 2807105 0

SANTA ROSA
5233 NORDESTE SE 2806503 0
DE LIMA

5234 NORDESTE SE CANHOBA 2801108 0

ILHA DAS
5235 NORDESTE SE 2802700 0
FLORES
SAO
5236 NORDESTE SE 2806909 0
FRANCISCO
SAO MIGUEL
5237 NORDESTE SE 2807006 0
DO ALEIXO

5238 NORDESTE SE MACAMBIRA 2803708 0

MALHADA
5239 NORDESTE SE 2803807 0
DOS BOIS
BREJO
5240 NORDESTE SE 2800704 0
GRANDE
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 29/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

regiao estado municipio codigo_mun ca


RIACHAO DO
5241 NORDESTE SE 2805802 0
DANTAS

5242 NORDESTE SE SALGADO 2806206 0

5243 NORDESTE SE CAPELA 2801306 0

5244 NORDESTE SE ITABAIANA 2802908 0

SAO
5245 NORDESTE SE 2806800 0
DOMINGOS
CEDRO DE
5246 NORDESTE SE 2801603 0
SAO JOAO

5247 NORDESTE SE POCO VERDE 2805505 0

NOSSA
5248 NORDESTE SE SENHORA DE 2804706 0
LOURDES

5249 NORDESTE SE ITABI 2803104 0

1794 rows × 32 columns

Quando rodamos o comando igm['Região']=='NORDESTE' temos um


resultado (em forma de Series) de True (Verdadeiro) ou False (Falso) de
acordo com o índice do elemento.

In [44]:

Out[44]:
igm['regiao']=='NORDESTE'
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
8 False
9 False
10 False
11 False
12 False
13 False
14 False

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 30/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

15 False
16 False
17 False
18 False
19 False
20 False
21 False
22 False
23 False
24 False
25 False
26 False
27 False
28 False
29 False
...
5540 False
5541 False
5542 False
5543 False
5544 False
5545 False
5546 False
5547 False
5548 False
5549 False
5550 False
5551 False
5552 False
5553 False
5554 False
5555 False
5556 False
5557 False
5558 False
5559 False
5560 False
5561 False
5562 False
5563 False
5564 False
5565 False
5566 False
5567 False
5568 False

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 31/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

5569 False
Name: regiao, Length: 5570, dtype: bool

Podemos guardar esse resultado dentro de uma variável:

In [45]:

filtro = igm['regiao']=='NORDESTE'

E executar o filtro em seguida:

In [46]:
Out[46]:
igm[filtro].T

67 77 236
regiao NORDESTE NORDESTE NORD
estado PE CE BA

MATA
municipio IPOJUCA FORTALEZA
SAO J

codigo_mun 2607208 2304400 29210


capital 0 1 0
Peque
porte Médio porte Grande porte
porte
populacao 92,965 2,609,716 46,39
area 527.11 314.93 633.2
densidade_dem 153 7,786.40 63.5
pib 8.41156e+06 4.97459e+07 98182
pib_pc 95666.3 19494.4 22044
participacao_transf_receita 67 53 51
servidores 2662 27093 1200
comissionados 1907 2201 458
comissionados_por_servidor 72% 8% 38%
perc_pop_econ_ativa 0.82 1 0.88
taxa_empreendedorismo 0.16 0.22 0.2
anos_estudo_empreendedor 6.34631 8.57994 7.803
jornada_trabalho 43.8269 39.9163 38.49
gasto_pc_saude 1208.11 620.43 602.1
hab_p_medico 521.279 NaN 766
exp_vida 71.44 74.41 74.09
gasto_pc_educacao 1779.61 382.8 1232.
exp_anos_estudo 8.65 10.04 8.65
nota_ciencias 463.458 492.417 448.6

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 32/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

67 77 236
nota_humanas 505.182 542.763 508.2
nota_linguagem 503.077 525.145 493.7
nota_mat 449.238 500.962 442.0
nota_redacao 480.989 574.68 472.3
idhm 0.42 0.742 0.537
ranking_igm 68º 78º 237º
indice_governanca 0.659 0.656 0.622

Explorando Dados do Nordeste

Para facilitar nossa vida, vamos criar uma variável já filtrada


chamada nordeste :

In [47]:

nordeste = igm[filtro]

Agora temos um DataFrame apenas com cidades do Nordeste.

In [48]:

Out[48]:
nordeste.sample(5).T

1591 3096 2805


regiao NORDESTE NORDESTE NORD
estado PE BA PI
PAJEU
municipio SALGUEIRO PIRIPA
PIAUI
codigo_mun 2612208 2924702 22073
capital 0 0 0
Pequeno Peque
porte Médio porte
porte 1 porte 1
populacao 60,117 12,035 3,321
area 1,686.82 511.76 986.95
densidade_dem 33.6 29.1 3.1
pib 694444 54125.2 17505
pib_pc 11762.9 4269.22 5059.3
participacao_transf_receita 66 97 98
servidores 1130 424 122
comissionados 127 10 38

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 33/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

1591 3096 2805


comissionados_por_servidor 11% 2% 31%
perc_pop_econ_ativa 0.84 0.7 0.94
taxa_empreendedorismo 0.22 0.18 0.2
anos_estudo_empreendedor 6.64886 5.12752 4.2857
jornada_trabalho 39.2516 33.5506 37.041
gasto_pc_saude 341.15 384.58 740.73
hab_p_medico 3713.06 1556.5 695.8
exp_vida 72.92 71.1 68.9
gasto_pc_educacao 615.37 596.22 796.99
exp_anos_estudo 9.56 7.3 10.1
nota_ciencias 471.376 459.734 460.04
nota_humanas 520.168 501.058 506.90
nota_linguagem 508.326 487.809 482.94
nota_mat 478.617 461.997 446.62
nota_redacao 527.424 503.385 514
idhm 0.539 0.315 0.277
ranking_igm 1592º 3097º 2806º
indice_governanca 0.509 0.375 0.406

Se utilizarmos uma seleção de coluna indice_governanca e


o .describe() , iremos ver o detalhamento dos dados dessa coluna de
acordo com o método .describe()

In [49]:

Out[49]:
nordeste['perc_pop_econ_ativa'].describe()
count 1794.000000
mean 0.791488
std 0.122635
min 0.290000
25% 0.710000
50% 0.790000
75% 0.870000
max 1.300000
Name: perc_pop_econ_ativa, dtype: float64

Podemos plotar essa distribuição para o Nordeste:

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 34/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

In [50]:
Out[50]:
nordeste['perc_pop_econ_ativa'].hist(bins=50)
<matplotlib.axes._subplots.AxesSubplot at 0x7f78
69c2f320>

Exercícios: Filtros

1. Crie um filtro chamado meu_filtro para selecionar apenas as linhas


onde os valores da coluna pib_pc sejam maiores do que 50000
2. Crie um novo DataFrame chamado igm_filtrado_pib_pcaplicando
o meu_filtro no igm
3. Utilize o método .describe() na
coluna pib_pc do igm_filtrado_pib_pc
4. Plote um histograma da coluna pib_pc do igm_filtrado_pib_pc

Fazendo Filtros com Valores Negativos

Para pegarmos o valor negativo de uma sequência de True ou False ,


podemos usar o ~

In [51]:

filtro_nordeste = ~nordeste['perc_pop_econ_ativa'].isnull()

Ordenando um DataFrame que possui uma coluna


com NaNs
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 35/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Para ordernamos um dataframe por uma coluna basta usarmos o


comando .sort_values() com o parâmetro by=nome_da_coluna . O
parâmetro ascending=False serve para pegarmos os itens em ordem
decrescente.

In [52]:

Out[52]:
nordeste[filtro_nordeste].sort_values(by='perc_pop_econ_ativ
a', ascending=False)[0:5].T
5005 4060 2423
regiao NORDESTE NORDESTE NORDEST
estado PE PI PE
FERNANDO SANTA
SAO JOSE
municipio DE CRUZ DO
DO PIAUI
NORONHA CAPIBAR
codigo_mun 2605459 2210201 2612505
capital 0 0 0
Pequeno Pequeno
porte Grande po
porte 1 porte 1
populacao 2,974 6,606 103,660
area 17.02 364.95 335.31
densidade_dem 154.6 18.1 261.2
pib 75674 35426 1.11505e+
pib_pc 26674 5350.55 11506.3
participacao_transf_receita NaN 94 80
servidores NaN 272 1279
comissionados 32 7 250
comissionados_por_servidor #DIV/0! 3% 20%
perc_pop_econ_ativa 1.3 1.18 1.16
taxa_empreendedorismo 0.28 0.2 0.41
anos_estudo_empreendedor 9.02845 3.69642 5.87179
jornada_trabalho 47.3527 36.8904 41.2779
gasto_pc_saude NaN 334.82 286.66
hab_p_medico NaN 1653.75 4725.33
exp_vida 75.36 67.02 73.35
gasto_pc_educacao NaN 565.31 380.68
exp_anos_estudo 10.76 9.12 8.34
nota_ciencias 483.8 449.5 472.55
nota_humanas 548.046 489.55 530.973
nota_linguagem 528.269 472.304 512.221
nota_mat 467.531 430.717 484.59
nota_redacao 540 496.538 549.647
idhm 0.823 NaN 0.489
ranking_igm NaN NaN 2424º
indice_governanca NaN NaN 0.442

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 36/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Usando vários filtros ao mesmo tempo

Vamos criar um novo filtro para o DataFrame inteiro e não só para o


Nordeste.

In [53]:

filtro_2 = ~igm['perc_pop_econ_ativa'].isnull()

Outra forma de escrever isso é utilizando dois filtros ao mesmo tempo, para
isso temos que usar o operador lógico & que representa E , também temos
a oportunidade usar o operador lógico | , que significa OU :

In [54]:

Out[54]:
igm[filtro & filtro_2].sort_values(by='perc_pop_econ_ativa',
ascending=False)[0:5].T
5005 4060 2423
regiao NORDESTE NORDESTE NORD
estado PE PI PE
FERNANDO SANTA
SAO JOSE
municipio DE CRUZ
DO PIAUI
NORONHA CAPIBA
codigo_mun 2605459 2210201 261250
capital 0 0 0
Pequeno Pequeno
porte Grande
porte 1 porte 1
populacao 2,974 6,606 103,66
area 17.02 364.95 335.31
densidade_dem 154.6 18.1 261.2
pib 75674 35426 1.1150
pib_pc 26674 5350.55 11506.
participacao_transf_receita NaN 94 80
servidores NaN 272 1279
comissionados 32 7 250
comissionados_por_servidor #DIV/0! 3% 20%
perc_pop_econ_ativa 1.3 1.18 1.16
taxa_empreendedorismo 0.28 0.2 0.41
anos_estudo_empreendedor 9.02845 3.69642 5.8717
jornada_trabalho 47.3527 36.8904 41.277
gasto_pc_saude NaN 334.82 286.66

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 37/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

5005 4060 2423


hab_p_medico NaN 1653.75 4725.3
exp_vida 75.36 67.02 73.35
gasto_pc_educacao NaN 565.31 380.68
exp_anos_estudo 10.76 9.12 8.34
nota_ciencias 483.8 449.5 472.55
nota_humanas 548.046 489.55 530.97
nota_linguagem 528.269 472.304 512.22
nota_mat 467.531 430.717 484.59
nota_redacao 540 496.538 549.64
idhm 0.823 NaN 0.489
ranking_igm NaN NaN 2424º
indice_governanca NaN NaN 0.442

Avaliando o tamanho dos DataFrames e Series

Para sabermos o tamanho de um DataFrame usamos o comando .shape

In [55]:

Out[55]:
igm.shape
(5570, 32)

O DataFrame feito a partir do filtro é menor como de se esperar:

In [56]:

Out[56]:
nordeste.shape
(1794, 32)

Podemos fazer o .shape de uma Series

In [57]:

Out[57]:
igm['municipio'].shape

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 38/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

(5570,)

Note pelo comando a seguir como o shape é diferente entre a seleção com:

1. [] - Series - 1 dimensão
2. [[]] - DataFrame - 2 dimensões

In [58]:

Out[58]:
igm[['municipio']].shape
(5570, 1)

Podemos usar o .shape em uma Series também, que nos retornará


apenas 1 dimensão.

In [59]:

Out[59]:
filtro.shape
(5570,)

Note que o filtro_nordeste tem o mesmo número de linhas


do DataFrame que o originou

In [60]:

Out[60]:
filtro_nordeste.shape
(1794,)

Note que o segundo filtro que utilizamos tem o mesmo tamanho do primeiro
filtro e do DataFrame original

In [61]:

Out[61]:
filtro_2.shape
(5570,)

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 39/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

De preferência devemos usar um filtro do mesmo tamanho que


um DataFrame para fazer as seleções. Mas se jogarmos um filtro maior em
um DataFrame que é um subconjunto do DataFrame original, irá funcionar
porque ele irá se guiar pelo index , mas irá retornar um aviso.

Se algum aviso desse tipo acontecer, você já tem uma boa ideia do que pode
ter acontecido.

In [62]:

nordeste[filtro_2]
/opt/conda/lib/python3.6/site-packages/ipykernel
_launcher.py:1: UserWarning: Boolean Series key
will be reindexed to match DataFrame index.
"""Entry point for launching an IPython kerne
l.

Out[62]:

regiao estado municipio codigo_mun ca

67 NORDESTE PE IPOJUCA 2607208 0

77 NORDESTE CE FORTALEZA 2304400 1

MATA DE SAO
236 NORDESTE BA 2921005 0
JOAO
JOAO
241 NORDESTE PB 2507507 1
PESSOA

261 NORDESTE CE EUSEBIO 2304285 0

308 NORDESTE PI TERESINA 2211001 1

319 NORDESTE SE ARACAJU 2800308 1

354 NORDESTE BA SALVADOR 2927408 1

396 NORDESTE PE RECIFE 2611606 1

404 NORDESTE BA MAETINGA 2919959 0

410 NORDESTE MA SAO LUIS 2111300 1

441 NORDESTE RN NATAL 2408102 1

453 NORDESTE CE SOBRAL 2312908 0

481 NORDESTE PB CABEDELO 2503209 0

566 NORDESTE BA CAIRU 2905404 0

567 NORDESTE CE MARACANAU 2307650 0

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 40/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

regiao estado municipio codigo_mun ca

598 NORDESTE CE HORIZONTE 2305233 0

JUAZEIRO DO
680 NORDESTE CE 2307304 0
NORTE
SAO
749 NORDESTE RN GONCALO DO 2412005 0
AMARANTE
LUIS
826 NORDESTE BA EDUARDO 2919553 0
MAGALHAES
FEIRA DE
837 NORDESTE BA 2910800 0
SANTANA

874 NORDESTE BA CAMACARI 2905701 0

906 NORDESTE RN EXTREMOZ 2403608 0

AGUA
972 NORDESTE PI 2200202 0
BRANCA
MADRE DE
994 NORDESTE BA 2919926 0
DEUS

1002 NORDESTE CE BEBERIBE 2302206 0

BARRA DOS
1028 NORDESTE SE 2800605 0
COQUEIROS

1029 NORDESTE BA MARACAS 2920502 0

1061 NORDESTE PE TRIUNFO 2615706 0

1130 NORDESTE AL ARAPIRACA 2700300 0

... ... ... ... ... ...

5154 NORDESTE RN ANGICOS 2400802 0

LAGOA
5155 NORDESTE RN 2406205 0
D'ANTA

5156 NORDESTE RN LUIS GOMES 2407005 0

5157 NORDESTE RN GUAMARE 2404507 0

MONTE
5158 NORDESTE RN 2407807 0
ALEGRE
RAFAEL
5159 NORDESTE RN 2410504 0
FERNANDES
RAFAEL
5160 NORDESTE RN 2410603 0
GODEIRO

5227 NORDESTE SE PEDRA MOLE 2805000 0

5228 NORDESTE SE CUMBE 2801900 0

5229 NORDESTE SE LARANJEIRAS 2803609 0

5230 NORDESTE SE MALHADOR 2803906 0

5231 NORDESTE SE MURIBECA 2804300 0

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 41/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

regiao estado municipio codigo_mun ca

5232 NORDESTE SE SIMAO DIAS 2807105 0

SANTA ROSA
5233 NORDESTE SE 2806503 0
DE LIMA

5234 NORDESTE SE CANHOBA 2801108 0

ILHA DAS
5235 NORDESTE SE 2802700 0
FLORES
SAO
5236 NORDESTE SE 2806909 0
FRANCISCO
SAO MIGUEL
5237 NORDESTE SE 2807006 0
DO ALEIXO

5238 NORDESTE SE MACAMBIRA 2803708 0

MALHADA
5239 NORDESTE SE 2803807 0
DOS BOIS
BREJO
5240 NORDESTE SE 2800704 0
GRANDE
RIACHAO DO
5241 NORDESTE SE 2805802 0
DANTAS

5242 NORDESTE SE SALGADO 2806206 0

5243 NORDESTE SE CAPELA 2801306 0

5244 NORDESTE SE ITABAIANA 2802908 0

SAO
5245 NORDESTE SE 2806800 0
DOMINGOS
CEDRO DE
5246 NORDESTE SE 2801603 0
SAO JOAO

5247 NORDESTE SE POCO VERDE 2805505 0

NOSSA
5248 NORDESTE SE SENHORA DE 2804706 0
LOURDES

5249 NORDESTE SE ITABI 2803104 0

1794 rows × 32 columns

Exercícios: Mais Filtros e Shape

1. Crie um filtro chamado filtro_com_idhm que selecione as cidades


que não tenham o idhm em branco.
2. Crie um filtro chamado filtro_trabalho que selecione as cidades
que o valor de jornada_trabalho seja maior do que 50
3. Crie um novo DataFrame chamado igm_idhm_e_trabalho que
use os filtros filtro_com_idhm e filtro_trabalho com o
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 42/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

operador E - &
4. Crie um novo DataFrame chamado igm_idhm_ou_trabalho que
use os filtros filtro_com_idhm e filtro_trabalho com o
operador OU - |
5. Pegue o .shape dos DataFrames dos itens 3 e 4

Manipulação de Strings

Agora nós iremos atualizar a densidade demográfica da tabela com um valor


mais recente. Para isso temos que transformar as colunas de area e de
populacao em números ( float ou int ), atualmente elas estão em forma
de texto ( str )

Avaliando os tipos do nosso DataFrame

In [63]:

igm.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5570 entries, 0 to 5569
Data columns (total 32 columns):
regiao 5570 non-null o
bject
estado 5570 non-null o
bject
municipio 5570 non-null o
bject
codigo_mun 5570 non-null i
nt64
capital 5570 non-null i
nt64
porte 5570 non-null o
bject
populacao 5570 non-null o
bject
area 5570 non-null o
bject
densidade_dem 5566 non-null o
bject
pib 5570 non-null f
loat64
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 43/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

pib_pc 5570 non-null f


loat64
participacao_transf_receita 4893 non-null f
loat64
servidores 5233 non-null f
loat64
comissionados 5570 non-null f
loat64
comissionados_por_servidor 5570 non-null o
bject
perc_pop_econ_ativa 5565 non-null f
loat64
taxa_empreendedorismo 5570 non-null f
loat64
anos_estudo_empreendedor 5570 non-null f
loat64
jornada_trabalho 5570 non-null f
loat64
gasto_pc_saude 4881 non-null f
loat64
hab_p_medico 4951 non-null f
loat64
exp_vida 5565 non-null f
loat64
gasto_pc_educacao 4880 non-null f
loat64
exp_anos_estudo 5565 non-null f
loat64
nota_ciencias 5558 non-null f
loat64
nota_humanas 5558 non-null f
loat64
nota_linguagem 5557 non-null f
loat64
nota_mat 5557 non-null f
loat64
nota_redacao 5557 non-null f
loat64
idhm 4986 non-null f
loat64
ranking_igm 3303 non-null o
bject
indice_governanca 3303 non-null f
loat64

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 44/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

dtypes: float64(21), int64(2), object(9)


memory usage: 1.3+ MB

Como podemos notar, temos algumas colunas que são númeircas mas que
estão como object , o que normalmente irá significar que são texto. Vamos
avaliar o que está acontecendo.

Convertendo a coluna de área

In [64]:

Out[64]:
igm['area'].sample(5)
5404 650.92
391 542.63
1980 677.61
3513 8,976.31
1438 831.21
Name: area, dtype: object

Para forçar a conversão para um número podemos usar o


comando .astype(float)

In [65]:

igm['area'].astype(float)
----------------------------------------------
-----------------------------
ValueError Trac
eback (most recent call last)
<ipython-input-65-e1989c26aeea> in <module>()
----> 1 igm['area'].astype(float)

/opt/conda/lib/python3.6/site-packages/pandas/
util/_decorators.py in wrapper(*args, **kwarg
s)
176 else:
177 kwargs[new_arg_nam
e] = new_arg_value
--> 178 return func(*args, **kwarg
s)
179 return wrapper
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 45/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

180 return _deprecate_kwarg

/opt/conda/lib/python3.6/site-packages/pandas/
core/generic.py in astype(self, dtype, copy, e
rrors, **kwargs)
4999 # else, only a single dtyp
e is given
5000 new_data = self._data.asty
pe(dtype=dtype, copy=copy, errors=errors,
-> 5001
**kwargs)
5002 return self._constructor(n
ew_data).__finalize__(self)
5003

/opt/conda/lib/python3.6/site-packages/pandas/
core/internals.py in astype(self, dtype, **kwa
rgs)
3712
3713 def astype(self, dtype, **kwargs):
-> 3714 return self.apply('astype', dt
ype=dtype, **kwargs)
3715
3716 def convert(self, **kwargs):

/opt/conda/lib/python3.6/site-packages/pandas/
core/internals.py in apply(self, f, axes, filt
er, do_integrity_check, consolidate, **kwargs)
3579
3580 kwargs['mgr'] = self
-> 3581 applied = getattr(b, f)(**
kwargs)
3582 result_blocks = _extend_bl
ocks(applied, result_blocks)
3583

/opt/conda/lib/python3.6/site-packages/pandas/
core/internals.py in astype(self, dtype, copy,
errors, values, **kwargs)
573 def astype(self, dtype, copy=False
, errors='raise', values=None, **kwargs):
574 return self._astype(dtype, cop
y=copy, errors=errors, values=values,
--> 575 **kwargs)
576

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 46/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

577 def _astype(self, dtype, copy=Fals


e, errors='raise', values=None,

/opt/conda/lib/python3.6/site-packages/pandas/
core/internals.py in _astype(self, dtype, cop
y, errors, values, klass, mgr, **kwargs)
662
663 # _astype_nansafe work
s fine with 1-d only
--> 664 values = astype_nansaf
e(values.ravel(), dtype, copy=True)
665 values = values.reshap
e(self.shape)
666

/opt/conda/lib/python3.6/site-packages/pandas/
core/dtypes/cast.py in astype_nansafe(arr, dty
pe, copy)
728
729 if copy:
--> 730 return arr.astype(dtype, copy=
True)
731 return arr.view(dtype)
732

ValueError: could not convert string to float:


'5,780.00'

O comando não funciona porque temos valores que ele não sabe o que fazer,
em específico a vírgula separando os milhares. Para corrigir isso basta usar o
comando .str.replace()

In [66]:
Out[66]:
igm['area'].str.replace(',','').astype(float).sample(10)
840 630.71
2544 146.78
2274 196.57
2400 506.46
1285 242.96
2940 711.74
468 132.78
293 229.40

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 47/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

1433 681.63
1721 543.36
Name: area, dtype: float64

Salvando um resultado em uma nova coluna

Vamos salvar esse resultado:

In [67]:

igm['area'] = igm['area'].str.replace(',','').astype(float)

Convertendo a coluna de população

Vamos primeiro dar uma olhada na coluna populacao

In [68]:

Out[68]:
igm['populacao'].sample(10)
249 31,578
3923 8,336
182 3,876
812 4,982
1445 13,240
4989 20,681
996 45,414
543 48,096
2640 5,710
5323 3,869
Name: populacao, dtype: object

Também temos valores com vírgula, vamos substituí-los por um valor em


branco:

In [69]:

igm['populacao'] = igm['populacao'].str.replace(',','')

E vamos converter em número e salvar o resultado

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 48/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

In [70]:

igm['populacao'] = igm['populacao'].astype(float)
----------------------------------------------
-----------------------------
ValueError Trac
eback (most recent call last)
<ipython-input-70-9102d628b755> in <module>()
----> 1 igm['populacao'] = igm['populacao'].as
type(float)

/opt/conda/lib/python3.6/site-packages/pandas/
util/_decorators.py in wrapper(*args, **kwarg
s)
176 else:
177 kwargs[new_arg_nam
e] = new_arg_value
--> 178 return func(*args, **kwarg
s)
179 return wrapper
180 return _deprecate_kwarg

/opt/conda/lib/python3.6/site-packages/pandas/
core/generic.py in astype(self, dtype, copy, e
rrors, **kwargs)
4999 # else, only a single dtyp
e is given
5000 new_data = self._data.asty
pe(dtype=dtype, copy=copy, errors=errors,
-> 5001
**kwargs)
5002 return self._constructor(n
ew_data).__finalize__(self)
5003

/opt/conda/lib/python3.6/site-packages/pandas/
core/internals.py in astype(self, dtype, **kwa
rgs)
3712
3713 def astype(self, dtype, **kwargs):
-> 3714 return self.apply('astype', dt
ype=dtype, **kwargs)
3715
3716 def convert(self, **kwargs):

/opt/conda/lib/python3.6/site-packages/pandas/

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 49/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

core/internals.py in apply(self, f, axes, filt


er, do_integrity_check, consolidate, **kwargs)
3579
3580 kwargs['mgr'] = self
-> 3581 applied = getattr(b, f)(**
kwargs)
3582 result_blocks = _extend_bl
ocks(applied, result_blocks)
3583

/opt/conda/lib/python3.6/site-packages/pandas/
core/internals.py in astype(self, dtype, copy,
errors, values, **kwargs)
573 def astype(self, dtype, copy=False
, errors='raise', values=None, **kwargs):
574 return self._astype(dtype, cop
y=copy, errors=errors, values=values,
--> 575 **kwargs)
576
577 def _astype(self, dtype, copy=Fals
e, errors='raise', values=None,

/opt/conda/lib/python3.6/site-packages/pandas/
core/internals.py in _astype(self, dtype, cop
y, errors, values, klass, mgr, **kwargs)
662
663 # _astype_nansafe work
s fine with 1-d only
--> 664 values = astype_nansaf
e(values.ravel(), dtype, copy=True)
665 values = values.reshap
e(self.shape)
666

/opt/conda/lib/python3.6/site-packages/pandas/
core/dtypes/cast.py in astype_nansafe(arr, dty
pe, copy)
728
729 if copy:
--> 730 return arr.astype(dtype, copy=
True)
731 return arr.view(dtype)
732

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 50/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

ValueError: could not convert string to float:


'36789(2)'

Desta vez não funcionou, porque de acordo com a mensagem de erro, além
de vírgulas temos . e temos um (1) solto de acordo com a nossa
mensagem de erro.

Vamos tirar o .

In [71]:

igm['populacao'] = igm['populacao'].str.replace('.','')

Para tirar o ('1') , uma forma é quebrando a string em vários pedaços, para
isso usamos o split() . Vamos começar com um exemplo fora
do DataFrame para ilustrar melhor o conceito:

In [72]:

valor_problema = '41.487(1)'

Vamos usar o split:

In [73]:

Out[73]:
valor_problema.split('(')
['41.487', '1)']

O split separou o nosso elemento original em dois elementos, o que tinha


antes da ( e o que tinha depois:

Para selcionar o que tinha antes basta selecionarmos a posição 0 por meio do
comando [0]

In [74]:

Out[74]:
valor_problema.split('(')[0]
'41.487'

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 51/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Agora vamos fazer a mesma coisa no DataFrame , vamos precisar de


chamar o str para acessar os métodos de texto.

In [75]:

igm['populacao'] = igm['populacao'].str.split('(')

Vamos imprimir novamente os valores:

In [76]:

Out[76]:
igm['populacao'].sample(10)
3615 [4836]
1836 [4493]
3318 [2249]
1538 [2518]
1853 [15024]
1742 [18849]
194 [2918]
2522 [23535]
1247 [19046]
2972 [2656]
Name: populacao, dtype: object

Vamos selecionar o elemento da posição zero para os casos de termos


um ( no elemento e atualizar os valores da coluna com isso.

In [77]:

igm['populacao'] = igm['populacao'].str[0]

Vamos imprimir os valores da coluna e ver que já temos algo com cara de
número, mas que ainda é um object

In [78]:

Out[78]:
igm['populacao'].sample(10)
1011 23308
3341 43293
648 3715
2095 21433
613 3147
4633 18319
342 14227

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 52/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

255 2467
357 65135
2569 11727
Name: populacao, dtype: object

Vamos converter isso para float :

In [79]:

igm['populacao'] = igm['populacao'].astype(float)

Operações matemáticas entre colunas

Podemos multiplicar, somar, dividir, subtrair entre colunas, para isso basta
usar os respectivos sinais.

In [80]:

Out[80]:
igm['populacao'] / igm['area']
0 94.331262
1 718.316199
2 502.561247
3 2007.769883
4 515.089273
5 1547.579007
6 755.471032
7 146.457554
8 2848.767301
9 261.397862
10 210.903723
11 940.933652
12 27.187606
13 91.570455
14 3724.414750
15 15.085311
16 7914.072618
17 286.211150
18 51.327540
19 334.717120
20 74.252603
21 3717.764337
22 4.051494

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 53/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

23 1448.734402
24 33.848568
25 89.343924
26 76.587322
27 121.027001
28 16.428947
29 9.134679
...
5540 4.026302
5541 2.908107
5542 6.675598
5543 0.938525
5544 2.180005
5545 2.781764
5546 20.234828
5547 0.265450
5548 2.436291
5549 2.870041
5550 3.992988
5551 7.281380
5552 2.495627
5553 2.343207
5554 45.220011
5555 26.793832
5556 2.839407
5557 6.007403
5558 4.360910
5559 29.471942
5560 7.528834
5561 4.366005
5562 3.069820
5563 2.221394
5564 3.016174
5565 3.297952
5566 64.849211
5567 4.462094
5568 1.212732
5569 4.267455
Length: 5570, dtype: float64

Para criarmos uma nova coluna basta colocarmos igm[] e dentro do


colchetes botar o nome da nova coluna entre aspas. Temos que cuidar
cuidado pois se esse nome já existir, iremos sobreescrever o que está lá.

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 54/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

In [81]:

igm['densidade_2'] = igm['populacao'] / igm['area']

Comparando Densidades

Uma forma interessante de facilitar a nossa visualização o DataFrame é


selecionando apenas algumas colunas que nos interessam, como no caso da
densidade
demográfica: municipio , populacao , area , densidade_dem e densidade
para isso basta colocarmos igm[[]] com os nomes das colunas dentro
separados por vírgula (lembrando das aspas para identificar que é um texto).

In [82]:
Out[82]:
igm[['municipio','populacao','area','densidade_dem', 'densida
de_2']].sample(10)
municipio populacao area densidade_dem de
885 GENTIL 1708.0 184.01 9.1 9.
SANTA
3544 ISABEL DO 23092.0 62800.08 0.30 0.
RIO NEGRO
ANTONIO
2100 11584.0 529.92 21 21
CARLOS
1553 GUZOLANDIA 5142.0 252.48 18.9 20
3698 FATIMA 3882.0 382.91 9.9 10
2388 CUPARAQUE 4972.0 226.75 20.6 21
1210 TUPA 65705.0 627.99 101 10
2582 MIRADOURO 10799.0 301.67 34 35
4506 LAJE 24112.0 449.83 48.5 53
SANTO
3172 ANTONIO DO 7315.0 796.29 8.7 9.
RETIRO

Alterando colunas no DataFrame

Valores estão ligeiramente diferentes, provavelmente é por conta de estarmos


usando valores mais recentes para a populacao do que os que foram
utilizados no cálculo original da densidade demográfica.

Para atualizar os valores, basta executar o seguinte comando:

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 55/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

In [83]:

igm['densidade_dem'] = igm['densidade_2']

Deletando colunas

A coluna densidade_2 se tornou obsoleta, podemos deletá-la com o


seguinte comando:

In [84]:

igm.drop(columns='densidade_2', inplace=True)

Exercícios: Manipulação de Strings

1. Transforme a coluna ranking_igm para uma coluna numérica


2. Crie uma coluna comissionados_por_servidor_2 a partir das
colunas comissionados e servidores
3. Substitua a coluna comissionados_por_servidor se for o caso
4. Delete a coluna comissionados_por_servidor_2

In [85]:

igm['comissionados_por_servidor'] = igm['comissionados']/igm[
'servidores']
Revisão

Fazer revisão do que foi visto.

Exercícios: Revisão

1. Plotar um histograma da coluna exp_vida


2. Usar o método .describe na coluna exp_vida
3. Usar o método .describe na coluna exp_vida onde os
municípios sejam apenas da região NORTE
4. Usar o método .value_counts() na coluna estado filtrando os
munícipios que tenham pib_pc > 50000
5. Plotar um gráfico de barras do resultado gerado pelo item 4

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 56/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Conteúdos Adicionais

Gráficos Interativos

Um jeito bem interessante de fazermos histogramas é com gráficos


interativos, um boa biblioteca para fazer isso é a plotly , para instalarmos
ela, basta usarmos o comando !pip install plotly

In [86]:

!pip install already


Requirement plotly satisfied: plotly in /opt/

conda/lib/python3.6/site-packages (3.4.2)
Requirement already satisfied: decorator>=4.0.
6 in /opt/conda/lib/python3.6/site-packages (f
rom plotly) (4.3.0)
Requirement already satisfied: retrying>=1.3.3
in /opt/conda/lib/python3.6/site-packages (fro
m plotly) (1.3.3)
Requirement already satisfied: requests in /op
t/conda/lib/python3.6/site-packages (from plot
ly) (2.20.1)
Requirement already satisfied: nbformat>=4.2 i
n /opt/conda/lib/python3.6/site-packages (from
plotly) (4.4.0)
Requirement already satisfied: pytz in /opt/co
nda/lib/python3.6/site-packages (from plotly)
(2018.4)
Requirement already satisfied: six in /opt/con
da/lib/python3.6/site-packages (from plotly)
(1.11.0)
Requirement already satisfied: certifi>=2017.
4.17 in /opt/conda/lib/python3.6/site-packages
(from requests->plotly) (2018.10.15)
Requirement already satisfied: chardet<3.1.0,>
=3.0.2 in /opt/conda/lib/python3.6/site-packag
es (from requests->plotly) (3.0.4)
Requirement already satisfied: urllib3<1.25,>=
1.21.1 in /opt/conda/lib/python3.6/site-packag
es (from requests->plotly) (1.22)
Requirement already satisfied: idna<2.8,>=2.5
in /opt/conda/lib/python3.6/site-packages (fro
m requests->plotly) (2.6)
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 57/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Requirement already satisfied: ipython_genutil


s in /opt/conda/lib/python3.6/site-packages (f
rom nbformat>=4.2->plotly) (0.2.0)
Requirement already satisfied: traitlets>=4.1
in /opt/conda/lib/python3.6/site-packages (fro
m nbformat>=4.2->plotly) (4.3.2)
Requirement already satisfied: jsonschema!=2.
5.0,>=2.4 in /opt/conda/lib/python3.6/site-pac
kages (from nbformat>=4.2->plotly) (2.6.0)
Requirement already satisfied: jupyter_core in
/opt/conda/lib/python3.6/site-packages (from n
bformat>=4.2->plotly) (4.4.0)

Vamos precisar importar duas sub-bibliotecas da plotly , importante notar


que estamos usando o modo offline para facilitar a nossa vida e não
necessitarmos de autenticação no site deles.

In [87]:

import plotly.offline as plotly


import
Para plotly.graph_objs
conseguirmos as go
plotar os gráficos no Jupyter Notebook no
modo offline também precisamos executar o comando abaixo:

In [88]:

plotly.init_notebook_mode(connected=True)

Para prepararmos os dados, usamos o comando a seguir:

In [89]:

pyplot_data = [go.Histogram(x=igm['exp_vida'])]

Para plotarmos o Histograma, usamos o método pyplot :

In [90]:

plotly.iplot(pyplot_data)

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 58/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Importante notar, que diferente dos gráficos do pandas e do seaborn , se


você salvar esse arquivo e abrir depois, o gráfico gerado pelo plotly não
estará lá para ser visualizado (nem de form não interativa).

Histograma: Trocando Valores Absolutos por


Probabilidades

Para vermos a probabilidade de dado valor acontecer em vez de quantos


valores daquele tipo aconteceram, basta usar o
parâmetro histnorm='probability' :

In [91]:

pyplot_data_norm = [go.Histogram(x=igm['exp_vida'], histnorm=


'probability')]
Para plotar o gráfico usamos o plotly.iplot()

In [92]:

plotly.iplot(pyplot_data_norm)

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 59/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Exercícios: Histogramas Interativos

1. Plote um histograma interativo de 2 colunas da sua escolha.

Importando Valores com Vírgula

Vamos salvar o nosso igm de volta no disco. Mas dessa vez vamos separar
os campos por ; (ponto e vírgula) em vez da , (vírgula) que era utilizada
no nosso arquivo original, e vamos usar a , (vírgula) como separador
decimal em vez do . (ponto)

In [93]:

igm.to_csv('igm_virgula.csv', index=False, sep=';', decimal=


',') abrir esse arquivo no notepad para ver como os dados estão salvos.
Podemos

Para lermos o arquivo, vamos usar o read_csv() novamente, mas dessa

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 60/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

vez precisamos usar o comando sep=; . Podemos usar o .info() em


seguida para averiguarmos os tipos de dados:

In [94]:

pd.read_csv('igm_virgula.csv', sep=';').info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5570 entries, 0 to 5569
Data columns (total 32 columns):
regiao 5570 non-null o
bject
estado 5570 non-null o
bject
municipio 5570 non-null o
bject
codigo_mun 5570 non-null i
nt64
capital 5570 non-null i
nt64
porte 5570 non-null o
bject
populacao 5570 non-null o
bject
area 5570 non-null o
bject
densidade_dem 5570 non-null o
bject
pib 5570 non-null o
bject
pib_pc 5570 non-null o
bject
participacao_transf_receita 4893 non-null o
bject
servidores 5233 non-null o
bject
comissionados 5570 non-null o
bject
comissionados_por_servidor 5233 non-null o
bject
perc_pop_econ_ativa 5565 non-null o
bject
taxa_empreendedorismo 5570 non-null o
bject
anos_estudo_empreendedor 5570 non-null o
bject
jornada_trabalho 5570 non-null o

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 61/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

bject
gasto_pc_saude 4881 non-null o
bject
hab_p_medico 4951 non-null o
bject
exp_vida 5565 non-null o
bject
gasto_pc_educacao 4880 non-null o
bject
exp_anos_estudo 5565 non-null o
bject
nota_ciencias 5558 non-null o
bject
nota_humanas 5558 non-null o
bject
nota_linguagem 5557 non-null o
bject
nota_mat 5557 non-null o
bject
nota_redacao 5557 non-null o
bject
idhm 4986 non-null o
bject
ranking_igm 3303 non-null o
bject
indice_governanca 3303 non-null o
bject
dtypes: int64(2), object(30)
memory usage: 1.4+ MB

Como vimos anteriormente, a maioria dos nossos números objetos foi


interpretado como objeto, o que na prática significa que é texto.

Para conseguirmos importar os números no formato correto precisamos usar


o comando decimal=',' .

In [95]:

pd.read_csv('igm_virgula.csv', sep=';', decimal=',').info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5570 entries, 0 to 5569
Data columns (total 32 columns):
regiao 5570 non-null o
bject

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 62/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

estado 5570 non-null o


bject
municipio 5570 non-null o
bject
codigo_mun 5570 non-null i
nt64
capital 5570 non-null i
nt64
porte 5570 non-null o
bject
populacao 5570 non-null f
loat64
area 5570 non-null f
loat64
densidade_dem 5570 non-null f
loat64
pib 5570 non-null f
loat64
pib_pc 5570 non-null f
loat64
participacao_transf_receita 4893 non-null f
loat64
servidores 5233 non-null f
loat64
comissionados 5570 non-null f
loat64
comissionados_por_servidor 5233 non-null f
loat64
perc_pop_econ_ativa 5565 non-null f
loat64
taxa_empreendedorismo 5570 non-null f
loat64
anos_estudo_empreendedor 5570 non-null f
loat64
jornada_trabalho 5570 non-null f
loat64
gasto_pc_saude 4881 non-null f
loat64
hab_p_medico 4951 non-null f
loat64
exp_vida 5565 non-null f
loat64
gasto_pc_educacao 4880 non-null f
loat64
exp_anos_estudo 5565 non-null f

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 63/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

loat64
nota_ciencias 5558 non-null f
loat64
nota_humanas 5558 non-null f
loat64
nota_linguagem 5557 non-null f
loat64
nota_mat 5557 non-null f
loat64
nota_redacao 5557 non-null f
loat64
idhm 4986 non-null f
loat64
ranking_igm 3303 non-null o
bject
indice_governanca 3303 non-null f
loat64
dtypes: float64(25), int64(2), object(5)
memory usage: 1.4+ MB

Importandos Arquivos do Excel (Caso de uso real)

Além de importarmos arquivos .csv , também podemos ler de forma fácil


arquivos do Excel :

In [96]:

Out[96]:
pd.read_excel('../input/exemplo_1.xls')

ESTIMATIVAS DA
POPULAÇÃO RESIDENTE NO
BRASIL E UNIDADES DA Unnamed:
Unnamed: 2
FEDERAÇÃO COM DATA DE 1
REFERÊNCIA EM 1º DE
JULHO DE 2017
BRASIL E UNIDADES DA POPULAÇÃO
0 NaN
FEDERAÇÃO ESTIMADA
1 Brasil NaN 207660929
2 Região Norte NaN 17936201
3 Rondônia NaN 1805788
4 Acre NaN 829619
5 Amazonas NaN 4063614
6 Roraima NaN 522636
7 Pará NaN 8366628

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 64/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

ESTIMATIVAS DA
POPULAÇÃO RESIDENTE NO
BRASIL E UNIDADES DA Unnamed:
Unnamed: 2
FEDERAÇÃO COM DATA DE 1
REFERÊNCIA EM 1º DE
JULHO DE 2017
8 Amapá NaN 797722
9 Tocantins NaN 1550194
10 Região Nordeste NaN 57254159
11 Maranhão NaN 7000229
12 Piauí NaN 3.219.257 (*)
13 Ceará NaN 9.020.460 (*)
14 Rio Grande do Norte NaN 3507003
15 Paraíba NaN 4025558
16 Pernambuco NaN 9.473.266 (**)
17 Alagoas NaN 3.375.823 (**)
18 Sergipe NaN 2288116
19 Bahia NaN 15344447
20 Região Sudeste NaN 86949714
21 Minas Gerais NaN 21119536
22 Espírito Santo NaN 4016356
23 Rio de Janeiro NaN 16718956
24 São Paulo NaN 45094866
25 Região Sul NaN 29644948
26 Paraná NaN 11320892
27 Santa Catarina NaN 7001161
28 Rio Grande do Sul NaN 11322895
29 Região Centro-Oeste NaN 15875907
30 Mato Grosso do Sul NaN 2713147
31 Mato Grosso NaN 3344544
32 Goiás NaN 6778772
33 Distrito Federal NaN 3039444
34 NaN NaN NaN
Fonte: IBGE. Diretoria de
35 NaN NaN
Pesquisas - DPE - C...
36 Notas: NaN NaN
(*) diferença de 772 pessoas
37 NaN NaN
entre os Estados...
(**) diferença de 441 pessoas
38 NaN NaN
entre os Estado...

Por padrão o read_excel() vai abrir a primeira aba da planilha do Excel ,


para selecionarmos uma diferente, precisamos do parâmetro sheet_name :

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 65/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

In [97]:

Out[97]:
pd.read_excel('../input/exemplo_1.xls', sheet_name='Município
s')
ESTIMATIVAS
DA
POPULAÇÃO
RESIDENTE
NOS
MUNICÍPIOS
Unnamed: Unnamed:
BRASILEIROS Unnamed: 3
1 2
COM DATA
DE
REFERÊNCIA
EM 1º DE
JULHO DE
2017
COD. NOME DO
0 UF COD. UF
MUNIC MUNICÍPIO
Alta Floresta
1 RO 11 00015
D'Oeste
2 RO 11 00023 Ariquemes
3 RO 11 00031 Cabixi
4 RO 11 00049 Cacoal
5 RO 11 00056 Cerejeiras
Colorado do
6 RO 11 00064
Oeste
7 RO 11 00072 Corumbiara
Costa
8 RO 11 00080
Marques
Espigão
9 RO 11 00098
D'Oeste
Guajará-
10 RO 11 00106
Mirim
11 RO 11 00114 Jaru
12 RO 11 00122 Ji-Paraná
Machadinho
13 RO 11 00130
D'Oeste
Nova
14 RO 11 00148 Brasilândia
D'Oeste
Ouro Preto
15 RO 11 00155
do Oeste
Pimenta
16 RO 11 00189
Bueno
17 RO 11 00205 Porto Velho
Presidente
18 RO 11 00254
Médici
19 RO 11 00262 Rio Crespo
Rolim de
20 RO 11 00288
Moura
Santa Luzia
21 RO 11 00296
D'Oeste
22 RO 11 00304 Vilhena
São Miguel
23 RO 11 00320
do Guaporé

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 66/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

ESTIMATIVAS
DA
POPULAÇÃO
RESIDENTE
NOS
MUNICÍPIOS
Unnamed: Unnamed:
BRASILEIROS Unnamed: 3
1 2
COM DATA
DE
REFERÊNCIA
EM 1º DE
JULHO DE
2017

Nova
24 RO 11 00338
Mamoré
Alvorada
25 RO 11 00346
D'Oeste
Alto Alegre
26 RO 11 00379
dos Parecis
27 RO 11 00403 Alto Paraíso
28 RO 11 00452 Buritis
Novo
29 RO 11 00502 Horizonte do
Oeste
... ... ... ... ...
Três
5555 GO 52 21304
Ranchos
5556 GO 52 21403 Trindade
5557 GO 52 21452 Trombas
5558 GO 52 21502 Turvânia
5559 GO 52 21551 Turvelândia
5560 GO 52 21577 Uirapuru
5561 GO 52 21601 Uruaçu
5562 GO 52 21700 Uruana
5563 GO 52 21809 Urutaí
Valparaíso de
5564 GO 52 21858
Goiás
5565 GO 52 21908 Varjão
5566 GO 52 22005 Vianópolis
5567 GO 52 22054 Vicentinópolis
5568 GO 52 22203 Vila Boa
5569 GO 52 22302 Vila Propício
5570 DF 53 00108 Brasília
Fonte: IBGE.
Diretoria de
5571 NaN NaN NaN
Pesquisas -
DPE - C...
5572 NaN NaN NaN NaN
5573 Notas: NaN NaN NaN
(1) População
judicial do
5574 NaN NaN NaN
município de
Porto V...

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 67/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

ESTIMATIVAS
DA
POPULAÇÃO
RESIDENTE
NOS
MUNICÍPIOS
Unnamed: Unnamed:
BRASILEIROS Unnamed: 3
1 2
COM DATA
DE
REFERÊNCIA
EM 1º DE
JULHO DE
2017

(2) População
judicial do
5575 NaN NaN NaN
município de
Manaqui...
(3) População
judicial do
5576 NaN NaN NaN
município de
Santa I...
(4) População
judicial do
5577 NaN NaN NaN
município de
Uarini-...
(5) População
judicial do
5578 NaN NaN NaN
município de
Urucará...
(6) População
judicial do
5579 NaN NaN NaN
município de
Jacarea...
(7) População
judicial do
5580 NaN NaN NaN
município de
Paço do...
(8) População
judicial do
5581 NaN NaN NaN
município
Livramento...
(9) População
judicial do
5582 NaN NaN NaN
município de
Taperoá...
(10)
População
5583 judicial do NaN NaN NaN
município
Sairé -PE...
(11) População
judicial do
5584 NaN NaN NaN
município
Coronel J...

5585 rows × 5 columns

Por padrão o cabeçalho do nosso arquivo vai ser a primeira linha de texto,
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 68/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

para alteramos isso podemos usar o parâmetro header :

In [98]:

Out[98]:
pd.read_excel('../input/exemplo_1.xls', sheet_name='Município
s', header=1)
COD. COD. NOME DO POPULA
UF
UF MUNIC MUNICÍPIO ESTIMAD
Alta Floresta
0 RO 11.0 15.0 25437
D'Oeste
1 RO 11.0 23.0 Ariquemes 107345
2 RO 11.0 31.0 Cabixi 6224
3 RO 11.0 49.0 Cacoal 88507
4 RO 11.0 56.0 Cerejeiras 17934
Colorado do
5 RO 11.0 64.0 18467
Oeste
6 RO 11.0 72.0 Corumbiara 8659
Costa
7 RO 11.0 80.0 17400
Marques
Espigão
8 RO 11.0 98.0 33030
D'Oeste
Guajará-
9 RO 11.0 106.0 47451
Mirim
10 RO 11.0 114.0 Jaru 55871
11 RO 11.0 122.0 Ji-Paraná 132667
Machadinho
12 RO 11.0 130.0 38609
D'Oeste
Nova
13 RO 11.0 148.0 Brasilândia 21747
D'Oeste
Ouro Preto
14 RO 11.0 155.0 39759
do Oeste
Pimenta
15 RO 11.0 189.0 38051
Bueno
16 RO 11.0 205.0 Porto Velho 519.436
Presidente
17 RO 11.0 254.0 22124
Médici
18 RO 11.0 262.0 Rio Crespo 3829
Rolim de
19 RO 11.0 288.0 57074
Moura
Santa Luzia
20 RO 11.0 296.0 8198
D'Oeste
21 RO 11.0 304.0 Vilhena 95630
São Miguel
22 RO 11.0 320.0 24181
do Guaporé
Nova
23 RO 11.0 338.0 28891
Mamoré
Alvorada
24 RO 11.0 346.0 16747
D'Oeste
Alto Alegre
25 RO 11.0 379.0 14045
dos Parecis
26 RO 11.0 403.0 Alto Paraíso 20916

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 69/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

COD. COD. NOME DO POPULA


UF
UF MUNIC MUNICÍPIO ESTIMAD
27 RO 11.0 452.0 Buritis 39044
Novo
28 RO 11.0 502.0 Horizonte do 10051
Oeste
29 RO 11.0 601.0 Cacaulândia 6460
... ... ... ... ... ...
Três
5554 GO 52.0 21304.0 2900
Ranchos
5555 GO 52.0 21403.0 Trindade 121266
5556 GO 52.0 21452.0 Trombas 3571
5557 GO 52.0 21502.0 Turvânia 4818
5558 GO 52.0 21551.0 Turvelândia 5050
5559 GO 52.0 21577.0 Uirapuru 2961
5560 GO 52.0 21601.0 Uruaçu 40082
5561 GO 52.0 21700.0 Uruana 14195
5562 GO 52.0 21809.0 Urutaí 3154
Valparaíso de
5563 GO 52.0 21858.0 159500
Goiás
5564 GO 52.0 21908.0 Varjão 3856
5565 GO 52.0 22005.0 Vianópolis 13675
5566 GO 52.0 22054.0 Vicentinópolis 8397
5567 GO 52.0 22203.0 Vila Boa 5731
5568 GO 52.0 22302.0 Vila Propício 5690
5569 DF 53.0 108.0 Brasília 3039444
Fonte: IBGE.
Diretoria de
5570 NaN NaN NaN NaN
Pesquisas -
DPE - C...
5571 NaN NaN NaN NaN NaN
5572 Notas: NaN NaN NaN NaN
(1)
População
5573 judicial do NaN NaN NaN NaN
município de
Porto V...
(2)
População
5574 judicial do NaN NaN NaN NaN
município de
Manaqui...
(3)
População
5575 judicial do NaN NaN NaN NaN
município de
Santa I...
(4)
População
5576 judicial do NaN NaN NaN NaN
município de
Uarini-...

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 70/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

COD. COD. NOME DO POPULA


UF
UF MUNIC MUNICÍPIO ESTIMAD
(5)
População
5577 judicial do NaN NaN NaN NaN
município de
Urucará...
(6)
População
5578 judicial do NaN NaN NaN NaN
município de
Jacarea...
(7)
População
5579 judicial do NaN NaN NaN NaN
município de
Paço do...
(8)
População
5580 judicial do NaN NaN NaN NaN
município
Livramento...
(9)
População
5581 judicial do NaN NaN NaN NaN
município de
Taperoá...
(10)
População
5582 judicial do NaN NaN NaN NaN
município
Sairé -PE...
(11)
População
5583 judicial do NaN NaN NaN NaN
município
Coronel J...

5584 rows × 5 columns

Se observamos cuidadosamente, veremos que no final do nosso arquivo


temos uma série de linhas que distoam dos dados coletados, para pularmos a
importação de algumas linhas no final do arquivo, podemos usar o
parâmetro skip_footer .

In [99]:

pd.read_excel('../input/exemplo_1.xls', sheet_name='Município
/opt/conda/lib/python3.6/site-packages/pandas/
s', header=1, skip_footer=14)
util/_decorators.py:178: FutureWarning:

the 'skip_footer' keyword is deprecated, use

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 71/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

'skipfooter' instead

Out[99]:

COD. COD. NOME DO POPULAÇÃO


UF
UF MUNIC MUNICÍPIO ESTIMADA
Alta Floresta
0 RO 11 15 25437
D'Oeste
1 RO 11 23 Ariquemes 107345
2 RO 11 31 Cabixi 6224
3 RO 11 49 Cacoal 88507
4 RO 11 56 Cerejeiras 17934
Colorado do
5 RO 11 64 18467
Oeste
6 RO 11 72 Corumbiara 8659
7 RO 11 80 Costa Marques 17400
Espigão
8 RO 11 98 33030
D'Oeste
9 RO 11 106 Guajará-Mirim 47451
10 RO 11 114 Jaru 55871
11 RO 11 122 Ji-Paraná 132667
Machadinho
12 RO 11 130 38609
D'Oeste
Nova
13 RO 11 148 Brasilândia 21747
D'Oeste
Ouro Preto do
14 RO 11 155 39759
Oeste
15 RO 11 189 Pimenta Bueno 38051
16 RO 11 205 Porto Velho 519.436 (1)
Presidente
17 RO 11 254 22124
Médici
18 RO 11 262 Rio Crespo 3829
19 RO 11 288 Rolim de Moura 57074
Santa Luzia
20 RO 11 296 8198
D'Oeste
21 RO 11 304 Vilhena 95630
São Miguel do
22 RO 11 320 24181
Guaporé
23 RO 11 338 Nova Mamoré 28891
Alvorada
24 RO 11 346 16747
D'Oeste
Alto Alegre dos
25 RO 11 379 14045
Parecis
26 RO 11 403 Alto Paraíso 20916
27 RO 11 452 Buritis 39044
Novo Horizonte
28 RO 11 502 10051
do Oeste
29 RO 11 601 Cacaulândia 6460
... ... ... ... ... ...
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 72/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

COD. COD. NOME DO POPULAÇÃO


UF
UF MUNIC MUNICÍPIO ESTIMADA
São Luís de
5540 GO 52 20108 33118
Montes Belos
São Luiz do
5541 GO 52 20157 5071
Norte
São Miguel do
5542 GO 52 20207 22684
Araguaia
São Miguel do
5543 GO 52 20264 4037
Passa Quatro
5544 GO 52 20280 São Patrício 2070
5545 GO 52 20405 São Simão 19697
Senador
5546 GO 52 20454 105459
Canedo
5547 GO 52 20504 Serranópolis 8323
5548 GO 52 20603 Silvânia 20478
5549 GO 52 20686 Simolândia 6891
5550 GO 52 20702 Sítio d'Abadia 2998
Taquaral de
5551 GO 52 21007 3625
Goiás
Teresina de
5552 GO 52 21080 3363
Goiás
Terezópolis de
5553 GO 52 21197 7634
Goiás
5554 GO 52 21304 Três Ranchos 2900
5555 GO 52 21403 Trindade 121266
5556 GO 52 21452 Trombas 3571
5557 GO 52 21502 Turvânia 4818
5558 GO 52 21551 Turvelândia 5050
5559 GO 52 21577 Uirapuru 2961
5560 GO 52 21601 Uruaçu 40082
5561 GO 52 21700 Uruana 14195
5562 GO 52 21809 Urutaí 3154
Valparaíso de
5563 GO 52 21858 159500
Goiás
5564 GO 52 21908 Varjão 3856
5565 GO 52 22005 Vianópolis 13675
5566 GO 52 22054 Vicentinópolis 8397
5567 GO 52 22203 Vila Boa 5731
5568 GO 52 22302 Vila Propício 5690
5569 DF 53 108 Brasília 3039444

5570 rows × 5 columns

Vamos salvar os nossos dados em uma variável chamada df :

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 73/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

In [100]:

df = pd.read_excel('../input/exemplo_1.xls', sheet_name='Muni
/opt/conda/lib/python3.6/site-packages/pandas/ut
cípios', header=[1], skip_footer=14)
il/_decorators.py:178: FutureWarning:

the 'skip_footer' keyword is deprecated, use 'sk


ipfooter' instead

Vamos olhar os tipos de dados que estão no nosso DataFrame

In [101]:

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5570 entries, 0 to 5569
Data columns (total 5 columns):
UF 5570 non-null object
COD. UF 5570 non-null int64
COD. MUNIC 5570 non-null int64
NOME DO MUNICÍPIO 5570 non-null object
POPULAÇÃO ESTIMADA 5570 non-null object
dtypes: int64(2), object(3)
memory usage: 217.7+ KB

Vamos gerar uma nova coluna chamada código:

In [102]:

df['codigo'] = df['COD. UF'] * 100000 + df['COD. MUNIC']

Vamos ver se essa coluna atende aos nossos objetivos:

In [103]:
Out[103]:
df.sample(5)

COD. COD. NOME DO POPULAÇÃO


UF cod
UF MUNIC MUNICÍPIO ESTIMADA
Rio do
4525 SC 42 14508 6043 421
Campo
4883 RS 43 13060 Nova Hartz 20405 431
483 MA 21 2002 Bom Jardim 41120 210
2596 MG 31 31000 Inhaúma 6240 313
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 74/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

COD. COD. NOME DO POPULAÇÃO


UF cod
UF MUNIC MUNICÍPIO ESTIMADA
Alto
2867 MG 31 53509 8522 315
Jequitibá

Exercícios: Importando Arquivos

1. Importe o arquivo dados_inpe.xlsx usando a


função pd.read_excel() .
2. Importe novamente o arquivo ajustando os
parâmetros header e skip_footer
3. Averigue o DataFrame gerado no item 2. Use o
comando .info() .
4. Importe o arquivo anexo-V.csv , usando o read_csv() e o
parâmetro encoding='latin1' . (Ignore o DTypeWarning caso
aconteça, ou use o parâmetro low_memory=False )
5. Importe novamente o arquivo ajustando o parâmetro header e
salve o DataFrame em uma variável com o nome de anexo .
6. Averigue a variável anexo com o comando .info() .

Plotando Múltiplos Gráficos

Uma funcionalidade bem legal das bibliotecas gráficas do Python é que


podemos plotar um gráfico em cima do outro.

Para isso vamos começar plotando um gráfico simples.

In [104]:

sns.distplot(igm[igm['regiao'] == 'NORDESTE']['indice_governa
/opt/conda/lib/python3.6/site-packages/scipy/s
nca'].dropna(), label='NORDESTE')
tats/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensiona


l indexing is deprecated; use `arr[tuple(seq)]
` instead of `arr[seq]`. In the future this wi
ll be interpreted as an array index, `arr[np.a
rray(seq)]`, which will result either in an er

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 75/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

ror or a different result.

Out[104]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5eb80f28>

Vamos plotar outro gráfico simples.

In [105]:

sns.distplot(igm[igm['regiao'] == 'SUDESTE']['indice_governan
/opt/conda/lib/python3.6/site-packages/scipy/sta
ca'].dropna(), label='SUDESTE')
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[105]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
69a4f630>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 76/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Índice de Governança por Região

Para plotar vários gráficos ao mesmo tempo com legenda, vamos precisar
importar uma parte do matplotlib :

In [106]:

import matplotlib.pyplot as plt

Vamos plotar os dois gráficos que plotamos anteriormente, só que agora ao


mesmo tempo, note como eles ficaram diferentes:

In [107]:

sns.distplot(igm[igm['regiao'] == 'NORDESTE']['indice_governa
/opt/conda/lib/python3.6/site-packages/scipy/sta
nca'].dropna(), label='NORDESTE')
ts/stats.py:1713: FutureWarning:
sns.distplot(igm[igm['regiao'] == 'SUDESTE']['indice_governan
ca'].dropna(), label='SUDESTE')
Using a non-tuple sequence for multidimensional
plt.legend()
indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[107]:

<matplotlib.legend.Legend at 0x7f786c6d0e80>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 77/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Vamos plotar 3 gráficos ao mesmo tempo:

In [108]:

sns.distplot(igm[igm['regiao'] == 'NORDESTE']['indice_governa
/opt/conda/lib/python3.6/site-packages/scipy/sta
nca'].dropna(), label='NORDESTE')
ts/stats.py:1713: FutureWarning:
sns.distplot(igm[igm['regiao'] == 'SUDESTE']['indice_governan
ca'].dropna(), label='SUDESTE')
Using a non-tuple sequence for multidimensional
sns.distplot(igm[igm['regiao'] == 'CENTRO-OESTE']['indice_gov
indexing is deprecated; use `arr[tuple(seq)]` in
ernanca'].dropna(),
stead of `arr[seq]`.label='CENTRO-OESTE')
In the future this will be
plt.legend()
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[108]:

<matplotlib.legend.Legend at 0x7f785ce730f0>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 78/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

E finalmente vamos plotar 5 gráficos ao mesmo tempo:

In [109]:

sns.distplot(igm[igm['regiao'] == 'NORDESTE']['indice_governa
/opt/conda/lib/python3.6/site-packages/scipy/sta
nca'].dropna(), label='NORDESTE')
ts/stats.py:1713: FutureWarning:
sns.distplot(igm[igm['regiao'] == 'SUDESTE']['indice_governan
ca'].dropna(), label='SUDESTE')
Using a non-tuple sequence for multidimensional
sns.distplot(igm[igm['regiao'] == 'NORTE']['indice_governanc
indexing is deprecated; use `arr[tuple(seq)]` in
a'].dropna(), label='NORTE')
stead of `arr[seq]`. In the future this will be
sns.distplot(igm[igm['regiao']
interpreted as an array index, == 'SUL']['indice_governanca']
`arr[np.array(se
.dropna(),
q)]`, whichlabel='SUL')
will result either in an error or a
sns.distplot(igm[igm['regiao']
different result. == 'CENTRO-OESTE']['indice_gov
ernanca'].dropna(), label='CENTRO-OESTE')
plt.legend()
Out[109]:

<matplotlib.legend.Legend at 0x7f785e9a1fd0>

Exercícios: Plotando Múltiplos Gráficos

1. Plote os gráficos de exp_vida de acordo com o porte


2. Adicione legendas ao gráfico

Visualizando Categorias
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 79/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

É bastante comum na ciência de dados se classificar váriaveis em:

1. Categóricas - Poucas opções de variabilidade


2. Contínuas - Muitas opções de variabilidade

Uma forma muito boa de entender as suas variáveis categóricas é utilizando o


comando nunique() , ele irá te mostrar quantos valores únicos existem para
cada coluna.

In [110]:
Out[110]:
igm.nunique()
regiao 5
estado 27
municipio 5290
codigo_mun 5570
capital 2
porte 4
populacao 5113
area 5451
densidade_dem 5570
pib 5569
pib_pc 5560
participacao_transf_receita 73
servidores 1542
comissionados 497
comissionados_por_servidor 4488
perc_pop_econ_ativa 119
taxa_empreendedorismo 73
anos_estudo_empreendedor 5566
jornada_trabalho 5566
gasto_pc_saude 4737
hab_p_medico 4757
exp_vida 1135
gasto_pc_educacao 4741
exp_anos_estudo 580
nota_ciencias 5545
nota_humanas 5546
nota_linguagem 5544
nota_mat 5548
nota_redacao 4447
idhm 342
ranking_igm 3303
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 80/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

indice_governanca 390
dtype: int64

Basicamente as três variáveis categóricas com poucas opções que temos


são região , capital e porte .

Além disso temos estado , mas que não iria ficar tão bom para plotar
gráficos. participacao_transf_receita e taxa_empreendedorismo també
podem ser trabalhadas como variáveis categóricas já que apesar de serem
uma porcentagem, os decimals se perderam e acabamos tendo poucas
opções de variabilidade.

Boxplot

Vamos avaliar como cada regiao se sai em relação


ao indice_governanca

In [111]:

Out[111]:
sns.boxplot(x="regiao", y="indice_governanca", data=igm)
<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5e96dda0>

Violin plot

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 81/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Uma forma mais elaborada de fazer isso é com o violin plot, que além de fazer
os quartis, plota em seu lado as distribuições dos valores.

In [112]:

sns.violinplot(x="regiao", y="indice_governanca", data=igm)


/opt/conda/lib/python3.6/site-packages/scipy/sta
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[112]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5cdc3518>

Podemos adicionar mais um agrupamento no gráfico com o comando hue :

In [113]:

sns.violinplot(x="regiao", y="indice_governanca", data=igm, h


/opt/conda/lib/python3.6/site-packages/scipy/s
ue='capital')
tats/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensiona

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 82/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

l indexing is deprecated; use `arr[tuple(seq)]


` instead of `arr[seq]`. In the future this wi
ll be interpreted as an array index, `arr[np.a
rray(seq)]`, which will result either in an er
ror or a different result.

Out[113]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5ebab748>

E inclusive plotar 20 pequenos gráficos de violino ao mesmo tempo:

In [114]:

sns.violinplot(x="regiao", y="indice_governanca", data=igm, h


/opt/conda/lib/python3.6/site-packages/scipy/sta
ue='porte')
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[114]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5ece2d30>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 83/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Uma forma para facilitar a visualização dos gráficos acima é usando


o factorplot , que funciona tanto com linhas quant com colunas.

In [115]:

sns.factorplot(x="regiao", y="indice_governanca", data=igm, c


/opt/conda/lib/python3.6/site-packages/seaborn/c
ol='porte', kind='violin')
ategorical.py:3666: UserWarning:

The `factorplot` function has been renamed to `c


atplot`. The original name will be removed in a
future release. Please update your code. Note th
at the default `kind` in `factorplot` (`'poin
t'`) has changed `'strip'` in `catplot`.

/opt/conda/lib/python3.6/site-packages/scipy/sta
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[115]:

<seaborn.axisgrid.FacetGrid at 0x7f785ed09208>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 84/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Análisando Frequência:
Para contarmos quantas ocorrências temos por cada categoria podemos usar
o .countplot()

In [116]:

Out[116]:
sns.countplot(x='regiao', data=igm)
<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5ea73e48>

Podemos usar também o hue para fazermos uma contagem levando em


consideração outra dimensão.

In [117]:

Out[117]:
sns.countplot(x='regiao', hue='porte', data=igm)
<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5e857cc0>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 85/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

In [118]:

sns.factorplot(x="regiao", data=igm, col='porte', kind='coun


/opt/conda/lib/python3.6/site-packages/seaborn/c
t')
ategorical.py:3666: UserWarning:

The `factorplot` function has been renamed to `c


atplot`. The original name will be removed in a
future release. Please update your code. Note th
at the default `kind` in `factorplot` (`'poin
t'`) has changed `'strip'` in `catplot`.

Out[118]:

<seaborn.axisgrid.FacetGrid at 0x7f785ebaacf8>

Exercícios: Visualizando Categorias

1. Fazer um boxplot de porte no eixo x e exp_vida no eixo y


2. Fazer um violinplot de porte no eixo x e exp_vida no
eixo y com hue=regiao
3. Criar um factorplot do tipo box com porte no
eixo x e exp_vida no eixo y e col='regiao'

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 86/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

4. Pegar o factorplot do item 1 e


substituir col='regiao' por row='regiao'
5. Fazer

Gráficos de Pizza

Um gráfico bastante útil de plotarmos é o gráfico de pizza, podemos fazer isso


com o pandas :

In [119]:
Out[119]:
igm['regiao'].value_counts().plot.pie()
<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5cb5fac8>

Como vemos acima, não fica tão bom esse gráfico. Uma possibilidade melhor
é usarmos a biblioteca plotly .

Para isso iremos precisar dos nomes das regiões quando fazemos o
comando .value_counts() :

In [120]:

Out[120]:
igm['regiao'].value_counts().index
Index(['NORDESTE', 'SUDESTE', 'SUL', 'CENTRO-OES
TE', 'NORTE'], dtype='object')

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 87/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Em labels colocamos os nomes das regiões, e em values colocamos os


valores:

In [121]:

pie_chart = go.Pie(labels=igm['regiao'].value_counts().index,
values=igm['regiao'].value_counts())
plotly.iplot([pie_chart])

Criando novas variáveis categóricas a partir de valores


em branco

Um tipo de variável categórica bastante interessante de avaliar são os valores


em branco:

In [122]:

Out[122]:
igm.isnull().sum()
regiao 0
estado 0
municipio 0

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 88/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

codigo_mun 0
capital 0
porte 0
populacao 0
area 0
densidade_dem 0
pib 0
pib_pc 0
participacao_transf_receita 677
servidores 337
comissionados 0
comissionados_por_servidor 337
perc_pop_econ_ativa 5
taxa_empreendedorismo 0
anos_estudo_empreendedor 0
jornada_trabalho 0
gasto_pc_saude 689
hab_p_medico 619
exp_vida 5
gasto_pc_educacao 690
exp_anos_estudo 5
nota_ciencias 12
nota_humanas 12
nota_linguagem 13
nota_mat 13
nota_redacao 13
idhm 584
ranking_igm 2267
indice_governanca 2267
dtype: int64

Para criarmos ela basta rodarmos método .isnull() e assinalar os valores


ao uma nova coluna sem_igm :

In [123]:

igm['sem_igm'] = igm['indice_governanca'].isnull()

Agora plotamos o gráfico e podemos observar, que a falta de um IGM, indica


uma menor expectativa de vida na maioria das regiões.

In [124]:

sns.violinplot(x="regiao", y="gasto_pc_educacao", data=igm, h


https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 89/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

ue='sem_igm')
/opt/conda/lib/python3.6/site-packages/scipy/s
tats/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensiona


l indexing is deprecated; use `arr[tuple(seq)]
` instead of `arr[seq]`. In the future this wi
ll be interpreted as an array index, `arr[np.a
rray(seq)]`, which will result either in an er
ror or a different result.

Out[124]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5c8ea320>

In [125]:

igm['sem_gasto_pc_saude'] = igm['gasto_pc_saude'].isnull()
In [126]:

sns.violinplot(x="regiao", y="nota_mat", data=igm, hue='sem_g


/opt/conda/lib/python3.6/site-packages/scipy/sta
asto_pc_saude')
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[126]:

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 90/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5c80c160>

Criando novas variáveis categóricas a partir de


agrupamentos

Existe uma função bastante útil no pandas que é o qcut que nos permite
criar categorias a partir de valores contínuos (ou de muitas categorias). Basta
você partir de um princípio de ordenamento e selecionar a quantidade de
categorias final que deseja. No nosso caso escolhemos 3.

In [127]:
Out[127]:
pd.qcut(igm['taxa_empreendedorismo'], 3)
0 (0.2, 0.27]
1 (0.2, 0.27]
2 (0.27, 0.77]
3 (-0.001, 0.2]
4 (-0.001, 0.2]
5 (0.2, 0.27]
6 (-0.001, 0.2]
7 (0.2, 0.27]
8 (0.27, 0.77]
9 (0.2, 0.27]
10 (-0.001, 0.2]
11 (-0.001, 0.2]
12 (0.27, 0.77]
13 (0.2, 0.27]

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 91/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

14 (0.2, 0.27]
15 (-0.001, 0.2]
16 (0.2, 0.27]
17 (-0.001, 0.2]
18 (0.27, 0.77]
19 (0.2, 0.27]
20 (0.27, 0.77]
21 (0.2, 0.27]
22 (-0.001, 0.2]
23 (0.2, 0.27]
24 (0.27, 0.77]
25 (-0.001, 0.2]
26 (-0.001, 0.2]
27 (0.2, 0.27]
28 (-0.001, 0.2]
29 (-0.001, 0.2]
...
5540 (0.2, 0.27]
5541 (-0.001, 0.2]
5542 (0.2, 0.27]
5543 (-0.001, 0.2]
5544 (-0.001, 0.2]
5545 (0.2, 0.27]
5546 (0.27, 0.77]
5547 (0.27, 0.77]
5548 (0.2, 0.27]
5549 (-0.001, 0.2]
5550 (0.2, 0.27]
5551 (-0.001, 0.2]
5552 (-0.001, 0.2]
5553 (-0.001, 0.2]
5554 (0.2, 0.27]
5555 (-0.001, 0.2]
5556 (-0.001, 0.2]
5557 (0.27, 0.77]
5558 (0.2, 0.27]
5559 (0.2, 0.27]
5560 (-0.001, 0.2]
5561 (0.2, 0.27]
5562 (0.27, 0.77]
5563 (-0.001, 0.2]
5564 (0.2, 0.27]
5565 (0.2, 0.27]
5566 (0.27, 0.77]
5567 (-0.001, 0.2]

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 92/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

5568 (0.27, 0.77]


5569 (-0.001, 0.2]
Name: taxa_empreendedorismo, Length: 5570, dty
pe: category
Categories (3, interval[float64]): [(-0.001,
0.2] < (0.2, 0.27] < (0.27, 0.77]]

Vamos criar uma nova coluna com esses valores:

In [128]:

igm['cat_te'] = pd.qcut(igm['taxa_empreendedorismo'], 3)

E vamos plotar um gráfico os utilizando como filtro:

In [129]:

sns.violinplot(x="regiao", y="exp_vida", data=igm, hue='cat_t


/opt/conda/lib/python3.6/site-packages/scipy/sta
e')
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[129]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5c761dd8>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 93/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Exercícios: Visualizando Categorias

1. Criar uma coluna sem_gasto_pc_saude a partir dos valores em


branco da coluna gasto_pc_saude
2. Criar uma coluna cat_te separando os valores em 3 categorias
pra qcut
3. Criar um factorplot do tipo box com porte no
eixo x e exp_vida no eixo y e col='regiao' e row='cat_te
4. Facilite a leitura dos nomes das regiões.
Dica: g.set_xticklabels(rotation=30)

Mais Gráficos Categóricos

Swarm plot

Um tipo de gráfico interessante é o swarm plot que nos permite ver de forma
granular os pontos que compõe uma distribuição, e nos dão a possibilidade de
análises com a abaixo:

In [130]:

Out[130]:
sns.swarmplot(x="regiao", y="indice_governanca", hue='porte',
data=igm)
<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5c657f98>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 94/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Abaixo segue um comando opcional para aumentar todos os gráficos que


serão gerados:

O # é um comentário e significa que o código a seguir dele não será


executado.

In [131]:

# sns.set(rc={'figure.figsize':(16.7,8.27)})

Avaliação de uma variável contínua dada uma variável


categórica

O seaborn de forma automática agrupa de acordo com as variáveis


categóricas que você coloca no eixo x e tira as médias das variáveis que
você coloca no eixo y .

Segue um índice de governança por região e por porte de cidade:

In [132]:

sns.barplot(x="regiao", y="indice_governanca", hue='porte', d


/opt/conda/lib/python3.6/site-packages/scipy/s
ata=igm)
tats/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensiona


l indexing is deprecated; use `arr[tuple(seq)]
` instead of `arr[seq]`. In the future this wi
ll be interpreted as an array index, `arr[np.a
rray(seq)]`, which will result either in an er

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 95/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

ror or a different result.

Out[132]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5c5cd0b8>

Segue a taxa de empreendedorismo por região:

In [133]:

sns.barplot(x="regiao", y="taxa_empreendedorismo",
/opt/conda/lib/python3.6/site-packages/scipy/sta data=igm)
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[133]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5c514f60>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 96/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Seguem os anos de estudo do empreendedor por região:

In [134]:

sns.barplot(x="regiao", y="anos_estudo_empreendedor",
/opt/conda/lib/python3.6/site-packages/scipy/sta data=i
gm)
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[134]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5c4f4588>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 97/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Segue o pib_pc por região. Note que não é uma média ponderada e sim
apenas a média dos munícipios sem levar em conta a população de cada um.

In [135]:

sns.barplot(x="regiao", y="pib_pc", data=igm)


/opt/conda/lib/python3.6/site-packages/scipy/sta
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[135]:

<matplotlib.axes._subplots.AxesSubplot at 0x7f78
5c45e898>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 98/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Groupby

Os gráficos acima estão pegando uma variável contínua e claculando a média


dela para uma dada região, para replicarmos o gráfico acima em números
poderíamos utilizar o seguinte comando:

In [136]:

Out[136]:
igm.groupby('regiao')['pib_pc'].mean()
regiao
CENTRO-OESTE 23911.187623
NORDESTE 8159.934108
NORTE 12249.159778
SUDESTE 21024.014323
SUL 25516.579941
Name: pib_pc, dtype: float64

Exercícios: Mais Gráficos Categóricos

1. Fazer um gráfico a partir do agrupamento


de porte avaliando gasto_pc_saude
2. Fazer o exercício 1 a partir de um groupby()
3. Fazer
um swarmplot usando y="gasto_pc_saude" , hue='porte'

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 99/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Explorando variáveis contínuas

Gráficos Mais Elaborados

Abaixo iremos plotar em apenas uma linha de código, um gráfico que mostra a
relação entre 'Gastos em saúde e educação per capita' com o 'Índice de
Desempenho'.

In [137]:

sns.pairplot(x_vars=['gasto_pc_educacao'], y_vars=['nota_mat'
/opt/conda/lib/python3.6/site-packages/seaborn/a
], data=igm, hue="regiao",
xisgrid.py:2065: size=5)
UserWarning:

The `size` parameter has been renamed to `height


`; pleaes update your code.

Out[137]:

<seaborn.axisgrid.PairGrid at 0x7f785c437710>

Com o simples parâmetro hue="Região" conseguimos gerar um gráfico


colorido de acordo com as regiões do Brasil, que são uma coluna na tabela
original.

Regressões Lineares
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 100/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

De forma extremamente simples, podemos plotar regressões lineares no


gráfico acima. Bastante adicionarmos o parâmetro kind='reg' no código acima.

In [138]:

sns.pairplot(x_vars=['gasto_pc_educacao'], y_vars=['nota_mat'
/opt/conda/lib/python3.6/site-packages/seaborn/a
], data=igm, hue="regiao",
xisgrid.py:2065: kind='reg', size=5)
UserWarning:

The `size` parameter has been renamed to `height


`; pleaes update your code.

/opt/conda/lib/python3.6/site-packages/scipy/sta
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[138]:

<seaborn.axisgrid.PairGrid at 0x7f785c34ea20>

Análise do Tamanho do Nome do Município

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 101/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Uma análise simples, mas interessante é vermos se o tamanho do nome de


um municipio em número de caracteres influencia o idhm

Para computar o número de caracteres basta usar o método len()

In [139]:

igm['nome_len'] = igm['municipio'].str.len()

Para plotarmos o gráfico, podemos fazer um pairplot, com o


parâmetro kind para vermos uma regressão linear.

In [140]:

sns.pairplot(x_vars=['nome_len'], y_vars=['idhm'], data=igm,


/opt/conda/lib/python3.6/site-packages/seaborn/a
kind='reg', size=5)
xisgrid.py:2065: UserWarning:

The `size` parameter has been renamed to `height


`; pleaes update your code.

/opt/conda/lib/python3.6/site-packages/scipy/sta
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[140]:

<seaborn.axisgrid.PairGrid at 0x7f785c34e8d0>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 102/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Múltiplas Regressões Lineares

Podemos fazermos múltiplas regressões lineares e histogramas ao mesmo


tempo com o sns.pairplot() :

Para isso vamos criar um DataFrame temporário:

In [141]:

temp_df = igm[['nota_mat','exp_vida', 'gasto_pc_saude', 'gast


o_pc_educacao',
E vamos 'regiao']]
usar o pairplot() com hue=regiao e kind=reg :

In [142]:

sns.pairplot(temp_df, hue='regiao', kind='reg')


/opt/conda/lib/python3.6/site-packages/statsmo
dels/nonparametric/kde.py:448: RuntimeWarning:

invalid value encountered in greater

/opt/conda/lib/python3.6/site-packages/statsmo
dels/nonparametric/kde.py:448: RuntimeWarning:

invalid value encountered in less

/opt/conda/lib/python3.6/site-packages/scipy/s
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 103/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

tats/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensiona


l indexing is deprecated; use `arr[tuple(seq)]
` instead of `arr[seq]`. In the future this wi
ll be interpreted as an array index, `arr[np.a
rray(seq)]`, which will result either in an er
ror or a different result.

Out[142]:

<seaborn.axisgrid.PairGrid at 0x7f785c32bcf8>

O erro aconteceu porque tinhamos valores NaN no nosso DataFrame,


podemos resolver isso da seguinte forma:

In [143]:

sns.pairplot(temp_df.dropna(), hue='regiao', kind='reg')


/opt/conda/lib/python3.6/site-packages/scipy/s
tats/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensiona


l indexing is deprecated; use `arr[tuple(seq)]
` instead of `arr[seq]`. In the future this wi
ll be interpreted as an array index, `arr[np.a
rray(seq)]`, which will result either in an er

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 104/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

ror or a different result.

Out[143]:

<seaborn.axisgrid.PairGrid at 0x7f785374de48>

Exercícios: Explorando Variáveis Contínuas

1. Fazer um pairplot
usando taxa_empreendedorismo e nota_mat usando hue=porte (apen
1 gráfico e não 4)
2. Fazer um pairplot
usando taxa_empreendedorismo e nota_mat usando hue=porte (4
gráficos)
3. Fazer um pairplot
usando taxa_empreendedorismo , anos_estudo_empreendedor , nota_m
usando hue=porte

Plots usando Escala logarítimica

Vai acontecer de termos alguns gráficos que não ficam em uma escala
adequada, para isso podemos tentar converter para uma escala logarítimica.

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 105/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

In [144]:

sns.pairplot(x_vars=['populacao'], y_vars=['indice_governanc
/opt/conda/lib/python3.6/site-packages/seaborn/a
a'], data=igm, hue="regiao",
xisgrid.py:2065: UserWarning:kind='reg', size=5)

The `size` parameter has been renamed to `height


`; pleaes update your code.

/opt/conda/lib/python3.6/site-packages/scipy/sta
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[144]:

<seaborn.axisgrid.PairGrid at 0x7f7853046940>

Para converter para log podemos usar o numpy que é uma biblioteca
bastante importante para manipulação de dados, e é a base do pandas .

In [145]:

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 106/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

import numpy as np
Vamos criar uma coluna nova log_pop com os valores logarítimicos
da populacao por meio da função .log() do numpy :

In [146]:

igm['log_pop'] = np.log(igm['populacao'])

Vamos plotar o gráfico de novo substituindo populacao por log_pop

In [147]:

sns.pairplot(x_vars=['log_pop'], y_vars=['indice_governanca'
/opt/conda/lib/python3.6/site-packages/seaborn/a
], data=igm, hue="regiao",
xisgrid.py:2065: kind='reg', size=5)
UserWarning:

The `size` parameter has been renamed to `height


`; pleaes update your code.

/opt/conda/lib/python3.6/site-packages/scipy/sta
ts/stats.py:1713: FutureWarning:

Using a non-tuple sequence for multidimensional


indexing is deprecated; use `arr[tuple(seq)]` in
stead of `arr[seq]`. In the future this will be
interpreted as an array index, `arr[np.array(se
q)]`, which will result either in an error or a
different result.

Out[147]:

<seaborn.axisgrid.PairGrid at 0x7f785301da20>

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 107/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Exercícios: Plots usando Escala logarítimica

1. Plote um pairplot de anos_estudo_empreendedor por pib_pc


2. Crie uma nova variável chamada log_pib_pc com o log
de pib_pc
3. Plote
um pairplot de anos_estudo_empreendedor por log_pib_pc

Projeto:
Pegue algum dataset de sua escolha ou vá em http://dados.gov.br/ e escolha
algum conjunto de dados que te interesse.

De posse desses conjunto de dados faça os seguintes passos:

1. Importe o seu conjunto de dados como um DataFrame


2. Faça a conversão das colunas que estiverem com formato
inadequado (números que estão em formato de str )
3. Faça 8 gráficos a partir dos seus dados
4. Faça um resumo dos principais pontos encontrados nos gráficos
avaliados

Bônus: Mostrando Valores como um Percentual

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 108/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

A opção mais recomendada é usar o .style.format() , que irá mexer


apenas na exibição dos dados e não irá alterar a estrutura dos dados em si.

Para usarmos o .style.format() , primeiro precisamos de criar


um dict com o nome da coluna e o tipo de formatação que desejamos:

In [148]:

format_dict = {'perc_pop_econ_ativa' :'{:.2%}'}

Depois podemos executar o .style.format() em uma parte


do DataFrame (ou todo ele se quiséssemos):

In [149]:
Out[149]:
igm.sample(5).style.format(format_dict)

regiao estado municipio codigo_mun capita


SAO JOAO
4890 NORDESTE PB 2514008 0
DO CARIRI

1537 NORDESTE BA ALAGOINHAS 2900702 0

4495 NORDESTE BA UIBAI 2932408 0

ILHA DAS
5235 NORDESTE SE 2802700 0
FLORES

196 SUDESTE SP ADAMANTINA 3500105 0

Se olharmos o .info() , veremos que perc_pop_econ_ativa ainda é


numérico:

In [150]:

igm.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5570 entries, 0 to 5569
Data columns (total 37 columns):
regiao 5570 non-null o
bject
estado 5570 non-null o
bject
municipio 5570 non-null o
bject
codigo_mun 5570 non-null i

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 109/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

nt64
capital 5570 non-null i
nt64
porte 5570 non-null o
bject
populacao 5570 non-null f
loat64
area 5570 non-null f
loat64
densidade_dem 5570 non-null f
loat64
pib 5570 non-null f
loat64
pib_pc 5570 non-null f
loat64
participacao_transf_receita 4893 non-null f
loat64
servidores 5233 non-null f
loat64
comissionados 5570 non-null f
loat64
comissionados_por_servidor 5233 non-null f
loat64
perc_pop_econ_ativa 5565 non-null f
loat64
taxa_empreendedorismo 5570 non-null f
loat64
anos_estudo_empreendedor 5570 non-null f
loat64
jornada_trabalho 5570 non-null f
loat64
gasto_pc_saude 4881 non-null f
loat64
hab_p_medico 4951 non-null f
loat64
exp_vida 5565 non-null f
loat64
gasto_pc_educacao 4880 non-null f
loat64
exp_anos_estudo 5565 non-null f
loat64
nota_ciencias 5558 non-null f
loat64
nota_humanas 5558 non-null f
loat64

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 110/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

nota_linguagem 5557 non-null f


loat64
nota_mat 5557 non-null f
loat64
nota_redacao 5557 non-null f
loat64
idhm 4986 non-null f
loat64
ranking_igm 3303 non-null o
bject
indice_governanca 3303 non-null f
loat64
sem_igm 5570 non-null b
ool
sem_gasto_pc_saude 5570 non-null b
ool
cat_te 5570 non-null c
ategory
nome_len 5570 non-null i
nt64
log_pop 5570 non-null f
loat64
dtypes: bool(2), category(1), float64(26), int
64(3), object(5)
memory usage: 1.5+ MB

Podemos converter várias colunas ao mesmo tempo criando um dicionário


com vários valores:

In [151]:

format_dict = {'perc_pop_econ_ativa' :'{:.0%}', 'taxa_empreen


dedorismo'
E podemos :'{:.0%}'}
executar o .style.format() novamente

In [152]:
Out[152]:
igm.sample(5).style.format(format_dict)

regiao estado municipio codigo_mun cap

3395 NORDESTE BA ARACI 2902104 0

79 SUDESTE ES ARACRUZ 3200607 0

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 111/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

regiao estado municipio codigo_mun cap


SAO MIGUEL
5016 NORDESTE PI DA BAIXA 2210383 0
GRANDE
SAO JOSE
5207 SUL SC 4216800 0
DO CERRITO
PRESIDENTE
4630 NORDESTE MA 2109239 0
MEDICI

Bônus: Juntando DataFrames

Vamos importar uma segunda base de exemplos:

In [153]:

igf = pd.read_excel('../input/exemplo_2.xls', header=[0], ski


/opt/conda/lib/python3.6/site-packages/pandas/ut
prows=8, skip_footer=2) FutureWarning:
il/_decorators.py:178:

the 'skip_footer' keyword is deprecated, use 'sk


ipfooter' instead

Vamos observar como estão nossos dados:

In [154]:

Out[154]:
igf

Ranking
Unnamed:
IFGF UF Município IFGF
1
Geral
0 Nacional Estadual NaN NaN NaN
Gavião
1 1 1 SP 0.905346
Peixoto
São Gonçalo
2 2 1 CE 0.875311
do Amarante
3 3 1 SC Bombinhas 0.867852
4 4 2 SP São Pedro 0.85653
Balneário
5 5 2 SC 0.844142
Camboriú
6 6 1 RJ Niterói 0.838358

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 112/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Ranking
Unnamed:
IFGF UF Município IFGF
1
Geral
7 7 1 MT Cláudia 0.828288
8 8 3 SP Indaiatuba 0.827676
9 9 4 SP São Sebastião 0.822041
10 10 5 SP Ilhabela 0.821795
11 11 3 SC Joaçaba 0.818589
São José do
12 12 1 RS 0.805843
Hortêncio
13 13 1 MS Costa Rica 0.803581
14 14 1 MG Extrema 0.792549
15 15 1 AL Traipu 0.790219
16 16 2 MT Sinop 0.789989
17 17 6 SP Caraguatatuba 0.789986
Aparecida de
18 18 1 GO 0.78919
Goiânia
19 19 1 PA Tucumã 0.788871
20 20 3 MT Vila Rica 0.787556
São Miguel do
21 21 2 GO 0.787517
Araguaia
22 22 4 MT Nova Mutum 0.78414
23 23 1 PR Ortigueira 0.782068
São Félix do
24 24 1 BA 0.777015
Coribe
25 25 7 SP Louveira 0.775576
São João do
26 26 1 PI 0.772625
Piauí
27 27 2 RS Forquetinha 0.771405
28 28 2 PR Pato Bragado 0.770608
29 29 1 TO Porto Nacional 0.769519
... ... ... ... ... ...
5539 NaN NaN GO Mairipotaba *
5540 NaN NaN GO Mambaí *
5541 NaN NaN GO Marzagão *
5542 NaN NaN GO Matrinchã *
5543 NaN NaN GO Minaçu *
5544 NaN NaN GO Mutunópolis *
5545 NaN NaN GO Nazário *
5546 NaN NaN GO Nova Crixás *
Nova Iguaçu
5547 NaN NaN GO *
de Goiás
5548 NaN NaN GO Nova Roma *
5549 NaN NaN GO Novo Gama *
5550 NaN NaN GO Orizona *
Palestina de
5551 NaN NaN GO *
Goiás
5552 NaN NaN GO Paranaiguara *
5553 NaN NaN GO Paraúna *
https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 113/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Ranking
Unnamed:
IFGF UF Município IFGF
1
Geral
5554 NaN NaN GO Posse *
5555 NaN NaN GO Rio Verde *
5556 NaN NaN GO Sanclerlândia *
Santa Cruz de
5557 NaN NaN GO *
Goiás
Santa
5558 NaN NaN GO Terezinha de *
Goiás
5559 NaN NaN GO São Domingos *
São João
5560 NaN NaN GO *
d'Aliança
5561 NaN NaN GO São Patrício *
5562 NaN NaN GO São Simão *
5563 NaN NaN GO Sítio d'Abadia *
Teresina de
5564 NaN NaN GO *
Goiás
5565 NaN NaN GO Turvânia *
5566 NaN NaN GO Vicentinópolis *
5567 NaN NaN GO Vila Boa *
5568 NaN NaN GO Vila Propício *

5569 rows × 10 columns

Vamos remover a primeira linha. Usamos o método .copy() para evitarmos


avisos no futuro.

In [155]:

igf = igf[1:].copy()

Vamos renomear a coluna Unnamed: 1':'Ranking Estadual , para isso


vamos usar o comando rename() :

In [156]:

igf.rename(columns={'Unnamed: 1':'Ranking Estadual'}, inplace


=True)
Como não temos códigos em ambos os DataFrames com nomes
de df e igf , vamos fazer a junção deles por meio dos nomes dos
municípios, para isso vamos deixar o nome da coluna referente aos nomes
dos municípios iguais nos 2 DataFrames .

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 114/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

In [157]:

igf.rename(columns={'Município':'mun'}, inplace=True)
df.rename(columns={'NOME
Vamos DO MUNICÍPIO':'mun'},
tentar juntar os DataFrames e ver o que acontece: inplace=True)

In [158]:

Out[158]:
df.merge(igf)

COD. COD. POPULAÇÃO


UF mun co
UF MUNIC ESTIMADA

Alta Floresta
0 RO 11 15 25437 11
D'Oeste
1 RO 11 23 Ariquemes 107345 11
2 RO 11 31 Cabixi 6224 11
3 RO 11 49 Cacoal 88507 11
4 RO 11 56 Cerejeiras 17934 11
Colorado do
5 RO 11 64 18467 11
Oeste
6 RO 11 72 Corumbiara 8659 11
Costa
7 RO 11 80 17400 11
Marques
Espigão
8 RO 11 98 33030 11
D'Oeste
Guajará-
9 RO 11 106 47451 11
Mirim
10 RO 11 114 Jaru 55871 11
11 RO 11 122 Ji-Paraná 132667 11
Machadinho
12 RO 11 130 38609 11
D'Oeste
Nova
13 RO 11 148 Brasilândia 21747 11
D'Oeste
Ouro Preto
14 RO 11 155 39759 11
do Oeste
Pimenta
15 RO 11 189 38051 11
Bueno
16 RO 11 205 Porto Velho 519.436 (1) 11
Presidente
17 RO 11 254 22124 11
Médici
18 RO 11 262 Rio Crespo 3829 11
Rolim de
19 RO 11 288 57074 11
Moura
Santa Luzia
20 RO 11 296 8198 11
D'Oeste
21 RO 11 304 Vilhena 95630 11
São Miguel
22 RO 11 320 24181 11
do Guaporé
Nova
23 RO 11 338 28891 11
Mamoré

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 115/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

COD. COD. POPULAÇÃO


UF mun co
UF MUNIC ESTIMADA

Alvorada
24 RO 11 346 16747 11
D'Oeste
Alto Alegre
25 RO 11 379 14045 11
dos Parecis
26 RO 11 403 Alto Paraíso 20916 11
27 RO 11 452 Buritis 39044 11
Novo
28 RO 11 502 Horizonte do 10051 11
Oeste
29 RO 11 601 Cacaulândia 6460 11
... ... ... ... ... ... ...
São João
5496 GO 52 20009 12643 52
d'Aliança
São João da
5497 GO 52 20058 1547 52
Paraúna
São Luís de
5498 GO 52 20108 33118 52
Montes Belos
São Miguel
5499 GO 52 20207 22684 52
do Araguaia
São Miguel
5500 GO 52 20264 do Passa 4037 52
Quatro
5501 GO 52 20280 São Patrício 2070 52
5502 GO 52 20405 São Simão 19697 52
Senador
5503 GO 52 20454 105459 52
Canedo
5504 GO 52 20504 Serranópolis 8323 52
5505 GO 52 20603 Silvânia 20478 52
5506 GO 52 20686 Simolândia 6891 52
5507 GO 52 20702 Sítio d'Abadia 2998 52
Taquaral de
5508 GO 52 21007 3625 52
Goiás
Teresina de
5509 GO 52 21080 3363 52
Goiás
Terezópolis
5510 GO 52 21197 7634 52
de Goiás
Três
5511 GO 52 21304 2900 52
Ranchos
5512 GO 52 21403 Trindade 121266 52
5513 GO 52 21452 Trombas 3571 52
5514 GO 52 21502 Turvânia 4818 52
5515 GO 52 21551 Turvelândia 5050 52
5516 GO 52 21577 Uirapuru 2961 52
5517 GO 52 21601 Uruaçu 40082 52
5518 GO 52 21700 Uruana 14195 52
5519 GO 52 21809 Urutaí 3154 52
Valparaíso de
5520 GO 52 21858 159500 52
Goiás
5521 GO 52 21908 Varjão 3856 52

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 116/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

COD. COD. POPULAÇÃO


UF mun co
UF MUNIC ESTIMADA

5522 GO 52 22005 Vianópolis 13675 52


5523 GO 52 22054 Vicentinópolis 8397 52
5524 GO 52 22203 Vila Boa 5731 52
5525 GO 52 22302 Vila Propício 5690 52

5526 rows × 14 columns

O nosso DataFrame após o merge() ficou com 5526 linhas, o que significa
que 44 munícipios não estão com nomes iguais entre os DataFrames

In [159]:
Out[159]:
df.merge(igf).shape
(5526, 14)

O DataFrame chamado df tem 5570 munícipios e com 6 colunas:

In [160]:

Out[160]:
df.shape
(5570, 6)

O DataFrame chamado df tem 5568 munícipios e com 10 colunas:

In [161]:
Out[161]:
igf.shape
(5568, 10)

Engraçado, que temos 10 colunas em um DataFrame e 6 colunas em outro,


mas o nosso resultado do merge é de 14 colunas, por que isso?

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 117/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Retirando acentos e caracteres especiais:

Vamos criar uma coluna chamada Munícipio para guardar os nomes


originais dos munícipios.

In [162]:

df['Município'] = df['mun']

Podemos usar o método str.normalize... para retirar os acentos e outros


caracteres especiais:

In [163]:

igf['mun'] = igf['mun'].str.normalize('NFKD').str.encode('asc
ii', errors='ignore').str.decode('utf-8')
Podemos ver que ganhamos mais algumas conversões, mas ainda foram
df['mun']
poucas. = df['mun'].str.normalize('NFKD').str.encode('asci
i', errors='ignore').str.decode('utf-8')

In [164]:
Out[164]:
df.merge(igf).shape
(5534, 15)

Retirando os espaços

Vamos usar o comando str.replace(' ','') para remover os espaços


em branco dos munícipios

In [165]:

igf['mun'] = igf['mun'].str.replace(' ','')


df['mun']
Podemos = df['mun'].str.replace('
ver que ganhamos mais alguns itens ','')
no nosso merge, mas ainda
falta um pouco:

In [166]:
Out[166]:
df.merge(igf).shape
(5550, 15)

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 118/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

O Comando isin():

Atráves do comando isin() conseguimos se os valores de uma coluna


estão contidos em outra coluna. Com o ~ conseguimos saber quais os
valores não estão contidos.

A seguir vamos selecionar os valores da coluna mun de df que não estão


contidos na coluna mun de igf .

In [167]:

df_mun = df[~df.mun.isin(igf['mun'])]['mun'].values

A seguir vamos selecionar os valores da coluna mun de igf que não estão
contidos na coluna mun de df .

In [168]:

igf_mun = igf[~igf.mun.isin(df['mun'])]['mun'].values

Comparando proximidade de strings:

Vamos importar o SequenceMatcher para compararmos dois textos e


gerarmos um score de quão próximos eles são (1 é idêntico e 0 é nada
similar).

In [169]:

from difflib import SequenceMatcher

Vamos testar todos os valores contidos nas


variáveis df_mun e igf_mun para saber quais são os valores na
coluna mun de cada DataFrame que mais se assemelham, e substituir
esses valores caso eles tenham uma semelhança maior do que 80%.

In [170]:

for municipio_1 in df_mun:


----------------------------------------------
-----------------------------
NameError Trac
print(score,
eback municipios_proximos)
(most recent call last)

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 119/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

if score > 0.8:


<ipython-input-170-b52e5b088a3e> in <module>()
2 idx = igf[igf['mun']==municipios_proximos[1]].index[0
] 3
----> 4 igf.at[idx, 'mun']municipios_proximos)
print(score, = municipios_proximos[0]
5 if score > 0.8:
6 idx = igf[igf['mun']==municipi
os_proximos[1]].index[0]

NameError: name 'score' is not defined

Vamos avaliar as diferenças que ainda restam:

In [171]:
Out[171]:
df.merge(igf).shape
(5550, 15)

In [172]:
Out[172]:
df[~df.mun.isin(igf.mun)]

COD. COD. POPULAÇ


UF mun
UF MUNIC ESTIMAD

197 PA 15 2954 EldoradodoCarajas 32892

259 PA 15 6500 SantaIzabeldoPara 68836

351 TO 17 6001 CoutoMagalhaes 5529

436 TO 17 20499 SaoValerio 4111

977 CE 23 6306 Itapaje 51945

1187 RN 24 10306 SerraCaiada 10099

1441 PB 25 15401 SaoVicentedoSerido 11084

1482 PE 26 1607 BelemdoSaoFrancisco 20670

1525 PE 26 5459 FernandodeNoronha 3016

1540 PE 26 6903 Iguaracy 12175

1562 PE 26 8503 LagoadeItaenga 21338

1775 SE 28 2601 GracchoCardoso 5870

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 120/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

COD. COD. POPULAÇ


UF mun
UF MUNIC ESTIMAD
2339 MG 31 8909 Brazopolis 14889

3261 RJ 33 5901 TrajanodeMoraes 10352

3434 SP 35 15004 EmbudasArtes 267054

3612 SP 35 30805 MogiMirim 92365

4974 RS 43 17103 Sant'AnadoLivramento 82312

5280 MT 51 7008 Poxoreu 15985


5569 DF 53 108 Brasilia 3039444

In [173]:

Out[173]:
igf[~igf.mun.isin(df.mun)]

Ranking
Ranking
IFGF UF mun IFGF
Estadual
Geral
461 461 15 CE Itapage 0.62208
1528 1528 219 MG Brasopolis 0.52113
1927 1927 63 TO CoutodeMagalhaes 0.49194
2103 2103 34 PE Iguaraci 0.47870
2911 2911 375 SP Embu 0.4252
3217 3217 26 PA SantaIsabeldoPara 0.40297
3586 3586 466 SP MojiMirim 0.36913
3639 3639 80 PB SaoDomingosdePombal 0.36329
3663 3663 461 RS SantanadoLivramento 0.36090
4019 4019 42 SE GrachoCardoso 0.30473
4091 4091 117 PE BelemdeSaoFrancisco 0.29164
4602 NaN NaN PA EldoradodosCarajas *
4702 NaN NaN TO SaoValeriodaNatividade *
4962 NaN NaN PB Serido *
4973 NaN NaN PE LagoadoItaenga *
5327 NaN NaN RJ TrajanodeMorais *
5488 NaN NaN MT Poxoreo *

O comando .at[]

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 121/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Para substituirmos uma célula em específico é ideal usar o comando .at[]

In [174]:

igf.at[2911,'mun'] = 'EmbudasArtes'

Podemos conferir que a atualização foi efetuada de forma correta:

In [175]:
Out[175]:
df[~df.mun.isin(igf.mun)]

COD. COD. POPULAÇÃO


UF mun
UF MUNIC ESTIMADA

197 PA 15 2954 EldoradodoCarajas 32892

259 PA 15 6500 SantaIzabeldoPara 68836

351 TO 17 6001 CoutoMagalhaes 5529

436 TO 17 20499 SaoValerio 4111

977 CE 23 6306 Itapaje 51945

1187 RN 24 10306 SerraCaiada 10099

1441 PB 25 15401 SaoVicentedoSerido 11084

1482 PE 26 1607 BelemdoSaoFrancisco 20670

1525 PE 26 5459 FernandodeNoronha 3016

1540 PE 26 6903 Iguaracy 12175

1562 PE 26 8503 LagoadeItaenga 21338

1775 SE 28 2601 GracchoCardoso 5870

2339 MG 31 8909 Brazopolis 14889

3261 RJ 33 5901 TrajanodeMoraes 10352

3612 SP 35 30805 MogiMirim 92365

4974 RS 43 17103 Sant'AnadoLivramento 82312

5280 MT 51 7008 Poxoreu 15985


5569 DF 53 108 Brasilia 3039444

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 122/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

In [176]:
Out[176]:
igf[~igf.mun.isin(df.mun)]

Ranking
Ranking
IFGF UF mun IFGF
Estadual
Geral
461 461 15 CE Itapage 0.62208
1528 1528 219 MG Brasopolis 0.52113
1927 1927 63 TO CoutodeMagalhaes 0.49194
2103 2103 34 PE Iguaraci 0.47870
3217 3217 26 PA SantaIsabeldoPara 0.40297
3586 3586 466 SP MojiMirim 0.36913
3639 3639 80 PB SaoDomingosdePombal 0.36329
3663 3663 461 RS SantanadoLivramento 0.36090
4019 4019 42 SE GrachoCardoso 0.30473
4091 4091 117 PE BelemdeSaoFrancisco 0.29164
4602 NaN NaN PA EldoradodosCarajas *
4702 NaN NaN TO SaoValeriodaNatividade *
4962 NaN NaN PB Serido *
4973 NaN NaN PE LagoadoItaenga *
5327 NaN NaN RJ TrajanodeMorais *
5488 NaN NaN MT Poxoreo *

Vamos terminar de substituir outros munícipios que façam sentido:

In [177]:

igf.at[4702, 'mun'] = 'SaoValerio'


In [178]:

igf.at[4962, 'mun'] = 'SaoVicentedoSerido'

Vamos avaliar as diferenças:

In [179]:
Out[179]:
df[~df.mun.isin(igf.mun)]

COD. COD. POPULAÇ


UF mun
UF MUNIC ESTIMAD

197 PA 15 2954 EldoradodoCarajas 32892

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 123/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

COD. COD. POPULAÇ


UF mun
UF MUNIC ESTIMAD

259 PA 15 6500 SantaIzabeldoPara 68836

351 TO 17 6001 CoutoMagalhaes 5529

977 CE 23 6306 Itapaje 51945

1187 RN 24 10306 SerraCaiada 10099

1482 PE 26 1607 BelemdoSaoFrancisco 20670

1525 PE 26 5459 FernandodeNoronha 3016

1540 PE 26 6903 Iguaracy 12175

1562 PE 26 8503 LagoadeItaenga 21338

1775 SE 28 2601 GracchoCardoso 5870

2339 MG 31 8909 Brazopolis 14889

3261 RJ 33 5901 TrajanodeMoraes 10352

3612 SP 35 30805 MogiMirim 92365

4974 RS 43 17103 Sant'AnadoLivramento 82312

5280 MT 51 7008 Poxoreu 15985


5569 DF 53 108 Brasilia 3039444

In [180]:
Out[180]:
igf[~igf.mun.isin(df.mun)]

Ranking
Ranking
IFGF UF mun IFGF
Estadual
Geral
461 461 15 CE Itapage 0.62
1528 1528 219 MG Brasopolis 0.52
1927 1927 63 TO CoutodeMagalhaes 0.49
2103 2103 34 PE Iguaraci 0.47
3217 3217 26 PA SantaIsabeldoPara 0.40
3586 3586 466 SP MojiMirim 0.36
3639 3639 80 PB SaoDomingosdePombal 0.36
3663 3663 461 RS SantanadoLivramento 0.36
4019 4019 42 SE GrachoCardoso 0.30
4091 4091 117 PE BelemdeSaoFrancisco 0.29
4602 NaN NaN PA EldoradodosCarajas *

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 124/125
01/11/2021 Introducao a Analise de Dados - Python e pandas | Kaggle

Ranking
Ranking
IFGF UF mun IFGF
Estadual
Geral
4973 NaN NaN PE LagoadoItaenga *
5327 NaN NaN RJ TrajanodeMorais *
5488 NaN NaN MT Poxoreo *

Neste ponto as diferenças são mínimas, e a questão é realmente uma


intervenção humana de caso a caso para decidir qual caminho vai ser dado
para a junção entre tabelas.

In [181]:

Out[181]:
link code
df.merge(igf).shape
(5553, 15)

https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas 125/125

Você também pode gostar