saddleの記録

saddleの記録

自転車に乗ってどこかに行った記録やその他いろんな記録を残します

結婚前同棲時の金銭管理をどのように行うか

最近は結婚前に同棲をするケースが多く、自分もこのパターンです。結婚する前にお互いの生活の価値観が合うか、許容できるかを判断することができ、もしダメでも離婚するよりも比較的障壁なく解消することが可能です。

その価値観の一つとして金銭感覚があります。同棲時の生活費の捉え方が異なる場合、トラブルに発展してしまう可能性があります。結婚しているとクレジットカードで家族カードが発行できたりなど、決済面でけっこう融通が利きますが、結婚前の同棲ではそうはいきません。ですが、同棲では二人で完全に区別できない支出がいくつかあります。これらを効率的に透明性を持たせて管理する方法を、過去に当時の彼女に同棲前にプレゼンをしたことがあるので、その内容を共有します。

(情報が古い場合があります。最新の情報は自分で調べてください)

支出の種類

ここでは支出の種類を2つに分け、個人支出共同支出と定義しました。2人で一緒に消費するお金(=明確に分けることができないお金)の管理方法が今回のメインテーマになります。

個人支出の取り扱い

娯楽費をはじめとした「自分のための支出」は自分で管理し、毎月の共同支出のための生活費を捻出できれば、お互い相手の金の使い方には口出ししないようにしています。割り勘とかをする場合はKyashを使っています。食費についても、2人で家で食べたり外食したりする分は共同支出、通勤途中にひとりでその辺で買い食いしたりカフェに入ったりする分は個人支出と分けています。

ここでは医療費も個人支出となっていますが、お互いの健康は家族にとっての資本ですので、結婚を機に医療費は共同支出の枠に移動しました。また、結婚後はマイカーも二人の資産になるので、自動車関連費も共同支出の枠に移動しました。

共同支出の管理にあたって

お金はとにかくトラブルの元になるので、徹底した管理が求められます。具体的には、「支出を明確にする」ことが必要になります。その手段として「クラウド家計簿」と「キャッシュレス」が有効です。

この2つを連携させることで、「明確に」「自動的に」管理することができると考えています。「明確に」は当然として、「自動的に」できるのはずぼらな自分らにとって大きなメリットになりました。お金を使うとMoneyForwardから通知が入るので、2人のお金を内緒で勝手に使うことがほぼできないシステムになっています。

共同支出の管理方法

上図が共同支出の管理方法の概要です。基本的にクレジットカード決済が前提でポイントを貯め、やむを得ない場合にのみ銀行引き落としにします。水道ガス電気は変動費となっていますが、ほぼ固定費と考えてもいいと思います。結婚後もこの運用を続けています。

 

共同支出の管理の問題点

共同支出の管理をするときに、大きく3つの問題点が挙げられます。

自分は個人用に楽天銀行を持っていたので、新たに自分名義で住信SBIネット銀行口座を開設しました。彼女の個人口座も住信SBIだったため、振込手数料がかからないというメリットがありました。目的別に口座を作ることもできるので、結婚後も使っています。ですが、結婚後にローンを組んだり公的機関にお金を支払ったりするのにネット銀行よりもメガバンクや地銀のほうが良いケースがある(自分の地域の保育料引き落としはネット銀行非対応だった)ので、カーローン組むときに地銀の口座を追加で開設しました。

同棲開始時は結局オリコカードを作りました。オリコポイントはAmazonギフト券に全部変えて、Amazonで日用品を買っていました。しかし、オリコポイントの交換レートが年々悪化してきているのと、MoneyForwardで手動更新が必要なのが面倒だったので、結婚後にオリコカードをやめて三井住友VISAゴールドカードに変え、家族カード、ETCカードを発行しました。ゴールドカードの年会費は年間100万つかうと永年無料になります。生活費等を支払っていたら余裕で100万円を超えます。ポイント還元率は0.5%ですが、100万円使ったタイミングで10000ポイントもらえるので、平均1%は超えるでしょう。VポイントはiD連携してすぐ使えるのがいいですね。

といったような問題が普段の買い物で発生しえます。そもそも他人名義のカードで買い物をしてはいけません!個人で出して立て替えることが許容できるならそれでいいと思います。

この問題に対して3つの解決策を提案しました。

現金主義の方は家計が直感的に記録できることに価値を感じているようで、自分の妻もそのような考えで個人支出は現金で管理しています。ですが、それは自分の中で完結しているからできるのであり、他人の財布の中身を把握するのはかなり困難です。なので、病院や個人商店など、現金決済しかできないところに限って現金を使うようにしています。あと都度手動記録だとお互い忘れますね。

同棲前に引越先の周辺のお店を回り、使える決済方法を確認しました。どこもだいたいなんでも使えたので、結果的にあまり気にする必要がありませんでした。

上図のように、チャージ方式の差を示していますが、電子マネーへのチャージは基本的に自分名義の銀行口座、クレジットカード、もしくは現金にしか対応していないので、家族カードが発行できない同棲時は難しく、結局採用しませんでした。

最終的にANA JCBプリペイドを二人分発行しました。ANA JCBプリペイドは他人名義のクレジットカード(JCBブランド限定)でチャージができるので、同棲時には非常に便利でした。また、ANA JCBプリペイドクラウド家計簿の自動記録に珍しく対応しており、すべての問題を解決してくれました。ANAマイルも貯まるのでポイ活面でも利点があります(我が家は帰省時にANA便を使う)。しかし、チャージする際にいちいちブラウザでマイページにログインしてチャージ作業をする必要があり、これが非常に面倒だったので、結婚して家族カードが発行できるようになったのを機に使うのをやめました。

透明性の確保

透明性を確保するために、新たにお互いがアクセス可能なGoogleアカウントを作って、共同支出に使うサービスはこのアカウントのメールアドレスを登録しています。金融機関以外にも、インターネット、電気、ガス、水道、MoneyForwardなど、2人で使うサービスにはこの共用アカウントのメールアドレスを登録しています。

まとめ

  • 金銭トラブルを防止するために個人支出と共同支出をしっかり分ける
  • 共同支出を互いに明確にすることで金銭トラブルを防ぐ
  • クラウド家計簿とキャッシュレスを組み合わせて、家計簿が自動的に記録されるシステムを構築する
  • 共同銀行口座と共同クレジットカードを作る
  • 共同口座は収入が多いほうの名義で作る
  • クレジットカードはよく使う店舗の優待や欲しいポイントを見極めて選定
  • 都度支払いを柔軟にやるには共用クレジットカードだけでは限界がある
  • 都度支払いを現金でやるとレシートをとって都度記録が必要
  • 都度支払いに使う電子マネーの選定には近所のお店で対応をしているか確認
  • プリペイドVISA/MasterCardはポイントが貯まるが、MoneyForward連携非対応
  • 各サービスを共有するために共用メールアドレスを作成して登録

ここまで考えてやってきたので、今は我が家の財務大臣は自分になっています。MoneyForwardにも課金し、予算機能を使いつつまめにチェックしながら生活費をコントロールしています。

決済サービスは変化が激しいので、自分のスタンスに則ってそのときにあったサービスを使うのがいいかと思います。ほかにも良い決済サービスや金銭管理方法があれば教えてください。

横浜市港北区保育園の入園難易度考察(令和6年)

