options(
  tibble.width = Inf,
  width = 2000,
  dplyr.width = Inf,
  max.print = 1e6
)

1 Wprowadzenie

Celem pracy jest identyfikacja cech, które najsilniej różnicują nieruchomości, oraz sprawdzenie, czy zmienną price należy traktować jako jedną z cech opisujących obiekt, czy jako zmienną „wyjaśnianą” przez pozostałe atrybuty. Zastosowano dwie metody redukcji wymiarów: PCA oraz klasyczne MDS, w wersji dwuwymiarowej i trójwymiarowej. Analizę wykonano w dwóch wariantach: (A) z ceną w zbiorze cech oraz (B) bez ceny w zbiorze cech (cena używana jedynie do kolorowania punktów na wykresach).

2 Przygotowanie i konfiguracja analizy

2.1 Wczytanie danych wejsciowych

Dane pochodzą z Kaggle i zawieraja informacje na temat domów cena i inne ich właściwości.

df <- read_csv("Housing.csv")

2.2 Przygotowanie danych wejsciowych

Zmienne kategoryczne typu yes/no przekodowano do postaci binarnej (1/0). Zmienną furnishingstatus potraktowano jako porządkową i zakodowano liczbowo: unfurnished = 0, semi-furnished = 0.5, furnished = 1. Zrezygnowano z kodowania „dummy”, aby nie zwiększać liczby wymiarów (co mogłoby utrudnić interpretację w PCA/MDS)

df_num_all <- df %>%
  mutate(
    furnishingstatus = case_when(
      furnishingstatus == "unfurnished"     ~ 0,
      furnishingstatus == "semi-furnished"  ~ 0.5,
      furnishingstatus == "furnished"       ~ 1,
      TRUE                                  ~ NA_real_
    )
  ) %>%
  mutate(
    across(
      where(is.character),
      ~ ifelse(. == "yes", 1,
               ifelse(. == "no", 0, NA))
    )
  ) %>%
  select(where(is.numeric)) %>%
  drop_na()


price_vec <- df_num_all$price

# Wariant A: cena jako cecha wejściowa
X_with_price <- df_num_all

# Wariant B: cena jako coś do wyjaśnienia (nie wchodzi do PCA/MDS), ale kolorujemy ceną
X_no_price <- df_num_all %>% select(-price)

2.3 Standaryzacja

Dane zostały standaryzowane (Z-score), ponieważ PCA i MDS (oparte na odległościach euklidesowych) są wrażliwe na różne skale zmiennych

# Standaryzacja
Xw_scaled <- scale(X_with_price)
Xn_scaled <- scale(X_no_price)

2.4 Przygotowanie funkcji

############################################################
# 2) FUNKCJE: PCA i MDS + "ile opisuje" + JEDNA SKALA KOLORU
############################################################


# ---- wspólne limity ceny (muszą być zdefiniowane wcześniej jako price_vec)
price_limits <- range(price_vec, na.rm = TRUE)

# ---- jedna wspólna paleta (fiolet -> żółty)
pal <- viridisLite::viridis(256, option = "D")

# ggplot: identyczna paleta + identyczne limity
price_scale_gg <- ggplot2::scale_color_gradientn(
  colours = pal,
  limits  = price_limits,
  oob     = scales::squish,
  name    = "Price"
)

# plotly: identyczna paleta jako colorscale
plotly_colorscale <- lapply(seq_along(pal), function(i) {
  list((i - 1) / (length(pal) - 1), pal[i])
})

# --- PCA
pca_run <- function(X_scaled) {
  pca <- prcomp(X_scaled, center = TRUE, scale. = FALSE)
  ev  <- (pca$sdev^2) / sum(pca$sdev^2)
  list(pca = pca, ev = ev)
}

# --- MDS klasyczne
mds_run <- function(X_scaled, k) {
  D <- dist(X_scaled, method = "euclidean")
  m <- cmdscale(D, k = k, eig = TRUE)
  coords <- as.data.frame(m$points)
  colnames(coords) <- paste0("Dim", 1:k)
  list(coords = coords, eig = m$eig)
}

