Korelacja w R: Pearson & Włócznik z Przykładem Matrix

Relacja dwuwymiarowa opisuje relację - lub korelację - między dwiema zmiennymi, a. W tym samouczku omówimy pojęcie korelacji i pokażemy, jak można go użyć do pomiaru związku między dowolnymi dwiema zmiennymi.

Istnieją dwie podstawowe metody obliczania korelacji między dwiema zmiennymi.

  • Pearson: Korelacja parametryczna
  • Spearman: Korelacja nieparametryczna

W tym samouczku dowiesz się

  • Korelacja Pearsona
  • Korelacja rang Spearmana
  • Macierz korelacji
  • Wizualizuj macierz korelacji

Korelacja Pearsona

Metoda korelacji Pearsona jest zwykle używana jako podstawowa metoda sprawdzania związku między dwiema zmiennymi.

Współczynnik korelacji , jest miarą siły liniowej zależności pomiędzy dwoma zmiennymi i. Jest obliczany w następujący sposób:

z

  • , tj. odchylenie standardowe
  • , tj. odchylenie standardowe

Korelacja waha się od -1 do 1.

  • Wartość bliska lub równa 0 oznacza niewielką lub żadną liniową zależność między a.
  • Natomiast im bliżej 1 lub -1, tym silniejsza zależność liniowa.

Możemy obliczyć test t w następujący sposób i sprawdzić tabelę dystrybucji o stopniu swobody równym:

Korelacja rang Spearmana

Korelacja rang sortuje obserwacje według rangi i oblicza poziom podobieństwa między rangą. Korelacja rang ma tę zaletę, że jest odporna na wartości odstające i nie jest powiązana z rozkładem danych. Zauważ, że korelacja rang jest odpowiednia dla zmiennej porządkowej.

Korelacja rang Spearmana wynosi zawsze od -1 do 1, a wartość bliska skrajności wskazuje na silny związek. Jest obliczany w następujący sposób:

z podaniem kowariancji między rangą a. Mianownik oblicza odchylenia standardowe.

W R możemy użyć funkcji cor (). Wymaga trzech argumentów i metody.

cor(x, y, method)

Argumenty :

  • x: pierwszy wektor
  • y: drugi wektor
  • metoda: wzór używany do obliczenia korelacji. Trzy wartości łańcuchowe:
    • "osoba"
    • „kendall”
    • "włócznik"

Opcjonalny argument można dodać, jeśli wektory zawierają brakującą wartość: use = "complete.obs"

Użyjemy zbioru danych BudgetUK. Ten zbiór danych przedstawia alokację budżetu brytyjskich gospodarstw domowych w latach 1980–1982. Istnieje 1519 obserwacji z dziesięcioma cechami, między innymi:

  • wfood: dziel się wydatkami na żywność
  • wfuel: podziel się wydatkami na paliwo
  • wcloth: udział w budżecie na wydatki na odzież
  • walc: dziel się wydatkami na alkohol
  • wtrans: dziel się wydatkami na transport
  • wother: udział w wydatkach na inne dobra
  • totexp: całkowite wydatki gospodarstwa domowego w funtach
  • dochód całkowity dochód netto gospodarstwa domowego
  • wiek: wiek gospodarstwa domowego
  • dzieci: liczba dzieci
Przykład
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)

Objaśnienie kodu

  • Najpierw importujemy dane i oglądamy za pomocą funkcji glimpse () z biblioteki dplyr.
  • Trzy punkty to powyżej 500K, więc zdecydowaliśmy się je wykluczyć.
  • Powszechną praktyką jest przekształcanie zmiennej pieniężnej w log. Pomaga zmniejszyć wpływ wartości odstających i zmniejsza skośność w zbiorze danych.

Wynik:

## Observations: 1,516## Variables: 10## $ wfood  0.4272, 0.3739, 0.1941, 0.4438, 0.3331, 0.3752, 0… ## $ wfuel  0.1342, 0.1686, 0.4056, 0.1258, 0.0824, 0.0481, 0… ## $ wcloth  0.0000, 0.0091, 0.0012, 0.0539, 0.0399, 0.1170, 0… ## $ walc  0.0106, 0.0825, 0.0513, 0.0397, 0.1571, 0.0210, 0… ## $ wtrans  0.1458, 0.1215, 0.2063, 0.0652, 0.2403, 0.0955, 0… ## $ wother  0.2822, 0.2444, 0.1415, 0.2716, 0.1473, 0.3431, 0… ## $ age  25, 39, 47, 33, 31, 24, 46, 25, 30, 41, 48, 24, 2… ## $ log_income  4.867534, 5.010635, 5.438079, 4.605170, 4.605170,… ## $ log_totexp  3.912023, 4.499810, 5.192957, 4.382027, 4.499810,… ## $ children_fac  Yes, Yes, Yes, Yes, No, No, No, No, No, No, Yes,… 

Możemy obliczyć współczynnik korelacji między zmiennymi dochodu a zmiennymi żywności za pomocą metody „Pearsona” i „Spearmana”.

cor(data$log_income, data$wfood, method = "pearson")

wynik:

## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")

Wynik:

## [1] -0.2501252 

Macierz korelacji

Korelacja dwuwymiarowa to dobry początek, ale możemy uzyskać szerszy obraz dzięki analizie wieloczynnikowej. W macierzy korelacji przedstawiono korelację z wieloma zmiennymi . Macierz korelacji to macierz reprezentująca korelację par wszystkich zmiennych.

Funkcja cor () zwraca macierz korelacji. Jedyna różnica w korelacji dwuwymiarowej polega na tym, że nie musimy określać, które zmienne. Domyślnie R oblicza korelację między wszystkimi zmiennymi.

Należy zauważyć, że nie można obliczyć korelacji dla zmiennej czynnikowej. Musimy się upewnić, że porzucimy cechę kategorialną, zanim przekażemy ramkę danych wewnątrz cor ().

Macierz korelacji jest symetryczna, co oznacza, że ​​wartości powyżej przekątnej mają takie same wartości jak poniżej. Bardziej wizualnie jest pokazać połowę matrycy.

Wykluczamy children_fac, ponieważ jest to zmienna na poziomie czynnika. cor nie dokonuje korelacji na zmiennej kategorialnej.

# the last column of data is a factor level. We don't include it in the codemat_1 <-as.dist(round(cor(data[,1:9]),2))mat_1

Objaśnienie kodu

  • cor (dane): wyświetl macierz korelacji
  • round (data, 2): Zaokrąglij macierz korelacji do dwóch miejsc po przecinku
  • as.dist (): Pokazuje tylko drugą połowę

Wynik:

## 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

Poziom istotności

Poziom istotności jest przydatny w niektórych sytuacjach, gdy używamy metody Pearsona lub Spearmana. Funkcja rcorr () z biblioteki Hmisc oblicza dla nas wartość p. Możemy pobrać bibliotekę z conda i skopiować kod, aby wkleić go w terminalu:

conda install -c r r-hmisc 

Funkcja rcorr () wymaga, aby ramka danych była przechowywana jako macierz. Możemy przekształcić nasze dane w macierz przed obliczeniem macierzy korelacji z wartością 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

Obiekt listy mat_2 zawiera trzy elementy:

  • r: dane wyjściowe macierzy korelacji
  • n: liczba obserwacji
  • P: wartość p

Interesuje nas trzeci element, wartość p. Często pokazuje się macierz korelacji z wartością p zamiast współczynnika korelacji.

p_value <-round(mat_2[["P"]], 3)p_value

Objaśnienie kodu

  • mat_2 [["P"]]: Wartości p są przechowywane w elemencie o nazwie P
  • round (mat_2 [["P"]], 3): Zaokrąglij elementy trzema cyframi

Wynik:

wfood wfuel wcloth walc wtrans wother age log_income log_totexpwfood NA 0.000 0.000 0.000 0.000 0.000 0.365 0.000 0wfuel 0.000 NA 0.000 0.000 0.000 0.000 0.076 0.000 0wcloth 0.000 0.000 NA 0.001 0.000 0.000 0.160 0.000 0walc 0.000 0.000 0.001 NA 0.000 0.000 0.000 0.105 0wtrans 0.000 0.000 0.000 0.000 NA 0.000 0.259 0.020 0wother 0.000 0.000 0.000 0.000 0.000 NA 0.355 0.000 0age 0.365 0.076 0.160 0.000 0.259 0.355 NA 0.000 0log_income 0.000 0.000 0.000 0.105 0.020 0.000 0.000 NA 0log_totexp 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 NA