横浜市は保育園への入園倍率が高く、保育園に落ちて親の社会復帰ができないことが多いことで有名です。少なくとも両親共働きで祖父母のサポートが受けられないという環境でないと、0-2歳で保育園に入ることは難しいとされています。申請時に第20希望まで保育園を書く人もいるようです。保育園に入れないことを理由に、横浜を出て藤沢市大和市のほうへ引っ越す人も少なくないと聞きます。

しかし、横浜市といってもその入園難易度には市内で地域差があるはずで、その地域差を分析すれば横浜市に住みながら保育園の問題を解決できるかもしれません。そこで特に保育園激戦区と言われる横浜市港北区を例に、字単位でその倍率と地価の関係を可視化してみました。結婚や引越等で新たに港北区で家を探している人の参考になればと思います。

入園させやすいコツ等については言及せず、今回は保育園の入園倍率の地域差にのみ言及します。

ちなみに我が家の0歳児は無事に区内の保育園に受かりました。ですが、近所の同級生の中には落ちてしまった人も一定数いました。

 

 

使用したデータ

港北区保育所令和6年4月入所の延べ待ち人数

https://www.city.yokohama.lg.jp/kohoku/kurashi/kosodate_kyoiku/hoiku/hoikujo/hoiku.files/0269_20240124.pdf

令和6年度 保育所等 新規利用見込数

https://www.city.yokohama.lg.jp/kohoku/kurashi/kosodate_kyoiku/hoiku/hoikujo/r6riyoushinsei.files/0230_20231124.pdf

令和6年4月二次入所の受入可能数(見込み)

https://www.city.yokohama.lg.jp/kohoku/kurashi/kosodate_kyoiku/hoiku/hoikujo/hoiku.files/0207.pdf

横浜市保育所入所児童数

https://www.city.yokohama.lg.jp/kurashi/kosodate-kyoiku/hoiku-yoji/shisetsu/info/nyusho-jokyo.files/yokohama-nyusho.pdf

神奈川県地価公示価格一覧(令和5年)

https://www.pref.kanagawa.jp/documents/97040/05kouji_shiryou02.pdf

計算方法

認可保育園のデータのみで計算しています。

保育所のキャパシティ

=入所児童数+新規利用見込数

保育所倍率

=(保育所のキャパシティ+延べ待ち人数-二次入所受入可能数)/保育所のキャパシティ

※4月からの0歳児クラスは入所児童数は0として計算します。

地区ごとの保育所のキャパシティ

0-5歳までの受け入れ可能人数の総数を保育所の所在地区ごとに表したのがこちらの地図です。色がない地区には認可保育所がありません。(新吉田町、大曽根台、高田町、北新横浜、鳥山町、篠原東)

港北区保育所キャパシティ総数

真ん中の1176人のキャパシティをもつのは大倉山です。実際に保育園の数がたくさんあります。続いて北部の日吉や綱島のキャパシティが多くなっています。これらの地区は東急東横線沿線になっていて、東急線で都内へ通勤する親にターゲットを定めて保育所を設置している傾向がありそうです。一方で西部の高田西、新羽町、小机町は地区の面積に割にキャパシティが少なくなっています。グリーンラインブルーライン横浜線が通る地区ですが、どれも都内に直通しない路線です。都内に直通するかしないかでここまで差が出るかという感じです。

地区ごとの保育所倍率

次に0-5歳までのトータルの倍率を地区ごとに表しました。色がない地区には認可保育所がありません。(新吉田町、大曽根台、高田町、北新横浜、鳥山町、篠原東)

保育所倍率 0-5歳総数

1.5倍を超えているのは、日吉、箕輪町、小机町の3地区です。日吉・箕輪町保育所の数は多いですが、最近大規模マンションがたくさん建ってファミリー層が多く流入してきている影響で倍率が高くなっているようです。特にベネッセ日吉保育園が有名で、延べ入所待ち人数が183人となっています。一方で小机町は、最近宅地開発が進んでいますが、先述の通り保育所のキャパシティがそれに追いついていないようです。

以下年齢ごとに倍率を見ていきます。

保育所倍率 0歳

0歳であれば多くの地域において1倍前後でまだ入りやすくなっています。1歳だと一気に倍率が上がるので、確実に保育園に入れたい場合は0歳から入れる、というのがセオリーになっています。ですが、日吉、新羽町、小机町では0歳の時点ですでに1.5倍を超えてしまっています。日吉周辺は子供の数が多いのだと思いますが、新羽町や小机町はまず保育園の数が少なすぎます。また、小机町や新羽町は面積で見ても広いので、保育園が遠くなってしまうことが多く、送迎が大変になることが予想されます。なので、いったん新横浜駅前まで出てきて、そこで子供の送り迎えをして通勤、帰宅するという方法も一つの手です。新横浜駅前の保育園は比較的0歳の受け入れ可能人数が多くなっていて、倍率も1を切っています。

保育所倍率 1歳

1歳で保育園に入るのはかなり困難であることがデータからわかります。日吉、箕輪町、小机町では約3人に1人しか入れない計算になります。これでは両親共働き要件では厳しく、プラスαで加点要素が必要になってきそうです。そんな中でも大倉山を中心とした港北区中部は、激戦と言われる1歳児でも定員割れるか割れないかの倍率です。保育園に入れるか心配な人は大倉山周辺に住む、もしくは通勤経路に組み込むのがよさそうです。

保育所倍率 3歳

3歳児ともなれば、保育士一人当たりが見ることができる人数が増え、キャパシティが増えるので倍率がどこも1倍前後で需給バランスがよくとれるようになりました。

注目すべきところは、港北区中部の大倉山、大豆戸町、師岡町、大曽根、樽町は比較的年齢ごとの倍率の変動が少なく、かつ1倍前後となっており、保育所の需給バランスがすべての年齢児で優れている地域と言えます。特に住みにくい地域というわけでもないので、保育園に入れるか不安な人は住む候補として上位にあげていいでしょう。他地域に比べて、マンションよりも戸建てが多そうな地域なので、単位面積あたりの世帯が少なく、結果として子供の数もちょうどよくなっているのかもしれません。また、大倉山には「どろっぷ」という港北区の地域子育て支援拠点があります。区内の未就学児の子育てをしている親子が集まる拠点のような施設で、とても良いところです。特に祖父母の支援が受けられない、まわりに子育て仲間がいなくて相談できる相手がいない、などといった状況の方にはとてもオススメできるところです。そういった施設があるのも大倉山の強みになっています。

www.kohoku-drop.jp

裏を返せば、タワマンの近くに住むのは保育園の観点からは良くないと言えます。

地価との相関

まず令和5年の宅地の地価を地図に表します。色がないところは宅地地価のデータがない地区です。

令和5年 港北区地価(住宅地)[円/m^2]

区内東部を南北方向に赤くなっていて、わかりやすく東急東横線沿線の地価が高くなっています綱島と大倉山の間の鶴見川南側(樽町、師岡町)は比較的安くなっていますが、この地区は駅までけっこう遠いです。また、この地区に限らず鶴見川流域はどこも等しく洪水リスクがあるので、そのリスクによる地価への影響は小さいかもしれません。

地価と保育所の倍率で地区ごとにプロットしたグラフを示します。

保育所倍率(総数)と地価

