異常気象時みんな天気系APIを叩いてる説


背景

春もたけなわのこの頃ですが,陽春の候・春爛漫の候・花冷えの候・春眠暁を覚えずと申しますがいかがお過ごしでしょうか.

つまり

近年は春をすっとばして急に夏になったなんてよくいいます.
また急に暑くなったと思えばまた寒くなったり...
そんな気候でニュースなんかにもなってしまったら,そうですよね,天気系APIでなんかしたくなりますよね.
そうゆうことで,この記事では例年とかけ離れた気温だったり,前日との気温差が激しかったりしたとき
皆どれくらい天気APIでなんかしているかを見れればなぁと思って記事にしました.

定義

異常気象とはここでは,気象庁で公開されている1981〜2010年の30年平均値から差分が大きいほど異常とします.
データがあるのでまずはこれで試します.
https://www.data.jma.go.jp/cpdinfo/temp/list/mon_jpn.html

天気系APIを叩いてるとは,Qiitaで「天気」のキーワードでの検索結果数とします.
本当は天気系APIのトラフィックとか見れればいいんですけどねぇ
もしくは天気系APIのURLで検索とかでもいいかも...
まぁ関心度ということで
QiitaAPIはこちらを参考にしました
https://qiita.com/api/v2/docs

期待される結果,目的

最終的にエクセルにてグラフで表示しようかと思います.
そこから人間の目で考察します.

実装

環境

node v12.3.1
csv v5.1.1 (nodeライブラリ)

サンプルコード

index.js
const request = require("request");
const fs = require("fs");
const csvParse = require("csv-parse/lib/sync");
const csvStr = require("csv-stringify/lib/sync");

// 開発時用にapiからのデータをjsonで保存
// 1時間に60リクエストまでなので
// getQiitaItems("天気", function(data) {
//   console.log(data.length);
//   fs.writeFile("test.json", JSON.stringify(data));
// });
// return 0;

let outputCsv = [["年月", "平均気温", "Qiita投稿数"]];

// 気象庁からの気温データcsvファイルの読み込み
let tempData = csvParse(fs.readFileSync("temp.csv"));

// qiita記事の天気に関する記事読み込み
// 開発用にローカルjsonファイルの読み込み
let articleData = JSON.parse(fs.readFileSync("test.json"));

// api使用バージョン
// getQiitaItems("天気", function (articleData) {
// });

// 一番古い記事の日付取得
let date = new Date(articleData[articleData.length - 1].created_at);

// 今月まで回す
while (formatDate(date, "yyyy-MM") != "2019-05") {
  let temp = getTemperature(date, tempData);
  let articleNum = getArticleNum(date, articleData);

  console.log(formatDate(date, "yyyy-MM") + " : " + temp + " : " + articleNum);

  outputCsv.push([formatDate(date, "yyyy-MM"), temp, articleNum]);
  // 次のループは翌月のデータ
  date.setMonth(date.getMonth() + 1);
}

// csvファイル出力
fs.writeFileSync("output.csv", csvStr(outputCsv));

function getTemperature(date, tempData) {
  // エラー処理したい
  let row = tempData[date.getFullYear() - 1897];
  return row[date.getMonth() + 1];
}

function getArticleNum(date, articleData) {
  let num = 0;
  for (let i = 0; i < articleData.length; i++) {
    if (articleData[i].created_at.slice(0, 7) == formatDate(date, "yyyy-MM")) {
      num++;
    }
  }
  return num;
}

function getQiitaItems(query, cb) {
  let resData = [];
  let page = 1;
  requestQiitaItems(page);

  function requestQiitaItems(page) {
    let uri =
      "https://qiita.com/api/v2/items?page=" + page + "&per_page=100&query=";
    uri += encodeURIComponent(query);

    console.log("request " + page + "times : uri=" + uri);
    request(uri, itemsCb);
  }

  function itemsCb(err, res, body) {
    if (err) {
      return err;
    }

    // console.log(res.headers.link);
    const info = JSON.parse(body);
    resData = resData.concat(info);

    if (info.length < 100) {
      cb(resData);
    } else {
      page++;
      requestQiitaItems(page);
    }
  }
}

// date: 日付オブジェクト
// format: 書式フォーマット
function formatDate(date, format) {
  format = format.replace(/yyyy/g, date.getFullYear());
  format = format.replace(/MM/g, ("0" + (date.getMonth() + 1)).slice(-2));
  format = format.replace(/dd/g, ("0" + date.getDate()).slice(-2));
  format = format.replace(/HH/g, ("0" + date.getHours()).slice(-2));
  format = format.replace(/mm/g, ("0" + date.getMinutes()).slice(-2));
  format = format.replace(/ss/g, ("0" + date.getSeconds()).slice(-2));
  format = format.replace(/SSS/g, ("00" + date.getMilliseconds()).slice(-3));
  return format;
}

開発時はQiitaAPIを実行しすぎるのもなんなので最初の方のコメントされているあたりで一回JSONに保存しています.
日付フォーマット参考:https://zukucode.com/2017/04/javascript-date-format.html

結果

実行後出力される「output.csv」をエクセルなどで開いてグラフにしてみました.

考察

やはりアドベントカレンダーの影響でしょうか,まず目につくのは12月に投稿数がかなり増えますね.
12月を除くと,2017年6月,8月の投稿数が増えています.(青い棒グラフ)その前の月5月と7月が例年より月の平均気温が高くなってます.(オレンジの線グラフ)
ですが,2018年3月も同じくらい平均気温が高いのに対し,それほど投稿数は増えていません.
2018年10月も投稿数は増えていますが,特に平均気温は例年に近い数値です.
結果相関はあまり見られない気がします.

なんかもっとこうしたかった,このほうがいいじゃん

今回は月毎の例年との平均気温でしたが,もしかしたら前日との気温差なんかでも見れるかもしれません.
「天気」のキーワードだけだと弱いかな.気象とか色々変えてみようかな(ちなみに天気タグもあるのですが,投稿数が...)
Qiita投稿数よりもTwitter投稿数のほうが....
また,相関係数も出すようにしていけば,もっと客観的になれたかも.
chartjsを利用すればエクセル使わずに完結できたなぁ.
python使ってもいいよなぁ...
JSONファイルもクエリ名かなんかでファイル持っておいて,そのファイルがなければAPIを叩いてファイル作成などやれたらなぁ

やはり説を見えるようにするって楽しいですね,今後も改善していけたらなと思います.