Szolgáltatások elérhetősége, ingatlanértékelés

A fejezet során felhasználandó téradatok (elérhetők a Letöltéseknél):

  • Épületek (OSM)
  • Érdekes helyek (OSM)
  • Adminisztratív határok - kerületek

Az ingatlanérték-becslés nem egzakt tudomány, nem csupán matematikai modelleket alkalmazó szakma, hanem bizonyos mértékig látnokság, jövőkutatás is. Abban az értelemben igaz mindez, hogy a vagyontárgy piaci értékét csak akkor lehet biztosan tudni, ha az már elkelt. Az értékbecslési problémák megoldásához azonban mégiscsak nélkülözhetetlen a matematika bizonyos szintű alkalmazása. Az értékbecslés egyrészt rögzíti és dokumentálja mindazokat a tényeket, melyek befolyásolják az ingatlan értékét. Ilyenek: az ingatlan fekvése, telekterületének építési hatósági besorolása, az építmény műszaki állapota stb. Meghatározhatja ezen túlmenően mindazokat az ingatlan közelebbi és távolabbi környezetében ható tényezőket, melyek kihathatnak az ingatlan forgalmi értékére. Így foglalkozhat a település közlekedési viszonyaival, országos (nemzetközi) megközelítésének lehetőségeivel, a térségre vonatkozó fejlesztési elképzelésekkel is.

Az előző bekezdésből egyértelműen kiderül, hogy az ingatlanok értékének becslése egy többváltozós probléma, ahol a térnek, ebből kifolyólag a térinformatikának is fontos szerepe van.

A fejezet egy egyszerű, egyváltozós mintafeladatot mutat be, amiben megvizsgáljuk a bevásárlóközpontok elérhetőségét, közelségét, az épületekhez viszonyítva. Ez az etűdfeladat könnyen továbbfejleszthető, akár kibővíthető többváltozós értékelésre.

Először töltsük be az OpenStreetMapből exportált épületeket, és szelektáljuk egy budapesti kerületre eső részhalmazát:

Vektor / Geoprocesszing eszközök / Vágás
Input réteg: Épületek
Csak a szelektált elemek [x]
Réteg átfedése: Kerületek
Csak a szelektált elemek [x]

Hasonlóan járjunk el az érdekes helyek réteggel. A vágást követően szelektáljuk a bevásárlóközpontokat, és képezzünk belőlük egy új réteget. Majd transzformáljuk mindkét réteget WGS-84-ből EOV (Egységes Országos Vetület) rendszerbe, hogy a távolságainak ne fokban, hanem méterben képződjenek (lásd "Lekérdezések, statisztika" fejezet).

1. ábra: Budapest VII. kerülete, épületek, érdekes helyek, bevásárlóközpontok pirossal. EOV vetület.
1. ábra: Budapest VII. kerülete, épületek, érdekes helyek, bevásárlóközpontok pirossal. EOV vetület.

Ezt követően készítsük el az épületek és bevásárlóközpontok minimális távolságának hisztogramját a következő szkript segítségével:

import numpy
import matplotlib.pyplot

path = "d:/indikatrix-org/szolgaltatasok/"
filename1 = "buildings_vii_eov"
layer1 = QgsVectorLayer(path + filename1 + ".shp", filename1, "ogr")
if not layer1.isValid():
    print("Layer1 failed to load!")

filename2 = "supermarket_vii_eov"
layer2 = QgsVectorLayer(path + filename2 + ".shp", filename2, "ogr")
if not layer2.isValid():
    print("Layer2 failed to load!")
    
distances = []
buildings = [feature for feature in layer1.getFeatures()]
supermarkets = [feature for feature in layer2.getFeatures()]

for building in buildings:
    temp_distances = []
    for supermarket in supermarkets:
        dist = QgsGeometry.distance(building.geometry(), supermarket.geometry())
        temp_distances.append(dist)
    distances.append(numpy.min(temp_distances))
    
matplotlib.pyplot.hist(distances)
matplotlib.pyplot.show()

2. ábra: Az épületek és a legközelebbi bevásárlóközpontok Euklideszi távolságának hisztogramja.
2. ábra: Az épületek és a legközelebbi bevásárlóközpontok Euklideszi távolságának hisztogramja.

A legegyszerűbb –valamennyire objektív – osztályozás alapjául szolgálhatnak a kvantálással meghatározott intervallumhatárok (5 osztály esetén):

>>> numpy.percentile(distances, [20, 40, 60, 80])
array([ 83.15056543, 130.41077232, 175.48292412, 246.69706127])

