【学習動機】
これのときに、気付いたのが、Hadley教徒になりたいけど、ぐぐって断片的に集めた知識じゃ、すぐ抜け落ちるってこと。というわけで、本で体系的に学ぼうということで、通称、宇宙本をやることにした。
松村 優哉『RユーザのためのRStudio[実践]入門−tidyverseによるモダンな分析フローの世界−』
【学習記録】
<総括>
RStudioやtidyverseの入門として、とてもよかった。次に、各章の専門的に書かれた本に飛べばよいはず。
<忘れやすいショートカットめも>
Ctrl + Shift + M ;パイプ演算子%>%
Ctrl + Shift + C ;選択した行をコメント/非コメント
Ctrl + Alt + K :レンダリング実行(Knit)
Ctrl + Alt + I :Rチャンク挿入
c1:RStudioの基礎
・ファイルの読み込みは標準関数のread.csv()ではなく、readrのread_csv()を使うべし。
他に、data.tableのfread()も使えるが、ここでは扱わない。
標準関数のread.csv()は遅いし、読み込む型が不親切。
・読み込む列の型を指定したいなら、col_types引数を使う。
文字列[c]、整数[i]、実数[d]、TRUEFALSE[l]、日付[D]、時間[t]、日付時間[T]、数字以外の文字が含まれても数字として返す[n]、推測する[?]、列を読まない[_]
・エンコーディングの指定。UTF-8で読み込まれるが、Shift-JIS(CP932)のファイルを読むと文字化けするので、local引数で指定。文字コードが分からないときは、guess_encoding()を使うといい。
・書き出しにはwrite_csv()を使う。標準関数のwrite.csv()より高速で、デフォルトでrow.names = FALSEなので、行名が入らなくてよい。
・Excelファイルの読み込みにはreadxlのread_excel()を使えばよく、sheet引数でシートの指定ができる。
・SAS、SPSS、STATAファイルの読み込みはhavenパッケージが使える。
c2:スクレイピングによるデータ収集
・URLのHTML構造を抽出し、要素にアクセスし、その中身を取り出すか、属性にアクセスし、その値を取り出す。CSSセレクタやXMLパスのような構文を利用したスクレイピングによってもドキュメントの要素や値を取得できる。
・スクレイピングを実行するためにはrvestパッケージを使用。
まず、URLをread_htmlで読み込む。読み込むと、DOM(Document Object Model)という形で保存される。これはHTMLの要素を階層構造に変換したもの。HTMLの要素やクラスにあたる部分、DOMでノードという。DOMはブラウザでチェック可。
ページソースを読み解きやCSSセレクタやXpathの文法暗記は困難なので、スクレイピングではデベロッパーツールというchromeの開発ツールを利用する。WindowsではFn+F12で使え、ノードが確認できる。ここから取得したいところにカーソルあてて、Copy XPathでコピー。クオーテーションマークはシングルとダブルを区別することに注意。
・ページを複数取りたい場合は、繰り返しを使う。URLが規則的な構造ならforループでなんとかなるが、そうでない場合はRSeleniumパッケージを使う。
(RSeleniumがCRANから消えている。2018/09/04現在。)
・API(Application Programming Interface)は、つまり、ソフトウェアやサービスを外部から使用できるようにしたもの。無制限には使えず、単位時間での使用量決まっていること多い。
・Twitterには、REST APIとSTREAMING APIがある。前者はタイムラインやDM、FF、リストなど取得できる。検索も可能。後者は流れるデータの1%を受信できる。
https://togetter.com/li/1250205
仕様変更していて、異なるところがあるみたい。
『Rによるスクレイピング入門』
で補強していくべき。
c3:dplyr/tidyrによるデータ前処理
Hadleyの提唱するtidy dataとは、
・1つの列が1つの変数を表す。
・1つの行が1つの観測を表す
・1つのテーブルが1つのデータセットだけを含む
(横長のワイド(wide)形式のデータを縦長のロング(long)形式のデータに変えるなど。パネルデータ分析の前処理で出てきたりする操作。)
ロング形式の方が、ベクトル演算しやすい。
データをtidy dataに変形するのに、tidyrのgather()とspread()が有用。
ワイドをロングに変形するのはgather()。
ロングをワイドに変形するのはspread()。
引数keyとvalueを指定、gather()なら並べる列名のkeyも指定、spread()はkeyが列名になるので指定不要。
列や行の絞り込みといったデータ操作はdplyrパッケージが有用、dplyrの主な関数は3つに大別でき、
・1つのデータフレームを操作する関数 行を絞るfilter()や列を絞るselect()など。
・2つのデータフレームを結合する関数 行同士で結合のjoin()系関数、集合演算intersect()やnion()など。
・ベクトルを操作する関数 ウィンドウ関数など。
・select()は引数に絞りたい列名を列挙。ヘルパ関数として、starts_with(), ends_with(), contains(), matches(), num_range(), one_of(),everything()が使える。
・filter()は引数に条件式を書いて絞り込み。論理式はいつも通り。
・mutate()は新しい列名を追加、transmute()は追加でなく別のtibble作成。
・arrange()が行を並べ替える。選択した列の昇順がデフォ。数値列なら-をつければ降順。そうでなければ、desc()でくくるといい。
・summarise()で集計計算。グループ化と組み合わせると強力。データを1行に要約する関数。
・group_by()を適用すると、データはグループ化されたデータフレーム(group_df)になり、mutate()やfilter()を使うと違う挙動を見せる。
セマンティクスに関しては、これ
https://speakerdeck.com/yutannihilation/dplyrfalseselecttomutatefalsesemanteikusufalsewei-i
・tidy dataに変換できないデータなら、複数の列を同時に処理するscoped functionが有用
・scoped functionは以上の関数の複数列バージョンで、サフィックスは_all, _if, _at。
これ、なかなか便利では!?
・2つのデータセットの結合と絞り込みで、_join()の関数を使う。
c4:ggplot2によるデータ可視化
カラーページで描かれていてよい。
パッケージggplot2の利点は、統一された文法、グラフの再現性、豊富な拡張パッケージ。
水準ごとの識別
・グループ化(mapping引数のaes()で指定。)
・ファセット(facet_wrap()とfacet_grid())
・統計的処理(stat())
水準ごとに自動で配色を割り当てる機能は可視化の効率化に大きく貢献する一方で、配布資料や印刷物でグラフを示す場合、モノクロやグレースケールが望ましいこともある。
背景真っ白なら、theme_classic()、目盛り線を残したいなら、theme_bw()、文字サイズやフォントの変更はtheme_()の中で変更。
c5:R Markdownによるレポート生成
ここのパートの著者が書いてるものが、
R Markdown入門
https://kazutan.github.io/kazutanR/Rmd_intro.html
あと、これも役立つ。
【学習予定】
データハンドリングとスクレイピングをもう少し習得したい。
か
をやっていこうと思う。