Analiza danych

Analiza opisowa

Aleksandra Szamiel

2023-01-06

knitr::opts_chunk$set(
    echo = TRUE,
    message = FALSE,
    warning = FALSE
)
options(qwraps2_markup = "markdown")
library(qwraps2)
library(arsenal)
## 
## Dołączanie pakietu: 'arsenal'
## Następujące obiekty zostały zakryte z 'package:qwraps2':
## 
##     gmean, gsd
library(e1071)
library(haven)
library(papeR)
## Ładowanie wymaganego pakietu: car
## Ładowanie wymaganego pakietu: carData
## 
## Dołączanie pakietu: 'car'
## Następujący obiekt został zakryty z 'package:qwraps2':
## 
##     logit
## Ładowanie wymaganego pakietu: xtable
## Registered S3 methods overwritten by 'papeR':
##   method            from   
##   Anova.lme         car    
##   labels.data.frame arsenal
## 
## Dołączanie pakietu: 'papeR'
## Następujący obiekt został zakryty z 'package:arsenal':
## 
##     labels<-
## Następujący obiekt został zakryty z 'package:utils':
## 
##     toLatex
library(dplyr)
## 
## Dołączanie pakietu: 'dplyr'
## Następujące obiekty zostały zakryte z 'package:papeR':
## 
##     summarise, summarize
## Następujący obiekt został zakryty z 'package:car':
## 
##     recode
## Następujące obiekty zostały zakryte z 'package:stats':
## 
##     filter, lag
## Następujące obiekty zostały zakryte z 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## ── Attaching packages
## ───────────────────────────────────────
## tidyverse 1.3.2 ──
## ✔ ggplot2 3.4.0     ✔ purrr   0.3.5
## ✔ tibble  3.1.8     ✔ stringr 1.4.1
## ✔ tidyr   1.2.1     ✔ forcats 0.5.2
## ✔ readr   2.1.3     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter()    masks stats::filter()
## ✖ dplyr::lag()       masks stats::lag()
## ✖ dplyr::recode()    masks car::recode()
## ✖ purrr::some()      masks car::some()
## ✖ dplyr::summarise() masks papeR::summarise()
## ✖ dplyr::summarize() masks papeR::summarize()
library(ggplot2)
library(kableExtra)
## 
## Dołączanie pakietu: 'kableExtra'
## 
## Następujący obiekt został zakryty z 'package:dplyr':
## 
##     group_rows
library(summarytools)
## 
## Dołączanie pakietu: 'summarytools'
## 
## Następujący obiekt został zakryty z 'package:tibble':
## 
##     view
## 
## Następujące obiekty zostały zakryte z 'package:xtable':
## 
##     label, label<-
library(classInt)
library(pastecs)
## 
## Dołączanie pakietu: 'pastecs'
## 
## Następujący obiekt został zakryty z 'package:tidyr':
## 
##     extract
## 
## Następujące obiekty zostały zakryte z 'package:dplyr':
## 
##     first, last
library(desctable)
## Ładowanie wymaganego pakietu: pander
## 
## Dołączanie pakietu: 'desctable'
## 
## Następujące obiekty zostały zakryte z 'package:stats':
## 
##     chisq.test, fisher.test, IQR
library(frequency)
## Ładowanie wymaganego pakietu: rmarkdown
## Ładowanie wymaganego pakietu: knitr
## Ładowanie wymaganego pakietu: DT
## 
## Dołączanie pakietu: 'DT'
## 
## Następujący obiekt został zakryty z 'package:desctable':
## 
##     datatable
## 
## 
## Dołączanie pakietu: 'frequency'
## 
## Następujący obiekt został zakryty z 'package:summarytools':
## 
##     freq
library(corrplot)
## corrplot 0.92 loaded
library(ggpubr)
## 
## Dołączanie pakietu: 'ggpubr'
## 
## Następujące obiekty zostały zakryte z 'package:qwraps2':
## 
##     mean_ci, mean_sd, median_iqr
download.file("https://github.com/kflisikowski/ds/blob/master/data_apartments.csv?raw=true", destfile ="mieszkania.csv",mode="wb")
mieszkania <- read.csv("mieszkania.csv",sep=";",dec=",")

Data wrangling

Jak widać nie wszystkie formaty naszych zmiennych są dostosowane. Musimy przygotować odpowiednie formaty naszych zmiennych zgodnie z ich skalą pomiarową i przyszłym zastosowaniem.

