Python para Análise de Dados
- #Python
Neste artigo vamos ver como utilizar o Python para resolver problemas comuns de análise de dados. Traduzir dados brutos e identificar tendências é algo muito valioso para as empresas, já que isso ajuda na tomada de decisões.
Para trabalhar com análise de dados, vamos utilizar duas bibliotecas muito utilizadas no Python, que são as seguintes:
NumPy: Ela oferece suporte para arrays multidimensionais, operações matemáticas avançadas e funções eficientes.
Pandas: Ela permite a manipulação de dados tabulares. Ela introduz as estruturas de dados DataFrame e Series.
Este artigo vai abordar 3 temas que são os seguintes:
- Conceitos básicos de estatística descritiva
- Cálculo de frequência relativa e absoluta
- Como criar um ranking
CONCEITOS BÁSICOS DE ESTATÍSTICA DESCRITIVA
O primeiro exemplo que vamos ver é como calcular média, mediana e quartis utilizando o Pandas. Você vai aprender exemplos básicos de estatística descritiva, que é um ramo da estatística que aplica várias técnicas para descrever e resumir um conjunto de dados. Serão demonstrados alguns exemplos de medidas de tendência central e medidas de variabilidade.
Primeiro vamos criar um dataframe com os dados que serão utilizados.
import numpy as np
import pandas as pd
dados = np.array([[1,1,10], [1,2,20], [1,2,30], [2,1,12], [2,2,26], [2,2,34], [3,1,13], [3,2,21], [3,2,36], [4,1,14], [4,2,27], [4,2,32], [5,1,12], [5,2,23], [5,2,35], [6,1,14], [6,2,26], [6,2,38], [7,1,12], [7,2,27], [7,2,35], [8,1,14], [8,2,28], [8,2,32], [9,1,11], [9,2,23], [9,2,35], [10,1,11], [10,2,21], [10,2,31], [11,1,9], [11,2,17], [11,2,25], [12,1,8], [12,2,16], [12,2,27]])
colunas = ["mes", "produto", "quantidade"]
dataframe = pd.DataFrame(data=dados, columns=colunas)
dataframe.sort_values(by=["mes"], ascending=True)
print(dataframe)
Agora vamos aos cálculos.
Para obter essas informações no Pandas é muito fácil. Basta executar o método describe() no campo desejado. Em nosso caso vamos utilizar o campo quantidade.
dataframe["quantidade"].describe()
O retorno é:
count 36.000000
mean 22.361111
std 9.240138
min 8.000000
25% 13.750000
50% 23.000000
75% 30.250000
max 38.000000
O método describe() retornou 8 informações, que são as seguintes:
count - contagem de elementos.
mean - média aritmética
std - desvio padrão
min - menor valor
25% - primeiro quartil
50% - mediana
75% - terceiro quartil
max - maior valor
De forma simples, obtivemos o maior valor, o menor valor, a quantidade e a média. Vamos a algumas explicações sobre os valores retornados referentes ao desvio padrão e os quartis.
O desvio-padrão é uma medida de dispersão, ela é bastante utilizada na estatística. Ao determinar o desvio padrão, podemos estabelecer um intervalo em torno da média aritmética, que é onde se concentra a maior parte dos dados. Quanto maior o valor do desvio-padrão, maior a variabilidade dos dados, ou seja, maior o afastamento em relação à média aritmética.
Os quartis são valores que dividem uma amostra de dados ordenada em quatro partes iguais e são usados para avaliar a dispersão e a tendência central de um conjunto de dados. Da mesma forma que o desvio padrão, quartis são muito utilizados na estatística.
O primeiro quartil é o valor da posição central entre o primeiro termo e a mediana. Isso quer dizer que até o seu valor, há 25% dos dados.
O segundo quartil, também chamado de mediana, é o valor até 50% da amostra. É o valor que pode ser encontrado na metade de uma amostra ordenada.
O terceiro quartil, também chamado de superior, é o meio do caminho entre a mediana e o último termo. Isso quer dizer que até o seu valor, há 75% dos dados.
Para nosso controle, os valores calculados no Pandas foram os seguintes:
25% 13.750000
50% 23.000000
75% 30.250000
CÁLCULO DE FREQUÊNCIA RELATIVA E ABSOLUTA
Agora vamos ver algo um pouco mais complexo, que é como calcular a frequência absoluta e relativa de um conjunto de registros. Vamos criar um dataframe de vendas com dados de um determinado período e faremos o seu agrupamento por período para poder fazer estes cálculos.
import numpy as np
import pandas as pd
dados = np.array([[1,1,10], [1,2,20], [1,2,30], [2,1,12], [2,2,26], [2,2,34], [3,1,13], [3,2,21], [3,2,36], [4,1,14], [4,2,27], [4,2,32], [5,1,12], [5,2,23], [5,2,35], [6,1,14], [6,2,26], [6,2,38], [7,1,12], [7,2,27], [7,2,35], [8,1,14], [8,2,28], [8,2,32], [9,1,11], [9,2,23], [9,2,35], [10,1,11], [10,2,21], [10,2,31], [11,1,9], [11,2,17], [11,2,25], [12,1,8], [12,2,16], [12,2,27]])
colunas = ["mes", "produto", "quantidade"]
dataframe = pd.DataFrame(data=dados, columns=colunas)
dataframe.sort_values(by=["mes"], ascending=True)
print(dataframe)
Nossa primeira tarefa vai ser agrupar as quantidades por mês. Depois de agrupar, vamos somar a coluna quantidade. Faremos uma cópia do dataframe original para fazer o agrupamento.
dataframe2 = dataframe.groupby(["mes"],as_index=False)["quantidade"].sum()
dataframe2.columns = ["mes", "total"]
print(dataframe2)
A seguir faremos o cálculo da frequência relativa em porcentagem, vamos calcular quando vale cada período em percentual em relação ao todo. Isso pode ser feito dividindo a soma do período pela soma de todos os períodos
Para obter essa informação podemos criar uma coluna nova no dataframe onde fizemos o agrupamento e dividir o total calculado pela soma de todas as quantidades, para isso podemos usar o método sum() no campo da quantidade
dataframe2["percentual"] = (dataframe2["total"] / dataframe2["total"].sum())*100
print(dataframe2)
Para concluir, vamos fazer a soma acumulada em cada período, cada mês vai ser a soma dele mesmo com os valores dos meses anteriores. No Pandas essa operação pode ser feita utilizado o método cumsum() no campo da quantidade. Para isso basta criar uma nova coluna no dataframe usado para o agrupamento e aplicar o método cumsum() na coluna total.
dataframe2["acumulado"] = dataframe2["total"].cumsum()
COMO CRIAR UM RANKING
Para encerrar nosso artigo vamos ver como criar um ranking. Rankings são comuns na análise de dados e podem parecer simples a primeira vista, mas existem certos detalhes que devem ser levados em conta na hora de construir um.
Vamos começar criando um dataframe com os dados que serão utilizados para montar o nosso ranking.
import pandas as pd
dataframe = pd.DataFrame({"nome": ["João", "Lucas", "Matheus", "Thiago", "Paulo", "Simão"], "salario": [2000, 2500, 3000, 3500, 3500, 4500]})
print(dataframe)
Nossa primeira tarefa vai ser colocar os dados em ordem decrescente de salário.
import pandas as pd
dataframe = pd.DataFrame({"nome": ["João", "Lucas", "Matheus", "Thiago", "Paulo", "Simão"], "salario": [2000, 2500, 3000, 3500, 3500, 4500]})
dataframe = dataframe.sort_values("salario", ascending=False)
print(dataframe)
Para criar o ranking, vamos acrescentar uma coluna neste dataframe. Para criar o ranking basta utilizar o método rank() na coluna que desejamos utilizar como referência. Como parâmetro, vamos informar que desejamos um ranking na ordem decrescente, ou seja, o ranking será ordenado do maior salário para o menor.
import pandas as pd
dataframe = pd.DataFrame({"nome": ["João", "Lucas", "Matheus", "Thiago", "Paulo", "Simão"], "salario": [2000, 2500, 3000, 3500, 3500, 4500]})
dataframe['rank'] = dataframe['salario'].rank(ascending=False)
dataframe = dataframe.sort_values("salario", ascending=False)
print(dataframe)
Ao olhar o resultado percebemos um problema. O segundo e o terceiro lugar apareceram como 2,5 no ranking. Eles precisam aparecer como 2, já que o salário deles é igual.
Para ajustar a forma como o ranking foi criado podemos utilizar um parâmetro chamado "method". Por padrão, o method é do tipo "mean", que é a média. Se o parâmetro informado para o method for "min", teremos um resultado diferente:
dataframe['rank'] = dataframe['salario'].rank(method="min", ascending=False)
O retorno para ambos os casos com o mesmo valor o número 2. Perceba que ele pula o número 3 e vai direto para o número 4.
Vimos que o padrão do method e "mean" e testamos "min". Existe uma outra opção de method chamada "max". Fazendo assim:
dataframe['rank'] = dataframe['salario'].rank(method="max", ascending=False)
Retorna para ambos os casos com o mesmo valor o número 3. Perceba que ele pulou o número 2.
Para obter números diferentes de ranking para os valores repetidos devemos usar um method chamado "dense".
dataframe['rank'] = dataframe['salario'].rank(method="dense", ascending=False)
Desta forma nosso problema é resolvido, e conseguimos a ordenação correta.
Existe uma outra forma de configurar o nosso ranking. Se você quiser um número único de ranking para cada valor, independente de repetições, deve usar o method "first".
import pandas as pd
dataframe = pd.DataFrame({"nome": ["João", "Lucas", "Matheus", "Thiago", "Paulo", "Simão"], "salario": [2000, 2500, 3000, 3500, 3500, 4500]})
dataframe['rank'] = dataframe['salario'].rank(method="dense", ascending=False)
dataframe['rank2'] = dataframe['salario'].rank(method="first", ascending=False)
dataframe = dataframe.sort_values("salario", ascending=False)
print(dataframe)