先で散々出てきた日吉、箕輪町、小机町を除くと正相関が取れそうです。地価が高い→人気の地区で新たにファミリー層が増える→保育園の倍率が上がる、といったストーリーが描けそうですが、裏付けのためには地区ごとの世帯と年齢の情報が必要です。

逆に、急速な宅地、マンション開発が進む地域はこの相関に乗らない特異点になってしまっていました。他のタワマン開発が進む市区でも同様の傾向が出るか見てみるのも面白そうです。

まとめ

港北区のようなTHEベッドタウンでは全体的に保育所のキャパシティが不足しています。ただし、そうは言っても地区ごとに差はありました。戸建てが多い地域は保育所の倍率が低く、一方で急速な宅地、マンション開発が進んでいる地域は保育所の倍率が高くなっている傾向になりました。保育所の心配をしている方の引越先の参考になれば嬉しいです。

宅地、マンション開発をするときに行政と保育所の不足についての協議はしたりしないのでしょうか。そこがうまく連携できるとよりよい街作りができそうな気がします。(百合子はその連携を頑張って都内の待機児童問題を解決したのかな)

参考

参考というか影響を受けた書籍を紹介します。ジャンル問わず様々なデータを分析していて面白いです。

 

 

結婚式でアニソンを流したい!

先日無事に結婚式と披露宴を行うことができた。我々オタク夫婦が結婚式で流した音楽(主にアニソン)でけっこう演出がうまくいったのと、JASRAC管理の音楽ならなんでも流せると思ったら全然違ったのが興味深かったので、今後挙式予定のオタクカップルのために結婚式と音楽について残す。

 

※式場によって取り扱いが違うと思うのであくまで参考です

 

 

結婚式で流せる音楽

結婚式で流せる音楽は「記録映像に残すかどうか」「演出として使うか」どうかで決まる。映像に残すということは音楽の複製商用利用にあたるので、著作権申請が必要らしい。特に記録映像として残すつもりがなければ、基本著作権管理されているものであればなんでも流せる。また、映像として残す場合でもBGM利用の場合(歓談中・食事中など)は特別な著作権申請は不要だった。音楽を演出として使う(入場、ケーキ入刀、ブーケトスなど)場合は、特別な著作権申請が必要だった。

そして必ずCD原盤を用意して音楽を流さなければならないルールになっている。最近はサブスク等で音楽を聞くことが多くCDを買わないので、今回は頑張ってメルカリとブックオフでCDを収集した。アイマスのライブ会場限定CDみたいなプレミアついてるCDに収録されている曲を使おうとなると相応の覚悟がいる。配信しかない音楽の場合はデータでもOKだった。

 

自分が挙式した式場は映像に力を入れているところだったので、著作権申請はマストだったが、そうではない式場であればそこまで深く考える必要はないと思う。

 

式場見学の際はJASRAC登録曲ならなんでも流せると説明されるが、このへんの話を知っておくと見学の際に質問できると思う。

ブライダルシーンの著作権申請

著作権申請を自分で行うこともできるが、非常に手間になる。そのため、ブライダルシーン向けに代理で著作権申請をまとめて行ってくれる音楽特定利用促進機構(ISUM)という組織がある。

isum.or.jp

この組織が著作権申請をして許可をとってくれ登録された楽曲は、誰でも使用料を払えば結婚式に使用できる。有名なJ-POPはだいたい登録されているが、アニソンやゲームソングなどは登録されている曲が少ない。だが登録されていない楽曲は著作権申請リクエストができる。もちろん、必ずしもリクエストが通るとは限らない。オタクが好きな曲を流すにはこの著作権審査に通過する必要があるのだ。

そして登録されていたアニソンのジャンルの傾向がおもしろかった。

・女性向けが多い

だいたい結婚式準備に熱が入るのは新婦なので、おそらく新婦がリクエストしていることが多いと考えられる。アイドルマスターミリオンライブ・シンデレラガールズよりも圧倒的にsideM曲が多い。ラブライブも比較的女性人気が高いのか、キャラソンまで異様に充実していた。

・声優ソロ曲が多い

水樹奈々やLiSA、田村ゆかりなどひとりで歌う曲は著作権申請を通すところが少ないのか登録楽曲が多い。逆にアイマスや特定のアニメの声優グループ曲など、複数のアーティストが歌う楽曲はリクエストが通りづらいらしい。

・ディズニーや洋楽は少ない

おそらく申請がめちゃくちゃ大変なんだと思う。

 

ISUMが著作権申請できるのはJASRAC著作権管理している楽曲であることが大前提だが、一部JASRAC著作権管理していない楽曲がある。その例がKey楽曲だ。

Key作品の音楽はVisual artsがKey Sounds Labelとして独自に著作権管理している。Keyの音楽はBGM利用であれば特別な申請なしで利用できるとのこと。実際に今回はガルデモのThousand EnemiesをBGMとして使用した。

製品内の素材の使用に関するQ&A|Key Official HomePage

 

リクエストして通った楽曲

全部で20曲以上リクエストしたが、通ったのは以下のみ。正直通過率は低い。申請から登録まで1か月~2か月かかるので早めに動くのがよい。

ガルパンのサントラも通ったり通らなかったり、アイカツ曲もオリジナルスターは通るのにカレンダーガールは通らなかったりと、基準がよくわからなかった。カレンダーガールは個人的にめちゃくちゃ使いたかったので残念。

また、自分が浦和レッズサポなので、First Impression(選手入場曲)を使いたかったが、これもリクエストが通らなかった。

 

自分の実際のセットリスト

参考までに実際のセットリストを紹介します。

新郎の好きなコンテンツ:アイマスAngel Beats(ガルデモ)、けいおんアイカツ(曲だけ)、とあるシリーズなど

新婦の好きなコンテンツ:ラブライブウマ娘プリキュアゴールデンカムイ、ヒプマイなど

ふたりの共通で好きなコンテンツ:ガルパン

 

ふたりで共通で好きなジャンルがガルパンしかなくてかなり揉めたが、最終的にすごく良いセットリストになった。

 

これとは別に歓談BGMを12曲ほど用意したが、おそらく1周はしていたと思う。会場の演出スタッフ、音響スタッフと設備がすばらしく、すごく良い式になった。

よかったところともう少しなんとかできたところ

  • 入場曲はふたりが知ってる曲だと、ふたりで口ずさみながら入場できて楽しかった。(ウマ娘は自分もアニメは全部見た)
  • 自分のプロフィールムービーのJ’S THEMAは、自分の生まれ年とJリーグ開幕年が同じなのでこだわった。結果としていい感じに曲調とムービーがハマった。
  • 手紙朗読のあなたは新婦父が昔に「もし結婚式で手紙読むならこれ流してほしい」と言っていたのを覚えていたので使用した。
  • エンドロールのrayはバラード過ぎず、アップテンポ過ぎずのいい線を突けたと思う。
  • ガルパンのサントラは知らない人からしたらただのオーケストラ曲に聞こえるので使いやすかった。
  • ケーキ入刀のオリジナルスターは、入刀と同時にイントロから流し始めてもらったが、そのあとファーストバイトのタイミングと「Are you ready!?」のフレーズのタイミングが思いのほか近かったので、演出として事前に決めておけばよかった。
  • ウェディングプランナーの方が自分らがオタクなのを見て、音響担当スタッフをオタクの人に割り当ててくれた。そのおかげで、音響スタッフと演出決めるのはかなりスムーズにいった。(ほぼ全曲ご存じだった)