mieszkania$district<-as.factor(mieszkania$district)
mieszkania$building_type<-as.factor(mieszkania$building_type)
mieszkania$rooms<-factor(mieszkania$rooms,ordered=TRUE)
attach(mieszkania)
mieszkania$price_PLN<-as.numeric(mieszkania$price_PLN)
mieszkania$price_EUR<-as.numeric(mieszkania$price_EUR)

Tabele liczności oraz TAI

W pierwszym etapie naszej analizy pogrupujemy nasze dane w postaci prostej tabeli częstości.

Najpierw przyjrzyjmy się rozkładowi cen mieszkań w naszej próbie i zweryfikujmy poprawność tabelaryczną za pomocą miary TAI:

etykiety<-c("350-450 kPLN","450-550 kPLN","550-650 kPLN","650-750 kPLN","750-850 kPLN","850-950 kPLN","950-1050 kPLN","1050-1150 kPLN","1150-1250 kPLN","1250-1350 kPLN")
limits<-cut(mieszkania$price_PLN,seq(350000,1350000,by=100000),labels=etykiety)
tabela1<-freq(limits,type="html")
## 
  |                                                                            
  |                                                                      |   0%
  |                                                                            
  |======================================================================| 100%
kbl(tabela1,caption = "Mieszkania we Wrocławiu - ceny w kPLN") %>%
    kable_material(c("striped", "hover"))
Mieszkania we Wrocławiu - ceny w kPLN
x label Freq Percent Valid Percent Cumulative Percent
Valid 350-450 kPLN 9 4.5 4.5 4.5
450-550 kPLN 21 10.5 10.5 15.0
550-650 kPLN 33 16.5 16.5 31.5
650-750 kPLN 36 18.0 18.0 49.5
750-850 kPLN 31 15.5 15.5 65.0
850-950 kPLN 36 18.0 18.0 83.0
950-1050 kPLN 21 10.5 10.5 93.5
1050-1150 kPLN 10 5.0 5.0 98.5
1150-1250 kPLN 2 1.0 1.0 99.5
1250-1350 kPLN 1 0.5 0.5 100.0
Total 200 100.0 100.0
Missing <blank> 0 0.0
<NA> 0 0.0
Total 200 100.0
tab1<-classIntervals(mieszkania$price_PLN,n=10,style="fixed",fixedBreaks=seq(350000,1350000,by=100000))
jenks.tests(tab1)
##        # classes  Goodness of fit Tabular accuracy 
##       10.0000000        0.9780872        0.8508467

Jak widzimy - wskaźnik TAI jest dość wysoki. 0,85 oznacza, że możemy zaakceptować zaproponowaną konstrukcję tablicy częstości.

Podstawowe wykresy

W tej części powinniśmy przedstawić nasze dane za pomocą podstawowych (preinstalowanych w R) grafik. Wybrać najbardziej odpowiednie wykresy w zależności od skali wybranych zmiennych. Zbadaj heterogeniczność rozkładu prezentując dane w podziale na grupy (np. według dzielnic, typów budynków itp.). Nie zapomnij o tytułach głównych, etykietach i legendzie. Przeczytaj więcej o parametrach graficznych tutaj.

# Zastosowanie reguły Freedman/Diaconis s.120 ("Algorytm, który automatycznie wybiera szerokość i położenie bloków w oparciu o wielkość próby i rozrzut danych" http://www.mathworks.com/help/toolbox/stats/bqucg6n.html)
hist(price_PLN, breaks="FD", col="green", probability = TRUE,
     main="Ceny w PLN - Wrocław")
lines(density(price_PLN[district=="Krzyki"]),col=2)
lines(density(price_PLN[district=="Biskupin"]),col=3)
lines(density(price_PLN[district=="Srodmiescie"]),col=4)
legend("topright", legend=c("Krzyki", "Biskupin", "Śródmieście"),
       col=c(2,3,4), lty=1:2, horiz=FALSE, box.lty=0, cex=0.8)

Zauważ, że parametr echo = FALSE został dodany do fragmentu kodu, aby zapobiec drukowaniu kodu R, który wygenerował wykres.

boxplot(price_PLN~district)

ggplot2 plots

W tym rozdziale przedstawimy te same wykresy, ale z wykorzystaniem pakietów ggplot2 i ggpubr.

