as.Dateするときはタイムゾーンをちゃんと指定しよう問題

POSIXctな時刻データにas.Dateすると、1日前の日付に変わってしまう。

> as.POSIXct("2001-01-01 00:00:01")
[1] "2001-01-01 00:00:01 JST"
> as.Date(as.POSIXct("2001-01-01 00:00:01"))
[1] "2000-12-31"

これはタイムゾーンを指定しないとGMTと解釈されるためであり、タイムゾーンを適切に指定すれば問題ない。

> as.Date(as.POSIXct("2001-01-01 00:00:01"), tz = "Asia/Tokyo")
[1] "2001-01-01"

怖い。

RStudioでPull/Pushボタンがグレーアウトしている時の対処

コマンドラインからgit pushする際に -u をつけてpush先のブランチをデフォルト設定しておくこと。
https://www.r-bloggers.com/things-i-forget-pushpull-greyed-out-in-rstudio/
https://qiita.com/sunstripe/items/a39f4bb835e1f08760e7

そもそもVersion Controlが有効にならない時はXCodeをインストールして、Command Line Toolを入れること。

tidyrのspread()の列の並べ替えを明示的に指定する

tidyrパッケージのspread()でwide-formatのデータに変換した時の列の順序を明示的に指定したい。方法はいくつかあるが、keyに指定する列にfactorでlevelを与えておくのがわかりやすかったので採用。
https://stackoverflow.com/questions/29381069/implicit-sorting-in-tidyrspread-and-dplyrsummarise

write.xlsxで複数シートに一度に書き込む

最近、XLConnectパッケージからopenxlsxパッケージに鞍替えしました。
理由は少しでも大きななデータをExcelシートに出力しようとするとXLConnectでは対応できないケースがあったからです。
で、openxlsxについての記事はたくさん書かれているのだけれども、その中のwrite.xlsx()については情報が見当たらなかったのでメモ。

ポイントは出力したデータをリストにして渡すということです。

library(openxlsx)
smp <- list("IRIS1"=iris, "IRIS2"=iris)
write.xlsx(smp, "sample.xlsx")

これでIRIS1、IRIS2というシートにそれぞれirisデータが出力されているはずです。

口コミからプロバイダの速度を比較する

プロバイダわからん。
とりあえず下りの速度が遅すぎなければいい。
ということで口コミサイトの結果から比較する。
以下書きなぐりコード。

library(rvest)
library(dplyr)
library(tidyr)
library(stringi)  

# 以下よりソースをダウンロード
# http://netspeed.studio-radish.com/cgi-bin/netspeed/openresult/openresult.cgi

dat <- read_html("~/downloads/result.html")
numbers <- dat %>% html_nodes(xpath="//*[contains(@class,'graphmarker')]") %>% html_text()
tags <- dat %>% html_nodes(xpath="//nobr") %>% html_text()
detail <- dat %>% html_nodes(xpath="//*[contains(@class,'speeddata2')]") %>% html_text()
result <- data.frame(type = tags[tags %in% c("上り","下り")],
                     speed = gsub("Mbps|kbps", "", numbers) %>% as.numeric(),
                     stringsAsFactors = FALSE)
result$speed <- if_else(grepl("kbps",numbers),result$speed/1000, result$speed)

# 下りの時にインクリメント
i <- 0
result$num <- NA
for(n in seq_len(nrow(result))){
  if(result$type[n]=="下り"){
    i <- i + 1  
    result$num[n] <- i
  }else{
    result$num[n] <- i
  }

}

result_s <- result %>% spread(key=type, value=speed)
result_s$detail <- gsub("\\n|\\t", "", detail)
result_s$provider <- result_s$detail %>% stri_replace_first_regex(".+プロバイダ\\: (.*)測定地.+$","$1")
result_s$provider <- ifelse(grepl("使用回線", result_s$provider), NA, result_s$provider)