Wizualizuj macierz korelacji

Mapa cieplna to kolejny sposób pokazania macierzy korelacji. Biblioteka GGally jest rozszerzeniem ggplot2. Obecnie nie jest dostępny w bibliotece Conda. Możemy zainstalować bezpośrednio w konsoli.

install.packages("GGally")

Biblioteka zawiera różne funkcje pokazujące statystyki podsumowujące, takie jak korelacja i dystrybucja wszystkich zmiennych w macierzy.

Funkcja ggcorr () ma wiele argumentów. Przedstawimy tylko argumenty, których użyjemy w tutorialu:

Funkcja ggcorr

ggcorr(df, method = c("pairwise", "pearson"),nbreaks = NULL, digits = 2, low = "#3B9AB2",mid = "#EEEEEE", high = "#F21A00",geom = "tile", label = FALSE,label_alpha = FALSE)

Argumenty:

  • df : używany zestaw danych
  • metoda : wzór do obliczenia korelacji. Domyślnie obliczane są parami i Pearson
  • nbreaks : Zwraca kategoryczny zakres dla zabarwienia współczynników. Domyślnie nie ma przerwy, a gradient kolorów jest ciągły
  • cyfry : Zaokrąglij współczynnik korelacji. Domyślnie ustawiona na 2
  • low : kontroluje dolny poziom ubarwienia
  • mid : Kontroluj środkowy poziom ubarwienia
  • high : Kontroluj wysoki poziom ubarwienia
  • geom : kontroluj kształt argumentu geometrycznego. Domyślnie „kafelek”
  • etykieta : wartość logiczna. Wyświetlaj etykietę lub nie. Domyślnie ustawiono na „FALSE”

Podstawowa mapa ciepła

Najbardziej podstawową działką pakietu jest mapa cieplna. Legenda do wykresu przedstawia kolor gradientu od - 1 do 1, przy czym kolor gorący wskazuje na silną korelację dodatnią, a kolor zimny - korelację ujemną.

library(GGally)ggcorr(data)

Objaśnienie kodu

  • ggcorr (dane): potrzebny jest tylko jeden argument, którym jest nazwa ramki danych. Na wykresie nie uwzględniono zmiennych poziomu czynników.

Wynik:

Dodaj kontrolę do mapy cieplnej

Możemy dodać więcej kontrolek do wykresu.

ggcorr(data,nbreaks = 6,low = "steelblue",mid = "white",high = "darkred",geom = "circle")

Objaśnienie kodu

  • nbreaks = 6: przełam legendę z 6 stopniami.
  • low = "steelblue": Użyj jaśniejszych kolorów dla ujemnej korelacji
  • mid = "white": Użyj białych kolorów do korelacji średnich zakresów
  • high = "darkred": Użyj ciemnych kolorów dla dodatniej korelacji
  • geom = "circle": Użyj okręgu jako kształtu okien na mapie cieplnej. Wielkość koła jest proporcjonalna do bezwzględnej wartości korelacji.

Wynik:

Dodaj etykietę do mapy cieplnej

GGally pozwala nam dodać etykietę do okien.

ggcorr(data,nbreaks = 6,label = TRUE,label_size = 3,color = "grey50")

Objaśnienie kodu

  • label = TRUE: Dodaj wartości współczynników korelacji wewnątrz mapy cieplnej.
  • color = "grey50": Wybierz kolor, np. szary
  • label_size = 3: Ustaw rozmiar etykiety na 3

Wynik:

ggpairs