# --- GOF dla MDS
mds_gof <- function(eig, k) {
  eig_pos <- eig[eig > 0]
  if (length(eig_pos) < k) return(NA_real_)
  sum(eig_pos[1:k]) / sum(eig_pos)
}

# --- 2D ggplot (z jedną skalą)
plot2d <- function(df_plot, x, y, title) {
  ggplot(df_plot, aes_string(x = x, y = y, color = "price")) +
    geom_point(alpha = 0.7) +
    price_scale_gg +
    theme_minimal() +
    labs(title = title)
}

# --- 3D plotly (z jedną skalą)
plot3d <- function(df_plot, x, y, z, title) {
  plot_ly(
    df_plot,
    x = as.formula(paste0("~", x)),
    y = as.formula(paste0("~", y)),
    z = as.formula(paste0("~", z)),
    type = "scatter3d",
    mode = "markers",
    marker = list(
      size = 3,
      opacity = 0.7,
      color = df_plot$price,
      colorscale = plotly_colorscale,
      cmin = price_limits[1],
      cmax = price_limits[2],
      showscale = TRUE,
      colorbar = list(title = "Price")
    )
  ) %>% layout(title = title)
}
############################################################
# FUNKCJE DO PREZENTACJI TABEL
############################################################

round_df <- function(x, digits = 4) {
  x %>%
    dplyr::mutate(
      dplyr::across(
        where(is.numeric),
        ~ round(.x, digits)
      )
    )
}

show_dt <- function(x, n = 25, digits = 4) {

  x2 <- x %>%
    dplyr::mutate(
      dplyr::across(
        where(is.numeric),
        ~ round(.x, digits)
      )
    )

  dt <- DT::datatable(
    x2,
    rownames = FALSE,
    width = "100%",
    options = list(
      pageLength = n,
      scrollX = TRUE,
      autoWidth = FALSE,
      scrollCollapse = TRUE,
      initComplete = DT::JS(
        "function(settings, json) {",
        "  this.api().columns.adjust();",
        "}"
      )
    )
  )

  num_cols <- names(x2)[vapply(x2, is.numeric, logical(1))]

  if (length(num_cols) > 0) {
    dt$x$options$columnDefs <- list(
      list(
        targets = which(names(x2) %in% num_cols) - 1,
        render = DT::JS(
          "function(data, type, row) {",
          "  if (type !== 'display') return data;",
          "  return parseFloat(data).toString();",
          "}"
        )
      )
    )
  }

  dt
}

3 Redukcja wymiarów

3.1 PCA z ceną

############################################################
# 3) WARIANT A — PCA Z CENĄ (2D -> 3D -> TABELE)
############################################################

pca_w <- pca_run(Xw_scaled)

# --- PCA 2D
pca_w_2d <- data.frame(
  PC1 = pca_w$pca$x[,1],
  PC2 = pca_w$pca$x[,2],
  price = price_vec
)
plot2d(pca_w_2d, "PC1", "PC2", "PCA 2D – cena w cechach")

Rysunek przedstawia projekcję danych do przestrzeni dwuwymiarowej uzyskanej metodą PCA. Widoczny jest ciągły gradient cenowy, co wskazuje, że cena silnie różnicuje obserwacje wzdłuż głównych kierunków zmienności danych oraz stanowi istotny czynnik kształtujący strukturę zbioru.

# --- PCA 3D
pca_w_3d <- data.frame(
  PC1 = pca_w$pca$x[,1],
  PC2 = pca_w$pca$x[,2],
  PC3 = pca_w$pca$x[,3],
  price = price_vec
)
plot3d(pca_w_3d, "PC1", "PC2", "PC3", "PCA 3D – cena w cechach")

