駅データ.jp のデータを調べてみた

仕事の都合で路線や駅のデータを調べる必要があり、公開されている ekidata のデータをいろいろ確認したメモです。

# 駅データ\.jp とは
https://ekidata.jp/information.php

>駅データ．ｊｐとは、日本の鉄道駅の情報（駅データ）を配布するサイトです。
>
>当サイトで提供している駅データは、法人・個人及び、商用・非商用を問わず、どなたでもご利用いただくことができます。詳細は「 利用規約 」をご覧ください。
>当サイトの駅データを用いて生じたいかなる損害について弊社は責任を負いません。

という駅や路線の調査などには非常にありがたいサービスです。

# 前準備
駅データから各種データをダウンロードしておく。（会員登録が必要）
https://ekidata.jp/dl/

- 事業者データ
- 路線データ
- 駅データ
- 接続駅データ

各データの仕様はこちら。
https://ekidata.jp/doc/

確認は jupyter notebook で実行しています。この記事は以下の notebook で確認したことを元にしています。
https://github.com/hrkenz/jupyter-notebook/blob/main/ekidata.ipynb

上記の notebook の実行環境は以下です。
- Ubuntu 22.04
- Python 3.10

# 事業者データ
今回使用するのは 20230105 時点の version のデータ。
仕様はこちら。
https://ekidata.jp/doc/company.php

```python
import pandas as pd
```

```python
df_company = pd.read_csv('../files/ekidata/company20230105.csv')
```

```python
df_company.head()
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>company_cd</th>
      <th>rr_cd</th>
      <th>company_name</th>
      <th>company_name_k</th>
      <th>company_name_h</th>
      <th>company_name_r</th>
      <th>company_url</th>
      <th>company_type</th>
      <th>e_status</th>
      <th>e_sort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>11</td>
      <td>JR北海道</td>
      <td>ジェイアールホッカイドウ</td>
      <td>北海道旅客鉄道株式会社</td>
      <td>JR北海道</td>
      <td>http://www.jrhokkaido.co.jp/</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>11</td>
      <td>JR東日本</td>
      <td>ジェイアールヒガシニホン</td>
      <td>東日本旅客鉄道株式会社</td>
      <td>JR東日本</td>
      <td>http://www.jreast.co.jp/</td>
      <td>1</td>
      <td>0</td>
      <td>2</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>11</td>
      <td>JR東海</td>
      <td>ジェイアールトウカイ</td>
      <td>東海旅客鉄道株式会社</td>
      <td>JR東海</td>
      <td>http://jr-central.co.jp/</td>
      <td>1</td>
      <td>0</td>
      <td>3</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>11</td>
      <td>JR西日本</td>
      <td>ジェイアールニシニホン</td>
      <td>西日本旅客鉄道株式会社</td>
      <td>JR西日本</td>
      <td>http://www.westjr.co.jp/</td>
      <td>1</td>
      <td>0</td>
      <td>4</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>11</td>
      <td>JR四国</td>
      <td>ジェイアールシコク</td>
      <td>四国旅客鉄道株式会社</td>
      <td>JR四国</td>
      <td>http://www.jr-shikoku.co.jp/</td>
      <td>1</td>
      <td>0</td>
      <td>5</td>
    </tr>
  </tbody>
</table>
</div>




```python
df_company.shape
```

    (171, 10)

171行あるということは、日本には鉄道事業の会社が171社もあるということになります。
廃止した事業者も含まれるかと思いますが、個人的には想像以上に多い数字です。

## 欠損値の確認

```python
df_company.isna().sum().reset_index()
```


<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>index</th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>company_cd</td>
      <td>0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>rr_cd</td>
      <td>0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>company_name</td>
      <td>0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>company_name_k</td>
      <td>0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>company_name_h</td>
      <td>0</td>
    </tr>
    <tr>
      <th>5</th>
      <td>company_name_r</td>
      <td>0</td>
    </tr>
    <tr>
      <th>6</th>
      <td>company_url</td>
      <td>7</td>
    </tr>
    <tr>
      <th>7</th>
      <td>company_type</td>
      <td>0</td>
    </tr>
    <tr>
      <th>8</th>
      <td>e_status</td>
      <td>0</td>
    </tr>
    <tr>
      <th>9</th>
      <td>e_sort</td>
      <td>0</td>
    </tr>
  </tbody>
</table>
</div>


`compamy_url` が欠損しているものが7行。他のカラムでは欠損は無いようです。


```python
df_company[df_company.company_url.isnull()]
```

<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>company_cd</th>
      <th>rr_cd</th>
      <th>company_name</th>
      <th>company_name_k</th>
      <th>company_name_h</th>
      <th>company_name_r</th>
      <th>company_url</th>
      <th>company_type</th>
      <th>e_status</th>
      <th>e_sort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>24</th>
      <td>103</td>
      <td>99</td>
      <td>北海道ちほく高原鉄道</td>
      <td>ホッカイドウチホクコウゲンテツドウ</td>
      <td>北海道ちほく高原鉄道株式会社</td>
      <td>北海道ちほく高原鉄道</td>
      <td>NaN</td>
      <td>0</td>
      <td>2</td>
      <td>103</td>
    </tr>
    <tr>
      <th>35</th>
      <td>113</td>
      <td>99</td>
      <td>くりはら田園鉄道</td>
      <td>クリハラデンエンテツドウ</td>
      <td>くりはら田園鉄道株式会社</td>
      <td>栗原電鉄</td>
      <td>NaN</td>
      <td>0</td>
      <td>2</td>
      <td>113</td>
    </tr>
    <tr>
      <th>83</th>
      <td>161</td>
      <td>99</td>
      <td>神岡鉄道</td>
      <td>カミオカテツドウ</td>
      <td>神岡鉄道株式会社</td>
      <td>神鉄</td>
      <td>NaN</td>
      <td>0</td>
      <td>2</td>
      <td>161</td>
    </tr>
    <tr>
      <th>105</th>
      <td>180</td>
      <td>99</td>
      <td>桃花台新交通</td>
      <td>トウカダイシンコウツウ</td>
      <td>桃花台新交通株式会社</td>
      <td>桃花台新交通</td>
      <td>NaN</td>
      <td>0</td>
      <td>2</td>
      <td>178</td>
    </tr>
    <tr>
      <th>115</th>
      <td>247</td>
      <td>99</td>
      <td>四日市あすなろう鉄道</td>
      <td>ヨッカイチアスナロウテツドウ</td>
      <td>四日市あすなろう鉄道株式会社</td>
      <td>あすてつ</td>
      <td>NaN</td>
      <td>0</td>
      <td>0</td>
      <td>187</td>
    </tr>
    <tr>
      <th>135</th>
      <td>208</td>
      <td>99</td>
      <td>三木鉄道</td>
      <td>ミキテツドウ</td>
      <td>三木鉄道株式会社</td>
      <td>三木鉄道</td>
      <td>NaN</td>
      <td>0</td>
      <td>2</td>
      <td>206</td>
    </tr>
    <tr>
      <th>147</th>
      <td>220</td>
      <td>99</td>
      <td>スカイレールサービス</td>
      <td>スカイレールサービス</td>
      <td>スカイレールサービス株式会社</td>
      <td>スカイレールサービス</td>
      <td>NaN</td>
      <td>0</td>
      <td>0</td>
      <td>218</td>
    </tr>
  </tbody>
</table>
</div>



`compamy_url` が欠損している行を確認。`e_status` が`2`（廃止）の事業者を除くと以下2つの事業者。
- 四日市あすなろう鉄道株式会社
  - https://yar.co.jp/ だと思うが、単純な漏れかも。
- スカイレールサービス株式会社
  - 探してもそれらしいものは発見できませんでした。存在しないのであれば NaN なのは妥当。
  - wikipedia によると `2023年度末での運行終了` とのことなので、いずれ `e_status` が `2` に更新されると思います。
    - https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AB%E3%82%A4%E3%83%AC%E3%83%BC%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9

## 鉄道コード `rr_cd`


```python
df_company.groupby('rr_cd').size().reset_index()
```


<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>rr_cd</th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>11</td>
      <td>6</td>
    </tr>
    <tr>
      <th>1</th>
      <td>21</td>
      <td>1</td>
    </tr>
    <tr>
      <th>2</th>
      <td>22</td>
      <td>1</td>
    </tr>
    <tr>
      <th>3</th>
      <td>23</td>
      <td>1</td>
    </tr>
    <tr>
      <th>4</th>
      <td>24</td>
      <td>1</td>
    </tr>
    <tr>
      <th>5</th>
      <td>25</td>
      <td>1</td>
    </tr>
    <tr>
      <th>6</th>
      <td>26</td>
      <td>1</td>
    </tr>
    <tr>
      <th>7</th>
      <td>27</td>
      <td>1</td>
    </tr>
    <tr>
      <th>8</th>
      <td>28</td>
      <td>1</td>
    </tr>
    <tr>
      <th>9</th>
      <td>29</td>
      <td>1</td>
    </tr>
    <tr>
      <th>10</th>
      <td>30</td>
      <td>1</td>
    </tr>
    <tr>
      <th>11</th>
      <td>31</td>
      <td>1</td>
    </tr>
    <tr>
      <th>12</th>
      <td>32</td>
      <td>1</td>
    </tr>
    <tr>
      <th>13</th>
      <td>33</td>
      <td>1</td>
    </tr>
    <tr>
      <th>14</th>
      <td>34</td>
      <td>1</td>
    </tr>
    <tr>
      <th>15</th>
      <td>35</td>
      <td>1</td>
    </tr>
    <tr>
      <th>16</th>
      <td>36</td>
      <td>1</td>
    </tr>
    <tr>
      <th>17</th>
      <td>99</td>
      <td>149</td>
    </tr>
  </tbody>
</table>
</div>



`11` と `99` 以外はすべて1行のみ。
`11` も6行のみで、残りすべてが `99` ですが、仕様を見ても鉄道コードについての説明がほぼ無いため、何を表しているのかはよくわかりません。

とりあえず `11` を見てみます。


```python
df_company[df_company.rr_cd == 11]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>company_cd</th>
      <th>rr_cd</th>
      <th>company_name</th>
      <th>company_name_k</th>
      <th>company_name_h</th>
      <th>company_name_r</th>
      <th>company_url</th>
      <th>company_type</th>
      <th>e_status</th>
      <th>e_sort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>11</td>
      <td>JR北海道</td>
      <td>ジェイアールホッカイドウ</td>
      <td>北海道旅客鉄道株式会社</td>
      <td>JR北海道</td>
      <td>http://www.jrhokkaido.co.jp/</td>
      <td>1</td>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>11</td>
      <td>JR東日本</td>
      <td>ジェイアールヒガシニホン</td>
      <td>東日本旅客鉄道株式会社</td>
      <td>JR東日本</td>
      <td>http://www.jreast.co.jp/</td>
      <td>1</td>
      <td>0</td>
      <td>2</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>11</td>
      <td>JR東海</td>
      <td>ジェイアールトウカイ</td>
      <td>東海旅客鉄道株式会社</td>
      <td>JR東海</td>
      <td>http://jr-central.co.jp/</td>
      <td>1</td>
      <td>0</td>
      <td>3</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>11</td>
      <td>JR西日本</td>
      <td>ジェイアールニシニホン</td>
      <td>西日本旅客鉄道株式会社</td>
      <td>JR西日本</td>
      <td>http://www.westjr.co.jp/</td>
      <td>1</td>
      <td>0</td>
      <td>4</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>11</td>
      <td>JR四国</td>
      <td>ジェイアールシコク</td>
      <td>四国旅客鉄道株式会社</td>
      <td>JR四国</td>
      <td>http://www.jr-shikoku.co.jp/</td>
      <td>1</td>
      <td>0</td>
      <td>5</td>
    </tr>
    <tr>
      <th>5</th>
      <td>6</td>
      <td>11</td>
      <td>JR九州</td>
      <td>ジェイアールキュウシュウ</td>
      <td>九州旅客鉄道株式会社</td>
      <td>JR九州</td>
      <td>http://www.jrkyushu.co.jp/</td>
      <td>1</td>
      <td>0</td>
      <td>6</td>
    </tr>
  </tbody>
