Histograma em python

O histograma (também conhecido como distribuição de frequências) é a representação gráfica em colunas ou em barras (retângulos) de um conjunto de dados previamente tabulado e dividido em classes. A base de cada retângulo representa uma classe, enquanto que a altura de cada um representa a quantidade ou a frequência absoluta com que o valor da classe ocorre no conjunto de dados, para classes uniformes, ou a densidade de frequência, para classes não uniformes.

Exemplo de histograma gerado pelo script desse post
Exemplo de histograma gerado pelo script desse post

A biblioteca “matplotlib” do python permite montar facilmente um histograma, para imprimir na tela ou salvar como um arquivo de imagem. Ele é chamado pelo método “hist“, que recebe os dados como entrada e outros parâmetros. Para a leitura de dados de um arquivo CSV (colunas separadas por vírgula), a biblioteca “pandas” permite ler e gravar na memória uma planilha com as informações desse arquivo. Para cálculos matemáticos e outras funções, existe a biblioteca “numpy”.

O script a seguir carrega essas bibliotecas, faz a leitura do arquivo e chama a função para fazer o histograma. Como argumentos da função “histogram()”, estão o tipo de histograma, um vetor de dados, o nome da variável (a ser impresso no rótulo do eixo x) e uma variável extra (pode ser o nome do lugar ou outra informação para especificar o conjunto de dados, a ser impressa no título e no nome do arquivo).

Com relação aos tipos do histograma, uma das opções é fixar o tamanho dos bins (‘fixed_bin_size’), por exemplo todos os bins de largura 5 (definido na variável “bin_size = 5”). Outra opção é fixar o número de bins (‘fixed_number_bins’), por exemplo definindo como 30 bins, independente da largura que o algoritmo escolha (definido na variável “n_bins = 30”). No caso de não especificar os bins, ele será definido pelo método de Freedman-Diaconis.

#!/usr/bin/env python3.7.5
# -*- Coding: UTF-8 -*-

# Import modules
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Define functions
def histogram(type_hist, data, varname, place):
	"""
	Plot histogram from given list values.
	Histogram types: fixed_bin_size or fixed_number_bins
	"""
	title = 'Histograma - %s' %place
	figname = 'hist_%s.png' %place
	text = 'média = %.2f\nmáximo = %.2f' % (data.mean(), max(data))
	
	n_bins = 30
	bin_size = 5
	if type_hist == 'fixed_bin_size':
		bins = np.arange(0, 100, bin_size)
	elif type_hist == 'fixed_number_bins':
		bins = np.linspace(math.ceil(min(data)), math.floor(max(data)), n_bins)

	plt.xlim([min(data)-5, max(data)+5])
	plt.hist(data, bins=bins)
	plt.title(title)
	plt.xlabel(varname)
	#plt.ylabel('contagens')
	ax = plt.gca() # Get axis handle for text positioning
	plt.text(0.95, 0.95, text, horizontalalignment='right', verticalalignment='top', transform=ax.transAxes)
	plt.savefig(figname)
	plt.close()

# Import CSV file into pandas dataframe
df = pd.read_csv('dados.csv')

# Call histogram function
histogram('fixed_bin_size', df['valor'], 'var', 'lugar')

Na função “histogram”, também são calculadas a média dos dados e seu valor máximo, que são impressos no próprio gráfico. Você também pode alterar o script para que a variável extra seja o tamanho ou o número dos bins, desse modo sendo informado como um parâmetro da função.

Se a variável “density” (ou “normed”, nas versões mais antigas) for definida como True, os pesos serão normalizados, de modo que a integral da densidade na faixa permaneça 1 (o padrão é “None”).

Compartilhe :)

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.