Visualização de dados

By R. O. Perdiz in Python AED Plot Operações

June 19, 2024

Carregando módulos Python e lendo os dados

import pandas as pd
pd.__version__
## '2.2.2'
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)
##    symboling normalized-losses         make  ... city-mpg highway-mpg  price
## 0          3                 ?  alfa-romero  ...       21          27  13495
## 1          3                 ?  alfa-romero  ...       21          27  16500
## 2          1                 ?  alfa-romero  ...       19          26  16500
## 3          2               164         audi  ...       24          30  13950
## 4          2               164         audi  ...       18          22  17450
## 
## [5 rows x 26 columns]

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
## horsepower    object
## dtype: object
dad[["normalized-losses"]].dtypes
## normalized-losses    object
## dtype: object
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()
## price    13207.129353
## dtype: float64
dad["normalized-losses"].mean()
## 122.0

Valores únicos

dad["make"].unique()
## array(['alfa-romero', 'audi', 'bmw', 'chevrolet', 'dodge', 'honda',
##        'isuzu', 'jaguar', 'mazda', 'mercedes-benz', 'mercury',
##        'mitsubishi', 'nissan', 'peugot', 'plymouth', 'porsche', 'renault',
##        'saab', 'subaru', 'toyota', 'volkswagen', 'volvo'], dtype=object)

Correlações

dad.corr(numeric_only = True)
##                    symboling  normalized-losses  ...  highway-mpg     price
## symboling           1.000000           0.528667  ...     0.034606 -0.082391
## normalized-losses   0.528667           1.000000  ...    -0.210768  0.203254
## wheel-base         -0.531954          -0.074362  ...    -0.544082  0.584642
## length             -0.357612           0.023220  ...    -0.704662  0.690628
## width              -0.232919           0.105073  ...    -0.677218  0.751265
## height             -0.541038          -0.432335  ...    -0.107358  0.135486
## curb-weight        -0.227691           0.119893  ...    -0.797465  0.834415
## engine-size        -0.105790           0.167365  ...    -0.677470  0.872335
## compression-ratio  -0.178515          -0.132654  ...     0.265201  0.071107
## horsepower          0.071622           0.295772  ...    -0.770908  0.810533
## city-mpg           -0.035823          -0.258502  ...     0.971337 -0.686571
## highway-mpg         0.034606          -0.210768  ...     1.000000 -0.704692
## price              -0.082391           0.203254  ...    -0.704692  1.000000
## 
## [13 rows x 13 columns]

Coeficiente de correlação de Pearson

from scipy.stats import pearsonr
pearsonr(dad["horsepower"], dad["price"])
## ValueError: array must not contain infs or NaNs

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
## 0.8105330821322065

Já o valor de p é:

p_value
## 1.1891278276944886e-47

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
##     drive-wheels   body-style    price
## 0            rwd  convertible  13495.0
## 1            rwd  convertible  16500.0
## 2            rwd    hatchback  16500.0
## 3            fwd        sedan  13950.0
## 4            4wd        sedan  17450.0
## ..           ...          ...      ...
## 200          rwd        sedan  16845.0
## 201          rwd        sedan  19045.0
## 202          rwd        sedan  21485.0
## 203          rwd        sedan  22470.0
## 204          rwd        sedan  22625.0
## 
## [199 rows x 3 columns]
dados_grupos = dados_parciais.groupby(["drive-wheels", "body-style"], as_index = False).mean()
dados_grupos
##    drive-wheels   body-style         price
## 0           4wd    hatchback   7603.000000
## 1           4wd        sedan  12647.333333
## 2           4wd        wagon   9095.750000
## 3           fwd  convertible  11595.000000
## 4           fwd      hardtop   8249.000000
## 5           fwd    hatchback   8365.166667
## 6           fwd        sedan   9811.800000
## 7           fwd        wagon  10061.181818
## 8           rwd  convertible  23949.600000
## 9           rwd      hardtop  24202.714286
## 10          rwd    hatchback  14337.777778
## 11          rwd        sedan  21711.833333
## 12          rwd        wagon  16994.222222

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
##                    price                ...                            
## body-style   convertible       hardtop  ...         sedan         wagon
## drive-wheels                            ...                            
## 4wd                  NaN           NaN  ...  12647.333333   9095.750000
## fwd              11595.0   8249.000000  ...   9811.800000  10061.181818
## rwd              23949.6  24202.714286  ...  21711.833333  16994.222222
## 
## [3 rows x 5 columns]

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

dados_dinamicos.fillna(0)
##                    price                ...                            
## body-style   convertible       hardtop  ...         sedan         wagon
## drive-wheels                            ...                            
## 4wd                  0.0      0.000000  ...  12647.333333   9095.750000
## fwd              11595.0   8249.000000  ...   9811.800000  10061.181818
## rwd              23949.6  24202.714286  ...  21711.833333  16994.222222
## 
## [3 rows x 5 columns]

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)
## ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [Text(0, 0, 'alfa-romero'), Text(1, 0, 'audi'), Text(2, 0, 'bmw'), Text(3, 0, 'chevrolet'), Text(4, 0, 'dodge'), Text(5, 0, 'honda'), Text(6, 0, 'isuzu'), Text(7, 0, 'jaguar'), Text(8, 0, 'mazda'), Text(9, 0, 'mercedes-benz'), Text(10, 0, 'mercury'), Text(11, 0, 'mitsubishi'), Text(12, 0, 'nissan'), Text(13, 0, 'peugot'), Text(14, 0, 'plymouth'), Text(15, 0, 'porsche'), Text(16, 0, 'saab'), Text(17, 0, 'subaru'), Text(18, 0, 'toyota'), Text(19, 0, 'volkswagen'), Text(20, 0, 'volvo')])
plt.show()

Dispersão com linha de regressão linear

sns.regplot(x = "engine-size", y = "price",data = dad)
plt.ylim(0, )
## (0.0, 53434.45110178258)
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)
## ([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [Text(0, 0, 'alfa-romero'), Text(1, 0, 'audi'), Text(2, 0, 'bmw'), Text(3, 0, 'chevrolet'), Text(4, 0, 'dodge'), Text(5, 0, 'honda'), Text(6, 0, 'isuzu'), Text(7, 0, 'jaguar'), Text(8, 0, 'mazda'), Text(9, 0, 'mercedes-benz'), Text(10, 0, 'mercury'), Text(11, 0, 'mitsubishi'), Text(12, 0, 'nissan'), Text(13, 0, 'peugot'), Text(14, 0, 'plymouth'), Text(15, 0, 'porsche'), Text(16, 0, 'saab'), Text(17, 0, 'subaru'), Text(18, 0, 'toyota'), Text(19, 0, 'volkswagen'), Text(20, 0, 'volvo')])
plt.show()

Mapa de calor

plt.pcolor(dados_dinamicos, cmap = "RdBu")
plt.colorbar()
## <string>:1: MatplotlibDeprecationWarning: Getting the array from a PolyQuadMesh will return the full array in the future (uncompressed). To get this behavior now set the PolyQuadMesh with a 2D array .set_array(data2d).
## <matplotlib.colorbar.Colorbar object at 0x0000016EB2B10C70>
plt.show()