</table>
</div>



`11` は JR ということがわかりました。
`99` は数が多いので後回しにして、`11` と `99` 以外を見てみます。


```python
df_company[~df_company.rr_cd.isin([11, 99])]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>company_cd</th>
      <th>rr_cd</th>
      <th>company_name</th>
      <th>company_name_k</th>
      <th>company_name_h</th>
      <th>company_name_r</th>
      <th>company_url</th>
      <th>company_type</th>
      <th>e_status</th>
      <th>e_sort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>6</th>
      <td>11</td>
      <td>21</td>
      <td>東武鉄道</td>
      <td>トウブテツドウ</td>
      <td>東武鉄道株式会社</td>
      <td>東武</td>
      <td>http://www.tobu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>11</td>
    </tr>
    <tr>
      <th>7</th>
      <td>12</td>
      <td>22</td>
      <td>西武鉄道</td>
      <td>セイブテツドウ</td>
      <td>西武鉄道株式会社</td>
      <td>西武</td>
      <td>http://www.seibu-group.co.jp/railways/</td>
      <td>2</td>
      <td>0</td>
      <td>12</td>
    </tr>
    <tr>
      <th>8</th>
      <td>13</td>
      <td>23</td>
      <td>京成電鉄</td>
      <td>ケイセイデンテツ</td>
      <td>京成電鉄株式会社</td>
      <td>京成</td>
      <td>http://www.keisei.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>13</td>
    </tr>
    <tr>
      <th>9</th>
      <td>14</td>
      <td>24</td>
      <td>京王電鉄</td>
      <td>ケイオウデンテツ</td>
      <td>京王電鉄株式会社</td>
      <td>京王</td>
      <td>http://www.keio.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>14</td>
    </tr>
    <tr>
      <th>10</th>
      <td>15</td>
      <td>25</td>
      <td>小田急電鉄</td>
      <td>オダキュウデンテツ</td>
      <td>小田急電鉄株式会社</td>
      <td>小田急</td>
      <td>http://www.odakyu.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>15</td>
    </tr>
    <tr>
      <th>11</th>
      <td>16</td>
      <td>26</td>
      <td>東急電鉄</td>
      <td>トウキュウデンテツ</td>
      <td>東京急行電鉄株式会社</td>
      <td>東急</td>
      <td>http://www.tokyu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>16</td>
    </tr>
    <tr>
      <th>12</th>
      <td>17</td>
      <td>27</td>
      <td>京急電鉄</td>
      <td>ケイキュウデンテツ</td>
      <td>京浜急行電鉄株式会社</td>
      <td>京急</td>
      <td>http://www.keikyu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>17</td>
    </tr>
    <tr>
      <th>13</th>
      <td>18</td>
      <td>28</td>
      <td>東京メトロ</td>
      <td>トウキョウメトロ</td>
      <td>東京地下鉄株式会社</td>
      <td>東京メトロ</td>
      <td>http://www.tokyometro.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>18</td>
    </tr>
    <tr>
      <th>14</th>
      <td>19</td>
      <td>29</td>
      <td>相模鉄道</td>
      <td>サガミテツドウ</td>
      <td>相模鉄道株式会社</td>
      <td>相鉄</td>
      <td>http://www.sotetsu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>19</td>
    </tr>
    <tr>
      <th>15</th>
      <td>20</td>
      <td>30</td>
      <td>名古屋鉄道</td>
      <td>ナゴヤテツドウ</td>
      <td>名古屋鉄道株式会社</td>
      <td>名鉄</td>
      <td>http://www.meitetsu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>20</td>
    </tr>
    <tr>
      <th>16</th>
      <td>21</td>
      <td>31</td>
      <td>近畿日本鉄道</td>
      <td>キンキニホンテツドウ</td>
      <td>近畿日本鉄道株式会社</td>
      <td>近鉄</td>
      <td>http://www.kintetsu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>21</td>
    </tr>
    <tr>
      <th>17</th>
      <td>22</td>
      <td>32</td>
      <td>南海電鉄</td>
      <td>ナンカイデンテツ</td>
      <td>南海電気鉄道株式会社</td>
      <td>南海</td>
      <td>http://www.nankai.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>22</td>
    </tr>
    <tr>
      <th>18</th>
      <td>23</td>
      <td>33</td>
      <td>京阪電鉄</td>
      <td>ケイハンデンテツ</td>
      <td>京阪電気鉄道株式会社</td>
      <td>京阪</td>
      <td>http://www.keihan.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>23</td>
    </tr>
    <tr>
      <th>19</th>
      <td>24</td>
      <td>34</td>
      <td>阪急電鉄</td>
      <td>ハンキュウデンテツ</td>
      <td>阪急電鉄株式会社</td>
      <td>阪急</td>
      <td>http://rail.hankyu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>24</td>
    </tr>
    <tr>
      <th>20</th>
      <td>25</td>
      <td>35</td>
      <td>阪神電鉄</td>
      <td>ハンシンデンテツ</td>
      <td>阪神電気鉄道株式会社</td>
      <td>阪神</td>
      <td>http://rail.hanshin.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>25</td>
    </tr>
    <tr>
      <th>21</th>
      <td>26</td>
      <td>36</td>
      <td>西日本鉄道</td>
      <td>ニシニホンテツドウ</td>
      <td>西日本鉄道株式会社</td>
      <td>西鉄</td>
      <td>http://www.nishitetsu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>26</td>
    </tr>
  </tbody>
</table>
</div>



`21`~`36` は大手の私鉄が該当していそうです。
大手というのも曖昧な表現ですが、よく知られている比較的大きな会社が該当すると思われます。
残る`99`は地方の鉄道会社など JR と大手私鉄以外のすべてでしょう。

## 事業者区分 `company_type`

仕様によると `0`:その他　`1`:JR `2`:大手私鉄　`3`:準大手私鉄 という定義。


```python
df_company.groupby('company_type').size().reset_index()
```


<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>company_type</th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>143</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1</td>
      <td>6</td>
    </tr>
    <tr>
      <th>2</th>
      <td>2</td>
      <td>17</td>
    </tr>
    <tr>
      <th>3</th>
      <td>3</td>
      <td>5</td>
    </tr>
  </tbody>
</table>
</div>



JRが `6` というのは `rr_cd` の集計とも一致します。
大手私鉄は `17` なのですが、`rr_cd` の集計では `16` でした。差異が気になるので調べてみます。


```python
df_company[df_company.company_type == 2]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>company_cd</th>
      <th>rr_cd</th>
      <th>company_name</th>
      <th>company_name_k</th>
      <th>company_name_h</th>
      <th>company_name_r</th>
      <th>company_url</th>
      <th>company_type</th>
      <th>e_status</th>
      <th>e_sort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>6</th>
      <td>11</td>
      <td>21</td>
      <td>東武鉄道</td>
      <td>トウブテツドウ</td>
      <td>東武鉄道株式会社</td>
      <td>東武</td>
      <td>http://www.tobu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>11</td>
    </tr>
    <tr>
      <th>7</th>
      <td>12</td>
      <td>22</td>
      <td>西武鉄道</td>
      <td>セイブテツドウ</td>
      <td>西武鉄道株式会社</td>
      <td>西武</td>
      <td>http://www.seibu-group.co.jp/railways/</td>
      <td>2</td>
      <td>0</td>
      <td>12</td>
    </tr>
    <tr>
      <th>8</th>
      <td>13</td>
      <td>23</td>
      <td>京成電鉄</td>
      <td>ケイセイデンテツ</td>
      <td>京成電鉄株式会社</td>
      <td>京成</td>
      <td>http://www.keisei.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>13</td>
    </tr>
    <tr>
      <th>9</th>
      <td>14</td>
      <td>24</td>
      <td>京王電鉄</td>
      <td>ケイオウデンテツ</td>
      <td>京王電鉄株式会社</td>
      <td>京王</td>
      <td>http://www.keio.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>14</td>
    </tr>
    <tr>
      <th>10</th>
      <td>15</td>
      <td>25</td>
      <td>小田急電鉄</td>
      <td>オダキュウデンテツ</td>
      <td>小田急電鉄株式会社</td>
      <td>小田急</td>
      <td>http://www.odakyu.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>15</td>
    </tr>
    <tr>
      <th>11</th>
      <td>16</td>
      <td>26</td>
      <td>東急電鉄</td>
      <td>トウキュウデンテツ</td>
      <td>東京急行電鉄株式会社</td>
      <td>東急</td>
      <td>http://www.tokyu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>16</td>
    </tr>
    <tr>
      <th>12</th>
      <td>17</td>
      <td>27</td>
      <td>京急電鉄</td>
      <td>ケイキュウデンテツ</td>
      <td>京浜急行電鉄株式会社</td>
      <td>京急</td>
      <td>http://www.keikyu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>17</td>
    </tr>
    <tr>
      <th>13</th>
      <td>18</td>
      <td>28</td>
      <td>東京メトロ</td>
      <td>トウキョウメトロ</td>
      <td>東京地下鉄株式会社</td>
      <td>東京メトロ</td>
      <td>http://www.tokyometro.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>18</td>
    </tr>
    <tr>
      <th>14</th>
      <td>19</td>
      <td>29</td>
      <td>相模鉄道</td>
      <td>サガミテツドウ</td>
      <td>相模鉄道株式会社</td>
      <td>相鉄</td>
      <td>http://www.sotetsu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>19</td>
    </tr>
    <tr>
      <th>15</th>
      <td>20</td>
      <td>30</td>
      <td>名古屋鉄道</td>
      <td>ナゴヤテツドウ</td>
      <td>名古屋鉄道株式会社</td>
      <td>名鉄</td>
      <td>http://www.meitetsu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>20</td>
    </tr>
    <tr>
      <th>16</th>
      <td>21</td>
      <td>31</td>
      <td>近畿日本鉄道</td>
      <td>キンキニホンテツドウ</td>
      <td>近畿日本鉄道株式会社</td>
      <td>近鉄</td>
      <td>http://www.kintetsu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>21</td>
    </tr>
    <tr>
      <th>17</th>
      <td>22</td>
      <td>32</td>
      <td>南海電鉄</td>
      <td>ナンカイデンテツ</td>
      <td>南海電気鉄道株式会社</td>
      <td>南海</td>
      <td>http://www.nankai.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>22</td>
    </tr>
    <tr>
      <th>18</th>
      <td>23</td>
      <td>33</td>
      <td>京阪電鉄</td>
      <td>ケイハンデンテツ</td>
      <td>京阪電気鉄道株式会社</td>
      <td>京阪</td>
      <td>http://www.keihan.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>23</td>
    </tr>
    <tr>
      <th>19</th>
      <td>24</td>
      <td>34</td>
      <td>阪急電鉄</td>
      <td>ハンキュウデンテツ</td>
      <td>阪急電鉄株式会社</td>
      <td>阪急</td>
      <td>http://rail.hankyu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>24</td>
    </tr>
    <tr>
      <th>20</th>
      <td>25</td>
      <td>35</td>
      <td>阪神電鉄</td>
      <td>ハンシンデンテツ</td>
      <td>阪神電気鉄道株式会社</td>
      <td>阪神</td>
      <td>http://rail.hanshin.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>25</td>
    </tr>
    <tr>
      <th>21</th>
      <td>26</td>
      <td>36</td>
      <td>西日本鉄道</td>
      <td>ニシニホンテツドウ</td>
      <td>西日本鉄道株式会社</td>
      <td>西鉄</td>
      <td>http://www.nishitetsu.co.jp/</td>
      <td>2</td>
      <td>0</td>
      <td>26</td>
    </tr>
    <tr>
      <th>126</th>
      <td>249</td>
      <td>99</td>
      <td>Osaka Metro</td>
      <td>オオサカメトロ</td>
      <td>大阪市高速電気軌道株式会社</td>
      <td>大阪メトロ</td>
      <td>http://www.osakametro.co.jp</td>
      <td>2</td>
      <td>0</td>
      <td>197</td>
    </tr>
  </tbody>
