Transformações

É uma tarefa extremamente difícil dizer exatamente quando usar cada tipo de transformação. É um processo trabalhoso e que provavelmente precisará de bastante tentaiva e erro, porém aqui serão apresentadas algumas dicas.

Lembre-se de sempre que transformar um atributo, confira os resultados.

Na prática, teste as transformações e compare os resultados do modelo.

Dados:

dados=cars$dist

summary(dados)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    2.00   26.00   36.00   42.98   56.00  120.00
ggplot(cars, aes(x=dist)) + 
  geom_histogram(aes(y=..density..), colour="black", fill="white") +
  geom_density(alpha=.2, fill="#FF6666") 
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

shapiro.test(dados)
## 
##  Shapiro-Wilk normality test
## 
## data:  dados
## W = 0.95144, p-value = 0.0391

Scale

Divide cada valor pelo desvio padrão do atributo.

Pode ser útil para a implementação de algorítimos como K-NN e LQV pois algorítmos que calculam distâncias se beneficiam com essa transformação.

Exemplo:

dp=sd(dados)

dados_scale=as.data.frame(dados/dp)

summary(dados_scale)
##     dados/dp      
##  Min.   :0.07761  
##  1st Qu.:1.00895  
##  Median :1.39701  
##  Mean   :1.66787  
##  3rd Qu.:2.17312  
##  Max.   :4.65669
ggplot(dados_scale, aes(x=dados_scale)) + 
  geom_histogram(aes(y=..density..), colour="black", fill="white") +
  geom_density(alpha=.2, fill="#FF6666") 
## Don't know how to automatically pick scale for object of type data.frame. Defaulting to continuous.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

shapiro.test(dados_scale[,1])
## 
##  Shapiro-Wilk normality test
## 
## data:  dados_scale[, 1]
## W = 0.95144, p-value = 0.0391

Center

Subtrai cada valor pela média do atributo

Exemplo:

m=mean(dados)

dados_center=as.data.frame(dados/m)

summary(dados_center)
##     dados/m       
##  Min.   :0.04653  
##  1st Qu.:0.60493  
##  Median :0.83760  
##  Mean   :1.00000  
##  3rd Qu.:1.30293  
##  Max.   :2.79200
ggplot(dados_center, aes(x=dados_center)) + 
  geom_histogram(aes(y=..density..), colour="black", fill="white") +
  geom_density(alpha=.2, fill="#FF6666") 
## Don't know how to automatically pick scale for object of type data.frame. Defaulting to continuous.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

shapiro.test(dados_center[,1])
## 
##  Shapiro-Wilk normality test
## 
## data:  dados_center[, 1]
## W = 0.95144, p-value = 0.0391

Standardize

Combinação das transformações scale e center. Os atributos terão média igual a 0 e desvio padrão igual a 1.

Métodos de regressão como linear regression, logístic regression e LDA podem obter melhores resultados pois em geral, esses algorítmos assumem que as variáveis de entrada possuem distribuição normal.

Também conhecido como z-score, é dado pela equação:

\[ Z = \dfrac{X_i - Média(X)}{Desvio \ Padrão(X)} \]

No R, temos a funcão scale(), veja:

dados_stand=as.data.frame(scale(dados))

summary(dados_center)
##     dados/m       
##  Min.   :0.04653  
##  1st Qu.:0.60493  
##  Median :0.83760  
##  Mean   :1.00000  
##  3rd Qu.:1.30293  
##  Max.   :2.79200
ggplot(dados_stand, aes(x=dados_stand)) + 
  geom_histogram(aes(y=..density..), colour="black", fill="white") +
  geom_density(alpha=.2, fill="#FF6666") 
## Don't know how to automatically pick scale for object of type data.frame. Defaulting to continuous.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

shapiro.test(dados_center[,1])
## 
##  Shapiro-Wilk normality test
## 
## data:  dados_center[, 1]
## W = 0.95144, p-value = 0.0391

Normalize

Transforma os dados em um range de 0 a 1.

Algorítmos que atribuem peso às variáveis (como redes neurais, por exemplo) costumam ser mais efetivos com atributos transformados assim.

\[ X_n = \dfrac{(X-X_{mín})}{X_{máx}-X_{mín}} \]

No R:

dados_normalize=as.data.frame( (dados-min(dados))/(max(dados)-min(dados))    )

summary(dados_normalize)
##  (dados - min(dados))/(max(dados) - min(dados))
##  Min.   :0.0000                                
##  1st Qu.:0.2034                                
##  Median :0.2881                                
##  Mean   :0.3473                                
##  3rd Qu.:0.4576                                
##  Max.   :1.0000
ggplot(dados_normalize, aes(x=dados_normalize)) + 
  geom_histogram(aes(y=..density..),bins=10, colour="black", fill="white") +
  geom_density(alpha=.2, fill="#FF6666") 
## Don't know how to automatically pick scale for object of type data.frame. Defaulting to continuous.

shapiro.test(dados_normalize[,1])
## 
##  Shapiro-Wilk normality test
## 
## data:  dados_normalize[, 1]
## W = 0.95144, p-value = 0.0391

Box-Cox

Quando um atributo tem a aparência de uma curva normal mas está deslocado para a direita ou para a esquerda, nos referimos à esta característica como skew. Este deslocamento pode ser ajustado para que o atributo se pareça mais com uma distribuição Normal.

Box-Cox nos permite realizar esta transformação, porém assume que todos os valores são positivos.

Consiste em transformar os dados de acordo com a expressão:

\[ y' = \dfrac{y^\lambda -1}{\lambda} \] onde \(\lambda\) é um parâmetro a ser estimado dos dados. Se \(\lambda=0\), temos:

\[ y' = ln(y) \]

No R:

#Primeiramente vejamos um valor para lambda:
require(MASS)
## Loading required package: MASS
boxcox(dist~speed,data=cars, plotit=T, lam=seq(-1, 1, 1/10))

#O gráfico mostra que a função que maximiza a função é aproximadamente 0.5, logo:
dados_boxcox=((dados^(0.5))-1)/0.5

summary(dados_boxcox)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.8284  8.1980 10.0000 10.4844 12.9666 19.9089
dados_boxcox=as.data.frame(dados_boxcox)
ggplot(dados_boxcox, aes(x=dados_boxcox)) + 
  geom_histogram(aes(y=..density..),bins=10, colour="black", fill="white") +
  geom_density(alpha=.2, fill="#FF6666") 

shapiro.test(dados_boxcox[,1])
## 
##  Shapiro-Wilk normality test
## 
## data:  dados_boxcox[, 1]
## W = 0.99347, p-value = 0.9941

Principal Component Analysis (PCA)

Resumidamente, plotamos os dados em um novo plano com novos eixos, conhecidos como componentes principais. A ideia é que estes componentes expliquem a maior variabilidade dos dados. Esta transformação pode ser útil para algorítimos como linear ou generalized linear regression

Mais informações podem ser encontradas em outro artigo já escrito aqui