jnobuyukiのブログ

研究していて困ったことやその解決に関するメモ。同じように困ったあなたのために。twitter ID: @j_nobuyuki

分析はプログラミングを利用したほうが良いのはなぜか?(初学者向け)

今回は,統計学やデータ分析の初学者の方に向けて,「なぜプログラミングを利用したほうが良いのか?」を考えてみます。

データ分析の方法

何らかの方法でデジタル化されたデータがあれば,それを使って,計算し,データの特徴を調べられます。数量で扱えるデータであれば,データの平均や散らばり,データの分布の形状などです。これらの計算は,手計算でもできます。でも,せっかくデジタルデータになっているので,計算用のアプリケーションを利用すると簡単に行えます。計算にアプリケーションを利用するのであれば以下の2つの方法が考えられます。

実際には,前者の表計算アプリケーションを利用する人が圧倒的に多いと思います。しかし,私はあえて後者のプログラミング言語を利用する方法をおすすめしたいと思います。でも,プログラミング言語を利用して,データの分析を行うにはちょっとしたコツと言うか,算数や数学の計算と異なる考え方をする必要があると思います。今回はそれを説明していきます。

具体例で,手計算,表計算アプリ,プログラミング言語による計算を比較

具体例があった方が話しやすいので,以下のような例を考えてみましょう。

Aさん,Bさん,Cさん,Dさん,Eさんの5人に一日の平均睡眠時間を尋ねたところ,それぞれ6時間,8時間,5時間,7時間,6時間という答えになりました。この5人全体としては,睡眠時間についてどんな傾向を持っているでしょうか?

こんな問題があったとして,真っ先に思いつくのは「グループ全体としての平均睡眠時間は〜時間です」だと思います。
たった5人の計算であれば,紙とペンで計算もできます。やってみましょう。

手計算の場合

平均を求める式を言葉で表すと,以下のようになります。
(Aさんの睡眠時間 + Bさんの睡眠時間 + Cさんの睡眠時間 + Dさんの睡眠時間 + Eさんの睡眠時間) ➗ 人数 = グループの平均睡眠時間
データがあるので,数字に直しましょう。
( 6 + 8 + 5 + 7 + 6) ➗5 = 6.4時間

これで良いと思います。この例だったらデータのサイズがわずか5人なので,計算の手間もそれほどではありません。でも,これがある学校の生徒1000人の平均睡眠時間を計算する場合だったらどうでしょうか?そうなると手計算の手間がかかりすぎるので,以下で示すようなアプリケーションを利用するのが良いでしょう。

表計算アプリケーションの場合

では,表計算アプリケーションでも計算してみましょう。まず以下のように,データを表にしてみました。

f:id:jnobuyuki:20181117190035p:plain

このように表ができたら,セルの数を参照して平均を計算できます。以下のように,手計算と同じように参照しながら計算することができます。
f:id:jnobuyuki:20181118022148p:plain

しかし,表計算アプリケーションには,便利な関数(マイクロソフトエクセルならaverage関数)があり,データの個数を自分で入力しなくても計算可能です。

f:id:jnobuyuki:20181118022308p:plain

ここで上の2つの方法を比べてみましょう。上の方法は,手計算の場合とほぼ同じです。なので,エクセルに慣れていない人でも,すぐに意味がわかると思います。一方,下の方法は,average関数というエクセル特有の仕組みを使っているので,計算の中身がわからないです。ここが少し不安になるかもしれませんね。ただし,計算の際に参照している数字は同じであることが見て取れます。

Rを使った方法

では,プログラミングを利用する方法としてRで同じ計算をしてみましょう。Rを電卓のような感じで利用するのであれば,以下のようにコードを書くと良いでしょう。

(6 + 8 + 5 + 7 + 6) / 5

Rでもエクセルと同じような関数が用意されています。mean関数です。引数として,カッコの中に数字を入れるのも同じです。

mean(c(6, 8, 5, 7, 6))

Rのようなプログラミング言語で計算する場合,入力する数字や計算の結果をオブジェクトと呼ばれるものに保存できます。例えば以下のように書きます。

sleepTimeData <- c(6,8,5,7,6)

sleepTimeDataMean <- mean(sleepTimeData)

print(sleepTimeDataMean)

