注目の投稿

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

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

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


参考サイト



2019年11月18日月曜日

【トレジャーデータ:Presto】自動でMAUを集計する(TD_TIME_TRUNC)

トレジャーデータ(Presto)で日数を計算する方法としてTD_TIME_ADDがありますが、月や年単位の計算をサポートしていません。そこで、TD_DATE_TRUNCを使って月単位の期間を指定してMAUを自動で集計する方法を紹介します。

◇TD_DATE_TRUNCの使い方(トレジャーデータサイトより

  1. SELECT
  2.   TD_TIME_FORMAT(time,'yyyy-MM-dd HH:mm:ss','JST') AS t,
  3.   TD_DATE_TRUNC('minute',  time, 'JST' ) AS mnt,
  4.   TD_DATE_TRUNC('hour',    time, 'JST' ) AS h,
  5.   TD_DATE_TRUNC('day',     time, 'JST' ) AS d,
  6.   TD_DATE_TRUNC('week',    time, 'JST' ) AS w,
  7.   TD_DATE_TRUNC('month',   time, 'JST' ) AS m,
  8.   TD_DATE_TRUNC('quarter', time, 'JST' ) AS q,
  9.   TD_DATE_TRUNC('year',    time, 'JST' ) AS y
  10. FROM access_log
  11. WHERE TD_TIME_RANGE(time,'2017-01-15','2017-01-16','JST')
  12. ORDER BY t DESC
  13. LIMIT 1
実行結果(トレジャーデータサイトより

◇TD_DATE_TRUNCを使ったMAU自動集計例

timeは”2019-10-17 08:21:36.000”のような時間文字列を想定。そのため、TD_TIME_PARSEでタイムスタンプに変換しています(TD_TIME_PARSEとは)。また、トレジャーデータのスケジュール機能(TD_SCHEDULED_TIME)で月初に自動で実行するようにしているため、月初の日付に-1dとすることで前月の月初から月末まで集計できるようにしています。

SELECT
  TD_TIME_FORMAT(TD_TIME_PARSE(time,
      'UTC'),
    'yyyy-MM',
    'UTC') AS time,
  COUNT(DISTINCT user_id) AS UU
FROM
  all_beaconlog
WHERE
  TD_TIME_RANGE(TD_TIME_PARSE(time,
      'UTC'),
    TD_DATE_TRUNC('month',
      TD_TIME_ADD(TD_DATE_TRUNC('month',
          TD_SCHEDULED_TIME(),
          'UTC'),
        '-1d'),
      'UTC'),
    TD_DATE_TRUNC('month',
      TD_SCHEDULED_TIME(),
      'UTC'),
    'UTC')
GROUP BY
  TD_TIME_FORMAT(TD_TIME_PARSE(time,
      'UTC'),
    'yyyy-MM',
    'UTC')
ORDER BY
  time


2019年11月17日日曜日

【トレジャーデータ:Presto】cronの設定(任意のスケジュールでSQLを自動実行)

スケジュールをカスタムしたい場合はCronで設定(上記は毎日11時に実行される)
トレジャーデータでは簡単にスケジュールを設定してSQLを実行できる。細かくスケジュールを指定する場合は、Cron(クーロン)で設定する。Cronの設定方法については、下記の通り。

◇トレジャーデータサイトより「Cron(クーロン)
 *    *    *    *    *
 -    -    -    -    -
 |    |    |    |    |
 |    |    |    |    +----- day of week (0 - 6) (Sunday=0)
 |    |    |    +---------- month (1 - 12)
 |    |    +--------------- day of month (1 - 31)
 |    +-------------------- hour (0 - 23)
 +------------------------- min (0 - 59)

本記事トップの画像を例にするとは、「0 11 * * *」とあるのでこの場合は毎日11時に実行される。

◇その他参考サイト




2019年11月9日土曜日

【レトルトカレー】カロリーランキングと美味しさ評価!

左上からカロリー高い順に並べてみた

スーパーでレトルトカレーをたくさん購入

せっかくなので食べた感想を書いてみます

【カロリー1位:美味しさ72点】神田カレーグランプリ第1回優勝のチーズカレー

神田カレーグランプリ第1回優勝のチーズカレー
チーズが想像以上にいっぱい
一口目でチーズのまろやかさとかおりが口全体に広がる感じで衝撃!前半は、その衝撃とともに大変美味しく頂けました。ただ、最初の衝撃が大きいせいか後半はちょっと飽きがくる味でした。某山盛りラーメンのようにたまに食べたくなる味です。

【カロリー2位:美味しさ75点】富良野市場のポークカレー

富良野市場のポークカレー
ジャガイモがまるまる入ってる
まずジャガイモがまるまる入っているのが衝撃的!メインのポークはルーの中に隠れちゃってますがそこそこ大きいのが入っています。味はポークカレーそのもので素朴で落ち着いた味わいです。ガツンとくる味ではないですが、レトルトカレーによくある後味の悪さみたいのはないです。なんとかく健康に良さそうな美味しさでした。

【カロリー3位:美味しさ69点】富良野市場のスープカレー

富良野市場のスープカレー
ジャガイモが思ったより小ぶり

スパイシーだけど落ち着くおいしさ。じゃがいもが思ったより小さくカットされていて残念でしたが、チキンは柔らかくてうまい。スープカレーだからごはんよりもコンキリエとかと一緒に食べたほうがよかったかも。

【カロリー4位:美味しさ63点】信州りんごバター味チキンカレー

信州リンゴバター味チキンカレー
パスタで食べてみた
バターの風味でまろやかな味わい。りんごの味があまり感じなかったのが残念。今回は、写真のようにパスタで食べてみましたが、このカレーはごはんと食べるのがおすすめです!

【カロリー5位:美味しさ70点】函館カレー中辛

函館カレー州から
意外とスパイシー
一口目でほどよいスパイシー感が口の中に広がりおいしい。特に尖ったところはないけど、カレーとして普通においしい。特徴的なカレーに飽きたときに良いかも。レトルトで「普通においしいカレーが食べたい」と思ったときに最適なカレー。

【カロリー6位:美味しさ65点】函館港町カレー中辛

函館港町カレー
具が思ったほど入ってない
パッケージほど具材がなくて少しがっかりでしたが、トマトのほどよい酸味とシーフードのうまみがマイルドに味わえておいしいです。中辛でしたが辛くはなかったです。

【カロリー7位:美味しさ72点】函館カレー中辛

究極の函館カレー
大きな具材がごろごろ
大きな具材がごろごろ入っていて満足感高いです。また、ほかの函館カレーシリーズに比べてスパイシー感がやや高い感じです。後味も変な感じはなく、味も普通においしいです。

残りのカレーはまた今度!


2019年11月6日水曜日

海外からの異常なアクセス

海外からの異常なアクセス


何か異常なアクセスあるから見てみたら、アメリカからだった。

十中八九、リファラースパムだ。

◇参考サイト





2019年11月4日月曜日

【トレジャーデータ】時間文字列をタイムスタンプに変換する(presto)

TD_TIME_PARSEを擬人化してみた

◇TD_TIME_PARSEで時間文字列をタイムスタンプに変換


トレジャーデータ(presto)では、TD_TIME_FORMATという関数で時間を扱います。その際、タイムスタンプが必要ですが、時間文字列だけでデータを貯めている場合もよくあります。そこで、TD_TIME_PARSEを用いて時間文字列をタイムスタンプに変換する方法を紹介します。

◇SQL例


SELECT
  TD_TIME_FORMAT(TD_TIME_PARSE(time,
      'UTC'),
    'yyyy-MM',
    'UTC') AS monthly,
  COUNT(time) AS n,
  COUNT(DISTINCT id) AS id_uu
FROM
  log
GROUP BY
  TD_TIME_FORMAT(TD_TIME_PARSE(time,
      'UTC'),
    'yyyy-MM',
    'UTC')
ORDER BY
  monthly

timeは”2019-10-17 08:21:36.000”のような時間文字列です。このtime(=時間文字列)をTD_TIME_PARSEでタイムスタンプに変換し、TD_TIME_FORMATで扱えるようにしています。例では、月間のデータ量(レコード数)とユニークユーザ数(MAU)を集計しています。

◇参考サイト



2019年11月2日土曜日

【R】Rでfor文を書く(ループの設定)

Rでfor文

  • 目的:Rでfor文を書く
  • 方法:for関数を使う

◇書き方

#for文
for(i in 1:3){ # iを1 ~ 3まで繰り返す
}

◇実行結果

> #for文
> for(i in 1:3){ # 1 ~ 3まで繰り返す
+   print(i) # iを表示する
+ }
[1] 1
[1] 2
[1] 3
>

◇応用:for文を使ってテーブルのデータを増やす

> #xテーブルをつくる
> library(data.table)
> x <- data.table(id = 1) #library(data.table)必要
> x
   id
1:  1
>
> for(i in 2:3){ # 2 ~ 3まで繰り返す
+   y <- data.table(id = i) #id列にiが入るyテーブルを創る
+   x <- rbind(x, y) #xテーブルにyテーブルを連結する
+ }
> x
   id
1:  1
2:  2
3:  3
>

for文を擬人化してみた


2019年10月29日火曜日

【暫定版】長期グロース施策鉄則5か条(2019年10月現在)

長期的にサービスをグロースさせるための施策の鉄則。暫定版

長期グロース施策鉄則5か条 ~施策とは目指したい未来への願い~

  1. 施策は、乱発したりアドホックに実施するものではなく、どのような世の中をつくりたいのか、そのためにどのようにユーザの行動を変容させていくか、これらの明確なビジョンのもと戦略的に実施する
  2. ビジュンに反する施策は、例え短期的に効果を得られるものだとしてもユーザを惑わすため実施しない
  3. 施策は、過去のユーザの行動に最適化するのではなく、ユーザに新たな行動変容を起こさせるために実施する(ビジョン達成まで)
  4. 行動変容は、将来の習慣化を目指して徐々に起こしていく
  5. ビジョン、行動変容の結果がユーザの幸福に寄与しないものはそもそも却下

キングダムの李斯が「法は願い」って言ってたけど、施策も同じ

5番目の「幸福」に関しては人それぞれかもしれないけど、少なくとも健康を害するものは却下

長期グロース施策に関する現時点の備忘録


「鉄則」は言い過ぎたかも。。


2019年10月20日日曜日

【生活備忘録】ゆうちょダイレクトで振り込みができなくなった!?

振り込みがグレーアウトして選択できない(;'∀')

最近、ゆうちょダイレクトで送金しようと思ったら、振込のところがグレーアウトしていてできなかった。。

以前はできてたのにおかしいなーって思い問い合わせた結果、解決したのでメモ

なぜ、振込ができなくなったか?

以前、生体認証でログインできるゆうちょのアプリをスマホにインストールした。これにより、生体認証を利用しない通常のログイン状態の場合、振込のところがグレーアウトして選択できなくなるとのこと。

解決方法

ログインする画面で「生体認証でログイン」をクリックしてログインする。そのあと、生体認証のアプリをインストールしたスマホで生体認証すれば、PCでも振込ができるようになる。つまり、生体認証アプリをインストールしたスマホがないとPCで送金することができない。。

つぶやき

生体認証でパスワード入れる手間が省けた!と思いきや以前より振り込みが面倒になってしまった。。PCにも指紋認証できる機種があるのでそれでもできたらいいのに。

【コロナ】コロナ対策の人流影響を分析してみました


2020/4/24 追記

最近、この記事のアクセスが伸びてると思ったら、Googleで「ゆうちょ 振込できない」と画像検索すると1位に出てくるようになっていました。

【ゆうちょ】Googleで「ゆうしょ 振込できない」と画像検索すると自分の記事が1位に出てきた


【台風19号】緊急災害連絡?のエリアメールがきてスマホがしゃべり出してびっくりした







もってるスマホがいきなりしゃべり出してびっくりしたー




2019年10月13日日曜日

【読書備忘録】価格は予測不可能というファクトを再度確認できる一冊(禁断の市場、2009)

読んだ本『禁断の市場』

フラクタルの視点から教訓(金融10か条)が面白かったのでメモ

  1. 市場価格は乱高下する
  2. 市場は極めてリスクが高い。既存の金融理論では起こりえないリスクが現実には起こる
  3. タイミングが重要。巨額の利益と損失は短期間に集中して起こる
  4. 価格はしばしば不連続にジャンプし、それがリスクを高くする
  5. 市場での時間は、人によって進み方が異なる
  6. いつでもどこでも市場は同じようにふるまう
  7. 市場は不確実であり、バブルは避けられない
  8. 市場は人をだます
  9. 価格の予想は無理だが、ボラティリティなら予測可能
  10. 市場における価値は限定された価値

昔、半年後の為替を予測するコンテストで実績値の2銭差で当てて全国2位になったけど、科学的にはほぼまぐれだな。ただ、過去のデータから変動幅を考慮して予測してたから、ボラティリティを予測するところは科学的には正しかったかな。

価格は予測不可能っていうファクトを再度確認できる一冊


2019年10月3日木曜日

【トレジャーデータ】Import Large Datasetの利用にバグあり(2019/10/03現在)

TDの中の人によると、BigQueryからTDに大量データをインポートする機能(Import Large Dataset)にバグがあるので、使わないほうがよいとのこと(2019年10月3日17時現在)。とはいえ、この機能を使わなくても数百GBは余裕でimportできるから問題ないか。

□Import Large Dataset
Use Google Cloud Storage to improve performance of importing large datasets

BQ→TDにデータをインポートする際、Import Lage Datasetにチェックを入れると大量データを高速にインポートできる。ちなみに、"Large"の基準はおおよそ500MB。

参考サイト
https://support.treasuredata.com/hc/en-us/articles/360001647267-Data-Connector-for-Google-BigQuery

2019年8月6日火曜日

【最近思うこと】普通に生活しているだけなのに何故かみんなが幸福になる社会の実現はそんなに難しくない!?

ポエムな記事。


研究で得た知見(べき分布やシミュレーション、行動経済学、複雑系など)を元にデータを活用してサービスをグロースさせることが現実に可能なことを民間企業で最初に経験できたことが今の自分(データサイエンティスト)の原点になってる。


最初はグロースのことしか考えてなかったけど、いろいろ経験していく中で、これからはグロースだけでなく、サービスを通して行動変容を促進し世の中の規範や慣習を少しづつ変えて豊かっぽい社会(至極普通に生活しているだけで個人と全体の幸福がなぜか高まっていく世界)を実現していきたい、という思いが強くなってる。


幸福の定義は難しそうな感じもするけど、流動性の増大≒幸福の増大と仮定(多様な価値を持つ人々が多様な商品を交換することで価値の総量が増大するという塩沢先生の理論参照)すれば、その指標化は可能そうだしその指標を高める施策はいくらでも設計できそうだから自分的には豊かっぽい社会の実現はそんなに難しくない。と、最近思いがち。


データ分析ポエムでした。



2019年7月12日金曜日

R 任意の行でデータを分割

【目的】 任意の行でデータを分割する
【方法】 データ名[最初の行:最後の行]

#テスト用データを作成

library(data.table)  #データテーブル作成のために読み込む

> data <- data.table(No = 1:10,random = runif(10, min = 0, max = 1))
> data
    No      random
 1:  1 0.301603490
 2:  2 0.745845367
 3:  3 0.559383677
 4:  4 0.737294025
 5:  5 0.525487942
 6:  6 0.361071876
 7:  7 0.259251202
 8:  8 0.002998326
 9:  9 0.909486709
10: 10 0.895856187

*runifで0~1までの実数をランダムに生成

#3行目までを分割する

> data_a <- data[1:3]
> data_a
   No    random
1:  1 0.3016035
2:  2 0.7458454
3:  3 0.5593837

あれ、randomの値が四捨五入されてる??

#dataを半分に分割する

*lengthでベクトルの長さが分かるのでそれを2で割れば半分に分割できる

> data_1 <- data[1:(length(data$random)/2)]
> data_2 <- data[(length(data$random)/2+1):(length(data$random))]
> data_1
   No    random
1:  1 0.3016035
2:  2 0.7458454
3:  3 0.5593837
4:  4 0.7372940
5:  5 0.5254879
> data_2
   No      random
1:  6 0.361071876
2:  7 0.259251202
3:  8 0.002998326
4:  9 0.909486709
5: 10 0.895856187
>

data_1は四捨五入されてるけど、data_2は元の値だ。なぜ??

2019年7月6日土曜日

【動画紹介】Exploratory: 決定木の紹介と使い方



役立ち動画発見!

データ分析の目的から決定木の説明に入るので、なぜ決定木を使う必要があるのかが良く分かる


動画の流れ


  • データ分析とは、「相関」、「パターン」を見つけること
  • たくさんデータがあると一つ一つ関係を見ていくのは大変
  • 機械学習(決定木など)で「相関」や「パターン」のあてを見つける
  • 決定木とは何か?どのように木を作るか?などを紹介

木をどうやって作るかはあまり説明されないことが多いけど、不純度(Gini Iimpurity)を減らすことで、木を作っているという説明もちゃんとされていてナイス!

ちなみに、不純度は、データにどれだけ値が混ざっているかを示す指標で、1から各サンプル数の割合を二乗したものを引いたもの

例:6人のうち2人が大人、4人が子供の場合

不純度 = 1 - (2/6)^2 - (4/6)^2

^2は二乗の意味