Correlação em R: Matriz de Correlação de Pearson e Spearman
Correlação Bivariada em R
Um relacionamento bivariado descreve um relacionamento -ou correlação- entre duas variáveis em R. Neste tutorial, discutiremos o conceito de correlação e mostraremos como ele pode ser usado para medir o relacionamento entre quaisquer duas variáveis em R.
Correlação na Programação R
Existem dois métodos principais para calcular a correlação entre duas variáveis na programação R:
- Pearson: Correlação paramétrica
- Lanceiro: Correlação não paramétrica
Matriz de Correlação de Pearson em R
O método de correlação de Pearson é geralmente usado como verificação primária da relação entre duas variáveis.
A Coeficiente de correlação, , é uma medida da força do linear relação entre duas variáveis e . É calculado da seguinte forma:
com
, ou seja, desvio padrão de
, ou seja, desvio padrão de
A correlação varia entre -1 e 1.
- Um valor próximo ou igual a 0 implica pouca ou nenhuma relação linear entre e .
- Em contraste, quanto mais próximo de 1 ou -1, mais forte será a relação linear.
Podemos calcular o teste t como segue e verificar a tabela de distribuição com um grau de liberdade igual a:
Correlação de classificação de Spearman em R
Uma correlação de classificação classifica as observações por classificação e calcula o nível de similaridade entre as classificações. Uma correlação de classificação tem a vantagem de ser robusta a valores discrepantes e não estar vinculada à distribuição dos dados. Observe que uma correlação de classificação é adequada para a variável ordinal.
A correlação de classificação de Spearman, está sempre entre -1 e 1, com um valor próximo à extremidade indica forte relacionamento. É calculado da seguinte forma:
com declarou as covariâncias entre classificação e . O denominador calcula os desvios padrão.
Em R, podemos usar a função cor(). São necessários três argumentos, e o método.
cor(x, y, method)
Argumentos:
- x: Primeiro vetor
- y: Segundo vetor
- método: A fórmula usada para calcular a correlação. Três valores de string:
- “Pearson”
- “Kendall”
- "lanceiro"
Um argumento opcional pode ser adicionado se os vetores contiverem valores ausentes: use = “complete.obs”
Usaremos o conjunto de dados BudgetUK. Este conjunto de dados relata a alocação orçamentária das famílias britânicas entre 1980 e 1982. Existem 1519 observações com dez características, entre elas:
- wfood: compartilhe alimentos, compartilhe gastos
- combustível: compartilhe gastos com combustível
- pano: parcela do orçamento para gastos com roupas
- walc: compartilhe gastos com álcool
- wtrans: compartilhar gastos com transporte
- importa: parcela de gastos com outros bens
- totex: gasto total da família em libras
- rendimentos de capitais: renda familiar líquida total
- idade: idade da família
- crianças: número de filhos
Exemplo
library(dplyr) PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/british_household.csv" data <-read.csv(PATH) filter(income < 500) mutate(log_income = log(income), log_totexp = log(totexp), children_fac = factor(children, order = TRUE, labels = c("No", "Yes"))) select(-c(X,X.1, children, totexp, income)) glimpse(data)
Explicação do código
- Primeiro importamos os dados e damos uma olhada na função vislumbre() da biblioteca dplyr.
- Três pontos estão acima de 500K, então decidimos excluí-los.
- É uma prática comum converter uma variável monetária em log. Ajuda a reduzir o impacto de valores discrepantes e diminui a assimetria no conjunto de dados.
Saída:
## Observations: 1,516## Variables: 10 ## $ wfood <dbl> 0.4272, 0.3739, 0.1941, 0.4438, 0.3331, 0.3752, 0... ## $ wfuel <dbl> 0.1342, 0.1686, 0.4056, 0.1258, 0.0824, 0.0481, 0... ## $ wcloth <dbl> 0.0000, 0.0091, 0.0012, 0.0539, 0.0399, 0.1170, 0... ## $ walc <dbl> 0.0106, 0.0825, 0.0513, 0.0397, 0.1571, 0.0210, 0... ## $ wtrans <dbl> 0.1458, 0.1215, 0.2063, 0.0652, 0.2403, 0.0955, 0... ## $ wother <dbl> 0.2822, 0.2444, 0.1415, 0.2716, 0.1473, 0.3431, 0... ## $ age <int> 25, 39, 47, 33, 31, 24, 46, 25, 30, 41, 48, 24, 2... ## $ log_income <dbl> 4.867534, 5.010635, 5.438079, 4.605170, 4.605170,... ## $ log_totexp <dbl> 3.912023, 4.499810, 5.192957, 4.382027, 4.499810,... ## $ children_fac <ord> Yes, Yes, Yes, Yes, No, No, No, No, No, No, Yes, ...
Podemos calcular o coeficiente de correlação entre as variáveis renda e wfood com os métodos “pearson” e “spearman”.
cor(data$log_income, data$wfood, method = "pearson")
Saída:
## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")
Saída:
## [1] -0.2501252
Matriz de Correlação em R
A correlação bivariada é um bom começo, mas podemos ter uma visão mais ampla com a análise multivariada. Uma correlação com muitas variáveis é retratada dentro de um matriz de correlação. Uma matriz de correlação é uma matriz que representa a correlação de pares de todas as variáveis.
A função cor() retorna uma matriz de correlação. A única diferença com a correlação bivariada é que não precisamos especificar quais variáveis. Por padrão, R calcula a correlação entre todas as variáveis.
Observe que uma correlação não pode ser calculada para uma variável de fator. Precisamos ter certeza de que eliminaremos o recurso categórico antes de passarmos o quadro de dados dentro de cor().
Uma matriz de correlação é simétrica, o que significa que os valores acima da diagonal têm os mesmos valores que o valor abaixo. É mais visual mostrar metade da matriz.
Excluímos children_fac porque é uma variável de nível de fator. cor não realiza correlação em uma variável categórica.
# the last column of data is a factor level. We don't include it in the code mat_1 <-as.dist(round(cor(data[,1:9]),2)) mat_1
Explicação do código
- cor(dados): Exibe a matriz de correlação
- rodada (dados, 2): Arredonde a matriz de correlação com duas casas decimais
- como.dist(): Mostra apenas a segunda metade
Saída:
## wfood wfuel wcloth walc wtrans wother age log_income ## wfuel 0.11 ## wcloth -0.33 -0.25 ## walc -0.12 -0.13 -0.09 ## wtrans -0.34 -0.16 -0.19 -0.22 ## wother -0.35 -0.14 -0.22 -0.12 -0.29 ## age 0.02 -0.05 0.04 -0.14 0.03 0.02 ## log_income -0.25 -0.12 0.10 0.04 0.06 0.13 0.23 ## log_totexp -0.50 -0.36 0.34 0.12 0.15 0.15 0.21 0.49
Nível de significância
O nível de significância é útil em algumas situações quando utilizamos o método Pearson ou Spearman. A função rcorr() da biblioteca Hmisc calcula para nós o valor p. Podemos baixar a biblioteca de município e copie o código para colá-lo no terminal:
conda install -c r r-hmisc
O rcorr() requer que um quadro de dados seja armazenado como uma matriz. Podemos converter nossos dados em uma matriz antes de calcular a matriz de correlação com o valor p.
library("Hmisc") data_rcorr <-as.matrix(data[, 1: 9]) mat_2 <-rcorr(data_rcorr) # mat_2 <-rcorr(as.matrix(data)) returns the same output
O objeto de lista mat_2 contém três elementos:
- r: Saída da matriz de correlação
- n: Número de observações
- P: valor p
Estamos interessados no terceiro elemento, o valor p. É comum mostrar a matriz de correlação com o valor p em vez do coeficiente de correlação.
p_value <-round(mat_2[["P"]], 3) p_value
Explicação do código
- mat_2[[“P”]]: Os valores p são armazenados no elemento chamado P
- rodada(mat_2[[“P”]], 3): Arredonde os elementos com três dígitos
Saída:
wfood wfuel wcloth walc wtrans wother age log_income log_totexp wfood NA 0.000 0.000 0.000 0.000 0.000 0.365 0.000 0 wfuel 0.000 NA 0.000 0.000 0.000 0.000 0.076 0.000 0 wcloth 0.000 0.000 NA 0.001 0.000 0.000 0.160 0.000 0 walc 0.000 0.000 0.001 NA 0.000 0.000 0.000 0.105 0 wtrans 0.000 0.000 0.000 0.000 NA 0.000 0.259 0.020 0 wother 0.000 0.000 0.000 0.000 0.000 NA 0.355 0.000 0 age 0.365 0.076 0.160 0.000 0.259 0.355 NA 0.000 0 log_income 0.000 0.000 0.000 0.105 0.020 0.000 0.000 NA 0 log_totexp 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 NA
Visualizando Matriz de Correlação em R
Um mapa de calor é outra maneira de mostrar uma matriz de correlação. A biblioteca GGally é uma extensão do ggplot2. Atualmente, não está disponível na biblioteca conda. Podemos instalar diretamente no console.
install.packages("GGally")
A biblioteca inclui diferentes funções para mostrar as estatísticas resumidas, como a correlação e distribuição de todas as variáveis em um matriz.
A função ggcorr() possui muitos argumentos. Apresentaremos apenas os argumentos que usaremos no tutorial:
A função ggcorr
ggcorr(df, method = c("pairwise", "pearson"), nbreaks = NULL, digits = 2, low = "#3B9AB2", mid = "#EEEEEE", high = "#F21A00", geom = "tile", label = FALSE, label_alpha = FALSE)
Argumentos:
- df: Conjunto de dados usado
- método: Fórmula para calcular a correlação. Por padrão, pairwise e Pearson são calculados
- nbreaks: Retorna um intervalo categórico para a coloração dos coeficientes. Por padrão, não há quebra e o gradiente de cores é contínuo
- dígitos: Arredonde o coeficiente de correlação. Por padrão, defina como 2
- baixo: Controla o nível inferior da coloração
- médio: Controla o nível médio da coloração
- Alto: Controle o alto nível da coloração
- geometria: controla a forma do argumento geométrico. Por padrão, “bloco”
- rótulo: Valor booleano. Exibir ou não o rótulo. Por padrão, defina como `FALSE`
Mapa de calor básico
O gráfico mais básico do pacote é um mapa de calor. A legenda do gráfico mostra um gradiente de cor de –1 a 1, com a cor quente indicando forte correlação positiva e a cor fria, uma correlação negativa.
library(GGally) ggcorr(data)
Explicação do código
- ggcorr(dados): apenas um argumento é necessário, que é o nome do quadro de dados. As variáveis de nível de fator não são incluídas no gráfico.
Saída:
Adicionando controle ao mapa de calor
Podemos adicionar mais controles ao gráfico:
ggcorr(data, nbreaks = 6, low = "steelblue", mid = "white", high = "darkred", geom = "circle")
Explicação do código
- npausas=6: quebre a lenda com 6 classificações.
- baixo = “azul aço”: Use cores mais claras para correlação negativa
- meio = “branco”: Use cores brancas para correlação de intervalos intermediários
- alto = “vermelho escuro”: Use cores escuras para correlação positiva
- geom = “círculo”: use o círculo como o formato das janelas no mapa de calor. O tamanho do círculo é proporcional ao valor absoluto da correlação.
Saída:
Adicionando rótulo ao mapa de calor
GGally nos permite adicionar um rótulo dentro das janelas:
ggcorr(data, nbreaks = 6, label = TRUE, label_size = 3, color = "grey50")
Explicação do código
- rótulo = VERDADEIRO: Adicione os valores dos coeficientes de correlação dentro do mapa de calor.
- cor = “cinza50”: Escolha a cor, ou seja, cinza
- tamanho_da_rótulo = 3: Defina o tamanho da etiqueta como 3
Saída:
A função ggpairs
Finalmente, apresentamos outra função da biblioteca GGaly. Ggpar. Ele produz um gráfico em formato de matriz. Podemos exibir três tipos de cálculo em um gráfico. A matriz é uma dimensão, com igual ao número de observações. A parte superior/inferior exibe janelas e na diagonal. Podemos controlar quais informações queremos mostrar em cada parte da matriz. A fórmula para ggpair é:
ggpair(df, columns = 1: ncol(df), title = NULL, upper = list(continuous = "cor"), lower = list(continuous = "smooth"), mapping = NULL)
Argumentos:
- df: Conjunto de dados usado
- colunas: Selecione as colunas para desenhar o gráfico
- título: Incluir um título
- superior: Controle as caixas acima da diagonal do gráfico. É necessário fornecer o tipo de cálculo ou gráfico a ser retornado. Se contínuo = “cor”, pedimos a R para calcular a correlação. Observe que o argumento precisa ser uma lista. Outros argumentos podem ser usados, consulte a [vinheta](“http://ggobi.github.io/ggally/#custom_functions”) para obter mais informações.
- Abaixe: Controle as caixas abaixo da diagonal.
- Mapeamento: Indica a estética do gráfico. Por exemplo, podemos calcular o gráfico para diferentes grupos.
Análise bivariada com ggpair com agrupamento
O próximo gráfico representa três informações:
- A matriz de correlação entre as variáveis log_totexp, log_income, idade e wtrans agrupadas de acordo com o fato de o domicílio ter filho ou não.
- Trace a distribuição de cada variável por grupo
- Exibir o gráfico de dispersão com a tendência por grupo
library(ggplot2) ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"), title = "Bivariate analysis of revenue expenditure by the British household", upper = list(continuous = wrap("cor", size = 3)), lower = list(continuous = wrap("smooth", alpha = 0.3, size = 0.1)), mapping = aes(color = children_fac))
Explicação do código
- colunas = c(“log_totexp”, “log_income”, “idade”, “wtrans”): Escolha as variáveis a serem mostradas no gráfico
- title = “Análise bivariada das receitas e despesas da família britânica”: Adicione um título
- superior = lista(): controla a parte superior do gráfico. Ou seja, acima da diagonal
- contínuo = wrap(“cor”, tamanho = 3)): Calcule o coeficiente de correlação. Envolvemos o argumento contínuo dentro da função wrap() para controlar a estética do gráfico (ou seja, tamanho = 3) -lower = list(): Controla a parte inferior do gráfico. Ou seja, abaixo da diagonal.
- contínuo = wrap(“suave”,alfa = 0.3,tamanho=0.1): adicione um gráfico de dispersão com uma tendência linear. Envolvemos o argumento contínuo dentro da função wrap() para controlar a estética do gráfico (ou seja, tamanho = 0.1, alfa = 0.3)
- mapeamento = aes(cor = filhos_fac): Queremos que cada parte do gráfico seja empilhada pela variável children_fac, que é uma variável categórica que assume o valor 1 se a família não tiver filhos e 2 caso contrário
Saída:
Análise bivariada com ggpair com agrupamento parcial
O gráfico abaixo é um pouco diferente. Mudamos a posição do mapeamento dentro do argumento superior.
ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"), title = "Bivariate analysis of revenue expenditure by the British household", upper = list(continuous = wrap("cor", size = 3), mapping = aes(color = children_fac)), lower = list( continuous = wrap("smooth", alpha = 0.3, size = 0.1)) )
Explicação do código
- Exatamente o mesmo código do exemplo anterior, exceto por:
- mapeamento = aes(color = children_fac): Mova a lista em upper = list(). Queremos apenas o cálculo empilhado por grupo na parte superior do gráfico.
Saída:
Resumo
- Um relacionamento bivariado descreve um relacionamento -ou correlação- entre duas variáveis em R.
- Existem dois métodos principais para calcular a correlação entre duas variáveis em Programação R: Pearson e Spearman.
- O método de correlação de Pearson é geralmente usado como verificação primária da relação entre duas variáveis.
- Uma correlação de classificação classifica as observações por classificação e calcula o nível de similaridade entre as classificações.
- A correlação de classificação de Spearman, está sempre entre -1 e 1, com um valor próximo à extremidade indica forte relacionamento.
- Uma matriz de correlação é uma matriz que representa a correlação de pares de todas as variáveis.
- O nível de significância é útil em algumas situações quando utilizamos o método Pearson ou Spearman.
Podemos resumir todas as funções de correlação em R na tabela abaixo:
Biblioteca | Objetivo | Forma | Code |
---|---|---|---|
Base | correlação bivariada | Pearson |
cor(dfx2, method = "pearson") |
Base | correlação bivariada | Lanceiro |
cor(dfx2, method = "spearman") |
Base | Correlação multivariada | Pearson |
cor(df, method = "pearson") |
Base | Correlação multivariada | Lanceiro |
cor(df, method = "spearman") |
Hmisc | Valor de p |
rcorr(as.matrix(data[,1:9]))[["P"]] |
|
Ggally | mapa de calor |
ggcorr(df) |
|
Gráficos multivariados |
cf code below |