Kolokwium

Teoria

Biblioteki

library(tidyverse) # W tym zawiera się ggplot2
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(moments)


Wartość oczekiwana

  • Średnia ważona wszystkich możliwych wyników zmiennej losowej - “przeciętna wartość”
  • Jak używać: wartość zmiennej losowej * prawdopodobieństwo otrzymania tej zmiennej

Wariancja

  • Miara rozproszenia danych wokół wartości oczekiwanej
  • Jak używać: 1/n (zmienna średnia)^2

Odchylenie Standardowe

  • Miara rozproszenia danych wokół wartości oczekiwanej ale w tej samej jednostce co wartość oczekiwana
  • Jak używać: pierwiastek z wariancji

Kurtoza

  • “Ostrość” szczytu rozkładu, >3 ostra, <3 płaska (w wersji znormalizowanej w R zamiast 3 jest 0)
  • Jak używać: czwarty moment centralny/(odchylenie standardowe)^4

Momenty centralne

  • Pierwszy - Średnia (wskazuje na centralną wartość)
  • Drugi - Wariancja
  • Trzeci - Skośność (>0 skośny prawostronnie-czyli amplituda jest z lewej strony, <0 skośny lewostronnie)



Praktyka


Przygotowywanie danych

Wybieranie kolumn z setu danych | zastosowanie do wszystkiego wielkości statystycznych

dt <- mtcars %>%
  select(-vs, -am) %>%
  drop_na() %>%
  summarise(across(everything(), list(kurtosis=kurtosis, skewness=skewness, mean=mean, sd=sd, var=var))) %>%
  pivot_longer(cols=everything(),
               names_to=c(".value", "statistic"),
               names_sep="_")


Przygotowanie Data frame | Listy | Wskaźnikowanie

# Data Frame - dąży do tego, aby wewnątrz były takie same typy danych
      df <- data.frame(
        Name = c("Anna", "Jan", "Zofia"),
        Age = c(25, 30, 22),
        Score = c(88, 92, 95)
      )
      
      # Lista - zawiera wiele tabel, lub tabele w ktorych nie trzeba mieć równych wektorow lub macierzy, można w niej trzymać różne typy danych
      list_example <- list(
        data = df,
        vector = c(1, 2, 3),
        single_value = 42
      )
      
      # Wskaźnikowanie
      df[1, 2]       # Wartość w 1. wierszu, 2. kolumnie
[1] 25
      df$Name        # Kolumna "Name"
[1] "Anna"  "Jan"   "Zofia"
      list_example$data  # Odwołanie do elementu listy
   Name Age Score
1  Anna  25    88
2   Jan  30    92
3 Zofia  22    95


Sortowanie

  • Wektor

    # Tworzenie wektora
    wektor <- c(4, 2, 8, 1, 5)
    
    # Sortowanie rosnąco
    wektor_posortowany <- sort(wektor)
    
    # Sortowanie malejąco
    wektor_posortowany_malejaco <- sort(wektor, decreasing = TRUE)
    
    # Wyświetlanie wyników
    print(wektor_posortowany)           # [1, 2, 4, 5, 8]
    [1] 1 2 4 5 8
    print(wektor_posortowany_malejaco)  # [8, 5, 4, 2, 1]
    [1] 8 5 4 2 1


  • DataFrame

    # Tworzymy dataframe
    df <- data.frame(
      Imie = c("Anna", "Piotr", "Kasia"),
      Wiek = c(25, 30, 22)
    )
    
    # Sortowanie dataframe po kolumnie "Wiek" rosnąco
    df_posortowany <- df[order(df$Wiek), ]
    
    # Wyświetlanie wyników
    print(df_posortowany)
       Imie Wiek
    3 Kasia   22
    1  Anna   25
    2 Piotr   30



Analiza danych

PCA

      # Załadowanie zestawu danych Iris
      data(iris)
      
      # Usuwanie kolumny Species
      iris_data <- iris[, 1:4]

      # Normalizacja danych (standaryzacja) - średnia = 0, odchylenie standardowe = 1
      iris_data_scaled <- scale(iris_data)
      
      # Wykonanie analizy PCA
      pca_result <- prcomp(iris_data_scaled, center = TRUE, scale. = TRUE)
      
      # Wyświetlanie wyników analizy PCA
      summary(pca_result)
