mieszkania5/SysInf.ipynb

232 KiB
Raw Blame History

Systemy informatyczne - 1. Organizacja pracy zespołowej

Klonowanie dostępnych danych uczących

!git clone git://gonito.net/mieszkania5
fatal: destination path 'mieszkania5' already exists and is not an empty directory.

Import danych treningowych, walidacyjnych i testowych

import numpy as np
import pandas as pd

Dane treningowe

df_train = pd.read_csv(r'mieszkania5\train\train.tsv', sep='\t', header=None)
df_train
0 1 2 3 4 5 6 7 8 9 ... 16 17 18 19 20 21 22 23 24 25
0 309000.0 do zamieszkania 390 zł spółdzielcze własnościowe 7113 https://www.otodom.pl/oferta/niezalezny-uklad-... 2 NaN 43.44 wtórny ... NaN gazowe plastikowe NaN NaN NaN cegła Polecamy na sprzedaż dwupokojowe mieszkanie p... NaN telewizja kablowa, internet, meble, piwnica, g...
1 314900.0 do wykończenia NaN pełna własność 7392 https://www.otodom.pl/oferta/urokliwe-mieszkan... 2 NaN 42.60 pierwotny ... NaN gazowe plastikowe NaN NaN NaN cegła Kameralne 2 pokojowe mieszkanie z aneksem kuc... NaN telewizja kablowa, internet, telefon, drzwi / ...
2 249000.0 do remontu 300 zł pełna własność 5621 https://www.otodom.pl/oferta/mieszkanie-do-rem... 2 NaN 44.30 wtórny ... NaN miejskie plastikowe 1960.0 NaN 2019-06-30 cegła Oferta bezpośrednio od właściciela - bez pośr... NaN telewizja kablowa, internet, telefon, domofon ...
3 419000.0 do zamieszkania 490 zł pełna własność 4761 https://www.otodom.pl/oferta/w-szeregowcu-4-po... 4 NaN 88 wtórny ... NaN gazowe plastikowe NaN NaN NaN cegła Drodzy Państwo Zapraszam do zapoznania się z ... NaN telewizja kablowa, internet, zmywarka, lodówka...
4 499000.0 NaN 850 zł NaN 6481 https://www.otodom.pl/oferta/komfortowe-przest... 3 NaN 77 wtórny ... NaN NaN plastikowe NaN NaN NaN NaN Biuro Immohouse ma przyjemność proponować do ... NaN balkon, piwnica, winda
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2542 507600.0 do wykończenia 1 zł pełna własność 5400 https://www.otodom.pl/oferta/mieszkanie-do-spr... 4 NaN 94 wtórny ... NaN gazowe drewniane 1914.0 NaN NaN cegła Do sprzedaży mieszkanie na drugim piętrze w s... NaN NaN
2543 342400.0 NaN NaN spółdzielcze własnościowe 6400 https://www.otodom.pl/oferta/mieszkanie-53-50-... 2 NaN 53.50 wtórny ... NaN miejskie drewniane 1999.0 NaN NaN cegła | Świetnie zlokalizowane, przestronne, czyste... NaN telewizja kablowa, internet, telefon, monitori...
2544 335000.0 NaN 280 zł pełna własność 6063 https://www.otodom.pl/oferta/mieszkanie-55-25-... 3 NaN 55.25 wtórny ... NaN NaN plastikowe 1910.0 NaN NaN cegła MIESZKANIE ŁAZARZ Przedmiotem sprzedaży jest ... NaN telewizja kablowa, internet, telefon, monitori...
2545 260000.0 NaN NaN NaN 4194 https://www.otodom.pl/oferta/mieszkanie-udzial... 3 NaN 62 wtórny ... NaN piece kaflowe NaN 1930.0 NaN 2011-07-05 cegła Polecam do sprzedaży mieszkanie w udziale kam... NaN piwnica, oddzielna kuchnia, pom. użytkowe
2546 1990000.0 do zamieszkania NaN NaN 5077 https://www.otodom.pl/oferta/mieszkania-w-kami... więcej niż 10 NaN 392 wtórny ... NaN gazowe NaN NaN NaN NaN cegła Sprzedam 7 mieszkań w centrum Poznania przy u... NaN lodówka, meble, piekarnik, kuchenka, pralka

2547 rows × 26 columns

Dane walidacyjne

