注目の投稿

【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)


2020年1月19日日曜日

【BigQuery】複雑な緯度経度の範囲を指定する方法

方法は?

WHERE文に下記の命令を記載するだけ。緯度経度は10進数。最後に、最初に指定した「経度1 緯度1」を入力することで範囲が閉じられる。

ST_COVERS(ST_GEOGFROMTEXT('POLYGON((経度1 緯度1,経度2 緯度2,~,経度1 緯度1))'),
ST_GEOGPOINT(経度のカラム名,緯度のカラム名))

SELECT
  time,latitude,longitude
FROM
  data
WHERE
  --error回避のため日本の範囲を指定
  latitude BETWEEN 23
  AND 46
  AND longitude BETWEEN 123
  AND 148
  --複雑な範囲を指定 
  AND ST_COVERS(ST_GEOGFROMTEXT('POLYGON((139.598915 35.687744,
    139.598909 35.687584,139.598915 35.687744))'),
    ST_GEOGPOINT(longitude,
      latitude))

エラー回避(ST_GeogPoint failed: Latitude must be between -90 and 90 degrees.)のために日本の範囲を先に指定している。

参考サイト


2020年1月5日日曜日

【トレジャーデータ:presto】任意の値や文字列を入れた列をつくる方法

入れたい値 AS 新しい列名
とすることで任意の値を入れた列を作ることができる。


  • 数字の場合

SELECT
1 AS x
FROM data_table


  • 文字列の場合

SELECT
'なにか' AS x
FROM data_table


2020年1月1日水曜日

【2020年】明けましておめでとうございます。

明けましておめでとうございます。

昨年は、ドコモに残るかメルカリでサービスのグロースやっていくかunerryで新たなチャレンジするかを決める決断の年でした。決断にあたり多くの方にアドバイスを頂きました。この場をかりて御礼申し上げます。

決断の結果、今日からunerryの社員になります。unerryでは、リアルとネットのデータ連携の推進やリアルとネットのデータを統合した新たなデータサービスやプロダクトの研究開発を進めていきます。

今までは個別のサービスのグロースを考えてきましたが、これからは社会全体やユーザ一人ひとりの生活の向上を考えた仕事をしたいと思っています。

本年もどうぞよろしくお願い申し上げます。

(データ連携のご相談いつでも歓迎!)

おまけ
ビーコンユーザだいたい友だち




2019年11月26日火曜日

【トレジャーデータ】トレジャーデータの結果をタブローオンラインに出力する

トレジャーデータの結果をタブローに出力

トレジャーデータ(treasure data)の結果をタブローオンライン(tableau online)に出力する方法をご紹介します。できてみればすごい簡単なんですが、私自身は何も知らずにやった結果、いろいろ調べたりエラーに振り回されて結構時間かかってしまいました。。

1.Catalogからtableauを選択してAuthenticationsを作成

catalogからtableauを選択
トレジャーデータにログインして、catalogからtableauを選択します。

2.ホスト名とタブローのログイン情報を入力

Server versionで「Tableau Online」を選択

タブローオンラインにログインした際のURLとして下記のものがあるとします。

https://*****.online.tableau.com/#/site/*この部分はサイトID*/home

ここでホスト名は、「*****.online.tableau.com」です。UsernameとPasswordは、タブローにログインするものと同じです。Use SSL?とVerify server certificate?は任意でチェックしてください。今回は、タブローオンラインに出力するので、Server versionをTableau Onlineにします。

3.Export Results To に上記で作ったAuthenticationsを選択

上記作成のAuthentications「test_tableau_online」を選択
SQLの出力先として上記で作成したtest_tableau_online(名前は任意)を選択します。

4.Export Resultsの内容を設定する

Site IDに注意

ここでエラーが沢山でて苦労しました(泣)。Site IDのところですが、TDのサイトに「Site ID The URL of the site to sign in to, it’s required for Tableau Online」と記載されていたので、URL全部書くのかなと勘違いしてエラー([ERROR] (main): HTTP 301 Moved Permanently)が出まくりました。実際は、下記のタブローオンラインのURLを例にすると、site直下の「*この部分はサイトID*」がSite IDになります。

https://*****.online.tableau.com/#/site/*この部分はサイトID*/home

5.トレジャーデータでSQLを実行するとタブローにデータが出力されます

もし、401エラー([ERROR] (main): HTTP 401 Unauthorized)が出たら下記の原因が考えられます。

  • authentication設定画面で、host, user, passwordなどが間違っていた場合
  • result output設定画面で、datasource, site, project nameが間違っていた場合
  • tableau側でprojectとdatasourceの権限設定により発生する場合
私の場合は、hostとsiteの設定が正しくなくてエラーが出まくりました。。

補足

tableauはタイムスタンプ型でないと時間データとして扱うことができません。そこで、CASTでタイムスタンプ型に変換します。

例:時間文字列(例:2019-10-17 08:21:36)をCASTでタイムスタンプ型に変換するクエリ

SELECT 
  CAST(
    time AS TIMESTAMP
  ) AS "time"
FROM
  log LIMIT 1


参考サイト