「地域医療ビッグデータ入門」2018
無料フリーソフトウェアの
統計ソフト解析環境
Rを
使った分析入門
2018/11/16
東京大学UMINセンター
岡田 昌史
タイトルのどこが間違っているか
❖無料ではなく、「フリーソフトウェア」
❖有料のR、代表的にはMicrosoft R Openなどもあります
❖統計ソフトではなく、「統計解析環境」
❖統計解析だけではなく、データの前処理、視覚化、レポート作成まで含む統合
環境です
❖Rを使った分析入門ではなく、Rの紹介
❖「分析」まで講義でいくには少なくとも4コマぐらいは必要ですが、オンライ
ン講義や公開されている資料や本などで十分自学自習可能です。
❖今日は、どんなことができるかを知ってもらって、使うきっかけになってもら
えばと。
本日の内容
❖自己紹介
❖Rとは
❖データサイエンスのためのプログラミング言語R
❖Rの限界
❖Web開発環境としてのR
❖文芸的プログラミングとReproducible Research
❖一旦まとめ
❖実際のRコードの紹介
自己紹介
❖
現職: 東京大学医学部附属病院, 大学病院医療情報ネット
ワーク研究センター(UMIN)
❖
疫学と医療情報学を専門にしています.医学部出身なので,
数学や統計学は専門的に勉強したことはありません.
❖
疫学は統計学を用いて病気の原因を探っていく学問なの
で,統計が必要になり,Rバージョン0.99を動かしたのが
Rに関わるきっかけとなりました.
統計解析
と グラフィックスのための
フリーソフトウェア環境
http://www.r-project.org/
R is a free software environment for
statistical computing and graphics.
R is a free software environment for statistical computing and
graphics.
❖
R is environment
❖
数値, 行列, 文字列からモデル, 関数まで一体として取
り扱うことができるデータ構造
❖
さまざまなデータを取り扱う関数
❖
S言語に似たプログラミング言語
❖
様々な出力形式を用いることができるプロット機能
生データを読み込み, クリーニングし,
対話的にモデルを開発して仮説を検証し,
レポートを作成する過程を
すべてRの中だけで完結できる
R is a free software environment for statistical computing and
graphics.
❖
R is free software
❖
GNU General Public Licenseによる
「自由な」ソフトウェア
❖
再配布の自由
❖
ソフトウェアの動作を調べ、それを改変する自由
❖
改良したものを配布する自由
誰からでもコピーしてもらうことができ、
内部動作を完全に検証でき、
気に入らない部分があれば
改良版を公開することもできる
Rを構成するもの
❖
いわゆる“R”本体 — 初めてインストールして起動した時から使
える機能
❖
基本的な機能のみだが, 体系的に作られ,
重点的にテストされる
❖
追加パッケージ
❖
主に CRAN(Comprehensive R Archive Network) Webサイトから
ダウンロードして利用する, 分野・領域に特化した追加機能
❖
誰でも投稿できる
R本体の機能(ベースパッケージ)
❖
確率分布, 古典的検定, 一般化線形モデル,時系列データ構造, クラ
スター分析,....
❖
文字列検索, システムコマンドの実行, WebブラウザへのURL送
信,....
❖
数式の表示, PicTeX形式でのプロット出力, PostScript出力...
❖
104種類のサンプルデータセット
❖
主要開発メンバーが議論しながら作成しており、安定、信頼でき
る
パッケージ
❖
CRAN(Comprehensive R Archive Network)
❖
R本体とパッケージのダウンロードサイト
❖
現在13345のパッケージが登録
❖
各専門領域のユーザが作成・公開しているものが多
パッケージでできること
>
library
(NipponMap)
> p <-
JapanPrefMap
(col=
'ivory'
)
> dat <- foreign::read.
dbf
(system.
file
(
"shapes/jpn.dbf"
, package=
"NipponMap"
))
>
symbols
(p, circles=
sqrt
(df / (
2
* pi )), fg=
"olivedrab4"
, bg=
"olivedrab1"
,
add=
TRUE
, inches=
F
)
CRAN Task View
❖ 専門分野別のパッケージの選択ガイド。各々の専門家が執
筆
❖ Bayesian : Bayesian Inference
❖ ChemPhys : Chemometrics and Computational Physics ❖ ClinicalTrials : Clinical Trial Design, Monitoring, and
Analysis
❖ Cluster : Cluster Analysis & Finite Mixture Models ❖ DifferentialEquations : Differential Equations
❖ Distributions : Probability Distributions ❖ Econometrics : Econometrics
❖ Environmetrics : Analysis of Ecological and Environmental Data
❖ ExperimentalDesign : Design of Experiments (DoE) & Analysis of Experimental Data
❖ ExtremeValue : Extreme Value Analysis ❖ Finance : Empirical Finance
❖ FunctionalData : Functional Data Analysis ❖ Genetics : Statistical Genetics
❖ Graphics : Graphic Displays & Dynamic Graphics & Graphic Devices & Visualization
❖ HighPerformanceComputing : High-Performance and Parallel Computing with R
❖ MachineLearning : Machine Learning & Statistical Learning ❖ MedicalImaging : Medical Image Analysis
❖ MetaAnalysis : Meta-Analysis
❖ Multivariate : Multivariate Statistics
❖ NaturalLanguageProcessing : Natural Language Processing
❖ NumericalMathematics : Numerical Mathematics
❖ OfficialStatistics : Official Statistics & Survey Methodology ❖ Optimization : Optimization and Mathematical
Programming
❖ Pharmacokinetics : Analysis of Pharmacokinetic Data ❖ Phylogenetics : Phylogenetics, Especially Comparative
Methods
❖ Psychometrics : Psychometric Models and Methods ❖ ReproducibleResearch : Reproducible Research ❖ Robust : Robust Statistical Methods
❖ SocialSciences : Statistics for the Social Sciences ❖ Spatial : Analysis of Spatial Data
❖ SpatioTemporal : Handling and Analyzing Spatio-Temporal Data
❖ Survival : Survival Analysis
❖ TimeSeries : Time Series Analysis
❖ WebTechnologies : Web Technologies and Services ❖ gR : gRaphical Models in R
開発史
❖
1991年ごろ Ross Ihaka と Robert Gentlemanにより開発が始まる
❖1995年 GPLライセンス
❖1997年 Core Group発足
❖2000年 バージョン1.0.0
❖2002年 バージョン1.5.0
❖2004年 バージョン2.0.0
❖2005年 バージョン2.1.0 国際化対応
❖2013年 バージョン3.0.0
❖現在 バージョン3.5.1
GNU General Public License
❖
Linuxなどで有名な、 オープンソースライセンスの1つ.
❖
∼をしてはいけない, ではなく,
∼をさまたげてはならない, というライセンス
❖
Rのユーザには, 以下のような自由が認められる
❖
Rのコピーを再配布する自由
❖
Rの動作(ソースコード)を調べる自由,
それを改変する自由
❖
自分が改良したRを広く配布する自由
自由なライセンスの効果
❖
すべての内部アルゴリズムを追跡可能
❖
バグの発見と修正の過程が透明
❖
機能の追加が容易
❖
良質で有用なバージョンは本体機能の一部
として取り込まれうる(国際化機能など)
開発体制
❖
GPLなので, 誰でも修正は可能
❖
パッケージは各作者が主に開発・修正
❖
公式的なRリリースをコントロールしているチーム:
R Core Group
❖
Core Groupは公開メーリングリストで議論し, 開発途中の
ソースコードも公開
❖
バグおよび対処の一覧も公開・誰でも登録可能
R Core Group
•
Douglas Bates
•
John Chambers
•
Peter Dalgaard
•
Robert Gentleman
•
Kurt Hornik
•
Ross Ihaka
•
Tomas Kalibera
•
Michael Lawrence
•
Friedrich Leisch
•
Uwe Ligges
•
Thomas Lumley
•
Martin Maechler
•
Martin Morgan
•
Paul Murrell
•
Martyn Plummer
•
Brian Ripley
•
Deepayan Sarkar
•
Duncan Temple Lang
•
Luke Tierney
The R Foundation
❖
Rの著作権を持ち, Webサイトやドメイン
(r-project.org)を持つNPO
The R Foundation for Statistical Computing
c/o Institut für Statistik und Wahrscheinlichkeitstheorie
Technische Universität Wien
Wiedner Hauptstraße 8-10/1071
1040 Vienna, Austria
Tel: (+43 1) 58801 10715
Fax: (+43 1) 58801 10798
The R Consortium
❖2015年に設立された,主にRを組み込んだり改造したソフトウェア製品を出している
ベンダーによるコンソーシアム
❖Rに関する開発プロジェクトに競争的資金提供も行う
❖GPLライセンスは,R本体及びその派生版について,ソースコードを含めた再配布を
要求するが,無改変のRを内部に組み込んだ製品を販売することはできる.
❖Revolution Analytics社(現Microsoft)など,改変版のRをソースコードを公開しつつ販
売している場合もある.
❖コンソーシアムのメンバーも積極的に UseR! などの国際ユーザカンファレンスに参加
するなど,フリーソフトウェアコミュニティと良い関係を築いている
Rはどのくらい普及しているか
❖
2016年の時点で, 学術誌で利用されたソフトウェア
としてはSPSSに次いで2位
❖
データサイエンスの求人のスキルではSQL, Python,
Java, Hadoopについで5位
Robert A. Muenchen, The Popularity of Data Science Software, 6/19/2017.
http://r4stats.com/articles/popularity/ より
モダンな
R —
データサイエンスのための
プログラミング環境として
パイプ演算子の登場
❖
パッケージにより,演算子も定義できる
❖
%>% という,Base Rには存在しない演算子を定義する
magrittr パッケージと,それを活用することでソース
コードの可読性を大幅にあげる dplyrパッケージの登場
(2014年)によって,解析前の「データの加工」処理のプ
ログラムの書き方が大きく変わった
パイプ
+dplyr
data
(iris)
iris2 <-
subset
(iris, Sepal.Length >
5.0
& Species ==
"setosa"
)
iris2$Petal.Area <- iris2$Petal.Length * iris2$Petal.Width
str
(iris2)
library
(dplyr)
iris %>%
filter
(Sepal.Length >
5.0
& Species ==
"setosa"
) %>%
mutate
(Petal.Area = Petal.Length * Petal.Width) %>%
str
ggplot2の登場
❖
Rはグラフィックス描画システムが高度に抽象化されており,もともとコー
ドを変更せずに,出力先を画面,画像,PDFに自在に変更できたり,グラフの
座標系をそのまま位置指定に用いて凡例や注釈を加えたりすることができ
る
❖
デフォルトのbase graphicsに加え,従来もgrid, latticeなどのパッケージを
使ったグラフィックスが使われてきたが,ggplot2が登場(2007年)して急速
に普及した.
❖
データ+点+回帰直線+タイトル,というように,演算子”+”を使って重ね書
きしていく記法でわかりやすく,デフォルトでも見た目が美しくなるよう
に調整されている
ggplot2
plot
(Sepal.Length ~ Petal.Length, data=iris, col=as.
numeric
(iris$Species),
pch=as.
numeric
(iris$Species), main=
"Sepal Length - Petal Length"
)
library
(ggplot2)
ggplot
(data=iris,
aes
(x = Petal.Length, y = Sepal.Width)) +
geom_point
(
aes
(color=Species, shape=Species)) +
Rstudioの登場
❖Rは基本的にはコマンドライン操作
❖パッケージとして,R commander, RzなどのGUIを実装したものもある
が,あくまでも操作をGUIから実行するためのもので,「Rプログラミン
グ」のためのものではなかった.
❖2011年に,「R言語のプログラムを書くための統合開発環境」として
Rstudioが登場.
❖このあたりから,Rの中心的な利用方法が「データはあらかじめどこかで
作っておいて,解析を実行する」から,「データの加工,整理,抽出か
ら解析,評価,レポート作成まで」に広がってくる.
tidyverse
❖
dplyr, ggplot2の作者,Hadley Wickham(現Rstudio)が提唱する,いわば「プログラム処理し
やすいデータの表現方法」と,そのためのパッケージ群
❖
これを積極的に取り入れてワークフローを構築すると,base Rとはかなり違う世界になるが,
Rの限界
❖
そもそも,Rはインタプリタ言語
❖
マルチスレッドもない
❖
演算速度はBLAS/LAPACK依存
❖
実行時には,全てのデータはオンメモリに保持される.
❖
baseでは型はdoubleまで
❖
まぁ,速くはないし,巨大なデータを扱えるわけでもい
メモリの限界突破
❖
64ビットOSが普及し,64ビット環境でコンパイルされたRが配布さ
れるようになったので,あくまでもオンメモリ動作であるという筋
の悪さはそのままだけれども,限界に達することはあまりなくなっ
た
❖
オンメモリがとても無理なデータセットを扱う場合,biglmなど,
外部データベースを用いるパッケージを使う
❖
最近ではApache SparkにもRのインターフェースが備えられており,
処理はSpark側だがデータの操作や基本的なモデリングはRのコード
を大きく改変せずに実行できる
インタプリタの限界突破
❖
R 2.13ごろから,compiler パッケージが付属するように
なり,バイトコンパイルでの性能向上を図れるようになっ
た
❖
さらに速さが必要な場合には,Rcppパッケージを使っ
てC++コードをRソース中に埋め込んでおき,コンパイ
ルされた関数を実行時に呼び出すことも可能
並列処理の限界突破
❖
MPIライブラリを使うRmpiパッケージがあり,プロセ
スレベルで並列化させることはかなり容易にできた.
❖
R 2.14.0からparallelパッケージがデフォルトで付属され
るようになり,プロセスレベルでの並列化はさらに容
易になった
❖
Microsoftの改変版であるMicrosoft R Openにはマルチス
レッドのBLAS/LAPACKが含まれている
Shinyの登場
❖
2012年にリリース.RでWebアプリを作成する!パッケージ
by Rstudio
❖
server.Rとui.Rの2つのRコードを書くと,パラメータ選択
やデータセット選択のインターフェース画面と,そこから
の入力に反応してグラフや表を出力する画面を持ったシン
グルページWebアプリケーションがRの中で動く
❖
shiny-server ソフトウェアを利用すると,デーモンとして
サービスさせることも可能
Shinyアプリ
library(shiny)
function(input, output) {
output$distPlot <- renderPlot({
x <- faithful[, 2] # Old Faithful Geyser data
bins <- seq(min(x), max(x), length.out = input$bins + 1) hist(x, breaks = bins, col = 'darkgray', border = 'white') })
}
library(shiny)
fluidPage(
titlePanel("Hello Shiny!"), sidebarLayout(
sidebarPanel(
sliderInput("bins",
"Number of bins:", min = 1, max = 50, value = 30) ), mainPanel( plotOutput("distPlot") ) ) )