df_valid = pd.read_csv(r'mieszkania5\dev-0\in.tsv', sep='\t', header=None)
df_valid
0 1 2 3 4 5 6 7 8 9 ... 15 16 17 18 19 20 21 22 23 24
0 do zamieszkania 250 zł pełna własność 6311 https://www.otodom.pl/oferta/idealne-mieszkani... 3 NaN 59.10 wtórny 4.0 ... NaN miejskie plastikowe NaN NaN NaN wielka płyta Zamieszkaj od zaraz idealna lokalizacja OFE... NaN telewizja kablowa, internet, telefon, domofon ...
1 do zamieszkania NaN pełna własność 7868 https://www.otodom.pl/oferta/2-pokoje-38m2-po-... 2 NaN 38.00 wtórny 12.0 ... NaN inne plastikowe NaN NaN NaN NaN Na sprzedaż mieszkanie dwupokojowe na osiedlu... NaN balkon
2 do zamieszkania 650 zł pełna własność 5717 https://www.otodom.pl/oferta/3-pokoje-na-jezyc... 3 NaN 63.84 wtórny 4.0 ... NaN miejskie plastikowe 1958.0 NaN NaN cegła !! Oferta dostępna tylko u nas !! Polecam ofe... NaN telewizja kablowa, internet, telefon, piwnica,...
3 do zamieszkania 359 zł spółdzielcze własnościowe 7380 https://www.otodom.pl/oferta/uniwersytet-przyr... 4 NaN 50.00 wtórny 10.0 ... NaN miejskie plastikowe 1975.0 NaN 2019-06-30 wielka płyta Oferta  bezpośrednio od właściciela  - bez po... NaN telewizja kablowa, internet, telefon, drzwi / ...
4 NaN NaN NaN 7373 https://www.otodom.pl/oferta/mieszkanie-blisko... 3 NaN 65.62 pierwotny 3.0 ... NaN NaN NaN 2020.0 NaN 2020-01-01 NaN MIESZKANIE 3-POKOJOWE O POW.65,62M2 Mieszkani... NaN garaż/miejsce parkingowe, taras, pom. użytkowe
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
457 do wykończenia NaN pełna własność 9007 https://www.otodom.pl/oferta/mieszkanie-zajezd... 3 NaN 72.78 pierwotny 5.0 ... NaN miejskie plastikowe 2019.0 NaN NaN cegła Zapraszam do zapoznania się z nową atrakcyjną... NaN telewizja kablowa, internet, monitoring / ochr...
458 do wykończenia NaN pełna własność 9202 https://www.otodom.pl/oferta/mieszkanie-zajezd... 2 NaN 51.23 pierwotny 5.0 ... NaN NaN NaN NaN NaN NaN NaN Zapraszam do zapoznania się z nową atrakcyjną... NaN garaż/miejsce parkingowe, winda
459 do wykończenia NaN pełna własność 5723 https://www.otodom.pl/oferta/nowe-mieszkanie-o... 3 NaN 54.16 pierwotny 3.0 ... NaN kotłownia plastikowe 2019.0 NaN 2019-12-31 silikat Mieszkanie składa się z 3 pokoi, aneksu kuche... NaN telewizja kablowa, internet, telefon, domofon ...
460 do zamieszkania 1 102.05 zł pełna własność 7758 https://www.otodom.pl/oferta/apartament-w-atan... 3 NaN 90.10 wtórny 5.0 ... NaN kotłownia plastikowe 2001.0 NaN 2018-04-13 cegła Proponuję bardzo atrakcyjny, przestronny, w p... NaN telewizja kablowa, drzwi / okna antywłamaniowe...
461 NaN NaN NaN 11822 https://www.otodom.pl/oferta/mieszkanie-71-90-... 2 NaN 71.90 wtórny 3.0 ... NaN NaN drewniane 2016.0 NaN NaN cegła Link do oferty: -wielkopolskie-poznan-grunwal... NaN balkon, garaż/miejsce parkingowe

462 rows × 25 columns

df_valid_cena = pd.read_csv(r'mieszkania5\dev-0\expected.tsv', sep='\t', header=None)
df_valid_cena
0
0 373000.00
1 299000.00
2 365000.00
3 369000.00
4 483791.00
... ...
457 655544.02
458 471397.97
459 309958.00
460 699000.00
461 850000.00

462 rows × 1 columns

Dane testowe