上記で,sleepTimeDataやsleeTimeDataMeanがオブジェクトです。名前は好きなものが使えます*1。この形にしてしまうとmean関数を利用する際に数字がぱっと見てわかる数字が一切ありません。この方法に慣れていない人は,ここで自分が何をしているのかわからなくなると思ってしまうかもしれません。落ち着いて,上の行を見れば具体的な数字が出てくるので,mean関数にどんな数字を使っているのかがわかります。

なぜプログラミングした方が良いのか?

なぜプログラマは,数字を記入せずに,ぱっと見ではわからない書き方をしているのでしょうか。次の例を考えてみましょう。

sleepTimeData <- c(6,8,5,7,6,4,9,10, 7, 8, 6, 6, 5, 9, 3, 7)

sleepTimeDataMean <- mean(sleepTimeData)

print(sleepTimeDataMean)

この例では,先の例に比べてたくさんの人の睡眠時間を使って平均を計算しています。ここ大事なのは,入力として使うオブジェクト(ここではsleepTimeData)の行だけ,数字が違うことです。残りの2行は先程の例と全く同じコードが書かれています。もしも,オブジェクトを使わずに計算すると以下のようになってしまいます。

(6 + 8 + 5 + 7 + 6 + 4 + 9 + 10 + 7 + 8 + 6 + 6 + 5 + 9 + 3 + 7) / 16

このように書くと,数字が変わるたびに計算式を毎回変更しなければいけないですね。そして,数字がいくつあるかも数えなければいけません。この例では,多いとは言っても比較的少ない数の数字の計算ですが,これが1000とか10000になると大変です。一方,オブジェクトを利用すれば,入力の段階でミスをしなければ,数字の数を数えることもなく,いつでも同じ計算用のコードを利用できるわけです。

実は,この他にもプログラミングを利用した方が良い理由があるのですが,それは別の記事になっているので,こちらを御覧ください。

webbeginner.hatenablog.com

まとめ

今回は,データ分析の方法として,数式で手計算する方法,表計算アプリケーションを利用する方法,プログラミンを利用する方法を比較してみました。その結果として,プログラミングを利用すると,一度作った計算手続きを他の計算にもうまく利用できることを示しました。今までプログラミングをしたことがなくて,難しそうと思っている人も,オブジェクトの利用の仕方を工夫しながらぜひ挑戦してみてください。

*1:命名は,中身がわかるようにした方が良いと思います。また,すでにRで使われている名前のオブエジェクトは避けたほうが良いです

Rをアップデートしたらjupyter notebookの設定もアップデート

これまでに2回ほどjupyter notebook(またはipython notebook)のインストールについて紹介しました。この度,Rのメジャーアップデートをしたので,その後の設定についてメモを共有します。

必要なパッケージのインストール

以下のページに載っているように,パッケージを再度インストールします。

qiita.com

install.packages(c('repr', 'IRdisplay', 'evaluate', 'crayon', 'pbdZMQ', 'devtools', 'uuid', 'digest'))
devtools::install_github('IRkernel/IRkernel')

ここまではRやRstudioのインターフェイスで実行します。

[重要] ターミナルからRの関数を実行

ターミナルでやらないといけない関数があります。

library(IRkernel)
installspec()

RやRStudioのインターフェイスから実行するとエラーが出て,うまくいきませんでした。ご注意ください。

盗用・剽窃はなぜいけないのか

今回は,最近,考えたことを書きます。

盗用と剽窃

例えば何か研究成果を発表するときに,他人の意見を自分の意見であるかのように述べること,他人のデータを自分のものであるかのように紹介すること。これらは盗用や剽窃と呼ばれます。学会,学校様々な場所で禁止されている行為です。私も禁止すべきだろうと思います。では,なぜ盗用がいけないのか?学会や学校が禁止しているからしない。それでも良いと思います。では,なぜ学会,学校は盗用・剽窃を禁止しているのでしょうか。
インターネット上でも多くの記事やブログで,盗用・剽窃が禁止される理由が考察されています。
剽窃はなぜダメか - ちしきよく。

このブログ記事では,「学問の発展に寄与しないから」「自分の身にならないから」という2点が指摘されています。その意見にも概ね賛成です。


