組み合わせの決め方と、分析側が整えるデータ(設計メモ)

令和8年度 千葉県地域医療提供体制データ分析チーム構築支援事業 / 指標ファーストの操作設計と、データ整備の考え方
この資料は、可視化ツールの操作設計の考え方(なぜ指標から選ぶのか、できない組み合わせをどう判別するのか)と、それを支えるデータの整え方の要点をまとめた設計メモです。位置づけは次のとおりで、詳細は正となる資料に委ねています。

1指標(データ項目)ファースト ― 操作設計の考え方

指標を先に選び、その指標に宣言された「型(dtype)」と「軸」から、使える見せ方を自動的に決める。
1指標を選ぶ例:手術実施率(dataset_id=surg_rate)
2型・軸を読むdtype=single / region_axis_id=med9 / filter_axes=year;cancer;age
3使える見せ方が出る色分け地図・棒グラフ地図・ランキング・ヒートマップ
4必要なら比較指標を足すsingle ×2 で二変量地図・散布図に切り替わる

なぜ「型を先に選ぶ」形にしないのか

A. 指標ファースト(採用)
指標を選ぶ → 宣言された型・軸から見せ方が自動で決まる。
長所
  • 「何を見たいか」で操作でき、職員の語彙のまま進める。
  • 不可能な組み合わせを提示しないので迷わない。
  • 指標を足す=比較、と操作が自然に拡張する。
留意
  • 構成比(comp)・フロー(flow)も「1つの指標」として指標リストに並べる必要がある(datasets.csv が1行=1指標なので、この形で成立している)。
B. 型ファースト(不採用)
データの種類(単値・構成比・フロー・施設点)を先に選ばせる。
長所
  • 型ごとに見せ方が固定されるため実装は単純。
  • 構成比・フローの存在を最初から明示できる。
留意
  • 「型」は分析側の語彙であって職員の語彙ではない。抽象概念を先に理解させることになる。
実装上はどちらも同じ dtype・軸のメタデータで動きます。違いは“入口”だけなので、入口として自然な A を採っています。迷いを減らすため、よく使う組み合わせを少数の入口(テンプレート)として用意することもできますが、中身は同じ仕組みで動きます。

2「できる/できない組み合わせ」の判定ロジック

可否は、選んだ指標の dtype と軸が、各見せ方の要求する形を満たすかで決まります。アプリはこれを機械的に照合し、満たさない見せ方を自動で選べなくします。判定に必要な情報はすべて datasets.csv の宣言に入っているため、指標ごとの画面の作り込みは不要です。

判定ルール(擬似コード):
見せ方が使える = (指標.dtype が 見せ方の受け入れる型 に含まれる) かつ (見せ方が必要とする軸が 指標の region_axis_id / filter_axes に揃っている)
2指標の見せ方(二変量地図・散布図):もう一方の指標も dtype=single で、同じ地域軸・同一粒度 のときだけ選択可。
表:どの dtype でも可(常に出せるフォールバック)。
例:「平均在院日数」は single なので 色分け地図・棒グラフ地図・ランキング・ヒートマップが有効。二変量地図・散布図は「もう1つ single の指標」を足したときだけ有効になり、足すと今度は1指標用の見せ方(色分け地図・ランキング等)が対象外になります。構成比(comp)・フロー(flow)は型が違うので比較指標には選べません。この判定は職員に見える形(灰色)で表現します。

見せ方の一覧・対応表は「図解」が正

見せ方は全15種(地図7・図7・表1)あります。どの見せ方がどのデータ型で使えるか、それぞれの読み方・注意点・分析項目への割付は、インタラクティブ図解の「見せ方 × データ型 対応マトリクス」および各見せ方のページにまとめてあります(実装のロジックと一致させています)。本書には重複した対応表を置きません。

3データの「型」は4種類(single・comp・flow・point)

1つの指標には必ず1つの型(dtype)を宣言します。型は次の4種類だけで、使える見せ方はこの型から自動判定されます。

dtype意味values の主な列(型別の規約)主な見せ方
single
(地域単値)
地域を決めれば値が1つ決まるregion, value, suppressed
(+ year 以外の絞り込み軸列)
色分け地図/棒グラフ地図/ランキング/ヒートマップ
(2つそろえて二変量地図・散布図)
comp
(構成比)
地域ごとに合計100%になる内訳region, category, value, suppressed
(category は category_axis_id の軸を参照)
構成比/構成比地図
flow
(ODフロー)
2地点間の量(どこから→どこへ)from_region, to_region, value, suppressed受療動向フロー(地図)/受療動向サンキー
point
(施設点)
施設ごとの位置と値facility_id, name, region, lat, lon,
{value_columns で宣言した指標列}, suppressed
施設点マップ/資源配置マップ/スコアカード/資源マトリクス
「クロス集計」は独立した型ではありません。「地域 × がん種」「病院 × 医療圏」のようなクロス集計は、single の filter_axes に軸を宣言することで表現します(軸の組合せごとに値が1つなら single です)。ヒートマップも single +カテゴリ軸で描きます。施設単位の値も region_axis_id=facility の single として持たせられます。
同様に「2指標」も型ではありません。single の指標を2つ、同じ地域軸でそろえたときにだけ選べる見せ方の条件です。