df_test = pd.read_csv(r'mieszkania5\test-A\in.tsv', sep='\t', header=None)
df_test
0 1 2 3 4 5 6 7 8 9 ... 15 16 17 18 19 20 21 22 23 24
0 do wykończenia NaN pełna własność 6938 https://www.otodom.pl/oferta/nowe-mieszkanie-z... 3 NaN 61.99 pierwotny 7.0 ... NaN NaN plastikowe 2020.0 NaN NaN NaN Prezentujemy naszą najnowszą inwestycje zloka... NaN telewizja kablowa, internet, telefon, drzwi / ...
1 do zamieszkania NaN pełna własność 6078 https://www.otodom.pl/oferta/3-pok-parter-nisk... 4 NaN 64.00 wtórny 4.0 ... NaN miejskie NaN 1982.0 NaN NaN wielka płyta Polecam na sprzedaż duże atrakcyjnie zlokaliz... NaN domofon / wideofon, balkon
2 do wykończenia NaN pełna własność 6150 https://www.otodom.pl/oferta/hot-oferta-od-dew... 3 NaN 51.15 pierwotny 5.0 ... NaN miejskie plastikowe 2020.0 NaN NaN cegła &gt... NaN telewizja kablowa, internet, telefon, domofon ...
3 do zamieszkania 350 zł pełna własność 9373 https://www.otodom.pl/oferta/mieszkanie-z-ogro... 2 NaN 45.77 wtórny 7.0 ... NaN NaN NaN NaN NaN NaN NaN !! OFERTA BEZPOŚREDNIA !! Na sprzedaż mieszkan... NaN telewizja kablowa, internet, telefon, drzwi / ...
4 NaN NaN NaN 7200 https://www.otodom.pl/oferta/osiedle-nowych-ko... 2 NaN 44.36 pierwotny 13.0 ... NaN NaN plastikowe NaN NaN 2020-08-01 NaN Inwestycja NOWYCH KOSMONAUTÓW powstaje u zbie... NaN telewizja kablowa, internet, telefon, drzwi / ...
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
413 do wykończenia NaN NaN 7150 https://www.otodom.pl/oferta/zielony-marcelin-... 1 NaN 34.97 pierwotny 8.0 ... NaN miejskie plastikowe NaN NaN NaN NaN Zielony Marcelin I etap mieszkanie nr 407, 1 ... NaN telewizja kablowa, internet, telefon, drzwi / ...
414 do wykończenia NaN pełna własność 6499 https://www.otodom.pl/oferta/nowe-mieszkanie-p... 3 NaN 49.06 pierwotny 3.0 ... NaN kotłownia plastikowe 2018.0 NaN 2018-12-31 silikat Mieszkanie składa się z 3 pokoi z aneksem kuc... NaN telewizja kablowa, internet, telefon, domofon ...
415 do wykończenia NaN pełna własność 9451 https://www.otodom.pl/oferta/mieszkanie-76-71-... 3 NaN 76.71 pierwotny 5.0 ... NaN NaN plastikowe 2019.0 NaN NaN NaN Zapraszam do zapoznania się z nową atrakcyjną... NaN monitoring / ochrona, garaż/miejsce parkingowe...
416 do wykończenia NaN pełna własność 9322 https://www.otodom.pl/oferta/mieszkanie-zajezd... 3 NaN 72.63 pierwotny 5.0 ... NaN NaN NaN NaN NaN NaN NaN Zapraszam do zapoznania się z nową atrakcyjną... NaN garaż/miejsce parkingowe, winda
417 do wykończenia NaN pełna własność 6500 https://www.otodom.pl/oferta/nowe-mieszkanie-w... 2 NaN 65.84 wtórny 10.0 ... NaN miejskie plastikowe 2012.0 NaN NaN pustak Super mieszkanie 2-pokojowe 65,84m2. wykończo... NaN telewizja kablowa, internet, telefon, monitori...

418 rows × 25 columns

Wybranie interesujących nas kolumn (cena, ilość pokoi, metraż, rok budowy)

df_train = df_train[[0, 6, 8, 19]]
df_valid[0] = df_valid_cena
df_valid = df_valid[[0, 5, 7, 18]]
df_test = df_test[[5, 7, 18]]

Zamiana nazw kolumn

df_train = df_train.rename(columns = {0:"cena", 6:"pokoje", 8:"metraz", 19:"rok"})
df_valid = df_valid.rename(columns = {0:"cena", 5:"pokoje", 7:"metraz", 18:"rok"})
df_test = df_test.rename(columns = {5:"pokoje", 7:"metraz", 18:"rok"})

Czyszczenie danych

Czyszczenie danych treningowych