まとめ

「映像に残す」「演出に使う」のであれば、セットリストを決めるのに著作権問題はかなりネックになる。式場によってこの辺の取り扱いは違うと思うので、以上のことをあらかじめ知っておいたうえで、式場見学の際に聞いてみると式場を決める判断材料のひとつになると思う。オタク夫婦で挙式の予定がある方は参考にしてみてください。

 

宣伝

自分が挙式した式場がものすごくよい式場だったので宣伝します。

さいたま市西区アルタビスタガーデンです。

www.altavista-garden.com

親会社が映像制作会社なので、記録映像にこだわっています。「終わったあとに残るのは写真と映像だけ」ということをかなり協調されています。

また、一般に披露宴中は友人や会社の人との交流の時間が長くなりがちで、当日は両親や家族との時間をとることが難しいですが、ここの式場は家族との時間を大切にしており、ファミリータイムという両親とお話する時間をしっかり確保してくれるのが特徴です。

駅から遠いことが難点(当日ゲスト6人くらい遅刻してきた)ですが、そのぶん会場は広いので、コロナ禍の挙式でソーシャルディスタンスを確保することができました。披露宴会場のテーブル間が広いとドレス姿でも歩きやすいし、エスコートする側も気を使わなくて楽です。完全にバリアフリーで、ゲストが入っていけるところは車いすでも入っていけるようになっており、車椅子のゲストも安心です。

普段はレストランをやっているので、記念日にお食事するなど挙式後も遊びに来ることができます。

 

知り合いであれば紹介しますので連絡待ってます。

オリジナルドリンクを作ってくれました

 

2万円ロードバイク 21technology 700Cについて

近年の自転車ブームによって,Amazonで非常に安い価格でロードバイクを購入することができるようになりました。こういうロードバイクの存在自体は知っていたのですが,今回Amazonで2万円で販売されているロードバイクを持っている友人と走る機会ができたので,スポーツ自転車を9年乗っている人間が見た,触った所感を残します。

 

 

21technologyとは

初めて聞いたメーカーだったので調べてみました。

www.21technology.co.jp

ちゃんとしたHPがあって本社工場も福岡市で,その辺の信頼はありそうです。おそらく中華の謎のメーカー含めても最も安い価格で自転車を作って売っている会社のようです。クロスバイクロードバイクMTBも2万円を切っています。普通こんな価格でスポーツ自転車を売って利益が出せるわけがないので,なにか画期的な設計製造販売プロセスがありそうです。

f:id:saddle93:20210308214511p:plain

とにかく安心をアピール

21technology 700Cモデル実車

見た目のスッキリ感に反して,とにかくめちゃくちゃ重いです。一体どこにこんな重さが詰まっているのかと思ったがおそらくホイールです。おそらくGIANTのEscapeのほうが軽かった気がします。

変速は2x7の14速で,ステムの脇にレバーがある珍しいタイプでした。ディレイラーSHIMANOのTourneyで,ママチャリによく使われているやつでした。ギア比は見るの忘れました。フロントディレイラーは2速でもディレイラー位置を4段階に調整できるものが多いですが,これは2段階です。リアが7速だから不要ということでしょう。

タイヤは28Cでスポークは36本あり,かなりハードな使い方をしても大丈夫そうです。デフォルトで入っているチューブのバルブは仏式のようです。

ブレーキはキャリパータイプで,やはり安いなりに効きはあまりよくないです。補助ブレーキがついていますが,こっちは高速走行時はほぼ使えないでしょう。テクトロのカンチブレーキを思い出しました。

f:id:saddle93:20210308214832p:plain

左の黄色が21technology

f:id:saddle93:20210308215309p:plain

変速レバーがステムの脇にある

フロントはH/L表記

f:id:saddle93:20210308223635p:plain

ブレーキのメーカーは不明

f:id:saddle93:20210308215856p:plain

ヒルクライム走行中

あとは泥除け用のダボ穴が充実していますが,シートステーに穴はないのでキャリアはつけるのは一工夫必要です。面白かったのが,リアの反射板をつける用の台座があったことです(上の写真のかかとの後ろにあるやつ)。ここにはお金をかけてフレーム成型するのかと思いました。サドルは非常に柔らかくお尻にやさしい作りになっており,乗っている本人もお尻の痛みは感じていないようでした。

輪行はできるのか

結論から言うと,かなり大変です。通販で買ったときに前輪は外されて送られて来るらしいので,前輪のシャフトはクイックリリースタイプなのですが,後輪がスタンドと一緒に完全に15mmナットで固定されています。今回これを外すのがめちゃくちゃ大変でした。(自分がやったわけではなく,LINEで遠隔指示した)

しばらく屋外に放置すると錆びて固着してなかなか外れません。2時間近く格闘してダメでした。結局自転車屋に持ち込んで外してもらうことになりました。15mmというのが非常にマイナーな規格らしく,ソケットがその辺では手に入らないというのがまた厄介でした。

このように,外すことは全く想定されておらず,特に初心者にはかなり難しいのではないかと思います。クイックリリース化するにしても,シャフトごと交換になるので,特殊な工具が必要になるほか,玉当たり調整などかなりシビアな作業になるので,自転車屋に投げることになると思います。

f:id:saddle93:20210308220802p:plain

スタンド一緒にナットでガッチリ固定

規格はロードバイクなので,130mmエンド金具が使えて,オーストリッチの縦型輪行袋にもちゃんと収まりました。しかし,このナットが外れて輪行状態にできたとしても,輪行解除も大変でした。フレームの後輪軸を受ける穴の位置の精度が非常に悪く,フレームを手で歪めながらはめることになりました。こんなことは今までどんなスポーツ自転車でもなかったのでビックリです。

このように前後輪を外す輪行はまず想定されていません。前輪だけ外すタイプの輪行袋を使うしかないようです。(鉄道各社のルールによっては前輪だけ外すタイプの輪行袋では輪行できない可能性があります)

どんな人に薦められるか

安い,丈夫,重い,輪行が難しいといった特徴から考えると,主に通勤通学で楽に走りたいという人向けだと思います。トラブルが起きた時に柔軟に対応できるようにするというよりは,トラブルを起こさないという思想で設計製造されているように思えます。

今回この自転車の持ち主の友人はこれで箱根を登ったのですが,本人が普段からかなり運動,トレーニングしているからなしえたことだと思います。運動不足の人がこれに乗って箱根を登ろうと思ったら地獄を見ると思います。自分はやりたくないですね。

新しくロードバイクを買って,まじめに運動しようと思っている人はこれを買うべきではありません。5-10万円出してGIANTやBianchiから入ったほうがあとあと後悔しないと思います。逆に通勤通学がママチャリで辛いという人には,超格安でロードバイクが手に入ってスイスイ進むので適したロードバイクだと思います。

 

コミケに始発で行けるお得な物件をPythonを使って探そう #3 賃料相場比較編

#2でコミケに始発で行ける駅の特定ができたので,今回はその中で賃料相場の安いエリアを探します。
saddlenreport.hatenablog.jp
saddlenreport.hatenablog.jp

23区の賃料相場

まず東京23区の一人暮らし物件の賃料相場を見てみます。対象はワンルームと1Kの物件です。
Pythonを使って,#1で出力した賃貸データcsvから箱ひげ図を作りました。Pythonを使うと箱ひげ図の作成が驚くほど簡単でした。

