2.6 Visualização

A graph is a set of points. A mathematical graph cannot be seen. It is an abstraction. A graphic, however, is a physical representation of a graph. This representation is accomplished by realizing graphs with aesthetic attributes such as size or color. (Wilkinson 2005, 6)

Visualização é o processo de representar informações ou ideias através de diagramas, gráficos e outros métodos de apresentação visual. De um modo geral, as ferramentas de visualização devem ser claras para o leitor, devendo-se evitar detalhes desnecessários. Um bom visualizador transmite a informação desejada de forma clara, precisa e eficiente.

De acordo com (Kopf 1916), além de “quarenta anos de pensamento e realização na questão indiana” (Walker 1874), “salvaguardando a saúde do soldado britânico”, “reorganizando a administração hospitalar civil e militar no país e no exterior” e “seus serviços pioneiros para a profissão de enfermagem”, as atividades de Florence Nightingale na Estatística “podem ser classificadas em várias categorias amplas”. “A Dama com a Lâmpada”, uma “estatística apaixonada” de acordo com (E. Cook 1913), popularizou o diagrama de área polar, o que ela chamou de “coxcombs(Cohen 1984). Além disso, fez um excelente trabalho na parte de visualização na documentação de informações relacionadas às frentes de guerra (Nightingale 1858).

Edward Tufte, “o Leonardo da Vinci dos dados” segundo The New York Times, ou “o Galileu dos gráficos” de acordo com a Bloomberg, possui uma vasta obra sobre o tema, destacando-se (Tufte 1993), (Tufte et al. 1998), (Tufte and Graves-Morris 2001), (Tufte 2006) e (Tufte 2020). Mais recentemente encontram-se artistas visuais como Karim Douieb16, que possui um considerável portfolio publicado.

Alguns princípios:

  • o menos é mais
  • mantenha a notação coerente com o texto
  • o olho humano não diferencia muitas tonalidades de cor
  • trabalhe com escalas em degradê, diferentes texturas e espessuras de linha

2.6.1 Exemplos

Exemplo 2.51 Visualização considerando os princípios indicados.


by Max Roser at ourworldindata.org/longtermism

It is these 109 billion people we have to thank for the civilization that we live in. The languages we speak, the food we cook, the music we enjoy, the tools we use – what we know we learned from them.
Max Roser (2022-03-15)

Exemplo 2.52 De acordo com (Zabala 2009), se há três candidatos na iminência do empate técnico conforme o método adotado pelos institutos de pesquisa – i.e., \(A\) empata com \(B\) por um ponto, \(B\) empata com \(C\) por um ponto mas \(A\) e \(C\) não empatam (??) –, a elipse azul no simplex abaixo indica os prováveis cenários eleitorais com uma amostra de tamanho 500. No caso, deve haver segundo turno entre \(A\) e \(B\).

desempateTecnico::simplex3d(.3919345050, .3324785813, .2755869137, 500)
rgl::rglwidget()

2.6.2 Gráficos básicos

2.6.2.1 Setores/Pizza

A idéia é desenhar setores/fatias proporcionais às frequências das categorias. Seguindo a etiqueta da apresentação gráfica, recomenda-se a utilização deste tipo de gráfico para, no máximo, dez categorias. Além disso, por padrão apresentados em sentido anti-horário iniciando em 0º.

atend <- c(90,62,31,44,13)                      # Número de atendimentos
colors <- gray(0:4/4)                           # Cinco tons de cinza
atend_rel <- round(atend/sum(atend) * 100, 1)   # Calculando os percentuais
atend_rel <- paste(atend_rel, '%', sep='')      # Adicionando '%'

# Frequência (da classe)
pie(atend, main = 'Atendimentos', col = colors, labels = atend, 
    cex = 1.2, cex.main = 1.7)   
legend(1.1, 0.9, c('Seg','Ter','Qua','Qui','Sex'), cex = 1.3, fill = colors, 
       box.col = 'white')

# Frequência relativa
pie(atend, main = 'Atendimentos em um guichê', col = colors, labels = atend_rel,
    cex = 1.2, cex.main = 1.7)   
legend(1.3, 0.9, c('Seg','Ter','Qua','Qui','Sex'), cex = 1.3, fill = colors, 
       box.col='white')