df_train = df_train.dropna()
df_train = df_train.replace( "więcej niż 10", '11')
df_train = df_train[(df_train['rok'] >= 1800) & (df_train['rok'] <= 2023)]
df_train = df_train[df_train["metraz"] != '6 909']
df_train["pokoje"] = df_train["pokoje"].astype(float)
df_train["metraz"] = df_train["metraz"].astype(float)
df_train.describe()
cena pokoje metraz rok
count 1.763000e+03 1763.000000 1763.000000 1763.000000
mean 4.262096e+05 2.609756 60.068327 1992.024957
std 2.478208e+05 1.038289 29.652713 37.968540
min 8.500000e+04 1.000000 19.000000 1840.000000
25% 3.100000e+05 2.000000 43.000000 1976.000000
50% 3.671000e+05 2.000000 52.300000 2010.000000
75% 4.700000e+05 3.000000 68.000000 2019.000000
max 6.000000e+06 11.000000 404.000000 2022.000000
df_train
cena pokoje metraz rok
2 249000.0 2.0 44.30 1960.0
6 449000.0 4.0 92.00 1930.0
7 389000.0 3.0 63.60 1985.0
9 260000.0 3.0 44.20 1970.0
10 330682.0 3.0 48.99 2019.0
... ... ... ... ...
2541 383680.0 3.0 70.40 2016.0
2542 507600.0 4.0 94.00 1914.0
2543 342400.0 2.0 53.50 1999.0
2544 335000.0 3.0 55.25 1910.0
2545 260000.0 3.0 62.00 1930.0

1763 rows × 4 columns

Czyszczenie danych walidacyjnych

df_valid.describe()
cena pokoje metraz rok
count 4.620000e+02 462.000000 462.000000 322.000000
mean 4.108530e+05 2.528139 57.329113 1988.605590
std 2.049347e+05 0.953512 25.300686 113.363432
min 1.597610e+05 1.000000 1.000000 70.000000
25% 2.984000e+05 2.000000 42.000000 1980.000000
50% 3.520765e+05 2.000000 50.510000 2013.000000
75% 4.687800e+05 3.000000 66.315000 2019.000000
max 2.318580e+06 6.000000 234.200000 2021.000000
df_valid = df_valid.dropna()
df_valid = df_valid[df_valid['metraz'] > 10]
df_valid = df_valid[(df_valid['rok'] >= 1800) & (df_valid['rok'] <= 2023)]
df_valid = df_valid.replace( "więcej niż 10", '11')
df_valid["pokoje"] = df_valid["pokoje"].astype(float)
df_valid["metraz"] = df_valid["metraz"].astype(float)
df_valid
cena pokoje metraz rok
2 365000.00 3.0 63.84 1958.0
3 369000.00 4.0 50.00 1975.0
4 483791.00 3.0 65.62 2020.0
5 430000.00 5.0 96.00 2019.0
9 325000.00 2.0 49.00 2001.0
... ... ... ... ...
455 641395.58 2.0 72.78 2019.0
457 655544.02 3.0 72.78 2019.0
459 309958.00 3.0 54.16 2019.0
460 699000.00 3.0 90.10 2001.0
461 850000.00 2.0 71.90 2016.0

320 rows × 4 columns

Czyszczenie danych testowych

df_test['rok'].fillna(df_test['rok'].mean(), inplace=True)
df_test = df_test.dropna()
df_test = df_test.replace( "więcej niż 10", '11')
df_test["pokoje"] = df_test["pokoje"].astype(float)
df_test["metraz"] = df_test["metraz"].astype(float)
df_train.describe()
cena pokoje metraz rok
count 1.763000e+03 1763.000000 1763.000000 1763.000000
mean 4.262096e+05 2.609756 60.068327 1992.024957
std 2.478208e+05 1.038289 29.652713 37.968540
min 8.500000e+04 1.000000 19.000000 1840.000000
25% 3.100000e+05 2.000000 43.000000 1976.000000
50% 3.671000e+05 2.000000 52.300000 2010.000000
75% 4.700000e+05 3.000000 68.000000 2019.000000
max 6.000000e+06 11.000000 404.000000 2022.000000

Model regresji liniowej

from sklearn.linear_model import LinearRegression

Podział danych

X_train = df_train[["pokoje", "metraz", "rok"]]
y_train = df_train[["cena"]]
X_val = df_valid[["pokoje", "metraz", "rok"]]
y_val = df_valid[["cena"]]
X_test = df_test[["pokoje", "metraz", "rok"]]