今回は,上記では見られなかった理由を2つほど考えたのでメモ代わりに書きたいと思います。その2つは,どちらもコミュニティとして盗用・剽窃があるとどうなるのかを考えています。読みながら盗用・剽窃がある状況を想像してみてください。

学校が盗用・剽窃をなぜ禁止するのか?

学校(つまり教える側)が盗用・剽窃を禁止する理由の1つは評価の問題だと思います。レポートや論文で主張されている内容が,誰かの意見やデータであるとすれば,それを支えるだけの論拠を自分で持っていないことになります。それでは,レポートや論文の評価,つまり,単位を取得するだけの技能を身につけているのかを確かめることができません。評価(つまり技能習熟の保証)は学校の重要な機能の1つなので,このシステムが動かないのは大問題です。

知の共有にとってなぜ盗用と剽窃が良くないのか

次に,知の共有という観点から盗用・剽窃を考えてみましょう。例えばあなたが,論文やwikiなどなんらかの集合知につながる媒体(つまり研究フィールド)で気になる主張やデータを見つけたとします。詳しい話が聞きたければ,その人に直接質問すればよいわけです。これこそ科学コミュニケーションであり,学問の発展に役立ちます。つまり,主張を支える根拠やデータは,それがどこにあるかを示す目印が必要なのです。もしも自分で主張を支えるだけの根拠・データがなく,誰かの意見を無断でこっそり借りて主張をし,それが,引用という形で世に広まったら...。先程述べたような著者に直接質問するというコミュニケーションを通じた学問の発展が難しくなるでしょう。なぜなら,質問されてもその人はそれに答えられるかどうかわからない。つまり,確かな論拠やデータがどこにあるかわからなくなるからです。よって,研究フィールドにおける知の共有という観点から見れば,確実な論拠・データがどこにあるかわからなくさせるような盗用・剽窃はなんとしても避けたいのではないかと思います。

だから盗用・剽窃はやめましょう

今回は,学校や研究フィールドのようなコミュニティとしてなぜ盗用・剽窃を認めてはいけないのかを考えてみました。研究フィールドをまるごと破壊してしまう可能性もあるので,互いに気をつけたいところです。

アクセス数が500,000になりました

本日累積のアクセス数が500,000になりました。このブログを御覧の皆様。あなたのおかげです。ありがとうございます。今回はちょっとだけこのブログについて振り返り,今後の計画について書ける範囲で書こうと思います。

このブログを作ったきっかけ

自分の作業中に引っかかったことは,他の誰かもひっかかるかもしれない。もしその人が検索で見つけてくれれば,問題を早く解決できるような情報を発信したい。そんな動機付けで始まったブログです。現在,このブログは,検索流入によるアクセスがほとんどなので,その目的はある程度達成できているようにも思えます。

これからどうする

まずは,これまで通り,自分で作業中にひっかかったことやその解決法について投稿していきます。また,データ解析の初学者が困りそうなことも話題として取り上げて,それについて意見を述べていくなどしたいと思います。それ以外に,今後は以下の内容も投稿していこうと思います。

おすすめの書籍についてのレビュー

昨今のデータ解析ブームを反映してのことなのか,データ解析に関する書籍は次々に出版されています。見つけた本の中から初学者におすすめのものの内容紹介となぜそれが良いと思ったのかを書いていこうと思います。

インターネット上にあるデータセットに架空のストーリーを考える

インターネット上には今や解析可能なデータが数え切れないほどあるわけですが,データがあるだけでは不十分です。どんな視点でデータを見つめたいのかが決まって初めて解析方法が決まることもあります。そこで,インターネット上にあるデータに「勝手に架空の」視点を設定し,その視点を取るならどんな解析が可能なのかを考えてみたいと思っています。

何にしても,これまで通りゆるく進めて行こうと思いますのでこれからもどうぞよろしくお願いします。

数式は(そんなに)怖くない(2)

では,前回のイントロにつづいて具体的に2つほど数式を見ていきましょう。

まずは平均

平均値の計算は,直感的にも,計算手続きも親しみがある方が多いと思うので,これをとりかかりにしてみましょう。
まず,直感的な理解としては,あるデータの集まりの中での中間的な値,良くありそうな値という漠然とした考えがあると思います。
計算手続きとしては,データを構成する要素を全て足して,データの個数で割るという手続きは理解しやすいのではないでしょうか。
これを数式で示すと以下のようになります。

 \overline{X} = \frac{\sum_i^n{X_i}}{n}

