課題
観光庁の「宿泊旅行統計調査」のExcel資料「2024年(令和6年)1月〜12月(年の確定値)集計結果」の「第1表(1月)」を機械判読可能なデータ型CSVに加工する。
Webサイト:観光庁の「宿泊旅行統計調査」ページ
https://www.mlit.go.jp/kankocho/tokei_hakusyo/shukuhakutokei.html
Excel:2024年(令和6年)1月〜12月(年の確定値)集計結果
https://www.mlit.go.jp/kankocho/content/001905499.xlsx
「第1表(1月)」を表示する。

加工ポイント
- ヘッダーが3行あり、階層に別れている。
- 表の上と下にデータとして不要な行がある。
- 1行目〜3行目は不要
- 66行目以降は不要
データ考察
ヘッダー

それぞれの旅行の種類に対して、似たようなヘッダー構成になっている。
- 1行目〜3行目は説明なので削除する。
- 4行目〜6行目は、階層に別れていて、ヘッダーになる。
- 4行目は「大分類」を表す。
- 従業者数別宿泊目的割合別
- 宿泊施設タイプ別
- 5行目が「従業員数別」を記している。
- 従業員数の区分:0〜9人、10~29人、30~99人、100人以上
- B列〜D列は、従業員数別の合計を記載している。
- 6行目は「宿泊目的割合」を記している。
- 宿泊目的割合:観光目的の宿泊者が50%以上、観光目的の宿泊者が50%未満
- E列、H列、K列、N列は、それぞれの従業員数の「総数」となる。
- 「宿泊目的割合不詳」を含んでいるため、「50%以上」と「50%未満」の合計と一致しない。
- 4行目は「大分類」を表す。
- 7行目以降は、各項目の人数が記載されているデータ行になっている。
データ加工の考え方
データ加工が必要な表の上部をBODIKエディタで表示してみる。



余分な行・列
- 最初の3行は削除する。
- 最後の行(65行以降)は削除する。
- 削除するべき余分な列はない。
ヘッダー
- 上から4行目の「大分類」は、すべてのセルに値が記載されている。
- ただし、2列目が「総数 1), 2)」となっており、「 1), 2)」が余分。
- 上から5行目の「従業員数」は、それぞれの区分に従業員数指定が記載されている。
- ただし、最初の3列に「総数」の表記が抜けている。
- 上から6行目の「観光目的の宿泊者数割合」は、割合指定が記載されている。
- ただし、最初のセルが「1)」となっている。ここは「総数」したい。
ゴール(作成するCSV)
元データを加工して次のようなCSVを作成する。

項目ヘッダー
施設所在地(47区分及び運輸局等)
総数
従業者数(4区分)、宿泊目的割合(2区分)観光目的の宿泊者が50%以上
従業者数(4区分)、宿泊目的割合(2区分)観光目的の宿泊者が50%未満
従業者数(4区分)、宿泊目的割合(2区分)0~9人総数
従業者数(4区分)、宿泊目的割合(2区分)0~9人観光目的の宿泊者が50%以上
従業者数(4区分)、宿泊目的割合(2区分)0~9人観光目的の宿泊者が50%未満
従業者数(4区分)、宿泊目的割合(2区分)10~29人総数
従業者数(4区分)、宿泊目的割合(2区分)10~29人観光目的の宿泊者が50%以上
従業者数(4区分)、宿泊目的割合(2区分)10~29人観光目的の宿泊者が50%未満
従業者数(4区分)、宿泊目的割合(2区分)30~99人総数
従業者数(4区分)、宿泊目的割合(2区分)30~99人観光目的の宿泊者が50%以上
従業者数(4区分)、宿泊目的割合(2区分)30~99人観光目的の宿泊者が50%未満
従業者数(4区分)、宿泊目的割合(2区分)100人以上総数
従業者数(4区分)、宿泊目的割合(2区分)100人以上観光目的の宿泊者が50%以上
従業者数(4区分)、宿泊目的割合(2区分)100人以上観光目的の宿泊者が50%未満
宿泊施設タイプ(6区分)旅館
宿泊施設タイプ(6区分)リゾートホテル
宿泊施設タイプ(6区分)ビジネスホテル
宿泊施設タイプ(6区分)シティホテル
宿泊施設タイプ(6区分)簡易宿所
宿泊施設タイプ(6区分)会社・団体の宿泊所
解答(スクリプト)
スクリプトの解答例を示す。
解答例
スクリプトを1行ずつ適用して結果を確認しながら進めると、このようなスクリプトになる。
スクリプト
# 上の2行と65行目以降を削除する
del_row 65:,0:2
# ヘッダー部分がユニークになるように調整する
set_col col_001,0,0#総数
set_col col_004,2,2#総数
set_col col_007,2,2#総数
set_col col_010,2,2#総数
set_col col_013,2,2#総数
# ヘッダー(0〜2行目)を結合する
merge_row 0:2
# 0行目をヘッダーにセットする
set_header
説明
#
65行以降と0〜2行を削除する。
#
col_001列の0行目に「総数」をセットする。
col_004列の2行目に「総数」をセットする。
col_007列の2行目に「総数」をセットする。
col_010列の2行目に「総数」をセットする。
col_013列の2行目に「総数」をセットする。
#
0〜2行を結合する。
#
先頭行をヘッダーにセットする。
まとめ
- 番号で指定する del_col, del_row などの更新系のスクリプトは、番号の大きな方から処理すると間違いが少なくなる。
- set_headerでCSVの項目ヘッダーをセットするとき、0行目のすべてのセルのデータが重複なく設定されていないと、エラーになる。
- 複数行のヘッダーを1つにまとめるmerge_rowは、セルのデータを機械的に結合するので、冗長な文字列になりやすい。
重複がなくなってヘッダーとして使える場合でも、CSVの項目ヘッダーとして問題ないか?を確認する。 - 必要に応じて、ヘッダーとなる0行目の文字列の修正を検討する。
set_col:セル単位でデータを書き換える。
set_row:行のデータを一括で書き換える。
BODIKエディタのスクリプトマニュアル
このページは、BODIK Utilityの BODIKエディタのスクリプト機能 のマニュアルです。 スクリプト一覧 区分 スクリプトコマンド 機能 記述例 列操作 hide_col 列を隠す hide_col <列 […]