# Density plot of "price_PLN"
#::::::::::::::::::::::::::::::::::::::
density.p <- ggdensity(mieszkania, x = "price_PLN", 
                       fill = "district", palette = "jco")+
  stat_overlay_normal_density(color = "red", linetype = "dashed")

# Liczymy statystyki wg dzielnic:
stable <- desc_statby(mieszkania, measure.var = "price_PLN",
                      grps = "district")
stable <- stable[, c("district", "length", "mean", "sd")]
# Wykres, szablon "medium orange":
stable.p <- ggtexttable(stable, rows = NULL, 
                        theme = ttheme("mOrange"))
# Podpisujemy wykres:
#::::::::::::::::::::::::::::::::::::::
text <- paste("Ceny mieszkań wg 3 dzielnic - Wrocław.",
              "Losowa próba 200 mieszkań.",
               sep = " ")
text.p <- ggparagraph(text = text, face = "italic", size = 11, color = "black")
# Aranżujemy wykresy na tym samym panelu:
ggarrange(density.p, stable.p, text.p, 
          ncol = 1, nrow = 3,
          heights = c(1, 0.5, 0.3))

Ggplot2 pozwala na pokazanie średniej wartości dla każdej grupy za pomocą funkcji stat_summary(). Nie musisz już obliczać wartości średnich przed tworzeniem wykresu!

ggplot(mieszkania, aes(x=district, y=price_PLN)) +
    geom_boxplot(alpha=0.7) +
    stat_summary(fun="mean", geom="point", shape=20, size=5, color="red", fill="red") +
 geom_jitter() +
    facet_grid(~building_type) +
    scale_fill_brewer(palette="Set1")

Grupowanie grafik

Faceting generuje małe wielokrotności, z których każda pokazuje inny podzbiór danych. Są one potężnym narzędziem do eksploracyjnej analizy danych: możesz szybko porównać wzorce w różnych częściach danych i zobaczyć czy są takie same czy różne. Przeczytaj więcej tutaj.

plot1 <- ggplot(mieszkania, aes(price_PLN, rooms)) + 
  geom_abline() +
  geom_jitter(width = 0.1, height = 0.1) 
plot1 + facet_wrap(~district)

Statystyki opisowe

Bardzo przyjemny w użyciu dla generowania tabel opisowych jest pakiet “summarytools”. Zerknij na jego stronę domową tutaj

Przed automatycznym raportowaniem pełnej tabeli podsumowującej statystyki opisowe, tym razem Twoim celem jest zmierzenie tendencji centralnej rozkładu cen. Porównaj średnią, medianę i tryb wraz z miarami pozycyjnymi - kwantylami - według dzielnic i typów budynków lub liczby pokoi w mieszkaniu.

mean(price_PLN)
median(price_PLN)
sd(price_PLN) #standard deviation
var(price_PLN) #variance
coeff_var<-sd(price_PLN)/mean(price_PLN) #coefficient of variability %
coeff_var
IQR(price_PLN)# difference between quartiles =Q3-Q1 
sx<-IQR(price_PLN)/2  #interquartile deviation
coeff_varx<-sx/median(price_PLN) #IQR coefficient of variability %
coeff_varx
min(price_PLN)
max(price_PLN)
quantile(price_PLN,probs=c(0,0.1,0.25,0.5,0.75,0.95,1),na.rm=TRUE)

Podsumowanie opisu danych

Przed automatycznym raportowaniem pełnej tabeli podsumowującej statystyki opisowe, tym razem Twoim celem jest zmierzenie tendencji centralnej rozkładu cen.

mieszkania_list <- split(mieszkania$price_PLN, mieszkania$rooms)
inline_plot <- data.frame(rooms = c(1, 2, 3, 4), boxplot = "", histogram = "", line1 = "", line2 = "", points1 = "")
  inline_plot %>%
  kbl(booktabs = TRUE) %>%
  kable_paper(full_width = FALSE) %>%
  column_spec(2, image = spec_boxplot(mieszkania_list)) %>%
  column_spec(3, image = spec_hist(mieszkania_list)) %>%
  column_spec(4, image = spec_plot(mieszkania_list, same_lim = TRUE)) %>%
  column_spec(5, image = spec_plot(mieszkania_list, same_lim = FALSE)) %>%
  column_spec(6, image = spec_plot(mieszkania_list, type = "p"))