この数式だと,一番厄介そうなのが \sum{}ですね。これはここに上がっているものを全て足し合わせる記号です。 X_iがデータの各要素なので,上で書いた計算手続きの中の「要素を全て足して」という部分に対応します。この式では,データがn個あると想定しており,分母のnが「データの個数で割る」という部分に対応しています。こうして考えてみれば,ちょっとややこしそうに見える数式でも足し算と割り算しかやっていないことがわかると思います。

つぎは分散

分散は,データの散らばりの程度を表す指標です。データの平均は,中間的な値しかわからず,平均に近いところにデータが密集しているのか,それとも平均から遠い位置にもデータが散財するのかがわかりません。分散はそれを表現してくれます。

では数式を見てみましょう。

 Var_X = \frac{\sum_i^n({X_i - \overline{X}})^2}{n}

平均に比べると複雑なので,部分に分けて見ていきます。

 (X_i - \overline{X})
ここはデータの各要素からデータの平均値を引いています。いってみればデータの各値と平均値との距離をあらわしています。計算として,平均値は上に書いたとおり,足し算と割り算でできています。そして引き算をしたことになりますね。

 (X_i - \overline{X})^2
カッコの中は上と全く同じです。2乗がついたことで,掛け算をすれば良いということになります。ここで,カッコの中がプラスの値でも,マイナスの値でも,2乗するとプラスの値になることが大事です。

 \sum_i^n{}
先程も出てきたΣ記号は,上の計算結果を全て足し合わせる記号です。

 \frac{}{n}
そして,平均と同じように最後にn(つまりデータの個数)で割り算をしています。

ここまでで足し算,引き算,掛け算,割り算すべて出てきましたね。そして,それ以上の計算は出てきませんでした。分散は平均ほどなじみのない指標かもしれませんが,計算としては四則演算ができれば,簡単に計算できることがこれでわかります。

平均と分散には共通の手続きがある

上で書いた平均と分散の計算手続きについてもう一度見てみると,2つの指標はどちらも「計算結果を全て足し合わせ」て,「データの個数で割る」としていました。計算手続きが同じということは,その計算が意味するところも似たようなものかもしれません。計算結果を全て足して,データの個数で割るという手続きは,計算結果の中間的な答えを示しています。平均の場合には,データ要素の中間的な値でした。では,分散ではどうでしょう。計算結果は,データの要素からデータの平均を引いたもの2乗したものです。これは,各データが平均の値からどれくらい離れているかを示しています。なので,分散が示す散らばりとは平均からの距離の中間的な値を示していると理解できます。

以上のように,計算手続きを分解しながら詳しく見てみたことで,分散がどんな指標なのかを確認することができました。次回は,別の指標を数式をもとに考えてみたいと思います。

数式は(そんなに)怖くない(1)

今回は,統計学やデータ解析の教科書に出てくる数式が苦手という人に向けた応援的内容です。

数式でものを考えるということ

統計学やデータ解析の教科書では,しばしば数式が出てきます。例えば,以下のような式は平均の計算手続きを示しています。
 \overline{X} = \frac{\sum_i^n{X_i}}{n}
こんな式(おそらく \sumですよね)が出てくると「ああ」と悲しい気持ちになる人がいるかもしれません。でも大丈夫。
このくらいの数式は,小学校で習った四則演算(+,ー,✕,÷)ができればたいてい計算できます。
ある行動や現象を数式で考えられるというのはすごいことで,実は,現象のシンプルな説明模型になっています。だから数式のことを「モデル」と呼ぶことがあるんです。
モデルと呼ぶからには,うまい仕組みや意味のようなものが数式の中に含まれていることもあります。今回は,ゆっくりゆっくり数式を眺めながら考えてみましょう。

本当に四則演算だけで充分なの?

本当に四則演算だけで十分かと聞かれれば,1つ部品が足りないことに気づきます。それは,平方根 \sqrt{}です。二乗してその数になる数というのは,掛け算・割り算の応用範疇かもしれませんが,
いちおう平方根まで計算できれば,初学者が見る数式の殆どを理解できるはずです。*1

