---
title: "Ćwiczenie 4: Analiza korelacji"
subtitle: "Statystyczne i graficzne podstawy geowizualizacji"
author: Anna Dmowska
format: html
editor: visual
---

```{r}
#| message: false
#| warning: false
library(tidyverse)
library(readxl)
```

## Demonstracja dla współczynnika korelacji liniowej

```{r}
#| warnings: false
#| message: false
#| eval: FALSE
install.packages("TeachingDemos")
library("TeachingDemos")
put.points.demo(x = NULL, y = NULL, lsline = TRUE)

#Używając opcji Add Point dodaj punkty w oknie wykresu
#Zwróć uwagę jak zmienia się wartość współczynnika korelacji (r). 
```

Zgadnij wartość współczynnika korelacji - <https://gallery.shinyapps.io/correlation_game/>

## Testy korelacji

-   test korelacji liniowej Pearsona

    -   stosowany gdy zmienne mają zależnośc liniową
    -   zmienne mają rozkład normalny

-   test korelacji rang Spearman

    -   stosowany gdy naruszone jest założenie o normalności rozkładu (np. gdy istnieją wartości odstające)

## Korelacja liniowa

```{r}
set.seed(25)
x = rnorm(1000)
y = x + rnorm(1000)
df = data.frame(x, y)
```

Funkcja `plot()` pozwala na wykonanie prostego wykresu rozrzutu.

```{r}
#| warnings: false
#| message: false

plot(y~x, df)
```

### Zbadanie normalności rozkładu

Funkcja `hist()` pozwala na wykonie histogramów.

```{r}
hist(df$x)
```

```{r}
hist(df$y)
```

Funkcja `shapiro.test()` służy do wykonania testu Shapiro-Wilka sprawdzającego czy dane mają rozkład normalny. Wartość p-value \> 0.05 wskazuje, że dane pochodzą z rozkładu normalnego.

```{r}
shapiro.test(x)
```

```{r}
shapiro.test(y)
```

Zmienna x oraz y mają rozkład normalny.

### Współczynnik korelacji

Współczynnik korelacji obliczany jest z wykorzystaniem funkcji `cor()`. Argument *method* pozwala na określenie czy ma być obliczony współczynnik korelacji Pearsona (*method = "pearson"*), czy też współczynnik korelacji rang Spearmana (*method = "Spearman"*). Argument *use = "complete.obs* oznacza, że do obliczenia korelacji zostaną wybrane tylko te obserwacje, dla których jest podana wartość x oraz y.

```{r}
cor(df$x, df$y,
    use = "complete.obs",
    method = "pearson")
```

```{r}
cor(df$x, df$y,
    use = "complete.obs",
    method = "spearman")
```

> Która metoda korelacji powinna zostać użyta - korelacja liniowa Pearsona, czy korelacja rang Spearmana? Dlaczego?

### Testy korelacji

Funkcja `cor.test()` wykonuje test korelacji. W wyniku testu:

-   p-value określa poziom istotności, jeśli p-value \< 0.05 współczynnik korelacji jest istotny statystycznie
-   conf.int to 95% przedział ufności, w którym mieści się prawdziwa wartość współczynnika korelacji
-   sample estimates is to wartość współczynnika korelacji

```{r}
cor.test(df$x, df$y,
    use = "complete.obs",
    method = "pearson")
```

Wynik testu korelacji wskazuje na istnieie istotnej korelacji między zmienną x oraz y.

## Przykład. Analiza danych meteorologicznych.

Plik *dane/meteo2020.xlsx* zawiera miesięczne wartości dla 59 stacji synoptycznych dla 2020 roku:

-   id - id stacji
-   station - nazwa stacji
-   X, Y - współrzędne X, Y określające lokalizację stacji
-   wojewodztwo - nazwa województwa, w którym się stacja znajduje.
-   woj_id - TERYT województwa
-   mm - miesiąc
-   tmax_abs - miesięczna wartość temperatury maksymalnej \[C\]
-   tmax_mean - średnia miesięczna wartość temperatury maksymalnej \[C\]
-   tmin_abs - miesięczna wartość temperatury minimalnej \[C\]
-   tmin_mean - średnia miesięczna wartość temperatury minimalnej \[C\]
-   t2m_mean_mon - średnia temperatura miesieczna \[C\]
-   t5cm_min - minimalna temperatura przy gruncie \[C\]
-   rr_monthly - miesieczna suma opadow \[mm\]
-   rr_max_daily - maksymalna dobowa suma opadow \[mm\]
-   rain_days - liczba dni z opadem deszczu
-   snow_days - liczba dni z opadem śniegu