2.6.2.2 Barras e Colunas

O gráfico de barras é usualmente utilizado para apresentar dados classificados em categorias não ordenadas. Barras retangulares de mesma largura são dispostas sobre as categorias com altura proporcional às frequências ou outra medida associada com as categorias. Podem ser dispostas na horizontal ou vertical; quando agrupadas desta última forma, chama-se gráfico de colunas. É um gráfico bastante versátil, pois permite representar a informação de diversas maneiras.

# Dados
custos <- c(760, 640, 75, 850, 100)
names(custos) <- c('educacao', 'aliment.', 'eletricidade', 'moradia', 'internet')

# Barras
barplot(custos, xlab = 'Custo (R$)', main = 'Custos pessoais', 
        col = gray(0:4/4), las = 0, cex.main = 1.6, horiz = TRUE)

# Colunas
barplot(custos, ylab = 'Custo (R$)', main = 'Custos pessoais', 
        col = gray(0:4/4), las = 0, cex.main = 1.6)

# Colunas empilhadas
library(vcd)
trat <- table(Arthritis$Improved, Arthritis$Treatment)
rownames(trat) <- c('Nenhuma melhora', 'Alguma melhora', 'Plena melhora')
colnames(trat) <- c('Placebo', 'Tratamento')

barplot(trat,
        main = 'Placebo vs trat.',
        ylab = 'Frequência',
        col = c('black', 'grey', 'white'),
        cex.main = 1.6)
legend(1.5, 40, rownames(trat), cex = 1, fill = colors[c(1,3,5)], 
       box.col = 'white')

# Colunas lado a lado
barplot(trat,
        main = 'Placebo vs tratamento',
        ylab = 'Frequência',
        col = c('black', 'grey', 'white'),
        cex.main = 1.6, beside = TRUE)
legend(4, 28, rownames(trat), cex = 1, fill = colors[c(1,3,5)], 
       box.col = 'white')

2.6.2.3 Histograma

The histogram is the classical nonparametric density estimator, probably dating from the mortality studies of John Graunt in 1662. (Scott 1979, 605)

O histograma é um gráfico de barras sem espaçamento utilizado para representar distribuições de frequência de variáveis contínuas. O termo foi introduzido por Karl Pearson “em suas palestras sobre estatística como um termo para uma forma comum de representação gráfica, ou seja, por colunas marcando como áreas a frequência correspondente ao alcance de sua base”. (Pearson 1895, 399)

Apresenta-se a variável dividida em classes no eixo horizontal (\(x\)) e a frequência de cada classe no eixo vertical (\(y\)). Os pacotes computacionais em geral definem o número de classes pela regra de Sturges conforme Eq. (2.3). É uma ferramenta básica de análise exploratória de dados para avaliar a dispersão e forma dos dados, detectar valores atípicos e sugerir modelos e transformações para análises mais avançadas.

# Dados
h <- read.csv('https://filipezabala.com/data/hospital.csv', header = TRUE)

# Histograma padrão
hist(h$height, prob = FALSE, right = FALSE, breaks = 'sturges', main = '', 
     xlab = 'Altura (m)', col = 'grey')

# Amplitude de classes de Freedman-Diaconis
hist(h$height, prob = TRUE, right = FALSE, breaks = 'fd', main = '', 
     xlab = 'Altura (m)', col = 'grey')
# Ajustando normal teórica
curve(dnorm(x, mean = mean(h$height), sd = sd(h$height)), col = 'blue', lwd = 2,
      add = TRUE)

# Utilizando a biblioteca ggplot2
ggplot2::qplot(h$height, geom = 'histogram', xlab = 'Altura (m)')

2.6.2.4 Boxplot

Introduzido por (Tukey 1977), o boxplot ou diagrama em caixa é um gráfico em formato retangular limitado pelo primeiro e terceiro quartis, onde a linha central é a mediana. A distância entre os quartis é a amplitude interquartílica conforme Seção 2.4.5 e contempla \(50\%\) dos dados centrais. Pontos que ultrapassam \(1.5\) vez a amplitude interquartílica acima (abaixo) de \(Q_{3}\) (\(Q_{1}\)) são chamados outliers. Variações são discutidas por (McGill, Tukey, and Larsen 1978), (Benjamini 1988) e (Esty and Banfield 2003).

