座標の関数としての住宅の費用







住宅価格は多数の要因から形成されます。その主な要因は、市内中心部に近いことと、近隣のさまざまなインフラストラクチャの可用性です。 しかし、実際の価格は紙の新聞と不動産サイトにのみあります。 モスクワで、Python、Yandex API、および猫の下のシーンからの特別なレポートであるmatplotlibを使用して、不動産価格で地図を作成します。



仮説



モスクワに住んでいない人として、私はモスクワの価格の性質を次のように評価します。



マップには、重要なオブジェクトまたは工業地帯の近接に関連するローカルの最大値と最小値が含まれます。 また、モスクワ環状道路の前後には価格差もあります。 このリングは基本的に市の行政境界線と一致しています。



参考文献として、記事の最後に、数百行の優れたPythonコードではない行が用意されています。



研究のために、私はこの夏のデータを持つ2つの不動産サイトを取り上げました。 新しい建物と二次住宅に関する合計24,000のエントリがサンプルに参加し、同じ住所の異なる広告が価格で平均されました。



広告はスクリプトによって解析され、次の形式でsqliteデータベースに保存されました。

, , ..









Webスパイダーについて
はい、知識が不足しているため、サードパーティのライブラリは使用されませんでした。これには、各サイトに1つずつ、住所、映像、アパートの費用を引き出す2つのスクリプトの作成が必要でした。 Google Geocoder APIを使用して、住所が魔法のように座標に変換されました。 しかし、かなり低いバーのため、使用の割り当ては、1週間毎日スクリプトを実行することを余儀なくされました。 Yandexジオコーダーは10倍無料です。





機能を構築する



関数を平面全体に一般化するには、使用可能な点を使用して関数を補間する必要があります。 これには、scipyモジュールのLinearNDInterpolator



関数が適しています。 これを行うには、scipyとして知られる科学ライブラリのセットでpythonをインストールするだけです。 データが非常に不均一である場合、平面上でもっともらしい関数を選択することはほとんど不可能です。 LinearNDInterpolator



メソッドは、 Delaunay三角形分割を使用して、平面全体を多数の三角形に分割します。



関数を構築するときに考慮すべき重要な要素は、関数の値の広がりです。 広告の中には、クレムリン内の平方メートルあたりの価格が1000万ルーブル以上の本物のモンスターがあり、スケジュールを台無しにし、明るい点のある均一なフィールドのみが表示されます。 グラフ上のほとんどすべてのデータを区別できるようにするには、経験的に選択された境界線でそのような値を除外する必要があります。 統計モデルの場合、これらの値には有用な情報が含まれていません。



一方、補間の結果は勾配地獄のように見えます(クリック可能):







知覚に便利なマップを取得するには、取得した値を離散レベルに分配する必要があります。 その後、地図は7年生のアトラスのページのようになります(クリック可能):







マップ上の離散化について
価格の全体像を見たいのか、平均値付近の変動を見たいのかによって、データ編集を適用する必要があります。 データの分布は値のスケールでより均一になり、値が減少し、小さな値が増加します。 コードでは、次のようになります。

  zz = np.array(map(lambda x: map(lambda y: int(2*(0.956657*math.log(y) - 10.6288)) , x), zz)) #HARD zz = np.array(map(lambda x: map(lambda y: int(2*(0.708516*math.log(y) - 7.12526)) , x), zz)) #MEDIUM zz = np.array(map(lambda x: map(lambda y: int(2*(0.568065*math.log(y) - 5.10212)) , x), zz)) #LOW
      
      





関数は、 wolframalphaの 3m-4mポイントを近似することにより経験的に選択されました





線形補間法では境界点の外側の値を計算できないことに注意してください。 したがって、スケールが十分に大きいグラフでは、非常に多角形が表示されます。 結果の図にグラフが完全に内接するようにスケールを選択する必要があります。



統計の別の見方は、低価格帯と高価格帯のあるマップとして役立ちます。 低価格と高価格の境界を動的に変化させることにより、ダイナミクスにおける価格の位置を確認できます。 各ポイントでの価格の値はもはや役割を果たしません。特定のグループのポイントのグループ化のみが貢献します(クリック可能)。







計算は、ある点での重力場の計算に似ています。 最適化のために、フィールドの最終値に実際に寄与するポイントのみを考慮します。 計算後、結果はスプレーに似ています(クリック可能)。







他に何が変身しますか?
厳密なフィールドグラフの構築により、「高価な」フィールドが「安価な」フィールドよりも局所的に優勢であることに対応する点の分散が示されます。 これらのポイントはノイズのようなもので、グラフを台無しにします。 たとえば、十分に大きな値を持つ画像の上にあるメディアンフィルターによって、それらを削除できます。 このために、IrfanViewコマンドラインインターフェイスを使用しました。





可視化



結果の画像をモスクワの概略図と組み合わせます。 Yandex APIを使用すると、座標で地図を取得し、経度と緯度の角度寸法、および目的の画像サイズを指定できます。



リクエストの例:

static-maps.yandex.ru/1.x/?ll=37.5946002,55.7622764&spn=0.25,0.25&size=400,400&l=map









問題は、示された角度寸法が可視領域の境界を決定するのではなく、そのサイズが保証されることだけです。 これは、角度寸法> = 0.25の画像を取得することを意味します。 可視座標の境界に対処する方法はなく、それらは手動で検索されました。



カスタマイズについて
Yandexタグを使用してカードを相互に位置合わせし、指定された座標でマップ上にポイントを描画し、タグ付きのマップを取得できます。



PILライブラリーからの2、3回の呼び出しについて、画像は快適な透明度レベルと組み合わされます。



 map_img = Image.open(map_img_name, 'r').convert('RGBA') price_img = Image.open(prices_img_name, 'r').convert('RGBA') if price_img.size == map_img.size: result_img = Image.blend(map_img, price_img, 0.5)
      
      







結果



あるレベルのコンパンディングとアニメーションオプションのレベルが異なる3つの画像。







ちょっとした分析:


一般的に、仮説が予測したように、ガーデンリングとTTKリングの内部では、住宅価格は最大であり、中心からの距離とともに減少します。 ただし、MKAD内では、平均価格は西部と南西部で維持されます。 MKADの外側、および第3輸送リングを越えた東部では、価格は平均を下回っています。



すべてが詳細に面白く、主な領域に注目します。



マップで見ることができるように、理論は実践によって完全に確認され、インフラストラクチャ、中心までの距離、および有名なモスクワ構造への近接の成功した組み合わせが座標上の線形補間関数によって明らかにされます。



残念ながら、行われた作業はほとんど自動化されていませんが、記事がハブロフスク市民にとって興味深いものである場合、私は国の残りの大都市の同様の地図を作成します。



Webスパイダーのコード、プログラム自体、および使用されるデータベースは、 GitHubから入手できます



All Articles