```{r}
library(readxl)
meteo = read_excel("dane/meteo2020.xlsx")
```

### Analiza korelacji między zmiennymi tmin_mean a tmax_mean

-   Wykres rozrzutu

```{r}
plot(meteo$tmin_mean, meteo$tmax_mean)
```

-   Czy zmienne mają rozkład normalny?

```{r}
shapiro.test(meteo$tmax_mean)
```

```{r}
shapiro.test(meteo$tmin_mean)
```

-   wspolczynnik korelacji

```{r}
cor(meteo$tmax_mean, meteo$tmin_mean,
    use = "complete.obs",
    method = "spearman")
```

-   test korelacji

```{r}
cor.test(meteo$tmax_mean, meteo$tmin_mean,
    use = "complete.obs",
    method = "spearman")
```

## Analiza korelacji dla wielu zmiennych

```{r}
sel = meteo %>% 
  select(tmax_mean,tmin_mean, t5cm_min, t2m_mean_mon)
```

-   Macierz wykresów rozrzutu

```{r}
pairs(~., data=sel, main="Macierz wykresów rozrzutu")
```

Macierz wykresów rozrzutu można także wykonać wykorzystując funkcję `chart.Correlation()` z pakietu **PerformanceAnalytics**

```{r}
#| warnings: false
#| message: false
library("PerformanceAnalytics")
chart.Correlation(sel, histogram=TRUE, pch=19, method = "spearman" )
```

-   Obliczenie macierzy współczynników korelacji dla wielu zmiennych.

```{r}
cor(sel, use = "complete.obs", method = "spearman")
```

Macierz korelacji wraz z informacją o poziomie istotności można uzyskać wykorzystując funckę `rcorr()` z pakietu `Hmisc`. Pierwsza macierz zawiera współczynnik korelacji, druga liczbę obiektów a trzecia wartość poziomu istotności p. Wartość jest istotna statystycznie jeśli p jest mniejsze od założonego poziomu isotntości (np. 0.05). Wartość 0 oznacza, że p \< 0.0001.

```{r}
#| message: false
#| warning: false
library(Hmisc)
kor <- rcorr(as.matrix(sel), type = "spearman")
print( kor, digits=3)
```

## Wizualizacja korelacji między zmiennymi z wykorzystaniem pakietu `corrplot`

Funkcja `corrplot()` z pakietu **corrplot** pozwala na wizualizację macierzy korelacji. Podstawowym parametrem jest macierz korelacji, którą można obliczyć wykorzystując funkcję `cor()` lub `rcorr()` z pakietu Hmisc.

-   Więcej: <https://cran.r-project.org/web/packages/corrplot/vignettes/corrplot-intro.html>

```{r}
library("corrplot")
korelacja = cor(sel)
corrplot(korelacja)
```

```{r}
library("corrplot")
library(Hmisc)
kor <- rcorr(as.matrix(sel), type = "spearman")
corrplot(kor$r)
```

```{r}
library("corrplot")
library(Hmisc)
kor <- rcorr(as.matrix(sel), type = "spearman")
corrplot(kor$r, method = "number")
```

```{r}
corrplot(kor$r, method = 'color', order = 'alphabet')
```

```{r}
corrplot(kor$r, method = 'color', order = 'hclust')
```

```{r}
corrplot(kor$r, type = "upper", order = "hclust", 
         tl.col = "black", tl.srt = 45)
```

```{r}
corrplot.mixed(kor$r, order="hclust", tl.col="black")
```

```{r}
corrplot.mixed(kor$r, lower = 'shade', upper = 'pie', order = 'hclust')
```

```{r}
library(RColorBrewer)
corrplot(kor$r, type="upper", order="hclust", col=brewer.pal(n=8, name="RdYlBu"), tl.col="black")
```

## Wizualizacja macierzy wykresów rozrzutu

-   Funckja `scatterplotMatrix()` z pakietu `car`

```{r}
#| warnings: false
#| message: false
library(car)
scatterplotMatrix(~tmax_mean+tmin_mean+t2m_mean_mon+t5cm_min, data=sel)
```

-   Funkcja `chart.Correlation()` z pakietu `PerformanceAnalytics`

```{r}
#| warnings: false
#| message: false
library(PerformanceAnalytics)
chart.Correlation(sel, histogram=TRUE, pch=19, method = "spearman")
```

-   Funkcja `pairs.panels()` z pakietu `psych`

```{r}
#| warnings: false
#| message: false
library(psych)
pairs.panels(sel, scale=TRUE, method="spearman")
```