4分析側が整えるデータ(要点)

ツールに渡すのはデータパック1式だけです。個票は渡しません(集計・秘匿は分析側で完結)。ここでは考え方に関わる要点だけを示します。列定義・コード体系・検証ルールの正式な仕様は「データパック仕様書(分析班向け)にあります。

パックの構成中身考え方の要点
master/axes.csv軸マスタ。地域・がん種・年齢層などのドメイン軸の選択肢(axis_id, code, label, sort, parent…)年(時間)は書きません(暦から機械的に決まるものに誤記の窓口を作らないため)。曜日・時間帯・シナリオは循環的分類/業務判断の軸なのでここに書きます。施設軸は facilities.csv から自動導出されるため書きません。
master/datasets.csv指標カタログ。1行=1指標(dataset_id, name, unit, dtype, region_axis_id, filter_axes, value_format, agg, disclosure_threshold, source, description …)指標を増やす=1行足すだけで画面の選択肢に加わります。description はそのまま画面の用語ヘルプに出ます。
values/{dataset_id}/
{年度}.csv
実際の集計値。1行=1観測年度はファイル名で表現し、行に year 列を持ちません。年度更新は新年度ファイルを追加するだけで、確定した過去年度のファイルは変更しません(追記オンリー)。
values/{dataset_id}.csv年度に依存しないデータ(施設マスタ等)単一ファイルのままにします。
geo/{axis_id}.topojson地域境界(TopoJSON・WGS84)properties.code が axes.csv の code と一致することが結合キーです。新しい地域分けは軸1式+同名ファイルの追加で画面に出ます。

values の列は「型ごとの規約」で決まる(規約駆動)

values 各CSVの列は、datasets.csv の宣言から一意に決まりますdtypefilter_axesseries_typecategory_axis_idvalue_columnsfrom_axis_idto_axis_id)。 列仕様を別ファイルで宣言する必要はありません。検証ツールが「型別の必須列がすべて存在し、余分な列がない」ことを実CSVと機械照合します(列順は自由)。
例:dtype=singlefilter_axes=year;cancer;agevalues/surg_rate/2024.csv の列は cancer, age, region, value, suppressed(year はファイル名で表現)。

時間・推計・基準線の宣言(datasets.csv)

意味と、なぜ要るのか
year_start04-01年度(会計年度)01-01暦年。ファイル名は同じ 2024 でも、年度か暦年かはこの欄でしか判別できません。画面ラベルを「2024年度」「2024年」と自動で出し分けるために使います(書き忘れると1年ずれた比較が起きます)。
series_typeactual=実績/projection=将来推計。推計は values に time 列(対象年)を持ち、ファイル名の年は推計の発行時点(ヴィンテージ)を表します。画面は推計を実績と区別して表示します。
reference_value閾値線・基準線の値。宣言された値の基準線をグラフ・表に引きます(空欄=線を引かない)。どの値を基準とするかは県との協議事項で、仕様は「宣言された値を描く」仕組みだけを定めます。
from_axis_id
to_axis_id
flow の出発側/到着側の軸。省略時は両方とも region_axis_id(医療圏→医療圏)。to_axis_id=facility と書けば列は from_region, to_facility となり「住所地(医療圏)→受診先(施設)」を表せます。
時間は年ベースのみです(県確認済み)。時間の粒度は年に限定し、月次・週次の仕組みは含めません。ファイル分割の単位も年(納品単位)で統一します。なお曜日・時間帯は「時系列の粒度」ではなく年内の内訳集計軸なので、時間ではなく axes.csv のドメイン軸として扱います。

秘匿処理・欠測の扱い(分析側で完結)

更新運用(要点)

5サンプルデータ → 地図・グラフ表現(実例)

ここでは、分析側が整える values の実CSV が、ツール上で 実際にどの地図・グラフになるか を、 実在の千葉県の地理(国土数値情報の市区町村境界)を用いて示します。ツールはCSVの値を色や矢印に機械的に割り当てるだけで、数値の意味(良い・悪い)は解釈しません。