Trójwymiarowa projekcja PCA pozwala lepiej uchwycić strukturę danych i częściowo ogranicza nakładanie się obserwacji widoczne w 2D, przy jednoczesnym zachowaniu wyraźnego gradientu cenowego. Dla wyższych wartości ceny obserwowana jest większa rozpiętość punktów, co sugeruje większe zróżnicowanie cech nieruchomości o wysokiej wartości.

# --- TABELA: explained variance (PEŁNA)
ev_w <- pca_w$ev

ev_tbl_w <- data.frame(
  Component = paste0("PC", seq_along(ev_w)),
  Explained = ev_w,
  Explained_pct = ev_w * 100,
  Cumulative_pct = cumsum(ev_w) * 100
)

show_dt(ev_tbl_w, n = 25, digits = 4)

Tabela przedstawia udział wariancji wyjaśnionej przez kolejne składowe główne PCA oraz wariancję skumulowaną. Wyniki wskazują, że pierwsze kilka składowych opisuje znaczną część zmienności danych. W szczególności zachowanie pierwszych siedmiu składowych głównych (PC7), co odpowiada redukcji liczby zmiennych o około 50%, pozwala zachować około 75% całkowitej wariancji, co świadczy o wysokiej efektywności redukcji wymiarów w analizowanym zbiorze danych

# --- TABELA: loadings (PEŁNA) dla PC1–PC3 + wartości bezwzględne
load_tbl_w <- as.data.frame(pca_w$pca$rotation)
load_tbl_w$variable <- rownames(load_tbl_w)

# zabezpieczenie gdyby PC3 nie istniało (np. bardzo mało zmiennych)
if (!("PC3" %in% colnames(load_tbl_w))) load_tbl_w$PC3 <- NA_real_

load_tbl_w <- load_tbl_w %>%
  dplyr::select(variable, PC1, PC2, PC3) %>%
  mutate(
    abs_PC1 = abs(PC1),
    abs_PC2 = abs(PC2),
    abs_PC3 = abs(PC3)
  ) %>%
  arrange(desc(abs_PC1))

show_dt(load_tbl_w, n = 25, digits = 4)

Analiza ładunków wskazuje, że na pierwsze składowe główne najsilniej wpływają zmienne związane z ceną oraz wielkością i standardem nieruchomości, w szczególności: price, area, bathrooms, bedrooms, stories oraz airconditioning. Zmienne te w największym stopniu kształtują główne kierunki zmienności danych i odpowiadają za obserwowany gradient cenowy w przestrzeni PCA.

3.2 MDS z ceną

############################################################
# 4) WARIANT A — MDS Z CENĄ (2D -> 3D -> GOF)
############################################################

mds_w_2 <- mds_run(Xw_scaled, k = 2)
mds_w_3 <- mds_run(Xw_scaled, k = 3)

# --- MDS 2D
mds_w_2d <- mds_w_2$coords %>%
  mutate(price = price_vec)

plot2d(mds_w_2d, "Dim1", "Dim2", "MDS 2D – cena w cechach")

Wykres MDS w dwóch wymiarach przedstawia odwzorowanie relacji odległości pomiędzy nieruchomościami w przestrzeni cech. Widoczny jest wyraźny gradient cenowy, a ogólny układ punktów jest zbliżony do obserwowanego w PCA, co wskazuje na podobną strukturę danych oraz spójność wyników obu metod.

# --- MDS 3D
mds_w_3d <- mds_w_3$coords %>%
  mutate(price = price_vec)

plot3d(mds_w_3d, "Dim1", "Dim2", "Dim3", "MDS 3D – cena w cechach")

Trójwymiarowa projekcja MDS pozwala na lepsze odwzorowanie relacji odległości pomiędzy nieruchomościami i częściowo ogranicza nakładanie się obserwacji widoczne w projekcji dwuwymiarowej. Układ punktów pozostaje spójny z wynikami PCA, a gradient cenowy jest nadal wyraźnie widoczny, co potwierdza stabilność struktury danych.

