統計表における機械判読可能なデータの表記方法

はじめに

e-Statで2020年11月25日から12月1日まで意見照会されていた「統計表における機械判読可能なデータ作成に関する表記方法案」が2020年12月18日に統計表における機械判読可能なデータの表記方法について統計表における機械判読可能なデータ作成に関する表記方法(PDF)にまとめられた。これを引用しつつ,コメントする。

なお,このPDFには「第1章 機械判読可能なデータの作成 ~Excel 形式による統計表の作成~」しかないので,そのうちに第2章以下が追加されるものと思われる。

第1節 データ形式の留意点

チェック項目1-1 ファイル形式はExcelかCSVとなっているか

Excelならxlsではなくxlsx形式にすべきことや,パーマリンクを付けてほしいことを,意見照会では書いたが,反映されなかった。なお,CSVなら今後は文字コードをUTF-8にするべきである。BOM付きUTF-8ならExcelでも文字化けせず開ける。

第2節 Excelファイルによる統計表のレイアウト

第1項 データ・項目の取扱い

チェック項目1-2 1セル1データとなっているか

例1
1-2-例1

改善案:セル結合や2行のヘッダは避けたい。最初の列には「年度」という列名が欲しい。年度は西暦で単位なしにしたい。

年度仕入額出荷額
2015373973
20164341234
20175491449
20186381738
20197411841

上と同じ形のExcelファイルを tables-1-2-ex1.xlsx として置いておく。このExcelファイルはPythonで簡単に読める:

import pandas as pd

df = pd.read_excel("https://oku.edu.mie-u.ac.jp/~okumura/python/data/tables-1-2-ex1.xlsx")
df
     年度  仕入額   出荷額
0  2015  373   973
1  2016  434  1234
2  2017  549  1449
3  2018  638  1738
4  2019  741  1841

このページにあるHTMLの表をPythonでスクレイプするのも,同様に簡単である:

tables = pd.read_html("https://oku.edu.mie-u.ac.jp/~okumura/python/tables.html")
tables[0]
     年度  仕入額   出荷額
0  2015  373   973
1  2016  434  1234
2  2017  549  1449
3  2018  638  1738
4  2019  741  1841
例2
1-2-例2

改善案:最初の列に列名が欲しい。項目名のスペースによるインデントは避ける。「総計」は計算できるので,なくてもよい。

チェック項目1-3 数値データは数値属性とし、文字列を含まないこと

例1 数値データ内に文字列が含まれる場合
1-3-例1

改善案:最初の列に列名が欲しい。

例2 数値データ内に空白がある場合
1-3-例2

改善案:最初の列に列名が欲しい。

例3 数値データ内に注釈・脚注が含まれる場合
1-3-例3

改善案:最初の列に列名が欲しい。

チェック項目1-4 セルの結合をしていないか

例1
1-4-例1

改善案:最初の列に列名が欲しい。

1-4-例2

改善案:欠測値を表すのに「−」が使われているが,「−」と区別がつきにくい文字がたくさんあり,不統一を招きかねない。欠測値を表す方法については下の「チェック項目1-13」とその改善案を参照されたい。

チェック項目1-5 スペースや改行等で体裁を整えていないか

例1
1-5-例1

改善案:地域コードを併記してもスペースによる整形は好ましくない。どうしても整形したいなら,Excelのセルの書式設定→配置→水平方向の配置を「均等割り付け(インデント)」とし,インデント幅(左右の空き)を適宜設定する。

例2
1-5-例2

改善案:「合計」はなくてもよい。

例3
1-5-例3

改善案:可能ならば全角「A-1」などはASCIIの範囲の「A-1」などで統一する。

チェック項目1-6 項目名等を省略していないか

1-6-例

改善案:同上。

チェック項目1-7 数式を使用している場合は、数値データに修正しているか

1-7-例

改善案:なし。

チェック項目1-8 オブジェクトを使用していないか

1-8-例

改善案:可能ならば全角は半角に統一する。

チェック項目1-9 データの単位を記載しているか

1-9-例

改善案:ヘッダ行は1行に統一する。単位は括弧書きにするか,別の説明文に入れる。

薬剤名出荷本数(本)単価(円)
鎮静剤A-1429756
鎮静剤A-2321648
鎮静剤A-3384438
鎮静剤A-4408775

チェック項目1-10 機種依存文字を使用していないか。

1-10-例

改善案:「機種依存文字」というのはShift JIS時代の名残りであり,Unicodeでは「機種依存文字」は事実上存在しないと考えてよい。必要に応じてどんな文字でも使ってかまわない。ただ,入力のしやすさを考えれば,簡単な文字で済ませるほうがよい。

品名収納済額(a)収納未済額(b)収納未済額割合(b/a)
サンプルA10001000.1
サンプルB20002000.1
サンプルC30003000.1
サンプルD40004000.1

チェック項目1-11 e-Statの時間軸コードの表記、西暦表記又は和暦に西暦の併記がされているか

1-11-例

改善案:e-Statの時間軸コードはそのままではRやPythonで扱えないので,特に理由がない限り,通常の日付表記(2020,2020-12,2020-12-31など)に統一していただければありがたい。「2006年度4〜9月期」のような複雑な場合は,幅が一定(半期ごと)であれば始値「2006-04」だけ,幅が不定であれば始値と幅または始値と終値の2欄に分ける。

出荷本数在庫本数
2017429141183
2018321243283
2019384333560
2020408219724

チェック項目1-12 地域コード又は地域名称が表記されているか

1-12-例

改善案:なし。

チェック項目1-13 数値データの同一列内に特殊記号(秘匿等)が含まれる場合

「集計した結果がゼロ、表章桁未満」は 0,「集計に必要なデータがない」は ***,「秘匿データ」は X で表す。

1-13-例

改善案:欠測値を *** で表すのは,それで統一されていれば問題ないが,Excelでグラフを描く場合に 0 と扱われる点に注意しなければならない。別の案として,ExcelでもPython(pandas)でも欠測値の意味になる #N/A はどうか。CSVの場合は # 以下がコメントと解釈されないように "#N/A" のようにダブルクォートで囲む。Excelで合計や平均を求める際には =SUMIF(範囲,"<>#N/A")=AVERAGEIF(範囲,"<>#N/A") のように書く。

都道府県サンプル1サンプル2
北海道5295444940
青森県#N/A#N/A
岩手県65665933
宮城県#N/A#N/A

tables = pd.read_html("https://oku.edu.mie-u.ac.jp/~okumura/python/tables.html")
tables[4]
  都道府県    サンプル1    サンプル2
0  北海道  52954.0  44940.0
1  青森県      NaN      NaN
2  岩手県   6566.0   5933.0
3  宮城県      NaN      NaN

Last modified: