2025年8月8日金曜日

デジタル庁が整備しているJapan DashboardからCSVを取得しAPEXで利用する

内閣府とデジタル庁が協力して整備しているJapan Dashboardが公開されています。詳しくはデジタル庁のプレスリリース「Japan Dashboard(経済・財政・人口と暮らしに関するダッシュボード)とデータカタログ」 を参照してください。

本記事では、Japan Dashboradが提供している「複数の指標を一括ダウンロードする」機能を使用してダウンロードしたCSV(Excelも選択可)を、APEXを使ってOracle Databaseにロードします。

Japan Dashboardの見方と操作方法については「Japan Dashboard(経済・財政・人口と暮らしに関するダッシュボード)の見方と操作方法」に詳しく紹介されています。

さて、Japan Dashboardですが「Japan Dashboard(経済・財政・人口と暮らしに関するダッシュボード)とデータカタログ」を読むと、ダッシュボードに含まれるぞれぞれのページへのリンクは掲載されていますが、これがJapan Dashboardへのリンクというのは見つけられませんでした。また、「指標のデータを見る」、「1つの指標を都道府県ごとにみる」、「2つの指標の関連性をみる」、「4つの指標の推移を並べてみる」、「1つの指標のデータをコピーして利用する」のページはMicrosoft Power BIで作られていて、本記事の作業で使用する「複数の指標を一括ダウンロードする」はTableau Publicで作られています。

少し基本的な操作方法を調べてみました。

Microsoft Power BIを開いてるページから他のページへ移動するには、画面下のページ番号が表示されている部分クリックすると開くリストから、移動したいページを選びます。または、左右の矢印をクリックして移動します。


全画面モードで開くと、ページ左下にページ・セレクタが表示されます。


今回使用する「複数の指標を一括ダウンロードする」は、Power BIのJapan Dashboardの「1つの指標のデータをコピーして利用する」のページを開いて、そこにある複数指標の一括ダウンロードはこちら、のこちらをクリックして開きます。


これで、Japan Dashboardの複数の指標を一括ダウンロードするページを開けます。


指標を選んでCSVファイルをダウンロードします。

大分類人口中分類高齢者割合指標すべてを選びます。条件表示期間1975から2024都道府県すべてを選びます。

以上でダウンロードをクリックします。


書式ExcelCSVを選択します。APEXはどちらもロードできます。データが文字列の場合は、列の区切りが明確なExcelが有利ですが、数値であればCSVでもあまり変わらないはずです。

ダウンロードをクリックすると、データ.csvという名称でファイルがダウンロードされます。


ダウンロードされたデータ.csvを、APEXのSQLワークショップデータ・ワークショップを使って、データベースにロードします。


データのロードを開きます。


ファイルの選択をクリックし、データ.csvを選択します。


データのロード画面が開きます。APEXのデータ・ワークショップは最初の一行に限りヘッダー(いわゆる列名)として扱うことができます。Japan Dashboardからダウンロードしたファイルはヘッダーが複数行になるため、そのままではデータをロードできません。


とりあえずCSVのデータをデータベースにロードします。

ロード先新規表を選択します。新規に作成される表は、データを一時的にロードするインターフェース表として扱います。この表名TEMP_POPとしました。

列のデータ型の使用チェックを外し、すべての列の型をVARCHAR2(4000)にします。また、列見出し最初の行にヘッダーが含まれるチェックも外し、CSVに含まれるデータはすべて文字列として、表TEMP_POPにロードするようにします。列名COL001COL002といった、位置の情報だけの列名になります。

以上でデータのロードを実行します。


表TEMP_POPにデータがロードされます。


表TEMP_POPにロードしたCSVデータを、適切に定義した表に入れ替えます。入れ替え先の表を作成する必要があります。

OpenAIのGPT-5に、データ.csvを添付した上で、以下のプロンプトによりDDLを生成するようにお願いしました。

「添付のCSVファイルをOracle Databaseに保存するために、適切な表のDDLを生成してください。表名はデータの内容から30文字以内の英語で、適切な名前になるように決めてください。列名も英語で定義をお願いします。」


