【1-3】Rのソフトはどれを使えばいいか?目的別チャートを作りましたではRを使うためのソフトを紹介しました。


その中で統計を勉強してみたいという方はRstudio + EZR(Rコマンダー)の組み合わせをおすすめしました。

Rを使っている方は「EZR(Rコマンダー)しか使っていない」や「Rstudioしか使っていない」という方が多いのですが、実はRstudioからRコマンダーやEZRを簡単に呼び出すことができます。

今回はRstudioからEZRを呼び出す方法を紹介します。


1.EZRのインストールをRstudioだけで行う。

EZRのダウンロード、インストールは自治医科大学附属さいたま医療センターのページで紹介されていますが、Rstudioからでも行えます。

①RstudioのInstallボタンを押す
Rstudioの真ん中あたりにInstallボタンがあります。これはRの様々なパッケージをプログラムを書かずにダウンロード、インストールすることができます。
スクリーンショット 2020-04-24 19.34.48

②RコマンダーとEZRをインストール
次にRコマンダーとEZRをダウンロードします。

Packagesという欄にrcmdrと入力します。
そうすると候補にRcmdrとRcmdrPlugin.EZRという2つが見つかります。
スクリーンショット 2020-04-24 19.34.58

まずはRcmdrをインストールし、次にRcmdrPlugin.EZRをインストールします。

この作業は今回やってしまえば次回以降は行う必要はありません。


2.EZRを呼び出す

EZRを呼び出すには2つ手順が必要ですが慣れるとすぐにできるようになります。

①Rコマンダーを呼び出す(2種類の方法があるので好きな方でいいです)
②RコマンダーからEZRを呼び出す


①Rコマンダーを呼び出す

1つめの方法はPackagesからRcmdrをクリックして呼び出す方法です。
スクリーンショット 2020-04-24 19.35.03
2つめの方法は下のコードを入力する方法です
library(Rcmdr)

慣れるとコードを書いた方が早いですが、最初はクリックする方法の方が早いかもしれません。
(自分がそうでした)


②RコマンダーからEZRを呼び出す

EZRはRコマンダーから呼び出します。

ツール→Rcmdrのプラグインをロード…を選択
スクリーンショット 2020-04-24 19.35.13


RcmdrPlguin.EZRが選択されていることを確認してOK
スクリーンショット 2020-04-24 19.35.21

OKを押して再起動
スクリーンショット 2020-04-24 19.35.28

これで完了です。
見た目は似ていますが「標準メニュー」となっていればEZRになっています。
スクリーンショット 2020-04-24 19.35.36



3.注意点
・RstudioのPackageにRcmdrPlugin.EZRがあるのですが、クリックしても何も反応しません。上記の手順が必要です。

・EZRを使うと結果はRstudioのコンソール画面に出てきます

・1度開いたEZRを×で閉じてしまうと、同じ方法を行っても開かないことがあります。一旦Rstudioを再起動するかプロジェクトを開き直すとまたできるようになります。

・グラフはRstudioのPlotではなく別ウィンドウで開くことがあります。

この辺りはパソコンのOSでも挙動が違うかもしれません。私はmacを使っていますが、もしWindowsで違う挙動があればこの記事でも紹介しますので連絡いただけると嬉しいです。


4.まとめ
今回はRstudioとEZRを同時使いするための方法を紹介しました。

Rstudioだとどう使えばいいかわからない。でもいずれ使えるようになってみたい。という方は同時使いをがおすすめです。EZRの手軽さ、それがどのようなコードで書かれているのかを同時に体験することができると思います。

またEZRの使い方はハルさんのシロート統計学講座がおすすめです!
無料ですが、これだけでEZRの使い方はほとんど理解できると思います。






最近は大きなお金を出さなくてもプログラミングを学べるサービスやサイトが増えてきました。

データ分析を行うRやpythonに関しても同様で、その気になれば無料で学ぶこともできます。

私は2018年夏〜2019年春にかけてRのオンラインのコースを受講しました。

そして今回はpythonを使ったデータサイエンスを学ぶために2019年12月〜2020年3月に開催された東京大学グローバル消費インテリジェンス寄附講座(GCI 2019 Winter)を受講しました。



スクリーンショット 2020-03-25 17.09.59
おかげさまで無事に終了することができました。

今回はGCIについて紹介します。


1.参加者

GCI 2019 Winterでは東京大学の学生だけでなく、社会人、他の大学生、高校生と幅広い層が参加しました。