# dados
h <- read.csv('https://filipezabala.com/data/hospital.csv', header = TRUE)

# Boxplot
boxplot(h$children, main = 'Número de filhos', ylab = 'Número de filhos', 
        las = 1, cex.main = 1.6)
legend(1.32, 0.1, 'Mínimo', box.col = 'white')
arrows(x0 = 1.35, y0 = 0, x1 = 1.25, y1 = 0, length = 0.15)
legend(1.32, 1.1, 'Q1', box.col = 'white')
arrows(x0 = 1.35, y0 = 1, x1 = 1.25, y1 = 1, length = 0.15)
legend(1.32, 2.1, 'Mediana', box.col = 'white')
arrows(x0 = 1.35, y0 = 2, x1 = 1.25, y1 = 2, length = 0.15)
legend(1.32, 3.1, 'Q3', box.col='white')
arrows(x0 = 1.35, y0 = 3, x1 = 1.25, y1 = 3, length = 0.15)
legend(1.32, 6.1, 'Máximo', box.col = 'white')
arrows(x0 = 1.35, y0 = 6, x1 = 1.25, y1 = 6, length = 0.15)

# Proporcional ao tamanho do grupo
set.seed(1); y <- c(rpois(50, lambda=1.5), rnorm(300,4), (1:150)/17)
x <- factor(c(rep('A',50), rep('B',300), rep('C',150) ))
bp <- boxplot(y ~ x, varwidth = TRUE, las = TRUE, main = 'Variável W', 
              cex.main = 1.6)
mtext(paste('(n=', bp$n, ')', sep = ''), at = seq_along(bp$n), line = 2, 
      side = 1)

# Vertical
boxplot(count ~ spray, data = InsectSprays, col = 'lightgray', 
        main = 'Pontuação em um teste', ylab = 'Pontos', xlab = 'Grupo', 
        las = 1, cex.main = 1.6)
legend(2.85, 18.5, 'Outliers', box.col = 'white')
arrows(x0 = 3.4,y0 = 15, x1 = 3.05, y1 = 7.8, length = 0.15)
arrows(x0 = 3.4,y0 = 15, x1 = 3.9, y1 = 12.3, length = 0.15)

# Horizontal
boxplot(count ~ spray, data = InsectSprays, col = 'lightgray', 
        main = 'Pontuação em um teste', ylab = 'Pontos', xlab = 'Grupo', 
        las = 1, cex.main = 1.6, horizontal = TRUE)

2.6.2.5 Gráfico de Dispersão

O gráfico de dispersão apresenta a relação entre duas variáveis numéricas. É uma ferramenta útil no ajuste dos modelos apresentados no Capítulo 7.

performance <- 0.42515199183708*mtcars$mpg
weight <- 0.453592*mtcars$wt*1000
displacement <- 16.387064*mtcars$disp
rear_axle_ratio <- mtcars$drat

# Gráfico de dispersão
plot(weight, performance,
     main = 'Performance (km/L) vs Weight (kg)',
     xlab = 'Car weight (kg)',
     ylab = 'Performance (km/L)',
     pch = 19, las = 1, cex.main = 1.6)

# Matriz de dispersão
pairs(~ performance + weight + displacement + rear_axle_ratio,
      main = 'Scatter matrix', cex.main = 1.6)

2.6.2.6 Correlograma

Adaptado de http://www.r-graph-gallery.com/97-correlation-ellipses/.

# Bibliotecas
# install.packages(c('ellipse','RColorBrewer'), dep=T)
library(ellipse)
library(RColorBrewer)

# Usando o famoso banco de dados 'mtcars'
data <- cor(mtcars)

# Painel de 100 cores com Rcolor Brewer
my_colors <- brewer.pal(5, "Spectral")
my_colors <- colorRampPalette(my_colors)(100)

# Ordenando a matriz de correlação
ord <- order(data[1, ])
data_ord <- data[ord, ord]
plotcorr(data_ord , col=my_colors[data_ord*50+50] , mar=c(1,1,1,1))

Adaptado de http://r-statistics.co/Top50-Ggplot2-Visualizations-MasterList-R-Code.html#Correlogram.

