シニアジョブで、サイトのコンテンツとして年代別就業状況の統計データを使うためにいろいろやったので流れをメモ。
データは政府の政府統計ポータルサイトe-Statのものを使いました。リンクは都道府県別のもの。
www.e-stat.go.jp
利用の際は出典の明記が必要です。
利用規約 | 政府統計の総合窓口
いろいろ探してエクセル形式でダウンロードしてGoogleスプレッドシートに読み込み、必要なものをコピペしていきます。
ちなみに私のスプレッドシートやエクセルのスキルは実務経験でいうと3週間ぐらいです。
コンテンツとしてデータがどんなものがいいかは、数字の羅列を見てもわかりません。
まずはグラフにするため、必要そうなデータをどんどん列に追加していきます。
行は年と都道府県にして、列にシニア世代を50代、60代、70歳以上という3つに分けていろいろ追加していきました。
唯一知っていると言っても過言ではない機能、ピボットテーブルを使って、データを整理してグラフにします。
知っているだけで使い方はわからないので、いい感じになるまで設定をいじりまくります。
いくつかできたら、どれがいいかなというのを周りに相談しながら決めました。
最終的には全就業者数における、各シニア世代の就業者数の割合のパーセントにしました。
グラフとデータが決まったのでChart.jsに移ります。
いい感じにグラフを表示してくれます。
www.chartjs.org
今回はVueのコンポーネントとして実装するため、ラッパーであるvue-chartjsをインストールしておきます。
vue-chartjs.org
Chart.jsで使うためには、スプレッドシートのデータがこんな感じになると嬉しいです。
{ "labels":[1980,1985,1990,1995,2000,2005,2010,2015], "datasets":[ {"label":"50代","data":[16.69,18.53,19.08,19.95,22.89,23.11,20.34,20.07]}, {"label":"60代","data":[7.33,7.61,8.87,10.18,10.17,11.53,14.5,15.51]}, {"label":"70歳以上","data":[2.33,2.55,2.63,3.27,3.78,4.53,4.97,5.99]} ] }
なるべくスプレッドシートはデータだけに集中させたいので、backgroundColorなど色なんかはあとでVue側でlabelを見てくっつけることにします。
スプレッドシートのメニューの「ツール」→「スクリプトエディタ」を開いてGASを書きます。
Null合体演算子が使えない、アロー関数でインデントが狂う、StringにreplaceAllがないなど最近のJavaScriptとの微妙な違いと戦いながら雑に書いていき、こんな感じになりました。
都道府県別のも書きましたが複雑なので単純な年代別のものだけ。
function ageJson() { const sheet = SpreadsheetApp.getActiveSheet(); const rows = sheet.getSheetValues(1, 1, sheet.getLastRow(), sheet.getLastColumn()); const labels = []; const dataset = []; const data50 = []; const data60 = []; const data70 = []; const dataAll = []; rows.forEach( function(cols, index) { if (index === 0){ return; } // 0が全国 if (cols[1] !== 0) { return; } // 列変えたら数字変える year = cols[0]; worker50 = cols[6]; worker60 = cols[7]; worker70 = cols[8]; workerAll = cols[12]; labels.push(year); data50.push(worker50); data60.push(worker60); data70.push(worker70); dataAll.push(workerAll); } ); function toPercent(val, index) { return round(val / dataAll[index]*100, 2); } const result = { labels: labels, datasets: [ {label: '50代', data: data50.map(toPercent)}, {label: '60代', data: data60.map(toPercent)}, {label: '70歳以上', data: data70.map(toPercent)} ] }; Browser.msgBox(JSON.stringify(result)); } // https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/round function round(number, precision) { var shift = function (number, precision, reverseShift) { if (reverseShift) { precision = -precision; } var numArray = ("" + number).split("e"); return +(numArray[0] + "e" + (numArray[1] ? (+numArray[1] + precision) : precision)); }; return shift(Math.round(shift(number, precision, false)), precision, true); }
他でも使えるテンプレートとしては下記のような感じ。
function myFunction() { const sheet = SpreadsheetApp.getActiveSheet(); const rows = sheet.getSheetValues(1, 1, sheet.getLastRow(), sheet.getLastColumn()); const result = {} rows.forEach( function(cols, index) { // いろいろやってresultにいれてく } ); Browser.msgBox(JSON.stringify(result));
出力結果を他のシートの書き出す方法なんかもあるんですが、今回は手軽にBrowser.msgBoxを使いました。
実行してシートに戻るとこんな感じで出力されてるので、コピペして使います。
まだ途中だけどこんな感じでChart.jsで表示できました。
色パターンはデフォルトだとグレーなので、一旦こちらのを使いました。あとでデザイナーの方にいい感じにしてもらいます。
colorbrewer2.org