道用も山崎先生の課題をやってみた

pandas、matplotlibは詳しくないので、学生気分に戻って山崎先生のデータサイエンスの課題をやってみました。
学生が住むための物件探しを目的として、おすすめの駅という観点から分析を進めていきます。
基本的には家賃、通学時間、バスの利用有無が大きな決定要素と考えられるので、それらを中心に考えていきます。

(※2021/11/15データの絞り込みに間違いがあったのでプログラムと分析結果の数字を修正しました。)

ワンルーム家賃相場感

学生が住むための物件探しを目的としているため、まずはワンルームに絞って相場感をみてみてみます。
ワンルームの相場は5〜6万円が多いようです。

路線毎に違いはあるか??

田園都市線、相鉄本線、ブルーラインは5万円以下の物件も豊富のようですが、
物件数が多い京急本線、東急東横線、JR京浜東北線本線、JR南武線は5〜6万円が多いようです。

家賃を絞って通学時間を見てみる

ワンルーム(63308件)から家賃を3〜6万円に絞ると、9868件になりました。

この9868件を対象に通学時間を概観してみると、40分前後の物件が多いようです。
30分程度の物件もかなり存在することから、みなとみらいは都会ですが学生の一人暮らし環境としては悪く無いように感じます。

通学時間、バスの有無でも物件を絞る→おすすめ駅を抽出

とりあえず、通学時間50分という条件でさらに物件を絞り込むと、7472件になりました。

さらに、、バスは利用せずという条件にすると7026件にまで絞り込まれます。

条件に合致する物件が多い駅Top10を「おすすめ駅」としました。
おすすめ駅とそれぞれの物件数は下記の図の通りです。

下のヒストグラムはおすすめ駅の家賃制限(3〜6万円)内の物件の分布です。
おすすめ駅の家賃分布を見てみると、保土ヶ谷、弘明寺、白楽、妙蓮寺には4万円以下の物件が結構ありそうです。
日吉、元住吉、鶴見、京急鶴見は5〜6万円の物件が中心のようです。

物件の表示

おすすめ駅の中での駅名を入力します。下図の例では弘明寺駅を入力してあります。

すると、入力した駅の物件一覧が見れます。URLをクリックすると物件情報もみることができます。

続けますか?y or n で y を入力すると駅の入力に戻ることができます。



