Rynek mieszkań w Polsce
Analiza Danych Semestr Zima 2024
1. Wprowadzenie
1.1 Cel Raportu
Celem tego raportu jest analiza zbioru danych
apartaments_pl_2024_06.
Aby to osiągnąć, dane zostaną oczyszczone, brakujące wartości
uzupełnione, a następnie przeprowadzona zostanie analiza opisowa oraz
wnioskowanie statystyczne wraz z wizualizacją wyników.
1.2 Przegląd zbioru danych
Zbiór danych apartaments_pl_2024_06 zawiera
informacje o rynku nieruchomości w największych miastach Polski.
Koncentruje się na cenach nieruchomości, wielkości mieszkań, bliskości
infrastruktury miejskiej oraz roku budowy.
1.2.1 Zmienne w zbiorze danych aparaments_pl_2024_06
Zbiór danych zawiera następujące zmienne:
1.2.1.1 Zmienne opisujące lokalizację mieszkania:
id – Unikalny identyfikator każdej nieruchomości
generowany komputerowo
city – Miasto, w którym znajduje się nieruchomość
latitude – Szerokość geograficzna
longitude – Długość geograficzna
1.2.1.2 Zmienne opisujące cenę i status własności nieruchomości:
price – Cena nieruchomości priceSquareMeter - Cena za metr kwadratowy - zmienna dodana na potrzeby raportu ownership – Status własności nieruchomości
1.2.1.3 Zmienne opisujące typ i wielkość mieszkania:
type – Typ budynku: blok mieszkalny,
apartamentowiec, kamienica
buildingMaterial – Materiał użyty do budowy
budynku
condition – Aktualny stan nieruchomości
squareMeters – Całkowita powierzchnia nieruchomości (w
metrach kwadratowych)
rooms – Liczba pokoi w nieruchomości
floor – Piętro, na którym znajduje się
nieruchomość
floor count – Całkowita liczba pięter w budynku
1.2.1.4 Zmienne opisujące odległość od kluczowych udogodnień w mieście:
centreDistance – Odległość od centrum miasta
poiCount – Liczba punktów użyteczności publicznej w
pobliżu nieruchomości
schoolDistance – Odległość do najbliższej szkoły
clinicDistance – Odległość do najbliższej przychodni
medycznej
postOfficeDistance – Odległość do najbliższej
poczty
kindergartenDistance – Odległość do najbliższego
przedszkola
restaurantDistance – Odległość do najbliższej
restauracji
collegeDistance – Odległość do najbliższego
college’u/uniwersytetu
pharmacyDistance – Odległość do najbliższej apteki
1.2.1.5 Zmienne opisujące, czy nieruchomość lub budynek, w którym się znajduje, obejmuje określoną infrastrukturę:
hasParkingSpace – Czy nieruchomość posiada miejsce
parkingowe (Tak/Nie)
hasBalcony – Czy nieruchomość posiada balkon
(Tak/Nie)
hasElevator – Czy budynek posiada windę (Tak/Nie)
hasSecurity – Czy nieruchomość/budynek posiada
zabezpieczenia (Tak/Nie)
hasStorageRoom – Czy nieruchomość posiada pomieszczenie
gospodarcze (Tak/Nie)
2. Czyszczenie i przetwarzanie danych
W celu przeanalizowania danych z zbioru apartaments_pl_2024_06 zbiór zostaje oczyszczony z braków danych oraz zostaje pozbawiony wartości odstających.
2.1 Wizualizacja brakujących danych używając mapy brakujących danych.
Otrzymany wykres pokazuje, że brakujące dane w zbiorze stanowią około 6,3% wszystkich danych. Większość brakujących wartości pochodzi z zmiennej condition, której braki wynoszą 74%, oraz material, gdzie braki sięgają 41%. Znaczące deficyty danych można również zauważyć w zmiennych: type, floor oraz buildYear, które zawierają odpowiednio 20%, 17% i 16% brakujących wartości.
Brakujące dane w zbiorze mogą wynikać z kilku czynników. Wysoki odsetek brakujących wartości w zmiennych condition i buildingMaterial sugeruje, że takie informacje często nie są ujawniane przez właścicieli nieruchomości lub w ogłoszeniach na portalach. Podobnie, luki w zmiennych type, floor i buildYear mogą wynikać z niekompletnych zapisów dotyczących starszych nieruchomości lub niespójności w sposobie raportowania danych w różnych miastach. W niektórych przypadkach szczegóły dotyczące nieruchomości mogą być celowo pomijane przez sprzedających, aby zwiększyć atrakcyjność ogłoszenia lub z powodu braku dokładnych informacji.
2.1.1 Szukanie wartości odstających
## spc_tbl_ [21,501 × 28] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ id : chr [1:21501] "811891f98a870dfd6e414374a0a85560" "adaf636d0c44d8d9325bce42403eefee" "9b957bd60885a469c96f17b58a914f4b" "74fef2ff7135bc70797a3fbfd7d44ed6" ...
## $ city : chr [1:21501] "szczecin" "szczecin" "szczecin" "szczecin" ...
## $ type : chr [1:21501] "blockOfFlats" "apartmentBuilding" "apartmentBuilding" "blockOfFlats" ...
## $ squareMeters : num [1:21501] 47 88.2 117 33.3 56 ...
## $ rooms : num [1:21501] 2 3 5 1 3 3 4 1 4 1 ...
## $ floor : num [1:21501] 6 1 4 1 7 4 NA 7 NA 4 ...
## $ floorCount : num [1:21501] 12 2 4 4 7 4 2 11 3 5 ...
## $ buildYear : num [1:21501] 1981 2000 NA 1963 2018 ...
## $ latitude : num [1:21501] 53.4 53.4 53.4 53.4 53.4 ...
## $ longitude : num [1:21501] 14.6 14.5 14.6 14.5 14.6 ...
## $ centreDistance : num [1:21501] 0.79 4.09 2.19 1.93 2.68 3.94 7.95 2.52 1.33 1.69 ...
## $ poiCount : num [1:21501] 67 0 10 39 10 7 14 15 18 25 ...
## $ schoolDistance : num [1:21501] 0.288 0.509 0.216 0.073 0.268 0.139 0.201 0.247 0.311 0.218 ...
## $ clinicDistance : num [1:21501] 0.285 1.039 0.611 0.326 0.771 ...
## $ postOfficeDistance : num [1:21501] 0.268 0.998 0.743 0.284 0.676 0.926 0.315 0.418 0.434 0.121 ...
## $ kindergartenDistance: num [1:21501] 0.245 0.676 0.28 0.089 0.26 0.93 0.25 0.458 0.403 0.102 ...
## $ restaurantDistance : num [1:21501] 0.068 0.661 0.298 0.18 0.322 0.071 0.216 0.141 0.161 0.162 ...
## $ collegeDistance : num [1:21501] 0.593 1.192 1.522 0.041 1.643 ...
## $ pharmacyDistance : num [1:21501] 0.085 0.668 0.229 0.388 0.178 0.304 0.316 0.022 0.26 0.02 ...
## $ ownership : chr [1:21501] "condominium" "condominium" "udział" "cooperative" ...
## $ buildingMaterial : chr [1:21501] "concreteSlab" "brick" "brick" "brick" ...
## $ condition : chr [1:21501] NA "premium" "premium" NA ...
## $ hasParkingSpace : chr [1:21501] "no" "yes" "yes" "yes" ...
## $ hasBalcony : chr [1:21501] "yes" "yes" "yes" "no" ...
## $ hasElevator : chr [1:21501] "yes" "no" "no" "no" ...
## $ hasSecurity : chr [1:21501] "no" "no" "no" "yes" ...
## $ hasStorageRoom : chr [1:21501] "yes" "no" "no" "yes" ...
## $ price : num [1:21501] 449000 950000 1099000 380000 799000 ...
## - attr(*, "spec")=
## .. cols(
## .. id = col_character(),
## .. city = col_character(),
## .. type = col_character(),
## .. squareMeters = col_double(),
## .. rooms = col_double(),
## .. floor = col_double(),
## .. floorCount = col_double(),
## .. buildYear = col_double(),
## .. latitude = col_double(),
## .. longitude = col_double(),
## .. centreDistance = col_double(),
## .. poiCount = col_double(),
## .. schoolDistance = col_double(),
## .. clinicDistance = col_double(),
## .. postOfficeDistance = col_double(),
## .. kindergartenDistance = col_double(),
## .. restaurantDistance = col_double(),
## .. collegeDistance = col_double(),
## .. pharmacyDistance = col_double(),
## .. ownership = col_character(),
## .. buildingMaterial = col_character(),
## .. condition = col_character(),
## .. hasParkingSpace = col_character(),
## .. hasBalcony = col_character(),
## .. hasElevator = col_character(),
## .. hasSecurity = col_character(),
## .. hasStorageRoom = col_character(),
## .. price = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
numeric_cols <- apartments %>% select(where(is.numeric))
find_outliers_iqr <- function(x) {
Q1 <- quantile(x, 0.25, na.rm = TRUE)
Q3 <- quantile(x, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
return(which(x < lower_bound | x > upper_bound))
}
outliers_iqr <- lapply(numeric_cols, find_outliers_iqr)numeric_cols <- apartments %>% select(where(is.numeric))
# Funkcja do wykrywania wartości odstających metodą IQR
find_outliers_iqr <- function(x) {
Q1 <- quantile(x, 0.25, na.rm = TRUE)
Q3 <- quantile(x, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
return(which(x < lower_bound | x > upper_bound)) # Zwraca indeksy wartości odstających
}
# Znalezienie wartości odstających dla wszystkich zmiennych numerycznych
outliers_iqr <- lapply(numeric_cols, find_outliers_iqr)
# Wizualizacja wartości odstających za pomocą boxplotów dla każdej zmiennej numerycznej
par(mfrow = c(3, 3)) # Układ wykresów (3x3)
for (col in colnames(numeric_cols)) {
boxplot(numeric_cols[[col]], main = col, col = "black", border = "maroon", outline = TRUE)
}W Wyniku analizy zbioru danych, możemy zobaczyć, że dane apartments_pl_2024_06 zawierają wiele wartości odstających. Wartości odstające, możemy zaobserwować dla niemal wszystkich zmiennych. Szczególnymi przykładami może być zmienne: Price, collegeDistance oraz Centre Distance.
2.2 Zastępowanie wartości odstających medianą
# Lista zmiennych związanych z odległościami (distance)
distance_vars <- c("centreDistance", "schoolDistance", "clinicDistance",
"postOfficeDistance", "kindergartenDistance",
"restaurantDistance", "collegeDistance", "pharmacyDistance")
# Funkcja do zastępowania wartości odstających medianą (dla zmiennych numerycznych poza distance_vars)
replace_outliers_with_median <- function(x) {
Q1 <- quantile(x, 0.25, na.rm = TRUE)
Q3 <- quantile(x, 0.75, na.rm = TRUE)
IQR <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
# Zastępowanie wartości odstających medianą
x[x < lower_bound | x > upper_bound] <- median(x, na.rm = TRUE)
return(x)
}
apartments2 <- apartments
for (col in names(numeric_cols)) {
if (!(col %in% distance_vars)) {
apartments2[[col]] <- replace_outliers_with_median(apartments[[col]])
}
}
# Porównanie statystyk przed i po przetwarzaniu
cat("Statystyki dla pierwotnego zbioru danych:\n")## Statystyki dla pierwotnego zbioru danych:
## id city type squareMeters
## Length:21501 Length:21501 Length:21501 Min. : 25.00
## Class :character Class :character Class :character 1st Qu.: 42.69
## Mode :character Mode :character Mode :character Median : 52.81
## Mean : 56.97
## 3rd Qu.: 66.30
## Max. :150.00
##
## rooms floor floorCount buildYear
## Min. :1.000 Min. : 1.000 Min. : 1.000 Min. :1850
## 1st Qu.:2.000 1st Qu.: 2.000 1st Qu.: 3.000 1st Qu.:1969
## Median :3.000 Median : 3.000 Median : 4.000 Median :1993
## Mean :2.623 Mean : 3.405 Mean : 5.475 Mean :1987
## 3rd Qu.:3.000 3rd Qu.: 4.000 3rd Qu.: 7.000 3rd Qu.:2016
## Max. :6.000 Max. :29.000 Max. :29.000 Max. :2024
## NA's :3573 NA's :209 NA's :3380
## latitude longitude centreDistance poiCount
## Min. :49.98 Min. :14.45 Min. : 0.020 Min. : 0.00
## 1st Qu.:51.10 1st Qu.:18.54 1st Qu.: 2.130 1st Qu.: 7.00
## Median :52.19 Median :19.91 Median : 4.130 Median : 14.00
## Mean :51.99 Mean :19.50 Mean : 4.432 Mean : 20.54
## 3rd Qu.:52.38 3rd Qu.:20.99 3rd Qu.: 6.250 3rd Qu.: 24.00
## Max. :54.58 Max. :23.21 Max. :16.480 Max. :212.00
##
## schoolDistance clinicDistance postOfficeDistance kindergartenDistance
## Min. :0.005 Min. :0.0050 Min. :0.002 Min. :0.001
## 1st Qu.:0.178 1st Qu.:0.3610 1st Qu.:0.238 1st Qu.:0.154
## Median :0.289 Median :0.6770 Median :0.392 Median :0.256
## Mean :0.408 Mean :0.9709 Mean :0.510 Mean :0.357
## 3rd Qu.:0.462 3rd Qu.:1.2440 3rd Qu.:0.621 3rd Qu.:0.411
## Max. :4.920 Max. :4.9180 Max. :4.801 Max. :4.767
## NA's :11 NA's :63 NA's :20 NA's :19
## restaurantDistance collegeDistance pharmacyDistance ownership
## Min. :0.0010 Min. :0.006 Min. :0.0010 Length:21501
## 1st Qu.:0.1120 1st Qu.:0.565 1st Qu.:0.1360 Class :character
## Median :0.2240 Median :1.121 Median :0.2350 Mode :character
## Mean :0.3358 Mean :1.441 Mean :0.3471
## 3rd Qu.:0.4020 3rd Qu.:2.050 3rd Qu.:0.4030
## Max. :4.9280 Max. :5.000 Max. :4.8020
## NA's :31 NA's :584 NA's :30
## buildingMaterial condition hasParkingSpace hasBalcony
## Length:21501 Length:21501 Length:21501 Length:21501
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## hasElevator hasSecurity hasStorageRoom price
## Length:21501 Length:21501 Length:21501 Min. : 191000
## Class :character Class :character Class :character 1st Qu.: 549000
## Mode :character Mode :character Mode :character Median : 721824
## Mean : 823868
## 3rd Qu.: 965000
## Max. :3000000
##
##
## Statystyki dla przetworzonego zbioru danych (apartments2):
## id city type squareMeters
## Length:21501 Length:21501 Length:21501 Min. : 25.00
## Class :character Class :character Class :character 1st Qu.: 42.69
## Mode :character Mode :character Mode :character Median : 52.81
## Mean : 54.25
## 3rd Qu.: 63.70
## Max. :101.71
##
## rooms floor floorCount buildYear
## Min. :1.000 Min. :1.000 Min. : 1.000 Min. :1899
## 1st Qu.:2.000 1st Qu.:2.000 1st Qu.: 3.000 1st Qu.:1970
## Median :3.000 Median :3.000 Median : 4.000 Median :1993
## Mean :2.557 Mean :2.827 Mean : 5.084 Mean :1988
## 3rd Qu.:3.000 3rd Qu.:4.000 3rd Qu.: 6.000 3rd Qu.:2016
## Max. :4.000 Max. :7.000 Max. :13.000 Max. :2024
## NA's :3573 NA's :209 NA's :3380
## latitude longitude centreDistance poiCount
## Min. :49.98 Min. :16.82 Min. : 0.020 Min. : 0.00
## 1st Qu.:51.10 1st Qu.:18.58 1st Qu.: 2.130 1st Qu.: 7.00
## Median :52.19 Median :19.91 Median : 4.130 Median :14.00
## Mean :51.70 Mean :19.66 Mean : 4.432 Mean :14.65
## 3rd Qu.:52.24 3rd Qu.:20.99 3rd Qu.: 6.250 3rd Qu.:20.00
## Max. :53.50 Max. :23.21 Max. :16.480 Max. :49.00
##
## schoolDistance clinicDistance postOfficeDistance kindergartenDistance
## Min. :0.005 Min. :0.0050 Min. :0.002 Min. :0.001
## 1st Qu.:0.178 1st Qu.:0.3610 1st Qu.:0.238 1st Qu.:0.154
## Median :0.289 Median :0.6770 Median :0.392 Median :0.256
## Mean :0.408 Mean :0.9709 Mean :0.510 Mean :0.357
## 3rd Qu.:0.462 3rd Qu.:1.2440 3rd Qu.:0.621 3rd Qu.:0.411
## Max. :4.920 Max. :4.9180 Max. :4.801 Max. :4.767
## NA's :11 NA's :63 NA's :20 NA's :19
## restaurantDistance collegeDistance pharmacyDistance ownership
## Min. :0.0010 Min. :0.006 Min. :0.0010 Length:21501
## 1st Qu.:0.1120 1st Qu.:0.565 1st Qu.:0.1360 Class :character
## Median :0.2240 Median :1.121 Median :0.2350 Mode :character
## Mean :0.3358 Mean :1.441 Mean :0.3471
## 3rd Qu.:0.4020 3rd Qu.:2.050 3rd Qu.:0.4030
## Max. :4.9280 Max. :5.000 Max. :4.8020
## NA's :31 NA's :584 NA's :30
## buildingMaterial condition hasParkingSpace hasBalcony
## Length:21501 Length:21501 Length:21501 Length:21501
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## hasElevator hasSecurity hasStorageRoom price
## Length:21501 Length:21501 Length:21501 Min. : 191000
## Class :character Class :character Class :character 1st Qu.: 549000
## Mode :character Mode :character Mode :character Median : 721824
## Mean : 741078
## 3rd Qu.: 888000
## Max. :1589000
##
2.3 Wypełnianie brakujących danych używając funkcji hotdeck
## [1] 0
## [1] 1204056
## [1] 0
descriptive_stats <- czyste %>%
select(price) %>%
summarise(
Mean = format(mean(price, na.rm = TRUE), big.mark = ".", scientific = FALSE, digits = 0),
Median = format(median(price, na.rm = TRUE), big.mark = ".", scientific = FALSE, digits = 0),
Std_Dev = format(sd(price, na.rm = TRUE), big.mark = ".", scientific = FALSE, digits = 0),
Min = format(min(price, na.rm = TRUE), big.mark = ".", scientific = FALSE, digits = 0),
Max = format(max(price, na.rm = TRUE), big.mark = ".", scientific = FALSE, digits = 0),
)
print(descriptive_stats)## N Mean SD Min Q1 Median Q3 Max
## 1 price 21501 741077.8 280184.9 191000 549000 721824 888000 1589000
skew_value <- skewness(czyste$price, na.rm = TRUE)
kurt_value <- kurtosis(czyste$price, na.rm = TRUE)
print(paste("Skewness: ", skew_value))## [1] "Skewness: 0.69144483660002"
## [1] "Kurtosis: 3.26861387871498"
Po odrzuceniu danych odstających otrzymany rozkład dla zmiennej price jest względnie równy. Skośność na poziomie 0,69 wskazuje na rozkład lekko prawostronnie skośny tzw. “Dłuższy ogon po prawej stronie”.
3. Analiza Opisowa
Kluczowymi zmiennymi dla zbioru danych apartaments_pl_2024_06 są zmienne: price, city, type, rooms, squareMeters, centreDistance, ownership, condition. Na potrzeby tego raportu dogłębna i rzeczowa analiza zostanie przeprowadzona właśnie dla tych zmiennych.
3.1 Analiza kluczowych zmiennych
3.1.1 Tabela dystrybucji dla zmiennej City
| Characteristic | bialystok N = 2311 |
bydgoszcz N = 9371 |
czestochowa N = 3851 |
gdansk N = 1,9861 |
gdynia N = 8281 |
katowice N = 5931 |
krakow N = 3,2451 |
lodz N = 1,6911 |
lublin N = 5741 |
poznan N = 7931 |
radom N = 1951 |
rzeszow N = 1631 |
szczecin N = 6471 |
warszawa N = 6,9621 |
wroclaw N = 2,2711 |
p-value2 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| type | <0.001 | |||||||||||||||
| apartmentBuilding | 29 (13%) | 98 (10%) | 57 (15%) | 427 (22%) | 175 (21%) | 104 (18%) | 666 (21%) | 253 (15%) | 29 (5.1%) | 107 (13%) | 13 (6.7%) | 21 (13%) | 82 (13%) | 1,709 (25%) | 536 (24%) | |
| blockOfFlats | 190 (82%) | 574 (61%) | 301 (78%) | 1,213 (61%) | 531 (64%) | 345 (58%) | 2,047 (63%) | 1,150 (68%) | 470 (82%) | 517 (65%) | 164 (84%) | 133 (82%) | 374 (58%) | 4,230 (61%) | 1,273 (56%) | |
| tenement | 12 (5.2%) | 265 (28%) | 27 (7.0%) | 346 (17%) | 122 (15%) | 144 (24%) | 532 (16%) | 288 (17%) | 75 (13%) | 169 (21%) | 18 (9.2%) | 9 (5.5%) | 191 (30%) | 1,023 (15%) | 462 (20%) | |
| rooms | <0.001 | |||||||||||||||
| 1 | 15 (6.5%) | 62 (6.6%) | 19 (4.9%) | 105 (5.3%) | 18 (2.2%) | 35 (5.9%) | 251 (7.7%) | 128 (7.6%) | 6 (1.0%) | 49 (6.2%) | 10 (5.1%) | 2 (1.2%) | 30 (4.6%) | 446 (6.4%) | 132 (5.8%) | |
| 2 | 87 (38%) | 386 (41%) | 203 (53%) | 777 (39%) | 256 (31%) | 222 (37%) | 1,472 (45%) | 893 (53%) | 183 (32%) | 338 (43%) | 79 (41%) | 49 (30%) | 243 (38%) | 3,114 (45%) | 1,008 (44%) | |
| 3 | 108 (47%) | 386 (41%) | 137 (36%) | 820 (41%) | 416 (50%) | 259 (44%) | 1,189 (37%) | 553 (33%) | 310 (54%) | 308 (39%) | 88 (45%) | 88 (54%) | 259 (40%) | 2,658 (38%) | 900 (40%) | |
| 4 | 21 (9.1%) | 103 (11%) | 26 (6.8%) | 284 (14%) | 138 (17%) | 77 (13%) | 333 (10%) | 117 (6.9%) | 75 (13%) | 98 (12%) | 18 (9.2%) | 24 (15%) | 115 (18%) | 744 (11%) | 231 (10%) | |
| centreDistance | 1.87 (1.15, 2.75) | 2.09 (1.10, 2.98) | 2.66 (1.63, 3.75) | 5.25 (2.36, 6.65) | 4.23 (1.46, 6.47) | 2.78 (1.26, 4.67) | 4.10 (2.15, 5.79) | 4.04 (2.03, 5.49) | 2.66 (1.80, 3.83) | 3.30 (2.36, 4.95) | 1.80 (1.27, 2.53) | 1.99 (1.39, 3.15) | 2.90 (1.50, 4.87) | 5.77 (3.68, 7.89) | 3.21 (1.77, 5.56) | <0.001 |
| ownership | ||||||||||||||||
| condominium | 181 (78%) | 897 (96%) | 324 (84%) | 1,947 (98%) | 806 (97%) | 528 (89%) | 3,033 (93%) | 1,455 (86%) | 490 (85%) | 658 (83%) | 127 (65%) | 141 (87%) | 514 (79%) | 6,103 (88%) | 2,081 (92%) | |
| cooperative | 50 (22%) | 40 (4.3%) | 61 (16%) | 39 (2.0%) | 22 (2.7%) | 65 (11%) | 211 (6.5%) | 236 (14%) | 84 (15%) | 134 (17%) | 68 (35%) | 22 (13%) | 132 (20%) | 859 (12%) | 190 (8.4%) | |
| udział | 0 (0%) | 0 (0%) | 0 (0%) | 0 (0%) | 0 (0%) | 0 (0%) | 1 (<0.1%) | 0 (0%) | 0 (0%) | 1 (0.1%) | 0 (0%) | 0 (0%) | 1 (0.2%) | 0 (0%) | 0 (0%) | |
| condition | <0.001 | |||||||||||||||
| low | 114 (49%) | 463 (49%) | 231 (60%) | 846 (43%) | 363 (44%) | 289 (49%) | 1,493 (46%) | 898 (53%) | 251 (44%) | 353 (45%) | 100 (51%) | 61 (37%) | 246 (38%) | 3,203 (46%) | 975 (43%) | |
| premium | 117 (51%) | 474 (51%) | 154 (40%) | 1,140 (57%) | 465 (56%) | 304 (51%) | 1,752 (54%) | 793 (47%) | 323 (56%) | 440 (55%) | 95 (49%) | 102 (63%) | 401 (62%) | 3,759 (54%) | 1,296 (57%) | |
| 1 n (%); Median (Q1, Q3) | ||||||||||||||||
| 2 Pearson’s Chi-squared test; Kruskal-Wallis rank sum test | ||||||||||||||||
Najwięcej ludzi mieszka w blokach w każdym mieście, około 60% mieszkań w każdym mieście, poza Lublinem i Radomiem gdzie te bloki stanowią około 85% budynków mieszkalnych w grupie badanej. Warszawa, Wrocław i Gdańsk to miasta, które posiadają widocznie największą ilość apartamentów około 24%, jest tak najprawdopodobniej dlatego, że apartamenty zreugły stawiane są w najbardziej rozwiniętych miastach a Warszawa, Wrocław i Gdańsk to centra biznesu w Polsce. Zaś Bydgosz Katowice i Styczeń mają najwięcej kamienic ~28%.
Średnia liczba pokoi w mieszkaniach w Polskich miastach to 2 lub 3 pokoie. Miastami z największą ilością mieszkań 4 pokoiowych to Szczecin i Gdynia gdzie te stanowią około 20% wszystkich badanych w tych miastach mieszkań.
W niemal każym mieście proporcja pomiędzy mieszkaniami klasy low i premium jest równa i stanowi prawie 50%. Dwoma miastami, które odchodzą od tej zależności są Szczecin i Rzeszów, gdzie mieszkania klasy premium stanowią około 62% badanych mieszkań.
W grupie badanej średnio najdalej do centrum miasta mają mieszkańcy Warszawy i Gdańska najbliżej zaś mają mieszkańcy Radomia i Białegostoku. Są to dość intuicyjne wyniki z uwagi na to, że Warszawa jest dużym miastem a Radom i Białystok dość niewielkimi. W przypadku Gdańska, który z perspektywy zajmowanego obszaru jest średniej wielkości miastem, wysoką wartość współczynika odległość od centrum miasta możemy tłumaczyć położeniem starego miasta, które znajduje się na wschodzie miejskiej jednostki administracyjnej, duża zagęszczenie mieszkań jest jednak na zachód i południu.
Kluczową zmienną do analizy w zbiorze danych jest cena, ponieważ opisuje ona sytuację na polskim rynku mieszkaniowym, na którym oparty jest ten zbiór danych.
3.2 Analiza zmiennej price
raport <-
list("Cena w PLN" =
list("Min"= ~ min(price),
"Max"= ~ max(price),
"Kwartyl dolny"= ~ quantile(price,0.25),
"Mediana"= ~ round(median(price),0),
"Kwartyl górny"= ~ quantile(price,0.75),
"Średnia"= ~ round(mean(price),0),
"Odch. std."= ~ round(sd(price),0),
"Odstęp Międzykwartyllowy"= ~ round(iqr(price),0),
"Odchylenie ćwiartkowe"=~round(iqr(price)/2,0),
"Odch. std. w %"=~round((sd(price)/mean(price)),4),
"Odch. ćwiartkowe w %"=~round((iqr(price)/median(price)),4),
"Skośność"=~round(skew(price),4),
"Kurtoza"=~round(kurtosi(price),4)
))
tabela<-summary_table(czyste, summaries = raport, by = c("rooms"))
knitr::kable(tabela,
digits = 2,
align = "lcccc",
caption="Tabela cen mieszkań w Polskich miastach - ceny w PLN wg liczby pokoi.",
col.names = c("Statystyka","1 pokój", "2 pokoje", "3 pokoje", "4 pokoje")) | Statystyka | 1 pokój | 2 pokoje | 3 pokoje | 4 pokoje |
|---|---|---|---|---|
| Cena w PLN | ||||
| Min | 191000 | 195000 | 249000 | 299000 |
| Max | 970000 | 1589000 | 1589000 | 1588000 |
| Kwartyl dolny | 399000 | 499000 | 639000 | 721824 |
| Mediana | 517000 | 649000 | 750000 | 799000 |
| Kwartyl górny | 599250 | 799000 | 965000 | 1099000 |
| Średnia | 504602 | 666988 | 814180 | 898836 |
| Odch. std. | 160881 | 249595 | 277110 | 283880 |
| Odstęp Międzykwartyllowy | 200250 | 3e+05 | 326000 | 377176 |
| Odchylenie ćwiartkowe | 100125 | 150000 | 163000 | 188588 |
| Odch. std. w % | 0.3188 | 0.3742 | 0.3404 | 0.3158 |
| Odch. ćwiartkowe w % | 0.3873 | 0.4622 | 0.4347 | 0.4721 |
| Skośność | 0.0428 | 0.7286 | 0.6305 | 0.6241 |
| Kurtoza | -0.3184 | 0.6812 | -0.0309 | -0.4714 |
3.2.1 Min i Max
Najtańsze mieszkanie w oczyszczonej serii danych kosztuje 191.000 PLN najdroższe zaś 1.588.000. Najtańsze mieszkania dla wszystkich liczb pokoi kosztują poniżej 300.000 PLN. W przypadku najdroższych mieszkań jedynie w przypadku mieszkań 1 pokojowych cenna jest mniejsza od 1.000.000 PLN. Największa różnica pomiędzy najdroższym a najtańszym mieszkaniem występuję w przypadku mieszkań 2 pokojowych i wynosi 1.394.000 PLN jednak różnica dla mieszkań 3 i 4 pokojowych nie dużo mniejsza i wynosi odpowiednio 1.340.000 PLN oraz 1.289.000 PLN. Najmniejsza zaś różnica jest w przypadku mieszkań 1 pokojowych i wynosi 779.000 PLN. Jednak są to wartości nominalne nie uwzględniające tego jak duże są pokoje. Poniższa tabela przedstawia metraż jaki mają badane przez nas skrajne obserwacje wraz z ceną za m^2.
3.2.2 Porótnanie skrajnych mieszkań
skrajne_mieszkania <- czyste %>%
group_by(rooms) %>%
filter(price == min(price) | price == max(price)) %>%
group_by(rooms, price) %>%
filter(ifelse(price == min(price), squareMeters == min(squareMeters), squareMeters == max(squareMeters))) %>%
ungroup() %>%
mutate(price_per_m2 = round(price / squareMeters, 2)) %>%
select(rooms, price, squareMeters, price_per_m2) %>%
arrange(rooms, price)
knitr::kable(skrajne_mieszkania,
digits = 2,
align = "lccc",
caption = "Tabela skrajnych mieszkań - ceny, metraż i koszt za m²",
col.names = c("Liczba pokoi", "Cena (PLN)", "Powierzchnia (m²)", "Cena za m² (PLN)"))| Liczba pokoi | Cena (PLN) | Powierzchnia (m²) | Cena za m² (PLN) |
|---|---|---|---|
| 1 | 191000 | 26.10 | 7318.01 |
| 1 | 970000 | 34.00 | 28529.41 |
| 2 | 195000 | 25.00 | 7800.00 |
| 2 | 1589000 | 59.00 | 26932.20 |
| 3 | 249000 | 46.00 | 5413.04 |
| 3 | 1589000 | 52.81 | 30089.00 |
| 4 | 299000 | 56.33 | 5308.01 |
| 4 | 1588000 | 64.00 | 24812.50 |
Mimo że największa dysproporcja w cenie była obserwowalna dla mieszkań z dwoma pokojami to największa różnica w cenie za m^2 jest widoczna w przypadku mieszkań z 3 pokojami i wynosi 24675,96 PLN dla wartości skrajnych, gdzie pozycją o drugiej największej różnicy są miezkania z 1 pokojem 21211,40 PLN
3.2.3 Średnia i Mediana
Średnia cena mieszkań dla mieszkań o 2; 3 i 4 pokojach jest większa od mediany co sugeruje rozkład cen skośny prawostornnie oznaczao to, że dla tych kategorii istnieją pojedyńcze bardzo drogie mieszkania, które znacząco wpływają na średnią.
3.2.4 Odchylenie Standardowe
Wartość odchylenia standardowego widocznie rośnie wraz z liczbą pokoi, oznacza to, że mieszkania z większą ilością pokoi (czyli z założenia mieszkania większe) mają bardziej zróżnicowane ceny, co jest zgodne z intuicją.
Na Potrzeby dalszej analizy dodajmy zmienną priceSquareMeter oznaczającą cenę za m^2 dla danego mieszkania.
4. Wizualizacja Danych
4.1 Wizualizacja Ceny mieszkań.
Aby przeanalizować stan polskiego rynku mieszkaniowego, apartamenty grupujemy w przedziały cenowe, pozwoli nam to lepiej zwizualizować rozkład danych i przyczyni się do dalszej analizy zmiennych.
4.1.1 Wykres przedział cenowych.
# Paleta kolorów
custom_colors <- c("mistyrose", "darksalmon", "indianred", "maroon") # Light pink to maroon
limits <- c(0, 250000, 500000, 750000, 1000000, 1250000, Inf)
labels <- c("<250,000 PLN", "250,000 - 499,999 PLN", "500,000 - 749,999 PLN",
"750,000 - 999,999 PLN", "1,000,000 - 1,249,999 PLN", "≥1,250,000 PLN")
czyste$price_category <- cut(czyste$price, breaks = limits, labels = labels,
include.lowest = TRUE, right = FALSE)
price_counts <- czyste %>%
count(price_category) %>%
mutate(percentage = n / sum(n) * 100)
fixed_label_height <- max(price_counts$n) * 1.05
ggplot(price_counts, aes(x = price_category, y = n, fill = price_category)) +
geom_bar(stat = "identity", show.legend = FALSE) +
geom_text(aes(label = paste0(round(percentage, 1), "%")),
vjust = 2,
size = 5,
color = "black",
nudge_y = fixed_label_height - max(price_counts$n)) +
scale_y_continuous(labels = comma) +
scale_fill_manual(values = colorRampPalette(custom_colors)(length(labels))) + # Gradient fill
theme_minimal() +
labs(
title = "Rozkład cen apartamentów",
x = "Przedział cenowy",
y = "Liczba apartamentów"
) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Wizualizacja pokazuje, w jakich przedziałach cenowych znajdują się apartamenty w zbiorze danych. Największy klaster apartamentów znajduje się w przedziale cenowym od 500 000 do 749 999 PLN, który obejmuje 40,2% obserwacji. Kolejne dwie kategorie z największą liczbą obserwacji to 750 000 do 999 999 PLN (24,7%) oraz 250 000 do 499 999 PLN (18,5%). Łącznie stanowią one 83,4% obserwacji.
4.1.2 Wykres przediał cenowych dla orginalnych danych.
Orginalne dane zawierały skrajne ceny mieszkań, poniższa tabela przedstawia dystrybucję orginalnych danych dla przyjętych pułapów cenowych.
limits <- c(0, 250000, 500000, 750000, 1000000, 1250000, Inf)
apartments$price_category <- cut(apartments$price, breaks = limits, labels = labels, include.lowest = TRUE, right = FALSE)
price_counts <- apartments %>%
count(price_category) %>%
mutate(percentage = round(n / sum(n) * 100, 1))
knitr::kable(price_counts,
digits = 1,
align = "lc",
caption = "Tabela rozkładu cen mieszkań przed odrzuceniem wartości skrajnych",
col.names = c("Przedział cenowy", "Liczba mieszkań", "Procentowy udział (%)"))| Przedział cenowy | Liczba mieszkań | Procentowy udział (%) |
|---|---|---|
| <250,000 PLN | 233 | 1.1 |
| 250,000 - 499,999 PLN | 3968 | 18.5 |
| 500,000 - 749,999 PLN | 7295 | 33.9 |
| 750,000 - 999,999 PLN | 5308 | 24.7 |
| 1,000,000 - 1,249,999 PLN | 1864 | 8.7 |
| ≥1,250,000 PLN | 2833 | 13.2 |
Po odrzuceniu wartości odstających mieszkania o cenie wyższej niż 1.250.000 PLN stanowią 6,9% badanych mieszkań jednak uwzględniając wartości odstające mieszkania o cenie wyższej niż 1.250.000 PLN stanowiły 13,2%. Zmianie uległ również udział dla mieszkań w przedziale 500.000 PLN - 749.999 PLN, gdzie udział procentowy wynosił 33,9%, a po odrzuceniu wartości skrajnych udział wzrósł do 40,2%. W pozostałych przypadkach wartość pozostała bez zmian.
4.2 Wizualizacja z względu na miasto.
Kluczową zmienną w analizie rynku mieszkań jest zmienna city, która określa miasto, w którym znajduje się dana nieruchomość. Jest to istotne, ponieważ to aglomeracje miejskie gromadzą wokół siebie firmy i biznesy, które tworzą miejsca pracy. Dostępność miejsc pracy z kolei wpływa na ceny mieszkań, a ceny mieszkań mogą wpływać na atrakcyjność danego miasta dla firm i pracowników.
4.2.1 Wykresy rozkładu cen oraz wielkości mieszkań z względu na miasto
ggplot(czyste, aes(x = city, y = priceSquareMeter)) +
geom_boxplot(aes(fill = city), alpha = 0.85) +
theme_minimal() +
labs(title = "Rozkład cen według miasta", x = NULL, y = "Cena za metr kwadratowy") +
theme(axis.text.x = element_blank(), axis.ticks.x = element_blank()) +
scale_y_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = ",")) ggplot(czyste, aes(x = city, y = squareMeters)) +
geom_boxplot(aes(fill = city), alpha = 0.85) +
theme_minimal() +
labs(title = "Rozkład metrażu mieszkań według miasta", x = NULL, y = "Metraż") +
theme(axis.text.x = element_blank(), axis.ticks.x = element_blank()) +
scale_y_continuous(labels = scales::label_number(big.mark = ".", decimal.mark = ",")) 4.2.2 Analiza wykresów
Pierwszy wykres przedstawia rozkład cen za metr kwadratowy mieszkań w miastach. Największa ceną za metr kwadratowy należy do Warszawy z medianą na poziomie ok.17-18.000 PLN. Obok Warszawy znajdują się również Kraków, z medianą na poziomie ok.16.000 PLN, Gdańsk, z medianą na poziomie ok.14.000 PLN oraz Wrocław, również z medianą na poziomie ok.14.000 PLN. Najniższe wartości ceny za metr kwadratowy znajdują się w Częstochowie i Radomiu i wynoszą ok.7.000 PLN. Większa cena za metr jest również spowodowana licznymi przypadkami, w których cena metra kwadratowego jest dużo większa od innych mieszkań jak na przykład w Gdańsku, Gdyni, Krakowie, Warszawie czy Wrocławiu
Drugi wykres ilustruje rozkład metrażu mieszkań w tych samych miastach. Tu sytuacja jest w miarę zbliżona, choć w miastach, gdzie ceny za metr kwadratwoy są wysokie metraż mieszkania jest większy. Mediana znajduje się głównie w przedziale 50-55 metrów kwadratowych.
4.3 Dystrubucja mieszkań z względu na zmienną ownership
Zmienna ownership, która przyjmuje wartości: condominium, cooperative oraz udział, jest istotna w analizie rynku mieszkań w Polsce, ponieważ różne formy własności mogą mieć duży wpływ na postrzeganą wartość nieruchomości oraz na preferencje nabywców. Mieszkania na własność (condominium) charakteryzują się pełną swobodą zarządzania nieruchomością, co często wiąże się z wyższą ceną, szczególnie w miastach o dużym popycie. Mieszkania spółdzielcze (cooperative) z kolei mogą być bardziej dostępne cenowo, ale mają ograniczenia związane z brakiem pełnej własności. Mieszkania na zasadzie udziału (udział) to forma, która często dotyczy nieruchomości, gdzie współwłaściciele dzielą się kosztami utrzymania, co wpływa na atrakcyjność tego typu mieszkań, szczególnie w dużych aglomeracjach. Zrozumienie rozkładu tych form własności pozwala lepiej ocenić, które typy mieszkań dominują na rynku i jak różne formy własności mogą wpływać na ceny nieruchomości w różnych miastach.
4.3.1 wykres słupkowy dla dmiennej ownership
ownership_palette <- c("maroon", "indianred", "darksalmon") # Maroon → IndianRed → MistyRose
ownership_counts <- czyste %>%
count(ownership) %>%
mutate(percentage = n / sum(n) * 100)
fixed_label_height <- max(ownership_counts$n) * 1.05
ggplot(ownership_counts, aes(x = ownership, y = n, fill = ownership)) +
geom_bar(stat = "identity", show.legend = FALSE) +
geom_text(aes(label = paste0(round(percentage, 1), "%")),
vjust = 1.5,
size = 5,
color = "black",
nudge_y = fixed_label_height - max(ownership_counts$n)) +
scale_y_continuous(labels = scales::comma) +
scale_fill_manual(values = ownership_palette) +
theme_minimal() +
labs(
title = "Dystrybucja typu własności mieszkań",
x = "Typ Własności",
y = "Liczba Mieszkań"
) +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) 4.3.2 Analiza wykresu dal zmiennej ownership
89,7% Własność kondominium (condominium): Dominacja kondominiów sugeruje, że większość osób w zbiorze danych posiada swoje mieszkania jako indywidualne jednostki z osobistym tytułem własności. Jest to zgodne z bardziej rynkowym modelem mieszkalnictwa, w którym podkreśla się prywatną własność, a właściciele mają pełną kontrolę nad swoimi lokalami.
10,3% Własność spółdzielcza (cooperative): Mniejszy odsetek osób mieszka w lokalach spółdzielczych, co wskazuje, że choć nadal istotna, ta forma własności jest mniej powszechna. Własność spółdzielcza jest często bardziej regulowana i może ograniczać pewne swobody, takie jak możliwość swobodnej sprzedaży lub wynajmu lokalu.
Blisko 0% Własność udziałowa: Znikoma obecność opcji „udział” sugeruje, że ta forma własności jest rzadka lub może zanikać na polskim rynku mieszkaniowym. Może to wskazywać na odchodzenie od starszych, zbiorowych struktur własnościowych.
4.4 Mapa Cieplna
W celu znalezienia korelacji między kluczowymi zmiennymi tworzymy wizualizację Mapy Cieplnej (eng. Heatmap).
4.4.1 Wizualizacja Mapy Cieplnej
poi_vars <- c("schoolDistance", "clinicDistance", "postOfficeDistance",
"kindergartenDistance", "restaurantDistance", "collegeDistance",
"pharmacyDistance", "centreDistance", "price")
existing_poi_vars <- poi_vars[poi_vars %in% colnames(czyste)]
poi_correlation <- cor(czyste %>% select(all_of(existing_poi_vars)), use = "pairwise.complete.obs")
# Custom color palette using maroon and lightsalmon
custom_palette <- colorRampPalette(c("mistyrose", "white", "maroon"))(200)
# Generate the correlation plot with the new colors
corrplot(poi_correlation,
method = "square",
col = custom_palette, # Apply the custom color palette
tl.cex = 0.8, cl.cex = 0.8,
type = "upper", order = "hclust",
addCoef.col = "black", number.cex = 0.7,
title = "Mapa korelacji rozmiar mieszkania a cena", mar = c(0, 0, 2, 0)) correlation_analysis <- function(data) {
kolumny <- c("price", "priceSquareMeter", "squareMeters", "rooms")
existing_columns <- kolumny[kolumny %in% names(data)]
if (length(existing_columns) < length(kolumny)) {
stop("One or more required columns are missing from the dataset.")
}
cor_matrix <- cor(data[, existing_columns], use = "pairwise.complete.obs")
# Tworzenie mapy korelacji Heatmap
corrplot(cor_matrix,
method = "color",
col = colorRampPalette(c("mistyrose", "white", "maroon"))(200),
type = "upper",
order = "hclust",
addCoef.col = "black",
tl.col = "black",
tl.srt = 45,
title = "Mapa Korelacji Heatmap")
}
correlation_analysis(czyste)4.4.2 Analiza map cieplnych
Pierwsza wizualizacja przedstawia korelację między mieszkaniem a odległością do różnych udogodnień. Pokazuje ona, że zazwyczaj, jeśli mieszkanie znajduje się blisko jednej infrastruktury, to jest także blisko innej. Co jednak ciekawe, istnieje negatywna korelacja między ceną a odległością do kliniki oraz restauracji, co wskazuje, że im mniejsza odległość, tym wyższa cena mieszkania. Jest to szczególnie nietypowe w kontekście pozytywnej korelacji między ceną a odległością do centrum, co sugeruje, że im bliżej centrum znajduje się mieszkanie, tym jest tańsze. Wynik ten stoi w sprzeczności z intuicyjną hipotezą, że mieszkania w centrum miasta są najdroższe. Może to oznaczać, że w danych znajduje się znaczna liczba mieszkań na przedmieściach, które są warte więcej niż mieszkania w obszarach miejskich.
Druga wizualizacja przedstawia mapę cieplną mierzącą cenę w odniesieniu do zmiennych odnoszących się do rozmiaru mieszkania. Większość wyników jest niezaskakująca takich jak: Im więcej pokoi tym większy metraż im większy metraż tym większa cena, im więcej pokoi tym większa cena, im większy metraż tym mniejsza cena za m^2, im więcej pokoi tym mniejsza cena za m^2. Jednym wynikiem, który jest bardziej zaskakujący jest dodania korelacja na poziomie 0,66 zmiennych cena oraz cena za m^2 oznacza to, że droższe mieszkania mają wyższą cennę za metraż co może sugerować to, że znajdują się w bardzo dobrej lokalizacji albo są mieszkaniami wyższej jakości co za czym idzie sąbardziej porządane.
Następnie tworzony jest wykres analizujący wpływ piętra, na którym znajduje się mieszkanie, na jego cenę.
4.5. Wizualizacja zmiennej floor oraz type
W celu analizy polskiego rynku mieszkań badamy populację z względu na zmieną floor oraz type.
4.5.1 Wykres Słupkowy dla zmiennej floor
ggplot(czyste, aes(x = floor)) +
geom_histogram(binwidth = 1, fill = "maroon", alpha = 0.7) +
theme_minimal() +
scale_x_continuous(breaks = seq(min(czyste$floor, na.rm = TRUE),
max(czyste$floor, na.rm = TRUE),
by = 1)) 4.5.2 Analiza wykresu dla zmiennej floor
Wykres pokazuje, że większość mieszkań znajduje się na niższych piętrach oraz że ogólnie liczba budynków mających mniej niż 5 pięter jest większa, co sugeruje, że większość budynków jest raczej niewielka.
4.5.3 Wykres słupkowy dla zmiennej type
type_summary <- czyste %>%
count(type) %>%
mutate(percentage = n / sum(n) * 100)
ggplot(type_summary, aes(x = type, y = n)) +
geom_bar(stat = "identity", fill = "maroon", color = "black", width = 0.7) +
geom_text(aes(label = paste0(round(percentage, 1), "%")),
vjust = 2, hjust = 0.5, size = 5, color = "black") + # Center the percentage
theme_minimal() +
labs(title = "Distribution of Building Types", x = "Building Type", y = "Count") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) 4.5.4 Analiza wykresu dla zmiennej type
Bloki mieszkalne dominują w 62,5%, budynki mieszkalne stanowią 20,2%, a kamienice 17,3%. Znaczna liczba kamienic, które zazwyczaj są małe i niezbyt wysokie, w dużym stopniu przyczynia się do tego, że apartamenty w populacji znajdują się zazwyczaj na niższych piętrach.
4.6 Wizualizacja zmiennych buildingMaterial oraz hasSecurity
Analizujemy wpływ materiału oraz tego czy budynek posiada ochronę na cenę mieszkania.
4.6.1 Wizualizacja Boxplot buildingMaterial x price oraz hasSecurity x price
ggplot(czyste, aes(x = buildingMaterial, y = price, fill = buildingMaterial)) +
geom_boxplot(alpha = 0.8) +
theme_minimal() +
coord_flip() +
labs(title = "Wpływ Materiału budowalnego na cennę", x = "Materiał Budowlany", y = "Cena") +
scale_fill_manual(values = c("maroon", "mistyrose"))ggplot(czyste, aes(x = factor(hasSecurity, labels = c("No Security", "Has Security")), y = price)) +
geom_boxplot(aes(fill = factor(hasSecurity)), alpha = 0.8) +
theme_minimal() +
labs(title = "Wpływ ochrony na cennęmieszkania", x = "Ochrona", y = "Cena") +
scale_fill_manual(values = c("maroon", "mistyrose"))4.6.2 Analiza wykresów Boxplot buildingMaterial x price oraz hasSecurity x price
Dane pokazują, że ogólnie apartamenty zbudowane z cegły są droższe niż te wykonane z betonu, a apartamenty z ochroną są droższe niż te bez ochrony. Jednak w obu przypadkach istnieje wiele odstających wartości w populacji, co oznacza, że nie ma silnej korelacji między tymi dwoma czynnikami. Ważne dla analizy jest jednak to, że gęstość odstających wartości dla apartamentów bez ochrony sugeruje, że istnieją bardzo drogie apartamenty, które nie mają ochrony.
5. Wnioskowanie Statystyczne
Na potrzeby tego raportu testujemy hipotezę zerową, żeby sprawdzić czy zmienna price podlega rozkładowi normalnemu w tym celu przeprowadzamy Test Andersona-Darlinga.
5.1 Przeprowadzanie Testu Andersona-Darlinga
if (!require(nortest)) install.packages("nortest")
library(nortest)
# Test Andersona-Darlinga
ad_test <- ad.test(czyste$price)
print(ad_test)##
## Anderson-Darling normality test
##
## data: czyste$price
## A = 225.39, p-value < 2.2e-16
# Histogram z gęstością rozkładu
ggplot(czyste, aes(x = price)) +
geom_histogram(aes(y = ..density..), bins = 50, fill = "mistyrose", color = "black", alpha = 0.7) +
geom_density(color = "maroon", linewidth = 1) +
labs(title = "Histogram cen mieszkań z gęstością", x = "Cena", y = "Gęstość") +
theme_classic()# QQ-plot
ggplot(data.frame(price = czyste$price), aes(sample = price)) +
stat_qq(distribution = qnorm) +
stat_qq_line(distribution = qnorm, color = "maroon", linewidth = 1) +
labs(title = "QQ-plot dla cen mieszkań", x = "Kwantyle teoretyczne", y = "Kwantyle empiryczne") +
theme_linedraw()5.2 Analiza wyników Testu Andersona-Darlinga
Rezultatem kodu jest tabela z wynikiem Testu Andersona-Darlinga oraz 2 wykresy: wykres gęstości rozkładu oraz wykres kwantyl-kwantyl.
5.2.1
Wynikiem Testu Andersona-Darlinga jest współczynik A. Dla zmiennej Price wynosi on A=225,39.
A = 0 oznacza, że dane idealnie pasują do rozkładu normalnego. Wartość A > 0 wskazuje, że dane są coraz bardziej różne od rozkładu normalnego.
Wartość A = 225,39 jest bardzo wysoka, co sugeruje istotną różnicę między rozkładem próby a rozkładem normalnym.
Wartość P na poziomie p=2,2e^-16 czyli p<0,05 świadczy o tym, że możemy odrzucić hipotezę zerową.
5.2.2 Analiza wykresu gęstości rozkładu
wykres przedstawia histogram gęstości rozkładu gdzie histogram pokazuje rozkłąd cen miszkańa czerwona linia gęstość ich rozłożenia. Po kształcie histogramu widzimy, że rozkład cen mieszkań jest prawostronie skośny co mogliśmy zaobserować przy wcześniejszej analizie analizie skośności i kurtozy.
5.2.3 Analiza Wykresu kwantyl-kwantyl
Wykres porównuje empiryczny rozkład cen mieszkań do teoretycznego rozkładu normalnego. W lewym dolnym oraz w prawym górnym rogu wykresu widzimy znaczne odchylenia, co sugeruje, że ceny mieszkań nie podlegąją w pełni rozkładowi normalnemu.
5.3 Wnioski z testu Andersona-Darlinga:
Wartość A=225,39 świadczy o tym, że rozkład dla zmiennej price nie jest rozkładem normalnym Wartość p w teście Andersona-Darlinga jest na poziomie 2,2e^-16, odrzucamy więc hipotezę zerową.
6. Wyniki
6.1 Dane ogólne
Analiza polskiego rynku nieruchomości na podstawie danych z czerwca 2024 roku pokazuje, że większość polskich apartamentów, bo 83,4%, mieści się w przedziale cenowym od 250 000 do 1 000 000 PLN. Nawet po odrzuceniu wartości odstających widzimy znaczny wpływ
6.2 Wpływ na rozmiaru mieszkania na cenę
Zmiennymi o największym wpływie na cenę mieszkań są zmienne rooms oraz squareMeters jest to wynik przewidywalny i świadczy o normalnym w porównaniu do reszty świata stanie rynku.
6.3 Wpływ Miasta na Cenę
Wykresy pudełkowe pokazują znaczną zmienność cen między miastami. Stan apartamentu nie wpływa silnie na cenę, co pokazuje wykres skrzypcowy. Analiza ANOVA ceny według miasta i stanu potwierdza, że różnice cenowe zależą bardziej od miasta niż od stanu technicznego apartamentu.
6.4 Odległość od miasta
Negatywna korelacja między ceną a odległością od klinik/restauracji sugeruje, że apartamenty o wysokiej wartości znajdują się w rejonach o lepszej infrastrukturze miejskiej. Nieoczekiwany wynik: Apartamenty oddalone od centrum są droższe, co może wynikać z obecności luksusowych nieruchomości podmiejskich w zamkniętych osiedlach. Zbiór danych może być zniekształcony przez luksusowe inwestycje podmiejskie, a nie tradycyjne miejskie apartamenty.
6.5 Ostateczne wnioski
Polski rynek nieruchomości zdominowany jest przez mieszkania w średnim przedziale cenowym (500 000 - 999 999 PLN). W rynku luksusowym występują wartości odstające, które znacząco wpływają na miary statystyczne.Najdroższymi miastami do życia są: Warszawa, Kraków i Gdańsk a najtańszymi: Częstochowa i Radom. Miastami z największymi mieszkaniami są Gdynia i Szczein. Stan apartamentu ma niewielki wpływ na cenę, co sugeruje, że bardziej liczy się lokalizacja niż typ premium. Bliskość do klinik i restauracji ma pozytywny związek z ceną, podczas gdy odległość od centrum miasta wykazuje nieoczekiwaną negatywną korelację. Nieoczekiwany efekt odległości od centrum sugeruje, że drogie nieruchomości mogą być skoncentrowane w podmiejskich, luksusowych inwestycjach, a nie w tradycyjnych centrach miast.
7. Bibliografia
## Aby zacytować pakiet 'ggstatsplot' w publikacjach użyj:
##
## Patil, I. (2021). Visualizations with statistical details: The
## 'ggstatsplot' approach. Journal of Open Source Software, 6(61), 3167,
## doi:10.21105/joss.03167
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Article{,
## doi = {10.21105/joss.03167},
## url = {https://doi.org/10.21105/joss.03167},
## year = {2021},
## publisher = {{The Open Journal}},
## volume = {6},
## number = {61},
## pages = {3167},
## author = {Indrajeet Patil},
## title = {{Visualizations with statistical details: The {'ggstatsplot'} approach}},
## journal = {{Journal of Open Source Software}},
## }
## To cite mice in publications use:
##
## Stef van Buuren, Karin Groothuis-Oudshoorn (2011). mice: Multivariate
## Imputation by Chained Equations in R. Journal of Statistical
## Software, 45(3), 1-67. DOI 10.18637/jss.v045.i03.
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Article{,
## title = {{mice}: Multivariate Imputation by Chained Equations in R},
## author = {Stef {van Buuren} and Karin Groothuis-Oudshoorn},
## journal = {Journal of Statistical Software},
## year = {2011},
## volume = {45},
## number = {3},
## pages = {1-67},
## doi = {10.18637/jss.v045.i03},
## }
## To cite naniar in publications use:
##
## Tierney N, Cook D (2023). "Expanding Tidy Data Principles to
## Facilitate Missing Data Exploration, Visualization and Assessment of
## Imputations." _Journal of Statistical Software_, *105*(7), 1-31.
## doi:10.18637/jss.v105.i07 <https://doi.org/10.18637/jss.v105.i07>.
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Article{,
## title = {Expanding Tidy Data Principles to Facilitate Missing Data Exploration, Visualization and Assessment of Imputations},
## author = {Nicholas Tierney and Dianne Cook},
## journal = {Journal of Statistical Software},
## year = {2023},
## volume = {105},
## number = {7},
## pages = {1--31},
## doi = {10.18637/jss.v105.i07},
## }
## To cite VIM in publications use:
##
## Alexander Kowarik, Matthias Templ (2016). Imputation with the R
## Package VIM. Journal of Statistical Software, 74(7), 1-16.
## doi:10.18637/jss.v074.i07
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Article{,
## title = {Imputation with the {R} Package {VIM}},
## author = {Alexander Kowarik and Matthias Templ},
## journal = {Journal of Statistical Software},
## year = {2016},
## volume = {74},
## number = {7},
## pages = {1--16},
## doi = {10.18637/jss.v074.i07},
## }
## Aby zacytować pakiet 'psych' w publikacjach użyj:
##
## William Revelle (2024). _psych: Procedures for Psychological,
## Psychometric, and Personality Research_. Northwestern University,
## Evanston, Illinois. R package version 2.4.12,
## <https://CRAN.R-project.org/package=psych>.
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Manual{,
## title = {psych: Procedures for Psychological, Psychometric, and Personality Research},
## author = {{William Revelle}},
## organization = {Northwestern University},
## address = {Evanston, Illinois},
## year = {2024},
## note = {R package version 2.4.12},
## url = {https://CRAN.R-project.org/package=psych},
## }
## To cite corrplot in publications use:
##
## Taiyun Wei and Viliam Simko (2024). R package 'corrplot':
## Visualization of a Correlation Matrix (Version 0.95). Available from
## https://github.com/taiyun/corrplot
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Manual{corrplot2024,
## title = {R package 'corrplot': Visualization of a Correlation Matrix},
## author = {Taiyun Wei and Viliam Simko},
## year = {2024},
## note = {(Version 0.95)},
## url = {https://github.com/taiyun/corrplot},
## }
## To cite gtsummary in publications use:
##
## Sjoberg DD, Whiting K, Curry M, Lavery JA, Larmarange J. Reproducible
## summary tables with the gtsummary package. The R Journal
## 2021;13:570–80. https://doi.org/10.32614/RJ-2021-053.
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Article{gtsummary,
## author = {Daniel D. Sjoberg and Karissa Whiting and Michael Curry and Jessica A. Lavery and Joseph Larmarange},
## title = {Reproducible Summary Tables with the gtsummary Package},
## journal = {{The R Journal}},
## year = {2021},
## url = {https://doi.org/10.32614/RJ-2021-053},
## doi = {10.32614/RJ-2021-053},
## volume = {13},
## issue = {1},
## pages = {570-580},
## }
## Aby zacytować pakiet 'arsenal' w publikacjach użyj:
##
## Heinzen E, Sinnwell J, Atkinson E, Gunderson T, Dougherty G (2021).
## _arsenal: An Arsenal of 'R' Functions for Large-Scale Statistical
## Summaries_. R package version 3.6.3,
## <https://CRAN.R-project.org/package=arsenal>.
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Manual{,
## title = {arsenal: An Arsenal of 'R' Functions for Large-Scale Statistical
## Summaries},
## author = {Ethan Heinzen and Jason Sinnwell and Elizabeth Atkinson and Tina Gunderson and Gregory Dougherty},
## year = {2021},
## note = {R package version 3.6.3},
## url = {https://CRAN.R-project.org/package=arsenal},
## }
## Aby zacytować pakiet 'summarytools' w publikacjach użyj:
##
## Comtois D (2022). _summarytools: Tools to Quickly and Neatly
## Summarize Data_. R package version 1.0.1,
## <https://CRAN.R-project.org/package=summarytools>.
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Manual{,
## title = {summarytools: Tools to Quickly and Neatly Summarize Data},
## author = {Dominic Comtois},
## year = {2022},
## note = {R package version 1.0.1},
## url = {https://CRAN.R-project.org/package=summarytools},
## }
## Aby zacytować pakiet 'classInt' w publikacjach użyj:
##
## Bivand R (2025). _classInt: Choose Univariate Class Intervals_. R
## package version 0.4-11,
## <https://CRAN.R-project.org/package=classInt>.
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Manual{,
## title = {classInt: Choose Univariate Class Intervals},
## author = {Roger Bivand},
## year = {2025},
## note = {R package version 0.4-11},
## url = {https://CRAN.R-project.org/package=classInt},
## }
## Aby zacytować pakiet 'qwraps2' w publikacjach użyj:
##
## DeWitt P (2024). _qwraps2: Quick Wraps 2_. R package version 0.6.1,
## <https://CRAN.R-project.org/package=qwraps2>.
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Manual{,
## title = {qwraps2: Quick Wraps 2},
## author = {Peter DeWitt},
## year = {2024},
## note = {R package version 0.6.1},
## url = {https://CRAN.R-project.org/package=qwraps2},
## }
## Aby zacytować pakiet 'pastecs' w publikacjach użyj:
##
## Grosjean P, Ibanez F (2024). _pastecs: Package for Analysis of
## Space-Time Ecological Series_. R package version 1.4.2,
## <https://CRAN.R-project.org/package=pastecs>.
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Manual{,
## title = {pastecs: Package for Analysis of Space-Time Ecological Series},
## author = {Philippe Grosjean and Frederic Ibanez},
## year = {2024},
## note = {R package version 1.4.2},
## url = {https://CRAN.R-project.org/package=pastecs},
## }
## Aby zacytować pakiet 'desctable' w publikacjach użyj:
##
## Wack M, Boukobza A (2022). _desctable: Produce Descriptive and
## Comparative Tables Easily_. R package version 0.3.0,
## <https://CRAN.R-project.org/package=desctable>.
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Manual{,
## title = {desctable: Produce Descriptive and Comparative Tables Easily},
## author = {Maxime Wack and Adrien Boukobza},
## year = {2022},
## note = {R package version 0.3.0},
## url = {https://CRAN.R-project.org/package=desctable},
## }
## Aby zacytować pakiet 'ggpubr' w publikacjach użyj:
##
## Kassambara A (2023). _ggpubr: 'ggplot2' Based Publication Ready
## Plots_. R package version 0.6.0,
## <https://CRAN.R-project.org/package=ggpubr>.
##
## Wpis BibTex dla użytkowników LaTeX to
##
## @Manual{,
## title = {ggpubr: 'ggplot2' Based Publication Ready Plots},
## author = {Alboukadel Kassambara},
## year = {2023},
## note = {R package version 0.6.0},
## url = {https://CRAN.R-project.org/package=ggpubr},
## }