</table>
</div>



先程の16件の事業者に加えて `Osaka Metro` が大手私鉄と判定されているようです。
`rr_cd` は定義がわからず、内容から `11` `99` 以外は大手私鉄と予想したのですが、これでさらに定義の謎が深まってしまいました。。

## 状態 `e_status`
仕様によると `0`:運用中　`1`:運用前　`2`:廃止 という定義。


```python
df_company.groupby('e_status').size().reset_index()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>e_status</th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>163</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>8</td>
    </tr>
  </tbody>
</table>
</div>



`20230105` 時点の version では `1`:運用前 という事業者は存在していないようです。

`2`:廃止 の事業者を見てみます。


```python
df_company[df_company.e_status == 2]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>company_cd</th>
      <th>rr_cd</th>
      <th>company_name</th>
      <th>company_name_k</th>
      <th>company_name_h</th>
      <th>company_name_r</th>
      <th>company_url</th>
      <th>company_type</th>
      <th>e_status</th>
      <th>e_sort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>24</th>
      <td>103</td>
      <td>99</td>
      <td>北海道ちほく高原鉄道</td>
      <td>ホッカイドウチホクコウゲンテツドウ</td>
      <td>北海道ちほく高原鉄道株式会社</td>
      <td>北海道ちほく高原鉄道</td>
      <td>NaN</td>
      <td>0</td>
      <td>2</td>
      <td>103</td>
    </tr>
    <tr>
      <th>28</th>
      <td>106</td>
      <td>99</td>
      <td>十和田観光電鉄</td>
      <td>トワダカンコウデンデツ</td>
      <td>十和田観光電鉄株式会社</td>
      <td>十和田観光電鉄</td>
      <td>http://www.toutetsu.co.jp/</td>
      <td>0</td>
      <td>2</td>
      <td>106</td>
    </tr>
    <tr>
      <th>35</th>
      <td>113</td>
      <td>99</td>
      <td>くりはら田園鉄道</td>
      <td>クリハラデンエンテツドウ</td>
      <td>くりはら田園鉄道株式会社</td>
      <td>栗原電鉄</td>
      <td>NaN</td>
      <td>0</td>
      <td>2</td>
      <td>113</td>
    </tr>
    <tr>
      <th>57</th>
      <td>135</td>
      <td>99</td>
      <td>鹿島鉄道</td>
      <td>カシマテツドウ</td>
      <td>鹿島鉄道株式会社</td>
      <td>鹿鉄</td>
      <td>http://www.kantetsu.co.jp/katetsu/</td>
      <td>0</td>
      <td>2</td>
      <td>135</td>
    </tr>
    <tr>
      <th>83</th>
      <td>161</td>
      <td>99</td>
      <td>神岡鉄道</td>
      <td>カミオカテツドウ</td>
      <td>神岡鉄道株式会社</td>
      <td>神鉄</td>
      <td>NaN</td>
      <td>0</td>
      <td>2</td>
      <td>161</td>
    </tr>
    <tr>
      <th>105</th>
      <td>180</td>
      <td>99</td>
      <td>桃花台新交通</td>
      <td>トウカダイシンコウツウ</td>
      <td>桃花台新交通株式会社</td>
      <td>桃花台新交通</td>
      <td>NaN</td>
      <td>0</td>
      <td>2</td>
      <td>178</td>
    </tr>
    <tr>
      <th>132</th>
      <td>205</td>
      <td>99</td>
      <td>北神急行電鉄</td>
      <td>ホクシンキュウコウデンテツ</td>
      <td>北神急行電鉄株式会社</td>
      <td>北神急行</td>
      <td>http://www.hokushinkyuko.co.jp/</td>
      <td>0</td>
      <td>2</td>
      <td>203</td>
    </tr>
    <tr>
      <th>135</th>
      <td>208</td>
      <td>99</td>
      <td>三木鉄道</td>
      <td>ミキテツドウ</td>
      <td>三木鉄道株式会社</td>
      <td>三木鉄道</td>
      <td>NaN</td>
      <td>0</td>
      <td>2</td>
      <td>206</td>
    </tr>
  </tbody>
