Yahoo乗り換え案内を使って通勤時間の短い場所を探すRubyスクリプトを書いてみた。

コロナ禍でリモートワーク中心の生活になった僕ですが、一方で平時はオフィスで働きたい…と思うこの頃を送ってます。

一方で子供の成長も待ってくれないし今住んでいる場所だと都心に近すぎて逆に今後の子育てに十分な広さの部屋を借りるor買うのが難しくなってしまうし…と考えて、将来の住む場所を探してみることにしました。

また長い将来を考えると、将来もずっと同じ場所で働いている可能性はむしろ低い(転職するかもしれないし、会社自身が移転するかもしれない)ので、複数の場所からのアクセスがいい所を探したい。

などを考えて、自動で各駅のYahoo乗り換え案内のデータをスクレイピングして、運賃と所要時間をcsvファイルに出力するスクリプトを書いてみました。

require "open-uri"
require "nokogiri"
require "csv"
charset = nil

# 住む場所の候補 
start_stations = [
  '川崎',
  '西馬込',
  '池上',
  '武蔵小杉',
  '新川崎',
  '元住吉',
]
# 勤務地の発着時刻
des_hour = '20'
des_minute = '10'.to_i
# 帰りかどうか
is_reverse = true
# 勤務地の候補
des_stations = [
  '新橋',
  '田町',
  '東京',
  '秋葉原',
  '虎ノ門',
  '大手町',
  '品川',
  '渋谷',
  '飯田橋',
  '新宿',
  '恵比寿',
  '六本木',
  '目黒',
  '五反田',
  '大崎',
  '横浜',
  '新横浜',
  'みなとみらい',
  '池袋',
  '上野',
  '橋本',
  '日本橋',
  '銀座',
  '永田町',
  '後楽園',
]
time_table = {}
fare_table = {}

start_stations.each do |start_station|
  puts start_station
  time_table[start_station] = {}
  fare_table[start_station] = {}
  des_stations.each do |des_station|
    if start_station != des_station
      url_params = [ 
        ['fromgid', ''],
        ['from', is_reverse ? des_station : start_station],
        ['togid', ''],
        ['to', is_reverse ? start_station : des_station],
        ['viacode', ''],
        ['via', ''],
        ['viacode', ''],
        ['via', ''],
        ['viacode', ''],
        ['via', ''],
        ['y', '2020'], # 年
        ['m', '10'], # 月
        ['d', '15'], # 日
        ['hh', des_hour],
        ['m2', des_minute % 10],
        ['m1', des_minute / 10],
        ['type', is_reverse ? 1 : 4],
        ['ticket', 'ic'],
        ['expkind', '1'],
        ['ws', '2'], # 1(急いで乗り換え)~ 4(ゆっくり乗り換え)
        ['s', '0'],
        ['kw', is_reverse ? start_station : des_station]
      ]
      url = "https://transit.yahoo.co.jp/search/result?#{URI.encode_www_form(url_params)}"

      begin
        html = URI.open(url) do |page|
          charset = page.charset
          page.read
        end

        contents = Nokogiri::HTML.parse(html,nil,charset)
        route01 = contents.css('#rsltlst').first
        time = route01.css('dl > dd > ul > li.time').first
        minutes = time.css('span.small').first.content.gsub(/([0-9]{1,2}時間)*([0-9]{1,2})分/) { $1.to_i * 60 + $2.to_i } 
        fare = route01.css('dl > dd > ul > li.fare').first.content.gsub(/円/, "")
      rescue => e
      	puts "calculation failed. #{start_station} #{des_station} #{e}"
      end
    else
      fare = 0
      minutes = 0
    end
    puts "#{des_station} #{fare} #{minutes}"
    time_table[start_station][des_station] = minutes
    fare_table[start_station][des_station] = fare
    sleep 7
  end
end

CSV.open('times.csv','w') do |csv|
  csv << [''] + des_stations
  start_stations.each do |start_station|
    csv << [start_station] + des_stations.map do |des_station|
      time_table[start_station][des_station]
    end
  end
end

CSV.open('fares.csv','w') do |csv|
  csv << [''] + des_stations
  start_stations.each do |start_station|
    csv << [start_station] + des_stations.map do |des_station|
      fare_table[start_station][des_station]
    end
  end
end

持家と賃貸どっちが得か、楽待を使って試算してみた

持家がいいか賃貸がいいかは何度考えても、それぞれ利点と欠点が多すぎて何度考えても結局一概には言えない…という結論になってしまう。

そこで実際に数字を入れてみて試算することを考えた。
楽待というと不動産投資家向けのサイトで、複数戸の物件や賃貸中(=相手の都合が合わないと自分では住めない)の物件が中心であるため、直接はマイホームの購入には向かないが、家賃と購入がそれぞれいくらなのかの比較には参考になりそうだ。

特にこの CFシミュレーターhttps://www.rakumachi.jp/property/investment_simulator は優秀で、ローン返済はもちろん、さらに維持費や税金等をしっかりと計算した上でのトータルの損得を1年ごとに算出してくれる。

CFシミュレーターの見方

通常は家賃収入と投資の結果増減するお金/資産を試算するものだが、  家賃収入を賃貸の場合に支払うお金 と読み替えれば、 投資の結果増減するお金=マイホームの場合の損得 となりそうだ。

この画像では、

  • 緑線=家賃の場合の年間支払額
  • 赤線=マイホームと賃貸の年間費用の差額(プラスの場合はマイホームのほうが費用が少なく、マイナスの場合は賃貸のほうが少ない)
  • 赤棒=費用の差額の累計
  • 青棒=もし物件を売却した場合のトータルの損得

