Visualização de dados

Autor

Perdiz, Ricardo de Oliveira

Data de Publicação

19 de junho de 2024

Carregando módulos Python e lendo os dados

import pandas as pd
pd.__version__
import numpy as np

dad = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/autos/imports-85.data", header = None)
headers = ["symboling", "normalized-losses", "make", "fuel-type", "aspiration", "num-of-doors", "body-style", "drive-wheels", "engine-location", "wheel-base", "length", "width", "height", "curb-weight", "engine-type", "num-of-cylinders", "engine-size", "fuel-system", "bore", "stroke", "compression-ratio", "horsepower", "peak-rpm", "city-mpg", "highway-mpg", "price"]
dad.columns = headers
dad.head(5)

Conversão de variáveis para tipo numérico

Algumas vezes, os dados não são automaticamente convertidos para o tipo de informação correta. Por exemplo, preço do carro (“price”) foi lido como um “object”, isto é, pode conter palavras, letras, caracteres. Porém, trata-se de um número de fato. Então, vamos convertê-lo usando o método to_numeric().

dad["price"] = pd.to_numeric(dad["price"], errors = "coerce")

Há outras variáveis assim também. Vejam:

dad[["horsepower"]].dtypes
dad[["normalized-losses"]].dtypes
dad["horsepower"] = pd.to_numeric(dad["horsepower"], errors = "coerce")
dad["normalized-losses"] = pd.to_numeric(dad["normalized-losses"], errors = "coerce")

Operações

Média

Para calcular a média de uma coluna, usamos o método mean(). Vamos testar com as colunas “price” e “normalized-losses”.

dad[["price"]].mean()
dad["normalized-losses"].mean()

Valores únicos

dad["make"].unique()

Correlações

dad.corr(numeric_only = True)

Coeficiente de correlação de Pearson

from scipy.stats import pearsonr
pearsonr(dad["horsepower"], dad["price"])

Há valores ausentes nas colunas. Vamos removê-las:

dad.dropna(subset = ["price"], axis = 0, inplace = True)
dad.dropna(subset = ["horsepower"], axis = 0, inplace = True)
pearson_coef, p_value = pearsonr(dad["horsepower"], dad["price"])

Coeficiente de correlação de Pearson é:

pearson_coef

Já o valor de p é:

p_value

Agrupamentos

Utilizamos o método groupby(). Vamos ver como os preços de carros se apresentam entre essas duas variáveis, “drive-wheels” e “body-style”.

dados_parciais = dad[["drive-wheels", "body-style", "price"]]
dados_parciais
dados_grupos = dados_parciais.groupby(["drive-wheels", "body-style"], as_index = False).mean()
dados_grupos

Tabelas dinâmicas (==“Pivot table”)

Criamos tabelas dinâmicas por meio do método pivot(). Em uma tabela dinâmica, temos uma variável ao longo das linhas, enquanto outra variável aparece nas colunas.

dados_dinamicos = dados_grupos.pivot(index = "drive-wheels", columns = "body-style")
dados_dinamicos

Podemos preencher valores faltantes com 0, para facilitar a visualização dos dados:

dados_dinamicos.fillna(0)

Importando módulos para visualização de dados

from matplotlib import pyplot as plt

import seaborn as sns

Visualização

Linhas

x = [1, 2, 3, 4]
y = [1, 4, 9, 6]

plt.plot(x, y)
plt.show()

Dispersão

plt.scatter(dad["engine-size"], dad["price"])
plt.title("Dispersão entre tamanho do motor e preço do veículo")
plt.xlabel("Tamanho do motor")
plt.ylabel("Preço")
plt.show()

Histograma

plt.hist("engine-size", data = dad)
plt.show()

Densidade

sns.displot(data = dad, x = "engine-size", kind = "kde")

Barras

plt.bar("make","engine-size", data = dad)
plt.show()

Rotaciona nomes do eixo X

plt.bar("make","engine-size", data = dad)
plt.xticks(rotation=90)
plt.show()

Dispersão com linha de regressão linear

sns.regplot(x = "engine-size", y = "price",data = dad)
plt.ylim(0, )
plt.show()

Boxplot

sns.boxplot(x = "make", y = "engine-size", data = dad)
plt.show()

Rotaciona nomes do eixo X

Maneira 1
bplot = sns.boxplot(x = "make", y = "engine-size", data = dad)
bplot.set_xticklabels(bplot.get_xticklabels(), rotation = 45)
plt.show()
Maneira 2
sns.boxplot(x = "make", y = "engine-size", data = dad)
plt.xticks(rotation = 45)
plt.show()

Mapa de calor

plt.pcolor(dados_dinamicos, cmap = "RdBu")
plt.colorbar()
plt.show()
fig, ax = plt.subplots()
im = ax.pcolor(grouped_pivot, cmap='RdBu')

#label names
row_labels = grouped_pivot.columns.levels[1]
col_labels = grouped_pivot.index

#move ticks and labels to the center
ax.set_xticks(np.arange(grouped_pivot.shape[1]) + 0.5, minor=False)
ax.set_yticks(np.arange(grouped_pivot.shape[0]) + 0.5, minor=False)

#insert labels
ax.set_xticklabels(row_labels, minor=False)
ax.set_yticklabels(col_labels, minor=False)

#rotate label if too long
plt.xticks(rotation=90)

fig.colorbar(im)
plt.show()

Alterar a largura e a altura do plot

width = 12
height = 10
plt.figure(figsize=(width, height))

x = [1, 2, 3, 4]
y = [1, 4, 9, 6]

plt.plot(x, y)
plt.show()
width = 20
height = 18
plt.figure(figsize=(width, height))

x = [1, 2, 3, 4]
y = [1, 4, 9, 6]

plt.plot(x, y)
plt.show()

Para saber mais

Visitem o site dos módulos seaborn https://seaborn.pydata.org/index.html e matplotlib https://matplotlib.org/stable/plot_types/basic/fill_between.html. Tem muita coisa por lá.

Até a próxima, pessoal! 💐🌴😎