</table>
</div>

どの事業者も私は知らないのですが、かつては多くの人を乗せて運行する路線を運営していたことでしょう。

# 路線データ
今回使用するのは 20230320 時点の version のデータ。 
仕様はこちら。 
https://ekidata.jp/doc/line.php


```python
df_line = pd.read_csv('../files/ekidata/line20230320free.csv')
```


```python
df_line.head()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>line_cd</th>
      <th>company_cd</th>
      <th>line_name</th>
      <th>line_name_k</th>
      <th>line_name_h</th>
      <th>line_color_c</th>
      <th>line_color_t</th>
      <th>line_type</th>
      <th>lon</th>
      <th>lat</th>
      <th>zoom</th>
      <th>e_status</th>
      <th>e_sort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1001</td>
      <td>3</td>
      <td>中央新幹線</td>
      <td>チュウオウシンカンセン</td>
      <td>中央新幹線</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>137.493896</td>
      <td>35.411438</td>
      <td>8</td>
      <td>1</td>
      <td>1001</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1002</td>
      <td>3</td>
      <td>東海道新幹線</td>
      <td>トウカイドウシンカンセン</td>
      <td>東海道新幹線</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>137.721489</td>
      <td>35.144122</td>
      <td>7</td>
      <td>0</td>
      <td>1002</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1003</td>
      <td>4</td>
      <td>山陽新幹線</td>
      <td>サンヨウシンカンセン</td>
      <td>山陽新幹線</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>133.147896</td>
      <td>34.419338</td>
      <td>7</td>
      <td>0</td>
      <td>1003</td>
    </tr>
    <tr>
      <th>3</th>
      <td>1004</td>
      <td>2</td>
      <td>東北新幹線</td>
      <td>トウホクシンカンセン</td>
      <td>東北新幹線</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>140.763192</td>
      <td>38.274267</td>
      <td>7</td>
      <td>0</td>
      <td>1004</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1005</td>
      <td>2</td>
      <td>上越新幹線</td>
      <td>ジョウエツシンカンセン</td>
      <td>上越新幹線</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>139.121488</td>
      <td>36.798565</td>
      <td>8</td>
      <td>0</td>
      <td>1005</td>
    </tr>
  </tbody>
</table>
</div>




```python
df_line.shape
```




    (620, 13)



行数は 620。日本には多くの路線が走っていることがわかります。

## 欠損値の確認


```python
df_line.isna().sum().reset_index()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>index</th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>line_cd</td>
      <td>0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>company_cd</td>
      <td>0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>line_name</td>
      <td>0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>line_name_k</td>
      <td>0</td>
    </tr>
    <tr>
      <th>4</th>
      <td>line_name_h</td>
      <td>0</td>
    </tr>
    <tr>
      <th>5</th>
      <td>line_color_c</td>
      <td>572</td>
    </tr>
    <tr>
      <th>6</th>
      <td>line_color_t</td>
      <td>572</td>
    </tr>
    <tr>
      <th>7</th>
      <td>line_type</td>
      <td>620</td>
    </tr>
    <tr>
      <th>8</th>
      <td>lon</td>
      <td>0</td>
    </tr>
    <tr>
      <th>9</th>
      <td>lat</td>
      <td>0</td>
    </tr>
    <tr>
      <th>10</th>
      <td>zoom</td>
      <td>0</td>
    </tr>
    <tr>
      <th>11</th>
      <td>e_status</td>
      <td>0</td>
    </tr>
    <tr>
      <th>12</th>
      <td>e_sort</td>
      <td>0</td>
    </tr>
  </tbody>