を示す。現実的なパターンで比較すると大抵赤棒はマイナスで、青棒はプラスになる。つまり払うお金は増えるが、それ以上に持ち家の資産価値が積みあがるケースが多い。まあもしそうならないなら賃貸・購入どっちがお得かだいぶはっきりしてしまうので笑

ただし賃貸購入どちらも相場の変動や予想外の出来事等によって実際はこれ通りに行かないリスクを大きく孕んでいるので、捕らぬ狸の皮算用かもしれない。

それぞれ入れていく数値について

表面利回り:家賃×12÷物件価格×100(%)で求まる

家賃下落率:家賃と物件価格を自分の予算額として比較したい場合はゼロ。相場で比較する場合は、老朽化すれば家賃を下げないと価値が見合わなくなるので、年間マイナス1%くらいが目安…らしい。

固定資産税・都市計画税:デフォルトでは固定資産税は1%(税率1.4×評価額の目安0.7倍?)、都市計画税は0.2%(税率0.3×評価額の目安0.7倍?)くらいで見積もられているが、以下のような減額要因があるので、ざっくり元から入ってる値の2分の1くらいで良さそう。

  • 200m^2以下の宅地の場合は、土地分の固定資産税1/6、都市計画税1/3。マンションの場合も1戸当たり200m^2以下ならOK。
  • 建物は築年数が経つごとに減額される。
  • 新築から数年間は一定条件の下で建物分は2分の1

所得法人税率:お金を得ないなら税金もかからないよね。

管理費・修繕費・その他経費:挙げられる経費としては以下の形か

大規模修繕費:リフォーム費用、戸建てで築古の場合は建て替えを想定して費用を加算すればいいものか。

入居率:自分で住み続けるなら100%w…住めなくなるリスクがあるなら下げる必要があるかもしれないけど。

実際に計算してみた

首都圏近郊に4000万円の戸建て VS 家賃月額16.6万(利回り5%)想定で計算したところ、こんな結果になった。

35年後までで見ると700~800万円の費用増に対して資産の積み上がりが期待できてトータルでは1000万円強の得になる…まあまあな感じの結果になった。

しかし家賃と利回りを1割落とすと(月額16.6万/利回り4.5%)想定で計算したところ、1600万円前後の費用増に対してトータルでは300万円前後の得…やや微妙な結果になってしまった。これなら賃貸で浮いたお金で資産運用するほうがお得かもしれない。リスクがあるのはどっちもどっちだし。

少しの違いでも塵も積もれば山となる…で大きく結果が変わってしまうし精度を上げたくても不確定要素が多いので、結局計算しても何とも言えなくなってしまったw

ただし、これにプラスして住宅ローン減税の恩恵を受けられる場合は最大400万円前後の得にはなる

マイホームは投資よりとても利を出しやすい条件になる

また数字を入力していくと、マイホームでは投資と比べて以下の条件がとても有利なことに気付く

  • 金利:投資用より住宅ローンのが安い
  • 入居率:自分で住むなら100%
  • 税金:お金をもらってないのでゼロ
  • 管理費修繕費:投資の場合は滞納や設備の故障のトラブル対応を業者

実際賃貸投資想定で値を入れてみると…これに含まれない物件価格の値上がりやインフレ等に期待するか、工夫して大きくコストカット出来ない限りは損することに気付いた。一体不動産投資家たちはどのようにして利益を上げているのだろうか…

クオリティが高すぎたのでABC Cooking Studioを退会した

ABC Cooking Studioに通っていたが、結局だんだん通わなくなってしまったので退会した。

通わなくなってしまった理由

端的に言うと 基準が高すぎる のが原因であった。
美味しい料理を作りたいのはもちろんそうなのだが、頻繁に作らなければならない普段の料理では時間をかけて手の込んだ美味しい料理を作りたいという気持ちにはなれず、あまり習った知識を活かせなかった。例えばこんな感じで考え方が異なってしまう。

料理教室:味移りを避けるためしっかり容器や鍋を分けて調理する。
自分:洗い物の手間を省くためなるべく使う調理器具を減らしたい。

料理教室:レシピ通りにしっかりと分量を測って入れる
自分:調味料はまだしも食材は中途半端に残ると使い道に困るので、キリ良く使いたい。レシピも検索で参照できるネットのほうが利便性高くてついそっちを使いがちになる。

料理教室:魚をさばく、肉を切る
自分:そもそもある程度調理しやすい形のものを買う。価格に差がほぼないケースなら尚更

といった具合である。

解約したらお金はちゃんと戻るのか?

しっかり払い戻されたので、その心配はなかった。
使った分の料金+入会金(12000円+税)+コースごとの解約料(最大6000円+税)が差し引かれる形となった。
コースごとの解約料は授業料1回分前後なのであともう少しでなければちゃんとお金が戻る一方、少しだけ利用して解約だと今までの利用分が割高に感じる…というなんとも絶妙な設定である。
また入会金も再度通いなおす際はかからないので、期限が切れそうと思ったら多少損に見えても無理せず解約したほうがいいといった感じである。

また申し込みから振り込みまでは1か月くらいかかったので、気長に待つ必要はありそうだった。

今後加入したい方は

  • 下記の理由から最初は少なめにして、様子を見て追加していくほうがいいかもしれない。
  • タイミングによってなのか分からないが、自分が申し込んだときは初回加入特典として入会金が無料になっていた。しかし途中で解約すると返金額から入会金が差し引かれるので、精算時に無効になる。
  • 各コースごとに使い切ってない回がある場合はコースごとに手数料が発生する。