Uczenie modelu

model = LinearRegression()
model.fit(X_train, y_train)
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
LinearRegression()

Walidacja modelu

from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error
y_train_pred = model.predict(X_train)
r2_score(y_true=y_train, y_pred=y_train_pred)
0.6264197107092035
mean_squared_error(y_true=y_train, y_pred=y_train_pred)
22930468691.882328
mean_absolute_error(y_true=y_train, y_pred=y_train_pred)
74283.11238859448
y_val_pred = model.predict(X_val)
r2_score(y_true=y_val, y_pred=y_val_pred)
0.5872189061243203
mean_squared_error(y_true=y_val, y_pred=y_val_pred)
12603444942.321444
mean_absolute_error(y_true=y_val, y_pred=y_val_pred)
68895.89161086899

Predykcja cen mieszkań

y_test_pred = model.predict(X_test)
y_test_pred_df = pd.DataFrame(y_test_pred, columns=['cena'])
y_test_pred_df
cena
0 445999.679659
1 391984.112513
2 361680.683534
3 341889.696262
4 330922.003962
... ...
413 299103.486333
414 343927.359472
415 559751.151754
416 509598.699344
417 511183.577622

418 rows × 1 columns

Wizualizacja regresji liniowej

import matplotlib.pyplot as plt

Cena nieruchomości ze względna na liczbę pokoi dla danych treningowych

coef = np.polyfit(X_train['pokoje'], y_train['cena'], 1)
poly1d_fn = np.poly1d(coef)

plt.plot(X_train['pokoje'], y_train['cena'], 'o', X_train['pokoje'], poly1d_fn(X_train['pokoje']), '--k')
plt.show()

Cena nieruchomości ze względna na rok wybudowania dla danych treningowych

coef = np.polyfit(X_train['rok'], y_train['cena'], 1)
poly1d_fn = np.poly1d(coef)

plt.plot(X_train['rok'], y_train['cena'], 'o', X_train['rok'], poly1d_fn(X_train['rok']), '--k')
plt.show()

Cena nieruchomości ze względna na metraż dla danych treningowych

coef = np.polyfit(X_train['metraz'], y_train['cena'], 1)
poly1d_fn = np.poly1d(coef)

plt.plot(X_train['metraz'], y_train['cena'], 'o', X_train['metraz'], poly1d_fn(X_train['metraz']), '--k')
plt.show()

Cena nieruchomości ze względna na liczbę pokoi dla danych testowych

coef = np.polyfit(X_train['metraz'], y_train['cena'], 1)
poly1d_fn = np.poly1d(coef)

plt.plot(X_test['pokoje'], y_test_pred_df['cena'], 'yo', X_train['pokoje'], poly1d_fn(X_train['pokoje']), '--k')
plt.show()

Cena nieruchomości ze względna na rok wybudowania dla danych testowych

coef = np.polyfit(X_train['metraz'], y_train['cena'], 1)
poly1d_fn = np.poly1d(coef)

plt.plot(X_test['rok'], y_test_pred_df['cena'], 'yo', X_train['rok'], poly1d_fn(X_train['rok']), '--k')
plt.show()

Cena nieruchomości ze względna na metraż dla danych testowych

coef = np.polyfit(X_train['metraz'], y_train['cena'], 1)
poly1d_fn = np.poly1d(coef)

plt.plot(X_test['metraz'], y_test_pred_df['cena'], 'yo', X_train['metraz'], poly1d_fn(X_train['metraz']), '--k')
plt.show()

Funkcja predykcji ceny mieszkania

def cena_mieszkania(pokoje, metraz, rok):
    mieszkanie = pd.DataFrame([[pokoje, metraz, rok]], columns=['pokoje', 'metraz', 'rok'])
    cena = model.predict(mieszkanie).item()
    return np.round(cena, 2)
cena_mieszkania(pokoje=2, metraz=25, rok=2000)
184531.94
# Zapisanie modelu do pliku
import pickle
filename = 'mieszkania_model'
pickle.dump(model, open(filename, 'wb'))

Zapisywanie wyników

Zapisywanie wyników zbioru walidacyjnego

y_val_pred = pd.DataFrame(y_val_pred)
y_val_pred.to_csv(r'dev-0\out.tsv', sep='\t', header=None, index=None)

Zapisywanie wyników zbioru testowego

y_test_pred_df.to_csv(r'test-A\out.tsv', sep='\t', header=None, index=None)