</table>
</div>



`line_color_c` `line_color_t` `line_type` は有料会員のみのデータになるらしく、今回使用する無料版データでは欠損しています。
他に欠損はありません。

## 事業者コード `company_cd`
先に確認した事業者データがマスターになります。
確認しやすくするために事業者データと結合し `company_name` を付加、ついでに欠損値となっているカラムを削除します。


```python
df_line2 = df_line.drop(['line_color_c', 'line_color_t', 'line_type'], axis=1) \
    .merge(df_company[['company_cd', 'company_name']], how='inner')
```


```python
df_line2.head()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>line_cd</th>
      <th>company_cd</th>
      <th>line_name</th>
      <th>line_name_k</th>
      <th>line_name_h</th>
      <th>lon</th>
      <th>lat</th>
      <th>zoom</th>
      <th>e_status</th>
      <th>e_sort</th>
      <th>company_name</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1001</td>
      <td>3</td>
      <td>中央新幹線</td>
      <td>チュウオウシンカンセン</td>
      <td>中央新幹線</td>
      <td>137.493896</td>
      <td>35.411438</td>
      <td>8</td>
      <td>1</td>
      <td>1001</td>
      <td>JR東海</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1002</td>
      <td>3</td>
      <td>東海道新幹線</td>
      <td>トウカイドウシンカンセン</td>
      <td>東海道新幹線</td>
      <td>137.721489</td>
      <td>35.144122</td>
      <td>7</td>
      <td>0</td>
      <td>1002</td>
      <td>JR東海</td>
    </tr>
    <tr>
      <th>2</th>
      <td>11402</td>
      <td>3</td>
      <td>JR身延線</td>
      <td>ミノブセン</td>
      <td>JR身延線</td>
      <td>138.532397</td>
      <td>35.392163</td>
      <td>10</td>
      <td>0</td>
      <td>11402</td>
      <td>JR東海</td>
    </tr>
    <tr>
      <th>3</th>
      <td>11411</td>
      <td>3</td>
      <td>JR中央本線(名古屋～塩尻)</td>
      <td>チュウオウホンセン</td>
      <td>JR中央本線(名古屋～塩尻)</td>
      <td>137.468492</td>
      <td>35.662471</td>
      <td>9</td>
      <td>0</td>
      <td>11411</td>
      <td>JR東海</td>
    </tr>
    <tr>
      <th>4</th>
      <td>11413</td>
      <td>3</td>
      <td>JR飯田線(豊橋～天竜峡)</td>
      <td>イイダセン</td>
      <td>JR飯田線(豊橋～天竜峡)</td>
      <td>137.668949</td>
      <td>35.125648</td>
      <td>10</td>
      <td>0</td>
      <td>11413</td>
      <td>JR東海</td>
    </tr>
  </tbody>
</table>
</div>




```python
df_line2.shape
```




    (620, 11)



事業者ごとに所属する路線数を算出してみます。


```python
df_line2.groupby(['company_cd', 'company_name']) \
    .size() \
    .nlargest(20) \
    .reset_index(name='count')
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>company_cd</th>
      <th>company_name</th>
      <th>count</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>2</td>
      <td>JR東日本</td>
      <td>88</td>
    </tr>
    <tr>
      <th>1</th>
      <td>4</td>
      <td>JR西日本</td>
      <td>67</td>
    </tr>
    <tr>
      <th>2</th>
      <td>6</td>
      <td>JR九州</td>
      <td>30</td>
    </tr>
    <tr>
      <th>3</th>
      <td>21</td>
      <td>近畿日本鉄道</td>
      <td>25</td>
    </tr>
    <tr>
      <th>4</th>
      <td>20</td>
      <td>名古屋鉄道</td>
      <td>21</td>
    </tr>
    <tr>
      <th>5</th>
      <td>1</td>
      <td>JR北海道</td>
      <td>20</td>
    </tr>
    <tr>
      <th>6</th>
      <td>3</td>
      <td>JR東海</td>
      <td>17</td>
    </tr>
    <tr>
      <th>7</th>
      <td>11</td>
      <td>東武鉄道</td>
      <td>12</td>
    </tr>
    <tr>
      <th>8</th>
      <td>12</td>
      <td>西武鉄道</td>
      <td>12</td>
    </tr>
    <tr>
      <th>9</th>
      <td>16</td>
      <td>東急電鉄</td>
      <td>9</td>
    </tr>
    <tr>
      <th>10</th>
      <td>18</td>
      <td>東京メトロ</td>
      <td>9</td>
    </tr>
    <tr>
      <th>11</th>
      <td>22</td>
      <td>南海電鉄</td>
      <td>9</td>
    </tr>
    <tr>
      <th>12</th>
      <td>24</td>
      <td>阪急電鉄</td>
      <td>9</td>
    </tr>
    <tr>
      <th>13</th>
      <td>249</td>
      <td>Osaka Metro</td>
      <td>9</td>
    </tr>
    <tr>
      <th>14</th>
      <td>5</td>
      <td>JR四国</td>
      <td>8</td>
    </tr>
    <tr>
      <th>15</th>
      <td>23</td>
      <td>京阪電鉄</td>
      <td>8</td>
    </tr>
    <tr>
      <th>16</th>
      <td>222</td>
      <td>広島電鉄</td>
      <td>8</td>
    </tr>
    <tr>
      <th>17</th>
      <td>226</td>
      <td>伊予鉄道</td>
      <td>8</td>
    </tr>
    <tr>
      <th>18</th>
      <td>14</td>
      <td>京王電鉄</td>
      <td>7</td>
    </tr>
    <tr>
      <th>19</th>
      <td>13</td>
      <td>京成電鉄</td>
      <td>6</td>
    </tr>
  </tbody>
