Analisando dados de vendas do Excel com Python Pandas e Seaborn - Parte I

No mundo moderno, orientado por dados, analisar dados de vendas pode oferecer insights tremendos sobre o desempenho dos negócios, o comportamento do cliente e potenciais oportunidades de crescimento.

🕒 Tempo estimado de leitura: 8 minutos

Na era digital, dados são rei. Empresas dependem de insights orientados por dados para guiar suas decisões, prever tendências e otimizar operações. Uma fonte comum de dados empresariais estão frequentemente armazenado em planilhas do Excel. Aqui, demonstraremos como aproveitar o poder das bibliotecas Pandas e Seaborn do Python para analisar dados de vendas, visualizar tendências e extrair insights. Cobriremos tópicos básicos, intermediários e avançados em Python, fornecendo exemplos práticos para cada nível de proficiência.

Agora, vamos mergulhar no mundo da análise de dados do Excel com alguns exemplos práticos que também estão disponíveis no Google Colab aqui 👨‍🔬.

Se você estiver interessado em aprender mais sobre como trabalhar com arquivos CSV usando a biblioteca Pandas do Python, consulte um de nossos artigos anteriores aqui.

Configurando o Ambiente

Para começar, certifique-se de que você tem as bibliotecas necessárias instaladas. Se ainda não as tiver, instale Pandas e Seaborn executando:

# Importar as bibliotecas necessárias
import pandas as pd   # pandas é usado para manipulação e análise de dados
import seaborn as sns # seaborn é usado para visualização de dados

Primeiro, vamos importar as bibliotecas necessárias:

# Importar bibliotecas necessárias para análise e visualização de dados

# Biblioteca de expressões regulares para correspondência e manipulação de strings
import re

# Para buscar dados da internet
from urllib.request import urlretrieve 

# pandas é usado para manipulação e análise de dados
import pandas as pd

# seaborn é usado para visualização de dados
import seaborn as sns

# matplotlib.pyplot é usado para criar visualizações estáticas, animadas e interativas
import matplotlib.pyplot as plt

Baixando e Carregando Dados

Vamos começar baixando os arquivos de dados dos URLs fornecidos e salvando-os localmente.

# Baixe os dados dos clientes e salve como 'customers.xlsx'
urlretrieve("https://infinitepy.s3.amazonaws.com/samples/24c4e0bb-3603-4848-b051-8b68a467783d/customers1000.xlsx", "customers.xlsx")

# Baixe os dados dos pedidos e salve como 'orders.xlsx'
urlretrieve("https://infinitepy.s3.amazonaws.com/samples/24c4e0bb-3603-4848-b051-8b68a467783d/orders1000.xlsx", "orders.xlsx")

Carregando os dados em DataFrames do pandas.

# Carregar o arquivo 'customers.xlsx' em um DataFrame chamado clientes_df
clientes_df = pd.read_excel('customers.xlsx')

# Carregar o arquivo 'orders.xlsx' em um DataFrame chamado pedidos_df
pedidos_df = pd.read_excel('orders.xlsx')

Imprimindo as primeiras 5 linhas dos DataFrames clientes e pedidos

Em nosso conjunto de dados de exemplo, o DataFrame clientes inclui as seguintes colunas:

  • CustomerID

  • Name

  • Email

  • Address e

  • Phone

O DataFrame pedidos possuem estas colunas:

  • OrderID

  • OrderDate

  • CustomerID

  • Product

  • Quantity e

  • Price.

As seguintes linhas de código chamam o método 'head' no DataFrame 'clientes_df' e 'pedidos_df'. O método 'head' retorna as primeiras 5 linhas do DataFrame por padrão. Isso é frequentemente usado para inspecionar rapidamente os primeiros registros e entender a estrutura e o conteúdo do DataFrame.

# Imprime as primeiras 5 linhas do DataFrame de clientes
clientes_df.head()
First 5 rows of the customers DataFrame

Primeiras 5 linhas do DataFrame de clientes.

Imprimindo as primeiras 5 linhas do DataFrame pedidos.

# Imprimir as primeiras 5 linhas do DataFrame de pedidos
pedidos_df.head()
First 5 rows of the orders DataFrame.

Primeiras 5 linhas do DataFrame pedidos.

Conhecendo Seus Dados

Em um nível básico, explorar a estrutura e o resumo dos dados ajuda a entender seu conteúdo.

# A linha a seguir chama o método 'info()' em 'clientes_df'.
# Este método é usado para obter um resumo conciso de um DataFrame.
clientes_df.info()

Executar o código acima produzirá a seguinte saída.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 5 columns):
 #   Column      Non-Null Count  Dtype 
---  ------      --------------  ----- 
 0   CustomerID  1000 non-null   int64 
 1   Name        1000 non-null   object
 2   Email       1000 non-null   object
 3   Address     1000 non-null   object
 4   Phone       1000 non-null   object
dtypes: int64(1), object(4)
memory usage: 39.2+ KB

O método 'info()' fornece um resumo do DataFrame, incluindo:

  • O índice de faixa (como contagem de linhas do DataFrame);

  • As colunas e seus tipos de dados;

  • As contagens de não nulos (quantos valores não nulos estão presentes em cada coluna);

  • Uso de memória do DataFrame.

Essas informações são incrivelmente úteis para entender a estrutura e integridade dos seus dados, especialmente ao lidar com valores ausentes, limpeza de dados e garantir que os conjuntos de dados sejam carregados conforme esperado.