ソースコード

  1. import pandas as pd # データ分析に用いるライブラリ
  2. import matplotlib.pyplot as plt # グラフ表示に用いるライブラリ
  3. pd.set_option('display.unicode.east_asian_width', True) # 表示のずれを少し緩和
  4. plt.rcParams['font.family'] = 'IPAexGothic' # グラフ表示におけるフォントの指定
  5. data_path = "./data.csv"
  6. df_data = pd.read_csv(data_path, encoding="utf-8-sig")
  7. # print(df_data["合計時間"].describe())
  8. # print(df_data.groupby(["間取り"]).count())
  9. print("物件数", len(df_data), "件")
  10. # ワンルーム全体の相場を調べる---------------------------------------
  11. mask=(df_data["間取り"]=="ワンルーム")
  12. df_selected_roomtype=df_data[mask]
  13. df_selected_roomtype.loc[:, "家賃"].hist(range=(0,20),bins=40)
  14. plt.xlabel("ワンルーム家賃(万円)") # 横軸のラベル
  15. plt.ylabel("件数") # 縦軸のラベル
  16. plt.xlim(0, 16)
  17. plt.title("ワンルーム家賃のヒストグラム") # グラフのタイトル
  18. plt.show()
  19. # -------------------------------------------------------------
  20. # 路線毎のワンルーム相場 -------------------------------------
  21. #エラーが出たので山崎先生に教えてもらいました。
  22. axes = df_selected_roomtype.loc[:, "家賃"].hist(by=df_selected_roomtype.loc[:, "路線"],
  23.                                                  range=(0, 10), bins=30,
  24.                                                  figsize=(14, 7),
  25.                                                  sharex=True, sharey=True)
  26. for ax in axes.reshape(-1):
  27.     ax.grid(b=True) # グリッドを表示
  28.     ax.set_xlabel("家賃(万円)") # 横軸のラベル
  29.     ax.set_ylabel("件数") # 縦軸のラベル
  30.     # ax.set_ylim(0, 120) # 縦軸の目盛りの最小値と最大値の指定
  31. plt.suptitle("路線ごとのワンルーム家賃のヒストグラム") # グラフ全体のタイトル
  32. plt.subplots_adjust(top=0.92, # グラフ位置の微調整
  33.                     hspace=0.3) # グラフ間の微調整
  34. plt.show()
  35. # ------------------------------------------------------
  36. # 希望家賃(万)
  37. rent_upper = int(input("希望家賃の上限は?(万円)"))
  38. rent_lower = int(input("希望家賃の下限は?(万円)"))
  39. # 家賃で絞り込む
  40. mask = (df_selected_roomtype['家賃'] <= rent_upper) & (df_selected_roomtype['家賃'] >= rent_lower)
  41. # 絞った内容ををfilter_dfに入れる
  42. filter_df = df_selected_roomtype[mask]
  43. print("家賃で絞り込んだ結果", len(filter_df), "件")
  44. # 通学時間---------------------------------------------------
  45. filter_df.loc[:, "合計時間"].hist(range=(0,120),bins=120)
  46. plt.xlabel("通学時間(分)") # 横軸のラベル
  47. plt.ylabel("件数") # 縦軸のラベル
  48. plt.xlim(0, 120)
  49. plt.title(str(rent_lower) +"-" + str(rent_upper)+"万円のワンルーム:通学時間ヒストグラム") # グラフのタイトル
  50. plt.show()
  51. #----------------------------------------------------------
  52. # # 通学時間(分)
  53. commuting_time = float(input("希望通学時間上限は?(分)"))
  54. mask = (filter_df['合計時間'] <= commuting_time)
  55. # filter_dfをさらに合計時間で絞り込む(filter_dfを上書き)
  56. filter_df = filter_df[mask]
  57. print("家賃,通学時間で絞り込んだ結果", len(filter_df), "件")
  58. # バスは使いますか?
  59. bus = input('バスは使ってもいいですか? y or n')
  60. if bus == 'n':
  61.     # バスなしであれば、バスは0
  62.     bus_num = 0
  63. else:
  64.     # とりあえずありえない数字を入れておく
  65.     bus_num = 10000
  66. mask = (filter_df['バス'] <= bus_num)
  67. # filter_dfをさらにバス有無で絞り込み
  68. filter_df = filter_df[mask]
  69. print("家賃,通学時間、バス有無で絞り込んだ結果", len(filter_df), "件")
  70. # 条件にあう分件が多い駅top10を表示(書き方難しかった)
  71. filter_top10_df = filter_df.groupby(['駅'])['駅'].count().sort_values(ascending=False).head(10)
  72. # 続けるかどうかのフラグ
  73. flag = True
  74. while (flag):
  75.     print('あなたにおすすめの駅は')
  76.     print(filter_top10_df)
  77.     #  条件に合致する物件数が多い上位10の駅を「おすすめ駅」とする
  78.     # 絞り込んだ結果をさらに「おすすめ駅」で絞り込み(ここちょっと書き方難しい)
  79.     mask = filter_df['駅'].isin(filter_top10_df.index)
  80.     # filter_dfからおすすめ駅に絞り込んだ結果をfilter_top10_station_dfに入れる
  81.     filter_top10_station_df = filter_df[mask]
  82.     # filter_top10_station_df.loc[:, "家賃"].hist(by=filter_top10_station_df.loc[:, "駅"],range=(rent_lower,rent_upper),bins=10,figsize=(8, 8))
  83.     # plt.show()
  84.     # ヒストグラム-------------------------------------
  85.     #エラーが出たので山崎先生に教えてもらいました。
  86.     axes = filter_top10_station_df.loc[:, "家賃"].hist(by=filter_top10_station_df.loc[:, "駅"],
  87.                                                      range=(rent_lower, rent_upper), bins=10,
  88.                                                      figsize=(10, 8),
  89.                                                      sharex=True, sharey=True)
  90.     for ax in axes.reshape(-1):
  91.         ax.grid(b=True) # グリッドを表示
  92.         ax.set_xlabel("家賃(万円)") # 横軸のラベル
  93.         ax.set_ylabel("件数") # 縦軸のラベル
  94.     plt.suptitle("おすすめ駅:家賃のヒストグラム(家賃制限内)") # グラフ全体のタイトル
  95.     plt.subplots_adjust(top=0.92, # グラフ位置の微調整
  96.                         hspace=0.3) # グラフ間の微調整
  97.     plt.show()
  98.     # ------------------------------------------------------
  99.     print("おすすめ駅(10駅)物件数", len(filter_top10_station_df))
  100.     station = input('駅名を入力してください')
  101.     # おすすめ駅Top10(filter_top10_station_df)から駅名で更に絞り込みfilter_selected_station_dfに入れる
  102.     mask = (filter_top10_station_df['駅'] == station)
  103.     filter_selected_station_df = filter_top10_station_df[mask]
  104.     print(station + "の合致物件数", len(filter_selected_station_df), "件")
  105.     # 全件表示させるようにする
  106.     pd.set_option('display.max_rows', None)
  107.     pd.set_option('display.max_columns', None)
  108.     # 選択した駅の駅、路線、家賃、名称、合計時間、URLを表示する
  109.     print(filter_selected_station_df[["駅", "路線","家賃", "名称", "合計時間", "URL"]].sort_values("家賃").to_string(index=False))
  110.     print("----------------------------------------------------------------")
  111.     loop_input = input("続けますか? y or n")
  112.     if loop_input == 'n':
  113.         flag = False


使い方動画