生成されたDDLです。まあまあいい感じです。というか、自分で書いたらチェック制約やコメントなどは、まず付けなかったと思いますし、NUMBER型の精度も設定していないと思います。
-- Table: ELDERLY_STATS_JAPAN
CREATE TABLE ELDERLY_STATS_JAPAN (
  PREFECTURE              VARCHAR2(40 CHAR)   NOT NULL,  -- Japanese names (e.g., 全国, 都道府県名)
  YEAR                    NUMBER(4)           NOT NULL,  -- e.g., 1975..2024
  SOLO_ELDERLY_RATE_ALL   NUMBER(4,1),                  -- %
  SOLO_ELDERLY_RATE_FEMALE NUMBER(4,1),                 -- %
  SOLO_ELDERLY_RATE_MALE  NUMBER(4,1),                  -- %
  AGING_RATE              NUMBER(4,1),                  -- %

  CONSTRAINT PK_ELDERLY_STATS_JP PRIMARY KEY (PREFECTURE, YEAR),
  CONSTRAINT CHK_RATES_RANGE CHECK (
    (SOLO_ELDERLY_RATE_ALL    BETWEEN 0 AND 100 OR SOLO_ELDERLY_RATE_ALL    IS NULL) AND
    (SOLO_ELDERLY_RATE_FEMALE BETWEEN 0 AND 100 OR SOLO_ELDERLY_RATE_FEMALE IS NULL) AND
    (SOLO_ELDERLY_RATE_MALE   BETWEEN 0 AND 100 OR SOLO_ELDERLY_RATE_MALE   IS NULL) AND
    (AGING_RATE               BETWEEN 0 AND 100 OR AGING_RATE               IS NULL)
  )
);

-- Optional: comments (English)
COMMENT ON TABLE ELDERLY_STATS_JAPAN IS 'Japan elderly solo-living rates and aging rate by prefecture and year';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.PREFECTURE IS 'Prefecture name (Japanese). "全国" = Japan total';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.YEAR IS 'Census/Survey year';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.SOLO_ELDERLY_RATE_ALL IS 'Share of elderly living alone, total (%)';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.SOLO_ELDERLY_RATE_FEMALE IS 'Share of elderly living alone, female (%)';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.SOLO_ELDERLY_RATE_MALE IS 'Share of elderly living alone, male (%)';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.AGING_RATE IS 'Aging rate: share of population aged 65+ (%)';
しかし主キーがありません。以下のプロンプトで指示すると、主キー列を追加するALTER文を生成しました。

「表ELDERLY_STATS_JAPANに、主キーとなる代理キーを列IDとして追加してください。値は数値を自動採番してください。」

さらに「元のCREATE TABLE文を更新してください。」と指示して、以下のDDLを得ました。
-- Table: ELDERLY_STATS_JAPAN
CREATE TABLE ELDERLY_STATS_JAPAN (
  ID                      NUMBER GENERATED ALWAYS AS IDENTITY
                            (START WITH 1 INCREMENT BY 1 NOCACHE) NOT NULL,
  PREFECTURE              VARCHAR2(40 CHAR)   NOT NULL,  -- Japanese names (e.g., 全国, 都道府県名)
  YEAR                    NUMBER(4)           NOT NULL,  -- e.g., 1975..2024
  SOLO_ELDERLY_RATE_ALL   NUMBER(4,1),                  -- %
  SOLO_ELDERLY_RATE_FEMALE NUMBER(4,1),                 -- %
  SOLO_ELDERLY_RATE_MALE  NUMBER(4,1),                  -- %
  AGING_RATE              NUMBER(4,1),                  -- %

  CONSTRAINT PK_ELDERLY_STATS_JP PRIMARY KEY (ID),
  CONSTRAINT UQ_ELDERLY_PREF_YEAR UNIQUE (PREFECTURE, YEAR),
  CONSTRAINT CHK_RATES_RANGE CHECK (
    (SOLO_ELDERLY_RATE_ALL    BETWEEN 0 AND 100 OR SOLO_ELDERLY_RATE_ALL    IS NULL) AND
    (SOLO_ELDERLY_RATE_FEMALE BETWEEN 0 AND 100 OR SOLO_ELDERLY_RATE_FEMALE IS NULL) AND
    (SOLO_ELDERLY_RATE_MALE   BETWEEN 0 AND 100 OR SOLO_ELDERLY_RATE_MALE   IS NULL) AND
    (AGING_RATE               BETWEEN 0 AND 100 OR AGING_RATE               IS NULL)
  )
);

-- Comments
COMMENT ON TABLE ELDERLY_STATS_JAPAN IS 'Japan elderly solo-living rates and aging rate by prefecture and year';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.ID IS 'Surrogate primary key, auto-generated';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.PREFECTURE IS 'Prefecture name (Japanese). "全国" = Japan total';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.YEAR IS 'Census/Survey year';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.SOLO_ELDERLY_RATE_ALL IS 'Share of elderly living alone, total (%)';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.SOLO_ELDERLY_RATE_FEMALE IS 'Share of elderly living alone, female (%)';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.SOLO_ELDERLY_RATE_MALE IS 'Share of elderly living alone, male (%)';
COMMENT ON COLUMN ELDERLY_STATS_JAPAN.AGING_RATE IS 'Aging rate: share of population aged 65+ (%)';
これをSQLワークショップSQLスクリプトで実行します。