# --- TABELA: GOF 2D i 3D
gof_w_2 <- mds_gof(mds_w_3$eig, 2)
gof_w_3 <- mds_gof(mds_w_3$eig, 3)

gof_tbl_w <- data.frame(
  Dimensions = c("2D", "3D"),
  GOF = c(gof_w_2, gof_w_3),
  GOF_pct = c(gof_w_2, gof_w_3) * 100
)

show_dt(gof_tbl_w, n = 10, digits = 4)

Tabela przedstawia miarę dopasowania (GOF) dla MDS w dwóch i trzech wymiarach. Uzyskane wartości GOF są identyczne z udziałami wariancji wyjaśnionej przez kolejne składowe PCA, co wynika z matematycznej równoważności klasycznego MDS opartego na odległościach euklidesowych oraz PCA na danych standaryzowanych. Taka zgodność wyników jest zgodna z założeniami teoretycznymi i potwierdza liniową strukturę analizowanych danych.

############################################################
# MDS – wpływ zmiennych (korelacje z wymiarami)
############################################################

# współrzędne MDS (3D)
mds_coords_w <- mds_w_3$coords

# dane wejściowe (te same, które były w MDS)
X_w <- as.data.frame(Xw_scaled)

# korelacje zmiennych z Dim1, Dim2, Dim3
mds_var_corr_w <- sapply(X_w, function(v) {
  c(
    cor(v, mds_coords_w$Dim1),
    cor(v, mds_coords_w$Dim2),
    cor(v, mds_coords_w$Dim3)
  )
})

mds_var_corr_w <- as.data.frame(t(mds_var_corr_w))
colnames(mds_var_corr_w) <- c("Dim1", "Dim2", "Dim3")
mds_var_corr_w$variable <- rownames(mds_var_corr_w)

mds_var_corr_w <- mds_var_corr_w %>%
  dplyr::select(variable, Dim1, Dim2, Dim3) %>%
  mutate(
    abs_Dim1 = abs(Dim1),
    abs_Dim2 = abs(Dim2),
    abs_Dim3 = abs(Dim3)
  ) %>%
  arrange(desc(abs_Dim1))

show_dt(mds_var_corr_w)

Tabela przedstawia korelacje pomiędzy oryginalnymi zmiennymi opisującymi nieruchomości a wymiarami przestrzeni MDS (Dim1–Dim3). Wartości bezwzględne korelacji wskazują, które cechy najsilniej różnicują obserwacje wzdłuż poszczególnych wymiarów MDS.

Wzdłuż pierwszego wymiaru (Dim1) najsilniejszy wpływ mają zmienne price, area, bathrooms, airconditioning, bedrooms oraz stories, co sugeruje, że Dim1 odzwierciedla przede wszystkim ogólną skalę i standard nieruchomości silnie powiązane z ceną.

Drugi wymiar (Dim2) jest w większym stopniu związany ze zmiennymi stories, basement, guestroom oraz prefarea, wskazując na znaczenie cech funkcjonalnych i układu budynku.

Trzeci wymiar (Dim3) różnicowany jest głównie przez zmienne basement, guestroom, mainroad oraz parking, co może wskazywać na dodatkowe aspekty infrastrukturalne i dostępności nieruchomości.

Należy podkreślić, że korelacje te mają charakter interpretacyjny, ponieważ w metodzie MDS wymiary nie są bezpośrednio definiowane przez zmienne, a jedynie służą do zachowania relacji odległości pomiędzy obserwacjami.

Wartości korelacji zmiennych z wymiarami MDS różnią się od ładunków uzyskanych w PCA, ponieważ osie w metodzie MDS nie są bezpośrednio definiowane jako kombinacje liniowe zmiennych. W MDS wymiary konstruowane są w taki sposób, aby jak najlepiej zachować relacje odległości pomiędzy obserwacjami, a nie maksymalizować wariancję poszczególnych zmiennych, jak ma to miejsce w PCA.