# The following line calls the 'info()' method on 'pedidos_df'.
# This method is used to get a concise summary of a DataFrame.
pedidos_df.info()

Executar o código acima produzirá a seguinte saída.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5507 entries, 0 to 5506
Data columns (total 6 columns):
 #   Column      Non-Null Count  Dtype         
---  ------      --------------  -----         
 0   OrderID     5507 non-null   int64         
 1   OrderDate   5507 non-null   datetime64[ns]
 2   CustomerID  5507 non-null   int64         
 3   Product     5507 non-null   object        
 4   Quantity    5507 non-null   int64         
 5   Price       5507 non-null   float64       
dtypes: datetime64[ns](1), float64(1), int64(3), object(1)
memory usage: 258.3+ KB

Verificando valores ausentes

# Verificando valores ausentes
clientes_df.isnull().sum()

Executar o código acima produzirá a seguinte saída.

CustomerID    0
Name          0
Email         0
Address       0
Phone         0
dtype: int64
# Verificando valores ausentes
pedidos_df.isnull().sum()

Executar o código acima produzirá a seguinte saída.

OrderID       0
OrderDate     0
CustomerID    0
Product       0
Quantity      0
Price         0
dtype: int64

O método '.isnull()' é chamado no DataFrame onde retorna um DataFrame da mesma forma que 'clientes_df', mas com valores booleanos:

  • True onde os elementos no DataFrame original são NaN (Not a Number),

  • e False onde não são.

'.sum()' é chamado no DataFrame retornado por '.isnull()' e isso soma os valores True (que são interpretados como 1) ao longo das colunas (eixo padrão). Portanto, '.sum()' retornará uma Serie com nomes de colunas como o índice e a contagem de valores NaN em cada coluna como os valores. O resultado é uma Série que nos informa quantos valores ausentes (NaNs) há em cada coluna do DataFrame 'clientes_df'.

Uma Pandas Series é um objeto unidimensional semelhante a uma matriz que pode conter vários tipos de dados, semelhante a uma coluna em uma planilha do Excel ou uma tabela SQL. É parte da biblioteca Pandas, que é extensivamente usada para manipulação e análise de dados no Python.

Verifique linhas duplicadas

A seguinte linha de código verifica linhas duplicadas no DataFrame.

  • 'duplicated()' é um método que retorna uma Series indicando se cada linha é duplicada. Uma linha duplicada significa que ela tem os mesmos dados que outra linha já encontrada.

  • 'sum()' é então chamado na Series resultante para contar o número de valores True.

Cada True indica uma linha duplicada, então 'sum()' dá a contagem total de duplicatas. O resultado é o total de linhas duplicadas nos DataFrames.

# Verificar linhas duplicadas
clientes_df.duplicated().sum()

Executar o código acima produzirá a seguinte saída.

0
# Verificar linhas duplicadas
pedidos_df.duplicated().sum()

Executar o código acima produzirá a seguinte saída.

0

Plotando um histograma da coluna 'Price' no DataFrame 'pedidos_df'

# Configurar o tema do Seaborn para uma melhor estética
sns.set(style='darkgrid')

# Plotando um histograma da coluna 'Preço' no DataFrame 'orders_df'
# Usando 20 bins para o histograma e definindo o título do gráfico como 'Preço'
# Isso também adiciona rótulos aos eixos e ajusta o tamanho da fonte para melhor legibilidade
plt.figure(figsize=(10, 6))
hist_plot = sns.histplot(pedidos_df['Price'], bins=20, kde=False, color='skyblue')
hist_plot.set_title('Distribuição de Preços', fontsize=16, weight='bold')
hist_plot.set_xlabel('Preço', fontsize=14)
hist_plot.set_ylabel('Frequência', fontsize=14)

# Acessando a instância atual de Axes
ax = plt.gca()

# Personalizando o apelo visual - removendo as espinhas superior e direita
ax.spines[['top', 'right']].set_visible(False)

# Adicionando linhas de grade para melhor legibilidade
ax.grid(True, linestyle='--', alpha=0.7)

# Adicionando um layout compacto para melhor espaçamento
plt.tight_layout()

# Exibir o gráfico
plt.show()

Distribuição de Preços.

Conclusão

Este guia, Parte I, introduziu as técnicas fundamentais para utilizar as poderosas bibliotecas Pandas e Seaborn do Python para realizar análises práticas de dados de vendas, estabelecendo a base do nível básico ao avançado. No próximo segmento, mergulharemos mais profundamente na seleção e filtragem de dados, mesclando DataFrames, calculando receita total por produto e muito mais.

Seguindo estes passos, você estará apto a transformar seus dados brutos em visualizações e análises perspicazes que permitem a tomada de decisões orientada por dados. Continue praticando com conjuntos de dados reais para aprimorar ainda mais suas habilidades e solidificar seu entendimento.

Sinta-se à vontade para responder a este boletim com qualquer dúvida ou tópicos que você gostaria que abordássemos no futuro.

Se você gostou deste boletim, não se esqueça de se inscrever para receber atualizações regularmente. Compartilhe com seus amigos e colegas interessados em Python e vamos crescer juntos em nossa comunidade de programadores!

Lembre-se, a chave para a maestria é prática e persistência. Feliz codificação! Até a próxima edição, continue programando! 👨‍💻

InfinitePy Newsletter - Sua fonte para aprendizado e inspiração em Python.