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

データ分析を行う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で連絡いただければ幸いです。

2019年もあと1日となりました。

昨年末からブログを初めて1年。マイペースに続けているブログですがブログやtwitterを通じて色々な出会いがある1年となりました。

今回は来年に向けてということで、今年の振り返りと来年の目標を表明していきます。

ちなみに昨年の記事がこちらです。



昨年末に上げた目標がこちらでした。

・Edxで勉強しているRを終了させる
・4月からpythonを勉強する
・アウトプットを引き続き行う

1.Edxで勉強しているRを終了させる

2018年夏にRを独学で学ぼうと始めたEdxのdatascienceのシリーズです。
9つコースがあるのですが、無事修了できました!!!
最初はRのコードを書くのに精一杯で、最後は英語のレポートに大苦戦したのも楽しい思い出です。
ただ推定や機械学習はまだ勉強が必要ですねー。



本来このコースは週2〜3時間勉強すると約1年半かかるコースのようです。
毎日3時間(多い時は15時間)学習して、9ヶ月(学会などでできない時期もあったので実質には7ヶ月程度)くらいかかりました。

あくまでも個人の感想ですが、このコースが終了できれば以下のことは出来るようになるのではと感じています。
・初心者を脱して今から中級者を目指す
・Rの書籍がアレルギーを起こさずに読めるようになる
・(Rを使う)職場なら教えてもらったことが理解できる
・今後も自習で学ぶことが出来る
・パッケージ開発はできない

修了証をもらわず勉強するだけなら無料なので興味がある方は是非挑戦してみてください!




2.pythonを勉強する

2019年末に東京大学グローバル消費インテリジェンス寄付講座を受講したいと思っていて、そのためにはpythonを学ぶ必要がありました。

一度アップされている資料を見たのですがRとどこが同じで違うのかを中々理解できませんでした。
そのための準備として村本先生の非エンジニアのためのプログラミング入門講座を受講することにしました。




今は予定通り東京大学グローバル消費インテリジェンス寄付講座の受講真っ最中で、3月の修了を目指しています。

今回はKaggleのようなコンペが3回あり、Edxの時よりもより実践的にデータ分析を勉強しています。
(Edxでもありましたが実力不足なのは否めませんでした)

3.アウトプットを続ける

ブログ47記事


Qiita4記事


記事は50記事書いてました。
現在はハルさんと「シロート統計学」のEZRでやった解析をRで行うとどうなるか?といった記事を作成しています。

Fukuoka.R

EdxでRのコースを終了してからFukuoka.Rの勉強会にも参加するようになりました。

今年はLT(5分程度の発表)を2回行いました。





来年も発表できるようネタを考えてみたいと思います。


学会2つ

日本リハビリテーション医学会と日本神経理学療法学会で発表しました。

神経はチームの後輩の分も関わっていたので主に3つ行いました。

今年は学会を通じて、twitterで関わった方と直接お話できました。その節は本当にありがとうございました!


来年の目標

GCI(東京大学グローバル消費インテリジェンス寄付講座)の修了

まずは医療統計だけでなくデータサイエンスのスキルを上げるためにこの講座の修了を目指します。

毎週課題がありコンペもありますが、1年前のRの経験があるので今回もやりきれると思っています。

ただ自分でコンペは最初よりもスコアが下がっているのでコツコツがんばります。

そして大学数学をやったことないのに線形代数を勉強が必要なので、出来る範囲で勉強していきます。


統計検定2級取得

統計を勉強しているので統計検定2級は取得したいと考えています。

秋に「GCIがないかも」という情報だったのでpythonより統計検定を先にしようか?とも思っていたのですが、GCIを受けられることになったので4月以降に始めたいと考えています。


学会

来年は神経理学療法学会と回復期の学会で発表できないか検討しているところです。

ただ発表だけでなく論文も考えていきたいです。

部署のデータ分析を勧めたい

現在行っている部署のデータ分析をまとめたいと考えています。

部署でデータを取ると色々問題も発生することが多く、頭を悩ませながら進めています。

ただみんなに頑張ってもらっている分、成果がでるように踏ん張ってスタッフや患者さんへ還元できるよう踏ん張って結果を出したいと思ってます。

そしてまだ始めたけど時間が取れていないレセプトのデータ分析も結果を出して職場の収入へ貢献したいと考えています。


新しい挑戦

まだ公表してませんが、ブログやtwitterを通じて新しい話を頂いています。

初めてのことで不安もありますが、誠意をもって対応していきたいと思います。


まとめ

昨年は「勉強を始めよう」と1歩踏み出したところでしたが、この1年で多くの経験が行えたと思います。

ただ、まだ目に見えた成果物があるわけではありません。

データ分析も職場に貢献できて初めてやった意味があると思うので、結果を出すことを目指して頑張りたいと思います。






↑このページのトップヘ