rooms boxplot histogram line1 line2 points1
1
2
3
4

Ok, teraz w końcu podsumujemy podstawowe miary tendencji centralnej dla cen według dzielnic/typów budynków używając pakietu ‘kable’. Możesz dostosować swój raport końcowy do własnych potrzeb. Zobacz kilka podpowiedzi tutaj.

library(psych)
raport <-
  list("Cena w PLN" =
       list("Min"       = ~ min(price_PLN),
            "Max"       = ~ max(price_PLN),
            "Q1"        = ~ quantile(price_PLN,0.25),
            "Mediana" = ~ round(median(price_PLN),2),
            "Q3"        = ~ quantile(price_PLN,0.75),
            "Mean" = ~ round(mean(price_PLN),2),
            "Odch. std." = ~ round(sd(price_PLN),2),
            "IQR" = ~ round(iqr(price_PLN),2),
            "Sx" = ~ round(iqr(price_PLN)/2,2),
            "Var %" = ~ round((sd(price_PLN)/mean(price_PLN)),2),
            "IQR Var %" = ~ round((iqr(price_PLN)/median(price_PLN)),2),
            "Skośność" = ~  round(skew(price_PLN),2),
            "Kurtoza" = ~  round(kurtosi(price_PLN),2)
            ))
tabela<-summary_table(mieszkania, summaries = raport, by = c("rooms"))

kbl(tabela,
  digits = 2,
  caption="Tabela 1. Mieszkania we Wrocławiu - ceny w PLN wg liczby pokoi.",
  col.names = c('1 pokój', '2 pokoje', '3 pokoje', '4 pokoje'))%>%
 kable_classic(full_width = F, html_font = "Cambria")%>%
 kable_styling(bootstrap_options = c("striped", "hover"))
Tabela 1. Mieszkania we Wrocławiu - ceny w PLN wg liczby pokoi.
1 pokój 2 pokoje 3 pokoje 4 pokoje
Min 359769.00 590286.00 632770.00 736669.00
Max 657146.00 888634.00 965829.00 1277691.00
Q1 479684.75 634757.25 769683.75 909371.50
Mediana 520507.00 677260.00 846303.50 964338.50
Q3 555024.75 717728.50 901078.75 1050976.75
Mean 515518.05 683567.70 833706.02 974809.96
Odch. std. 66951.03 65072.66 86943.90 113819.21
IQR 75340.00 82971.25 131395.00 141605.25
Sx 37670.00 41485.62 65697.50 70802.62
Var % 0.13 0.10 0.10 0.12
IQR Var % 0.14 0.12 0.16 0.15
Skośność -0.20 0.80 -0.42 0.33
Kurtoza -0.38 0.48 -0.83 0.05

Macierze korelacji

mieszkania2 <- read.csv("mieszkania.csv",sep=";",dec=",")
corrplot(cor(mieszkania2[,1:4]), method = "number", type = "upper", diag =FALSE)

#corr_matrix<-cor(mieszkania2[,1:4])
#corrplot(corr_matrix, type="upper")

Twoja kolej!

Na podstawie danych dot. rynku nieruchomości z pewnego regionu USA, dokonaj podobnej analizy opisowej.

download.file("https://github.com/kflisikowski/ds/blob/master/b.csv?raw=true", destfile ="real_estates.csv",mode="wb")
houses <- read.csv("real_estates.csv",row.names=1)
attach(houses)
any(is.na(houses))
## [1] FALSE

Naszym celem jest przewidywanie wartości nieruchomości. Zanim jednak się tym zajmiemy na kolejnych zajęciach, postaraj się wykonać pełną analizę opisową wraz z grafiką dla tej bazy danych.

Zobaczmy, jakie mamy zmienne:

glimpse(houses)
## Rows: 506
## Columns: 14
## $ crim    <dbl> 0.00632, 0.02731, 0.02729, 0.03237, 0.06905, 0.02985, 0.08829,…
## $ zn      <dbl> 18.0, 0.0, 0.0, 0.0, 0.0, 0.0, 12.5, 12.5, 12.5, 12.5, 12.5, 1…
## $ indus   <dbl> 2.31, 7.07, 7.07, 2.18, 2.18, 2.18, 7.87, 7.87, 7.87, 7.87, 7.…
## $ chas    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
## $ nox     <dbl> 0.538, 0.469, 0.469, 0.458, 0.458, 0.458, 0.524, 0.524, 0.524,…
## $ rm      <dbl> 6.575, 6.421, 7.185, 6.998, 7.147, 6.430, 6.012, 6.172, 5.631,…
## $ age     <dbl> 65.2, 78.9, 61.1, 45.8, 54.2, 58.7, 66.6, 96.1, 100.0, 85.9, 9…
## $ dis     <dbl> 4.0900, 4.9671, 4.9671, 6.0622, 6.0622, 6.0622, 5.5605, 5.9505…
## $ rad     <int> 1, 2, 2, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,…
## $ tax     <int> 296, 242, 242, 222, 222, 222, 311, 311, 311, 311, 311, 311, 31…
## $ ptratio <dbl> 15.3, 17.8, 17.8, 18.7, 18.7, 18.7, 15.2, 15.2, 15.2, 15.2, 15…
## $ black   <dbl> 396.90, 396.90, 392.83, 394.63, 396.90, 394.12, 395.60, 396.90…
## $ lstat   <dbl> 4.98, 9.14, 4.03, 2.94, 5.33, 5.21, 12.43, 19.15, 29.93, 17.10…
## $ medv    <dbl> 24.0, 21.6, 34.7, 33.4, 36.2, 28.7, 22.9, 27.1, 16.5, 18.9, 15…

Nasz zbiór danych zawiera informacje o losowej próbie nieruchomości i różnych cechach dla ich sąsiedztwa.

Ta ramka danych ma 506 wierszy i 14 kolumn (predyktorów). Mamy opisy i podsumowania predyktorów jak poniżej: - crim: wskaźnik przestępczości na mieszkańca według miasta. - zn: proporcja gruntów mieszkalnych przeznaczonych na działki powyżej 25 000 stóp kwadratowych. - indus: proporcja akrów biznesu niedetalicznego na miasto. - chas: zmienna dummy river (= 1, jeśli działka graniczy z rzeką; 0 w przeciwnym razie). - nox: stężenie tlenków azotu (cząsteczek na 10 milionów). - rm: średnia liczba pokoi na mieszkanie. - age: odsetek mieszkań zamieszkanych przez właścicieli zbudowanych przed 1940 rokiem. - dis: średnia ważona odległości do miejskich centrów zatrudnienia. - rad: indeks dostępności do autostrad radialnych. - tax: stawka podatku od nieruchomości o pełnej wartości za 10 000 USD. - ptratio: współczynnik uczeń-nauczyciel według miasta. - black: 1000(Bk - 0.63)^2 gdzie Bk jest odsetkiem czarnoskórych w danym mieście. - lstat: status populacji poniżej progu ubóstwa (procent). - medv: mediana wartości domów zamieszkałych przez właścicieli w 1000$.

plot1 <- ggplot(houses, aes(crim, lstat)) + 
  geom_abline() +
  geom_jitter(width = 0.2, height = 0.2) +
  ggtitle("Wskaźnik przestępczości na mieszkańca według miasta / obok rzeki: - 1, inne: 0") +
  theme(plot.title = element_text(hjust = 0.5))
plot1 + facet_wrap(~chas)

raport1 <-
  list("Cena w PLN" =
         list("Min"       = ~ min(medv),
              "Max"       = ~ max(medv),
              "Q1"        = ~ quantile(medv,0.25),
              "Mediana" = ~ round(median(medv),2),
              "Q3"        = ~ quantile(medv,0.75),
              "Mean" = ~ round(mean(medv),2),
              "Odch. std." = ~ round(sd(medv),2),
              "IQR" = ~ round(iqr(medv),2),
              "Sx" = ~ round(iqr(medv)/2,2),
              "Var %" = ~ round((sd(medv)/mean(medv)),2),
              "IQR Var %" = ~ round((iqr(medv)/median(medv)),2),
              "Skośność" = ~  round(skewness(medv),2),
              "Kurtoza" = ~  round(kurtosis(medv),2)
         ))
