Hatena::ブログ(Diary)

ほくそ笑む このページをアンテナに追加 RSSフィード

2017-10-18

R から Teradata にクエリを投げる DBI 対応のパッケージ dplyr.teradata を作りました。

つくりました。まだ完成してないけど。

https://github.com/hoxo-m/dplyr.teradata

タイトルには「DBI 対応の」と断言していますが、テストはまだ通ってないので DBI に完全に準拠してるのか、そもそもそれは可能なのか、わかりません。。が、もう実装するの疲れたのでフライングで紹介します。

インストール

install_github() でインストールできます(CRAN に上げるにはまだまだ時間かかりそう)

devtools::install_github("hoxo-m/dplyr.teradata")

使い方

dplyr.teradata のコネクションをつくるには driver、DBCName、uid、pwd、database を指定します。

database は省略可能です。

library(dplyr.teradata)

conn <- dbConnect(todbc(), driver = "{Teradata Driver}", 
                 DBCName = "localhost", uid = "*****", pwd = "*****")

さて、DBI ではコネクションに対してクエリを投げるための関数がいくつか用意されています。

  • dbSendQuery(): 結果ではなく DBIResult オブジェクトを返す。このオブジェクトを dbFetch() すると結果が得られる。
  • dbSendStatement(): 結果は返ってこない。INSERT とか UPDATE とかデータ操作系のクエリを投げるときはこれ。
  • dbGetQuery(): 結果が data.frame として返ってくる。

すぐに結果が欲しいなら使いたいのは dbGetQuery() でしょう。こんな感じです。

DBI::dbGetQuery(conn, "SELECT 1")
#>   1
#> 1 1

dplyr から使う(まだ実装中)

まだ実装中なんですけど、簡単な例なら動きます。R の data.frame を copy_to() でコピーしてみましょう。

copy_to(conn, iris, temporary = FALSE)

dbGetQuery() でなにかクエリを投げてみるとちゃんとデータがコピーできていることがわかります。

DBI::dbGetQuery(conn, "SELECT COUNT(*) FROM iris;")
#>   Count(*)
#> 1      150

dplyr では tbl() を使うと、データベースのデータを data.frame と同じように操作することができます。

teradata_iris <- tbl(conn, "iris")

中身を覗いてみます。ちゃんと iris ですね。(表示するだけだとデータベースへのアクセスが発生しないので中身は覗けないことに注意)。

teradata_iris %>% collect
#> # A tibble: 150 x 5
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#>           <dbl>       <dbl>        <dbl>       <dbl>   <chr>
#>  1          5.1         3.5          1.4         0.2  setosa
#>  2          4.9         3.0          1.4         0.2  setosa
#>  3          4.7         3.2          1.3         0.2  setosa
#>  4          4.6         3.1          1.5         0.2  setosa
#>  5          5.0         3.6          1.4         0.2  setosa
#>  6          5.4         3.9          1.7         0.4  setosa
#>  7          4.6         3.4          1.4         0.3  setosa
#>  8          5.0         3.4          1.5         0.2  setosa
#>  9          4.4         2.9          1.4         0.2  setosa
#> 10          4.9         3.1          1.5         0.1  setosa
#> # ... with 140 more rows

これを %>% を使ってデータ操作していくことができます。

table %>% 
  select(Sepal.Length, Sepal.Width, Species) %>%
  group_by(Species) %>%
  summarise(x = sum(Sepal.Length)) %>%
  collect
#> # A tibble: 3 x 2
#>      Species     x
#>        <chr> <dbl>
#> 1     setosa 250.3
#> 2  virginica 329.4
#> 3 versicolor 296.8

ということで便利っぽいんですが、dplyr からちゃんと使えるようにするには SQL の変換用メソッドを実装する必要があります。この辺がまだできていないので、まだ複雑なクエリだとうまく動きません。たぶん。

sql_render() calls an SQL generation function (sql_select(), sql_join(), sql_subquery(), sql_semijoin() etc) to produce the actual SQL. Each of these functions is a generic, taking the connection as an argument, so that the details can be customised for different databases.

