Prévia do material em texto
Distribuição de Frequêcia
Teoria
Uma distribuição de frequência é uma forma de organizar e resumir dados, mostrando a
frequência (ou seja, quantas vezes) com que cada valor ou intervalo de valores aparece em um
conjunto de dados.
Imagine que você tem uma lista de estaturas dos alunos da sua turma. Em vez de olhar para
todas as estaturas individualmente, uma distribuição de frequência te ajuda a ver rapidamente:
• Quantos alunos têm cada estatura específica (por exemplo, 3 alunos têm 156 cm,
5 alunos têm 160 cm, etc.)
• Quantos alunos caem em determinados intervalos de estatura (por exemplo, 5
alunos têm entre 150-154 cm, 9 alunos têm entre 154-158 cm)
Ela é fundamental para entender a estrutura e o padrão dos seus dados, identificando valores
comuns, incomuns, a dispersão dos dados e possíveis tendências. Pode ser apresentada em
tabelas, gráficos de barras (histogramas) ou gráficos de pizza.
Conjunto de dados para exemplo
Teminologias:
• Classe: Intervalos de variação da variável é resentados simbolicamente por "i".
• Limite de classe: É o limite inferior (l) e superio (L) da classe.
– Exemplo: l = 150 e L = 158
• Amplitude de um intervalo de classe (hi): é a diferença entre o limite superior e o
limite inferior de uma classe em uma distribuição de frequência agrupada.
– hi = Li - li (154 - 150 = 4).➡️�
• Amplitude total da distribuição (AT): é a diferença entre o maior e o menor valor
de um conjunto de dados:
– AT = Lmax - Lmin (173 - 150 = 23)➡️�
• Amplitude amostral: é diferença entre o valor máximo e o valor mínimo
observados em um conjunto de dados amostrais (AA).
– AA = Xmax - Xmin (173 - 150 = 23)➡️�
• Ponto médio de uma classe: é o valor que representa o centro de um determinado
intervalo de classe em uma distribuição de frequência agrupada.
– Xi = (Li + li) / 2 (158 + 154) / 2 = 156cm➡️�
• Frequência: é o número de vezes que um determinado valor aparece em um
conjunto de dados. Existem diferentes tipos de frequência:
– Frequência Absoluta (fi): É o número puro de ocorrências de um valor ou
de uma classe.
• f1 = 5
– Frequência Relativa (fr): É a proporção de ocorrências de um valor ou
classe em relação ao total de observações. Geralmente é expressa como uma
porcentagem ou um decimal.
• fr = (fi / Total de Observações) * 100 (5 / 40) * 100 = 12,5➡️�
– Frequência Acumulada (Fi): É a soma das frequências de um valor ou
classe com as frequências de todos os valores ou lasses anteriores. Ela
mostra quantas observações estão abaixo ou são iguais a um determinado
valor/classe.
– Frequência Relativa Acumulada (Fr): É a soma das frequências relativas
de um valor ou classe com as frequências relativas de todos os valores ou
classes anteriores. Mostra a porcentagem acumulada de observações até
aquele ponto.
Determinar o número de classes
A formar mais utilizada para determinar o número de classe é a utilização da Fórmula de Sturges
k = 1 + 3.33 * log(n)
1 + 3.33 * log(40)
1 + 3.33 * 1.6
k = 6.28
Onde:
• k é o número de classes (o resultado deve ser arredondado para o número inteiro mais
próximo).
• n é o número total de observações (o tamanho da sua amostra ou população de dados).
• log é o logaritmo na base 10.
Determinar a amplitude do intervalo de classe
h = AA / k
h = (173 - 150) / 6
h = 23 / 6
h = 4 -> (3,83) sempre arrendodar para cima
Assimitria
Quando os dados em um histograma estão mais para um lado do que para o outro, isso significa
que a distribuição dos dados é assimétrica ou enviesada (skewed).
• Se os dados estão mais concentrados no lado esquerdo e a 'cauda' do gráfico se
estende para a direita, dizemos que a distribuição tem assimetria positiva (ou
enviesada à direita). Isso indica que a maioria dos valores é menor, mas existem
alguns valores maiores que 'esticam' a distribuição para a direita.
• Se os dados estão mais concentrados no lado direito e a 'cauda' do gráfico se estende
para a esquerda, dizemos que a distribuição tem assimetria negativa (ou enviesada
à esquerda). Isso indica que a maioria dos valores é maior, mas existem alguns
valores menores que 'esticam' a distribuição para a esquerda.
Bibliotecas e Dados
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
/usr/local/lib/python3.12/dist-packages/jupyter_client/session.py:203:
DeprecationWarning: datetime.datetime.utcnow() is deprecated and
scheduled for removal in a future version. Use timezone-aware objects
to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
return datetime.utcnow().replace(tzinfo=utc)
Exemplo de Conjunto de Dados
Vamos usar um pequeno conjunto de dados de transações de compras para demonstrar o
Apriori.
transactions = [
['Leite', 'Pão', 'Manteiga', 'Cerveja'],
['Pão', 'Manteiga', 'Fraldas', 'Ovos'],
['Leite', 'Fraldas', 'Refrigerante'],
['Pão', 'Manteiga', 'Fraldas', 'Cerveja'],
['Leite', 'Pão', 'Manteiga', 'Fraldas', 'Refrigerante'],
['Pão', 'Ovos', 'Cerveja']
]
df_transactions = pd.DataFrame({'Transaction':
range(len(transactions)), 'Items': transactions})
display(df_transactions)
Preparação dos Dados (One-Hot Encoding)
Para usar o algoritmo Apriori do mlxtend, precisamos converter a lista de transações em um
formato one-hot encoded, onde cada item é uma coluna e o valor é True se o item estiver na
transação e False caso contrário.
from mlxtend.preprocessing import TransactionEncoder
te = TransactionEncoder()
te_ary = te.fit(transactions).transform(transactions)
df_encoded = pd.DataFrame(te_ary, columns=te.columns_)
display(df_encoded.head())
Encontrando Conjuntos de Itens Frequentes
Agora vamos aplicar o algoritmo Apriori para encontrar conjuntos de itens com um suporte
mínimo. Um min_support de 0.5 significa que o itemset deve aparecer em pelo menos 50%
das transações (3 de 6 neste exemplo).
frequent_itemsets = apriori(df_encoded, min_support=0.5,
use_colnames=True)
frequent_itemsets['length'] =
frequent_itemsets['itemsets'].apply(lambda x: len(x))
display(frequent_itemsets)
Gerando Regras de Associação
Com os conjuntos de itens frequentes, podemos agora gerar as regras de associação. Vamos
filtrar as regras por confiança mínima e lift.
rules = association_rules(frequent_itemsets, metric="confidence",
min_threshold=0.7)
rules = rules.sort_values(by=['confidence', 'lift'], ascending=[False,
False])
display(rules)
Interpretando as Regras de Associação
• antecedents: O item ou conjunto de itens que está 'no lado esquerdo' da regra (ex:
{Pão}).
• consequents: O item ou conjunto de itens que está 'no lado direito' da regra (ex:
{Manteiga}).
• antecedent support: O suporte do antecedente (quão frequentemente {Pão}
aparece sozinho).
• consequent support: O suporte do consequente (quão frequentemente {Manteiga}
aparece sozinho).
• support: O suporte da regra completa (quão frequentemente {Pão, Manteiga}
aparecem juntos).
• confidence: A probabilidade de comprar o consequente, dado que o antecedente foi
comprado. Por exemplo, uma confiança de 1.00 para {Pão} -> {Manteiga} significa
que sempre que Pão é comprado, Manteiga também é comprada.
• lift: Indica a força da associação. Um valor de lift maior que 1 sugere que a
ocorrência do antecedente aumenta a probabilidade de ocorrência do consequente. Um
lift de 1.25, por exemplo, significa que comprar Pão torna 1.25 vezes mais provável que
Manteiga também seja comprada, comparado com a compra de Manteiga de forma
independente.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import math
data = np.array([160, 165, 167, 164, 160, 166, 160, 161, 150, 152,
173, 160, 155,
164, 168, 162, 161, 168, 163, 156, 155, 169, 151,
170, 164,
155, 152, 163, 160, 155, 157, 156, 158, 158, 161,
154, 161, 156, 172, 153])
Ordenação
data = np.sort(data)
data
array([150, 151, 152, 152, 153, 154, 155, 155, 155, 155, 156, 156,
156,
157, 158, 158, 160, 160,160, 160, 160, 161, 161, 161, 161,
162,
163, 163, 164, 164, 164, 165, 166, 167, 168, 168, 169, 170,
172,
173])
minimo = data.min()
maximo = data.max()
print(f'Menor valor: {minimo}')
print(f'Maior valor: {maximo}')
Menor valor: 150
Maior valor: 173
np.unique(data,return_counts=True)
(array([150, 151, 152, 153, 154, 155, 156, 157, 158, 160, 161, 162,
163,
164, 165, 166, 167, 168, 169, 170, 172, 173]),
array([1, 1, 2, 1, 1, 4, 3, 1, 2, 5, 4, 1, 2, 3, 1, 1, 1, 2, 1, 1, 1,
1]))
plt.bar(data,data)
plt.show()
Número de classes
• k = 1 + 3.3 log n
n = len(data)
k = 1 + 3.3 * np.log10(n)
k
np.float64(6.286797971382276)
k = round(k)
k
6
Amplitude do intervalo
• h = AA / k
• AA = Xmax - Xmin
AA = maximo - minimo
AA
np.int64(23)
h = AA / k
h
np.float64(3.8333333333333335)
h = math.ceil(h)
h
4
Construção da distribuição de frequência
interval = np.arange(minimo, maximo + 2,h)
interval
array([150, 154, 158, 162, 166, 170, 174])
interval1, interval2, interval3, interval4, interval5, interval6 =
0,0,0,0,0,0
for i in data:
if i >= interval[0] and i = interval[1] and i = interval[2] and i = interval[3] and i = interval[4] and i = interval[5] and i