Importance of components:
                          PC1    PC2     PC3     PC4
Standard deviation     1.7084 0.9560 0.38309 0.14393
Proportion of Variance 0.7296 0.2285 0.03669 0.00518
Cumulative Proportion  0.7296 0.9581 0.99482 1.00000

Jak widać PC1 jest odpowiedzialne za największą część rozproszenia danych (odchylenie standardowe wyszło 1.71 or whatever)

92.46% całkowitej wariancji jest wyjaśnione przez pierwszą składową PC1

Cumulative Proportion - Pokazuje, jaka część całkowitej wariancji jest wyjaśniona przez wszystkie składowe do danej włącznie.
Jest to suma wartości w kolumnie Proportion of Variance od pierwszej do bieżącej składowej.
PC1 + PC2: Kumulowana proporcja wynosi 0.9779, co oznacza, że pierwsze dwie składowe razem wyjaśniają 97.79% wariancji w danych.
PC3 + PC4: Kumulowana proporcja wynosi 1.0000, co oznacza, że wszystkie cztery składowe razem wyjaśniają całą wariancję w danych.


Korelacja

# Tworzenie danych
wiek <- c(22, 25, 30, 35, 40)
wysokosc <- c(160, 165, 170, 175, 180)

# Obliczanie współczynnika korelacji Pearsona
korelacja <- cor(wiek, wysokosc)

# Wyświetlanie wyniku korelacji
print(korelacja)
[1] 0.9962406

Rodzaje korelacji:

  1. Korelacja dodatnia – gdy wzrost jednej zmiennej prowadzi do wzrostu drugiej.

  2. Korelacja ujemna – gdy wzrost jednej zmiennej prowadzi do spadku drugiej.

  3. Brak korelacji – brak zależności między zmiennymi.

  4. Korelacja równa 1 – pełna zależność liniowa dodatnia.

  5. Korelacja równa -1 – pełna zależność liniowa ujemna.


Macierz korelacji

# Tworzenie zbioru danych
dane <- data.frame(
  wiek = c(22, 25, 30, 35, 40),
  wysokosc = c(160, 165, 170, 175, 180),
  waga = c(55, 60, 65, 70, 75)
)

# Obliczanie macierzy korelacji
macierz_korelacji <- cor(dane)

# Wyświetlanie macierzy korelacji
print(macierz_korelacji)
              wiek  wysokosc      waga
wiek     1.0000000 0.9962406 0.9962406
wysokosc 0.9962406 1.0000000 1.0000000
waga     0.9962406 1.0000000 1.0000000


Rysowanie macierzy korelacji

# Instalowanie i ładowanie pakietu corrplot
library(corrplot)
Warning: package 'corrplot' was built under R version 4.3.3
corrplot 0.95 loaded
# Rysowanie macierzy korelacji
corrplot(macierz_korelacji, method = "circle")


Wykres Liniowy

# Wykres liniowy
ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length)) +
  geom_line(color = "blue") +
  labs(title = "Wykres liniowy długości i szerokości płatka",
       x = "Szerokość płatka (Sepal.Width)", y = "Długość płatka (Sepal.Length)")


Histogram

# Histogram dla długości płatka (Sepal.Length)
ggplot(iris, aes(x = Sepal.Length)) +
  geom_histogram(binwidth = 0.2, fill = "lightgreen", color = "darkgreen") +
  labs(title = "Histogram długości płatka (Sepal.Length)", 
       x = "Długość płatka (Sepal.Length)", y = "Częstotliwość")


Scatterplot

# Scatterplot dla długości płatka i szerokości płatka
ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, color = Species)) +
  geom_point() +
  labs(title = "Scatterplot długości i szerokości płatka",
       x = "Szerokość płatka (Sepal.Width)", y = "Długość płatka (Sepal.Length)") +
  theme_minimal()

# Scatterplot z kolorami i kształtami punktów
ggplot(iris, aes(x = Sepal.Width, y = Sepal.Length, color = Species, shape = Species)) +
  geom_point(size = 4) +  # Ustawiamy wielkość punktów
  labs(title = "Scatterplot z kolorem i kształtem",
       x = "Szerokość płatka (Sepal.Width)", y = "Długość płatka (Sepal.Length)") +
  theme_minimal()

ANOVA (Analiza Wariancji)