</table>
</div>



JRと大手私鉄が並びます。当然の結果。

## 状態 `e_status`
仕様によると事業者と同様に `0`:運用中　`1`:運用前　`2`:廃止 という定義。


```python
df_line2.groupby('e_status').size().reset_index()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>e_status</th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>600</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1</td>
      <td>1</td>
    </tr>
    <tr>
      <th>2</th>
      <td>2</td>
      <td>19</td>
    </tr>
  </tbody>
</table>
</div>



`1`:運用前 の路線があるので確認してみる。


```python
df_line2[df_line2.e_status == 1]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>line_cd</th>
      <th>company_cd</th>
      <th>line_name</th>
      <th>line_name_k</th>
      <th>line_name_h</th>
      <th>lon</th>
      <th>lat</th>
      <th>zoom</th>
      <th>e_status</th>
      <th>e_sort</th>
      <th>company_name</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1001</td>
      <td>3</td>
      <td>中央新幹線</td>
      <td>チュウオウシンカンセン</td>
      <td>中央新幹線</td>
      <td>137.493896</td>
      <td>35.411438</td>
      <td>8</td>
      <td>1</td>
      <td>1001</td>
      <td>JR東海</td>
    </tr>
  </tbody>
</table>
</div>



`中央新幹線` という聞いたことがありそうな名前の路線は、存在しているが運用前のステータス。

詳細が不明なので wikipedia を読む。
https://ja.wikipedia.org/wiki/%E4%B8%AD%E5%A4%AE%E6%96%B0%E5%B9%B9%E7%B7%9A

なんとリニアモーターカーの路線！開業は2027年予定。

## 緯度・経度 `lat` `lon`
仕様によると、路線表示時の中央緯度と経度とのこと。路線表示 とはおそらく地図上に描画したときのことを指すと思われます。

`folium` を使って先程の `中央新幹線` の緯度・経度をプロットしてみます。


```python
import folium
```


```python
location = df_line2[df_line2.line_cd == 1001][['lat', 'lon']].values # array
zoom = (df_line2[df_line2.line_cd == 1001]['zoom'].values)[0].item() # int

map = folium.Map(location=location,zoom_start=zoom)
folium.Marker(location=location).add_to(map)
map
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36057/1ba59034-8635-905d-20bd-7cacb6ba95dc.png)

なるほど？
これは路線の経路を同時にプロットしてみないとよくわからない。



# 駅データ
今回使用するのは 20230320 時点の version のデータ。
仕様はこちら。 
https://ekidata.jp/doc/station.php


```python
df_station = pd.read_csv('../files/ekidata/station20230320free.csv')
```


```python
df_station.head()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>station_cd</th>
      <th>station_g_cd</th>
      <th>station_name</th>
      <th>station_name_k</th>
      <th>station_name_r</th>
      <th>line_cd</th>
      <th>pref_cd</th>
      <th>post</th>
      <th>address</th>
      <th>lon</th>
      <th>lat</th>
      <th>open_ymd</th>
      <th>close_ymd</th>
      <th>e_status</th>
      <th>e_sort</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1110101</td>
      <td>1110101</td>
      <td>函館</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>11101</td>
      <td>1</td>
      <td>040-0063</td>
      <td>北海道函館市若松町１２-１３</td>
      <td>140.726413</td>
      <td>41.773709</td>
      <td>1902-12-10</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1110101</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1110102</td>
      <td>1110102</td>
      <td>五稜郭</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>11101</td>
      <td>1</td>
      <td>041-0813</td>
      <td>函館市亀田本町</td>
      <td>140.733539</td>
      <td>41.803557</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1110102</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1110103</td>
      <td>1110103</td>
      <td>桔梗</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>11101</td>
      <td>1</td>
      <td>041-0801</td>
      <td>北海道函館市桔梗３丁目４１-３６</td>
      <td>140.722952</td>
      <td>41.846457</td>
      <td>1902-12-10</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1110103</td>
    </tr>
    <tr>
      <th>3</th>
      <td>1110104</td>
      <td>1110104</td>
      <td>大中山</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>11101</td>
      <td>1</td>
      <td>041-1121</td>
      <td>亀田郡七飯町大字大中山</td>
      <td>140.713580</td>
      <td>41.864641</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1110104</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1110105</td>
      <td>1110105</td>
      <td>七飯</td>
      <td>NaN</td>
      <td>NaN</td>
      <td>11101</td>
      <td>1</td>
      <td>041-1111</td>
      <td>亀田郡七飯町字本町</td>
      <td>140.688556</td>
      <td>41.886971</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1110105</td>
    </tr>
  </tbody>