(https://cran.r-project.org/web/packages/dbplyr/vignettes/sql-translation.html)

Connection

RStudio Connections は読んでないけど、とりあえず「New connection」のところに Teradata が出てくるようにするのは odbc パッケージの方ですでに対応済みです。

新しくコネクションを開いたらタブに表示するようにする方(Connections Contract)もすでにできています。

TODO

  • dplyr に対応する。

最後に

ということでできていないことだらけなんですけど、たぶん単純に dbGetQuery() を使うだけなら問題なく使えると思います。Teradata から結果を抜いてきて R に入れるのに苦労してという人は使ってみてください。

使ってて変なところを見つけたり要望を閃いたりすれば、Twitter、このブログのコメント欄、GitHub の issues あたりでお知らせください。

参考

2017-09-20

Facebookの予測ツールProphetについて発表しました

Facebook が出した誰でも簡単に時系列予測ができるツール Prophet についていくつか発表しました。

Prophetはビジネス時系列、すなわち人間の行動に左右される時系列データに対する自動予測ツールです。

ビジネスでは大量の時系列データに対する予測を作成する必要があります。

しかし、それを1人のデータ分析者が1つ1つ作っていくのでは手が足りません。

そこで、統計の知識を必要しない、誰にでも簡単に時系列予測を行うツールとして Prophet が作成されました。


Prophet はオープンソースで開発され、Python と R のライブラリが公開されています。

まずは今年5月に Python版についての発表を foundIT データ解析・機械学習セミナー にて行いました。

Python版の発表資料はこちらです。


R版については7月に 第63回R勉強会@東京(#TokyoR) にて発表しました。

R版の発表資料はこちらです。


上記の発表ではツールの使い方について重点的にお話したのですが、もっと詳しく知りたいという方向けに、理論的な側面の解説をしました。

その発表資料はこちらです。


これらの発表時点では、Prophet はバージョン 0.1.1 だったのですが、9/13 にバージョン 0.2 がリリースされました。

私も Contributor の一人に加わっています。

発表資料では、精度評価を行う Simulated Historical Forecasts は未実装と書いていますが、@teramonagi さんの尽力によりバージョン 0.2 で実装されました。

バージョン 0.2 で新しく加わった機能についてもどこかで解説できればと思います。

以上です。

2017-05-16

AJAXサイトを Webスクレイピングする(銀行金利をスクレイピング)

共同で翻訳した本が出版されます。

本書は、原題 "Automated Data Collection with R" の翻訳書です。

今日は、本書の6章から「AJAX サイトを Web スクレイピングする」という話を紹介したいと思います。

AJAX サイトを Web スクレイピングする

銀行の金利が低い時代ですが、キャンペーンなどで一時的に定期預金の金利が高くなる場合があります。

そのタイミングで定期預金を組めば、それだけお得です。

なので、いろいろな銀行の定期預金の金利を定期的にスクレイピングして情報を得たいとします。

ここでは架空の銀行、R銀行の金利情報を得ることを考えます。

R銀行の Web サイトを見ると、定期預金の金利はホームページ上で確認できます。

f:id:hoxo_m:20170513190839p:image

そこで、この情報を次のようにしてスクレイピングしてみます。

library(rvest)

# スクレイピング対象の URL
url <- "https://www.rakuten-bank.co.jp/interest/details.html"
# URL をスクレイピングして、表(table)だけを抜き出す
tables <- read_html(url) %>% html_nodes('table')

# 見つかったテーブルの個数を確認
length(tables)
#> 6

# 各テーブルの内容を確認する
tables %>% html_text
#> [1] "普通預金金利(普通預金の商品詳細説明書へ)..."
#> [2] "普通預金金利(マネーブリッジご利用者)..."
#> [3] "普通預金金利(楽天カードのカード利用金額の引落があるお客さま)..."
#> [4] "預入期間中途解約利率1年未満約定利率..."
#> [5] "期間\n当初1年間\n2年後以降(最長10年まで)..."
#> [6] "期間\n当初1年間\n2年後以降(最長15年まで)..."

しかし、定期預金の金利データが入っているテーブルは見つかりませんでした。

これはなぜでしょうか?

このページでは AJAX が使われており、定期預金のテーブルは遅れて読み込まれるため、単に HTML を取得するだけでは情報を全部取得できないためです。

『Rによる自動データ収集』の6章には次のように書いています。

サイトが AJAX を採用している場合,単純に HTML ソースコードを取得するだけでは十分な情報を得られない可能性がある.その場合,情報源を特定するためにサイトの基本的な構造を理解する必要がある.これまで R について称賛してきたわれわれだが,このタスクに関しては,R だけでやるのは難しいだろう.少なくとも,AJAX を使用したサイトに対して,R は必要な機能を提供しているとはいえない.

AJAX を使ったサイトは、単純な方法でスクレイピングできないため、諦めてしまう人も多いと思います。

しかし本書では、ブラウザの開発者ツールを補助的に使用することでこれを解決します。

代わりに,われわれはブラウザで直接サイトを調べることにする.大半のブラウザには Web 開発のための強力なツール機能がついており,それは Web スクレイピングにおいても役に立つ.

本書では、具体的に Google Chrome の Web 開発者ツール(Web Developer Tools;WDT) を使って、データソースを追跡し、欲しい情報がどこにあるのかを特定する方法を詳しく説明しています。

本書での説明通り行えば、R銀行の定期預金金利の情報は、次のようにしてスクレイピングできます。

# 特定されたデータソース
data_source <- "https://rbweb.rakuten-bank.co.jp/REF/main/fis/BasicTimeDepositInterestRate.html?PageID=BasicTimeDepositInterestRatePresentationLogicBean"

# テーブル情報の抜き出し
time_depoit_rates <- data_source %>% read_html %>% html_node('table')

# 情報を確認する
time_depoit_rates %>% html_text %>% cat
#> 期間
#>     預入単位
#>        1,000円以上100万円未満
#>        100万円以上1000万円未満
#>        1000万円以上
#>     7日
#>        0.02%
#>        0.02%
#>        0.02%
#> ……

AJAX を使ったサイトでも、ほとんどの場合この方法でスクレイピングできるようになります。

このように、本書は R だけにこだわらず、より便利なツールがあればそれを使って、効率よく目的を達成するというスタンスで書かれています。

まとめ

インターネットの普及に伴って、Web 上のデータを使ったデータ分析が盛んに行われるようになりました。

そこで重要となるのが、Web 上の情報をいかに効率よく集めるかという問題です。

ここに R を用いることで、データ収集から分析までをシームレスに行うことでき、効率を上げることができます。

本書は、データ収集だけでなく、加工、保管、分析、報告といったデータ分析に必要となる一連の技術ついての本です。

Twitter によるアカデミー賞予測」「商品レビューのセンチメント分析」といった事例もたくさん載っています。

本書を読めば、このようなデータ分析プロジェクトを効率よく進めるためのセオリーを身に着けることができるでしょう。

関連

2017-03-23

分析したいけどデータがない!そんなときはウェブスクレイピング!

献本いただいたので紹介記事を書きます。

Rによるスクレイピング入門

Rによるスクレイピング入門

本書はウェブスクレイピングという、ウェブ上の情報を収集する技術について書かれた本です。

ウェブスクレイピングはデータ分析者にとって非常に有用な技術です。

データ分析をしようと思ったとき、どうやってデータを集めるかというのが問題になる場合があります。

例えばテキスト解析をしようと思っても、ちょうどいいデータセットが手元になく、自分でデータを集める必要があるといった場合があります。

その場合、WikipediaTwitter などからデータを収集するためには、ウェブ技術やプログラミングについて学ぶ必要が出てきます。

例えばウェブ技術の一つである HTML を学ぶとなると、たくさんのマークアップタグがあり、いくつかのバージョンが混在し、ブラウザによっても微妙に異なるといったことが多くの書籍には書かれているわけですが、こういった知識は、単にウェブからデータを収集したいだけの分析者には必要のない知識だったりします。

本書は、そういったウェブ技術やプログラミングに疎い分析者が、ウェブ上からデータを収集するために必要な最低限の知識を学ぶための最短コースを提供しています。

内容としては初心者向けに一通りのことが書かれており、知識はないけど手っ取り早くできるようになりたいという人が最初に手に取るのにちょうどいいと思います。

本書で使用される統計言語 R では、ウェブスクレイピングを簡単にするためのパッケージが利用でき、プログラミング初心者でもわりと容易に自分の思った通りのスクレイピングコードが書けるようになると思います。

章別に見ていくと、次のような感じです。

  1. Rの基礎知識
  2. ウェブ技術
    • HTML, CSS, XPath, XML, JSON, HTTP, OAuth
    • httrパッケージ, XMLパッケージ
    • 正規表現stringrパッケージ)
  3. ウェブ API 入門
  4. ウェブスクレイピング実践編
    • rvestパッケージ, Selenium (RSeleniumパッケージ)
  5. ウェブ API 実践編
  6. オープンデータ

1章ではRの基礎知識を簡単に説明しています。ただし、ウェブスクレイピングに必要な知識だけに絞って簡潔に説明されています。

2章は基本的なウェブ技術についてです。ここも要点をしぼって説明されていますが、結構なページ数がさかれています。

例えば、CSSセレクタやXPathは、ウェブドキュメントから自分の欲しい部分だけを抜き出すときに、その要素の指定に使われる重要な技術です。

また、抜き出した情報にも余分な情報がある場合もあり、そのような場合は正規表現を使った文字列処理が必要になります。

XML や JSON はウェブから情報を取得する際に返却されるデータ形式としてよく使われるものであり重要です。

このように、本書では膨大なウェブ技術の中でもウェブスクレイピングに必要な情報だけに絞って解説しているというところがポイントだと思います。

3章はウェブ API についてです。ウェブスクレイピングというと HTML ページを解析して情報を抜き出すというイメージがありますが、サイト側が用意した API があるならば、それを使うことが推奨されます。これについては著者自身がブログで説明していますのでそちらをご参照ください。

4章と5章は実践編です。ここでは様々なサイトから実際にデータを抜き出すための方法が具体的なコードと共に提示されます。

6章はオープンデータについてです。現在さまざまな団体がデータを公開しており、これを活用したデータ分析について書かれています。

まとめ

本書はデータ分析者にとって重要な技術であるウェブスクレイピングについて、初心者向けに要点をしぼって解説された本です。

分析したいけどデータがないとお困りの方、ウェブスクレイピングを手っ取り早く学びたいという方におすすめの一冊です。

Rによるスクレイピング入門

Rによるスクレイピング入門

関連

Python によるスクレイピング

Python によるスクレイピングの本も立て続けに出ていますね。