final <- result_s %>% group_by(provider) %>% summarise(count=n(), 
                                              mean_上り=mean(上り),
                                              max_上り=max(上り),
                                              min_上り=min(上り),
                                              median_上り=median(上り),
                                              mean_下り=mean(下り),
                                              max_下り=max(下り),
                                              min_下り=min(下り),
                                              median_下り=median(下り)
                                              )

library(openxlsx)
write.xlsx(final, "プロバイダ間比較.xlsx")

Rでモダーンにテキストマイニングする本の話

Text Mining with R - A Tidy Approach という本が最近出ました。

Text Mining with R: A Tidy Approach

Text Mining with R: A Tidy Approach

著者のうち一人はStack Overflowに勤めるJulia Silge。
UseR! 2017でも彼女の発表は盛況だったようです。

そして実は本書、web上で公開されており、内容を確認できます。
http://tidytextmining.com/

目次は以下の通り。

1 The tidy text format
2 Sentiment analysis with tidy data
3 Analyzing word and document frequency: tf-idf
4 Relationships between words: n-grams and correlations
5 Converting to and from non-tidy formats
6 Topic modeling
7 Case study: comparing Twitter archives
8 Case study: mining NASA metadata
9 Case study: analyzing usenet text
10 References

内容をみるとタイトルにもあるようにtidyverseな形でテキストマイニングを学べる一冊となっています。
例えば7章「Case study: comparing Twitter archives」でTwitterのつぶやきデータを整形するコードは以下のような形で、stringrパッケージや%>%を使ってtidyフォーマットに落とし込んでいます。

library(tidytext)
library(stringr)

replace_reg <- "https://t.co/[A-Za-z\\d]+|http://[A-Za-z\\d]+|&amp;|&lt;|&gt;|RT|https"
unnest_reg <- "([^A-Za-z_\\d#@']|'(?![A-Za-z_\\d#@]))"
tidy_tweets <- tweets %>% 
  filter(!str_detect(text, "^RT")) %>%
  mutate(text = str_replace_all(text, replace_reg, "")) %>%
  unnest_tokens(word, text, token = "regex", pattern = unnest_reg) %>%
  filter(!word %in% stop_words$word,
         str_detect(word, "[a-z]"))

http://tidytextmining.com/twitter.html#word-frequencies-1

とはいえ英語です。
和書で読みたいなーでもなー昨日原書が出たばかりだし翻訳はまだだろうなーとか思ってたら、ありました。
翻訳ではありませんが、和書でtidyverseなテキストマイニングの良書が。
それが「Rによるテキストマイニング第2版」です。
著者は徳島大学大学院社会産業理工学研究部教授の石田基広教授。
Rの著書多数、そしてRMeCabパッケージの開発者、メンテナとしても有名な方です。
目次は以下の通り。

第1章 テキストマイニングとは何か
第2章 テキストマイニングの準備
第3章 R/RStudio速習
第4章 文字処理と正規表現
第5章 RMeCabによるテキスト解析
第6章 口コミのテキストマイニング―ウェブスクレイピング
第7章 アンケート自由記述文の分析―対応分析
第8章 青空文庫データの解析―ワードクラウドとネットワークグラフ
第9章 テキストの分類―クラスター分析,トピックモデル
第10章 書き手の判別―漱石と鴎外の文体比較
第11章 Twitterタイムラインの分析―APIの利用

基本的な文字処理から、ワードクラウドやネットワークグラフを用いた可視化、トピックモデルによる分類まで必要技術が一通り押さえられており、10-11章ではリアルワールドデータの分析も触れられています。
書影はこちら。

Rによるテキストマイニング入門

Rによるテキストマイニング入門

私は初版も持っているのですが明らかに第2版の表紙の方がクールですね。

個人的には2014年に「声優の食事内容の検討-外食声優を求めて-」という文章を日本声優統計学会に投稿したのが最後で、最近はテキストマイニングから離れていたため、再学習する良いタイミングをいただきました。本を贈っていただいた石田先生にあらためて感謝申し上げたいと思います。

Enjoy!!!