Analiza danych agencji nieruchomości stanowi kluczowe narzędzie w zrozumieniu dynamicznych aspektów rynku nieruchomości. W ramach tego projektu, przeprowadzimy szczegółową analizę zestawu danych, który zawiera informacje na temat 13 zmiennych istotnych dla charakteryzacji nieruchomości. Te dane obejmują aspekty, takie jak cena nieruchomości, liczba sypialni, łazienek, a także różnorodne udogodnienia i cechy domów.
Celem naszej analizy jest zidentyfikowanie istotnych zależności, które mogą mieć wpływ na ceny nieruchomości. Będziemy badać zarówno zmienne ilościowe, jak i jakościowe, aby uzyskać pełniejszy obraz rynku nieruchomości. Analiza ta może dostarczyć istotnych wskazówek dla agencji nieruchomości, inwestorów czy potencjalnych nabywców, pomagając im podejmować bardziej świadome decyzje.
W pierwszym etapie naszej analizy skoncentrujemy się na procesie czyszczenia danych, co obejmuje identyfikację, zarządzanie i eliminację potencjalnych nieprawidłowości w danych.
Kolejnym krokiem jest zidentyfikowanie obserwacji odstających, ponieważ mogą one wpływać na wynik analizy i prowadzić do błędnych wniosków.
for (col in colnames(agencja)) {
if (is.numeric(agencja[[col]])) {
boxplot(agencja[[col]],
main = paste("Wykres Ramkowy dla", col),
ylab = col,
col = "skyblue",
border = "darkblue",
pch = 19,
cex = 1.5
)
}
}
Cena: Kilka nieruchomości ma znacznie wyższą cenę niż pozostałe, co może świadczyć o ich wysokim standardzie, atrakcyjnej lokalizacji lub innych cechach podnoszących wartość. Powierzchnia: Niektóre nieruchomości mają bardzo dużą powierzchnię, co może oznaczać, że są to domy jednorodzinne lub posiadają dużą ilość pięter. Liczba sypialni: Niektóre nieruchomości mają 5 i 6 sypialni, co jest znacznie więcej niż średnia. Może to być związane z dużą powierzchnią lub specyficznym układem pomieszczeń. Liczba łazienek: Jedna nieruchomość ma 4 łazienki. Może to być związane z dużą liczbą sypialni lub wysokim standardem. Liczba pięter: Kilka nieruchomości ma 4 piętra. Może to oznaczać, że są to domy z poddaszem lub piwnicą. Liczba miejsc parkingowych: Niektóre nieurchomości mają 3 miejsca parkingowe.Może to oznaczać, że są to domy z garażem lub podjazdem.
for (col1 in colnames(agencja)) {
for (col2 in colnames(agencja)) {
if (is.numeric(agencja[[col1]]) && is.numeric(agencja[[col2]]) && col1 != col2) {
plot(agencja[[col1]], agencja[[col2]],
main = paste("Wykres Rozrzutu dla", col1, "i", col2),
xlab = col1, ylab = col2)
}
}
}
conditions <- data.frame(
price = abs(scale(agencja$price)) > 3,
area = abs(scale(agencja$area)) > 3,
bedrooms = abs(scale(agencja$bedrooms)) > 3,
bathrooms = abs(scale(agencja$bathrooms)) > 3,
stories = abs(scale(agencja$stories)) > 3,
parking = abs(scale(agencja$parking)) > 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 z 545 nieruchomości ma cenę, która jest odstająca. Powierzchnia: 7 z 545 nieruchomości ma powierzchnię, która jest odstająca. Liczba sypialni: 2 z 545 nieruchomości ma liczbę sypialni, która jest odstająca. Liczba łazienek: 11 z 545 nieruchomości ma liczbę łazienek, która jest odstająca. Liczba pięter: Żadna z 545 nieruchomości nie ma liczby pięter, która jest odstająca. Może to oznaczać, że wszystkie nieruchomości mają podobną liczbę pięter lub że zmienna stories nie ma rozkładu normalnego. Liczba miejsc parkingowych: Żadna z 545 nieruchomości nie ma liczby miejsc parkingowych, która jest odstająca. Może to oznaczać, że wszystkie nieruchomości mają podobną liczbę miejsc parkingowych lub że zmienna parking nie ma rozkładu normalnego.
library(outliers)
grubbs.test(agencja$price)
##
## Grubbs test for one outlier
##
## data: agencja$price
## G = 4.56217, U = 0.96167, p-value = 0.001126
## alternative hypothesis: highest value 13300000 is an outlier
grubbs.test(agencja$area)
##
## Grubbs test for one outlier
##
## data: agencja$area
## G = 5.09159, U = 0.95226, p-value = 7.038e-05
## alternative hypothesis: highest value 16200 is an outlier
grubbs.test(agencja$bedrooms)
##
## Grubbs test for one outlier
##
## data: agencja$bedrooms
## G = 4.11192, U = 0.96886, p-value = 0.009358
## alternative hypothesis: highest value 6 is an outlier
grubbs.test(agencja$bathrooms)
##
## Grubbs test for one outlier
##
## data: agencja$bathrooms
## G = 5.40085, U = 0.94628, p-value = 1.205e-05
## alternative hypothesis: highest value 4 is an outlier
grubbs.test(agencja$stories)
##
## Grubbs test for one outlier
##
## data: agencja$stories
## G = 2.52970, U = 0.98821, p-value = 1
## alternative hypothesis: highest value 4 is an outlier
grubbs.test(agencja$parking)
##
## Grubbs test for one outlier
##
## data: agencja$parking
## G = 2.6770, U = 0.9868, p-value = 1
## alternative hypothesis: highest value 3 is an outlier
Cena: Najwyższa wartość ceny, czyli 13300000, jest odstająca. Powierzchnia: Najwyższa wartość powierzchni, czyli 16200, jest odstająca. Liczba sypialni: Najwyższa wartość liczby sypialni, czyli 6, jest odstająca. Liczba łazienek: Najwyższa wartość liczby łazienek, czyli 4, jest odstająca. Liczba pięter: Najwyższa wartość liczby pięter, czyli 4, nie jest odstająca. Liczba miejsc parkingowych: Najwyższa wartość liczby miejsc parkingowych, czyli 3, nie jest odstająca.
#sprawdzenie czy dane mają poprawny typ
str(agencja)
## '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" ...
summary(agencja)
## price area bedrooms bathrooms
## Min. : 1750000 Min. : 1650 Min. :1.000 Min. :1.000
## 1st Qu.: 3430000 1st Qu.: 3600 1st Qu.:2.000 1st Qu.:1.000
## Median : 4340000 Median : 4600 Median :3.000 Median :1.000
## Mean : 4766729 Mean : 5151 Mean :2.965 Mean :1.286
## 3rd Qu.: 5740000 3rd Qu.: 6360 3rd Qu.:3.000 3rd Qu.:2.000
## Max. :13300000 Max. :16200 Max. :6.000 Max. :4.000
## stories mainroad guestroom basement
## Min. :1.000 Length:545 Length:545 Length:545
## 1st Qu.:1.000 Class :character Class :character Class :character
## Median :2.000 Mode :character Mode :character Mode :character
## Mean :1.806
## 3rd Qu.:2.000
## Max. :4.000
## hotwaterheating airconditioning parking prefarea
## Length:545 Length:545 Min. :0.0000 Length:545
## Class :character Class :character 1st Qu.:0.0000 Class :character
## Mode :character Mode :character Median :0.0000 Mode :character
## Mean :0.6936
## 3rd Qu.:1.0000
## Max. :3.0000
## furnishingstatus
## Length:545
## Class :character
## Mode :character
##
##
##
#sprawdzenie czy dane nie mają duplikatów
anyDuplicated(agencja)
## [1] 0
#sprawdzenie czy cena nieruchomości jest przechowywana jako liczba
all(sapply(agencja$price, function(x) is.numeric(x)))
## [1] TRUE
#sprawdzenie czy powierzchnia jest przechowywana jako liczba
all(sapply(agencja$area, function(x) is.numeric(x)))
## [1] TRUE
# sprawdzenie czy liczba sypialni jest liczbą całkowitą i nieujemną
all(agencja$bedrooms %% 1 == 0) && all(agencja$bedrooms >= 0)
## [1] TRUE
#sprawdzenie czy liczba łazienek jest liczbą całkowitą i nieujemną
all(agencja$bathrooms %% 1 == 0) && all(agencja$bathrooms >= 0)
## [1] TRUE
#sprwdzenie czy liczba pięter jest liczbą całkowitą i nieujemną?
all(agencja$stories %% 1 == 0) && all(agencja$stories >= 0)
## [1] TRUE
#sprwdzenie czy liczba miejsc parkingowych jest liczbą całkowitą i nieujemną
all(agencja$parking %% 1 == 0) && all(agencja$parking >= 0)
## [1] TRUE
#sprawdzenie czy wszystkie wartości w kolumnie Mainroad to "Tak" lub "Nie"
all(agencja$mainroad %in% c("yes", "no"))
## [1] TRUE
#sprawdzenie czy wszystkie wartości w kolumnie Guestroom to "Tak" lub "Nie"
all(agencja$guestroom %in% c("yes", "no"))
## [1] TRUE
#sprawdzenie czy wszystkie wartości w kolumnie Basement to "Tak" lub "Nie"
all(agencja$basement %in% c("yes", "no"))
## [1] TRUE
#sprawdzenie czy wszystkie wartości w kolumnie Hot water heating to "Tak" lub "Nie"
all(agencja$hotwaterheating %in% c("yes", "no"))
## [1] TRUE
#sprawdzenie czy wszystkie wartości w kolumnie Airconditioning to "Tak" lub "Nie"
all(agencja$airconditioning %in% c("yes", "no"))
## [1] TRUE
#sprawdzenie czy Furnishing status zawiera tylko dopuszczalne wartości?
all(agencja$`Furnishing status` %in% c("w pełni umeblowany", "częściowo umeblowany", "nieumeblowany"))
## [1] TRUE
#sprawdzenie czy Prefarea zawiera tylko "Tak" lub "Nie"?
all(agencja$Prefarea %in% c("yes", "no"))
## [1] TRUE
Podczas analizy danych o nieruchomościach stwierdzono, że wszystkie kluczowe warunki walidacyjne zostały spełnione. Cena nieruchomości oraz powierzchniajest przechowywana jako liczba, a liczba sypialni, łazienek, pięter oraz miejsc parkingowych zawiera tylko nieujemne liczby całkowite. Dodatkowo, kolumny Mainroad, Guestroom, Basement, Hot water heating, Airconditioning, Furnishing status i Prefarea zawierają tylko oczekiwane wartości ‘Tak’ lub ‘Nie’. Dane są gotowe do dalszej analizy.
#############################################DODAĆ OPIS#######################################################
Histogram cen nieruchomości z podziałem na liczebność sypialni
library(ggplot2)
ggplot(agencja, aes(x = price , fill = factor(bedrooms))) +
geom_histogram(binwidth = 2000000, position = "dodge", color = "black", alpha = 0.7) +
labs(title = "Histogram cen nieruchomości z podziałem na liczebność sypialni",
x = "Cena",
y = "Liczba nieruchomości") +
scale_fill_discrete(name = "Liczba sypialni")
Histogram pokazuje rozkład cen nieruchomości w zależności od liczby
sypialni. Najczęstszym typem nieruchomości są te z trzema sypialniami,
które mają średnią cenę około 4000000. Nieruchomości z dwoma sypialniami
są zwykle tańsze, a z czterema droższe. Nieruchomości z jedną, pięcioma
lub sześcioma sypialniami są rzadkie na rynku.
ggplot(agencja, aes(x = price, fill = factor(bedrooms))) +
geom_density(alpha = 0.25) +
labs(title = 'Gęstość rozkładu cen', x = 'Cena', y = 'Gęstość') +
scale_fill_discrete(name = 'Liczba sypialni')
Wykres przedstawia gęstość rozkładu cen nieruchomości w zależności od
liczby sypialni. Wykres pokazuje, że im więcej sypialni ma nieruchomość,
tym bardziej zróżnicowane są jej ceny. Nieruchomości z jedną sypialnią
mają najwyższą gęstość cenową wokół 8.0e+06, co oznacza, że większość z
nich ma podobną cenę. Nieruchomości z większą liczbą sypialni mają
niższe i szersze szczyty gęstości, co oznacza, że ich ceny są bardziej
rozproszone i zależą od innych czynników, takich jak lokalizacja, stan
czy wyposażenie.
ggplot(agencja, aes(x = area, y = price, color = factor(bedrooms))) +
geom_point() +
labs(title = 'Wykres punktowy: Cena vs. Powierzchnia',
x = 'Powierzchnia',
y = 'Cena') +
scale_color_discrete(name = 'Liczba sypialni')
Wykres przedstawia związek między ceną a powierzchnią nieruchomości, z
podziałem na liczbę sypialni. Wykres pokazuje, że ogólnie rzecz biorąc,
im większa jest powierzchnia, tym wyższa jest cena, ale istnieje duża
zmienność, co wskazuje na wpływ innych czynników na cenę. Różne kolory
oznaczają nieruchomości z różną liczbą sypialni, jednak nie widać
wyraźnego wzorca, który by wskazywał, że liczba sypialni ma znaczący
wpływ na cenę.
library(dplyr)
##
## Dołączanie pakietu: 'dplyr'
## 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
medians <- agencja %>%
group_by(bedrooms) %>%
dplyr::summarize(median_price = median(price, na.rm = TRUE))
ggplot(agencja, aes(x = factor(bedrooms), y = price)) +
geom_boxplot(aes(fill = factor(bedrooms)), outlier.alpha = 0.25, position = 'dodge') +
geom_text(data = medians, aes(x = factor(bedrooms), y = median_price, label = median_price),
color = 'red', hjust = -0.5, vjust = 0.5, size = 3) +
stat_summary(aes(ymax = after_stat(y), ymin = after_stat(y)), fun = mean,
geom = 'errorbar', width = 0.75, linetype = 'solid',
position = 'dodge', color = 'white', size = 1) +
theme(legend.position = 'none')
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Wykres przedstawia zależność między ceną domu a liczbą sypialni. Z
wykresu wynika, że im więcej sypialni ma dom, tym jest droższy. Jednak w
kategoriach 2, 3 i 4 sypialni występują wartości odstające, które
zwiększają zmienność cen. Największa różnica cenowa jest między domami z
4 i 5 sypialniami, co widać po długich wąsach wykresów pudełkowych. Domy
z 6 sypialniami nie pasują do ogólnej tendencji, ponieważ są tańsze niż
domy z mniejszą liczbą sypialni.
#############################################DODAĆ OPIS#######################################################
library(corrplot)
## corrplot 0.92 loaded
corrplot(cor(agencja[,1:5,11]), method = "number", type = "upper", diag =FALSE)
corr_matrix<-cor(agencja[,1:5,11])
corrplot(corr_matrix, method="color")
#############################################DODAĆ OPIS#######################################################