注目の投稿

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

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

2017年3月25日土曜日

DMPを構築する上で重要なこと ~ユーザID編~

ユーザベースの分析から可視化されたインターネット上の行動ネットワーク

DMPを構築する上で重要なことは、ユーザを一意に識別するIDの付与基盤。これが無いとユーザベースの分析は不可能だ。もし、会員情報がとれている場合はその会員IDを用いればいい。しかし、そうした会員IDがない場合やログインしてない場合のユーザ行動を把握するには、どのようにすればよいだろうか?

現在、ユーザーIDを付与する基盤として、インティメートマージャー社のIMIDなどがある。同社には、電通なども資本を投下しており、今後成長が期待される。しかし、IMIDでサファリユーザを分析するとPV数イコールUU数となる。つまり、日本で高いシェアを持つiPhoneユーザの多くを補足できないという問題がある。理由は、アップル社がサードパーティーのクッキー利用を制限しているため、ファーストとサードパーティーのクッキーシンクがうまくできないからだ(と考えられる)。そして、その制限は、今後はさらに厳しくなることが予想される。

ではどうすべきか?発想を変えてみよう。ユーザのクッキーを取得して内部で照合するのではなく、ユーザのファーストのクッキーにIDを付与する。こうすれば、ファーストのクッキーに記録されているIDがそのままユーザを識別するIDになるため、クッキーシンクの問題は解消される。また、ファーストのクッキーにIDを付与するため、クッキーが削除されない限り、すべての閲覧行動をユーザベースで把握することができる(もちろん、アクセスログをとっていればだが)。

前職でユーザIDのインフラ化に向けた事業を一度提案したが、企業の成長ステージや規模の問題、そして、すぐに収益が上がらない点等を考慮して自ら取り下げた。しかし、個人的には将来のデータ活用の根幹を形成する極めて魅力的な事業だと思っているので、再度チャレンジしたい。


◇参考サイト

2017年3月15日水曜日

【R:自分用】クロス集計、ロジスティック、決定木、コレスポンデンス

#ライブラリを読み込む
library(dplyr)
library(data.table)
library(tidyr)
#
library(rpart) #決定木用
library(rpart.plot) #決定木用
library(partykit) #決定木作図用
#
library(MASS) #コレスポンデンス分析用
library(factoextra) #作図用

#cross集計
dt.cross <- dt.log %>%
  group_by(user_id,name) %>%
  summarise(n=max(value)) %>%
  spread(name,n)
dt.cross[is.na(dt.cross)] <- 0 #NAを0にする

#上記クロス集計に目的変数をjoin
dt.buy_next <- dt.log_next %>%
  group_by(user_id) %>%
  summarise(count = length(user_id))
dt.for_model <- left_join(dt.cross, dt.buy_next, by = "user_id")
dt.for_model$user_id <- NULL
dt.for_model[is.na(dt.for_logit)] <- 0 #NAを0にする

#ロジスティック分析
result <- glm(count ~ .,data = dt.for_model)
summary(result)

#出力
write.csv(summary(result)$coefficients[,"Estimate"],
          "C:/logit_Estimate.csv")
write.csv(summary(result)$coefficients[,"Pr(>|t|)"],
          "C:/logit_Pvalue.csv")

#---
#決定木
#method = "class" yが質的変数 cpは破線と交わる値が理想だが目的に合わせて適時設定
result.tree <- rpart(count ~., data = dt.cross_model, method = "class",cp = 0.002)
print(result.tree)
#検証
printcp(result.tree)
plotcp(result.tree)
#
#作図
plot(as.party(result.tree))


#---
#コレスポンデンス分析
#nfは軸を意味する
result.1 <- corresp(tmp, nf=3)
#
#write results:任意の場所に書き出す
write.csv(result.1$rs,
          "C:/result_1_rs.csv")
write.csv(result.1$cs,
          "C:/result_1_cs.csv")