W konsekwencji korelacje zmiennych z wymiarami MDS mają charakter pomocniczy i zależą od orientacji osi w przestrzeni MDS, która może różnić się od orientacji osi PCA, mimo identycznej jakości odwzorowania struktury danych. Różnice te są zatem naturalne i nie świadczą o niespójności wyników obu metod.

3.3 PCA bez ceny

############################################################
# 5) WARIANT B — PCA BEZ CENY (2D -> 3D -> TABELE)
############################################################

pca_n <- pca_run(Xn_scaled)

# --- PCA 2D
pca_n_2d <- data.frame(
  PC1 = pca_n$pca$x[,1],
  PC2 = pca_n$pca$x[,2],
  price = price_vec
)
plot2d(pca_n_2d, "PC1", "PC2", "PCA 2D – bez ceny w cechach")

Rysunek przedstawia projekcję PCA uzyskaną po usunięciu zmiennej price z zestawu cech. Pomimo braku ceny w analizie, jej gradient pozostaje wyraźnie widoczny, co wskazuje na silne powiązanie ceny z pozostałymi cechami opisującymi nieruchomości oraz na fakt, że informacja o cenie jest pośrednio kodowana w strukturze danych

# --- PCA 3D
pca_n_3d <- data.frame(
  PC1 = pca_n$pca$x[,1],
  PC2 = pca_n$pca$x[,2],
  PC3 = pca_n$pca$x[,3],
  price = price_vec
)
plot3d(pca_n_3d, "PC1", "PC2", "PC3", "PCA 3D – bez ceny w cechach")

Trójwymiarowa wizualizacja PCA po usunięciu zmiennej price pokazuje, że ogólna struktura danych pozostaje zbliżona do wariantu, w którym cena była uwzględniona jako cecha. Również w przestrzeni 3D widoczny jest gradient cenowy, co wskazuje, że pozostałe zmienne w dużej mierze pośrednio zawierają informację o cenie i odtwarzają jej zróżnicowanie

# --- TABELA: explained variance (PEŁNA)
ev_n <- pca_n$ev

ev_tbl_n <- data.frame(
  Component = paste0("PC", seq_along(ev_n)),
  Explained = ev_n,
  Explained_pct = ev_n * 100,
  Cumulative_pct = cumsum(ev_n) * 100
)

show_dt(ev_tbl_n, n = 25, digits = 4)

Tabela przedstawia udział wariancji wyjaśnionej przez kolejne składowe główne PCA po usunięciu zmiennej price z zestawu cech. Pierwsza składowa (PC1) wyjaśnia ok. 20,6% wariancji, a dwie pierwsze składowe łącznie ok. 33,4%. Aby osiągnąć poziom około 75% wariancji skumulowanej, konieczne jest uwzględnienie siedmiu składowych (PC1–PC7), co oznacza redukcję liczby wymiarów o blisko 40% względem pierwotnego zbioru zmiennych.

W porównaniu z wariantem uwzględniającym cenę, rozkład wariancji pomiędzy składowe jest bardziej równomierny, co sugeruje, że usunięcie ceny eliminuje dominującą zmienną i powoduje, że struktura danych jest opisywana przez szerszy zestaw cech technicznych nieruchomości.

# --- TABELA: loadings (PEŁNA) dla PC1–PC3 + wartości bezwzględne
load_tbl_n <- as.data.frame(pca_n$pca$rotation)
load_tbl_n$variable <- rownames(load_tbl_n)

if (!("PC3" %in% colnames(load_tbl_n))) load_tbl_n$PC3 <- NA_real_

load_tbl_n <- load_tbl_n %>%
  dplyr::select(variable, PC1, PC2, PC3) %>%
  mutate(
    abs_PC1 = abs(PC1),
    abs_PC2 = abs(PC2),
    abs_PC3 = abs(PC3)
  ) %>%
  arrange(desc(abs_PC1))

show_dt(load_tbl_n, n = 25, digits = 4)