1分析側がCSVを整えるdtype 別の列規約どおりに用意
2コードで地図に結合region=axes.csv の code=geo の properties.code
3値を色/帯/矢印へ割当アプリが描画(意味は判断しない)
4県職員が分布を読む解釈・政策判断は人が行う
例A:single(地域単値)→ 色分け地図(コロプレス)
dtype=single / values/surg_rate/2024.csv / 列:region, cancer, age, value, suppressed
▼ 分析班へ依頼するCSV(例:手術実施率 surg_rate を医療圏別に。1行=1つの集計値。年度はファイル名で表現)
region(名称)canceragevaluesuppressed
chiba(千葉)allall59
tokatsu_s(東葛南部)allall62
tokatsu_n(東葛北部)allall57
inba(印旛)allall49
kaiso(香取海匝)allall45
sanbu(山武長生夷隅)allall41
ichihara(市原)allall54
kimitsu(君津)allall47
awa(安房)allall43
kaiso(香取海匝)lung851
地図になる仕組み:CSVの region(例 tokatsu_s)を、geo/med9.topojsonproperties.code で結合します。アプリは value5段階に区分して色に対応づけて塗るだけで、値の高低の意味は判断しません。(名称は axes.csv の label で対応。CSV本体はコードのみで可)
  • tokatsu_s 東葛南部=62 は最上位クラスとして最も濃い青で表示。
  • sanbu 山武長生夷隅=41 は最下位クラスとして最も薄い青。
  • suppressed=1 の行(少人数セル)は value を空欄にして渡し、地図では灰色「表示なし」。行は消しません。
― ツール上の表示イメージ(千葉県・二次医療圏/実地理)―
手術実施率(%) 40 65 表示なし(秘匿)
例B:comp(構成比)→ 構成比地図(各医療圏に帯を重ねる)
dtype=comp / values/treatment_mix/2024.csv / single との違い=category 列が1本増える(各地域で合計100)
― 構成比地図の表示イメージ(治療選択の内訳)―
手術(surgery) 放射線(radiation) 薬物(chemo) 無治療(none)
▼ 依頼するCSV(区分ごとに1行。地域ごとに合計が100になる内訳)
region(名称)categoryvaluesuppressed
chiba(千葉)surgery58
chiba(千葉)radiation14
chiba(千葉)chemo20
chiba(千葉)none8
inba(印旛)surgery49
…(印旛・安房も同様に4区分=4行ずつ。各医療圏で合計100)
single からの差分はこれだけ:category の列が1本増え、1つの地域が区分の数だけ行に分かれます(ロング形式)。区分のコードは datasets.csv の category_axis_id で指定した軸(ここでは treatment:手術/放射線/薬物/無治療)を参照します。アプリはこの内訳を各医療圏の 帯グラフとして地図上に重ね、構成の地域差を見せます。結合キーは single と同じ region です。
例C:flow(ODフロー)→ 受療動向フロー(住所地→受診先を矢印で)
dtype=flow / values/patient_flows/2024.csv / 地域の列が from_region・to_region の2本になる
▼ 依頼するCSV(住所地→受診先の患者数。1行=1つの流れ=1本の矢印)
from_region(住所地)to_region(受診先)valuesuppressed
awa(安房)chiba(千葉)210
kimitsu(君津)chiba(千葉)160
sanbu(山武長生夷隅)chiba(千葉)190
inba(印旛)tokatsu_n(東葛北部)140
フローの見せ方:アプリは from_regionto_region のコードを両端の重心に結び、矢印の太さ=value(人数)で描きます。既定では出発側・到着側とも同じ地域軸ですが、datasets.csv で to_axis_id=facility と宣言すれば列は from_region, to_facility となり、「住所地(医療圏)→受診先(施設)」のフローも同じ型で表せます。
  • 安房→千葉=210 が最も太い矢印。周辺から千葉への集約の分布が見える。
  • 地域内で完結した患者は描かれないため、流出の矢印だけで読まず自給率と併せて確認します(判断は人が行う)。
― 受療動向フローの表示イメージ ―
3例に共通するのは、dtype 別の列規約さえ守れば、アプリの追加開発なしに地図へ描き分けられるという点です。分析側は型(single/comp/flow/point)に沿って列を用意することに集中すればよく、地図の作り込みはアプリが担います。

6施設単位(point型)データ ― 実データ軸の例

