本記事では、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を開いてるページから他のページへ移動するには、画面下のページ番号が表示されている部分をクリックすると開くリストから、移動したいページを選びます。または、左右の矢印をクリックして移動します。
全画面モードで開くと、ページ左下にページ・セレクタが表示されます。
これで、Japan Dashboardの複数の指標を一括ダウンロードするページを開けます。
指標を選んでCSVファイルをダウンロードします。
大分類に人口、中分類に高齢者割合、指標はすべてを選びます。条件の表示期間は1975から2024、都道府県はすべてを選びます。
以上でダウンロードをクリックします。
ダウンロードをクリックすると、データ.csvという名称でファイルがダウンロードされます。
データのロードを開きます。
ファイルの選択をクリックし、データ.csvを選択します。
データのロード画面が開きます。APEXのデータ・ワークショップは最初の一行に限りヘッダー(いわゆる列名)として扱うことができます。Japan Dashboardからダウンロードしたファイルはヘッダーが複数行になるため、そのままではデータをロードできません。
ロード先に新規表を選択します。新規に作成される表は、データを一時的にロードするインターフェース表として扱います。この表名をTEMP_POPとしました。
列のデータ型の使用のチェックを外し、すべての列の型をVARCHAR2(4000)にします。また、列見出しの最初の行にヘッダーが含まれるのチェックも外し、CSVに含まれるデータはすべて文字列として、表TEMP_POPにロードするようにします。列名はCOL001、COL002といった、位置の情報だけの列名になります。
以上でデータのロードを実行します。
表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スクリプトで実行します。
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を指定して、ファセット検索の検索結果を参照します。
静的IDはELDERLY_STATS_JAPANとします。
ファセットのP1_YEAR、P1_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を設定します。
以上でチャートは完成です。
ファセット検索で指定した都道府県が、一人暮らしの高齢者割合(全体)のチャートに表示されます。
リージョンを重複させた後にリージョン名や列名を変更すると、すぐにチャートを作成できます。
チャートのレイアウトを調整すると、以下のようなAPEXアプリケーションが作成されます。
今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/japan-dashboard-elderly-stats.zip
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完