注目の投稿

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

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

2017年7月19日水曜日

R "rbindlist(l, use.names, fill, idcol) でエラー: "の解決法

もし、rbindを実行し下記のエラーとなったら(rbindとは)、

>  dt.log <- dt.log="" dt.log_2="" rbind="" span=""> 
 Show Traceback

 Rerun with Debug
 rbindlist(l, use.names, fill, idcol) でエラー:
  Class attributes at column 10 of input list at position 2 does not match with column 10 of input list at position 1. Coercion of objects of class 'factor' alone is handled internally by rbind/rbindlist at the moment.


↓連結したいデータをdata.frameで読み込むと解決

>  dt.log <- data.frame="" dt.log="" dt.log_2="" rbind="">
 


今回のエラーは、連結したいデータがdata.tableでデータ量が多い(100万レコード以上くらい)ときに起きがち


2017年7月3日月曜日

R write関数で何ができたっけ?

Rでファイルを出力する際、「あれ、行番号を削除する命令なんだっけ?」とか、「引用符(”:ダブルクオーテーションマーク)を外すのはどうするんだっけ?」とかついど忘れしがち。

そんなときは、Rのマニュアルを見てみよう!
なるほど、行番号はrow.names、引用符はquoteだな。ふむふむ。。

write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
            eol = "\n", na = "NA", dec = ".", row.names = TRUE,
            col.names = TRUE, qmethod = c("escape", "double"),
            fileEncoding = "")

write.csv(...)
write.csv2(...)

詳細は参考サイトにて

参考サイト


2017年6月24日土曜日

【R】 ‘Rcpp’ という名前のパッケージはありません

新しいPCを購入し、早速、RとRStudioをインストール。

dplyrをインストールして、いろいろ分析しようと思ったら、

  • ‘Rcpp’ という名前のパッケージはありません

というエラー!あれっ?

結局、McAfeeを停止したら解決。

マカフィー。。。

ちなみに、マカフィーの停止方法は、
富士通のQAがわかりやすい。




2017年6月10日土曜日

【R】日付から曜日を簡単に取得する方法

議員会館内(本文に関係なし)

◇あらすじ

久しぶりの投稿。転職後、仕事が忙しすぎて趣味で分析する気が全くわかず、完全にブログを放置。しかし、最近、仕事で売り上げの予測モデルを構築することがあり、これが(不確定要素や未知の変数が多そうな割に)結構良い感じの精度だった。それが契機となり、(学生の頃、半年後の為替を予測するコンテストで全国2位になった経験を活かしつつ?)株価の予測モデルを考えてみたくなってきた。ただ、モデル構築にはデータが必要。説明変数もなるべく多くあった方が良い。幸い日時の株価のデータはググれば簡単に手に入る。しかし、当然ながら欲しいデータがない場合もある。例えば、曜日とか(株価予測にどれくらい影響あるかはまだ調べてないけど)。。ただ、曜日についは日付データがあればRで簡単に取得できることが分かったので、その方法をご紹介。

◇ここから本題

目的:日付から曜日を取得
方法:weekdays(dt.data$time)
補足:株価データの取得先(http://k-db.com/stocks/

・方法

> #データを読み込む
> dt.data <- read.csv(file("stocks_8411-T_1d_2017.csv",encoding = 'cp932'))
>
> #一部データの表示(こんなデータ)
> head(dt.data)
        日付  始値  高値  安値  終値    出来高    売買代金
1 2017-06-09 198.9 200.4 198.1 199.7 156941400 31296039870
2 2017-06-08 198.3 200.5 197.2 197.4 173075000 34342113170
3 2017-06-07 196.0 197.7 195.2 197.0 105695500 20771395690
4 2017-06-06 197.0 198.6 196.3 196.7  99978900 19742685840
5 2017-06-05 197.6 197.9 196.4 197.0 106257500 20945506730
6 2017-06-02 195.1 200.9 195.0 200.1 175604300 34933279840
>
> #日付をオブジェクト化しないとエラーが出る
> weekdays(dt.data$日付)
 UseMethod("weekdays") でエラー:
   'weekdays' をクラス "factor" のオブジェクトに適用できるようなメソッドがありません
>
> #日付をas.POSIXltでオブジェクト化(as.DATEでも良い)
> dt.data$time <- as.POSIXlt(dt.data$日付, format="%Y-%m-%d")
>
> #曜日を取得
> dt.data$weekdays <- weekdays(dt.data$time)
>
> #結果
> head(dt.data)
        日付  始値  高値  安値  終値    出来高    売買代金       time weekdays
1 2017-06-09 198.9 200.4 198.1 199.7 156941400 31296039870 2017-06-09   金曜日
2 2017-06-08 198.3 200.5 197.2 197.4 173075000 34342113170 2017-06-08   木曜日
3 2017-06-07 196.0 197.7 195.2 197.0 105695500 20771395690 2017-06-07   水曜日
4 2017-06-06 197.0 198.6 196.3 196.7  99978900 19742685840 2017-06-06   火曜日
5 2017-06-05 197.6 197.9 196.4 197.0 106257500 20945506730 2017-06-05   月曜日
6 2017-06-02 195.1 200.9 195.0 200.1 175604300 34933279840 2017-06-02   金曜日
>

◇その他:日付関連の投稿



つぶやき
メモリ32GB以上のノートPCほしいなー。重さ800g以下で。。


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