Tabela przedstawia ładunki (loadings) zmiennych dla trzech pierwszych składowych głównych PCA po usunięciu ceny z zestawu cech. Wartości bezwzględne ładunków wskazują siłę wpływu poszczególnych zmiennych na kierunki głównej zmienności danych.

Pierwsza składowa (PC1) jest najsilniej związana z cechami opisującymi wielkość i standard nieruchomości, takimi jak area, bathrooms, bedrooms, airconditioning, parking oraz stories. Wszystkie te zmienne mają zbliżone wartości ładunków i ten sam znak, co sugeruje, że PC1 opisuje ogólny „rozmiarowo-jakościowy” wymiar nieruchomości.

Druga składowa (PC2) jest w większym stopniu kształtowana przez cechy funkcjonalne i lokalizacyjne, w szczególności stories, basement, prefarea oraz guestroom. Wskazuje to, że PC2 różnicuje nieruchomości pod względem układu budynku i dodatkowych udogodnień.

Trzecia składowa (PC3) silnie wiąże się z cechami takimi jak basement, guestroom, mainroad oraz parking, co sugeruje, że opisuje ona bardziej szczegółowe aspekty infrastrukturalne i dostępności nieruchomości.

W porównaniu z wariantem PCA z ceną, ładunki są bardziej równomiernie rozłożone pomiędzy zmienne, a żadna pojedyncza cecha nie dominuje jednoznacznie struktury danych. Potwierdza to, że cena w poprzednim wariancie pełniła rolę zmiennej syntetycznej, silnie agregującej informacje zawarte w pozostałych cechach.

3.4 MDS bez ceny

############################################################
# 6) WARIANT B — MDS BEZ CENY (2D -> 3D -> GOF)
############################################################

mds_n_2 <- mds_run(Xn_scaled, k = 2)
mds_n_3 <- mds_run(Xn_scaled, k = 3)

# --- MDS 2D
mds_n_2d <- mds_n_2$coords %>%
  mutate(price = price_vec)

plot2d(mds_n_2d, "Dim1", "Dim2", "MDS 2D – bez ceny w cechach")

Dwuwymiarowa wizualizacja MDS po usunięciu ceny z zestawu cech nadal zachowuje czytelny gradient cenowy. Układ punktów jest bardzo zbliżony do obserwowanego w PCA bez ceny, jednak może być względem niego odwrócony lub obrócony, co jest naturalną własnością metody MDS.

Potwierdza to, że relacje pomiędzy obserwacjami są w dużej mierze determinowane przez cechy silnie skorelowane z ceną, a orientacja osi w MDS nie ma bezpośredniej interpretacji i nie wpływa na jakość odwzorowania odległości.

# --- MDS 3D
mds_n_3d <- mds_n_3$coords %>%
  mutate(price = price_vec)

plot3d(mds_n_3d, "Dim1", "Dim2", "Dim3", "MDS 3D – bez ceny w cechach")

Trójwymiarowa wizualizacja MDS po usunięciu ceny z zestawu cech również zachowuje wyraźny gradient cenowy. Przejście do przestrzeni trójwymiarowej pozwala lepiej odwzorować relacje odległości pomiędzy obserwacjami i częściowo ogranicza nakładanie się punktów widoczne w projekcji dwuwymiarowej.

Wynik ten potwierdza, że struktura danych jest w dużej mierze determinowana przez cechy silnie skorelowane z ceną, a informacja o cenie pozostaje pośrednio zakodowana w pozostałych zmiennych.

# --- TABELA: GOF 2D i 3D
gof_n_2 <- mds_gof(mds_n_3$eig, 2)
gof_n_3 <- mds_gof(mds_n_3$eig, 3)

gof_tbl_n <- data.frame(
  Dimensions = c("2D", "3D"),
  GOF = c(gof_n_2, gof_n_3),
  GOF_pct = c(gof_n_2, gof_n_3) * 100
)

show_dt(gof_tbl_n, n = 10, digits = 4)

Wartości GOF dla MDS są zgodne z wynikami PCA, co potwierdza spójność obu metod w ocenie jakości redukcji wymiarów.

