Distribuição de Frequências de Dados Quantitativos
Em geral, a primeira tarefa de uma análise estatística de um conjunto de dados consiste em resumi-los. Para isso, desenvolvi uma função em Python que pode ajudar bastante nessa etapa, automatizando as análises de variáveis quantitativas.
Variáveis quantitativas são aquelas que exibem valores numéricos associados a unidade de investigação (peso, por exemplo). Elas podem ser discretas, quando assumem valores no conjunto dos números naturais (idade de uma pessoa) ou contínuas, quando assumem valores no conjunto dos números reais (tempo gasto por um atleta para percorrer 100m, por exemplo).
A ideia de uma análise descritiva de dados é tentar responder algumas questões como:
- Qual a frequência com que cada valor (ou intervalo de valores) aparece no conjunto de dados, ou seja, qual a distribuição de frequências dos dados?
- Quais são alguns valores típicos do conjunto de dados, como mínimo e máximo?
- Qual seria um valor para representar a posição central do conjunto de dados?
- Qual seria uma medida de variabilidade ou dispersão dos dados?
- Existem valores atípicos ou discrepantes (outliers) no conjunto de dados?
- A distribuição de frequências dos dados pode ser considerada simétrica?
Nesse contexto, um dos objetivos da análise descritiva é organizar e exibir os dados de maneira apropriada e para isso utilizamos:
- Gráficos e tabelas;
- Medidas resumo.
As técnicas empregadas na análise descritiva dependem do tipo de variáveis que compõem o conjunto de dados em questão. Vamos dar uma olhada na função desenvolvida que irá nos auxiliar nas tarefas descritas acima para as variáveis quantitativas.
# function to automatize frequency distribuitions in quantitatives variables
def frequency_quantitative_table(df, X, hist=False):
'''Function that create frequency tables for quantitatives features.
The number of classes are defined by sturges rule.
:param df: (dataframe)
DataFrame that you are working.
:param X: (series)
Respective column that you want to analyze the frequencies.
:param hist: (bool)
Parameter that controls if the function return a histogram with boxplot to help in your analysis
:return: (dataframe)
Final dataframe with the resumed table. This table has the ollowing information:
observed frequency, relative frequency and cumulated relative frequency. If param hist=True
the function returns a histogram and boxplot to help in your analysis.
'''
# sturges rule to find a good number of classes
n = df.shape[0]
k = int(round(1 + (10/3) * np.log10(n), 0))
# observed frequency for the variable
observed_frequency = pd.value_counts(
pd.cut(
x = df[X],
bins = k,
include_lowest = True
),
sort = False
)
# relative frequency for the variable
relative_frequency = pd.value_counts(
pd.cut(
x = df[X],
bins = k,
include_lowest = True
),
sort = False,
normalize = True
)
relative_frequency = round(relative_frequency * 100, 1)
# frequency table
freq_dist_quant = pd.DataFrame(
{'Observed Frequency': observed_frequency, 'Relative Frequency (%)': relative_frequency}
)
# add cumulative relative frequency
freq_dist_quant['Cumulated Relative Frequency (%)'] = freq_dist_quant['Relative Frequency (%)'].cumsum()
# optional thing that can show for you the histogram of the variable
if hist==True:
# calculate measures of central tendency
mean = df[X].mean()
median = df[X].median()
# mode = df[X].mode()[0]
# plot of boxplot and histogram
fig, (ax_box, ax_hist) = plt.subplots(2, sharex=True, figsize = (20,7), gridspec_kw= {"height_ratios": (0.2, 1)})
sns.boxplot(data=df, x=X, ax=ax_box)
ax_box.set_title('Distribution of the respective variable' , size=18)
ax_box.axvline(mean, color='r', linestyle='--')
ax_box.axvline(median, color='g', linestyle='-')
# ax_box.axvline(mode, color='y', linestyle='-')
ax_box.set(xlabel='')
sns.histplot(data=df, x=X, ax=ax_hist, kde=True, bins=k)
ax_hist.axvline(mean, color='r', linestyle='--', label="Mean")
ax_hist.axvline(median, color='g', linestyle='-', label="Median")
# ax_hist.axvline(mode, color='y', linestyle='-', label="Mode")
ax_hist.legend()
plt.tight_layout()
return freq_dist_quant
Chamando essa função, a saída será a seguinte:
# frequency table for Age
frequency_quantitative_table(train_set, 'Age', hist=True)
Como na análise de variáveis quantitativas temos diversos valores únicos diferentes, temos que agrupá-los em categorias (veja na tabela) para que a análise de frequências faça sentido!
Veja que com apenas essa função, somos capazes de responder a todas as questões descritas acima de 1 a 6. É claro que em um trabalho devemos explorar ainda mais técnicas para obtermos ainda mais informações, mas acredito que com isso já temos informações valiosas em mãos.
Isso faz sentido para você? Espero ter contribuído de alguma forma. Fique à vontade para agregar mais conhecimento, vamos tornar a comunidade cada vez mais colaborativa!
Referências:
Morettin, Pedro; Singer, Julio. Estatística e ciência de dados. Rio de Janeiro: LTC, 2022.