# Bibliotecas
# devtools::install_github("kassambara/ggcorrplot")
library(ggplot2)
library(ggcorrplot)

# Matriz de correlação
data(mtcars)
corr <- round(cor(mtcars), 1)

# Gráfico
ggcorrplot(corr, hc.order = TRUE,
           type = 'lower',
           lab = TRUE,
           lab_size = 3,
           method = 'circle',
           colors = c('tomato2', 'white', 'springgreen3'),
           title = 'Correlograma de mtcars',
           ggtheme = theme_bw)

Referências

Benjamini, Yoav. 1988. “Opening the Box of a Boxplot.” The American Statistician 42 (4): 257–62. https://www.tandfonline.com/doi/abs/10.1080/00031305.1988.10475580.
Cohen, I Bernard. 1984. “Florence Nightingale.” Scientific American 250 (3): 128–37. https://www.jstor.org/stable/pdf/24969329.pdf.
Cook, Edward. 1913. The Life of Florence Nightingale. The Macmillan Company. https://ia801504.us.archive.org/24/items/in.ernet.dli.2015.64009/2015.64009.The-Life-Of-Florence-Nightingale.pdf.
Esty, Warren W, and Jeff Banfield. 2003. “The Box-Percentile Plot.” Journal of Statistical Software 8: 1–14. https://doi.org/10.18637/jss.v008.i17.
Kopf, Edwin W. 1916. “Florence Nightingale as Statistician.” Quarterly Publications of the American Statistical Association 15 (116): 388–404. https://www.jstor.org/stable/pdf/2965763.pdf.
McGill, Robert, John W Tukey, and Wayne A Larsen. 1978. “Variations of Box Plots.” The American Statistician 32 (1): 12–16. https://www.tandfonline.com/doi/pdf/10.1080/00031305.1978.10479236.
Nightingale, Florence. 1858. “Notes on Matters Affecting the Health, Efficiency, and Hospital Administration of the British Army.” London: Printed by Harrison and Sons, St. Martin’s Lane, W.C. https://archive.org/details/b20387118.
Pearson, Karl. 1895. “X. Contributions to the Mathematical Theory of Evolution.—II. Skew Variation in Homogeneous Material.” Philosophical Transactions of the Royal Society of London.(A.) 1 (186): 343–414. https://doi.org/10.1098/rsta.1895.0010.
Press, William H., Saul Teukolsky, William T. Vetterling, and Brian P. Flannery. 1992. Numerical Recipes in C: The Art of Scientific Computing. Cambridge University Press. https://www.grad.hr/nastava/gs/prg/NumericalRecipesinC.pdf.
Scott, David W. 1979. “On Optimal and Data-Based Histograms.” Biometrika 66 (3): 605–10. http://materias.df.uba.ar/mtb2019c1/files/2014/08/On-optimal-and-Data-based-histograms.pdf.
Tufte, Edward R. 1993. Envisioning Information. Graphics Press Cheshire, CT.
———. 2006. Beautiful Evidence. Graphics Press Cheshire, CT.
———. 2020. Seeing with Fresh Eyes: Meaning, Space, Data, Truth. Graphics Press LLC.
Tufte, Edward R, and Peter R Graves-Morris. 2001. The Visual Display of Quantitative Information. 2nd ed. Graphics Press Cheshire, CT. https://faculty.salisbury.edu/~jtanderson/teaching/cosc311/fa21/files/tufte.pdf.
Tufte, Edward R, Susan R McKay, Wolfgang Christian, and James R Matey. 1998. “Visual Explanations: Images and Quantities, Evidence and Narrative.” American Institute of Physics.
Tukey, John W. 1977. Exploratory Data Analysis. Addison-Wesley Publishing Company.
Walker, Francis Amasa. 1874. The Indian Question. Boston: JR Osgood. https://www.gutenberg.org/files/27058/27058-h/27058-h.htm.
Wilkinson, Leland. 2005. The Grammar of Graphics, 2nd Edition. Springer.
Zabala, Filipe J. 2009. “Desempate Técnico.” Master’s thesis, Universidade de São Paulo. https://doi.org/10.11606/D.45.2009.tde-01032021-140004.