M2 - Análise de dados com Python
M2 - Análise de dados com Python
disponível na Unsplash.
Editada pelo autor.
Módulo 2 - Manipulação
de dados com Pandas
Sumário
1.1 Explorando Diferentes Formatos de Arquivos e Entrada/Saída de 4 2.1 Explorando a Diferença Prática entre Média, Mediana e Moda 17
Dados 2.2 Compreendendo Variância e Desvio Padrão 19
1.2 Filtragem, Seleção e União de tabelas 8 2.3 Análise Descritiva com Pandas 24
1.3 Lidando com Dados Faltantes 14 2.4 Exercício Guiado de Análise de Dados com Pandas
26
3
JSON (JavaScript Object Notation) • Leitura de Arquivos XML: para ler arquivos XML, utilizamos a função
read_xml():
dados = pd.read_json('caminho/do/arquivo.json')
dados.to_json('caminho/do/arquivo_salvo.json')
HTML (HyperText Markup Language) • Leitura de HTML de URL: outro ponto interessante sobre o HTML é
que podemos ler esses dados de um site diretamente com a função a
seguir, sem ter que salvar um arquivo:
É a linguagem padrão para criar e estruturar páginas web. Na análise de
dados, o HTML é usado para extrair e manipular informações de tabelas e pd.read_html(url)
outros elementos presentes em páginas web.
• Leitura de Arquivos HTML: para ler tabelas de um arquivo HTML • Escrita de Arquivos HTML: para salvar um DataFrame como HTML,
salvo na sua máquina, utilizamos a função read_html(). Ele retorna utilizamos a função to_html():
uma lista de DataFrames, pois um arquivo HTML pode conter várias
tabelas. dados.to_html('caminho/do/arquivo_salvo.html')
dados = pd.read_html('caminho/do/arquivo.html')
import pandas as pd df_ ltered = df[(df['Ano'] > 1980) & (df['Gênero'] == 'Drama')]
print(df_ ltered)
# Criando um DataFrame de exemplo
data = {
'Título': ['O Poderoso Chefão', 'Star Wars', 'Forrest Gump', 'Matrix'], Saída:
'Ano': [1972, 1977, 1994, 1999], Ano Gênero
Título
'Gênero': ['Drama', 'Ficção Cientí ca', 'Drama', 'Ação']
} 2 Forrest Gump 1994 Drama
df = pd.DataFrame(data)
• Filtragem com Funções: observe o exemplo filtrando dados usando Agora, veremos algumas possibilidades de seleção de dados.
uma função personalizada.
# Filtrando usando uma função • Seleção de Colunas: veja como selecionar colunas específicas de um
def is_classic(year): DataFrame.
return year < 2000
df_titles_years = df[['Título', 'Ano']]
df_classics = df[df['Ano'].apply(is_classic)] print(df_titles_years)
print(df_classics)
Saída:
Saída:
Título Ano
Título Ano Gênero 0 O Poderoso Chefão 1972
0 O Poderoso Chefão 1972 Drama 1 Star Wars 1977
1 Star Wars 1977 Ficção Científica 2 Forrest Gump 1994
2 Forrest Gump 1994 Drama 3 Matrix 1999
3 Matrix 1999 Ação
Seleção de dados
É o processo de escolher um subconjunto dos dados disponíveis. Por
exemplo, você pode selecionar apenas as colunas “Título” e “Ano” de uma
tabela com muitas colunas com informações de filmes.
11
• Seleção de Linhas por Índice: observe o exemplo com seleção de quando você precisa combinar dados com base em colunas específicas que
linhas específicas usando índices. compartilham valores comuns.
• Outer join: retorna todas as linhas de uma ou ambas as tabelas, # Realizando um Right Outer Join
mesmo que não haja correspondência na outra tabela, preenchendo df_right_join = pd.merge(left, right, on='ID', how='right')
os valores ausentes com nulos. print(df_right_join)
O outer join possui três variações. Veremos cada uma delas.
Saída:
• Left outer join: retorna todas as linhas da tabela à esquerda e as
linhas correspondentes da tabela à direita. Se não houver
correspondência, os valores da tabela direita são preenchidos com ID Título Gênero
NaN.(Not a Number - Não é um número). Observe um exemplo: 0 2 Friends Comédia
1 3 Game of Thrones Drama
# Realizando um Left Outer Join
df_left_join = pd.merge(left, right, on='ID', how='left') 2 4 NaN Ação
print(df_left_join)
Saída:
ID Título Gênero
0 1 Breaking Bad NaN
1 2 Friends Comédia
2 3 Game of Thrones Drama
INNER JOIN
Saída:
1 Friends 2 Comédia
2 Game of Thrones 3 Drama
3 NaN LEFT JOIN RIGHT JOIN
4 Ação
A decisão sobre como lidar com dados faltantes deve considerar o domínio do
problema, os tipos de dados envolvidos e o impacto das medidas adotadas na
análise. Lembre-se de que dados de qualidade são essenciais para análises
estatísticas corretas.
Média, Mediana e Moda Vamos usar uma lista ctícia de números para calcular a média com Pandas.
import pandas as pd
mediana = df['valores'].median()
print("Mediana:", mediana)
moda = df['valores'].mode()[0]
print("Moda:", moda)
Saída: Moda: 4
Variância
∑ (xi − x̄)2
V= , onde xi são os valores, x̄ é a média e n o número de
n
elementos
Agora na gura 04 olhamos para a distribuição da lista 02. Veja que, mesmo que a
Podemos observar na gura 03 a distribuição dos dados ao longo do eixo y e como
média dos dois conjuntos esteja bem próxima (3.33 e 3.50), como o segundo
os números estão próximos uns aos outros, o valor de variância apresentou um
conjunto apresenta valores bem distintos entre si (30, 40 e –50 acentuam a
valor baixo e próximo da média. Veja o que acontece quando modi camos alguns
variância), a variância dele foi muito maior que a do primeiro (2.960 e 451.727).
dos valores.
Desvio Padrão
DP = V , onde V é a variância
Um desvio padrão maior indica que os valores estão mais espalhados em
relação à média, já um desvio padrão menor sugere que os valores estão mais
próximos da média.
import statistics Figura 05 – Exemplo de grá co mostrando desvio padrão. 2021. Disponível em:
<www.youtdictionary.com/articles/standard-deviation-examples>. Acesso em
lst1 = [0, 1, 2, 3, 3, 3, 4, 4, 4, 5, 5, 6] Junho de 2024. Adaptado pelo autor.
desvio_padrao = statistics.stdev(lst1) • 1 desvio padrão: cerca de 68% (34.1% acima e abaixo da média) dos dados
print(f"Desvio Padrão: {desvio_padrao}") estão dentro dessa faixa, identi cando valores típicos ou normais.
• 2 desvios padrão: aproximadamente 95% (34.1%+13.6% acima e abaixo)
Saída: Desvio Padrão: 1.7233687939614087 dos dados estão dentro dessa faixa, identi cando valores moderadamente
incomuns.
Uma medida que podemos utilizar para identi car a variação de dados é a • Mais de dois desvios padrão: normalmente, 5% dos dados estão dentro
distância em termos de desvio padrão dentro de uma distribuição normal ou dessa faixa, considerados valores incomuns ou até anomalias.
Gaussiana. A distribuição normal é crucial para entender a variância e o desvio padrão
porque ela nos mostra como os dados estão espalhados em torno da média.
fi
fi
fi
fi
22
Distribuição Normal ou Gaussiana curva, enquanto o desvio padrão controla a largura da curva (maior desvio
padrão, curva mais larga).
A curva clássica de distribuição normal, ou gaussiana, representa uma
distribuição com média zero e desvio padrão um. A forma de sino é a marca print(sorted(lst2))
registrada da distribuição normal. A curva é perfeitamente simétrica em torno m = statistics.mean(lst2)
da média, indicando que a probabilidade de valores acima da média é igual à print(f'Média: {m}')
probabilidade de valores abaixo da média. Além disso, a área sob a curva é dp = statistics.stdev(lst2)
sempre 1, o que equivale a 100% da distribuição de dados. print(f'Desvio Padrão: {dp}')
Saída:
[-50, -2, -1, 0, 3, 3, 4, 4, 5, 6, 30, 40]
Média: 3.5
Desvio Padrão: 21.253876651737507
Faixa 1 desvio padrão: -17.753876651737507, 24.753876651737507
Faixa 2 desvios padrão: -39.00775330347501, 46.00775330347501
• Método 'describe()’: para visualizar algumas métricas estatísticas das Com o describe analisamos várias informações, por exemplo, olhando a
colunas numéricas, existe o método ´describe´, que calcula a média, desvio coluna de ´imc´ podemos ver que ela possui 757 valores não nulos, com valor
padrão, valores mínimos e máximos, além das faixas de valores que mínimo de IMC de 18.2 e máximo e 67.1. A média da distribuição foi de 32.45,
representam a mediana (50%) e divisores de quartis 25% e 75% cada. com um desvio padrão de 6.92.
• 25% dos valores estão abaixo de 27.5.
import pandas as pd • A mediana (50%) é 32.3.
• 75% dos valores são menores que 36.6.
diabetes = pd.read_csv('diabetes.csv')
print(diabetes.describe())
Saída
pressão arterial concentraçao de Insulina idade Imc
glicose
count 733.000000 763.000000 394.000000 768.000000 757.000000
mean 72.405184 121686763 155.548223 33.240885 32.457464
std 12.382158 30.535641 118.775855 11.760232 6.924988
min 24.000000 44.000000 14.000000 21.000000 18.200000
25% 64.000000 99.000000 76.250000 24.000000 27.500000
50% 72.000000 117.000000 125.000000 29.000000 32.300000
75% 80.000000 141.000000 190.000000 41.000000 36.600000
max 122.000000 199.000000 846.000000 81.000000 67.100000
26
Explore mais!
2.Leia o artigo Mean, Median, and Mode: How Visualizations Help Find
What’s “Typical”, que demonstra uma representação visual de como os dados
podem ser representados e como eles auxiliam a entender as medidas
estatísticas de tendencia central. Clique aqui.
Referências bibliográficas
DataFrame — Pandas 2.2.2 documentation (2024). Disponível em: <https://
pandas.pydata.org/docs/reference/frame.html >. Acesso em: 22 abr. 2024.