</table>
</div>




```python
df_station.shape
```




    (10896, 15)



駅の数は1万以上。新宿や東京などの巨大なターミナルから、あまり利用のない無人駅など、ピンキリでたくさんの駅があるのでしょう。

## 欠損値の確認


```python
df_station.isna().sum().reset_index()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>index</th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>station_cd</td>
      <td>0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>station_g_cd</td>
      <td>0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>station_name</td>
      <td>0</td>
    </tr>
    <tr>
      <th>3</th>
      <td>station_name_k</td>
      <td>10896</td>
    </tr>
    <tr>
      <th>4</th>
      <td>station_name_r</td>
      <td>10896</td>
    </tr>
    <tr>
      <th>5</th>
      <td>line_cd</td>
      <td>0</td>
    </tr>
    <tr>
      <th>6</th>
      <td>pref_cd</td>
      <td>0</td>
    </tr>
    <tr>
      <th>7</th>
      <td>post</td>
      <td>0</td>
    </tr>
    <tr>
      <th>8</th>
      <td>address</td>
      <td>0</td>
    </tr>
    <tr>
      <th>9</th>
      <td>lon</td>
      <td>0</td>
    </tr>
    <tr>
      <th>10</th>
      <td>lat</td>
      <td>0</td>
    </tr>
    <tr>
      <th>11</th>
      <td>open_ymd</td>
      <td>0</td>
    </tr>
    <tr>
      <th>12</th>
      <td>close_ymd</td>
      <td>0</td>
    </tr>
    <tr>
      <th>13</th>
      <td>e_status</td>
      <td>0</td>
    </tr>
    <tr>
      <th>14</th>
      <td>e_sort</td>
      <td>0</td>
    </tr>
  </tbody>
</table>
</div>



`station_name_k` `station_name_r` は有料会員のみのデータのため、今回使用する無料版データでは欠損しています。
この後の確認をしやすいように欠損値のカラムを削除し、路線のデータと結合し、路線名を追加します。


```python
df_station = df_station.drop(['station_name_k', 'station_name_r'], axis=1) \
    .merge(df_line[['line_cd', 'line_name', 'company_name']], how='inner')
```

## 駅グループコード `station_g_cd`
仕様を見ても 整数6・7桁 という情報以外はなく、詳細はわかりません。
名前からして、複数の駅をある法則に基づいてグルーピングしていると思われます。

同じ `station_g_cd` に所属する駅が多い順に並べてみます。


```python
df_station.groupby('station_g_cd') \
    .size() \
    .nlargest(5) \
    .reset_index(name='count')
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>station_g_cd</th>
      <th>count</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1130208</td>
      <td>14</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1160214</td>
      <td>13</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1130101</td>
      <td>11</td>
    </tr>
    <tr>
      <th>3</th>
      <td>1130105</td>
      <td>11</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1130205</td>
      <td>11</td>
    </tr>
  </tbody>
</table>
</div>



最も所属する駅が多い `station_g_cd` が `1130208` であるデータを確認します。