f:id:saddle93:20200405144602p:plain
東京23区の賃料相場と物件数
港区千代田区中央区が高く,足立区葛飾区あたりが安いという予想通りの結果になりました。港区に家賃120万円くらいの外れ値があるので見てみます。
f:id:saddle93:20200405161834p:plainf:id:saddle93:20200405161923p:plain
Blooming西麻布 001号室
住宅じゃなさそう…テナントをワンルームとして掲載しているようです。
葛飾区にもひとつだけぶっ飛んだ外れ値があるので見てみます。
f:id:saddle93:20200405162349p:plainf:id:saddle93:20200405162443p:plain
サンルーチェ 葛飾区柴又
柴又にある普通の1Kのように見えて家賃102万円!これはどうかんがえてもおかしいですね。おそらく誤植です。102万円の家賃に対して管理費5000円がアンバランスです。
外れ値が大きくて見づらいので拡大します。
f:id:saddle93:20200405145021p:plain
東京23区の賃料相場と物件数
中央値順(オレンジライン)に並べ替えています。都心で一人暮らしするには最低でも家賃6万円は見ておかないといけないということがわかります。また,物件数は新宿区がぶっちぎりで多いですね。「新宿区市」というものが混ざっていますが,これは新宿区市ヶ谷の住所が処理の中で「市」で区切られてしまった弊害です。今回は目をつぶってほしい。
比較のために名古屋市の相場を見てみます。
f:id:saddle93:20200405145650p:plain
名古屋市の賃料相場と物件数
三大都市圏の一角とはいえ,東京に比べるとだいぶ安いです。
では最も賃料相場が高い東京都港区をさらに細かく字ごとに見ていきます。
f:id:saddle93:20200405150419p:plain
東京都港区の賃料相場と物件数
北青山がぶっちぎりで高い。次いで元赤坂が高いですが,そもそも元赤坂って住めるんですね。元赤坂は赤坂御用地のはず…
f:id:saddle93:20200405150820p:plain
若干住宅用地がありそう
港区民の肩書が欲しい人は三田で家を探しましょう。
このようにいろんな単位で賃料相場を見ることができるようになりました。

コミケに始発で行ける駅で最も安いエリアはどこか

東京23区に加え,西東京市(保谷駅),千葉県内京葉線沿線,京浜東北線埼玉神奈川県沿線の賃貸データをマージしてひとつの賃貸データファイルにします。約100,000件の物件データをもつファイル(約35MB)になりました。その100,000件の物件データから,最寄り駅が国際展示場駅に5:43までに到着できる駅に絞ります。ここでいう最寄り駅は,物件情報に3つ書いてある最寄り駅の1番目の駅を指します。この絞り込みもPythonを使ってやりました。

f:id:saddle93:20200405153414p:plain
27%近くまで絞れた
ではまず賃料相場が高い駅TOP20
f:id:saddle93:20200405155158p:plain
高賃料相場駅TOP20
西武新宿駅がトップですがそもそも物件数がないので参考になりません。そこそこ物件数があるところだとトップは御成門,浜松町のエリアでした。要は港区です。
次に賃料相場が安い駅40
f:id:saddle93:20200405160946p:plain
安賃料相場駅TOP40
検見川浜,南船橋蘇我京葉線の駅がTOP3を占めました。物件数がそこそこあるところで見ると,蘇我保谷葛西臨海公園,蕨がどうも安そう。蘇我保谷は当初の予想通りでしたが,葛西臨海公園は意外でした。さすが江戸川区
でも最低でも家賃は5万円見ておかないといけなさそうです。保谷ですでに中央値が5万円を上回っています。ちなみに山手線内の駅で最も安いのは西日暮里駅でした。

結論

コミケに始発で行ける駅で賃料相場が安いのは,
蘇我駅保谷駅葛西臨海公園駅蕨駅
でした。

次はさらにこの駅からお得な物件を探してみます。

コミケに始発で行けるお得な物件をPythonを使って探そう #2 コミケ駅別始発到着時刻調査編

#1に続き,今回はコミケに始発で行ける駅を特定します。
saddlenreport.hatenablog.jp

同じくwebスクレイピングを使用しますが,前回とは少しやり方が異なります。
終結果だけ見たい人は「首都圏の各駅から始発で国際展示場に何時に着けるか」までとんでください。

やりたいこと

  • 調べたい駅の一覧のcsvを読み込む
  • その駅から「国際展示場駅」まで始発で行くときの出発時刻と到着時刻と運賃の取得
  • 到着時刻が早い順に並べ替え
  • 結果の出力

調べたい駅の一覧のcsvの作成

以下のようなcsvを用意します
f:id:saddle93:20200401222412p:plain
そのまま駅名を羅列します。路線別にまとめて並べています。複数路線が乗り入れる駅は路線の数分重複しています。こうすることで,初電の列車がどこ始発なのかがわかりやすくなります。(例えば京浜東北線南行初電は南浦和駅始発)
このときなんの文字コードで書いたかを確認しておく必要があります。駅データの一覧は以下のサイトからフリーでダウンロードできるので活用しました。このデータはutf-8で書かれています。
ekidata.jp

コード

コード自体は短くまとめることができます。

from bs4 import BeautifulSoup
from selenium import webdriver
import csv
import pprint
import pandas as pd
from pandas import Series, DataFrame
import time
import sys
import unicodedata

sta =[]

filename = 'sotetsu'
csvname = filename + '.csv'

for cols in csv.reader(open(csvname), delimiter=','):
    val = cols[0]
    sta.append(val)

fare = []
deptime = []
arrtime = []

# Chrome用ドライバー読込
v_browser = webdriver.Chrome('D:\python\chromedriver.exe')
# 路線検索サイトを開く
v_browser.get('http://transit.yahoo.co.jp')

for i in range(len(sta)):

    # サイトの出発駅の場所を特定
    v_sfrom = v_browser.find_element_by_id("sfrom")
    # 出発駅を入力
    v_sfrom.send_keys(sta[i])
    # サイトの到着駅の場所を特定
    v_sto = v_browser.find_element_by_id('sto')
    # 到着駅を入力
    v_sto.send_keys('国際展示場')
    #始発を選択
    radioButton = v_browser.find_element_by_id("tsFir");
    radioButton.click();

    v_sto.submit()

    # 運賃を取得し、円を取り除く
    v_fare = v_browser.find_element_by_class_name('fare').text.replace('円','')
    # 運賃からカンマを取り除く
    v_fare_int = v_fare.replace(',','')
    #出発時刻を取得
    v_deptime_0 = v_browser.find_elements_by_class_name('time')
    v_deptime_1 = v_deptime_0[1].text.split('→')
    v_deptime = v_deptime_1[0]
    #運行に異常がある場合,[!]が出るので削除
    if '[!]' in v_deptime:
        v_deptime = v_deptime.replace('[!]','')


    #到着時刻を取得
    v_arrtime = v_browser.find_element_by_class_name('mark').text

    print(str(i+1) + '/' + str(len(sta)))
    print(sta[i])
    print(v_fare_int)
    print(v_deptime)
    print(v_arrtime)

    fare.append(v_fare_int)
    deptime.append(v_deptime)
    arrtime.append(v_arrtime)

    #プログラムを10秒間停止する(スクレイピングマナー)
    time.sleep(10)

    v_browser.get('http://transit.yahoo.co.jp')

