Przedmiotem rozważań niniejszego opracowania jest analiza danych dotycząca zbioru nierchomości. Celem badania jest wyselekcjonowanie czynników mogących istotnie wpływać na cenę domu.
Podstawą analizy jest baza danych nieruchomości wystawionych na sprzedaż, dostępnych w pewnej agencji nieruchomości.
# wczytanie danych
library(readxl)
dane <- read.csv("agencja_nieruchomosci.csv")
# wyświetlenie pierwszych wierszy danych
kable(head(dane))
| price | area | bedrooms | bathrooms | stories | mainroad | guestroom | basement | hotwaterheating | airconditioning | parking | prefarea | furnishingstatus |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 13300000 | 7420 | 4 | 2 | 3 | yes | no | no | no | yes | 2 | yes | furnished |
| 12250000 | 8960 | 4 | 4 | 4 | yes | no | no | no | yes | 3 | no | furnished |
| 12250000 | 9960 | 3 | 2 | 2 | yes | no | yes | no | no | 2 | yes | semi-furnished |
| 12215000 | 7500 | 4 | 2 | 2 | yes | no | yes | no | yes | 3 | yes | furnished |
| 11410000 | 7420 | 4 | 1 | 2 | yes | yes | yes | no | yes | 2 | no | furnished |
| 10850000 | 7500 | 3 | 3 | 1 | yes | no | yes | no | yes | 2 | yes | semi-furnished |
Powyższa tabela przedstawia dane pierwszych szcześciu nieruchmości. Ma to na celu zapoznanie się z ogólną postacią posiadanych danych. Widzimy, że zmienne price, area, bedrooms, stories, parking są numeryczne, natomiast zmienne takie jak: mianroad, guestroom, basement, hotwaterheating, airconditioning są zmiennymi logicznymi przyjmącymi formę yes/no; zmienna furnishingstatus jest zmienną kategoryczną.
Poniżej przedstawiamy, ogólne informacje dotyczące zmiennych:
Dane poddane analizie zawieraja ponizsze zmienne:
price - cena nieruchomości w dolarach
area - całkowita powierzchnia domu w stopach kwadratowych
bedrooms - liczba sypialni w domu
bathrooms - liczba łazienek w domu
stories - liczba pięter w domu
mainroad - czy dom jest połączony z główną drogą (Tak/Nie)
guestroom - czy dom posiada pokój gościnny (Tak/Nie)
basement - czy dom jest podpiwniczony (Tak/Nie)
hotwaterheating - czy dom posiada system ogrzewania ciepłej wody (Tak/Nie)
airconditioning - czy dom posiada system klimatyzacji (Tak/Nie)
parking - liczba miejsc parkingowych dostępnych w budynku
prefarea - czy dom znajduje się w preferowanym obszarze (Tak/Nie)
furnishingstatus - status umeblowania domu (w pełni umeblowany, częściowo umeblowany, nieumeblowany)
# struktura danych
str(dane)
## 'data.frame': 545 obs. of 13 variables:
## $ price : int 13300000 12250000 12250000 12215000 11410000 10850000 10150000 10150000 9870000 9800000 ...
## $ area : int 7420 8960 9960 7500 7420 7500 8580 16200 8100 5750 ...
## $ bedrooms : int 4 4 3 4 4 3 4 5 4 3 ...
## $ bathrooms : int 2 4 2 2 1 3 3 3 1 2 ...
## $ stories : int 3 4 2 2 2 1 4 2 2 4 ...
## $ mainroad : chr "yes" "yes" "yes" "yes" ...
## $ guestroom : chr "no" "no" "no" "no" ...
## $ basement : chr "no" "no" "yes" "yes" ...
## $ hotwaterheating : chr "no" "no" "no" "no" ...
## $ airconditioning : chr "yes" "yes" "no" "yes" ...
## $ parking : int 2 3 2 3 2 2 2 0 2 1 ...
## $ prefarea : chr "yes" "no" "yes" "yes" ...
## $ furnishingstatus: chr "furnished" "furnished" "semi-furnished" "furnished" ...
Powyższa funkcja str w porównaniu do wcześniejszej kable, przedstawia dodatkowo informacje dotyczące liczby obserwacji oraz liczby zmiennych.
Zbiór danych posiada kolumny zawierajace dane “yes” “no”. Zastąpimy te dane w taki sposób, że: no-“0” yes-“1” dla kolumn: mainroad, guestroom, basement, hotwaterheating, airconditioning, prefarea.
# zamiana yes/no na 1/0
dane$mainroad <- ifelse(dane$mainroad == 'yes', 1, 0)
dane$guestroom <- ifelse(dane$guestroom == 'yes', 1, 0)
dane$basement <- ifelse(dane$basement == 'yes', 1, 0)
dane$hotwaterheating <- ifelse(dane$hotwaterheating == 'yes', 1, 0)
dane$airconditioning <- ifelse(dane$airconditioning == 'yes', 1, 0)
dane$prefarea <- ifelse(dane$prefarea == 'yes', 1, 0)
W przypadku kolumny furnishingstatus zmienimy poniższe statusty na wartości: unfurnished - “0” semi-furnished - “1” furnished - “2”
# Zamiana wartości w kolumnie 'furnishingstatus'
dane$furnishingstatus <- ifelse(dane$furnishingstatus == 'unfurnished', 0,
ifelse(dane$furnishingstatus == 'semi-furnished', 1,
ifelse(dane$furnishingstatus == 'furnished', 2, NA)))
Dane z kolumny price zamienimy z cen w dolarach na ceny w polskich złotych.
# Kurs wymiany
kurs_wymiany <- 4.00
# 1USD=4.00PLN na dzien 4/02/2024
# Przeliczenie cen z dolarów na złote
dane$price <- dane$price * kurs_wymiany
Natomiast dane z kolumny area zamienimy z powierzchni mierzonej w stopach kwadratowych na powierzchnię mierzoną w metrach kwadratowych.
# Współczynnik konwersji z stóp kwadratowych na metry kwadratowe
wspolczynnik_konwersji <- 0.092903
# Przeliczenie powierzchni z stóp kwadratowych na metry kwadratowe
dane$area <- dane$area * wspolczynnik_konwersji
Ponownie została użyta funkcja str() w celu weryfikacji, czy dane po przekształceniu posiadają oczekiwane formy.
# ponowne wyswietlenie struktura danych
str(dane)
## 'data.frame': 545 obs. of 13 variables:
## $ price : num 53200000 49000000 49000000 48860000 45640000 ...
## $ area : num 689 832 925 697 689 ...
## $ bedrooms : int 4 4 3 4 4 3 4 5 4 3 ...
## $ bathrooms : int 2 4 2 2 1 3 3 3 1 2 ...
## $ stories : int 3 4 2 2 2 1 4 2 2 4 ...
## $ mainroad : num 1 1 1 1 1 1 1 1 1 1 ...
## $ guestroom : num 0 0 0 0 1 0 0 0 1 1 ...
## $ basement : num 0 0 1 1 1 1 0 0 1 0 ...
## $ hotwaterheating : num 0 0 0 0 0 0 0 0 0 0 ...
## $ airconditioning : num 1 1 0 1 1 1 1 0 1 1 ...
## $ parking : int 2 3 2 3 2 2 2 0 2 1 ...
## $ prefarea : num 1 0 1 1 0 1 1 0 1 1 ...
## $ furnishingstatus: num 2 2 1 2 2 1 1 0 2 0 ...
Tak, dane posiadają oczekiwane formy, zmienne yes/no, zostały zamienione na wartości 1/0, wartości zmiennej furnishingstatus zostały zamienione na wartości liczbowe w strukturze: unfurnished - “0” semi-furnished - “1” furnished - “2”; Zmienna dotycząca cen nieruchomości została przeliczona z cen w dolarach na ceny w polskich złotych, natomiast metraż został przeliczony z stóp kwadratowych na metry kwadratowej.
data.frame(braki = sapply(dane, function(x) sum(is.na(x))))
## braki
## price 0
## area 0
## bedrooms 0
## bathrooms 0
## stories 0
## mainroad 0
## guestroom 0
## basement 0
## hotwaterheating 0
## airconditioning 0
## parking 0
## prefarea 0
## furnishingstatus 0
W zbiorze nie występują braki danych.
Sprawdzamy jakie skrajne wartosci osiagaja poszczegolne zmienne.
# zakres osiąganych wartości dla zmiennych ilościowych
psych::describe(dane[, c(1:5, 11)])
## vars n mean sd median trimmed mad
## price 1 545 19066916.99 7481758.46 1.7360e+07 18237197.71 6226920.00
## area 2 545 478.50 201.61 4.2735e+02 456.01 191.46
## bedrooms 3 545 2.97 0.74 3.0000e+00 2.93 0.00
## bathrooms 4 545 1.29 0.50 1.0000e+00 1.21 0.00
## stories 5 545 1.81 0.87 2.0000e+00 1.66 1.48
## parking 6 545 0.69 0.86 0.0000e+00 0.59 0.00
## min max range skew kurtosis se
## price 7000000.00 53200000.00 46200000.00 1.21 1.91 320483.32
## area 153.29 1505.03 1351.74 1.31 2.69 8.64
## bedrooms 1.00 6.00 5.00 0.49 0.70 0.03
## bathrooms 1.00 4.00 3.00 1.58 2.12 0.02
## stories 1.00 4.00 3.00 1.08 0.65 0.04
## parking 0.00 3.00 3.00 0.84 -0.59 0.04
Jak widać ceny osiągają milionowe wartości. Aby nie operować bardzo dużymi liczbami wyrazimy je w mln PLN.
# przeliczenia wartości zmiennej price
dane <- dane %>%
mutate(price = price/10^6)
# Przypisanie danych bez duplikatów do nowej zmiennej
dane_unikalne <- unique(dane)
# Sprawdzenie, czy oryginalne dane zawierają duplikaty
czy_duplikaty <- anyDuplicated(dane) > 0
# Wyświetlenie informacji o duplikatach
if (czy_duplikaty) {
print("Dane zawierają duplikaty.")
} else {
print("Brak duplikatów w danych.")
}
## [1] "Brak duplikatów w danych."
W zbiorze nie występują duplikaty danych.
Sprawdzamy czy w zbiorze danych wystepuja wartosci ujemne. W zadnej zmiennej wartosci nie powinny byc ujemne.
# Sprawdzenie, czy istnieją wartości ujemne w dowolnej kolumnie
czy_sa_ujemne <- any(sapply(dane, function(x) any(x < 0)))
# Wyświetlenie informacji
if (czy_sa_ujemne) {
print("W ramce danych są wartości ujemne.")
} else {
print("Brak wartości ujemnych w ramce danych.")
}
## [1] "Brak wartości ujemnych w ramce danych."
W zbiorze nie występują ujemne wartości.
W tym rozdziale przeprowadzamy analizę danych w celu identyfikacji obserwacji odstających w poszczególnych zmiennych. Do tego celu wykorzystujemy wykresy pudełkowe (boxplot), które pozwalają wizualizować rozkład wartości oraz wykrywać wartości odstające w zbiorze danych.
Poniższy kod wykonuje generowanie wykresów pudełkowych dla wszystkich zmiennych numerycznych w ramce danych. Dodatkowo, oznacza wartości odstające na wykresie punktowym kolorowymi punktami. Dzięki temu można szybko zidentyfikować potencjalne odstępstwa w danych i podjąć dalsze kroki w celu ich zrozumienia.
par(mfrow = c(2, 2), cex.axis = 1.5, las = 2, mar = c(5, 5, 2, 2))
for (col in colnames(dane)) {
if (is.numeric(dane[[col]])) {
boxplot(dane[[col]],
main = paste("Wykres pudełkowy dla zmiennej\n", col),
ylab = col,
col = "lightgreen",
border = "darkgreen",
pch = 18,
cex = 1.5,
cex.main = 1
)
outliers <- boxplot.stats(dane[[col]])$out
points(which(dane[[col]] %in% outliers), outliers, pch = 4, col = "red", cex = 0.5)
}
}
Cena: W zmiennej price, można zaobserwować zmienne odstające powyżej 35 mln PLN. Może być to związane z dużym metrażem nieruchomości, atrakycjną lokalizacją, liczbą sypialni, lub poziomem umeblowania
Powierzchnia: Można zaobserwować zmienne odstające dla powierzchni powyżej 850m2. Może być to związane z liczbą pięter, lub dużą ilością pomieszczeń takich jak sypialnia czy łazienka.
Sypialnie: Istnieją nieruchomości posiadające 5 i 6 sypialni, które to wartości należą do zmiennych odstających w analizowanym zakresie. Wiekszość nieruchmości jest w przedziale 2-3 sypialnie.
Lazienki: Znaczaca wiekszosc posiada do 2 lazienek. Natomiast istnieje zmienna odstająca, wskazująca na 4 łazienki w nieruchomości.
Piętra: Nieruchomosci posiadaja glownie 1-2 pietra, istnieje zmienna odstajaca, wskazujaca na 4 pietra w nieruchmosci
Miejsca parkingowe: Dla zbioru danych, mozna zaobserwować zmienną odstającą wskazujacą, że istnieją nieruchomości z 3 miejscami parkingowymi.
Poniżej przygotowano wykresy rozrzutu dla posiadanych danych.
W tym rozdziale przeprowadzamy analizę danych w celu identyfikacji obserwacji odstających przy użyciu wykresu punktowego. Wykres ten pozwala nam zobaczyć wzorce i relacje pomiędzy zmiennymi numerycznymi w ramce danych.
Poniższy kod generuje wykres punktowy dla wszystkich zmiennych numerycznych w ramce danych. Dodatkowo, oznacza obserwacje odstające na wykresie za pomocą czerwonych punktów. Dzięki temu możemy szybko zidentyfikować nietypowe lub błędne wartości w danych i podjąć dalsze kroki w celu ich zrozumienia lub usunięcia.
# Stworzenie wykresu punktowego (scatterplot matrix) z dostosowanymi parametrami
par(mfrow = c(1, 1), mar = c(2, 2, 2, 2)) # Ustawienie jednego obszaru wykresu i marginesów
# Funkcja do usuwania brakujących wartości
remove_missing <- function(x) x[!is.na(x)]
# Pobranie danych numerycznych
numeric_data <- dane[, sapply(dane, is.numeric)]
# Narysowanie punktów na wykresie
pairs(numeric_data, pch = 16, col = "darkgreen", cex = 1.5)
# Dodanie oznaczenia dla obserwacji odstających
outliers_x <- lapply(numeric_data, function(x) boxplot.stats(remove_missing(x))$out)
outliers_y <- lapply(numeric_data, function(x) rep(1, length(boxplot.stats(remove_missing(x))$out)))
outliers_x <- unlist(outliers_x)
outliers_y <- unlist(outliers_y)
points(outliers_x, outliers_y, pch = 4, col = "red", cex = 1.5)
Poniżej indentyfikacja, w ktorych kolumnach (zmiennych) znajduja sie wartosci odstajace na podstawie odchylenia sandardowego.
Każdy rząd odpowiada za inną zmienną związaną z nieruchomościami: cena, powierzchnia, liczba sypialni, liczba łazienek, liczba pięter, główna droga, pokój gościnny, piwnica, ogrzewanie ciepłej wody, klimatyzacja, parking, preferowany obszar i stan umeblowania.
Każda kolumna reprezentuje indywidualną obserwację lub nieruchomość. Zielone paski wskazują, w jakim stopniu każda obserwacja jest uważana za odstającą dla każdej zmiennej; wyższe paski wskazują, że obserwacja jest bardziej uważana za odstającą.
Identyfikacja obserwacji odstających w danych liczbowych przy założeniu, że wartość bezwzględna wieksza niż 3:
kolumny <- c("price", "area", "bedrooms", "bathrooms", "stories", "parking")
conditions <- as.data.frame(lapply(dane[, kolumny], function(x) abs(scale(x)) > 3))
summary(conditions)
## price area bedrooms bathrooms
## Mode :logical Mode :logical Mode :logical Mode :logical
## FALSE:539 FALSE:538 FALSE:543 FALSE:534
## TRUE :6 TRUE :7 TRUE :2 TRUE :11
## stories parking
## Mode :logical Mode :logical
## FALSE:545 FALSE:545
##
Cena: 6 wartosci odstajacych z 545 nieruchomosci
Powierzchnia: 7 wartosci odstajacych z 545 nieruchomosci
Sypialnie: 2 wartosci odstajace z 545 nieruchomosci
Lazienki: az 11 wartosci odstajacych z 545 nieruchomosci
Pietra: brak wartosci odstajacych - wszystkie nieruchomosci maja podobna liczbe pieter
Parking: brak wartosci odstajacych - wszystkie nieruchomosci maja podobna liczbe miejsc parkingowych
W celu dalszej analizy i potwierdzenia obserwacji odstających, przeprowadzamy test Grubbsa (test T). Test ten pozwoli nam sprawdzić, czy istnieją wartości odstające w zmiennej price (cena) w naszych danych.
#Test Grubbsa dla zmiennej price (cena)
grubbs.test(dane$price)
##
## Grubbs test for one outlier
##
## data: dane$price
## G = 4.56217, U = 0.96167, p-value = 0.001126
## alternative hypothesis: highest value 53.2 is an outlier
Test Grubbsa jest stosowany do wykrywania pojedynczych wartości odstających w zestawie danych.
Wyniki testu Grubbsa można zinterpretować następująco:
G = 4.56217: To jest statystyka testowa Grubbsa. Jeżeli jest duża, sugeruje to, że dane mogą zawierać wartość odstającą.
U = 0.96167: To jest zmodyfikowana statystyka Grubbsa, która jest używana do obliczenia p-wartości.
p-value = 0.001126: To jest p-wartość testu. Jeżeli jest mała (zazwyczaj poniżej 0.05), odrzucamy hipotezę zerową, która zakłada, że nie ma wartości odstających. W tym przypadku, p-wartość jest mała (0.001126), więc odrzucamy hipotezę zerową i stwierdzamy, że jest co najmniej jedna wartość odstająca.
alternative hypothesis: highest value 53.2 is an outlier: To jest alternatywna hipoteza, która jest przyjmowana, gdy odrzucamy hipotezę zerową. W tym przypadku, sugeruje ona, że najwyższa wartość (53.2) jest wartością odstającą.
Poniżej Test Grubbsa dla pozostalych zmiennych:
grubbs.test(dane$area)
##
## Grubbs test for one outlier
##
## data: dane$area
## G = 5.09159, U = 0.95226, p-value = 7.038e-05
## alternative hypothesis: highest value 1505.0286 is an outlier
grubbs.test(dane$bedrooms)
##
## Grubbs test for one outlier
##
## data: dane$bedrooms
## G = 4.11192, U = 0.96886, p-value = 0.009358
## alternative hypothesis: highest value 6 is an outlier
grubbs.test(dane$bathrooms)
##
## Grubbs test for one outlier
##
## data: dane$bathrooms
## G = 5.40085, U = 0.94628, p-value = 1.205e-05
## alternative hypothesis: highest value 4 is an outlier
grubbs.test(dane$stories)
##
## Grubbs test for one outlier
##
## data: dane$stories
## G = 2.52970, U = 0.98821, p-value = 1
## alternative hypothesis: highest value 4 is an outlier
grubbs.test(dane$parking)
##
## Grubbs test for one outlier
##
## data: dane$parking
## G = 2.6770, U = 0.9868, p-value = 1
## alternative hypothesis: highest value 3 is an outlier
Obserwujemy dane odstajace w zmiennych: price (wczesniej wymienione), area, bedrooms i bathrooms. W przypadku zmiennych stories oraz parking nie zaobserwowano wartosci odstajacych.
W tej części opracowano wizualizację danych w postaci: wizualizacja ilości, wizualizacja rozkładów, wizualizacja proporcji, wizualizacja trendów.
W celu lepszego zrozumienia rozkładu zmiennych ilościowych w naszych danych, generujemy histogramy dla poszczególnych zmiennych. Histogramy te pomagają nam zobaczyć, jak często występują różne wartości oraz jak rozkładają się obserwacje na osi liczbowej dla poszczególnych cech.
library(gridExtra)
# histogramy dla zmiennych ilościowych
plot1 <- ggplot(dane, aes(x = area)) +
geom_histogram(colour = "black", fill = "#FFFF99", bins = 10) +
labs(title = "Area",
x = "metry kwadratowe", y = "n") +
theme(plot.title = element_text(hjust = 0.5, size = 12))
plot2 <- ggplot(dane, aes(x = bedrooms)) +
geom_histogram(colour = "black", fill = "#FFFF99", bins = 10) +
labs(title = "Bedrooms",
x = "liczba", y = "n") +
theme(plot.title = element_text(hjust = 0.5, size = 12))
plot3 <- ggplot(dane, aes(x = bathrooms)) +
geom_histogram(colour = "black", fill = "#FFFF99", bins = 10) +
labs(title = "Bathrooms",
x = "liczba", y = "n") +
theme(plot.title = element_text(hjust = 0.5, size = 12))
plot4 <- ggplot(dane, aes(x = stories)) +
geom_histogram(colour = "black", fill = "#FFFF99", bins = 10) +
labs(title = "Stories",
x = "liczba", y = "n") +
theme(plot.title = element_text(hjust = 0.5, size = 12))
plot5 <- ggplot(dane, aes(x = parking)) +
geom_histogram(colour = "black", fill = "#FFFF99", bins = 10) +
labs(title = "Parking",
x = "liczba", y = "n") +
theme(plot.title = element_text(hjust = 0.5, size = 12))
grid.arrange(plot1, plot2, plot3, plot4, plot5, nrow = 2)
W przypadku powierzchni również mamy asymetrię prawostronną. Pozostałe zmienne to zmienne skokowe (przyjmujące tylko całkowite wartości), przy tak małym zakresie osiąganych wartości można je też potraktować jak zmienne jakościowe.
W tym rozdziale analizujemy zmienne objaśniające wśród zbioru nieruchomości. Dla każdej zmiennej przeprowadzamy analizę procentową, aby zobaczyć jak często występują różne kategorie w danych.
Poniższy kod generuje wykresy słupkowe dla kilku zmiennych objaśniających, w tym: mainroad, guestroom, basement, hotwaterheating, airconditioning, prefarea, oraz furnishingstatus.
# wykres słupkowy dla zmiennej mainroad
tab <- as.data.frame(100*prop.table(table(dane$mainroad)))
plot1 <- ggplot(tab, aes(x = Var1, y = Freq)) +
geom_col(fill = "#FFFF99", colour = "black") +
geom_text(aes(label = paste0(round(Freq,1),"%")),
stat = "identity", size = 4,
fontface = "bold", position = position_stack(vjust = 0.5)) +
theme(axis.title.x = element_blank(),
axis.text.x = element_text(colour = "black", size = 10),
plot.title = element_text(hjust = 0.5, size = 12)) +
labs(title = "Mainroad",
y = "%")
# wykres słupkowy dla zmiennej guestroom
tab <- as.data.frame(100*prop.table(table(dane$guestroom)))
plot2 <- ggplot(tab, aes(x = Var1, y = Freq)) +
geom_col(fill = "#FFFF99", colour = "black") +
geom_text(aes(label = paste0(round(Freq,1),"%")),
stat = "identity", size = 4,
fontface = "bold", position = position_stack(vjust = 0.5)) +
theme(axis.title.x = element_blank(),
axis.text.x = element_text(colour = "black", size = 10),
plot.title = element_text(hjust = 0.5, size = 12)) +
labs(title = "Guestroom",
y = "%")
# wykres słupkowy dla zmiennej basement
tab <- as.data.frame(100*prop.table(table(dane$basement)))
plot3 <- ggplot(tab, aes(x = Var1, y = Freq)) +
geom_col(fill = "#FFFF99", colour = "black") +
geom_text(aes(label = paste0(round(Freq,1),"%")),
stat = "identity", size = 4,
fontface = "bold", position = position_stack(vjust = 0.5)) +
theme(axis.title.x = element_blank(),
axis.text.x = element_text(colour = "black", size = 10),
plot.title = element_text(hjust = 0.5, size = 12)) +
labs(title = "Basement",
y = "%")
# wykres słupkowy dla zmiennej hotwaterheating
tab <- as.data.frame(100*prop.table(table(dane$hotwaterheating)))
plot4 <- ggplot(tab, aes(x = Var1, y = Freq)) +
geom_col(fill = "#FFFF99", colour = "black") +
geom_text(aes(label = paste0(round(Freq,1),"%")),
stat = "identity", size = 4,
fontface = "bold", position = position_stack(vjust = 0.5)) +
theme(axis.title.x = element_blank(),
axis.text.x = element_text(colour = "black", size = 10),
plot.title = element_text(hjust = 0.5, size = 12)) +
labs(title = "Hotwaterheating",
y = "%")
# wykres słupkowy dla zmiennej airconditioning
tab <- as.data.frame(100*prop.table(table(dane$airconditioning)))
plot5 <- ggplot(tab, aes(x = Var1, y = Freq)) +
geom_col(fill = "#FFFF99", colour = "black") +
geom_text(aes(label = paste0(round(Freq,1),"%")),
stat = "identity", size = 4,
fontface = "bold", position = position_stack(vjust = 0.5)) +
theme(axis.title.x = element_blank(),
axis.text.x = element_text(colour = "black", size = 10),
plot.title = element_text(hjust = 0.5, size = 12)) +
labs(title = "Airconditioning",
y = "%")
# wykres słupkowy dla zmiennej prefarea
tab <- as.data.frame(100*prop.table(table(dane$prefarea)))
plot6 <- ggplot(tab, aes(x = Var1, y = Freq)) +
geom_col(fill = "#FFFF99", colour = "black") +
geom_text(aes(label = paste0(round(Freq,1),"%")),
stat = "identity", size = 4,
fontface = "bold", position = position_stack(vjust = 0.5)) +
theme(axis.title.x = element_blank(),
axis.text.x = element_text(colour = "black", size = 10),
plot.title = element_text(hjust = 0.5, size = 12)) +
labs(title = "Prefarea",
y = "%")
# wykres słupkowy dla zmiennej furnishingstatus
tab <- as.data.frame(100*prop.table(table(dane$furnishingstatus)))
plot7 <- ggplot(tab, aes(x = Var1, y = Freq)) +
geom_col(fill = "#FFFF99", colour = "black") +
geom_text(aes(label = paste0(round(Freq,1),"%")),
stat = "identity", size = 4,
fontface = "bold", position = position_stack(vjust = 0.5)) +
theme(axis.title.x = element_blank(),
axis.text.x = element_text(colour = "black", size = 10),
plot.title = element_text(hjust = 0.5, size = 12)) +
labs(title = "Furnishingstatus",
y = "%")
# wykres wspólny
grid.arrange(plot1, plot2, plot3, plot4, plot5, plot6, plot7, nrow = 4)
Mamy duże dysproporcje w rozkładzie kategorii poszczególnych zmiennych.
Wizualizacja rozkładów jest kluczowa dla zrozumienia charakterystyki danych. W tym dziale omówimy różne metody wizualizacji, takie jak histogramy czy wykresy gęstości, które pomagają zobaczyć kształt i właściwości rozkładu danych. Dzięki tym narzędziom jesteśmy w stanie ocenić istotność posiadanych danych.
Poniżej przedstawiamy analizę rozkładu cen nieruchomości w zależności od różnych cech, takich jak liczba sypialni, łazienek czy pięter. Histogramy prezentują, jak ceny zmieniają się w zależności od tych cech, co pomaga zrozumieć ich wpływ na wartość nieruchomości.
# Tworzenie histogramu wzgledem liczby sypialni
ggplot(dane, aes(x = bedrooms, y = price, fill = factor(bedrooms))) +
geom_histogram(stat = "identity", position = "dodge", color = "black") +
labs(title = "Rozkład cen względem liczby sypialni", x = "Liczba sypialni", y = "Cena") +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
# Tworzenie histogramu wzgledem liczby lazienek
ggplot(dane, aes(x = bathrooms, y = price, fill = factor(bathrooms))) +
geom_histogram(stat = "identity", position = "dodge", color = "black")+
labs(title = "Rozkład cen względem liczby lazienek", x = "Liczba lazienek", y = "Cena") +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
# Tworzenie histogramu wzgledem liczby pieter
ggplot(dane, aes(x = stories, y = price, fill = factor(stories))) +
geom_histogram(stat = "identity", position = "dodge", color = "black") +
labs(title = "Rozkład cen względem liczby pięter", x = "Liczba pięter", y = "Cena") +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
# Tworzenie histogramu cen względem głównej drogi (mainroad)
ggplot(dane, aes(x = mainroad, y = price, fill = factor(mainroad))) +
geom_histogram(stat = "identity", position = "dodge", color = "black") +
labs(title = "Rozkład cen względem głównej drogi", x = "Główna droga (1=Tak, 0=Nie)", y = "Cena") +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
# Tworzenie histogramu cen względem pokoju gościnnego (guestroom)
ggplot(dane, aes(x = guestroom, y = price, fill = factor(guestroom))) +
geom_histogram(stat = "identity", position = "dodge", color = "black") +
labs(title = "Rozkład cen względem pokoju gościnnego", x = "Pokój gościnny (1=Tak, 0=Nie)", y = "Cena") +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
# Tworzenie histogramu cen względem piwnicy (basement)
ggplot(dane, aes(x = basement, y = price, fill = factor(basement))) +
geom_histogram(stat = "identity", position = "dodge", color = "black") +
labs(title = "Rozkład cen względem piwnicy", x = "Piwnica (1=Tak, 0=Nie)", y = "Cena") +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
# Tworzenie histogramu cen względem ogrzewania wodą (hotwaterheating)
ggplot(dane, aes(x = hotwaterheating, y = price, fill = factor(hotwaterheating))) +
geom_histogram(stat = "identity", position = "dodge", color = "black") +
labs(title = "Rozkład cen względem ogrzewania wodą", x = "Ogrzewanie wodą (1=Tak, 0=Nie)", y = "Cena") +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
# Tworzenie histogramu cen względem klimatyzacji (airconditioning)
ggplot(dane, aes(x = airconditioning, y = price, fill = factor(airconditioning))) +
geom_histogram(stat = "identity", position = "dodge", color = "black") +
labs(title = "Rozkład cen względem klimatyzacji", x = "Klimatyzacja (1=Tak, 0=Nie)", y = "Cena") +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
# Tworzenie histogramu cen względem parkingu (parking)
ggplot(dane, aes(x = parking, y = price, fill = factor(parking))) +
geom_histogram(stat = "identity", position = "dodge", color = "black") +
labs(title = "Rozkład cen względem parkingu", x = "Parking (1=Tak, 0=Nie)", y = "Cena") +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
# Tworzenie histogramu cen względem preferowanej okolicy (prefarea)
ggplot(dane, aes(x = prefarea, y = price, fill = factor(prefarea))) +
geom_histogram(stat = "identity", position = "dodge", color = "black") +
labs(title = "Rozkład cen względem preferowanej okolicy", x = "Preferowana okolica (1=Tak, 0=Nie)", y = "Cena") +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
# Tworzenie histogramu cen względem statusu umeblowania (furnishingstatus)
ggplot(dane, aes(x = furnishingstatus, y = price, fill = factor(furnishingstatus))) +
geom_histogram(stat = "identity", position = "dodge", color = "black") +
labs(title = "Rozkład cen względem statusu umeblowania", x = "Status umeblowania", y = "Cena") +
theme_minimal() +
scale_fill_brewer(palette = "Set3")
W poniższym fragmencie kodu prezentujemy analizę gęstości cen nieruchomości względem różnych cech, takich jak liczba sypialni, łazienek, pięter itp. Wizualizacje gęstości pomagają zrozumieć, jak zmienia się rozkład cen w zależności od poszczególnych cech nieruchomości.
Gęstość w kontekście analizy danych oznacza, jak często i w jakim stopniu wartości zmiennej (np. ceny nieruchomości) skupiają się w określonych przedziałach. Wykres gęstości pokazuje, jak rozkładają się wartości zmiennej na osi numerycznej, gdzie wyższe wartości oznaczają obszary większego skupienia. Innymi słowy, obszary wyższej gęstości wskazują na większe prawdopodobieństwo wystąpienia wartości w danym przedziale, co pozwala lepiej zrozumieć charakterystykę danych i ich rozkład.
# Wizualizacji gęstości cen względem liczby sypialni
ggplot(dane, aes(x = price, fill = factor(bedrooms))) +
geom_density(alpha = 0.6, color = "black") +
labs(title = "Wizualizacja gęstości cen względem liczby sypialni", x = "Cena", y = "Gęstość") +
theme_minimal()
# Wizualizacji gęstości cen względem liczby łazienek
ggplot(dane, aes(x = price, fill = factor(bathrooms))) +
geom_density(alpha = 0.6, color = "black") +
labs(title = "Wizualizacja gęstości cen względem liczby łazienek", x = "Cena", y = "Gęstość") +
theme_minimal()
# Wizualizacji gęstości cen względem liczby pięter
ggplot(dane, aes(x = price, fill = factor(stories))) +
geom_density(alpha = 0.6, color = "black") +
labs(title = "Wizualizacja gęstości cen względem liczby pięter", x = "Cena", y = "Gęstość") +
theme_minimal()
# Wizualizacji gęstości cen względem dostępu do głównej drogi
ggplot(dane, aes(x = price, fill = factor(mainroad))) +
geom_density(alpha = 0.6, color = "black") +
labs(title = "Wizualizacja gęstości cen względem dostępu do głównej drogi", x = "Cena", y = "Gęstość") +
theme_minimal()
# Wizualizacji gęstości cen względem posiadania pokoju gościnnego
ggplot(dane, aes(x = price, fill = factor(guestroom))) +
geom_density(alpha = 0.6, color = "black") +
labs(title = "Wizualizacja gęstości cen względem posiadania pokoju gościnnego", x = "Cena", y = "Gęstość") + theme_minimal()
# Wizualizacji gęstości cen względem posiadania piwnicy
ggplot(dane, aes(x = price, fill = factor(basement))) +
geom_density(alpha = 0.6, color = "black") +
labs(title = "Wizualizacja gęstości cen względem posiadania piwnicy", x = "Cena", y = "Gęstość") +
theme_minimal()
# Wizualizacji gęstości cen względem posiadania ogrzewania wodą
ggplot(dane, aes(x = price, fill = factor(hotwaterheating))) +
geom_density(alpha = 0.6, color = "black") +
labs(title = "Wizualizacja gęstości cen względem posiadania ogrzewania wodą", x = "Cena", y = "Gęstość") +
theme_minimal()
# Wizualizacji gęstości cen względem posiadania klimatyzacji
ggplot(dane, aes(x = price, fill = factor(airconditioning))) +
geom_density(alpha = 0.6, color = "black") +
labs(title = "Wizualizacja gęstości cen względem posiadania klimatyzacji", x = "Cena", y = "Gęstość") +
theme_minimal()
# Wizualizacji gęstości cen względem posiadania parkingu
ggplot(dane, aes(x = price, fill = factor(parking))) +
geom_density(alpha = 0.6, color = "black") +
labs(title = "Wizualizacja gęstości cen względem posiadania parkingu", x = "Cena", y = "Gęstość") +
theme_minimal()
# Wizualizacji gęstości cen względem preferowanej okolicy
ggplot(dane, aes(x = price, fill = factor(prefarea))) +
geom_density(alpha = 0.6, color = "black") +
labs(title = "Wizualizacja gęstości cen względem preferowanej okolicy", x = "Cena", y = "Gęstość") +
theme_minimal()
# Wizualizacji gęstości cen względem stanu umeblowania
ggplot(dane, aes(x = price, fill = factor(furnishingstatus))) +
geom_density(alpha = 0.6, color = "black") +
labs(title = "Wizualizacja gęstości cen względem stanu umeblowania", x = "Cena", y = "Gęstość") +
theme_minimal()
Gęstość cen względem liczby sypialni Analizujac wykres gestosci ceny wzgledem liczby pokoi mozemy zaobserwowac, ze największa gęstość cen występuje dla mieszkań z jedną sypialnią, cena rośnie wraz ze wzrostem liczby sypialni oraz, że mieszkania z większą liczbą sypialni są rzadziej dostępne na rynku, co jest widoczne na wykresie przez niższą gęstość.
Gęstość cen względem liczby łazienek Największa gęstość cen występuje dla mieszkań z jedną łazienką. W mniejszym stopniu występują mieszkania z kolejno dwoma i trzema łazienkami. Cena nierychomości wzrasta wraz z ilością łazienek, na co mogą mieć wpływ również inne udogodnienia dostęne w nieruchomości.
Gęstość cen względem liczby pięter Wizualizacji gęstości cen względem liczby pięter pokazuje, że mieszania te występują w podobnej ilości. Różnicą, na którą powinniśmy zwrócić uwagę jest cena nieruchomości która rośnie wraz z ilością liczby pięter.Cena wzrasta adekwatnie do ilości pięter.
Gęstość cen względem dostępu do drogi głównej Wizualizacji gęstości cen względem dostępu do głównej drogi wskazuje na znaczną przewagę liczby mieszkań nieposiadających dostępu do drogi nad posiadającymi. Gęstość ceny nie wskazuje, aby był to czynnik mający dużą wartość dla nieruchomości, ceny dla mieszkań z dostępem do drogi głównej są jednak wyższe niż dla tych, które dostępu nie posiadają.
Gęstość cen względem posiadania pokoju gościnnego Analizujac wykres gestosci ceny wzgledem posiadania pokoju gościnnego można zauważyć że gęstość ich występowania jest bardzo podobna. Różnicą między tymi mieszkaniami jest cena, te z pokojem gościnnym są droższe od mieszkań bez pokoju gościnnego. Wpływać na to może między innymi dodatkowa powierzchnia dostępna w mieszkaniu posiadającym to udogodnienie.
Gęstość cen względem posiadania piwnicy Analizujac wykres gestosci ceny wzgledem posiadania piwnycy zauważamy, że zarówno mieszkania z jak i bez piwnicy występują w dużej ilości na rynku nieryuchomości, przewagę stanowią jednak mieszkania bez dostepu do piwnicy. Mieszkania te charakteryzują się również adekwatnie większą ceną na rynku.
Gęstość cen względem posiadania ogrzewania wodą Analizujac wykres gestosci ceny wzgledem posiadania ogrzewania wodą mozna zauważyć, że znaczna przewagę na rynku nieruchomości maja mieszkania, które nie posiadają systemu ogrzewania wodą. Jeśli chodzi o cenę nieruchomości droższe sa mieszkania posiadające taki system ogrzewania.
Gęstość cen względem posiadania klimatyzacji Analizujac wykres gestosci ceny wzgledem zauwazyc można dużą różnicę w gęstości występowania tego udogodnienia, zdecydowanie większą ilość mieszkań na rynku nieruchomości zajmują mieszkania nie posiadające klimatyzacji. Wykres wskazuje również na znacznie wyższe ceny nieruchomosci, które klimatyzacje posiadają.
Gęstość cen względem posiadania parkingu Analizujac wykres gestosci ceny wzgledem posiadania miejsca parkingowego możemy zauważyć że najwiekszą gestością charakteryzują sie mieszkania bez żadnego miejsca parkingowego. Podobna ęstść występuje dla mieszkań posiadających jedno, dwa bądź trzy miejsca parkingowe. Nie można jednoznacznie stwierdzić jaka ilosć miejsc parkingowych najbardziej podbija cene nieruchomości, jednakże zdecydowanie można stwierdzić że ceny mieszkań posiadających przynajmniej jedno miejsce parkingowe sa wyższe niż ceny mieszkań, które żadnego miejsca parkingowego nie posiadają.
Gęstość cen względem preferowanej okolicy Analizujac wykres gestosci ceny wzgledem preferowanej okolicy zauważyc można przewagę nieruchoości, które w preferowanej okolicy się nie znajdują. Jeśli chodzi o cene nieruchomości względem miejsca, znacznie wyższymi cenami charakteryzują sie nieruchomości znajdujące się w preferowanej okolicy.
Gęstość cen względem stanu umeblowania Analizujac wykres gestosci ceny wzgledem stanu umeblowania zauwazamy, że mieszkania nieumeblowane i wpółumeblowane zdecydowanie przeważaja nad mieszkaniami które są umeblowane w pełni. Analizując również ceny tych nieruchomości widać, że im bardziej mieszkanie jest umeblowane tym wyższa jest jego wartość.
Wizualizacja proporcji przedstawia różne rodzej wykresów, m.in. wykres słupkowy, wykres bąbelkowy, etc. mające na celu przedstawienie zależności między różnymi zmiennymi. Wykresy te przedstawiają proporcje zmiennych.
library(dplyr)
library(ggplot2)
dane_wiz <- dane
dane_wiz <- reshape2::melt(dane_wiz, id.vars = c("price", "area"))
dane_wiz <- dplyr::count(dane_wiz, variable, value)
dane_wiz <- dplyr::mutate(dane_wiz, percentage = n / sum(n))
#Stwórz wykres
wykres <- ggplot2::ggplot(dane_wiz, ggplot2::aes(x = value, y = percentage, fill = variable))
wykres <- wykres + ggplot2::geom_bar(stat = "identity", position = "dodge")
wykres <- wykres + ggplot2::facet_wrap(~variable, scales = "free", ncol = 4)
wykres <- wykres + ggplot2::theme_minimal()
wykres <- wykres + ggplot2::labs(x = "Wartości", y = "Proporcja (%)", fill = "Zmienna (kolumna)", title = "Proporcje zmiennych w zbiorze danych")
print(wykres)
Powyższa wizualizacja proporcji nie uwzględnia zmiennej price oraz zmiennej area. Ponizej wizualizacja z uwzględnieniem tych dwóch zmiennych, jednak ze względu na chatakterystykę danych, z podziałem na 3 przedziały. Wykres pokazuje, jak różne wartości różnych zmiennych są rozłożone w zbiorze danych. Można na nim łatwo zobaczyć, które wartości dominują, a które występują rzadziej. Ponadto, dzięki facetowaniu, można porównać rozkłady różnych zmiennych na osobnych panelach, co ułatwia analizę danych. Przykładowo dla pierwszego wykresu widzimy przewagę ilosci nieruchomosci z klimatyzacją nad nieruchomosciami, które klimatyzacji nie posiadają. Drugi wykres wskazuje, że udział w rynku nieruchomosci mieszkań bez piwnicy jest wyższy niż dla mieszkań które te piwnicę posiadają. Jesli chodzi o wykres przedstawiający ilosć lazienek zauwazamy, że trendują mieszkania posiadające jedną łazienkę, w przypadku sypialni najczęściej w nieruchomościach znajdują się 3.
library(dplyr)
library(ggplot2)
dane_proporcje <- dane %>%
mutate(price_category = cut(price, breaks = 3),
area_category = cut(area, breaks = 3)) %>%
count(price_category, area_category) %>%
mutate(percentage = n / sum(n))
#Tworzenie wizualizacji proporcji dla każdej kategorii
ggplot(dane_proporcje, aes(x = price_category, y = area_category, fill = percentage)) +
geom_tile() +
scale_fill_gradient(low = "lightblue", high = "darkblue") +
labs(x = "price", y = "area", fill = "Proporcje (%)") +
theme_minimal() +
ggtitle("Proporcje w zależności od ceny i powierzchni")
Powyższa mapa cieplna jest wizualizacją proporcji zmiennych price i area. Oś x przedstawia ceny (price z podzialem na 3 przedziały, natomiast oś y przedstawia zmienną area również z podziałem na 3 przedziały. Większość danych dotyczy nieruchomości o średniej cenie i sredniej powierzchni. Najmniej danych (blisko 0%) dotyczy nieruchomości o niskiej cenie i dużej powierzchni oraz o wysokiej cenie i małej powierzchni.
dane %>%
ggplot(aes(price, area,size = bathrooms, color = factor(stories))) +
labs(x = "Cena",
y = "Powierzchnia",
size = "Liczba sypialni \n(rozmiar punktorow)",
color = "Liczba lazienek \n(kolor punktorow)") +
geom_point(alpha = 0.8)
Powyższy wykres punktowy, wizualizuje zależność między ceną a powierzchnią nieruchomości. Rozmiar punktów reprezentuje liczbę sypialni, a kolor wskazuje na liczbę łazienek. Możemy zauważyć, że istnieje koncentracja nieruchomości o niższych cenach i mniejszych powierzchniach. Nieruchomości z większą liczbą łązienek są zazwyczaj większe i droższe. Nie ma wyraźnej liniowej zależności między ceną a powierzchnią, co wskazuje na zmieność cen nieruchomości i wskazuje, że inne czynniki, również wpływają na cenę.
Wykres rozrzutu (scatter plot) jest jednym z podstawowych narzędzi do analizy trendów w danych. Wizualizuje relacje miedzy dwoma zmienymi, w tym przypadku powierzchni do ceny co moze pomoc w indenyfkacji trendów.
# wykres rozrzutu
ggplot(dane, aes(x = area, y = price)) +
geom_point() +
geom_smooth(method = "lm", se = FALSE)
Mamy tutaj zależność dodatnią, czym większa powierzchnia domu, tym wyższa cena. Jednak układ punktów nie wskazuje na ściśły związek liniowy. Ponieważ jednak nie ma tu też zależności nieliniowej.
W naszym zbiorze danych występują zmienne ilościowe: price, area, bedrooms, bathrooms, stories, parking; oraz zmienne jakościowe: mainroad, guestroom, basement, hotwaterheating, airconditioning, prefarea, furnishingstatus.
Poniższy kod ma na celu przekształcenie danych na formaty numeryczne, aby umożliwić przeprowadzenie dalszej analizy.
# Przekształcenie danych jakościowych
dane$mainroad <- as.numeric(dane$mainroad)
dane$guestroom <- as.numeric(dane$guestroom)
dane$basement <- as.numeric(dane$basement)
dane$hotwaterheating <- as.numeric(dane$hotwaterheating)
dane$airconditioning <- as.numeric(dane$airconditioning)
dane$prefarea <- as.numeric(dane$prefarea)
dane$furnishingstatus <- as.numeric(dane$furnishingstatus)
# Przekształcenie danych numerycznych (jeśli wymaga tego analiza)
dane$price <- as.numeric(dane$price)
dane$area <- as.numeric(dane$area)
dane$bedrooms <- as.numeric(dane$bedrooms)
dane$bathrooms <- as.numeric(dane$bathrooms)
dane$stories <- as.numeric(dane$stories)
dane$parking <- as.numeric(dane$parking)
Poniższy wykres słupkowy przedstawia rozkład cen mieszkań.
# Tworzenie wykresu słupkowego
wykres_slupkowy <- ggplot(dane, aes(x = price)) +
geom_bar(fill = "skyblue", color = "black") +
labs(title = "Rozkład cen mieszkań", x = "Cena (w mln PLN)", y = "Liczba mieszkań") +
theme_minimal()
# Wyświetlenie wykresu
print(wykres_slupkowy)
Na podstawie wykresy, jesteśmy w stanie stwierdzić, iż dostępne jest znacznie więcej nieruchomości poniżej 30 mln PLN niż w przedziale powyżej 30 mln PLN.
Za pomocą Metody Sturgesa, wyznaczamy przedziały dla zmiennej price
# Dane do analizy
ceny_mieszkan <- dane$price
# Wykorzystanie metody Sturgesa do automatycznego wyznaczenia liczby przedziałów
liczba_przedzialow <- nclass.Sturges(ceny_mieszkan)
# Wykorzystanie liczby przedziałów w funkcji cut()
przedzialy <- cut(ceny_mieszkan, breaks = liczba_przedzialow)
table(przedzialy)
## przedzialy
## (6.95,11.2] (11.2,15.4] (15.4,19.6] (19.6,23.8] (23.8,28] (28,32.2]
## 53 152 140 83 53 28
## (32.2,36.4] (36.4,40.6] (40.6,44.8] (44.8,49] (49,53.2]
## 21 9 1 4 1
Powyższa Metoda Sturgesa pozwoliła nam na wyznaczenie przedziałów dla zmiennej price, które zostaną wykorzystane w tabeli liczności oraz TAI przedstawione poniżej.
Metoda Sturgesa wyznaczyła nam 11 przedziałów zastosowane w poniższym kodzie.
W rozdziale tym analizujemy ceny mieszkań, wykorzystując technikę TAI (Tabela Aktywności Informacyjnej).
W pierwszym fragmencie kodu dokonujemy przekształcenia cen mieszkań na zakresy cenowe. Następnie generowana jest tabela liczności przedstawiająca liczbę mieszkań w poszczególnych przedziałach cenowych.
W drugim fragmencie kodu prezentujemy tabelę liczności w czytelnej formie, a także przeprowadzamy analizę zależności między cenami mieszkań a ich występowaniem w różnych przedziałach cenowych przy użyciu techniki TAI.
# Przekształcenie cen mieszkań na zakresy zgodne z projektem2
etykiety_projekt2 <- c("(6.95,11.2] mln PLN","(11.2,15.4] mln PLN", "(15.4,19.6] mln PLN", "(19.6,23.8] mln PLN", "(23.8,28] mln PLN", "(28,32.2] mln PLN", "(32.2,36.4] mln PLN", "(36.4,40.6] mln PLN", "(40.6,44.8] mln PLN", "(44.8,49] mln PLN", "(49,53.2] mln PLN")
limits_projekt2 <- cut(dane$price, c(6.95, 11.2, 15.4, 19.6, 23.8, 28, 32.2, 36.4, 40.6, 44.8, 49, 53.2), labels = etykiety_projekt2)
tabela2 <- freq(limits_projekt2, type = "html")
##
|
| | 0%
|
|======================================================================| 100%
kbl(tabela2, caption = "Mieszkania - ceny w PLN") %>%
kable_material(c("striped", "hover"))
|
tab2 <- classIntervals(dane$price, n = 11, style = "fixed", fixedBreaks = c(6.95, 11.2, 15.4, 19.6, 23.8, 28, 32.2, 36.4, 40.6, 44.8, 49, 53.2))
jenks.tests(tab2)
## # classes Goodness of fit Tabular accuracy
## 11.0000000 0.9752304 0.8248048
Otrzymane wartości w wyniku testu Jena to oprócz classes, które informuje o ilości przedziałów(11 przedziałów), Goodness of fit(Jest to miara dobrej dopasowania danych do podziału na klas)o wartości 0.9752304 wskazuje na to, jak dobrze dane pasują do podziału na trzy klasy cenowe. Im bliżej wartości 1, tym lepsze dopasowanie.Tabular accuracy (TAI), jako miara dokładności tabeli częstości w odniesieniu do danych, przedstawia wartość 0.8248048, która oznacza, jak dobrze tabela częstości odzwierciedla rzeczywisty rozkład danych. Im bliżej wartości 1, tym dokładniejsza jest tabela częstości.
Wartości te wskazują na dobre dopasowanie podziału cen mieszkań na trzy przedziały oraz na poprawność tabelaryczną w odniesieniu do tych danych
Dzięki wykresie pudełkowym, otrzymaliśmy rozkład cen mieszkań w różnych kategoriach stanu umeblowania, co pozwala porównać mediany, kwartyle i zakresy cen mieszkań między różnymi kategoriami:
Nieumeblowane mieszkania: Mediana ceny wynosi około 20 mln PLN. Pierwszy i trzeci kwartyl są blisko mediany, co wskazuje na mniejszą zmienność cen. Istnieją wartości odstające powyżej 30 mln PLN.
Średnio umeblowane mieszkania: Mediana ceny wynosi około 25 mln PLN. Pierwszy i trzeci kwartyl są bardziej rozproszone niż dla nieumeblowanych mieszkań, co wskazuje na większą zmienność cen. Istnieje kilka wartości odstających powyżej 30 mln PLN.
Całkowicie umeblowane mieszkania: Mediana ceny wynosi również około 25 mln PLN. Zakres międzykwartylny jest szeroki, z pierwszym kwartylem poniżej 20 mln PLN i trzecim kwartylem powyżej 30 mln PLN, co wskazuje na dużą zmienność cen. Istnieje kilka wartości odstających powyżej 40 mln PLN.
W tym rozdziale przedstawimy te same wykresy, ale z wykorzystaniem pakietów ggplot2 i ggpubr.
Ggplot2 pozwala na pokazanie średniej wartości dla każdej grupy. Wykres przedstawia rozkład cen mieszkań w zależności od ich umeblowania: nieumeblowane, średnio umeblowane i umeblowane. Mieszkania umeblowane są zazwyczaj droższe, co widać po wyższej średniej cenie. Wykres gęstości pokazuje znaczne pokrywanie się cen pomiędzy różnymi kategoriami, co wskazuje na różnorodność cen w ramach każdego statusu umeblowania.
Wykres przedstawia rozkład cen nieruchomości (price) w zależności od ich bliskości do głównej drogi (mainroad), z podziałem na preferowane i niepreferowane obszary. Czerwone punkty reprezentują średnią cenę dla każdej kategorii. Wydaje się, że średnia cena nieruchomości jest wyższa, gdy nieruchomość znajduje się blisko głównej drogi, niezależnie od preferencji obszaru.
Wydaje się, że jest mniej nieruchomości w preferowanym obszarze, które nie mają dostępu do głównej drogi (mainroad=0). Można to interpretować jako wskazówkę, że większość nieruchomości w preferowanych obszarach ma dostęp do głównej drogi.
Wykres przedstawia zależność między ceną nieruchomości (price) a liczbą łazienek (bathrooms), z podziałem na status umeblowania (furnishingstatus). Czarne punkty reprezentują poszczególne nieruchomości. Dla nieruchomości “nieumeblowane” i “średnio umeblowane”, ceny generalnie rosną wraz ze wzrostem liczby łazienek. Dla nieruchomości “umeblowane”, ceny wydają się być podobne niezależnie od liczby łazienek, ale są generalnie wyższe w porównaniu do innych kategorii umeblowania.
W dziale dotyczącym statystyki opisowej, skupiamy się na analizie i prezentacji podstawowych charakterystyk danych. Statystyka opisowa umożliwia zrozumienie podstawowej struktury danych oraz cech ich rozkładu.
Poniższy chunk przedstawia podsumowanie głównych statystyk dla poszczególnych zmiennych w zbiorze danych. Jest to szybki sposób na uzyskanie ogólnego oglądu danych, obejmujący m.in. średnie, mediany, wartości minimalne i maksymalne oraz kwartyle.
summary(dane)
## price area bedrooms bathrooms
## Min. : 7.00 Min. : 153.3 Min. :1.000 Min. :1.000
## 1st Qu.:13.72 1st Qu.: 334.5 1st Qu.:2.000 1st Qu.:1.000
## Median :17.36 Median : 427.4 Median :3.000 Median :1.000
## Mean :19.07 Mean : 478.5 Mean :2.965 Mean :1.286
## 3rd Qu.:22.96 3rd Qu.: 590.9 3rd Qu.:3.000 3rd Qu.:2.000
## Max. :53.20 Max. :1505.0 Max. :6.000 Max. :4.000
## stories mainroad guestroom basement
## Min. :1.000 Min. :0.0000 Min. :0.000 Min. :0.0000
## 1st Qu.:1.000 1st Qu.:1.0000 1st Qu.:0.000 1st Qu.:0.0000
## Median :2.000 Median :1.0000 Median :0.000 Median :0.0000
## Mean :1.806 Mean :0.8587 Mean :0.178 Mean :0.3505
## 3rd Qu.:2.000 3rd Qu.:1.0000 3rd Qu.:0.000 3rd Qu.:1.0000
## Max. :4.000 Max. :1.0000 Max. :1.000 Max. :1.0000
## hotwaterheating airconditioning parking prefarea
## Min. :0.00000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.00000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.00000 Median :0.0000 Median :0.0000 Median :0.0000
## Mean :0.04587 Mean :0.3156 Mean :0.6936 Mean :0.2349
## 3rd Qu.:0.00000 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:0.0000
## Max. :1.00000 Max. :1.0000 Max. :3.0000 Max. :1.0000
## furnishingstatus
## nieumeblowane :178
## średnio umeblowane:227
## umeblowane :140
##
##
##
price - Średnia cena badanych nieruchomości to 19.1 mln PLN. Dla połowy nieruchomości cena nie przekracza 17.36 mln PLN Najniższa zaobserwowana wartość to 7, a najwyższa aż 53.2 mln dolarów. area - Średnia powierzchnia to 478.5 m2. Najmniejsza nieruchomość ma powierzchnię 153.3 m2 a największa 1503 m2. Dla połowy nieruchomości powierzchnia nie przekracza 427.4m2. bedrooms - Nieruchomości mają od 1 do 6 sypialni, połowa z nich nie ma więcej niż 3 sypialnie. bathrooms - Nieruchomości mają od 1 do 4 łazienki, jednak połowa z nich ma jedynie 1 łazienkę stories - Nieruchomości mają od 1 do 4 pięter, połowa z nich nie ma więcej niż 2 pięter. mainroad - Większość nieruchomości ma dostęp do drogi głównej. guestroom - Większość nieruchomości nie posiada pokoju gościnnego. basement - Większość nieruchomości nie posiada piwnicy hotwaterheating - Większość nieruchomości nie ma systemu podgrzewania wody airconditioning - Większość nieruchomości nie ma klimatyzacji parking - Nieruchomości mają liczbę miejsc parkingowych od 0 do 3 jednak większość z nich, nie posiada miejsca parkingowego. furnishingstatus - Istnieje 178 nieruchomości nieumeblowanych, 227 nieruchomości średnio umeblowanych, oraz 140 nieruchomości całkowicie umeblowanych.
Funkcja describe w przeciwieństwie do funkcji summmary jest bardziej szczegółowa i dostarcza informacje takie jak: odchylenie standardowe, skośność, kurtozę oraz inne miary opisowe.
describe(dane)
## vars n mean sd median trimmed mad min max
## price 1 545 19.07 7.48 17.36 18.24 6.23 7.00 53.20
## area 2 545 478.50 201.61 427.35 456.01 191.46 153.29 1505.03
## bedrooms 3 545 2.97 0.74 3.00 2.93 0.00 1.00 6.00
## bathrooms 4 545 1.29 0.50 1.00 1.21 0.00 1.00 4.00
## stories 5 545 1.81 0.87 2.00 1.66 1.48 1.00 4.00
## mainroad 6 545 0.86 0.35 1.00 0.95 0.00 0.00 1.00
## guestroom 7 545 0.18 0.38 0.00 0.10 0.00 0.00 1.00
## basement 8 545 0.35 0.48 0.00 0.31 0.00 0.00 1.00
## hotwaterheating 9 545 0.05 0.21 0.00 0.00 0.00 0.00 1.00
## airconditioning 10 545 0.32 0.47 0.00 0.27 0.00 0.00 1.00
## parking 11 545 0.69 0.86 0.00 0.59 0.00 0.00 3.00
## prefarea 12 545 0.23 0.42 0.00 0.17 0.00 0.00 1.00
## furnishingstatus* 13 545 1.93 0.76 2.00 1.91 1.48 1.00 3.00
## range skew kurtosis se
## price 46.20 1.21 1.91 0.32
## area 1351.74 1.31 2.69 8.64
## bedrooms 5.00 0.49 0.70 0.03
## bathrooms 3.00 1.58 2.12 0.02
## stories 3.00 1.08 0.65 0.04
## mainroad 1.00 -2.05 2.22 0.01
## guestroom 1.00 1.68 0.82 0.02
## basement 1.00 0.63 -1.61 0.02
## hotwaterheating 1.00 4.33 16.78 0.01
## airconditioning 1.00 0.79 -1.38 0.02
## parking 3.00 0.84 -0.59 0.04
## prefarea 1.00 1.25 -0.44 0.02
## furnishingstatus* 2.00 0.12 -1.27 0.03
Funkcja describe() może być stosowana zarówno do zmiennych ilościowych, jak i jakościowych. Jednakże, dla zmiennych jakościowych, describe() dostarcza jedynie podstawowych informacji, takich jak liczba unikalnych wartości i częstość wystąpień poszczególnych poziomów (częstości). Dla zmiennych ilościowych, funkcja ta zwraca bardziej szczegółowe statystyki opisowe, takie jak średnia, mediana, odchylenie standardowe, skośność, kurtoza itp.
W przyadku analizowanych danych zmienne ilościowe to zmienne: price, area, bedrooms, bathrooms, stories, parking.
zmierzenie tendencji centralnej rozkładu cen
W tym fragmencie kodu przeprowadziłyśmy analizę cen mieszkań w zależności od liczby sypialni. Najpierw dane są sortowane według liczby sypialni, a następnie grupowane. Tworzona jest ramka danych, która jest podstawą dla tabeli prezentującej różne aspekty rozkładu cen. Następnie kod oblicza tendencje centralne dla cen mieszkań, takie jak średnia, mediana i moda. Na koniec tworzona jest tabela zawierająca wykresy pudełkowe, histogramy i wykresy liniowe dla poszczególnych grup cenowych.
| bedrooms | boxplot | histogram | line1 | line2 | points1 | Mean | Median | Mode |
|---|---|---|---|---|---|---|---|---|
| 1 | 19.06692 | 17.36 | 14 | |||||
| 2 | 19.06692 | 17.36 | 14 | |||||
| 3 | 19.06692 | 17.36 | 14 | |||||
| 4 | 19.06692 | 17.36 | 14 | |||||
| 5 | 19.06692 | 17.36 | 14 | |||||
| 6 | 19.06692 | 17.36 | 14 |
Podsumowanie podstawowych miar tendencji centralnej dla cen według liczby sypialni
W poniższym fragmencie kodu wykorzystujemy pakiet gtsummary do wygenerowania tabeli podsumowującej rozkład cen mieszkań w zależności od liczby sypialni. Tabela zawiera podstawowe statystyki opisowe dla zmiennej price, takie jak średnia, odchylenie standardowe, mediana, kwartyle, minimum i maksimum, grupowane według liczby sypialni.
library(gtsummary)
dane %>%
select(price,bedrooms) %>%
tbl_summary(
by=bedrooms,
type = all_continuous() ~ "continuous2",
statistic = all_continuous() ~ c(
"{N_nonmiss}","{mean}","{sd}",
"{median} ({p25}, {p75})",
"{min}, {max}"),
missing = "no",
label = price ~ "Cena") %>%
modify_header(label ~ "**Zmienna**") %>%
modify_caption("**Tabela 1. Rozkład cen wg liczby sypialni**") %>%
bold_labels() %>%
add_p(pvalue_fun = ~ style_pvalue(.x, digits = 2))
| Zmienna | 1, N = 2 | 2, N = 136 | 3, N = 300 | 4, N = 95 | 5, N = 10 | 6, N = 2 | p-value1 |
|---|---|---|---|---|---|---|---|
| Cena | <0.001 | ||||||
| N | 2 | 136 | 300 | 95 | 10 | 2 | |
| Mean | 11 | 15 | 20 | 23 | 23 | 19 | |
| SD | 2 | 4 | 7 | 9 | 10 | 7 | |
| Median (IQR) | 11 (10, 12) | 14 (12, 17) | 18 (15, 24) | 21 (16, 28) | 22 (16, 31) | 19 (17, 22) | |
| Range | 9, 13 | 7, 28 | 7, 49 | 8, 53 | 8, 41 | 14, 24 | |
| 1 Kruskal-Wallis rank sum test | |||||||
1 sypialnia: Średnia cena wynosi 11, z odchyleniem standardowym 2. Mediana wynosi 11, a zakres cen to od 9 do 13. 2 sypialnie: Średnia cena wynosi 15, z odchyleniem standardowym 4. Mediana wynosi 14, a zakres cen to od 7 do 28. 3 sypialnie: Średnia cena wynosi 20, z odchyleniem standardowym 7. Mediana wynosi 18, a zakres cen to od 7 do 49. 4 sypialnie: Średnia cena wynosi 23, z odchyleniem standardowym 9. Mediana wynosi 21, a zakres cen to od 8 do 53. 5 sypialnie: Średnia cena wynosi 23, z odchyleniem standardowym 10. Mediana wynosi 22, a zakres cen to od 8 do 41.
Wynik testu Kruskala-Wallisa jest mniejszy niż 0,001, co wskazuje na istotne statystycznie różnice w cenach między różnymi kategoriami liczby sypialni. W związku z tym, liczba sypialni ma wpływ na cenę mieszkania.
Poniższy chunk ma na celu analizę korelacji między pierwszymi czterema zmiennymi w zbiorze danych. Wykorzystujemy funkcję cor() do obliczenia macierzy korelacji między tymi zmiennymi, a następnie generujemy dwie wizualizacje za pomocą funkcji corrplot(). Pierwsza wizualizacja przedstawia wartości korelacji w postaci liczbowej, natomiast druga wizualizacja pokazuje macierz korelacji w formie kolorowej, co ułatwia analizę wzajemnych zależności między zmiennymi.
Analiza korelacji na wykresie ukazuje powiązania pomiędzy ceną a rozmiarem mieszkania, ilością sypialni, łazienek oraz liczbą pięter. Najwyższa korelacja występuje między ceną a powierzchnią (0.54) oraz ceną a ilością łazienek (0.52), co sugeruje, że istnieje umiarkowany dodatni związek między tymi zmiennymi. Innymi słowy, wzrost ceny często idzie w parze z większą powierzchnią mieszkania i większą liczbą łazienek.
W badaniu dotyczącym cen nieruchomości przeprowadzono szereg testów statystycznych, mających na celu zbadanie związków między cenami a różnymi zmiennymi, w tym powierzchnią mieszkania.
H0: normalność rozkładu
normalnosc_test <- shapiro.test(dane$price)
print(normalnosc_test)
##
## Shapiro-Wilk normality test
##
## data: dane$price
## W = 0.92163, p-value = 3.155e-16
plot.new()
hist(dane$price, freq = FALSE, main = "Histogram zmiennej price z krzywą gęstości", xlab = "price", col="lightblue", ylim = c(0, 0.08))
lines(density(dane$price), col = "blue", lwd = 2)
curve(dnorm(x, mean = mean(dane$price), sd = sd(dane$price)), col = "red", lwd = 2, add = TRUE)
legend("topright", legend = c("Histogram", "Density", "Normal Distribution"), col = c("black", "blue", "red"), lwd = 2)
Powyższy wykres przedstawia histogram zmiennej price z nałożonymi krzywymi gęstości. Histogram pokazuje rozkład cen mieszkań, a krzywe gęstości pomagają ocenić, czy dane mają rozkład normalny.
Histogram: Słupki histogramu reprezentują różne przedziały cen, a ich wysokość wskazuje na częstość występowania cen w danym przedziale. Wygląda na to, że większość cen mieszkań skupia się w dolnym przedziale cenowym, co sugeruje, że większość mieszkań ma niższą cenę. Krzywa gęstości: Niebieska linia reprezentuje krzywą gęstości danych. Pokazuje, że rozkład cen jest prawoskośny, co oznacza, że większość cen mieszkań jest niska, ale istnieje również pewna liczba mieszkań o wyższych cenach. Rozkład normalny: Czerwona linia reprezentuje teoretyczny rozkład normalny dla porównania. Wygląda na to, że rozkład cen nie jest normalny, ponieważ krzywa gęstości nie pokrywa się dobrze z czerwoną linią rozkładu normalnego. Wynik testu Shapiro-Wilka: Wartość W = 0.92163:(statystyka testu Shapiro-Wilka) Wartości bliskie 1 wskazują na to, że dane mają rozkład zbliżony do normalnego. p-value = 3.155e-16 Ponieważ p-value jest znacznie mniejsze od 0,05 (typowego poziomu istotności), odrzucamy hipotezę zerową i wnioskujemy, że dane nie mają rozkładu normalnego.
Poniżej zastosowana funkcja var() służy do obliczania wariancji próbki danych. Jest to miara rozproszenia danych, która określa, jak bardzo wartości w próbce danych rozpraszają się wokół średniej arytmetycznej. Pozwala nam określić, jak bardzo dane różnią się od średniej.
var(dane$price)
## [1] 55.97671
##55.97671
var(dane$area)
## [1] 40647.65
##40647.65
var.test(dane$price, dane$area, alternative="greater")
##
## F test to compare two variances
##
## data: dane$price and dane$area
## F = 0.0013771, num df = 544, denom df = 544, p-value = 1
## alternative hypothesis: true ratio of variances is greater than 1
## 95 percent confidence interval:
## 0.001195813 Inf
## sample estimates:
## ratio of variances
## 0.001377121
Wynik testu wariancji sugeruje, że istnieją istotne różnice w wariancjach między grupami (p < 0,05). Ponadto, wartość F jest bardzo niska (0.0013771), co sugeruje, że wariancje między grupami są bardzo małe w porównaniu do wariancji wewnątrzgrupowej. Możemy więc wnioskować, że wariancje między grupami są istotnie różne, co może mieć istotne konsekwencje dla analizy statystycznej.
Test Wilcoxona, to nieparametryczny test statystyczny wykorzystywany do porównywania dwóch niezależnych prób. Test ten jest używany, gdy nie spełnione są założenia normalności rozkładu danych lub równości wariancji, co dyskwalifikuje zastosowanie testów parametrycznych, takich jak test t-Studenta. Zamiast tego, test Wilcoxona opiera się na rangach danych, co sprawia, że jest bardziej odporny na odstępstwa od normalności.
wilcox.test(dane$price, dane$area)
##
## Wilcoxon rank sum test with continuity correction
##
## data: dane$price and dane$area
## W = 0, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
Test Wilcoxona dla porównania między zmiennymi price (cena) i area (powierzchnia) wykazał bardzo istotną różnicę pomiędzy grupami. Wartość p-value jest bardzo niska (< 2.2e-16), co oznacza, że istnieje istotna różnica w rozkładach obu zmiennych. Alternatywna hipoteza zakłada, że prawdziwa różnica w lokalizacji (medianie) między grupami nie wynosi zero. Wartość statystyki testowej W wynosi 0, co sugeruje, że wartość testu Wilcoxona jest bardzo niska, co oznacza, że rozkłady między zmiennymi różnią się znacząco.
Test Shapiro jest to test statystyczny używany do sprawdzania normalności rozkładu danych. Test ten ocenia, czy próbka pochodzi z populacji o rozkładzie normalnym, czy też nie.
shapiro_test <- shapiro.test(dane$price)
print(shapiro_test)
##
## Shapiro-Wilk normality test
##
## data: dane$price
## W = 0.92163, p-value = 3.155e-16
Wynik testu Shapiro-Wilka dla zmiennej price wskazuje na istotną statystycznie różnicę od rozkładu normalnego (p < 0,05). Oznacza to, że zmienna price nie pochodzi z rozkładu normalnego. Wartość p równa 3.155e-16 jest znacznie mniejsza niż 0,05, co sugeruje, że istnieją istotne odstępstwa od normalności.
shapiro_test_area <- shapiro.test(dane$area)
print(shapiro_test_area)
##
## Shapiro-Wilk normality test
##
## data: dane$area
## W = 0.91129, p-value < 2.2e-16
Wynik testu Shapiro-Wilka dla zmiennej area również wskazuje na istotną statystycznie różnicę od rozkładu normalnego (p < 0,05). Wartość p jest bardzo bliska zeru (mniejsza niż 2.2e-16), co oznacza, że istnieją istotne odstępstwa od normalności.
Celem tych testów jest ustalenie, czy istnieją istotne statystycznie różnice między badanymi grupami, próbami lub warunkami.
Test t-Studenta, test statystyczny wykorzystywany do porównywania średnich dwóch niezależnych prób. Jest stosowany w przypadku, gdy interesuje nas różnica między dwiema średnimi i mamy do czynienia z małymi próbkami oraz gdy założenia normalności rozkładu danych są spełnione. Test ten określa, czy różnice między średnimi są istotne statystycznie.
library(stats)
t_test_result <- t.test(price ~ airconditioning, data = dane)
print(t_test_result)
##
## Welch Two Sample t-test
##
## data: price by airconditioning
## t = -10.659, df = 262.47, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## -8.630878 -5.939369
## sample estimates:
## mean in group 0 mean in group 1
## 16.76776 24.05288
Wynik testu t-studenta wskazuje na istotną statystycznie różnicę między nieruchomościami z i bez klimatyzacji (p < 0,05).
Wartość t = -10.659 oznacza, że istnieje istotna różnica między średnimi cenami nieruchomości w grupach z i bez klimatyzacji. df (stopnie swobody) wynoszące 262.47 oznacza, że stopnie swobody zostały oszacowane na 262.47, co odzwierciedla uwzględnienie nieliniowych efektów. Wartość p < 2.2e-16 oznacza, że istnieje bardzo mała szansa, że obserwowana różnica między grupami jest wynikiem czystego przypadku. Interval ufności 95% (-8.630878, -5.939369) wskazuje, że średnia cena nieruchomości w grupie z klimatyzacją jest prawdopodobnie między -8.63 i -5.94 punktów procentowych niższa niż w grupie bez klimatyzacji. Średnia cena nieruchomości w grupie bez klimatyzacji wynosi 16.77, a w grupie z klimatyzacją wynosi 24.05. W związku z tym można stwierdzić, że istnieje istotna różnica w cenach nieruchomości między grupami z i bez klimatyzacji, przy czym ceny nieruchomości z klimatyzacją są wyższe.
Test anowa (inaczej, analiza wariancji) to test używany do porównywania średnich trzech lub więcej grup, prób lub warunków. Pozwala on określić, czy istnieją istotne statystycznie różnice między co najmniej dwoma grupami pod względem badanej zmiennej.
anova_result <- aov(price ~ bedrooms, data = dane)
summary(anova_result)
## Df Sum Sq Mean Sq F value Pr(>F)
## bedrooms 1 4090 4090 84.25 <2e-16 ***
## Residuals 543 26361 49
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Przeprowadzony test statystyczny ma dużą istotność, nie mamy więc podstaw do odrzucenia hipotezy zerowej. Wartość F jest stosunkowo wysoka (84.25), co wskazuje na istotny efekt grupowy. Oznacza to, że różnice w cenach nieruchomości między grupami sypialni są wystarczająco duże, aby uznać je za istotne statystycznie.Wartość p wynosi mniej niż ustalony poziom istotności (zwykle 0.05), co oznacza, że istnieją statystycznie istotne różnice w cenach nieruchomości między grupami sypialni.
library(ggplot2)
count <- table(dane$furnishingstatus)
df <- data.frame(furnishingstatus = names(count), count = as.numeric(count))
df$percent <- df$count / sum(df$count) * 100
ggplot(df, aes(x = "", y = count, fill = furnishingstatus)) +
geom_bar(width = 1, stat = "identity") +
coord_polar("y", start=0) +
scale_fill_manual(values = c("grey", "lightblue", "darkblue")) + # Ustawiamy kolory
theme_void() +
geom_text(aes(label = paste0(round(percent), "%")), position = position_stack(vjust = 0.5)) + # Dodajemy etykiety procentowe
labs(title = "Udział rodzaju umeblowania") # Dodajemy tytuł
W opracowywanym zbiorze danych istnieje 42% nieruchomości, które są
średnio umeblowane i stanowią one największą grupę nieruchomości spośród
badanych. 33% stanowią nieruchomości nieumeblowane, natomiast jedynie
26% to nieruchomości całkowicie umeblowane.
Wizualizacja rozkładu ilości sypialni względem ceny nieruchomości. Poniższy kod generuje wykresy porównawcze dla różnych zmiennych w ramach jednej analizy. W konkretnym przypadku, funkcja ggbetweenstats() tworzy wykres porównawczy pomiędzy ilością sypialni (zmienna niezależna) a ceną nieruchomości (zmienna zależna), co pozwala ocenić ewentualne związki między tymi zmiennymi.
set.seed(545)
#install.packages("ggstatsplot")
library(ggstatsplot)
ggbetweenstats(
data = dane,
x = bedrooms,
y = price,
title = "Rozkład ilości sypialni względem ceny nieruchomości"
)
Najwyższe piki cenowe zostały odnotowane dla mieszkań posiadających 4 pokoje, niewiele niższą ceną szczycą się mieszkania 3 pokojowe. Mieszkania o większej ilosci pokoi mają niższy rozkład cen, na co wpływać może również obecność innych udogodnień takich jak preferowana okolica, dostęp do piwnicy bądź też klimatyzacja.
Wizualizacja zależności między ceną nieruchomości a jej powierzchnią. Wykorzystuje pakiet ggstatsplot, który umożliwia generowanie wykresów statystycznych. Funkcja ggscatterstats() tworzy wykres rozrzutu, który pozwala zobaczyć, czy istnieje jakakolwiek zależność lub wzorzec między ceną a powierzchnią nieruchomości.
ggscatterstats(
data = dane,
x = price,
y = area,
xlab = "Price",
ylab = "Area",
title = "Zależność ceny od powierzchni"
)
Wykres pokazuje zależność ceny nieruchomkości od jej powierchni. Widać, że najwieszą część rynku stanowią mniejsze nieruchomości w niższych cenach. Ceny mieszkań o powierzchni większej w zdecydowanej większości są wyższe niż tych mniejszych.
Badanie udziału mieszkań na rynku posiadających dostęp do drogi głównej
Dane które zostały przeanaliwane zawarte w zbiorze danych dotyczyły nieruchomosci z agencji nieruchomości. W wielu przypadkach więcej nie oznaczało lepiej pod względem cenowym. Jak się okazuje najdroższe nieruchomości nie posiadały maksymalnej liczby sypialni czy też pięter bądź łazienek. Na cenę zdecydowanie miało wpływ umeblowanie oraz klimatyzacja. Dane były bardzo dokładne oraz “czyste” o czym świadczy chociażby brak brakujących obserwacji czy poprawny zapis danych. Najliczniejszą grupą nieruchomości były te, które posiadały mniej niż 3 sypialnie. Średnia powierzchnia nieruchomości wynosiła 478,5 m^2. Większość nieruchomości nie posiadała piwnic. Dość logiczną, aczkolwiek wartą podkreślenia obserwacją był fakt, że brak podłączenia drogi głównej do nieruchomości obniżał wartość nieruchomości względem tych, kóre wspomniany dostep posiadały.