```python
df_station[df_station.station_g_cd == 1130208]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>station_cd</th>
      <th>station_g_cd</th>
      <th>station_name</th>
      <th>line_cd</th>
      <th>pref_cd</th>
      <th>post</th>
      <th>address</th>
      <th>lon</th>
      <th>lat</th>
      <th>open_ymd</th>
      <th>close_ymd</th>
      <th>e_status</th>
      <th>e_sort</th>
      <th>line_name</th>
      <th>company_name</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>1293</th>
      <td>1130208</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>11302</td>
      <td>13</td>
      <td>160-0022</td>
      <td>東京都新宿区新宿三丁目38-1</td>
      <td>139.700464</td>
      <td>35.689729</td>
      <td>1885-03-01</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1130208</td>
      <td>JR山手線</td>
      <td>JR東日本</td>
    </tr>
    <tr>
      <th>1456</th>
      <td>1131103</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>11311</td>
      <td>13</td>
      <td>160-0022</td>
      <td>東京都新宿区新宿三丁目38-1</td>
      <td>139.700464</td>
      <td>35.689729</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1131103</td>
      <td>JR中央本線(東京～塩尻)</td>
      <td>JR東日本</td>
    </tr>
    <tr>
      <th>1511</th>
      <td>1131211</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>11312</td>
      <td>13</td>
      <td>160-0022</td>
      <td>東京都新宿区新宿三丁目38-1</td>
      <td>139.700464</td>
      <td>35.689729</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1131211</td>
      <td>JR中央線(快速)</td>
      <td>JR東日本</td>
    </tr>
    <tr>
      <th>1540</th>
      <td>1131310</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>11313</td>
      <td>13</td>
      <td>160-0022</td>
      <td>東京都新宿区新宿三丁目38-1</td>
      <td>139.700464</td>
      <td>35.689729</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1131310</td>
      <td>JR中央・総武線</td>
      <td>JR東日本</td>
    </tr>
    <tr>
      <th>1783</th>
      <td>1132104</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>11321</td>
      <td>13</td>
      <td>160-0022</td>
      <td>東京都新宿区新宿三丁目38-1</td>
      <td>139.700464</td>
      <td>35.689729</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1132104</td>
      <td>JR埼京線</td>
      <td>JR東日本</td>
    </tr>
    <tr>
      <th>1950</th>
      <td>1132806</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>11328</td>
      <td>13</td>
      <td>160-0022</td>
      <td>東京都新宿区新宿三丁目38-1</td>
      <td>139.700464</td>
      <td>35.689729</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1132806</td>
      <td>JR成田エクスプレス</td>
      <td>JR東日本</td>
    </tr>
    <tr>
      <th>2032</th>
      <td>1133304</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>11333</td>
      <td>13</td>
      <td>160-0022</td>
      <td>東京都新宿区新宿三丁目38-1</td>
      <td>139.700464</td>
      <td>35.689729</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>1133304</td>
      <td>JR湘南新宿ライン</td>
      <td>JR東日本</td>
    </tr>
    <tr>
      <th>5485</th>
      <td>2400101</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>24001</td>
      <td>13</td>
      <td>160-0023</td>
      <td>東京都新宿区西新宿一丁目1-4</td>
      <td>139.699187</td>
      <td>35.690163</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>2400101</td>
      <td>京王線</td>
      <td>京王電鉄</td>
    </tr>
    <tr>
      <th>5557</th>
      <td>2400701</td>
      <td>1130208</td>
      <td>新線新宿</td>
      <td>24007</td>
      <td>13</td>
      <td>160-0023</td>
      <td>東京都新宿区西新宿一丁目18</td>
      <td>139.698812</td>
      <td>35.688690</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>2400701</td>
      <td>京王新線</td>
      <td>京王電鉄</td>
    </tr>
    <tr>
      <th>5561</th>
      <td>2500101</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>25001</td>
      <td>13</td>
      <td>160-0023</td>
      <td>東京都新宿区西新宿一丁目1-3</td>
      <td>139.699574</td>
      <td>35.691435</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>2500101</td>
      <td>小田急線</td>
      <td>小田急電鉄</td>
    </tr>
    <tr>
      <th>5863</th>
      <td>2800218</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>28002</td>
      <td>13</td>
      <td>160-0023</td>
      <td>東京都新宿区西新宿一丁目西口地下街1号</td>
      <td>139.700711</td>
      <td>35.692350</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>2800218</td>
      <td>東京メトロ丸ノ内線</td>
      <td>東京メトロ</td>
    </tr>
    <tr>
      <th>6038</th>
      <td>2900303</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>29003</td>
      <td>13</td>
      <td>160-0022</td>
      <td>東京都新宿区新宿三丁目38-1</td>
      <td>139.700464</td>
      <td>35.689729</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>2900301</td>
      <td>相鉄・JR直通線</td>
      <td>相模鉄道</td>
    </tr>
    <tr>
      <th>7649</th>
      <td>9930128</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>99301</td>
      <td>13</td>
      <td>151-0053</td>
      <td>東京都渋谷区代々木二丁目1-1</td>
      <td>139.698812</td>
      <td>35.688690</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>9930128</td>
      <td>都営大江戸線</td>
      <td>東京都交通局</td>
    </tr>
    <tr>
      <th>7707</th>
      <td>9930401</td>
      <td>1130208</td>
      <td>新宿</td>
      <td>99304</td>
      <td>13</td>
      <td>160-0023</td>
      <td>東京都新宿区西新宿一丁目18</td>
      <td>139.698812</td>
      <td>35.688690</td>
      <td>0000-00-00</td>
      <td>0000-00-00</td>
      <td>0</td>
      <td>9930401</td>
      <td>都営新宿線</td>
      <td>東京都交通局</td>
    </tr>
  </tbody>
</table>
</div>



`station_g_cd` が `1130208` であるデータはあらゆる路線の新宿駅をグルーピングしたものでした。
おそらくは1つの駅、あるいは駅同士がくっついているとか距離が近いとかで路線間の乗り換え可能な駅の集合体のように見えます。

## 状態 `e_status`
仕様によると事業者と同様に `0`:運用中　`1`:運用前　`2`:廃止 という定義。


```python
df_station.groupby('e_status').size().reset_index()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>e_status</th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>10471</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>425</td>
    </tr>
  </tbody>
</table>
</div>



運用前のデータは存在しません。
すでに廃止された駅が 425 もあります。

# 接続駅データ
今回使用するのは 20230320 時点の version のデータ。 
仕様はこちら。
https://ekidata.jp/doc/join.php

接続駅というのは、定義を見る限り、路線ごとの隣り合った駅のことを指すようです。


```python
df_join = pd.read_csv('../files/ekidata/join20230320.csv')
```


```python
df_join.head()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>line_cd</th>
      <th>station_cd1</th>
      <th>station_cd2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1002</td>
      <td>100201</td>
      <td>100202</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1002</td>
      <td>100202</td>
      <td>100203</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1002</td>
      <td>100203</td>
      <td>100204</td>
    </tr>
    <tr>
      <th>3</th>
      <td>1002</td>
      <td>100204</td>
      <td>100205</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1002</td>
      <td>100205</td>
      <td>100206</td>
    </tr>
  </tbody>
</table>
</div>



## 欠損値の確認


```python
df_join.isna().sum().reset_index()
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>index</th>
      <th>0</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>line_cd</td>
      <td>0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>station_cd1</td>
      <td>0</td>
    </tr>
    <tr>
      <th>2</th>
      <td>station_cd2</td>
      <td>0</td>
    </tr>
  </tbody>
</table>
</div>


このデータの特性上、さすがに欠損値はありません。


```python
df_join[df_join.line_cd == 1002]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>line_cd</th>
      <th>station_cd1</th>
      <th>station_cd2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1002</td>
      <td>100201</td>
      <td>100202</td>
    </tr>
    <tr>
      <th>1</th>
      <td>1002</td>
      <td>100202</td>
      <td>100203</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1002</td>
      <td>100203</td>
      <td>100204</td>
    </tr>
    <tr>
      <th>3</th>
      <td>1002</td>
      <td>100204</td>
      <td>100205</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1002</td>
      <td>100205</td>
      <td>100206</td>
    </tr>
    <tr>
      <th>5</th>
      <td>1002</td>
      <td>100206</td>
      <td>100207</td>
    </tr>
    <tr>
      <th>6</th>
      <td>1002</td>
      <td>100207</td>
      <td>100208</td>
    </tr>
    <tr>
      <th>7</th>
      <td>1002</td>
      <td>100208</td>
      <td>100209</td>
    </tr>
    <tr>
      <th>8</th>
      <td>1002</td>
      <td>100209</td>
      <td>100210</td>
    </tr>
    <tr>
      <th>9</th>
      <td>1002</td>
      <td>100210</td>
      <td>100211</td>
    </tr>
    <tr>
      <th>10</th>
      <td>1002</td>
      <td>100211</td>
      <td>100212</td>
    </tr>
    <tr>
      <th>11</th>
      <td>1002</td>
      <td>100212</td>
      <td>100213</td>
    </tr>
    <tr>
      <th>12</th>
      <td>1002</td>
      <td>100213</td>
      <td>100214</td>
    </tr>
    <tr>
      <th>13</th>
      <td>1002</td>
      <td>100214</td>
      <td>100215</td>
    </tr>
    <tr>
      <th>14</th>
      <td>1002</td>
      <td>100215</td>
      <td>100216</td>
    </tr>
    <tr>
      <th>15</th>
      <td>1002</td>
      <td>100216</td>
      <td>100217</td>
    </tr>
  </tbody>
</table>
</div>



試しに東海道新幹線（`line_cd` = `1002`）を確認してみると上記の通り。
駅のデータと結合し、駅ごとの `lat` `lon` を使って路線図を描画することもできるかもしれません。