# ブラウザを閉じる
v_browser.close()


#各配列をシリーズ化
sta = Series(sta)
fare = Series(fare)
deptime = Series(deptime)
arrtime = Series(arrtime)

output_df = pd.concat([sta,deptime,arrtime,fare], axis=1)
output_df.columns=['出発駅','出発時刻','到着時刻','運賃']
output_df = output_df.rename_axis('MyIdx').sort_values(['到着時刻','MyIdx'])

output_df.to_csv(filename + '_res.csv', sep = '\t',encoding='utf-16')

print('csv出力完了')

上記のコードは自分で作成した相鉄線の駅一覧のデータシート"sotetsu.csv"を読み込んで始発到着時刻を調べるプログラムになっています。
やっていることは

  1. 駅データの読み込み
  2. Chromeドライバの読み込みとYahoo乗り換えサイトオープン
  3. 条件を設定して検索,結果の取得を駅数分繰り返し
  4. ブラウザを閉じて結果をcsv出力

となっています
経由地を設定したいときは以下のコードを追加します

    #サイトの経由駅の場所を特定
    v_svia1 = v_browser.find_element_by_id('svia1')
    #経由駅を入力
    v_svia1.send_keys('新木場')

JR総武中央緩行線の出力結果です

f:id:saddle93:20200402145148p:plain
JR総武中央緩行線の各駅から始発で国際展示場駅に何時に到着できるか
中野~秋葉原の各駅と両国からだと,国際展示場駅に5:43(りんかい線新木場始発)に到着できます。秋葉原と両国の間の浅草橋からだと到着できないのが面白いポイントです。

経由駅の設定による結果の差

いろんな路線でこの処理をしていて気づいたのは,経由駅の設定の仕方で結果が変わってしまうことです。当然だろうと思うかもしれないですが,「経由駅を設定しない検索結果」よりも「経由駅を設定した検索結果」のほうが到着時刻が早くなるケースがありました。
以下に京浜東北線の2つの処理結果を示します。

f:id:saddle93:20200402150056p:plain
経由駅設定なしの結果
f:id:saddle93:20200402150146p:plain
経由駅を「新木場」としたときの結果
南浦和~品川の各駅は同じ5:43着の結果となっていますが,新木場を経由地に設定することで大井町桜木町の各駅からも5:43着が可能になるという結果になりました。これは正直意図しない結果でした。Yahoo路線検索の始発検索は,本当に早く到着できる乗り換えを表示するわけではないそうです。
試しに,大井町から国際展示場で始発検索を2パターンやってみると,
f:id:saddle93:20200402150912p:plain
上が通常検索,下が新木場経由検索
経由地を設定すると10分も早く到着できます。まあ1時間早く出てまで10分先に到着したいか,という話なのですが,コミケ始発組にとって10分は大きな差です。
このように経由地の設定の仕方で到着時刻が変わってしまい,「本当の始発」の特定が現状難しいです。他にゆりかもめを考慮して豊洲経由にすると,また結果が変わります。じゃあ全部新木場経由で検索すればいいじゃないか,と思うかもしれませんがそうすると本来大崎始発に乗れる駅の特定が難しくなります。
これを解決するには経由駅を複数パターン用意してそれぞれ検索し,最も早く到着できるものを記録する,という手段が考えられます。処理時間が数倍になるので自分はやっていません。もしもっとスマートな方法があったら教えてください。

首都圏の各駅から始発で国際展示場に何時に着けるか

以下が調査結果です。青が5:43より前に到着,赤が5:43に到着,緑が5:53までに到着できる駅になります。(2020年3月ダイヤ改正後)

f:id:saddle93:20200402153037p:plain
2020年3月ダイヤ改正
図はinkscapeを使って自作しました。京浜東北線,中央線,京葉線有楽町線沿いが早く到着できる傾向になっています。5:43に到着できる一番遠い駅は保谷蘇我でしょうか。
ちなみに2019年版と比較してみたところ,高円寺~三鷹の各駅がダイヤ改正で始発繰り下げにより5:43に到着できなくなりました。他にも始発繰り下げの影響を受けているところがありました。

問題点

同じ駅名をもつ駅に対応できていません。例えば日吉(東急東横線と山陰線)や霞が関(日比谷線東武東上線)など。
これはまず駅データのマスターから同一駅名を抽出して,辞書的な役割をさせてうまく区別させる必要がありそうです。気が向いたらやってみます。

以上です。
次はいよいよコミケに始発で行ける賃料相場の安い駅を特定します。

コミケに始発で行けるお得な物件をPythonを使って探そう #1 物件情報取得編

物件を探すにあたって,まずは物件情報を一通りそろえなければなりません。そこで,まずはWebスクレイピングでSuumoから物件情報を取得して,csvに書き出します。
以下の記事を参考にしました。
www.analyze-world.com

ベースのコードはこの記事のコードです。そこに少し手を加えました。

前処理

必要なライブラリをインポートして,Suumoのページ数を取得。

#必要なライブラリをインポート
from bs4 import BeautifulSoup
import urllib3
import re
import requests
import pandas as pd
from pandas import Series, DataFrame
import time
import sys
import unicodedata

#URL(賃貸住宅情報 検索結果の1ページ目)
print('URLを入力してください')
url=input()
#url = 'https://suumo.jp/jj/chintai/ichiran/FR301FC001/?ar=030&bs=040&ta=14&sc=14101&sc=14102&sc=14103&sc=14109&cb=0.0&ct=9999999&et=9999999&md=04&md=06&md=07&cn=9999999&mb=0&mt=9999999&shkr1=03&shkr2=03&shkr3=03&shkr4=03&fw2=&srch_navi=1'

print('出力ファイル名を入力してください(拡張子不要)')
csvname=input()


#データ取得
result = requests.get(url)
c = result.content

#HTMLを元に、オブジェクトを作る
soup = BeautifulSoup(c,"html.parser")

#物件リストの部分を切り出し
summary = soup.find("div",{'id':'js-bukkenList'})
#print(summary.prettify())

#ページ数を取得
body = soup.find("body")
pages = body.find_all("div",{'class':'pagination pagination_set-nav'})
pages_text = str(pages)
pages_split = pages_text.split('</a></li>\n</ol>')
pages_split0 = pages_split[0]
pages_split1 = pages_split0[-3:] #4桁ページ数には非対応
pages_split2 = pages_split1.replace('>','')
pages_split2 = pages_split2.replace('"','')
pages_split3 = int(pages_split2)
print(str(pages_split3) + 'pages')

ここで入力するSuumoのURLは,検索結果の最初の1ページ目のものです。
 f:id:saddle93:20200317225502p:plain

f:id:saddle93:20200317225546p:plain
相場を見るにはあまり条件を絞りすぎないほうがよい
これで検索ボタンを押して最初に出てきたページのURLを入力します。そのあと,ページ下部にあるページ遷移ボタンの末尾(「次へ」の左にある数字)を読んで,全ページ数を取得します。

次にURLのリストを作ります。

#URLを入れるリスト
urls = []

#1ページ目を格納
urls.append(url)

#2ページ目から最後のページまでを格納
for i in range(pages_split3-1):
    pg = str(i+2)
    url_page = url + '&page=' + pg
    urls.append(url_page)


