環境化学データ解析入門: 愛媛大講演資料 160728
TRANSCRIPT
環境化学のデータ解析
Twi$er:@siero5335@Ehime_Univ.20160728
注意
それなりにデータ解析について勉強はしましたが、独学の上、解析の専門家ではないので背景、理論などには間違いがある可能性があります。使うときには鵜呑みにせず、自分でもある程度調べるようにしてください。
目次
環境化学分野における多変量データ解析の必要性
R,Rstudio,EZRの紹介
データ読み込み,編集:Rstudio
データ集計:summary
データの可視化:ggplot2,Plotly
検定:Welch’st検定,Brunner-Munzel検定
統計モデル:一般化線形モデル glm
機械学習:主成分分析,caret
解析再現性,レポーティング:RMarkdown
背景
社会におけるデータ解析の重要性が上昇(ビッグデータ等)
意思決定の場における客観的な指標や、正確な将来予測に基づいた行動を取らないと、解析結果を運用している組織と戦えないちかごろでは大きいデータを持っている会社(検索、広告、ソーシャルゲーム等)が活発に人材を収集化学分析・機器メーカーなども少しづつ解析ができる人が必要だと考えている空気を感じる
環境化学分野における多変量データ解析の必要性
環境化学は総合的な学問→色々なデータが得られる(濃度,毒性,時間,場所...)
濃度1つをとっても多用な化学物質、異性体を対象にするため、データ量が増大
採取地域、個体情報、アウトカム、物性などが組み合わさることで解析が複雑化
どこから手を付けたら良いのかよくわからない
謎の卒業生に謎のツッコミを受けるがよくわからない
環境化学分野における多変量データ解析の必要性
いきなり色々やるのは無理! ただでさえ測定やゼミで大変なのに厳しい
ある程度手順を作ればむしろ楽になるかも?
実験で忙しい学生のための環境化学のデータ解析
Rを使う
ご存知R, 新版はver3.3.1バージョンが古すぎると動かないパッケージがあったりするので、気がついたらたまに更新したほうが良い。
ここからダウンロード
h$ps://cran.r-project.org/
ベースになるプログラムなのでこれがないとこの後で紹介するものも動いていくれない(EZRは動く?)
RstudioからRを使う
生のRはわりとそっけないRエディタを使えばコンソールに直打ちしなくて済むし、解析結果も保存しておけるけどもうちょっと便利に使いたい
h$ps://www.rstudio.com/products/rstudio/
ここからダウンロード
RstudioからRを使う
さらに移動
OSに合ったバージョンをダウンロード
どう変わる?
・現在使用しているデータやパッケージの管理が容易
・作ったグラフのコピペが簡単
・コード補完が強力なのでミスタイプが減る
・作業記録を残しやすいので再現性が上がる
どう変わる?
・現在使用しているデータやパッケージの管理が容易
・作ったグラフのコピペが簡単
・コード補完が強力なのでミスタイプが減る
・作業記録を残しやすいので再現性が上がる
コマンド覚えるのは辛い場合は?
マウスで解析したい人のためのEZR
h$p://www.jichi.ac.jp/saitama-sct/SaitamaHP.files/statmed.html
マウスで解析したい人のためのEZR
h$p://www.jichi.ac.jp/saitama-sct/SaitamaHP.files/statmed.html
これらを使えばある程度の解析ができる環境は整う
今回はRstudioをベースに解説(マウス操作のEZRであれば見たらなんとなくわかると信じて)
マウスで解析したい人のためのEZR
h$p://www.jichi.ac.jp/saitama-sct/SaitamaHP.files/statmed.html
データの読み込み
CSV,エクセルファイルいずれも読み込み可能(Preview版:h3ps://www.rstudio.com/products/rstudio/download/preview/)
CSVファイルの読み込みが可能
道具は手に入ったけど何からすべき?
初手検定、統計モデリング、機械学習や!
道具は手に入ったけど何からすべき?
初手検定、統計モデリング、機械学習や!
データの分布・正規性は確認した?なぜその因子を組み込んだ/組み込んでいないの?
欠損値・外れ値の影響はどう?そもそもデータ解析で何を明らかにしたいの?
道具は手に入ったけど何からすべき?
初手検定、統計モデリング、機械学習や!
データの分布・正規性は確認した?なぜその因子を組み込んだ/組み込んでいないの?
欠損値・外れ値の影響はどう?そもそもデータ解析で何を明らかにしたいの?
目的をまず設定する必要がある初めに集計・可視化してデータの特徴を見るべき
集計:summary()関数
summary()関数:()の中にデータセットの名前を入れて使う
今回のために作成したテストデータは下記にup済み一部省略していることもありますがコード見ながら再現してもらえると幸いです。
h$ps://github.com/siero5335/test_data_PCB/blob/master/testdata.csv
集計:summary()関数
summary()関数:()の中にデータセットの名前を入れて使う
初に取り込んだ時には要素(factor)で入っていて欲しいデータが文字(character)で読み込まれているので下記コードでfactorにする
集計:summary()関数
summary()関数:()の中にデータセットの名前を入れて使う
データセット名$要素名で各要素にアクセス可能
集計:summary()関数
summary()関数:()の中にデータセットの名前を入れて使う
データセット名$要素名で各要素にアクセス可能
素早くTable用のデータを作ることができる
可視化:ggplot2package
層になるデータを加えると図が更新
ggplot(データ名,aes(要素1,要素2))+geom_point()で散布図が書ける
可視化:ggplot2package
思いつきで追加するのも簡単さっきの図に+で加えるだけ
可視化:ggplot2package,散布図のメリット
外れ値・入力ミスの発見などにも向くので気になる要素についてはどんどん作図する→作図から仮説が得られることも今回の場合は身長、体重が入れ替わっているそうでない部分では相関がありそうに見える一般的に男性の方が身長、体重高め
可視化:ggplot2package,ヒストグラム
データの分布を可視化するならヒストグラム層化も可能
可視化:corrplotpackage
相関解析の結果をまとめて確認したいという需要は多い
相関、相関係数を一気に表記
data_cor<-testdata[,-c(1,3,7:9)]#数値の列だけ抜き出す
M<-cor(data_cor,method='spearman',use='pairwise.complete.obs')#methodの変更可能
corrplot.mixed(M,order='hclust')#近いクラスタを近くに
散布図行列を書くには:h$p://statmodeling.hatenablog.com/entry/sca$er-plot-matrix
正規性の検定
コルモゴロフ・スミルノフ検定:Kolmogorov-Smirnovtestks.test(データ名,"pnorm",mean=mean(データ名),sd=sd(データ名))シャピロ・ウィルク検定shapiro.test(データ名)どっちじゃないとだめと言われることはあんまりない。コルモゴロフ・スミルノフ検定の場合、“pnorm”部分をppoisやpunifに変えるとポアソン分布や一様分布に変えて検定可
データセット名$要素名
正規性の検定
コルモゴロフ・スミルノフ検定:Kolmogorov-Smirnovtestks.test(データ名,"pnorm",mean=mean(データ名),sd=sd(データ名))シャピロ・ウィルク検定shapiro.test(データ名)サンプルサイズが大きい場合はシャピロ・ウィルク検定では違いがあまり出ず、逆の場合はコルモゴロフ・スミノルフ検定では違いが出ないという感じ。
データセット名$要素名
StatsBeginner:初学者の統計学習ノート:正規性の検定の違いh$p://statsbeginner.hatenablog.com/entry/2014/08/13/115744
手法 正規性 等分散性 関数 Package
Student’s t 要 要t.test(group1, group2,
var.equal=T) 不要
Welch’s t 要 不要 t.test(group1, group2,
var.equal=F) 不要
Mann-Whitney 不要 要 wilcox.test(group1, group2) 不要
Brunner-Munzel 不要 不要 brunner.munzel.test(x,y) library(lawstat)
検定:Welch’st検定,Brunner-Munzel検定
ほくそ笑む:マイナーだけど 強の統計的検定 Brunner-Munzel検定:h$p://d.hatena.ne.jp/hoxo_m/20150217/p1Brunner-Munzel検定:h$p://oku.edu.mie-u.ac.jp/~okumura/stat/brunner-munzel.html
正規性のある場合の検定だとStudent’s t 検定, ない時だとMann-Whitneyがしょっちゅう使われるが、等分散性が必要なことはあまり知られてない。
Welch’s t検定,Brunner-Munzel検定はあまり有名ではないが強力な手法。使ってみてもいいかも?
理論の詳細は上記ブログに詳細。
統計モデル:一般化線形モデル glm
相関と回帰は別のもの
相関:2つの変数のバラつきを見るスピアマン:cor(x,y,method="spearman")ピアソン:cor.test(x,y,method="pearson")
単回帰:一つの変数xの値からyの値を予測glm(Y~X1,data=データ名,family=分布の名前(リンク関数))
重回帰:複数の変数xの値からyの値を予測glm(Y~X1+X2...,data=データ名,family=分布の名前(リンク関数))とくにこれらを一般化線形モデルと呼ぶ
データ中の要素名
統計モデル:一般化線形モデル glm
単回帰:一つの変数xの値からyの値を予測glm(Y~X1,data=データ名,family=分布の名前(リンク関数))
重回帰:複数の変数xの値からyの値を予測glm(Y~X1+X2...,data=データ名,family=分布の名前(リンク関数))統計モデリング:予測が目的ではあるが、従属変数が予測にどのように関わっているのかというプロセスを解析するためにも使われる
データ中の要素名
統計モデル:一般化線形モデル glm
単回帰:一つの変数xの値からyの値を予測glm(Y~X1,data=データ名,family=分布の名前(リンク関数))
重回帰:複数の変数xの値からyの値を予測glm(Y~X1+X2...,data=データ名,family=分布の名前(リンク関数))なぜlmではなくglmなのか正規性の確認でも見たように必ずしも目的変数が正規分布に従うとは限らない
一般化線形モデルであれば正規分布に従わない目的変数であっても、ある程度近似が可能になるためあてはまりがよくなる
データ中の要素名
統計モデル:一般化線形モデル glm
久保拓弥:講義のーと :データ解析のための統計モデリングh3p://eprints.lib.hokudai.ac.jp/dspace/bitstream/2115/49477/4/kubostat2008c.pdf
目的変数(応答変数)の分布について気を使う
統計モデル:より発展的なモデリング
h3p://mc-stan.org/interfaces/rstan
ベイズモデルに入門するならRstanが熱い
統計モデル:より発展的なモデリング
h$p://www.slideshare.net/berobero11/glmglmm-36809949
統計モデル:より発展的なモデリング
マニュアル日本語翻訳プロジェクト進行中
h3ps://github.com/stan-ja/stan-ja
機械学習 (Machine Learning)
データ解析における研究課題の一つで、人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法
データ解析における研究課題の一つで、人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法ある程度の数のサンプルデータ集合を対象に解析を行い、そのデータから有用な規則、ルール、知識表現、判断基準などを抽出する。なおデータ集合を解析するので統計学との関連が深い。
機械学習 (Machine Learning)
データ解析における研究課題の一つで、人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法ある程度の数のサンプルデータ集合を対象に解析を行い、そのデータから有用な規則、ルール、知識表現、判断基準などを抽出する。なおデータ集合を解析するので統計学との関連が深い。例えば ?回帰分析・主成分分析・クラスター分析・ベイズ...
機械学習 (Machine Learning)
教師あり・なし学習
教師なし学習出力したいものが 初から決まっていない主成分分析教師あり学習事前情報(教師の助言)にあわせてデータをフィッティングする回帰分析
主成分分析(Principle component analysis, PCA)
次元を縮小・データを可視化するための手法
主成分分析(Principle component analysis, PCA)
次元を縮小・データを可視化するための手法
主成分分析(Principle component analysis, PCA)
次元を縮小・データを可視化するための手法
形・色・重さ・模様・材質など様々な情報(次元)をもつ
主成分分析(Principle component analysis, PCA)
次元を縮小・データを可視化するための手法
形・色・重さ・模様・材質など様々な情報(次元)をもつ影を見れば他の要素が消えて形だけの情報が残る
主成分分析(Principle component analysis, PCA)
次元を縮小・データを可視化するための手法
主成分分析(Principle component analysis, PCA)
次元を縮小・データを可視化するための手法
影しか見えないので何の影なのかは自分で考えないといけない
主成分分析(Principle component analysis, PCA)
主成分分析の際には各変数の標準化が重要になる標準化しない場合だと数値が大きく分散の絶対値が大きい因子の
寄与が大きくなってしまう
主成分分析(Principle component analysis, PCA)
標準化なし
標準化あり
summaryの結果
主成分分析(Principle component analysis, PCA)
標準化なし
標準化あり
上記黄色部分が各種成分の寄与率を表す標準化あり、なしで結果が大きく変わっている
summaryの結果
主成分分析(Principle component analysis, PCA)
標準化なし
標準化あり
上記黄色部分が各種成分の寄与率を表す標準化あり、なしで結果が大きく変わっている
→図でも確認する
summaryの結果
主成分分析(Principle component analysis, PCA)
(98.2%)
(1.04%
)
(47.2%)
(15.7%
)
標準化の有無でPlotの様子だけではなく、寄与する因子のパターンも大きく異る
なしではPCB総濃度や濃度の高いPCB異性体しか目立たないがありでは第2主成分に身長, 体重, BMIが寄与していることが分かる
その他機械学習:caretpackage重回帰分析 (MLR)
部分 小二乗法 (PLS)→次元縮約により潜在変数を作成
Elastic net (Enet)→正則化により不要なパラメータを削減
Support vector regression (SVR)→非線形に対応: カーネル法(高次元に射影)
Gradient boosting Decision Tree (GBDT)→非線形に対応: 多重更新重み付け決定木
線形回帰とその応用
重回帰分析 (MLR)
部分 小二乗法 (PLS)→次元縮約により潜在変数を作成
Elastic net (Enet)→正則化により不要なパラメータを削減
Support vector regression (SVR)→非線形に対応: カーネル法(高次元に射影)
Gradient boosting Decision Tree (GBDT)→非線形に対応: 多重更新重み付け決定木
目的変数を予測するのが目的統計モデリングとの違いは?
線形回帰とその応用
その他機械学習:caretpackage
重回帰分析 (MLR)
部分 小二乗法 (PLS)→次元縮約により潜在変数を作成
Elastic net (Enet)→正則化により不要なパラメータを削減
Support vector regression (SVR)→非線形に対応: カーネル法(高次元に射影)
Gradient boosting Decision Tree (GBDT)→非線形に対応: 多重更新重み付け決定木
従属変数の寄与よりも予測の良さを良しとすることが多い
線形回帰とその応用
その他機械学習:caretpackage
重回帰分析 (MLR)
部分 小二乗法 (PLS)→次元縮約により潜在変数を作成
Elastic net (Enet)→正則化により不要なパラメータを削減
Support vector regression (SVR)→非線形に対応: カーネル法(高次元に射影)
Gradient boosting Decision Tree (GBDT)→非線形に対応: 多重更新重み付け決定木
GCのリテンションタイム予測, 結合能・活性の予測等
線形回帰とその応用
その他機械学習:caretpackage
機械学習:caretpackage
データサイエンティスト養成読本R活用編 P45参照
データ全体を訓練データと検証データに分割して検証することで、未知データに対応可能か確認
データ
訓練データ
検証データ
モデル構築
モデル検証
予測モデル
Cross validationで訓練モデルの 適化
機械学習:caretpackage
データサイエンティスト養成読本R活用編 P45参照
データ全体を訓練データと検証データに分割して検証することで、未知データに対応可能か確認
なんか難しいしめんどくさそう → 実際闇は深い
データ
訓練データ
検証データ
モデル構築
モデル検証
予測モデル
Cross validationで訓練モデルの 適化
機械学習:caretpackage
データサイエンティスト養成読本R活用編 P45参照
データ
訓練データ
検証データ
モデル構築
モデル検証
予測モデル
Cross validationで訓練モデルの 適化
データ全体を訓練データと検証データに分割して検証することで、未知データに対応可能か確認
caret packageで多少改善?
h3p://topepo.github.io/caret/index.htmlKuhnM(2008)Buildingpredic^vemodelsinRusingthecaretpackage.J
StatSo`w28:1–26
機械学習:caretpackage
さっきのフローを一括して行うためのpackage
機械学習:caretpackage,データ分割
createDataParggon()関数
データの分割はランダムに行われるため、解析の再現性を重視するのであればset.seed()関数で乱数を固定しておくこと
この後の解析においても乱数が絡むものであれば乱数を固定することで再現性上がる
trainIndex<-createDataParggon(y,#目的変数,データセット$変数名で設定gmes=1,#何種類分割データを作るかp=0.5)#何対何で分割するか(0.5なら半分)Train<-データ名[trainIndex,]#分割データを入れるTest<-データ名[-trainIndex,]#分けて残ったデータを入れる
機械学習:caretpackage,学習の設定
trainControl関数(とりあえずクロスバリデーションの設定のみ)example_train<-trainControl(method="repeatedcv",number=5,#5-foldの場合,1つ抜きならLOOCVと記述repeats=3,#分割の組をいくつ作るか,LOOCVなら不要allowParallel=TRUE)#マルチコア計算,早く計算が終る
後で説明するtrain関数内に上記条件を記述することも可能だが、条件を変えて色々試したいことも多いので別に記述して保存しておくのが吉
本当はもっと詳細な設定が可能、helpを参照のこと
機械学習:caretpackage,チューニング設定
学習の際に色々設定しないと思ったほど性能が出ない
例えば?みんな大好きPLS->何次元目まで学習に使う?Randomforest->木の深さをどのくらいにするか
近流行りの深層学習->死ぬほど設定するパラメータがある(ある程度)効率良くパラメータを探索できるRandomforestなら下記
test_grid<-expand.grid(mtry=c(1:10))#木の深さを1~10の間で探すパラメータは手法ごとに違うのでcaretのHPで確認のこと
expand.grid関数(caretにかぎらず使用可)
機械学習:caretpackage,学習
train関数
set.seed(71)Fit<-train(Class~.,data=training,method=”rf“,#randomforestのときtrControl=example_train,#trainControlで設定tuneGrid=test_grid)#expand.gridで設定上記を実行すると解析開始。誤差 小のmtryが入った結果をFitに入れてくれる(正確には違うが…)
methodの中身を入れ替えると色々なモデルが学習可能
機械学習:caretpackage,予測
testPred<-predict(Fit,tesgng)新しいデータセットに対してさっき作ったモデルを当てはめ実測値等と比較し、当てはまりの良さを確認する。回帰分析ならcor(testPred,tesgng$outcome)など判別ならconfusionMatrix(testPred,tesgng$Class)など他にもいろいろな指標はあるがまずはここから
解析再現性,レポーティング:RMarkdown
ここを選んで.Rmdファイルを作る
解析再現性,レポーティング:RMarkdown
#は目次、見出し##のように増やすと章、節…みたいな感じで文章を区切ることができる```{r}```上記の括弧で囲んだ中身にRのコードを書く囲んだ外の部分には普通に日本語を記入してメモや考察を書くことも可能解析用の実験ノートとして使うと良い
解析再現性,レポーティング:RMarkdown
ここを選ぶと.htmlファイルが出力される
解析再現性,レポーティング:RMarkdown
出力されると右のような感じコードが灰色の、実行結果が白の枠の中に出力される{rpressure,echo=FALSE}でecho=FALSEとしておくと、コードが出力されなくなるデータ・乱数が固定されていれば変わらない結果がいつでも出力されるので、データ解析の再現性を確保できる
Rの疑問に関する質問サイト
RおじさんがRの疑問に答えてくれる場h3p://qiita.com/uri/items/5583e91bb5301ed5a4ba
Rの疑問に関する質問サイト
下記サイトにメアドを登録すればO.K。登録者は他の参加者のアドレスを見ることができるので気になるようなら捨てアドで良い
h3ps://r-wakalang.herokuapp.com
機械の体を手に入れるのよ、 鉄郎!!!:h3p://www.slideshare.net/teramonagi/ss-52463319?qid=c38069a7-51e0-425a-9a3d-945412d41e2b&v=&b=&from_search=3
Rの疑問に関する質問サイト
Rの疑問に関する質問サイト
おすすめ本(読んだもの)
もっと基礎から固めたいなら
線形代数と微積は簡単な本で良いので抑えておくと統計や機械学習の理論についての本を読む時にとても楽
(楽というか抑えてないと読めない)
まとめ
Rstudioがおすすめ
まず集計、可視化していくところから始める
外れ値・誤入力などに注意
分布には気をつける
分布を気にし始めるとlm→glm→ベイズモデルになるかも
機械学習は予測第一,統計モデリングは従属変数の寄与も重視する
再現性・レポーティングにも気を使う
もっと色々な手法があるのでRで動かしてみると良い
おわりに
環境化学は総合的な学問
愛媛大の環境であれば化学分析・毒性についてはみんな卒業時にはある程度の力量がついてくる
が、研究で生きていくなら本筋のテーマ以外にサブで個人的に突き詰めていくテーマがないと、“総合的”の部分に対応しにくくて苦しくなる可能性がある
今回は解析の話だったが、 bioinfo,動物実験,分析法開発など、サブの武器は自分で好きな分野を選べば良い
今日は実験しんどいけど解析ならやる気分になる、とかであれば気分の切り替えにもなるしいいかも?
Enjoy!