ANOVA to metoda statystyczna służąca do porównywania średnich trzech lub więcej grup, aby sprawdzić, czy istnieją między nimi istotne różnice.

1. Podstawowe założenia ANOVA

Hipotezy: - H₀: Średnie wszystkich grup są równe (brak różnic). - H₁: Przynajmniej jedna średnia różni się od pozostałych.

Założenia: - Normalność: Dane w grupach mają rozkład normalny (sprawdzane np. testem Shapiro-Wilka). - Jednorodność wariancji: Wariancje w grupach są podobne (sprawdzane np. testem Levene’a). - Niezależność obserwacji: Dane z różnych grup są od siebie niezależne.

2. Rodzaje ANOVA

  • Jednoczynnikowa ANOVA: Analizuje wpływ jednej zmiennej niezależnej (np. rodzaj nawozu) na zmienną zależną (np. wzrost roślin).

Przykład: Porównanie wzrostu roślin przy użyciu trzech nawozów (A, B, C).

3. Statystyka F

  • Wariancja międzygrupowa (MSbetween): Mierzy różnice między średnimi grup.
  • Wariancja wewnątrzgrupowa (MSwithin): Mierzy zmienność wewnątrz grup.
  • Statystyka F = MSbetween / MSwithin.

Im wyższe F, tym większe prawdopodobieństwo, że różnice między grupami są istotne.

4. Kroki w R

a. Tworzenie danych

library(tidyverse)

dane <- tibble(
  nawóz = factor(rep(c("A", "B", "C"), each = 10)),
  wzrost = c(20, 21, 19, 22, 20, 23, 21, 20, 22, 19,
             25, 26, 24, 27, 25, 28, 26, 25, 27, 24,
             15, 16, 14, 17, 15, 18, 16, 15, 17, 14)
)

summary(dane)
 nawóz      wzrost     
 A:10   Min.   :14.00  
 B:10   1st Qu.:17.00  
 C:10   Median :20.50  
        Mean   :20.70  
        3rd Qu.:24.75  
        Max.   :28.00  

b. Sprawdzenie założeń

# Test normalności reszt (H₀: dane są normalne)
shapiro.test(resid(aov(wzrost ~ nawóz, data = dane))) 

    Shapiro-Wilk normality test

data:  resid(aov(wzrost ~ nawóz, data = dane))
W = 0.90179, p-value = 0.009291
# Test Levene’a na jednorodność wariancji (H₀: wariancje są równe)
library(car)
Warning: package 'car' was built under R version 4.3.3
Loading required package: carData

Attaching package: 'car'
The following object is masked from 'package:dplyr':

    recode
The following object is masked from 'package:purrr':

    some
leveneTest(wzrost ~ nawóz, data = dane)
Levene's Test for Homogeneity of Variance (center = median)
      Df F value Pr(>F)
group  2       0      1
      27               

c. Przeprowadzenie ANOVA

# Tworzenie modelu
model <- aov(wzrost ~ nawóz, data = dane)

# Podsumowanie wyników
summary(model)
            Df Sum Sq Mean Sq F value   Pr(>F)    
nawóz        2  500.0  250.00   139.8 5.71e-15 ***
Residuals   27   48.3    1.79                     
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Wynik: Jeśli p < 0.05, odrzucamy H₀ i przyjmujemy, że istnieją istotne różnice między grupami.

d. Testy post-hoc (np. Tukey HSD)

Jeśli ANOVA jest istotna, sprawdzamy, które grupy się różnią:

TukeyHSD(model)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = wzrost ~ nawóz, data = dane)

$nawóz
    diff        lwr       upr p adj
B-A    5   3.516948  6.483052     0
C-A   -5  -6.483052 -3.516948     0
C-B  -10 -11.483052 -8.516948     0

e. Wizualizacja wyników

# Wizualizacja wyników testu Tukeya
plot(TukeyHSD(model))

5. Jeśli założenia nie są spełnione

Alternatywy: - Transformacja danych (np. logarytmiczna). - Test nieparametryczny: Kruskala-Wallisa (odpowiednik ANOVA dla danych nieparametrycznych).

kruskal.test(wzrost ~ nawóz, data = dane)

    Kruskal-Wallis rank sum test

data:  wzrost by nawóz
Kruskal-Wallis chi-squared = 25.928, df = 2, p-value = 2.344e-06