#print(urls)

name = [] #マンション名
address = [] #住所
pref = [] #都道府県
city = [] #市
ward = [] #区
town = [] #それ以下
#ad_num = [] #番地
locations0 = [] #立地1つ目(最寄駅/徒歩~分)
loc0_rosen =[]
loc0_sta =[]
loc0_bus=[]
loc0_foot = []
locations1 = [] #立地2つ目(最寄駅/徒歩~分)
loc1_rosen =[]
loc1_sta =[]
loc1_bus = []
loc1_foot = []
locations2 = [] #立地3つ目(最寄駅/徒歩~分)
loc2_rosen =[]
loc2_sta =[]
loc2_bus = []
loc2_foot = []
age = [] #築年数
height = [] #建物高さ
floor = [] #階
rent = [] #賃料
admin = [] #管理費
others = [] #敷/礼/保証/敷引,償却
floor_plan = [] #間取り
area = [] #専有面積
detail_urls=[] #詳細URL
rent_tot=[] #合計賃料

Suumoの検索結果の2ページ目以降はURL末尾に"&page=2"とついているだけなので,手動でこれをつけてやってあとはfor文を回してあげます。あとは取得するデータを格納する空のリストを準備します。もっとスマートな方法があったら教えてください。

住所の取得

次に物件の住所を取得します。あとで解析がしやすいように,都道府県,市区町村,政令区,字以下で分けました。

#各ページで以下の動作をループ
for url in urls:
    #物件リストを切り出し
    result = requests.get(url)
    c = result.content
    soup = BeautifulSoup(c)
    summary = soup.find("div",{'id':'js-bukkenList'})

    #マンション名、住所、立地(最寄駅/徒歩~分)、築年数、建物高さが入っているcassetteitemを全て抜き出し
    cassetteitems = summary.find_all("div",{'class':'cassetteitem'})

    #各cassetteitemsに対し、以下の動作をループ
    for i in range(len(cassetteitems)):
        #各建物から売りに出ている部屋数を取得
        tbodies = cassetteitems[i].find_all('tbody')
        #print(tbodies)
        room_number=len(tbodies)

        #マンション名取得
        subtitle = cassetteitems[i].find_all("div",{
            'class':'cassetteitem_content-title'})
        subtitle = str(subtitle)
        subtitle_rep = subtitle.replace(
            '[<div class="cassetteitem_content-title">', '')
        subtitle_rep2 = subtitle_rep.replace(
            '</div>]', '')

        #住所取得
        subaddress = cassetteitems[i].find_all("li",{
            'class':'cassetteitem_detail-col1'})
        subaddress = str(subaddress)
        subaddress_rep = subaddress.replace(
            '[<li class="cassetteitem_detail-col1">', '')
        subaddress_rep2 = subaddress_rep.replace(
            '</li>]', '')

        #住所から都県抜き出し
        if '県' in subaddress_rep2:
            temp_address1=subaddress_rep2.split('県',1)
            pref_temp1=temp_address1[0]+'県'
        elif '都' in subaddress_rep2:
            temp_address1=subaddress_rep2.split('都',1)
            pref_temp1=temp_address1[0]+'都'

        #住所から市町村と東京特別区を抜き出し
        if '市' in temp_address1[1]:
            temp_address2=temp_address1[1].split('市',1)
            city_temp1=temp_address2[0]+'市'
        elif '区' in temp_address1[1]:
            temp_address2=temp_address1[1].split('区',1)
            city_temp1=temp_address2[0]+'区'
        elif '町' in temp_address1[1]:
            temp_address2=temp_address1[1].split('町',1)
            city_temp1=temp_address2[0]+'町'
        elif '村' in temp_address1[1]:
            temp_address2=temp_address1[1].split('村',1)
            city_temp1=temp_address2[0]+'村'

        #住所から政令指定都市の区を抜き出し
        if '区' in temp_address2[1]:
            temp_address3=temp_address2[1].split('区',1)
            ward_temp1=temp_address3[0]+'区'
            temp_address4=temp_address3[1]
        else:
            ward_temp1 = None
            temp_address4 = temp_address2[1]

        #字の抜き出し
        uni = unicodedata.east_asian_width(temp_address4[-1])
        if uni == 'F':
            town_temp1=temp_address4[:-1]
        else:
            town_temp1=temp_address4


        #部屋数だけ、マンション名と住所を繰り返しリストに格納(部屋情報と数を合致させるため)
        for y in range(len(tbodies)):
            name.append(subtitle_rep2)
            address.append(subaddress_rep2)
            pref.append(pref_temp1)
            city.append(city_temp1)
            ward.append(ward_temp1)
            town.append(town_temp1)

かなりパワープレーみたいな書き方になっています。例えばこの書き方だと,都城市市原市のような地名に対応できません。全部対応させようするとかなり長いコードになりそうな気がしたので,今回はここまでにしました。

立地・築年数・建物高さの取得

駅から徒歩〇分や駅からバスで△分徒歩◇分のような立地と築年数と建物高さを取得します
Suumoの立地表記はだいたい以下2つの様式です。

ですがたまにイレギュラーがあります。Suumoの表記の仕方に特に決まりはないようで,例えば

のように書かれていることもあります。宇須ってなんだよと思いましたが,宇都宮線横須賀線を表しているようです。こういうイレギュラーがあるだけであとの解析が面倒になります。他に「車で〇分」だったりそもそも路線を書かずバス路線系統と停留所しか書かれていないものもありました。

       tempcassette=cassetteitems[i]
       #立地を取得
        sublocations = cassetteitems[i].find_all("li",{
            'class':'cassetteitem_detail-col2'})
        #立地は、1つ目から3つ目までを取得(4つ目以降は無視)
        for x in sublocations:
            cols = x.find_all('div')
            for i in range(len(cols)):
                text = cols[i].find(text=True)
                if text != None:
                    split01 = text.split('/',1)
                    subloc_rosen = split01[0]
                    if '歩'  in split01[1]:
                        split02 = split01[1].split(' 歩',1)
                        if ' バス' in split02[0]:
                            split03 = split02[0].split(' バス', 1)
                            subloc_sta = split03[0]
                            print(split03[1])
                            split04 = split03[1].split('分', 1)
                            subloc_bus = split04[0]
                        else:
                            subloc_sta = split02[0]
                            subloc_bus = None
                        subloc_foot = split02[1]
                        subloc_foot = subloc_foot.strip('分')
                    else: #歩きじゃない場合は削除
                        subloc_rosen = None
                        subloc_sta = None
                        subloc_bus = None
                        subloc_foot = None
                else:
                    subloc_rosen = None
                    subloc_sta = None
                    subloc_bus = None
                    subloc_foot = None

                for y in range(len(tbodies)):
                    if i == 0:
                        locations0.append(text)
                        loc0_rosen.append(subloc_rosen)
                        loc0_sta.append(subloc_sta)
                        loc0_bus.append(subloc_bus)
                        loc0_foot.append(subloc_foot)
                    elif i == 1:
                        locations1.append(text)
                        loc1_rosen.append(subloc_rosen)
                        loc1_sta.append(subloc_sta)
                        loc1_bus.append(subloc_bus)
                        loc1_foot.append(subloc_foot)
                    elif i == 2:
                        locations2.append(text)
                        loc2_rosen.append(subloc_rosen)
                        loc2_sta.append(subloc_sta)
                        loc2_bus.append(subloc_bus)
                        loc2_foot.append(subloc_foot)

        #築年数と建物高さを取得
        #なぜか仮で別の変数に入れ直さないとうまくいかない
        age_and_height = tempcassette.find('li', class_='cassetteitem_detail-col3')
        _age = age_and_height('div')[0].text
        _height = age_and_height('div')[1].text
        if _age == '新築':
            _age = _age.replace('新築','0')
        else:
            _age = _age.strip('築')
            _age = _age.strip('年')

        for i in range(room_number):
            age.append(_age)
            height.append(_height)

