library(dplyr)
library(ggplot2)

Há duas razões para que transformações como esta sejam aplicadas aos dados: uma estatística e uma proporcional.

A primeira: Supondo que a distribuição da variável em questão possui um viés, ou seja, uma das extremidades elevadas e uma cauda longa, medidas como correlação ou regressão podem ser bastante influenciadas pelo pico da distribuição, outliers, dentre outros. A aplicação da transformação pode reduzir o efeito do viés.

A segunda: Alguns conceitos são melhor compreendidos quando tratamos sobre a proporção dos objetos do que sobre a diferença entre eles. Suponha duas empresas, Lindo Olhar e Burguer King, de portes pequeno e muito grande, respectivamente. Lindo Olhar possui um faturamento diário de alguns milhares de reais por dia, enquanto a segunda possui um faturamento de milhões de reais por dia. Se o faturamento da primeira empresa passa de R$ 3.000 para R$ 9.000 (uma diferença de 6 mil reais, razão de 3), é uma grande diferença visto que seu faturamento triplicou. Já se o faturamento da segunda passa de R$ 9.000.000 para R$ 9.006.000 (uma diferença 6 mil reais, razão de pouco mais de 1), ninguém liga, visto que a diferença foi baixa. Neste caso a transformação logarítmica nos dados de faturamento durante um ano, por exemplo, poderia ser utilizada para comparar o crescimento das empresas de forma justa - podendo ajudar a deixar a relação entre os dados mais clara.

No exemplo acima temos scatterplots do peso do cérebro do animal em função do peso do corpo. Dados brutos no gráfico 1 e com transformação log no gráfico 2. É difícil notar uma relação entre os dados no primeiro gráfico, enquanto no segundo podemos ver a relação entre eles claramente.

O mesmo ocorre para distribuições:

Podemos ver que a distribuições dos dados são bastante enviesadas à direita, mas ao transformarmos para o log na base 10 do valor original, temos uma distribuição bem mais normal:

Outro exemplo

Vamos inicialmente importar os dados:

attach(diamonds)

E ver a estrutura dos dados, bem como os mesmos se comportam:

str(diamonds)
## Classes 'tbl_df', 'tbl' and 'data.frame':    53940 obs. of  10 variables:
##  $ carat  : num  0.23 0.21 0.23 0.29 0.31 0.24 0.24 0.26 0.22 0.23 ...
##  $ cut    : Ord.factor w/ 5 levels "Fair"<"Good"<..: 5 4 2 4 2 3 3 3 1 3 ...
##  $ color  : Ord.factor w/ 7 levels "D"<"E"<"F"<"G"<..: 2 2 2 6 7 7 6 5 2 5 ...
##  $ clarity: Ord.factor w/ 8 levels "I1"<"SI2"<"SI1"<..: 2 3 5 4 2 6 7 3 4 5 ...
##  $ depth  : num  61.5 59.8 56.9 62.4 63.3 62.8 62.3 61.9 65.1 59.4 ...
##  $ table  : num  55 61 65 58 58 57 57 55 61 61 ...
##  $ price  : int  326 326 327 334 335 336 336 337 337 338 ...
##  $ x      : num  3.95 3.89 4.05 4.2 4.34 3.94 3.95 4.07 3.87 4 ...
##  $ y      : num  3.98 3.84 4.07 4.23 4.35 3.96 3.98 4.11 3.78 4.05 ...
##  $ z      : num  2.43 2.31 2.31 2.63 2.75 2.48 2.47 2.53 2.49 2.39 ...
summary(diamonds)
##      carat               cut        color        clarity     
##  Min.   :0.2000   Fair     : 1610   D: 6775   SI1    :13065  
##  1st Qu.:0.4000   Good     : 4906   E: 9797   VS2    :12258  
##  Median :0.7000   Very Good:12082   F: 9542   SI2    : 9194  
##  Mean   :0.7979   Premium  :13791   G:11292   VS1    : 8171  
##  3rd Qu.:1.0400   Ideal    :21551   H: 8304   VVS2   : 5066  
##  Max.   :5.0100                     I: 5422   VVS1   : 3655  
##                                     J: 2808   (Other): 2531  
##      depth           table           price             x         
##  Min.   :43.00   Min.   :43.00   Min.   :  326   Min.   : 0.000  
##  1st Qu.:61.00   1st Qu.:56.00   1st Qu.:  950   1st Qu.: 4.710  
##  Median :61.80   Median :57.00   Median : 2401   Median : 5.700  
##  Mean   :61.75   Mean   :57.46   Mean   : 3933   Mean   : 5.731  
##  3rd Qu.:62.50   3rd Qu.:59.00   3rd Qu.: 5324   3rd Qu.: 6.540  
##  Max.   :79.00   Max.   :95.00   Max.   :18823   Max.   :10.740  
##                                                                  
##        y                z         
##  Min.   : 0.000   Min.   : 0.000  
##  1st Qu.: 4.720   1st Qu.: 2.910  
##  Median : 5.710   Median : 3.530  
##  Mean   : 5.735   Mean   : 3.539  
##  3rd Qu.: 6.540   3rd Qu.: 4.040  
##  Max.   :58.900   Max.   :31.800  
## 

Vamos verificar se existe alguma relação entre o peso (carat) do diamante e o preço (price) do mesmo:

ggplot(diamonds, aes(x = price, y = carat)) +
  geom_point() +
  geom_smooth(method = "lm")

Vemos que existe uma relação entre o peso e o preço do diamante, o que faz bastante sentido. Como pode ser visto na correlação a baixo:

cor(diamonds$price, diamonds$carat)
## [1] 0.9215913

Porém vemos também que existem alguns valores mais extremos do peso do diamante que não refletem em um preço preço maior. Com isso vamos utilizar a transformação log para suavizar a diferença entre os valores extremos e os demais:

ggplot(diamonds, aes(x = log(price), y = log(carat))) +
  geom_point() +
  geom_smooth(method = "lm")

Com isso, podemos ver que a relação entre as variáveis aumentou, como pode ser visto também pela correlação:

cor(log(price), log(carat))
## [1] 0.9659137

Referências