Na koniec przedstawiamy kolejną funkcję z biblioteki GGaly. Ggpair. Tworzy wykres w formacie macierzy. W ramach jednego wykresu możemy wyświetlić trzy rodzaje obliczeń. Macierz jest wymiarem, w którym jest równa liczbie obserwacji. W górnej / dolnej części wyświetlane są okna i po przekątnej. Możemy kontrolować, jakie informacje chcemy pokazać w każdej części macierzy. Wzór na ggpair to:

ggpair(df, columns = 1: ncol(df), title = NULL,upper = list(continuous = "cor"),lower = list(continuous = "smooth"),mapping = NULL)

Argumenty :

  • df : używany zestaw danych
  • kolumny : wybierz kolumny, aby narysować wykres
  • tytuł : dołącz tytuł
  • górny : Kontroluj pola powyżej przekątnej wykresu. Należy podać typ obliczeń lub wykres do zwrócenia. Jeśli ciągły = "cor", prosimy R o obliczenie korelacji. Zauważ, że argument musi być listą. Można użyć innych argumentów, zobacz [winietę] („http://ggobi.github.io/ggally/#custom_functions”), aby uzyskać więcej informacji.
  • Niższy : kontroluj pola poniżej przekątnej.
  • Mapowanie : Wskazuje estetykę wykresu. Na przykład możemy obliczyć wykres dla różnych grup.

Analiza dwuwymiarowa za pomocą ggpair z grupowaniem

Następny wykres przedstawia trzy informacje:

  • Macierz korelacji między log_totexp, log_income, wiekiem i zmienną wtrans pogrupowaną według tego, czy gospodarstwo domowe ma dziecko, czy nie.
  • Wykreśl rozkład każdej zmiennej według grup
  • Wyświetl wykres punktowy z trendem według grup
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))

Objaśnienie kodu

  • kolumny = c ("log_totexp", "log_income", "wiek", "wtrans"): Wybierz zmienne do pokazania na wykresie
  • tytuł = "Analiza dwuwymiarowa wydatków na dochody brytyjskiego gospodarstwa domowego": Dodaj tytuł
  • upper = list (): kontroluje górną część wykresu. Tj. Powyżej przekątnej
  • Continuous = wrap ("cor", size = 3)): Oblicz współczynnik korelacji. Argument ciągły zawijamy wewnątrz funkcji wrap (), aby kontrolować estetykę wykresu (tj. Size = 3) -lower = list (): Kontroluj dolną część wykresu. Tj. Poniżej przekątnej.
  • ciągły = zawijanie ("gładki", alfa = 0,3, rozmiar = 0,1): Dodaj wykres punktowy z trendem liniowym. Argument ciągły zawijamy wewnątrz funkcji wrap (), aby kontrolować estetykę wykresu (tj. Rozmiar = 0,1, alfa = 0,3)
  • mapping = aes (color = children_fac): Chcemy, aby każda część wykresu była ułożona w stos przez zmienną children_fac, która jest zmienną kategorialną przyjmującą wartość 1, jeśli gospodarstwo domowe nie ma dzieci i 2 w innym przypadku

Wynik:

Analiza dwuwymiarowa z ggpair z częściowym grupowaniem

Poniższy wykres jest nieco inny. Zmieniamy położenie mapowania wewnątrz górnego argumentu.

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)))

Objaśnienie kodu

  • Dokładnie taki sam kod jak w poprzednim przykładzie, z wyjątkiem:
  • mapping = aes (color = children_fac): Przenieś listę w upper = list (). Chcemy tylko, aby obliczenia były ułożone według grup w górnej części wykresu.

Wynik:

Podsumowanie

Funkcję możemy podsumować w poniższej tabeli:

biblioteka

Cel

metoda

kod

Baza

korelacja dwuwymiarowa

osoba

cor(dfx2, method = "pearson")

Baza

korelacja dwuwymiarowa

Włócznik

cor(dfx2, method = "spearman")

Baza

Korelacja wieloczynnikowa

osoba

cor(df, method = "pearson")

Baza

Korelacja wieloczynnikowa

Włócznik

cor(df, method = "spearman")

Hmisc

Wartość P.

rcorr(as.matrix(data[,1:9]))[["P"]]

Ggally

Mapa ciepła

ggcorr(df)

Wykresy wielowymiarowe

cf code below

Interesujące artykuły...