現役エンジニアが空室率と潜在空室率を解説

2022年1月からestieで働いているたにしです。私は知人のリファラルでestieと知り合ったのですが、それまでは不動産に馴染みのない生活を送っていました。オフィスビルって灰色だし、なんだか縁遠い感じがしますよね。

ところが実際働き始めてみるとドメイン知識を学びながら楽しく働けています。今回は、不動産テックで働くようになってから 面白いと思ったものをエンジニア目線で紹介したいと思います。

空室率と潜在空室率

不動産業界のドメイン知識として、建ぺい率と容積率、AMとPMなどいろいろありますが、今回は空室率潜在空室率を取り上げます。

空室率とは、

 空室率 = 空室である床面積/貸付可能面積

で表されます。上の式の通り、物件の貸せる面積のうち現時点で空室になっている面積の割合のことで、マーケットの数値を見て戦略を考えたり、自社物件群の過去の値と比べて施策の評価を行うような場面で使う指標です。

もう一つの潜在空室率は空室率に比べたら馴染みがないかと思います。

潜在空室率とは、

 潜在空室率 = 募集中の床面積/貸付可能面積

で表されます。

空室である床面積募集中の床面積は同じに聞こえますが、異なる指標です。

上図のようにある区画の募集はテナントの退去が決まった時点で募集開始するため、入居中だが募集もでているという状態が発生します。入居ステータス・募集ステータスの重なりで3種類の空室区分があると捉えることができます。

特定日付の潜在空室率を求めたい

ある時点での潜在空室率を求めるためには、(1) その日に募集していた総面積を求め (2) ビルの総貸付可能面積を求める必要があります。物件にテナントが入っているかではなく、物件の募集が出ているかを見る必要があります。 実装が面白いので見てみましょう。簡略化していますが、以下のようなコードで算出しています。

# ビル情報を管理するクラス
class Building < ApplicationRecord
    has_many :askings
end

# 募集情報を管理するクラス
class Asking < ApplicationRecord
    belongs_to :building

    # ある日付時点で募集していたか
    def open?(base_date: Date.today)
        today = Date.today

        # 渡された日付が今日であれば募集が閉じているかどうかで判断できる。
        return !is_closed if base_date = today

        open_term&.cover?(base_date)  # ※1
    end

    # 募集期間を算出する
    def open_term
        open_term_start = opened_date
        # 募集中の場合は終点を無限にしておく。
        open_term_end = is_closed ? closed_date : Float::INFINITY

        # 欠けているデータがあれば計算できない
        return nil if !open_term_start || !open_term_end

    (open_term_start...open_term_end)
    end
end

# 潜在空室率を算出するクラス
class CalculateAvailabilityRateService
    def self.call(buildings:, base_date: Date.today)
        # 基準日に募集されていた募集
        askings = buildings.flat_map(&:askings).filter { |asking| asking.open?(base_date) }

        vacant_total_area = askings.map(&:area).sum
        leasable_total_area = buildings.map(&:leasable_area).sum

        vacant_total_area  / leasable_total_area
    end
end

ある日付の時点で募集があるかの判定(※1)は募集期間を求めるメソッドopen_term を用意し、その期間内に基準となる日が含まれているかどうかで求めています。

estieではまだ全ての募集情報を管理しているわけではないので 欠けているデータももちろんあります。 cover? メソッドで扱いやすいようにopen_term メソッドで対応しており、欠けているデータの場合はnilを返すことで計算できないことを表現しています。また、閉じていない募集の場合はFloat::INFINITY を使うことでcover? を使って簡単に表現できるようにしています。 実装例を見ることで概念への理解が深まったかと思います。

辛いところ

今回はブログのために簡略化している部分がありますが、実務はもっと煩雑です。 仕様面ではビルの貸付可能面積がわからないこともあるのでビルの総面積からレンタブル比という係数を掛けることで貸付可能面積を推定したり、モデリング面でもある募集情報が一度終了したあとも再度募集開始したりなどを上手く表現できていないなど、まだまだ改善していく部分はたくさんあります。

最後に

オフィス不動産は歴史ある産業であるがゆえに、日本国内だけでも地域ごとの商習慣があり複雑な事業ドメインになっています。 このドメインを解決するには適切な設計が必要と考えています。複雑なドメインを設計の力で切り拓いていきたい方、現実のモデルとコードベースをうまくつなげたい方、 ぜひご連絡ください。

hrmos.co

© 2019- estie, inc.