Hatena::ブログ(Diary)

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

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 によるスクレイピングの本も立て続けに出ていますね。

2016-12-09

確率論の基礎について発表しました

Watanabe理論勉強会で発表してきました。

前回の発表はこちら

前回は2章だったのですが、2ヶ月半で5章まで進みました。ページ数的には折り返し地点です。

今回の担当は5章前半だったのですが、私の脳みそでは非常に難しく感じたため、5章に入る前に1章で飛ばした確率論基礎について復習させてもらいました。

発表スライドは下記です。

この部分は非常に簡潔に書かれていて、私には分かりやすかったのですが、確率空間は必ずしも距離空間である必要はないとか、可測空間だけでは積分は定義できないとか、詳しい方々からのツッコミが容赦なく入りました。

しかし、この復習で、ある程度は確率空間や確率変数に対するイメージが固まったため、5章を読み進めることができました。

5章の発表スライドは下記です。

タイトル詐欺で経験過程まで行っておらず、法則収束の説明までです。

法則収束は汎化誤差の漸近挙動を研究したいWatanabe理論では重要な概念となります。

この章ではもう一つ、関数に値を取る解析関数についてのセクションも私の担当なので、次回発表する予定です。

関連

2016-09-30

A/Bテストと統計的検定の注意点(その1)

素晴らしい記事が上がっていたので言及したい。

この記事では、A/Bテストにおいて、意味のある差が出たかどうかを統計的検定を用いて判断する方法を説明しています。

Web上にある多くのA/Bテストの記事と異なるのは、単に検定手法にデータを突っ込んでp値を出すのではなく、

  • 意味のある差とは何かを事前に決定する
  • サンプルサイズを事前に決定する

という統計的検定のフレームワークに則ったまともな方法で判断を行っているという点です。

よく言われる統計的検定は無意味だなどという言論の多くは、このフレームワークを使っていないだけに過ぎず、不確実な事象に対する科学的な検証方法として、統計的検定のフレームワークの強力さはいまだ健在です。

さて、統計的検定のフレームワークについては上の記事および記事中で紹介されている参考文献にお任せするとして、ここではA/Bテストと統計的検定における、もう少し実践的な話題を紹介したいと思います。

A/Bテストの等質性

A/Bテストとはどういうものでしょうか?

例えば、Webサイトのランディングページに対して2つのデザイン案が持ち上がり、どちらが良いか判断に困る場合があります。

そこで、訪問者をAグループとBグループにランダムに振り分け、それぞれのグループに別々のデザインを見せ、入会率が良い方のデザイン案を採用する、といったことを行うのがA/Bテストです。

上記の記事ではAとBについて次のように書かれています。

  • A「入会率10%の現ランディングページ」
  • B「入会率(以下CVR)15%を期待する新ランディングページ(以下LP)」

ここにはちょっとした罠があります。

こういう風にA/Bを分けると、新ランディングページのCVRが最初だけ良く、途中から下がるという現象にわりと頻繁に遭遇するはずです。

例えば、下記の記事で言及されているような現象です。

ベースラインに対して新しい実験パターンのコンバージョンの方がずっと優勢なんですが,95%ラインを越えたり越えなかったり,という推移が見て取れます.ごく初期に95%を越えた段階で効果あり,と思って実験をストップしちゃうなんていうのは割とありがちな事態ではないでしょうか.

Optimizelyのstats engineによる逐次A/Bテスト - About connecting the dots.

これはなぜ起こるのでしょうか?

A/Bテストにおいて、訪問者をAとBにランダムに振り分けるのは、各グループにおける訪問者の性質を均質にすることが目的です。

もし、Aは男性、Bは女性というような振り分け方をすると、AとBにおける入会率の差が、性別による差なのか、デザインによる差なのか、判別できなくなります。

デザインによる入会率の差を検証したかったら、デザイン以外の要因(例えば男女比)が同じになるように振り分ける必要があります。

ところで、このランディングページに訪れるのは新規訪問者だけでしょうか?

A/Bテストの対象者の中に、現ランディングページを見たことのある人は含まれないのでしょうか?

今、A/Bテストの対象者の中に、新規訪問者と再訪問者が50%ずついるとしましょう。

新規訪問者とは、現ランディングページを見たことがない人たちと定義します。

すると、再訪問者は現ランディングページを見たことがある人たちであり、言い換えると、現ランディングページでは入会しなかった実績を持つ人たちです。

つまり、Aグループにおける再訪問者は、現ランディングページでは入会しにくいという性質を持っていることになります。

そう考えると、AとBの入会率に差が無かったとしても、Aグループにおける再訪問者の入会率はBグループにおける再訪問者の入会率より低くなることが予想されます。

f:id:hoxo_m:20160929185238p:image:w600

これでは、A/Bテストの前提である「各グループにおける訪問者の性質が均質」を満たしません。

このような場合、どんなに正しく統計的検定のフレームワークを適用ても、正しい結果は得られません。

A/Bテストの評価に統計的検定を使用するならば、グループの等質性についても気を付けなくてならないことがお分かりいただけたかと思います。

(なんか長くなってしまって疲れました。気力があれば続きます。続きが読みたい人はワッフルワッフルと書いて下さい。)