「二次医療圏で集計」は表示粒度の選択で、データの限界ではありません。入院系の多くは個別の病院単位で公開されており(病床機能報告 個票・DPC退院患者調査)、施設の位置(緯度経度)も国土数値情報で取得できます。point 型は values/facilities.csv(年度に依存しないため単一ファイル)に facility_id, name, region, lat, lon, {value_columns で宣言した指標列} を持たせる形で、施設軸(facility)の選択肢はこのファイルの facility_id から自動導出されます(軸マスタとの二重管理を避けるため)。ここでは実在の千葉県主要病院を実位置に点で表示し、素材となる参照データ2種のカラム構成を、スイッチで切り替えて確認できます。
円の大きさ=許可病床数(病床機能報告)
開設者: 大学病院系 自治体(県・市) 公的(日赤・独法等) 医療法人
円の大きさ=値の大小(面積比=平方根スケール)。位置は実在の緯度経度(同一投影で市町村境界に整合)。
下のスイッチで、地図に重ねている2つの参照データの「カラム構成(データ辞書)と実サンプル行」を切り替えて確認できます(現在表示中のデータが地図の円の大きさに反映されます)。これらを point 型の規約に整えたものが values/facilities.csv です。
出所:病床機能報告 個票(千葉県オープンデータ・圏域別に病院/有床診療所の個票を公開)。位置は国土数値情報 医療機関(P04)の緯度経度で付与。値は公開値ベースの機能イメージ(機能別内訳は例示)。
カラム構成(データ辞書)
カラム型/単位説明
facility_idコード医療機関コード(施設の識別子。施設軸の選択肢はこの列から自動導出)
name文字医療機関名
address文字所在地(市区町村・住所)
regionコードその施設が所在する二次医療圏(結合キー)
opener区分開設者(国立大学法人/県/市/日赤/医療法人 等)
beds_total許可病床数(合計)
func_kodo高度急性期 病床数
func_kyusei急性期 病床数
func_kaifuku回復期 病床数
func_mansei慢性期 病床数
lat, lon緯度・経度(WGS84。P04で付与=地図の点)
実サンプル行(抜粋)
医療機関名医療圏開設者許可病床高度急性急性回復慢性
総合病院国保旭中央病院香取海匝地方独法9896072090119
千葉大学医学部附属病院千葉国立大学85032053000
亀田総合病院安房医療法人8651006009075
松戸市立総合医療センター東葛北部6008052000
value_columns の宣言例:beds_total;func_kodo;func_kyusei;func_kaifuku;func_mansei と datasets.csv に書けば、この5列が施設単位の指標として画面に出ます。
出所:DPC導入の影響評価に係る調査「退院患者調査」(施設別に公表=病院情報の公表)。10件未満は「-」でマスク(秘匿)。施設IDでP04の位置に接続。値は機能イメージ。
カラム構成(データ辞書)
カラム型/単位説明
facility_idコード告示番号・通番(施設の識別子)
name文字施設名
dpc_total人/年年間退院患者数(DPC対象)
age_dist年齢階級別 退院患者数(10歳刻み)
mdc_dist診断群分類(MDC)別 患者数
alos_self平均在院日数(自院)
alos_nation平均在院日数(全国)
surg_major診療科別 主要手術件数
suppressedフラグ10件未満は値を空欄にし、この列に 1 を立てる(秘匿)
実サンプル行(抜粋)
施設名年間退院患者消化器(MDC06)例平均在院日数(自院)主要手術(例)
総合病院国保旭中央病院22,3002,85011.84,120
千葉大学医学部附属病院20,1002,40012.95,600
亀田総合病院19,4002,51010.64,780
さんむ医療センター3,45021013.2(空欄)
秘匿の書き方:公表側の「-」は、パックでは値を空欄にし suppressed=1 として渡します(行は残す)。秘匿の検証は point 型も対象です。
対応の要点:分析側は「施設マスタ(facility_id・name・region・lat/lon・開設者区分)施設別の集計値(value_columns で宣言した病床数・患者数・機器の保有状態など)」を1ファイル1行=1施設にまとめます。位置は国土数値情報P04(住所しかない場合はジオコーディング)。
なお「施設×年度」で値が変わるものは point ではありません。同じ施設が何行にもなるため、region_axis_id=facility の single(年度別ファイル)として持たせます。施設を「地域」の代わりに使う考え方で、ランキングもヒートマップも同じ形で描けます。

7まとめ(役割分担)

主体やること
分析側(千葉大)個票を集計・秘匿し、axes.csv(軸マスタ)+datasets.csv(指標カタログ)+values(年度別ファイル)+geoを整え、検証ツールでエラー0を確認して版数付きのデータパックを発行する。指標を増やすときは datasets.csv に1行足す。
ツールdatasets.csv を読み、選んだ指標の dtype と軸から使える見せ方を機械的に提示。値を地図・グラフ・表で描画し、CSV/PNG/SVG・印刷で出力する。中身の良否は判断しない。
県担当者受け取ったパックを管理画面から適用(アップロード→適用前の再検証→版数・変更点の確認→適用/版数履歴からロールバック)。職員アカウントの管理も同じ画面で行う。パックの中身は編集しない。
県 各課・会議指標を選んで分布を把握し、解釈・政策判断を行う(所見メモ等に記入)。
この設計だと「できる組み合わせ/できない組み合わせ」はデータ(datasets.csv の宣言)が決めるため、画面の作り込みと分析データの整備を分離できます。分析側は“型・軸・説明・値”を整えることに集中すればよく、新しい指標や新しい地域分けはアプリ改修なしで画面に反映されます。