#
#作図
#一般的な図
#biplot(result.1, xlim = c(-0.8, 0.8), ylim = c(-0.6, 0.6))
#少し見栄えの良い図
fviz_ca_biplot(result.1) + theme_minimal(base_size = 12)
#
#寄与率
result.1.koyuti <- result.1$cor^2
sum(result.1.koyuti)
kiyoritu <- 100*result.1.koyuti / sum(result.1.koyuti)
kiyoritu

2017年3月8日水曜日

【R:最速入門】インストールから外部結合までを30分以内で!?

RStudioで外部結合のコードを実行したときの画面。エディタのデザインはオプションで自由に変えられる。下記の順序で進めれば、Rが初めてでもインストールから外部結合をできる環境を構築するまで30分もかからずにできる(と思います)。

◇ちょっと背景

愛用のMacBook Airが壊れてしまい、新たにWindows PC(MB-B502E)を購入。価格は約4万円と安いが、少々もっさり。。でも、ボーナスまでこれで耐え忍ぶしかない!

◇ということで、新しいPCに「R」をインストール!

  • まずはRのサイトにいく(Rのサイト:OS選択画面
  • Download R for Windowsをクリック
    OS選択画面:Windowsをクリックする
  • base 又は install R for the first timeをクリック
    独自のRを構築したい人以外はbaseでOK
  • Download R 3.3.3 for Windowsをクリック
    バージョンは2017/03/08時点のもの
  • ファイルをダウンロードして実行すると、言語の選択を求められる。今回は日本語で
    日本語を選択
  • 次へをクリック
    インストールの開始
  • 説明を読んで次へをクリック
    読んだことない。。
  • 次へをクリック
    インストール先を変更したい方はどうぞ
  • 次へをクリック
    OSが64bitの方は32bitいらないかも
  • 次へをクリック
    デフォルトで問題なし
  • 次へをクリック
    そのままでOK
  • 次へをクリック
    ただ、R Studio使うのでデスクトップにアイコン無くてもOK
  • インストールされます
    インストール中
  • Rのインストールは完了です
    完了画面
  • Rを起動。一応、これでも使えるが、コンソールからコードを書くのは大変面倒で作業効率が極めて悪い。そのため、R Studioをインストール。
    これでも使えるが作業効率悪い
  • R Studioのサイトにいく(R StudioのHP
  • Download RStudioをクリック
    下の方にもダウンロードのリンクがある
  • 一番左の「RStudio Desktop Open Source License」をダウンロード
    バージョン選択画面
  • 「RStudio 1.0.136 - Windows Vista/7/8/10」をクリック
    クリック後、ファイルがダウンロードされる
  • 次へをクリック
    ダウンロードしたファイル実行するとセットアップがはじまる
  • 次へをクリック
    必要に応じてインストールフォルダを変更できる
  • インストールをクリック
    ショートカットを作成しないこともできる
  • 完了をクリック
    これで終わり
  • RStudioを起動するとこんな感じ
    コンソール画面が出てくるがここにコードは基本書かない
  • 左上のFileからNew Fileを選択してR Scriptを開く
    このR Scriptで作成したファイルにコードを書いていく
  • 実際にコードを書いてみた様子
    Rで外部結合をするためのコード
  • 実際のコード

#Rで外部結合するには?left joinとright joinを

#パッケージインストール
install.packages("data.table")
install.packages("dplyr")

#インストールしたパッケージを使う
library(data.table)
library(dplyr)

#サンプルデータを作成
v.x <- c(1,2,3)
v.x1 <- c("a","b","c")
v.y <- c(1,2,30)
v.y1 <- c("A","B","C")
#データフレーム型にする(外部結合するため)
df.x <- data.frame(id = v.x, name = v.x1)
df.y <- data.frame(id = v.y, name = v.y1)

#データを表示
df.x
df.y

# left join
left_join(df.x, df.y, by = "id")

# right join
right_join(df.x, df.y, by = "id")



  • 全てのコードを選択してRunをクリック(Sourceでも全コードを実行できるが、実際の作業では部分的に実行する事が多くほとんどRunしか使わない。そのため、ここでもRunを用いた)
  • 実行結果
> #Rで外部結合するには?left joinとright joinを
> #パッケージインストール
> install.packages("data.table")
Installing package into ‘C:/Users/mtsuj/OneDrive/Documents/R/win-library/3.3’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.3/data.table_1.10.4.zip'
Content type 'application/zip' length 1502201 bytes (1.4 MB)
downloaded 1.4 MB

package ‘data.table’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
C:\Users\mtsuj\AppData\Local\Temp\RtmpKsWlwv\downloaded_packages
> install.packages("dplyr")
Installing package into ‘C:/Users/mtsuj/OneDrive/Documents/R/win-library/3.3’
(as ‘lib’ is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.3/dplyr_0.5.0.zip'
Content type 'application/zip' length 2557605 bytes (2.4 MB)
downloaded 2.4 MB

package ‘dplyr’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
C:\Users\mtsuj\AppData\Local\Temp\RtmpKsWlwv\downloaded_packages
> #インストールしたパッケージを使う
> library(data.table)
data.table 1.10.4
  The fastest way to learn (by data.table authors): https://www.datacamp.com/courses/data-analysis-the-data-table-way
  Documentation: ?data.table, example(data.table) and browseVignettes("data.table")
  Release notes, videos and slides: http://r-datatable.com
> library(dplyr)
-----------------------------------------------------------------------------------
data.table + dplyr code now lives in dtplyr.
Please library(dtplyr)!
-----------------------------------------------------------------------------------

 次のパッケージを付け加えます: ‘dplyr’ 

 以下のオブジェクトは ‘package:data.table’ からマスクされています: 

     between, first, last 

 以下のオブジェクトは ‘package:stats’ からマスクされています: 

     filter, lag 

 以下のオブジェクトは ‘package:base’ からマスクされています: 

     intersect, setdiff, setequal, union 

> #サンプルデータを作成
> v.x <- c(1,2,3)
> v.x1 <- c("a","b","c")
> v.y <- c(1,2,30)
> v.y1 <- c("A","B","C")
> #データフレーム型にする(外部結合するため)
> df.x <- data.frame(id = v.x, name = v.x1)
> df.y <- data.frame(id = v.y, name = v.y1)
> #データを表示
> df.x
  id name
1  1    a
2  2    b
3  3    c
> df.y
  id name
1  1    A
2  2    B
3 30    C
> # left join
> left_join(df.x, df.y, by = "id")
  id name.x name.y
1  1      a      A
2  2      b      B
3  3      c   <NA>
> # right join
> right_join(df.x, df.y, by = "id")
  id name.x name.y
1  1      a      A
2  2      b      B
3 30   <NA>      C


参考サイト



新しいPCはこんな感じです
マウスコンピュータのWindows PC(MB-B502E


2017年3月6日月曜日

【送別会】素晴らしい送別会ありがとうございます

送別会の集合写真(旧社長室およびマーケティングビジネス本部の仲間)

今日は現職の最終出社日です。約9ヶ月間と短い間ですが、データ分析の基盤を構築したり、クライアントに新たな分析サービスを提供する事業を立ち上げるなど、大変濃密な時間を過ごすことができました。これも皆様のお力添えのお陰です。心より感謝申し上げます。

萩焼の贈り物
萩焼の贈り物も頂きました。山口県出身なので大変嬉しいです。

入社の時にお世話になった野口さん

最後は一人で撮影


Thank you so much!




【すごい】ルンバに募金箱つけて大学に放つ!?

ルンバ募金の図解

ルンバに募金箱をつけて大学に放ったところ、2729円集まったそうです。。

発想と行動力がすごい!!!


モザイクエンペラーさんのブログ



*データ分析に全く関係ないですが衝撃的だったのでご紹介させて頂きました。

2017年3月3日金曜日

【トレジャーデータ:Presto】SQLでのクロス集計は?caseとmap_aggならどっち?表頭項目を指定しない方法は?

SQLでのクロス集計は?

SQL(Presto)では、CASE式やmap_agg関数を利用してクロス集計をする方法がある。

CASE式の例はこちらを参照(【トレジャーデータ:Presto】各ユーザの曜日別アクセス率を集計してライフスタイルに合ったアプローチをする)。

また、CASE式以外にもmap_agg関数を使う方法もある。
例えば、下記のようなテーブル(access_log)があるとする。timeはタイムスタンプ。

table:access_log
timecategoryuser_id
1488508906経済記事id2140001
1488508907経済記事id2140001
1488508908物理記事id2140002
1488508909医学記事id2140002
1488508910医学記事id2140001
1488508911文学記事id2140003
1488508912物理記事id2140002
...
...
...

そして、下記のようなコードを書く。

SELECT 

  days,

  --集計したいcategoryの項目を指定する

  COUNT(kv['経済記事']) AS "経済記事",

  COUNT(kv['医学記事']) AS "医学記事",

  COUNT(kv['物理記事']) AS "物理記事",

  COUNT(kv['文学記事']) AS "文学記事"

FROM (

    SELECT 

      TD_TIME_FORMAT(time,

        'yyyy-MM-dd','jst') AS days,

      --map集計:キーと値の重複なしペアをつくる

      map_agg(

        category,

        user_id

      ) kv

    FROM

      access_log

    GROUP BY

      TD_TIME_FORMAT(time,

        'yyyy-MM-dd','jst'),

      category,

      user_id

  )

GROUP BY

  days

このコードを実行すると、表側を日次、表頭を各記事カテゴリとするUU(ユニークユーザ数)を集計することができる。(ここで、ユニークユーザ数となる理由は、map_aggでキーと値で重複なしのペアをつくり、そのデータをもとに集計しているため)
 

time経済記事医学記事物理記事文学記事
2017-03-012527
2017-03-02675363
2017-03-0321674
.....
.....
.....

ただ、map_aggでの集計はメモリを多く使うためデータが大きい場合には適さない。実際、数千万レコード以上のデータを対象に集計をした際、メモリ不足となり集計できなかった(エラーをみると80GB以上のメモリを使っていた)。一方、CASE式で同様の集計したところ問題なくできた。

caseとmap_aggならどっち?

結論としては、CASE式。理由は、計算が速く、メモリ消費も抑えることができるため。一方、map_aggはあまり大規模データのクロス集計に適さないと言える(と、思いますがmap_aggを有効に使う方法があれば教えて頂きたいです)。

表頭項目を指定しない方法は?

case、map_aggも共に表頭項目の指定を一つ一つ記載する必要がある。そのため、項目が未知の場合や項目が膨大にある場合には対応が難しい。そこで、表頭項目を指定しなくてもクロス集計できる方法をいろいろ調べた(ネットで2日くらい探索したりTDの中の人に聞いてみた)が、残念ながら見つからなかった。どうやら、SQL以外の方法で集計するしかなさそう。。

Rでは表頭項目を指定しなくてもクロス集計できる

Rではacast(R クロス集計(acast))やspread(R 高速に大規模データのクロス集計をおこなう(tally, spread))を使えば、一つ一つ表頭項目を指定せずにクロス集計できる。特に、spreadは大規模データでも高速に処理できるため大変オススメ。


。。。SQL上で表頭項目の指定を必要としないクロス集計が簡単にできたら良いのに…
一応、TDの中の人にお願いしておきました。


map_aggの参考サイト

 

【トレジャーデータ:Treasure Workflow】Workflow: Example Libraryがアップデート

  Workflow: Example Library がアップデートされたらしい。時間があるときにみてみよ、


ちなみに、Terasure Workflow については下記参照
【トレジャーデータ:Treasure Workflow】今注目のTreasure Workflowとは?その導入手順と活用例(SQL文ループ処理)の紹介


Workflowのアップデートについて(TDのアカウントないと見れないかも)


 その他のアップデートについて(TDのアカウントないと見れないかも)