# MDS bez ceny – korelacje
mds_coords_n <- mds_n_3$coords
X_n <- as.data.frame(Xn_scaled)

mds_var_corr_n <- sapply(X_n, function(v) {
  c(
    cor(v, mds_coords_n$Dim1),
    cor(v, mds_coords_n$Dim2),
    cor(v, mds_coords_n$Dim3)
  )
})

mds_var_corr_n <- as.data.frame(t(mds_var_corr_n))
colnames(mds_var_corr_n) <- c("Dim1", "Dim2", "Dim3")
mds_var_corr_n$variable <- rownames(mds_var_corr_n)

mds_var_corr_n <- mds_var_corr_n %>%
  dplyr::select(variable, Dim1, Dim2, Dim3) %>%
  mutate(
    abs_Dim1 = abs(Dim1),
    abs_Dim2 = abs(Dim2),
    abs_Dim3 = abs(Dim3)
  ) %>%
  arrange(desc(abs_Dim1))

show_dt(mds_var_corr_n)

Tabela pokazuje, które zmienne najsilniej wpływają na wymiary MDS, potwierdzając, że struktura danych jest determinowana przez cechy opisujące skalę i funkcjonalność nieruchomości

4 Interpretacja wynikow i wnioski

Przeprowadzona analiza potwierdza, że zmienna price odgrywa kluczową rolę w opisie struktury danych dotyczących nieruchomości. W wariancie, w którym cena została uwzględniona jako jedna z cech, pierwsze składowe PCA wyjaśniają wyraźnie większą część wariancji, co wskazuje, że cena agreguje informacje zawarte w wielu pozostałych zmiennych, takich jak powierzchnia, liczba pomieszczeń czy standard wyposażenia. Przy silnej redukcji wymiarów (2–3 składowe) obecność ceny znacząco poprawia czytelność struktury danych.

Wraz ze wzrostem liczby uwzględnianych składowych różnice pomiędzy wariantem z ceną i bez ceny stopniowo maleją. Oznacza to, że przy słabszej redukcji wymiarów informacja o cenie jest w coraz większym stopniu odtwarzana pośrednio przez pozostałe cechy nieruchomości, co świadczy o silnych zależnościach pomiędzy ceną a atrybutami technicznymi i funkcjonalnymi budynków.

Porównanie metod PCA i klasycznego MDS wykazało bardzo dużą zbieżność wyników. Zarówno poziom wariancji wyjaśnionej w PCA, jak i wartości miary dopasowania (GOF) w MDS są identyczne dla odpowiadających sobie wymiarów. Jest to oczekiwany rezultat, wynikający z faktu, że klasyczne MDS oparte na odległościach euklidesowych jest ściśle powiązane z PCA. W konsekwencji obie metody opisują tę samą strukturę danych, a różnice w orientacji osi nie mają znaczenia interpretacyjnego.

Analiza przeprowadzona bez uwzględnienia ceny w zbiorze cech pokazała, że gradient cenowy pozostaje wyraźnie widoczny zarówno w PCA, jak i w MDS. Oznacza to, że pozostałe zmienne w dużej mierze pośrednio kodują informację o cenie, co potwierdza spójność i stabilność struktury danych.

Podsumowując, cena nieruchomości może być traktowana zarówno jako zmienna objaśniająca, jak i objaśniana, przy czym jej rola zależy od stopnia redukcji wymiarów oraz celu analizy. Przy niewielkiej liczbie wymiarów cena stanowi zmienną dominującą i znacząco wzmacnia opis danych, natomiast analiza bez jej bezpośredniego uwzględnienia pozwala lepiej zrozumieć relacje pomiędzy cechami technicznymi nieruchomości. Zastosowanie zarówno PCA, jak i MDS umożliwiło potwierdzenie tych wniosków z dwóch komplementarnych perspektyw i zwiększyło wiarygodność przeprowadzonej analizy.

AI użyto do kodowania i redagowania tekstu.