次回から具体的な数式で考えていきます。

*1:難しい専門用語を使うなら最小二乗法の適用範囲くらいは,四則演算と平方根でなんとかなるというイメージです。 これはあくまでも個人的な主観に基づいています

ロボットがヒト区別つかなくなる世界

今日も,最近思っていることを書きたいと思います。最近,人工知能の話題がとても盛り上がっています。この勢いが続けば,人間に寄り添うパートナーロボットが作られる日が来るかもしれません。今日は,そんなときにどんなことが起きるのかをちょっと想像してみます。
ロボットが人間にとってどんな存在なのかをきちんと書いたものに「ロボット3原則」があります。

ロボット3原則

アイザック・アシモフがまとめたロボットの行動規範です。

  • 第一条 ロボットは人間に危害を加えてはならない。また、その危険を看過することによって、人間に危害を及ぼしてはならない。
  • 第二条 ロボットは人間にあたえられた命令に服従しなければならない。ただし、あたえられた命令が、第一条に反する場合は、この限りでない。
  • 第三条 ロボットは、前掲第一条および第二条に反するおそれのないかぎり、自己をまもらなければならない。

ロボット工学三原則 - Wikipedia

この3つのルールには優先順位がついているところがポイントだと思います。例えば,ロボットは基本的に命令に従うが,それによって人間に害が加える場合は,従わなくて良いわけです。また,命令に従うことが優先された上で,自己の身を守るということは,場合によっては自分の身の破滅を招く行動も可能なわけです。第一条と第二条は、人間が基準になっていることも大事なポイントです。

では,ロボットが社会的に今よりも浸透し,また,見た目にもヒトと区別がつかなくなるとどんなことがおきるのでしょう。
アニメーション作品の中にそのヒントがあるように感じています。

鉄腕アトムの「嵐の中を突っ走れ!」

1980年から放送されていた鉄腕アトムの話の中に「嵐の中を突っ走れ!」というのがあります。この話の中で,孫を育てているおじいさんが実はロボットなのですが,孫は人間だと思いこんでいます。実は,おじいさんロボットは,今は走らなくなった機関車のメインコンピュータを改造してできています。話の後半,嵐でダムが決壊して,アトムのクラスメートが機関車にのって逃げなければならなくなるのですが,メインコンピュータが抜かれている機関車は走りません。ここで,孫娘は,おじいさんに「機関車を走らせて!お願い!」とせまります。おじいさんからすれば,孫娘の行く末を見守るという命令を守らなければならないので,機関車に戻るわけには行きません。しかし、悩んだ後におじいさんは、再び機関車のメインコンピュータとなることを選びます。ロボット3原則に立って考えれば,第2条が第3条に優先されるという解釈が成り立ちます。ただし,孫娘は人間だと思っているおじいさんに「お願い」したのであって,ロボットに「命令」したのではありません。第1条,第2条の規制がないのに,すすんで危険に立ち向かうというところが,ロボットしてではなく,人間としての判断に立っているようにも見えます。 

イブの時間

最近見た映画「イブの時間」では,アンドロイドが社会に浸透した世界が描かれています。その社会全体では、人間とロボットは、絶対的な主従関係にあります。しかし、イブの時間という名前のカフェでは,ロボットと人間を区別しないというルールがあり,誰がロボットで誰が人間なのかがわからないまま話が進んでいきます。
https://www.amazon.co.jp/%E3%80%8C%E3%82%A4%E3%83%B4%E3%81%AE%E6%99%82%E9%96%93-%E5%8A%87%E5%A0%B4%E7%89%88%E3%80%8D-DVD-%E7%A6%8F%E5%B1%B1%E6%BD%A4/dp/B003JERTC6

ストーリーの詳細をここには書きませんが,ここでも人間はロボットに対する愛着を見せています。それがロボットであるとはっきり分かっていてもです。そして興味深いのは,ロボットが人間をもっと理解したいという感情らしきものを見せるところにあります。

ロボットの倫理の必要性

上記2作品を解釈すると,「ロボット3原則」ではカバーできないことに気づきます。おそらく,人間にとって人間の倫理が大事で,人間を基準としたロボットの倫理だけでなく,ロボットにとってのロボットの倫理やロボットにとっての人間の倫理が存在することになっていくのだと感じます。