Wprowadzenie

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.

Czyszczenie danych

W pierwszym etapie naszej analizy skoncentrujemy się na procesie czyszczenia danych, co obejmuje identyfikację, zarządzanie i eliminację potencjalnych nieprawidłowości w danych.

Brakujące obserwacje

Obserwacje odstające

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.

Walidacja danych

#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.

Wizualizacja danych

#############################################DODAĆ OPIS#######################################################

Wykresy zmiennej ilościowej

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.

Wykresy dwóch zmiennych ilościowych

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ę.

Wykresy zmiennej jakościowej

Wykresy dwóch zmiennych jakościowych

Wykresy zmiennej ilościowej vs zmiennej jakościowej

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.

Wykresy bąbelkowe

Kilka wykresów na jednym panelu

Analiza opisowa

#############################################DODAĆ OPIS#######################################################

Data wrangling

Tabele liczności oraz TAI

Podstawowe wykresy

Grupowanie grafik

Statystyki opisowe

Podsumowanie opisu danych

Macierze korelacji

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")

Wnioskowanie statystyczne

#############################################DODAĆ OPIS#######################################################