Este material apresenta vários exemplos comentados para calcular correlação de Pearson, Spearman, Kendal, teste de correlação, teste de normalidade e gráficos diversos sobre o tema.
Não é meu objetivo apresentar a parte teórica sobre o tema. Busque outras fontes para melhor compeensão das técnicas apresentadas a seguir.
instale os pacotes a seguir a primeira vex que for executar os exemplos
# install.packages("ggpubr","Hmisc", "corrplot","PerformanceAnalytics")
# carregar o pacote
library("ggpubr")
Vamos usar o pacote mtcars para ser a nossa base de dados. São 11 caractéristicas de 32 veículos
# .txt tab file, use read.delim
# my_data <- read.delim(file.choose())
# .csv file, use read.csv
# my_data <- read.csv(file.choose())
my_data <- mtcars
head(my_data, 6)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
O gráfico a seguir representa a relação entre as variáveis mpg e wt (apresenta a correlação de pearson e o p-valor). Explicando de forma prática o p-valor: Quando é próximo a zero, significa que não há evidência estatística de que a correlação entre as variáveis seja igual a zero. Quanto maior for o p-valor, menor é a chance de evidenciar essa hipótese e vice-versa.
ggscatter(my_data, x = "mpg", y = "wt",
add = "reg.line", conf.int = TRUE,
cor.coef = TRUE, cor.method = "pearson",
xlab = "Miles/(US) gallon", ylab = "Weight (1000 lbs)")
o coeficiente de correlação de Pearson exige que os dados sigam a distribuição normal de probabilidades. O teste a seguir (Shapiro Wilk) é uma técnica formal para avaliar normalidade. Se o p-valor for próximo a zero, rejeitamos a hipótese de normalidade. Um valor < 0,05, por exemplo, geralmente é empregado como referência.
# Shapiro-Wilk normality test for mpg
shapiro.test(my_data$mpg) # => p = 0.1229
##
## Shapiro-Wilk normality test
##
## data: my_data$mpg
## W = 0.94756, p-value = 0.1229
# Shapiro-Wilk normality test for wt
shapiro.test(my_data$wt) # => p = 0.09
##
## Shapiro-Wilk normality test
##
## data: my_data$wt
## W = 0.94326, p-value = 0.09265
Uma forma empírica para avaliar normalidade é o gráfico qqplot. Haverá evidência empírica de normalidade na medida em que os valores estejam próximmos da reta.
# mpg
ggqqplot(my_data, my_data$mpg, ylab = "MPG")
# wt
ggqqplot(my_data, my_data$wt, ylab = "WT")
teste da correlação de Pearson. Apresenta a correlação e o p-valor
res <- cor.test(my_data$wt, my_data$mpg,
method = "pearson")
res
##
## Pearson's product-moment correlation
##
## data: my_data$wt and my_data$mpg
## t = -9.559, df = 30, p-value = 1.294e-10
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## -0.9338264 -0.7440872
## sample estimates:
## cor
## -0.8676594
Os testes de kendal e Spearman são medidas de correlações emregadas para dados ordinais (Ex: escalas de likert de 1 a 5, ordens de classificação, julgamentos realizados em categorias e etc. A ideia é que os resultados representem hierarquia, ou seja, 1 representa um resultado inferior a 2 e assim por diante. Contudo não podemos afirmar que o 2 é duas vezes melhor que o 1), ou ainda, estes testes são epregados quando não podemos supor normalidade nos dados.
teste de correlação de kendall. Apresenta a correlação e o p-valor
res2 <- cor.test(my_data$wt, my_data$mpg, method="kendall")
res2
##
## Kendall's rank correlation tau
##
## data: my_data$wt and my_data$mpg
## z = -5.7981, p-value = 6.706e-09
## alternative hypothesis: true tau is not equal to 0
## sample estimates:
## tau
## -0.7278321
teste de correlação de spearman. Apresenta a correlação e o p-valor
res3 <-cor.test(my_data$wt, my_data$mpg, method = "spearman")
res3
##
## Spearman's rank correlation rho
##
## data: my_data$wt and my_data$mpg
## S = 10292, p-value = 1.488e-11
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
## rho
## -0.886422
matriz com a correlação entre todas as variáveis
res <- cor(my_data, use = "complete.obs")
round(res, 2)
## mpg cyl disp hp drat wt qsec vs am gear carb
## mpg 1.00 -0.85 -0.85 -0.78 0.68 -0.87 0.42 0.66 0.60 0.48 -0.55
## cyl -0.85 1.00 0.90 0.83 -0.70 0.78 -0.59 -0.81 -0.52 -0.49 0.53
## disp -0.85 0.90 1.00 0.79 -0.71 0.89 -0.43 -0.71 -0.59 -0.56 0.39
## hp -0.78 0.83 0.79 1.00 -0.45 0.66 -0.71 -0.72 -0.24 -0.13 0.75
## drat 0.68 -0.70 -0.71 -0.45 1.00 -0.71 0.09 0.44 0.71 0.70 -0.09
## wt -0.87 0.78 0.89 0.66 -0.71 1.00 -0.17 -0.55 -0.69 -0.58 0.43
## qsec 0.42 -0.59 -0.43 -0.71 0.09 -0.17 1.00 0.74 -0.23 -0.21 -0.66
## vs 0.66 -0.81 -0.71 -0.72 0.44 -0.55 0.74 1.00 0.17 0.21 -0.57
## am 0.60 -0.52 -0.59 -0.24 0.71 -0.69 -0.23 0.17 1.00 0.79 0.06
## gear 0.48 -0.49 -0.56 -0.13 0.70 -0.58 -0.21 0.21 0.79 1.00 0.27
## carb -0.55 0.53 0.39 0.75 -0.09 0.43 -0.66 -0.57 0.06 0.27 1.00
matriz com a correlação entre todas as variáveis
library("Hmisc")
res2 <- rcorr(as.matrix(my_data))
res2
## mpg cyl disp hp drat wt qsec vs am gear carb
## mpg 1.00 -0.85 -0.85 -0.78 0.68 -0.87 0.42 0.66 0.60 0.48 -0.55
## cyl -0.85 1.00 0.90 0.83 -0.70 0.78 -0.59 -0.81 -0.52 -0.49 0.53
## disp -0.85 0.90 1.00 0.79 -0.71 0.89 -0.43 -0.71 -0.59 -0.56 0.39
## hp -0.78 0.83 0.79 1.00 -0.45 0.66 -0.71 -0.72 -0.24 -0.13 0.75
## drat 0.68 -0.70 -0.71 -0.45 1.00 -0.71 0.09 0.44 0.71 0.70 -0.09
## wt -0.87 0.78 0.89 0.66 -0.71 1.00 -0.17 -0.55 -0.69 -0.58 0.43
## qsec 0.42 -0.59 -0.43 -0.71 0.09 -0.17 1.00 0.74 -0.23 -0.21 -0.66
## vs 0.66 -0.81 -0.71 -0.72 0.44 -0.55 0.74 1.00 0.17 0.21 -0.57
## am 0.60 -0.52 -0.59 -0.24 0.71 -0.69 -0.23 0.17 1.00 0.79 0.06
## gear 0.48 -0.49 -0.56 -0.13 0.70 -0.58 -0.21 0.21 0.79 1.00 0.27
## carb -0.55 0.53 0.39 0.75 -0.09 0.43 -0.66 -0.57 0.06 0.27 1.00
##
## n= 32
##
##
## P
## mpg cyl disp hp drat wt qsec vs am gear
## mpg 0.0000 0.0000 0.0000 0.0000 0.0000 0.0171 0.0000 0.0003 0.0054
## cyl 0.0000 0.0000 0.0000 0.0000 0.0000 0.0004 0.0000 0.0022 0.0042
## disp 0.0000 0.0000 0.0000 0.0000 0.0000 0.0131 0.0000 0.0004 0.0010
## hp 0.0000 0.0000 0.0000 0.0100 0.0000 0.0000 0.0000 0.1798 0.4930
## drat 0.0000 0.0000 0.0000 0.0100 0.0000 0.6196 0.0117 0.0000 0.0000
## wt 0.0000 0.0000 0.0000 0.0000 0.0000 0.3389 0.0010 0.0000 0.0005
## qsec 0.0171 0.0004 0.0131 0.0000 0.6196 0.3389 0.0000 0.2057 0.2425
## vs 0.0000 0.0000 0.0000 0.0000 0.0117 0.0010 0.0000 0.3570 0.2579
## am 0.0003 0.0022 0.0004 0.1798 0.0000 0.0000 0.2057 0.3570 0.0000
## gear 0.0054 0.0042 0.0010 0.4930 0.0000 0.0005 0.2425 0.2579 0.0000
## carb 0.0011 0.0019 0.0253 0.0000 0.6212 0.0146 0.0000 0.0007 0.7545 0.1290
## carb
## mpg 0.0011
## cyl 0.0019
## disp 0.0253
## hp 0.0000
## drat 0.6212
## wt 0.0146
## qsec 0.0000
## vs 0.0007
## am 0.7545
## gear 0.1290
## carb
p-valores e Correlações
# Extract the correlation coefficients
res2$r
## mpg cyl disp hp drat wt
## mpg 1.0000000 -0.8521619 -0.8475513 -0.7761683 0.68117189 -0.8676594
## cyl -0.8521619 1.0000000 0.9020329 0.8324475 -0.69993812 0.7824958
## disp -0.8475513 0.9020329 1.0000000 0.7909486 -0.71021390 0.8879799
## hp -0.7761683 0.8324475 0.7909486 1.0000000 -0.44875914 0.6587479
## drat 0.6811719 -0.6999381 -0.7102139 -0.4487591 1.00000000 -0.7124406
## wt -0.8676594 0.7824958 0.8879799 0.6587479 -0.71244061 1.0000000
## qsec 0.4186840 -0.5912421 -0.4336979 -0.7082234 0.09120482 -0.1747159
## vs 0.6640389 -0.8108118 -0.7104159 -0.7230967 0.44027850 -0.5549157
## am 0.5998324 -0.5226070 -0.5912271 -0.2432043 0.71271110 -0.6924953
## gear 0.4802848 -0.4926866 -0.5555692 -0.1257043 0.69961011 -0.5832870
## carb -0.5509251 0.5269883 0.3949769 0.7498125 -0.09078978 0.4276059
## qsec vs am gear carb
## mpg 0.41868404 0.6640389 0.59983242 0.4802848 -0.55092508
## cyl -0.59124213 -0.8108118 -0.52260703 -0.4926866 0.52698827
## disp -0.43369791 -0.7104159 -0.59122705 -0.5555692 0.39497685
## hp -0.70822340 -0.7230967 -0.24320425 -0.1257043 0.74981248
## drat 0.09120482 0.4402785 0.71271110 0.6996101 -0.09078978
## wt -0.17471591 -0.5549157 -0.69249529 -0.5832870 0.42760593
## qsec 1.00000000 0.7445354 -0.22986083 -0.2126822 -0.65624928
## vs 0.74453545 1.0000000 0.16834512 0.2060234 -0.56960714
## am -0.22986083 0.1683451 1.00000000 0.7940587 0.05753435
## gear -0.21268222 0.2060234 0.79405874 1.0000000 0.27407283
## carb -0.65624928 -0.5696071 0.05753435 0.2740728 1.00000000
# Extract p-values
res2$P
## mpg cyl disp hp drat
## mpg NA 6.112697e-10 9.380354e-10 1.787838e-07 1.776241e-05
## cyl 6.112697e-10 NA 1.803002e-12 3.477856e-09 8.244635e-06
## disp 9.380354e-10 1.803002e-12 NA 7.142686e-08 5.282028e-06
## hp 1.787838e-07 3.477856e-09 7.142686e-08 NA 9.988768e-03
## drat 1.776241e-05 8.244635e-06 5.282028e-06 9.988768e-03 NA
## wt 1.293956e-10 1.217567e-07 1.222311e-11 4.145833e-05 4.784268e-06
## qsec 1.708199e-02 3.660527e-04 1.314403e-02 5.766250e-06 6.195823e-01
## vs 3.415940e-05 1.843015e-08 5.235010e-06 2.940897e-06 1.167552e-02
## am 2.850209e-04 2.151208e-03 3.662112e-04 1.798309e-01 4.726797e-06
## gear 5.400949e-03 4.173297e-03 9.635927e-04 4.930119e-01 8.360117e-06
## carb 1.084446e-03 1.942341e-03 2.526789e-02 7.827805e-07 6.211834e-01
## wt qsec vs am gear
## mpg 1.293956e-10 1.708199e-02 3.415940e-05 2.850209e-04 5.400949e-03
## cyl 1.217567e-07 3.660527e-04 1.843015e-08 2.151208e-03 4.173297e-03
## disp 1.222311e-11 1.314403e-02 5.235010e-06 3.662112e-04 9.635927e-04
## hp 4.145833e-05 5.766250e-06 2.940897e-06 1.798309e-01 4.930119e-01
## drat 4.784268e-06 6.195823e-01 1.167552e-02 4.726797e-06 8.360117e-06
## wt NA 3.388682e-01 9.798495e-04 1.125438e-05 4.586600e-04
## qsec 3.388682e-01 NA 1.029669e-06 2.056622e-01 2.425345e-01
## vs 9.798495e-04 1.029669e-06 NA 3.570440e-01 2.579439e-01
## am 1.125438e-05 2.056622e-01 3.570440e-01 NA 5.834051e-08
## gear 4.586600e-04 2.425345e-01 2.579439e-01 5.834051e-08 NA
## carb 1.463861e-02 4.536940e-05 6.670496e-04 7.544526e-01 1.290291e-01
## carb
## mpg 1.084446e-03
## cyl 1.942341e-03
## disp 2.526789e-02
## hp 7.827805e-07
## drat 6.211834e-01
## wt 1.463861e-02
## qsec 4.536940e-05
## vs 6.670496e-04
## am 7.544526e-01
## gear 1.290291e-01
## carb NA
a função a seguir flattenCorrMatrix será empregada para organizar a saída.
# ++++++++++++++++++++++++++++
# flattenCorrMatrix
# ++++++++++++++++++++++++++++
# cormat : matrix of the correlation coefficients
# pmat : matrix of the correlation p-values
flattenCorrMatrix <- function(cormat, pmat) {
ut <- upper.tri(cormat)
data.frame(
row = rownames(cormat)[row(cormat)[ut]],
column = rownames(cormat)[col(cormat)[ut]],
cor =(cormat)[ut],
p = pmat[ut]
)
}
Emprego da função ** flattenCorrMatrix **
library(Hmisc)
res2<-rcorr(as.matrix(mtcars[,1:7])) # somente as variáveis 1 a 7
flattenCorrMatrix(res2$r, res2$P)
## row column cor p
## 1 mpg cyl -0.85216194 6.112697e-10
## 2 mpg disp -0.84755135 9.380354e-10
## 3 cyl disp 0.90203285 1.803002e-12
## 4 mpg hp -0.77616835 1.787838e-07
## 5 cyl hp 0.83244747 3.477856e-09
## 6 disp hp 0.79094857 7.142686e-08
## 7 mpg drat 0.68117189 1.776241e-05
## 8 cyl drat -0.69993812 8.244635e-06
## 9 disp drat -0.71021390 5.282028e-06
## 10 hp drat -0.44875914 9.988768e-03
## 11 mpg wt -0.86765939 1.293956e-10
## 12 cyl wt 0.78249580 1.217567e-07
## 13 disp wt 0.88797992 1.222311e-11
## 14 hp wt 0.65874785 4.145833e-05
## 15 drat wt -0.71244061 4.784268e-06
## 16 mpg qsec 0.41868404 1.708199e-02
## 17 cyl qsec -0.59124213 3.660527e-04
## 18 disp qsec -0.43369791 1.314403e-02
## 19 hp qsec -0.70822340 5.766250e-06
## 20 drat qsec 0.09120482 6.195823e-01
## 21 wt qsec -0.17471591 3.388682e-01
Gráfico que ilustra as correlações corplot
library(corrplot)
corrplot(res, type = "upper", order = "hclust",
tl.col = "black", tl.srt = 45)
Gráfico que ilustra as correlações corplot. Mantém apenas as correlções significativas. o ponto de corte é p-valor maior que 0,01.
# Insignificant correlation are crossed
corrplot(res2$r, type="upper", order="hclust",
p.mat = res2$P, sig.level = 0.01, insig = "blank")
Outra forma gráfica para ilustras as correlações
library("PerformanceAnalytics")
my_data <- mtcars[, c(1,3,4,5,6,7)]
chart.Correlation(my_data, histogram=TRUE, pch=19)
o heatmap também ilustra as correlações. Quanto mais azul, maior é a associação positiva e vermelho representa a associação negativa (inversa). A cor branca indica ausência de correlação.
# Get some colors
col<- colorRampPalette(c("blue", "white", "red"))(20)
heatmap(x = res, col = col, symm = TRUE)
Várias formas para ilustrar a correlação. Explore!
head(mtcars)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
M <-cor(mtcars)
head(round(M,2))
## mpg cyl disp hp drat wt qsec vs am gear carb
## mpg 1.00 -0.85 -0.85 -0.78 0.68 -0.87 0.42 0.66 0.60 0.48 -0.55
## cyl -0.85 1.00 0.90 0.83 -0.70 0.78 -0.59 -0.81 -0.52 -0.49 0.53
## disp -0.85 0.90 1.00 0.79 -0.71 0.89 -0.43 -0.71 -0.59 -0.56 0.39
## hp -0.78 0.83 0.79 1.00 -0.45 0.66 -0.71 -0.72 -0.24 -0.13 0.75
## drat 0.68 -0.70 -0.71 -0.45 1.00 -0.71 0.09 0.44 0.71 0.70 -0.09
## wt -0.87 0.78 0.89 0.66 -0.71 1.00 -0.17 -0.55 -0.69 -0.58 0.43
library(corrplot)
corrplot(M, method="circle")
corrplot(M, method="pie")
corrplot(M, method="color")
corrplot(M, method="number")
corrplot(M, type="upper")
corrplot(M, type="lower")