tabela<-summary_table(houses, summaries = raport1, by = c("rad"))
tabela
## 
## 
## |                        |1 (N = 20)   |2 (N = 24)   |3 (N = 38)   |4 (N = 110)  |5 (N = 115)  |6 (N = 26)   |7 (N = 17)   |8 (N = 24)   |24 (N = 132) |
## |:-----------------------|:------------|:------------|:------------|:------------|:------------|:------------|:------------|:------------|:------------|
## |**Cena w PLN**          |&nbsp;&nbsp; |&nbsp;&nbsp; |&nbsp;&nbsp; |&nbsp;&nbsp; |&nbsp;&nbsp; |&nbsp;&nbsp; |&nbsp;&nbsp; |&nbsp;&nbsp; |&nbsp;&nbsp; |
## |&nbsp;&nbsp; Min        |11.9         |15.7         |14.4         |7            |11.8         |16.8         |17.6         |16           |5            |
## |&nbsp;&nbsp; Max        |50           |43.8         |50           |50           |50           |24.8         |42.8         |50           |50           |
## |&nbsp;&nbsp; Q1         |20.475       |21.4         |21.125       |17.575       |19.5         |18.9         |24.3         |23.825       |11.225       |
## |&nbsp;&nbsp; Mediana    |22.2         |23.85        |26.5         |20.45        |23           |21.2         |26.2         |28.25        |14.4         |
## |&nbsp;&nbsp; Q3         |27.225       |33.225       |34.525       |23.65        |30           |23.025       |29.6         |33.175       |19.9         |
## |&nbsp;&nbsp; Mean       |24.37        |26.83        |27.93        |21.39        |25.71        |20.98        |27.11        |30.36        |16.4         |
## |&nbsp;&nbsp; Odch. std. |8.02         |7.87         |8.32         |6.96         |9.33         |2.31         |6.49         |9.73         |8.54         |
## |&nbsp;&nbsp; IQR        |6.75         |11.83        |13.4         |6.07         |10.5         |4.12         |5.3          |9.35         |8.67         |
## |&nbsp;&nbsp; Sx         |3.38         |5.91         |6.7          |3.04         |5.25         |2.06         |2.65         |4.67         |4.34         |
## |&nbsp;&nbsp; Var %      |0.33         |0.29         |0.3          |0.33         |0.36         |0.11         |0.24         |0.32         |0.52         |
## |&nbsp;&nbsp; IQR Var %  |0.3          |0.5          |0.51         |0.3          |0.46         |0.19         |0.2          |0.33         |0.6          |
## |&nbsp;&nbsp; Skośność   |1.47         |0.65         |0.49         |1.77         |1.21         |-0.06        |0.66         |0.65         |2.22         |
## |&nbsp;&nbsp; Kurtoza    |2.73         |-0.76        |-0.44        |5.38         |0.79         |-1.35        |-0.14        |-0.77        |6.46         |
#Statystyki opisowe
kbl(tabela,
    digits = 2,
    caption="Tabela 1. Mediana wartości domów według dostępności do autostrad radialnych",
    col.names = c('1', '2', '3', '4','5','6','7','8','24'))%>%
  kable_classic(full_width = F, html_font = "Cambria")%>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Tabela 1. Mediana wartości domów według dostępności do autostrad radialnych
1 2 3 4 5 6 7 8 24
Min 11.90 15.70 14.40 7.00 11.80 16.80 17.60 16.00 5.00
Max 50.00 43.80 50.00 50.00 50.00 24.80 42.80 50.00 50.00
Q1 20.48 21.40 21.12 17.58 19.50 18.90 24.30 23.82 11.23
Mediana 22.20 23.85 26.50 20.45 23.00 21.20 26.20 28.25 14.40
Q3 27.23 33.23 34.52 23.65 30.00 23.03 29.60 33.17 19.90
Mean 24.37 26.83 27.93 21.39 25.71 20.98 27.11 30.36 16.40
Odch. std. 8.02 7.87 8.32 6.96 9.33 2.31 6.49 9.73 8.54
IQR 6.75 11.83 13.40 6.07 10.50 4.12 5.30 9.35 8.67
Sx 3.38 5.91 6.70 3.04 5.25 2.06 2.65 4.67 4.34
Var % 0.33 0.29 0.30 0.33 0.36 0.11 0.24 0.32 0.52
IQR Var % 0.30 0.50 0.51 0.30 0.46 0.19 0.20 0.33 0.60
Skośność 1.47 0.65 0.49 1.77 1.21 -0.06 0.66 0.65 2.22
Kurtoza 2.73 -0.76 -0.44 5.38 0.79 -1.35 -0.14 -0.77 6.46
corrplot(cor(houses), method = "circle", diag =FALSE, type="lower")

corrplot.mixed(cor(houses), order = 'hclust')