注目の投稿

【kepler.gl】コロナ対策による人流の変化も地図上に可視化(各種メディアで報道)

kepler.glのサイト画面 kepler.glを使ってコロナ対策の効果を分析したところ、テレビ、新聞、ネットのメディアから問い合わせや報道依頼が殺到。今も、土日返上で都内や全国の人流変化を分析しています。この記事では人流変化の可視化に便利なkepler.glにつ...

2020年3月29日日曜日

【kepler.gl】コロナ対策による人流の変化も地図上に可視化(各種メディアで報道)

kepler.glのサイト画面

kepler.glを使ってコロナ対策の効果を分析したところ、テレビ、新聞、ネットのメディアから問い合わせや報道依頼が殺到。今も、土日返上で都内や全国の人流変化を分析しています。この記事では人流変化の可視化に便利なkepler.glについて簡単に紹介します。


◇kepler.glとは何か?

緯度経度などの空間データを可視化できるブラウザベースの地理情報システムです。開発はUber社がしており誰でもアカウント不要で利用することができます。緯度経度などを含むcsvファイルを用意するだけで空間データをマップ上に可視化できます。

◇kepler.glの良いところ


◇注意点

  • 密度や3D図での濃さや高さは、そのデータでの最大値をmaxとして表現してるっぽいので、異なるデータを比較する際は、予めそれぞれのデータに最大値となるログを挿入しておく必要がある。ただ、動画として表現するときは、時間単位に調整用のデータを差し込まないと調整データがない部分の高さが調整されない。その場合は、1分ごとに任意地点のデータを差し込むなどの方法がある(【BigQuery】1分毎に1レコード生成するクエリ)。

◇ケプラーのサイト


◇ケプラーでコロナ対策の人流効果を可視化した例(各種メディア報道)

覚えている限りですが下記のメディアで取り上げて頂きました。




◇参考サイト


【BigQuery】連続ログイン日数とその期間の最初と最後のログイン日を集計するクエリ

日次で連続してログインや訪問しているユーザの日数とその連続する期間の最初の日と最後の日を集計するクエリ。連続ログインが途切れて再度ログインした際は、別の期間として新たに集計。急いで書いたから読みにくい。。

◇クエリ例

WITH
  stays_table AS (
  SELECT
    *,
    CASE
      WHEN visit_date != DATE_ADD(lag_visit_date, INTERVAL 1 DAY) THEN 1
    ELSE
    0
  END
    AS not_continuous_flg
  FROM (
      --ユーザ毎の日付昇順での前回のデータを入れる項目の作成
    SELECT
      userid,
      visit_date,
      LAG(userid,1) OVER (PARTITION BY userid ORDER BY visit_date) AS lag_user_id,
      LAG(visit_date,1) OVER (PARTITION BY userid ORDER BY visit_date) AS lag_visit_date
    FROM (
      SELECT
        userid,
        DATE(TIMESTAMP(jpn_day)) AS visit_date
      FROM
        `data`
      GROUP BY
        userid,
        visit_date ) ) ),
  flg_cum AS(
  SELECT
    *,
    SUM(not_continuous_flg) OVER (PARTITION BY userid ORDER BY visit_date) AS cum_not_cont_date_flg
  FROM
    stays_table ),
  t1 AS (
  SELECT
    *,
    COUNT(cum_not_cont_date_flg) OVER (PARTITION BY userid, cum_not_cont_date_flg ORDER BY cum_not_cont_date_flg) AS cnt
  FROM
    flg_cum ),
  t00 AS (
    --00グループ:初回
  SELECT
    userid,
    not_continuous_flg,
    cum_not_cont_date_flg,
    MAX(cnt) AS stay_days,
    MIN(visit_date) AS first_loginday
  FROM
    t1
  WHERE
    t1.not_continuous_flg = 0
    AND t1.cum_not_cont_date_flg = 0
  GROUP BY
    userid,
    not_continuous_flg,
    cum_not_cont_date_flg,
    cnt
  ORDER BY
    userid ),
  t11 AS (
    --1と1以上グループ:2回目以降
  SELECT
    userid,
    not_continuous_flg,
    cum_not_cont_date_flg,
    MAX(cnt) AS stay_days,
    MIN(visit_date) AS first_loginday
  FROM
    t1
  WHERE
    t1.not_continuous_flg = 1
    AND t1.cum_not_cont_date_flg > 0
  GROUP BY
    userid,
    not_continuous_flg,
    cum_not_cont_date_flg,
    cnt
  ORDER BY
    userid,
    not_continuous_flg,
    cum_not_cont_date_flg ),
  x1 AS (
  SELECT
    userid,
    cum_not_cont_date_flg,
    stay_days,
    first_loginday
  FROM
    t00
  UNION ALL
  SELECT
    userid,
    cum_not_cont_date_flg,
    stay_days,
    first_loginday
  FROM
    t11 ),
  x2 AS (
  SELECT
    userid,
    cum_not_cont_date_flg,
    stay_days,
    first_loginday
  FROM
    x1
  GROUP BY
    userid,
    cum_not_cont_date_flg,
    stay_days,
    first_loginday
  ORDER BY
    userid,
    cum_not_cont_date_flg,
    stay_days,
    first_loginday )
SELECT
  userid,
  cum_not_cont_date_flg,
  stay_days,
  first_loginday,
  DATE_ADD(first_loginday, INTERVAL stay_days - 1 DAY) AS last_loginday
FROM
  x2

◇参考サイト





【BigQuery】よく使うクエリ構文

よく使う構文


  • DATE():タイムスタンプの時間を日次(例:2020/1/1)に変換
  • TIMESTAMP():文字列の日付をタイムスタンプに変換
  • EXTRACT(DAYOFWEEK FROM ***):タイムスタンプから曜日を抽出(日曜:1~土曜7:)
  • CAST(FORMAT_TIMESTAMP("%H", ***) AS int64) :タイムスタンプ(***)から時間を抽出
  • _TABLE_SUFFIX BETWEEN '***' AND '***':複数のテーブルを指定の範囲から参照する
  • ST_DWITHIN(ST_GeogPoint(139.***,  35.***), ST_GeogPoint(longitude,latitude),500):経度(139.***, longitude)、緯度(35.***, latitude)が指定した範囲内(500m)であれば抽出


◇クエリ例

SELECT
--文字列の日付をタイムスタンプに変換して日次のみ抽出
  DATE(TIMESTAMP(time),'Asia/Tokyo') AS date,
--曜日を抽出:日曜 1 ~ 7 土曜
  EXTRACT(DAYOFWEEK
    FROM
      jpn_day ) AS youbi,
--時間を抽出
  CAST(FORMAT_TIMESTAMP("%H", TIMESTAMP(time)) AS int64) AS hour
FROM
  `data*`
WHERE
  --data[*]部分を指定したテーブルを参照
  _TABLE_SUFFIX BETWEEN '20200201'
  AND '2020203'
  --標準時間を日本時間に変換して期間を指定
  AND TIMESTAMP(DATETIME(TIMESTAMP(time),
      'Asia/Tokyo')) >= TIMESTAMP('2020-02-01 00:00:00')
  AND TIMESTAMP(DATETIME(TIMESTAMP(time),
      'Asia/Tokyo')) < TIMESTAMP('2020-02-03 00:00:00')
  --指定の緯度経度より500m以内,緯度: 35.*** 経度: 139.***
  AND ST_DWITHIN(ST_GeogPoint(139.***,
      35.***),
    ST_GeogPoint(longitude,
      latitude),
    500)