課題

観光庁の「旅行・観光消費動向調査」のExcel資料「2025年7-9月期 集計表(1次速報)」の「T01シート」を機械判読可能なデータ型CSVに加工する。

Webサイト:https://www.mlit.go.jp/kankocho/tokei_hakusyo/shohidoko.html

Excelリンク:https://www.mlit.go.jp/kankocho/content/001968902.xlsx

「T01」シートを表示する。

元のExcel

加工ポイント

  • ヘッダーが5行あり、階層に別れている。
  • 表の上と下にデータとして不要な行がある。

データ考察

旅行の区分

旅行の種類を3種類に分けている。

1.国内旅行/宿泊旅行

国内旅行/宿泊旅行

2.国内旅行/日帰り旅行

国内旅行/日帰り旅行

3.海外旅行

海外旅行

ヘッダー

それぞれの旅行の種類に対して、似たようなヘッダー構成になっている。

  • 1行目と2行目は説明なので削除する。
  • 3行目〜7行目はヘッダーになる。
    • 3行目は「大分類」を表す。
      • 国内旅行、海外旅行
    • 4行目が「旅行の種類」を記している。
      • 種類:国内旅行/宿泊、国内旅行/日帰り
        • 海外旅行に「宿泊」「日帰り」の区別を設定していないので、4行目に記載なし。
    • 5行目は「旅行の目的」を記している。
      • 目的:観光・レクリエーション、帰省・知人訪問等、出張・業務
        • 最初の部分がブランクになっているが、おそらく「旅行の種類」全体の値だと思われる。
    • 6行目は各分類の数値項目(旅行経験率、旅行平均回数、旅行単価、平均泊数)
      •  ※国内旅行/日帰り旅行に平均泊数はない
    • 7行目は各数値項目の単位を記している。

データ加工の考え方

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

T01シートの【国内旅行/宿泊旅行】部分
T01シートの【海外旅行】部分

余分な行・列

  • 最初の2行は削除する。
  • 最後の行(60行以降)は削除する。
  • 削除するべき余分な列はない。

ヘッダー

  • 上から3行目の「大分類」は、先頭セル以外はブランクになっているので、既存のデータで埋める。
  • 上から4行目の「旅行の種類」は、先頭セル以外はブランクになっているので、既存のデータで埋める。
    • ただし、海外旅行は「旅行の種類」に記載がないので、このままだと左側にある「国内旅行/日帰り旅行」が展開されてしまう。
  • 上から5行目の「旅行の目的」は、先頭セル以外はブランクになっているので、既存のデータで埋める。
    • ただし、最初のブロックは空白になっているので、このままだと左側の「旅行の種類」の「旅行の目的」が展開されてしまう。
      • 「旅行の目的」の記載がないということは、「合計」または「平均」と考えられる。
      • しかし、計算すると、合計でも平均でもない。
      • とりあえず、ここでは「全体」を表す情報と仮定する。
  • 上から7行目の「単位」は、なくてもいいので削除する。

ゴール(作成するCSV)

元データを加工して次のようなCSVを作成する。

項目ヘッダー

項目
国内旅行 宿泊旅行全体旅行経験率
国内旅行 宿泊旅行全体旅行平均回数
国内旅行 宿泊旅行全体旅行単価
国内旅行 宿泊旅行全体平均泊数
国内旅行 宿泊旅行 観光・レクリエーション旅行経験率
国内旅行 宿泊旅行 観光・レクリエーション旅行平均回数
国内旅行 宿泊旅行 観光・レクリエーション旅行単価
国内旅行 宿泊旅行 観光・レクリエーション平均泊数
国内旅行 宿泊旅行 帰省・知人訪問等旅行経験率
国内旅行 宿泊旅行 帰省・知人訪問等旅行平均回数
国内旅行 宿泊旅行 帰省・知人訪問等旅行単価
国内旅行 宿泊旅行 帰省・知人訪問等平均泊数
国内旅行 宿泊旅行 出張・業務旅行経験率
国内旅行 宿泊旅行 出張・業務旅行平均回数
国内旅行 宿泊旅行 出張・業務旅行単価
国内旅行 宿泊旅行 出張・業務平均泊数
国内旅行 日帰り旅行全体旅行経験率
国内旅行 日帰り旅行全体旅行平均回数
国内旅行 日帰り旅行全体旅行単価
国内旅行 日帰り旅行観光・レクリエーション旅行経験率
国内旅行 日帰り旅行観光・レクリエーション旅行平均回数
国内旅行 日帰り旅行観光・レクリエーション旅行単価
国内旅行 日帰り旅行帰省・知人訪問等旅行経験率
国内旅行 日帰り旅行帰省・知人訪問等旅行平均回数
国内旅行 日帰り旅行帰省・知人訪問等旅行単価
国内旅行 日帰り旅行 出張・業務旅行経験率
国内旅行 日帰り旅行 出張・業務旅行平均回数
国内旅行 日帰り旅行 出張・業務旅行単価
海外旅行旅行全体旅行経験率
海外旅行旅行全体旅行平均回数
海外旅行旅行全体旅行単価
海外旅行旅行全体平均泊数
海外旅行旅行 観光・レクリエーション旅行経験率
海外旅行旅行 観光・レクリエーション旅行平均回数
海外旅行旅行 観光・レクリエーション旅行単価
海外旅行旅行 観光・レクリエーション平均泊数
海外旅行旅行 帰省・知人訪問等旅行経験率
海外旅行旅行 帰省・知人訪問等旅行平均回数
海外旅行旅行 帰省・知人訪問等旅行単価
海外旅行旅行 帰省・知人訪問等平均泊数
海外旅行旅行 出張・業務旅行経験率
海外旅行旅行 出張・業務旅行平均回数
海外旅行旅行 出張・業務旅行単価
海外旅行旅行 出張・業務平均泊数

※重複はないが冗長と言える。元のExcelにあるデータを使うと、このようなヘッダーになる。

解答(スクリプト)

スクリプトの解答例を示す。

解答例

スクリプトを1行ずつ適用して結果を確認しながら進めると、このようなスクリプトになる。

スクリプト
# 上の2行を削除する
del_row 60:,0:1
# 0行目:大項目の先頭に「項目」という文字列をセットする
set_col col_000,0,0#項目
# 0行目:大項目の抜けているところを埋める
fill_right 0
# 1行目:海外旅行の旅行の種類に「旅行」という文字列をセットする
set_col col_029,1,1#旅行
# 1行目:旅行の種類の抜けているところを埋める
fill_right 1
# 2行目:旅行の目的に「全体」という文字列をセットする
set_col col_001,2,2#全体
set_col col_017,2,2#全体
set_col col_029,2,2#全体
# 2行目:旅行の目的の抜けているところを埋める
fill_right 2
# 4行目:単位の行を削除する
del_row 4
# ヘッダー(0〜3行目)を結合する
merge_row 0:3
# 0行目をヘッダーにセットする
set_header
説明
#
60行以降と0〜1行を削除する。
#
col_000列の0行目に「項目」をセットする。
#
0行目の抜けているセルを埋める。
#
col_029列の1行目に「旅行」をセットする。
#
1行目の抜けているセルを埋める。
#
col_001列の2行目に「全体」をセットする。
col_017列の2行目に「全体」をセットする。
col_029列の2行目に「平均」をセットする。
#
2行目の抜けているセルを埋める。
#
4行目の単位行を削除する。
#
0〜3行を結合する。
#
先頭行をヘッダーにセットする。
注意
  • 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 <列 […]