課題

観光庁の「宿泊旅行統計調査」の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%未満」の合計と一致しない。
  • 7行目以降は、各項目の人数が記載されているデータ行になっている。

データ加工の考え方

データ加工が必要な表の上部をBODIKエディタで表示してみる。

従業員数別(総数、0〜9人)
従業員数別(10~29人、30~99人、100人以上)
宿泊施設タイプ別

余分な行・列

  • 最初の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行を結合する。
#
先頭行をヘッダーにセットする。
注意
  • set_headerスクリプトは、指定した行のデータがすべてユニークでないとエラーになる。
  • merge_rowスクリプトは、文字列を機械的に結合する。階層構造で記述された項目名を結合することでユニークな文字列になることを期待している。
  • ヘッダーとした文字列がCSVの項目ヘッダーとして適切であることを確認すること。

まとめ

  • 番号で指定する 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 <列 […]