6. Interpretacja wyników

Przykład: - Jeśli ANOVA dla nawozów A, B, C dała p = 0.015, oznacza to istotne różnice między grupami. - Test Tukey’a może pokazać, że np. nawóz B vs. A ma p = 0.012, a C vs. A p = 0.851 – czyli różni się tylko B od A.

6. Analiza skupień

Analiza skupień (clustering) pozwala na grupowanie obiektów o podobnych cechach.

Metody:

  • K-means: Grupowanie na podstawie średnich.
  • Hierarchiczne grupowanie: Tworzenie drzewa dendrogramu.

Przykład w R:

library(cluster)
set.seed(123)
kmeans_result <- kmeans(dane$wzrost, centers = 3)
print(kmeans_result)
K-means clustering with 3 clusters of sizes 10, 10, 10

Cluster means:
  [,1]
1 15.7
2 25.7
3 20.7

Clustering vector:
 [1] 3 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1

Within cluster sum of squares by cluster:
[1] 16.1 16.1 16.1
 (between_SS / total_SS =  91.2 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
[6] "betweenss"    "size"         "iter"         "ifault"      

7. Analiza głównych składowych (PCA)

PCA (Principal Component Analysis) redukuje wymiarowość danych, zachowując jak najwięcej informacji.

8. Test t-Studenta

Test t-Studenta porównuje średnie dwóch grup.

Przykład w R:

#t.test(wzrost ~ nawóz, data = dane, var.equal = TRUE)

9. Interpretacja wyników

Przykład: - Jeśli ANOVA dla nawozów A, B, C dała p = 0.015, oznacza to istotne różnice między grupami. - Test Tukey’a może pokazać, że np. nawóz B vs. A ma p = 0.012, a C vs. A p = 0.851 – czyli różni się tylko B od A.

Podsumowanie

  • ANOVA odpowiada na pytanie: Czy istnieją różnice między średnimi grup?
  • Testy post-hoc (np. Tukey) pokazują, które konkretnie grupy się różnią.
  • W R używaj: aov(), summary(), TukeyHSD(), pamiętając o sprawdzeniu założeń.
  • Analiza skupień pozwala na wykrycie naturalnych grup w danych.
  • PCA redukuje wymiarowość, ułatwiając interpretację danych.
  • Test t-Studenta pozwala porównać średnie dwóch grup.

Kiedy używać której metody?

ANOVA → Jeśli masz więcej niż 2 grupy i chcesz sprawdzić, czy ich średnie się różnią.

Test t-Studenta → Jeśli masz tylko 2 grupy i chcesz porównać ich średnie.

Test Kruskala-Wallisa → Jeśli ANOVA nie może być użyta (np. brak normalności danych).

Test Tukeya (TukeyHSD) → Jeśli ANOVA pokazała istotność, to ten test sprawdzi które grupy się różnią.

PCA (Analiza głównych składowych) → Jeśli masz dużo zmiennych i chcesz zmniejszyć wymiarowość (np. dla wizualizacji).

Analiza skupień (k-means, hierarchiczna) → Jeśli chcesz grupować obiekty na podstawie podobieństwa.

Najważniejsze komendy w R

1. ANOVA (dla więcej niż 2 grup)

model <- aov(wzrost ~ nawóz, data = dane) summary(model) # Jeśli p < 0.05, to przynajmniej jedna grupa różni się od innych.

2. Test Tukeya (które grupy różnią się od siebie?)

TukeyHSD(model) plot(TukeyHSD(model))

3. Test t-Studenta (dla 2 grup)

t.test(wzrost ~ nawóz, data = dane, var.equal = TRUE)

4. Test normalności (czy dane są normalne?)

shapiro.test(resid(model))

5. Test jednorodności wariancji (czy wariancje są równe?)

library(car) leveneTest(wzrost ~ nawóz, data = dane)

6. Jeśli dane nie są normalne → Kruskal-Wallis

kruskal.test(wzrost ~ nawóz, data = dane)

7. Analiza głównych składowych (PCA)

library(FactoMineR) pca_result <- PCA(dane[, -1], scale.unit = TRUE) plot(pca_result, choix = “ind”)

8. Analiza skupień (K-means)

kmeans_result <- kmeans(dane$wzrost, centers = 3) print(kmeans_result)