歩きを伴わない立地は後の処理で面倒になりそうだったので削除しました。
新築は0年に置き換え,すべて数値型で扱えるようにします。
住所と同様に同じ建物の部屋数分だけ配列に追加します。
このとき,なぜかtempcassetteという仮の別の変数に入れ直さないと動きませんでした。結局原因はわかっていません。

賃料など部屋ごとのステータスの取得

最後に部屋ごとの各ステータスを取得します。

    #階、賃料、管理費、敷/礼/保証/敷引,償却、間取り、専有面積が入っているtableを全て抜き出し
    tables = summary.find_all('table')


    #各建物(table)に対して、売りに出ている部屋(row)を取得
    rows = []
    for i in range(len(tables)):
        rows.append(tables[i].find_all('tr'))

    #各部屋に対して、tableに入っているtext情報を取得し、dataリストに格納
    data = []
    for row in rows:
        for tr in row:
            cols = tr.find_all('td')
            if len(cols) != 0:
                _floor0 = cols[2].text
                _floor0 = re.sub('[\r\n\t]', '', _floor0)
                if _floor0 == '-':
                    _floor = '1'
                else:
                    split_fl = _floor0.split('-')
                    _floor = _floor0[0].strip('階')

                _rent_cell = cols[3].find('ul').find_all('li')
                _rent = _rent_cell[0].find('span').text
                _rent = _rent.replace(u'万円',u'')
                _admin = _rent_cell[1].find('span').text
                if _admin == '-':
                    _admin = _admin.replace('-','0')
                else:
                    _admin = _admin.strip('円')
                    _admin = int(_admin)/10000

                _rent_tot = float(_rent) + float(_admin)
                _rent_tot = round(_rent_tot,2)
                _deposit_cell = cols[4].find('ul').find_all('li')
                _deposit = _deposit_cell[0].find('span').text
                _reikin = _deposit_cell[1].find('span').text
                _others = _deposit + '/' + _reikin

                _floor_cell = cols[5].find('ul').find_all('li')
                _floor_plan = _floor_cell[0].find('span').text
                _area = _floor_cell[1].find('span').text
                _area = _area.replace(u'm2',u'')

                _detail_url = cols[8].find('a')['href']
                _detail_url = 'https://suumo.jp' + _detail_url

                text = [_floor, _rent, _admin, _others, _floor_plan, _area, _detail_url, _rent_tot]
                data.append(text)

    for row in data:
        floor.append(row[0])
        rent.append(row[1])
        admin.append(row[2])
        others.append(row[3])
        floor_plan.append(row[4])
        area.append(row[5])
        detail_urls.append(row[6])
        rent_tot.append(row[7])

    print(len(data))
    print(url + '完了')
    #プログラムを10秒間停止する(スクレイピングマナー)
    time.sleep(10)

部屋ごとにステータス欄のhtmlコードを配列に格納し,それを分解して各ステータスを指定の配列に追加していきます。
敷金礼金は数値化していません。必要になったらしようかなと思っています。

出力処理

csvに出力します。

#各リストをシリーズ化
name = Series(name)
address = Series(address)
pref = Series(pref)
city = Series(city)
ward = Series(ward)
town = Series(town)
locations0 = Series(locations0)
loc0_rosen = Series(loc0_rosen)
loc0_sta = Series(loc0_sta)
loc0_bus = Series(loc0_bus)
loc0_foot = Series(loc0_foot)
locations1 = Series(locations1)
loc1_rosen = Series(loc1_rosen)
loc1_sta = Series(loc1_sta)
loc1_bus = Series(loc1_bus)
loc1_foot = Series(loc1_foot)
locations2 = Series(locations2)
loc2_rosen = Series(loc2_rosen)
loc2_sta = Series(loc2_sta)
loc2_bus = Series(loc2_bus)
loc2_foot = Series(loc2_foot)
age = Series(age)
height = Series(height)
floor = Series(floor)
rent = Series(rent)
admin = Series(admin)
others = Series(others)
floor_plan = Series(floor_plan)
area = Series(area)
detail_urls = Series(detail_urls)
rent_tot = Series(rent_tot)

suumo_df = pd.concat([name, pref,city, ward,town, loc0_rosen,loc0_sta,loc0_bus,loc0_foot,loc1_rosen,loc1_sta,loc1_bus,loc1_foot,loc2_rosen,loc2_sta,loc2_bus,loc2_foot, age, height, floor, rent, admin,rent_tot, others, floor_plan, area, detail_urls], axis=1)

suumo_df.columns=['マンション名','都県','市区町村','区','字','立地1_路線','立地1_駅','立地1_バス','立地1_徒歩[分]','立地2_路線','立地2_駅','立地2_バス','立地2_徒歩[分]','立地3_路線','立地3_駅','立地3_バス','立地3_徒歩[分]',\
'築年数','建物の高さ','階層','賃料料[万円]','管理費[万円]','合計賃料[万円]', '敷/礼/保証/敷引,償却','間取り','専有面積[m2]', '詳細URL']

suumo_df.to_csv('resdata/' + csvname + '.csv', sep = '\t',encoding='utf-16')

print('csv出力完了')

シリーズ化するのが面倒です。一括でできるコマンドはないのか…
文字コードUTF-16で,タブ区切りで出力していますが特に意味はないです。参考にした記事を書いた方がそうしていたからです。

これで以下のようなcsvを出力することができます。

f:id:saddle93:20200401215852p:plain
東京都練馬区の例
試しに東京都中央区の一番賃料が高い1Kの物件を見てみましょう
f:id:saddle93:20200401224720p:plain
STUDIOと書いてあるが…
f:id:saddle93:20200401224841p:plain
KDXレジデンス日本橋人形町 日比谷線人形町徒歩3分で家賃月113万円!
どういう層に需要があるんでしょうか…

一連の処理の問題として感じられたのは以下の通り

  • すべての市区町村名に対応できない
  • 立地表記ゆれに対応できない
  • 処理中にネット回線が不安定になると処理失敗になる
  • 少ないページ数に対応できない

上2つは前述のとおりです。
3つ目に関して,非常に多くの物件を取得しようすると長い時間がかかります。その途中でネットの回線が不安定になると,処理が止まりいままでの処理がなかったことになります。これは一番最後にcsv出力する仕様になっているためです。
4つ目は,ページ数取得がうまくいきません。以下のページ番号リンクの「...」の右の番号を参照しているからです。「...」が現れないケースはページ数を取得できません。
f:id:saddle93:20200401162039p:plain
また,1回だけですが,処理中に物件が消されて最初に取得したページ数より少ないページになってしまうケースがありました。これは非常にレアケースなので無視しました。

以上です。次はコミケに始発で行ける駅を特定します。