確認画面が開くので即時実行をクリックします。DDLは正常に実行され、表ELDERLY_STATS_JAPANが作成されます。


表TEMP_POPの内容を表ELDERLY_STATS_JAPANに投入します。SQLコマンドで以下のSQLを実行します。
insert into elderly_stats_japan(prefecture, year, solo_elderly_rate_all, solo_elderly_rate_female, solo_elderly_rate_male, aging_rate)
select col002, to_number(col003), to_number(col004), to_number(col005), to_number(col006), to_number(col007) from temp_pop where id > 3;


以上でJapan Dashboardからダウンロードした指標を、Oracle Databaseにロードできました。

折角なので、これらの指標をチャート表示するAPEXアプリケーションを作成してみます。

アプリケーション作成ウィザードを起動し、ホーム・ページを削除して代わりにファセット検索のページを追加します。

アプリケーションの名前高齢化指標とします。


ファセット検索のページ名高齢化指標とします。ソースのは先ほど作成したELDERLY_STATS_JAPANです。

以上の設定でアプリケーションを作成します。


作成されたアプリケーションを実行すると、ホーム・ページとして以下が表示されます。


このページに、「一人暮らしの高齢者割合(全体)」、「一人暮らしの高齢者割合(女性)」、「一人暮らしの高齢者割合(男性)」、「高齢化率(人口総数に対する65歳以上の割合)」の4つの折れ線グラフを追加します。

ページ・デザイナ高齢化指標のページを開きます。

検索結果を表示するクラシック・レポートのリージョンElderly Stats Japan静的IDを設定します。これから作成するチャート・リージョンのソースは、ここで設定する静的IDを指定して、ファセット検索の検索結果を参照します。

静的IDELDERLY_STATS_JAPANとします。

ファセットのP1_YEARP1_AGING_RATEは用途が無いのでコメント・アウトします。


レポート・リージョンの検索結果を参照して、表データを返すパイプライン表関数get_fs_elderly_stats_japanを作成します。以下のコードを実行します。

表ELDERY_STATS_JAPANを作成したDDLの実行と同様に、SQLワークショップSQLスクリプトを使って実行できます。



チャートを表示するリージョンを作成します。

識別名前SOLO_ELDERLY_RATE_ALLタイトル一人暮らしの高齢者割合(全体)とします。タイプチャートです。

ソースSQL問合せに、先ほど作成したパイプライン表関数get_fs_elderly_stats_japanを使用したSELECT文を記述します。チャートが表示される時点での、リージョンElderly Stats Japanにファセットが適用された検索結果が返されます。
select prefecture, year,
    solo_elderly_rate_all
from table(
    get_fs_elderly_stats_japan(:APP_PAGE_ID, 'ELDERLY_STATS_JAPAN')
)
where solo_elderly_rate_all is not null

リージョンの属性を開きます。

チャートタイプ折れ線を選択します。X軸は列YEARつまり年なので、本来は設定時間軸タイプ有効、つまり時間として設定すべきです。ただし、その場合は列YEARの型はDATEまたはTIMESTAMPである必要があります。年だけであれば、数値として扱ってもほぼ問題ないため、時間軸タイプは設定しません。

都道府県および全国がシリーズになるため、凡例表示オンにします。


ひとつだけあるシリーズ名前ALLとします。実際のシリーズは列のマッピングシリーズ名として設定する列PREFECUTERの値になるため、この名前はなんでもかまいません。

ソース位置としてリージョン・ソースを選択します。

列のマッピングラベル(X軸)はYEAR(Y軸)はSOLO_ELDERLY_RATE_ALLを選択します。


チャートの設定は以上です。

リージョンElderly Stats Japanでの検索が完了した後に、このチャートSOLO_ELDERLY_RATE_ALLをリフレッシュする動的アクションを作成します。

作成する動的アクション名前afterRefresh Reportタイミングイベントリフレッシュ後選択タイプリージョンリージョンElderly Status Japanです。


TRUEアクションリフレッシュを選択し、影響を受ける要素選択タイプリージョンリージョンとしてリフレッシュ対象であるSOLO_ELDERLY_RATE_ALLを設定します。


以上でチャートは完成です。

ファセット検索で指定した都道府県が、一人暮らしの高齢者割合(全体)のチャートに表示されます。


後は、ほぼ同じ手順で「一人暮らしの高齢者割合(女性)」、「一人暮らしの高齢者割合(男性)」、「高齢化率(人口総数に対する65歳以上の割合)」の3つのチャートを作成します。

リージョンを重複させた後にリージョン名や列名を変更すると、すぐにチャートを作成できます。


チャートのレイアウトを調整すると、以下のようなAPEXアプリケーションが作成されます。


今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/japan-dashboard-elderly-stats.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。