受講には事前テストがあります。
受講前に、スキルを確認のための簡易のテストを実施する可能性があります。内容は主にPythonのプログラミングに関するもので、一部Numpyや行列処理に関する問題を出題する予定です。レベルとしては基礎的なものを出題します( https://github.com/jakevdp/WhirlwindTourOfPython のようなレベルです)。申込者が多数の場合は、テストの結果および当フォームの記載内容も加味して一定数に申込者を絞った後、最終的には抽選で受講者を決定する予定です。
上記リンクを完全に理解できていなくても十分大丈夫です。出題されるのは基礎的な範囲です。
ただ講義が始まると何度も資料を見直しながら試行錯誤することになるので、事前に予習としてテキストを見てコードを書く練習になります。


2.講義内容

主に毎週配られる講義資料での自主学習、宿題、コンペ、最終課題があります。

講義内容
スクリーンショット 2020-03-28 15.11.43

上記はGCI 2019 Winterのスケジュールです。講義毎にiLectというものをつかい、オンライン上で資料を読みコードを実行しながら学ぶ形でした。資料はダウンロードすることも可能です。

今回webスクレイピングやpythonを使ったアプリ開発などは講座の対象範囲外でした。


宿題
1回 / 1〜2週のペースで宿題があります。
宿題は提出すると0時に採点され、締切までに正解することが求められれました。
締切日に宿題を行うと1回勝負の提出になるので早めに行うことがポイントです。
またslackを通じて学生同士で情報共有ができる、締め切り数日前から受講生同士でヒントを出し合ったりしていました。


コンペ
kaggleというデータのコンペティションのサイトがあるのですが、それに準じたコンペが3回ありました。コンペではあるデータから機械学習の予測モデルを作り、未知のデータでどの程度精度が出るかを競いました。受講生同士でスコアを競い合うのでかなり修行になりました。

またslackで情報共有したり成績優秀者の解法を共有したりとテキストでは学べないことを多く学びました。

個人的にはこのコンペでかなり鍛えられた感覚があります。上位に入るにはテキストにあること以上に調べることが増えるからです。

自分は3回のコンペで38/799位、116/465位、101/628位でした。

もっと上位を目指したかったのですが、そうは甘くなかったです。


slackによる情報共有
前述にありましたがslackによる情報共有が多く行われていました。

宿題やコンペの質問や講義以外のその他の有用な情報、諦めそうな時の励ましの言葉などオンラインであっても1人ではないという感覚は強かったです。

Edxでもそうでしたが、独学だとどうしても息が切れそうな中、一緒に勉強している人がいるという感覚はとても大切な要素だと思います。

何度か心折れそうになりましたが、最終的には約400人が合格しました。
共有する力は大きいと思います。


修了者イベント

修了証の発行、修了者へのクローズなコミュニティなど修了後のメリットもあります。
修了者向けのイベントがある予定ですが、COVID-19の影響で延期になりました。


3.実は講義資料は今でも確認できる
事前のテスト、宿題、コンペ、最終課題など非公開のものもありますが、実は前年度の講義資料は書籍化されています。

東京大学のデータサイエンティスト育成講座
大澤 文孝
マイナビ出版
2019-03-14



またその気があれば講義データも無料公開されています。



内容は一緒ですが書籍は以下のメリットがあります。

・自分のパソコンで始めるためのインストール、設定方法が紹介されている
・(確実に)見やすい
・辞書のように使える

なので私は「この講義を受ける」と思った日に書籍を購入して何度も見返しました。


4.自分が経験できたこと
この3ヶ月、pythonほぼ未経験者でも講義資料やslackを通じた情報共有で以下のことが体験できました。

・pythonの基本的な使い方
・numpyやmatplotlib、pandasなどの使い方
・探索的データ分析(EDA)
・scikit-learnを使った機械学習
・(コンペを通じて)lightGBMなどの勾配ブースティングの使用経験
・クロスバリデーションやGridSearchCV、optunaを使ったパラメータ調整
・成績優秀者の解法に触れる
・「データ集めてとりあえず機械学習・AIを使えば何かいい結果が出るんだ」なんて甘い話はないこと


本だけでは学べない経験ができたと思います。


5.次回の予定

4月以降に次回GCIが開催される予定ですが、次回は学生限定だそうです(東京大学以外でもOK)。
社会人向けは過去4年間は冬に開催されていましたが、2020年も開催されるかどうかは決まっていません。もともと2019年度も一時開催しない予定と連絡があったので、あったらラッキーという認識です。

学生の方はチャンスだと思いますし、もし今後社会人の講義が開催されることがあれば検討の価値はあるかなと思います。


6.まとめ

今回は東京大学グローバル消費インテリジェンス寄附講座(GCI)について紹介しました。
もし興味があればtwitterで #GCI で受講生のツイートが確認してみてはいかがでしょうか。
(2019年12月〜2020年3月の期間で検索)

amazon
東京大学のデータサイエンティスト育成講座
大澤 文孝
マイナビ出版
2019-03-14



楽天
東京大学のデータサイエンティスト育成講座 [ 塚本邦尊 ]
東京大学のデータサイエンティスト育成講座 [ 塚本邦尊 ]


データを扱う中で「外れ値を外す方法」に関して検討してみます。

apply関数の記事で以下のコメントがありました。




大変勉強になりました。
列ごとに、ファイルの値(NAがある)が2SDより高い値をNAにしたいです。
Data01 <-read_excel("raw.xlsx",1)
Data02 <-apply(Data01, 2, sd, na.rm = TRUE)
Data01[Data01 > 2*Data02]<- NA
以上のコードをして最後は列ごとにうまく出来なかったです。
ご提言があれば大変嬉しいです。

自分もそうですが、実際にやってみるとうまくいかないことってたくさんあります。
今回は質問を一緒に考えながらどう考えるか?どんな解決方法があるかを考えて、今までの理解を深めるきっかけになればと思います。

1.データの作成

コードを確認してみます。
Data01 <-read_excel("raw.xlsx",1)
これはraw.xlsxの1シート目を読み込むという意味なので、今回は仮のデータを作ります。

set.seed(2020)
a <- c(rnorm(998,10,1),NA,30)
b <- c(rnorm(998,20,1),NA,40)
c <- c(rnorm(998,30,1),NA,50)
Data01 <- data.frame(a,b,c)
head(Data01)
簡単に言うと以下のとおりです。
a : 平均10, 標準偏差1のデータ998個にNAと30を加えた1000個のデータ
b : 平均20, 標準偏差1のデータ998個にNAと40を加えた1000個のデータ
c : 平均30, 標準偏差1のデータ998個にNAと50を加えた1000個のデータ

スクリーンショット 2020-03-28 2.34.45
この赤色が2SDを超えたデータです。やりたいことはこの赤い点のデータを削除することです(これの是非については今回問いません)

2.apply関数のおさらい

次の行を確認します。
Data02 <-apply(Data01, 2, sd, na.rm = TRUE)
apply関数【2-1】Rのfor関数、apply関数を使ってまとめて標準偏差などの統計量を求める方法で紹介しました。下はイメージ図です。
スクリーンショット 2020-03-27 13.46.36
上図ではsd関数(標準偏差)を求めました。
また欠損値(NA)があるのでrm.na = TRUEをつけることでNAの値を外して計算してくれます。

スクリーンショット 2020-03-27 13.54.01
それぞれの列の標準偏差が表示されました。
ただ元データが2標準偏差を超えているかどうかを確認するにはこれだけでは足りません。


3.どう考えるか?
スクリーンショット 2020-03-28 4.00.30

それぞれのデータが2SDを超えているかどうかを判定する必要があります。
具体的には(平均-2SD) < それぞれの値 < (平均 + 2SD)の条件を満たしているかどうかとなります。

そのため以下の2つを行えばなんとかできそうです。
①a,b,cそれぞれの平均±2標準偏差の値を求める
②条件に合えばそのまま、条件にあわなければNAと変換する


 4.平均±2SDを求める

まずa,b,cの平均と標準偏差を求めます。
これには前述のapply関数かsummarize関数を使います。
まずはapply関数でやってみます。

Data01_mean <-apply(Data01, 2, mean, na.rm = TRUE)
Data01_sd <-apply(Data01, 2, sd, na.rm = TRUE)
Data01_mean
Data01_sd

low <- Data01_mean - 2*Data01_sd
high <- Data01_mean + 2*Data01_sd
low
high
スクリーンショット 2020-03-28 3.17.41

ここからlow[2]、もしくはlow["b"]とすればbの平均-2SDが取り出せます。
high[1]、もしくはhigh["a"]であればaの平均+2SDとなります。

5.条件に合わないものをNAにする

次に条件に合わないものを抽出しNAにします。
データを抽出するにはデータ[条件]を使います

(aのデータ < 平均-2sd) または (平均+2SD < aのデータ)だとこうなります
Data01$a[(Data01$a < low["a"]) | (high["a"] < Data01$a)]
スクリーンショット 2020-03-28 4.08.45

条件式の記号については以下をご参照ください。今回はまたはの意味の を使いました。
スクリーンショット 2019-02-11 2.04.40
抽出した条件に <- を使うことでデータを置き換えることができます。
Data02 <- Data01
Data02$a[(Data02$a < low["a"]) | (high["a"] < Data02$a)] <- NA
Data02$b[(Data02$b < low["b"]) | (high["b"] < Data02$b)] <- NA
Data02$c[(Data02$c < low["c"]) | (high["c"] < Data02$c)] <- NA
これで完成です!
ただ他にも方法があります。どれもよく使う方法なので、もし余力があればぜひ比べてみてください。


6.tidyverseパッケージを使う(dplyrパッケージでも同じ)

第2章で紹介しているtidyverseパッケージのsummarize関数とmutate関数を使うこともできます。
tidyverseパッケージを使うときには先にlibrary関数で呼び出します。なければ先にインストールします。
#もし初めての場合はインストール
install.packages("tidyverse")
#インストール済ならlibrary関数で呼び出す
library(tidyverse)
low_high <-
  summarize(Data01,
          a_low = mean(a, na.rm = TRUE)-2*sd(a, na.rm = TRUE),
          a_high = mean(a, na.rm = TRUE)+2*sd(a, na.rm = TRUE),
          b_low = mean(b, na.rm = TRUE)-2*sd(b, na.rm = TRUE),
          b_high = mean(b, na.rm = TRUE)+2*sd(b, na.rm = TRUE),
          c_low = mean(c, na.rm = TRUE)-2*sd(c, na.rm = TRUE),
          c_high = mean(c, na.rm = TRUE)+2*sd(c, na.rm = TRUE)) 
class(low_high) #型を確認するとdata.frameとなっている
low_high <- unlist(low_high)
class(low_high) #型を確認するとnumeric(数値型)となっている
low_high
スクリーンショット 2020-03-28 3.37.43
文字は多いですが、コピペを使えば作業自体は楽になります。
ただsummarize関数の結果は表形式(data.frame型)で、このままでは数値として計算できません。
そのためunlist関数を使って数値型に戻します。
low_high[5]、もしくはlow_high["c_low"]とすればcの平均-2SDとなります。


既に第2章を読まれた方は%>%を使う事もできます。
#%>%使う場合
low_high <- summarize(Data01, a_low = mean(a, na.rm = TRUE)-2*sd(a, na.rm = TRUE), a_high = mean(a, na.rm = TRUE)+2*sd(a, na.rm = TRUE), b_low = mean(b, na.rm = TRUE)-2*sd(b, na.rm = TRUE), b_high = mean(b, na.rm = TRUE)+2*sd(b, na.rm = TRUE), c_low = mean(c, na.rm = TRUE)-2*sd(c, na.rm = TRUE), c_high = mean(c, na.rm = TRUE)+2*sd(c, na.rm = TRUE)) %>%
unlist()
low_high
スクリーンショット 2020-03-28 3.32.12

次に条件に応じて分類するifelse関数を使うこともできます。

ifelse(条件TRUEの場合FALSEの場合)

列の追加や修正を行うmutate関数を使うことでこうなります。
Data02 <- 
  Data01 %>% 
  mutate(a = ifelse((low_high["a_low"] < a) & (a < low_high["a_high"]), a, NA),
         b = ifelse((low_high["b_low"] < b) & (b < low_high["b_high"]), b, NA),
         c = ifelse((low_high["c_low"] < c) & (c < low_high["c_high"]), c, NA))
スクリーンショット 2020-03-28 4.57.19

条件式を少し変えているので確認してみてください。今回は&を使っています。

tidyverseパッケージは現在のRを使う上でとても重要になります。
ifelse,mutate関数に関してはこちらで紹介していますので難しかったという方はご参照ください。




7.関数を自作しapply関数でまとめて処理する
他の方法としては関数を自作するという方法があります。

関数名 <- function(○) {中身のコード}

今回はdrop_2sdという名前の関数を作ります(名前は何でもいいけど文字の最初に数字を使うのは×)。


a = ifelse((aの平均-2SD < a) & (a < aの平均+2SD), a, NA),
b = ifelse((bの平均-2SD < b) & (b < bの平均+2SD), b, NA),
c = ifelse((cの平均-2SD < c) & (c < cの平均+2SD), c, NA)
 ↓
function(x){
 ifelse((xの平均-2SD < x) & (x < xの平均+2SD), x, NA)
}
と共通部分をxにします。ちなみにxでなくてもcolとか別の名前をつけても大丈夫です。

drop_2sd <- function(x){
  ifelse((mean(x, na.rm = TRUE) - 2 * sd(x, na.rm = TRUE) < x) & (x < mean(x, na.rm = TRUE) + 2 * sd(x, na.rm = TRUE)), x, NA)
}
そしてapply関数で各列にdrop_2sd関数を使います。
Data02 <- apply(Data01, 2, drop_2sd)
スクリーンショット 2020-03-28 4.50.32
2行のコードで終わりました。
関数を作るのは最初は慣れないですが、使えるようになると強力です。


8.まとめ

今回は標準偏差±2SDの除去を3つの方法で紹介しました。

本やサイトで独学すると1つの方法でしか紹介してないことが多いです。

本当は自分の知っている知識でもできるはずなのに、知らない方法を偶然読んでしまいドツボにはまることもあります。そういった紆余曲折は勉強する上で必要な苦労でもありますが、いくつかの方法を見比べることでショートカットできることもあるのではと思っています。

また自分が躓いたところや他の記事でもコメントがあれば検討していきますので、ブログのコメントやtwitterで連絡いただければ幸いです。

↑このページのトップヘ