Ezt követően soroljuk 5 osztályba az épületek a következő kóddal (a legjobb érték az 5-ös legyen, tehát ekkor közel van a bevásárlóközpont):

import numpy

path = "d:/indikatrix-org/szolgaltatasok/"
filename1 = "buildings_vii_eov"
layer1 = QgsVectorLayer(path + filename1 + ".shp", filename1, "ogr")
if not layer1.isValid():
    print("Layer1 failed to load!")

layer1.dataProvider().addAttributes([QgsField("score", QVariant.Int, 'integer', 1)])
layer1.updateFields()
idx = layer1.fields().lookupField('score')

filename2 = "supermarket_vii_eov"
layer2 = QgsVectorLayer(path + filename2 + ".shp", filename2, "ogr")
if not layer2.isValid():
    print("Layer2 failed to load!")
    
distances = []
buildings = [feature for feature in layer1.getFeatures()]
supermarkets = [feature for feature in layer2.getFeatures()]

for building in buildings:
    temp_distances = []
    for supermarket in supermarkets:
        dist = QgsGeometry.distance(building.geometry(), supermarket.geometry())
        temp_distances.append(dist)
    dist = numpy.min(temp_distances)
    if dist <= 83:
        score = 5
    elif dist < 130:
        score = 4
    elif dist < 175:
        score = 3
    elif dist < 246:
        score = 2
    else:
        score = 1
    attrs = { idx : score }
    fid = building.id()
    layer1.dataProvider().changeAttributeValues({ fid : attrs })

Ezt kódrészlet futtatását követően érdemes újra betölteni a réteget, hogy lássuk a változásokat (egy új "score" nevű mezőt az attribútum táblában, illetve a hozzá tartozó pontokat az 1-5 diszkrét tartományon).

Ezt követően készítsünk egy színfokozásos tematikus térképet a "score" mező alapján ("Téradatok betöltése, típusai" fejezet alapján):

3. ábra: Tematikus térkép a bevásárlóközpontok közelsége alapján, VII. kerület.
3. ábra: Tematikus térkép a bevásárlóközpontok közelsége alapján, VII. kerület.

A 3. ábrán jól látható, hogy a piros pontok - bevásárlóközpontok - közelében sokkal sötétebbek az épületek, tehát a térkép elkészítésével egyben el is készítettük a kód verifikációját.

További fejlesztési lehetőségek:

  • Többváltozós értékelés készítése, súlyok használata
  • Komplexebb osztályozási módszertan használata (pl.: fuzzy, felügyelt osztályozás - pl. support-vector machine, felügyelet nélküli osztályozás - pl. k-means)
  • Alternatív távolságmetrika használata - pl. járható útvonalak alapján

Kétváltozós eset

Adjuk hozzá az OSM-ből levezetett metróállomásokat (transport, railway_station) is a projekthez. Illetve számítsunk ezekre is távolságokat:

filename2 = "supermarket_7ker_eov"
layer2 = QgsVectorLayer(path + filename2 + ".shp", filename2, "ogr")
if not layer2.isValid():
    print("Layer2 betoltese sikertelen.")

filename3 = "metro_7ker_eov"
layer3 = QgsVectorLayer(path + filename3 + ".shp", filename3, "ogr")
if not layer3.isValid():
    print("Layer3 betoltese sikertelen.")

    
buildings = [feature for feature in layer1.getFeatures()]
supermarkets = [feature for feature in layer2.getFeatures()]
metrostations = [feature for feature in layer3.getFeatures()]

smarket_distances = []
metro_distances = []
distance_pairs = []

for building in buildings:
    
    temp_distances1 = []
    for supermarket in supermarkets:
        dist = QgsGeometry.distance(building.geometry(), supermarket.geometry())
        temp_distances1.append(dist)
    dist1 = numpy.min(temp_distances1)
    smarket_distances.append(dist1)

    temp_distances2 = []
    for metrostation in metrostations:
        dist = QgsGeometry.distance(building.geometry(), metrostation.geometry())
        temp_distances2.append(dist)
    dist2 = numpy.min(temp_distances2)
    metro_distances.append(dist2)   
    
	distance_pairs.append([dist1, dist2])

Majd ezt követően a k-means klaszterek megállapításához használjuk a 'scipy' csomagot:

from scipy.cluster.vq import vq, kmeans
codebook, distortion = kmeans(distance_pairs, 5)
plt.scatter(smarket_distances, metro_distances)
plt.scatter(codebook[:, 0], codebook[:, 1], c='r')
plt.show()

4. ábra: Klaszterközéppontok számítása.
4. ábra: Klaszterközéppontok számítása.

© Dr. Wirth Ervin