Rをつかった統計解析入門 †操作説明に入る前にやって置いて欲しいこと(男子学生のみ!) †【ここをクリック】←左のリンクのページに入り、画面の説明に従って、データを入力してください。今回の復習課題に使います(間違った形式で入力すると、処理が複雑になりますよ)。入力が同じ時間に集中すると「更新の衝突」がおきます。「コメントの挿入」ボタンをクリックする直前に、一度、ページをリロード(再読込)しておいてください。 前回課題提出物:よくできていたもの †オープンソースというもの †これまでは主にExcel, Word, Power Pointなど、お金を出して買わなければならないソフトウェアの説明をしてきた。でも、これらを購入しようとすると、アカデミックパッケージを買っても数万円する。自分でパソコンを買った人にとって、こういうソフトを揃えるだけでもけっこう大変。 講義で使ったK2EditorやWinShotはフリーソフト。こういうソフトウェアは、作者が趣味で作ったり、自分のために作ったものを、無料で公開してくれている場合が多い。作者の努力と親切さに感謝の心を持って、有りがたく使わせていただこう。 ところで、インターネットが発達してから、オープンソースというものが爆発的に広まってきた。ここでいう「ソース」というのは、もともとはプログラムの核となる「ソースコード」(文字で書かれた大元のプログラムリストと考えていい)のことを言っている。「オープンソース」では、大元の「ソース」が無料で公開されているので、それを見て、改良点を思いついた人が、自由に改良することができる。あるいは、そういうプロジェクトを立ち上げれば、不特定多数の人が意見を交換し、協同作業で改良を加えることで、どんどん素晴らしいものができてくるというもの。 「無料だったら、大したものは無いんじゃない?」などという声が聞こえてきそうだが、そうでは無い。コンピュータを動かす核であるOSの一つ、Linux (この教育用計算機システムでも利用可能)は、オープンソースで改良が加えられ、大成功を収めた。 今後の講義では、オープンソースで配布されているいくつかのソフトウェアを用いて、統計、プログラミング、データベース等を学ぶ。これらについてはもちろん商用のソフトウェアもあるが、次のような理由でオープンソースのソフトウェアを選んだ
デメリットとしては、
代表的なオープンソースソフトウェア †日本語で描かれた情報が載っているページへのリンクのみ示した。本家はほとんど英語。 有名なもの †授業で使うもの †
貧乏学生の味方 †
Rを使って統計解析してみよう! †受講者の皆さんのほとんどが、統計解析について学びたいという要望を持っていた。でも、アンケートの結果分かったのは、実は、統計解析というものが何をするのか、今ひとつイメージがつかめていないと言うこと。でも、とりあえず、理論はそっちのけで、Rを使って、基本的な統計解析をやってみよう。自分で実際のデータを解析してみることで、きっと、統計解析というものへの具体的なイメージがつかめるだろう。 Rの起動と初めての統計解析処理(平均値の計算) † まず、デスクトップに保存したRのフォルダで、Rのアイコンをダブルクリックする。 > が表示される。この">"をプロンプトと言う。プロンプトの右側には通常、カーソルがあり、「このマークの後に何かコマンド(命令)を打ち込んでくださいよ」とあなたに促している。 では、プロンプトのご要望に添って、何かコマンドを入力してみよう。とりあえず、"data1=c(1,2,3,4,5,6,7)"と入力する。 >data1=c(1,2,3,4,5,6,7) > 何もおこらない?いえいえ。エラーメッセージが何も表示されず、新しいプロンプトが表示されたら大成功。上のようにならなかった人は、半角・全角の文字の違いとコンマやカッコに注意してもう一度やってみよう。 上で行った操作は、"data1"という変数名に"(1 2 3 4 5 6 7)"というベクトルを代入せよという命令。では、プロンプトの後に"data1"と入力して、結果を見てみよう。 >data1 [1] 1 2 3 4 5 6 7 data1の内容が正しく表示されただろうか? じゃあ、次に、今入力したベクトルの要素の平均をとってみよう。コマンドは今後、囲みの中のプロンプトの後に書かれている通りに入力してくださいね。 >mean(data1) [1] 4 平均値"4"が表示されれば大成功。これで、あなたがRを使って行う、初めての統計解析は、無事に成功しました。 > data1=c(1,2,3,4,5,6,7) ほら、さっき入力したコマンドが表示された。そしたら"←"と"Back space"などを使って、数値を好きに変更して、最後に"Enter"キーを押そう。 > data1=c(1232,223.33,3 ,4 , 5666) 半角文字であるかぎり、別にスペースがいくつ入っていても大丈夫。入力したら、上と同じことをしてみると、 > data1 [1] 1232.00 223.33 3.00 4.00 5666.00 > mean(data1) [1] 1425.666 はい。これで、自分の好きな値を入力して、平均を計算することができました。 Rを使った2回目の統計解析 †では、統計解析におけるRの使い方をもう少し詳しく見てゆきましょう。 統計とは、一部をもって全体を知る作業です。【ここをクリック】←ここに、産業技術総合研究所 デジタルヒューマン研究センターから提供して頂いた、1997年の男子大学生110人の身長、体重のデータがあります。このデータを使って、1997年当時の大学生の身長と体重の一般的傾向について議論してみましょう。
統計的検定のやりかた(生物学科の皆さんが、たぶん、一番やってみたいのがこれ?) †皆さんはこれから、自然界の集団を対象にして、いろんなデータを集めるだろうと思います。例えば、千葉大キャンパス内に生息するゴキブリの体長かもしれないし、雄と雌の比率かもしれません。そういうデータに共通して言えることは、全ての個体を観察・計測することは無理だということです。そこで、私たちは千葉大の全ての集団(これを母集団と呼びます)から、偏り無く一部を取り出して(これを任意抽出とかランダムサンプリングと呼びます)、母集団の性質を推測します。「一部を使って全体を知る」というのが統計の基本であると言って良いでしょう。 ところで、生態学などのマクロ系の生物学では、データ解析に統計学が必要になることが、非常に沢山あります。この授業では、統計学全般について語っている時間は無いので、ほんのさわりしか扱いません。下に示す参考書などを読んで、勉強しておいてください。受験で培った数学力が落ちておらず、学問に対する情熱が非常に高い、1年生の今が統計学修得のチャンスですぞ!
さて、前回の課題アンケートでは、A君とB君のジャンケンの勝ち負けの数20回分のデータから、2人のジャンケンの強さに違いがあるかどうかという質問をしました。ほとんどの人が、「20回では何も分からない。1000回ぐらいやれば、たぶん、半々になる」とA君寄りの回答でした(→アンケート結果)。 「たかがジャンケンだから...」という声が聞こえてきそうですが、こういう状況だったら答えはどうでしょうか? あなたは生物学科の4年生です。卒業研究テーマは「ヨコヅナサシガメの性表現について」というものです。 ヨコヅナサシガメは外来種として問題視されています。通常、集団内の雌雄の比率は1:1ですが、千葉県のある 地域の集団では、どうも、雄の方が多そうだということに気づきました。この雌雄の差が生じた原因をつきとめ れば、ヨコヅナサシガメの防除にも使えるかもしれません。予備実験でその地域の調査に行き、あちこちで採集 したところ、20個体採集することができました。性比を調べたところ、15匹が雄、5匹が雌でした。 今後、もっと大規模な調査を計画するためにも、今回の調査結果が、単なる偶然か、それとも、その地域の集団の 性比に偏りがあるせいなのかを知りたいと思います。どうすれば良いでしょうか? 卒業がかかっているのですから、「1000個体ぐらい見ないとわからない」とか、「雄・雌は偶然に決まるに違いない」などとは言ってられなさそうです。 そこで、統計的検定の出番です。今、「採集したうち20匹中15匹が雄という状況は、性比が1:1の生物で、単なる偶然で起こるようなことか、あるいは、偶然では滅多に起こらないことか」ということです。このように、得られたデータが単なる偶然で生じることからどれだけかけ離れているかを知るには、統計的検定という作業が必要になります。 統計的検定では、次のような論証を行います。
Rを用いた実際の解析: †では、実際に先ほどの例を解析してみましょう。この検定は二項検定と呼ばれています。まず、帰無仮説は 母集団の性比は1:1である ということです。この帰無仮説が正しいと仮定すると、 得られたデータの偏りは、サンプリングの際の偶然の偏りであると考えられます。確率50%で生じる事象が、20回中15回得られたわけですよね。検定の際には、これより希な条件も全て含めて確率を計算します。つまり、20回虫、15回以上その事象が生じる確率を計算します。 手で計算してもいいのですが、今回はすぐにRを使ってみましょう。上の検定を行うにはprop.test()関数を使います。 prop.test(x,n) と入力するだけで、実際のx個のサンプルの中で、データ値がn回実現したという状況で、そのデータ値は(もう一つの対になるデータ値に対して)母集団中で1:1で出現するという帰無仮説をテストできます。 このテストの説明はそんなに難しくないです。20回中、雄が15回以上生じる確率を計算してみてください。詳しい解説は、上記、粕谷さんのピンク本に載っています。 上の例だと、20サンプル中15サンプルが雄で、帰無仮説は「母集団の性比は1:1」だということでしたから、 > prop.test(15,20) 1-sample proportions test with continuity correction data: 15 out of 20, null probability 0.5 X-squared = 4.05, df = 1, p-value = 0.04417 alternative hypothesis: true p is not equal to 0.5 95 percent confidence interval: 0.5058845 0.9040674 sample estimates: p 0.75 ※二項検定はRのコマンドに入っていました。 > binom.test(15,20) でテストできます。 p値の値は0.044なので、有意水準が5%の場合は、有意水準よりも小さい値だということです。なので、帰無仮説「母集団の性比は1:1である」は棄却されます。(もちろん、有意水準を0.001にすると棄却されません) つまり、調査した地域のヨコヅナサシガメの母集団には、有意水準5%では、雄と雌の性比に偏りがあったということができます。 (有意水準0.1%の場合は、「性比に偏りがあるかどうか分からなかった」) どうやらその地域のヨコヅナサシガメの母集団には性比に偏りがありそうなので、卒業研究の調査をすすめても良さそうですね。 Rを使った実際の解析2:2集団の差の検定 †先ほど1997年の男子大学生110の身長データをhというオブジェクトに入れました。【このページ】のもう少し下の方には、1998年当時60歳以上の男性51人の身長のデータものっています。大学生(平均20.52歳)と60以上(平均68.61歳)では、48歳ほどの差があります。同じ成人男性といったって、40年も違う時代に成長期を迎えたわけですから、身長には違いがあってもおかしく無いような気がします。この2つのデータをみて、2つのサンプルの母集団(ランダムサンプリングが行われたとして、1997年当時の男子大学生全てと1998年当時の60歳以上の男性全て)の間で身長には差があると言っても良いでしょうか? 60歳以上の男性の身長データをオブジェクトに格納します。scan()関数を使って > h2=scan() 1: 1547 1689 .. ..<省略>.. 52: hとh2のそれぞれの平均値やヒストグラムを比べてみてください。 > summary(h) > summary(h2) > hist(h) > hist(h2) 平均値やヒストグラムを見た限りでは、けっこう違いがありそうです。 もう一つグラフを作ってみましょう。2集団のデータを簡単に比較するときに便利な関数が、boxplot()です。 > boxplot(h,h2) さて、いよいいよ検定です。検定の考え方は上で示したのと全く同じです。ただし、データの持っている性質が違うので、p値の計算方法は異なってきます。このような2集団の違いの検定には、Wilcoxonの順位和検定という方法を使います。検定の説明はブラックボックスになりがちですが、上で紹介した粕谷さんのピンク本や、中澤さんのRの使い方pdfには、詳しい考え方の説明がかかれていますから、読んでおいて下さい。今回はRを使った統計的検定がいかに楽かということを示すのが目的なので、詳しくは触れません。 まず、ヨコヅナサシガメの例で見たように、帰無仮説と対立仮説を決めます。 帰無仮説: 2つのサンプルの母集団に差が無い 対立仮説: 2つのサンプルの母集団に差がある 2つの母集団に違いがなければ、hとh2という集団のデータは、母集団から抽出したときに、たまたま偶然で偏ってしまったものだろう。そういう偶然の偏りでこれだけの違いが生じるのは、どのくらいの確率(p値)で生じるのかを計算します。Rではwilcox.test()という関数を使います。 > wilcox.test(h,h2) Wilcoxon rank sum test with continuity correction data: h and h2 W = 4957, p-value = 5.329e-15 alternative hypothesis: true mu is not equal to 0 p値の値は 5.329e-15 で、これは 5.329x10^(-15) を示しています。つまり、0.0000000000000005329です。これは有意水準の0.01%よりもずーっと小さい値なので、2つの身長データの違いが同一母集団から偶然のサンプリングのバラツキでで生まれたということはほとんど無い、ということを示しています。統計学っぽく表現すると、「2集団の差をWilcoxonテストで検定した結果、0.01%の有意水準で有意な差があった」と書きます。 どうやら、40年も年齢の異なる2つの母集団の身長には差があると言って良さそうです。やっぱり、成長期に摂取できた栄養の影響などが、きっと大きいのでしょう。 リンク: †
その後のB君... †さて、いつもじゃんけんに負けてしまうB君。お父さんや母さんに聞いても、「そのうちきっと続けて勝つよ」と、取り合ってくれません。どーしても、納得行かないので、隣町に住む、いとこのあなた(理学部生物学科の学生)に相談に来ました。「僕にとってはしかつ問題なんだかね」と言うB君。"むつかしい"言葉を使うのが好きなおませさんです。 そこで、あなたは、なんとかB君にも分かるように説明してみました。 「B君は、A君がなにかずるをしていると思ってるんだよね?だって20回じゃんけんをして、15回もA君が勝っちゃうんだからおかしいよね。でもA君は、じゃんけんは偶然で決まるんだから、1000回もやればそのうち勝率は半々になるって言うんでしょ?じゃんけん1000回かー。そのくらいやれば、2人とも大人になっちゃうね。 まあ、ともかく、仮にA君が言うように、じゃんけんはでどちらが勝つかはホントに半々で決まるとしてみようよ。 いいかい?今、「じゃんけんでどちらが勝つかはホントに半々で決まる」と仮に考えているよね?そのとき、 2人の主張が食い違ってるわけだ。だったらさ、「勝敗が50%の確率で決まるとき、20回中15回勝つこと」が、どれだけ珍しいことか、測ってみればいいんじゃない?こういうのって、確率で測れそうだよね。 じゃあ、「勝敗が50%の確率で決まるときに、20回中15回勝つ」確率を計算してみよう。 どうやってその確率を計算するかって言うと....うーん、一つ一つ説明するのは大変だから、ここはパソコンにやらせよう。ほら、このRというソフトを使うと、 binom.test(15,20) Exact binomial test data: 15 and 20 number of successes = 15, number of trials = 20, p-value = 0.04139 alternative hypothesis: true probability of success is not equal to 0.5 こうなって、p-valueっていうのが、「勝敗が50%の確率で決まるときに、20回中15回(以上)勝つ」確率なんだよ(注:話しが難しくなりそうなので、累積確率の説明は端折ったようです)。そうすると、0.041っていうことは、4%ぐらいの確率だよね。どう?「勝敗が50%の確率で決まるときに、20回中15回(以上)勝つ」のは、100回中4回しか起きないっていうことなんだよ。やっぱり低いって思う? 今やったような計算を統計的検定って言うんだけど、問題にしていることがどれだけ起こりにくいかを議論するときには、5%とか、0.1%とか、0.01%っていう基準を使うんだ。まあ、よく使われる、「珍しさ・起こらなさ」を示す基準のうち一番大きいのが5%だね。B君のジャンケンの例だと、「勝敗が50%の確率で決まるときに、20回中15回(以上)勝つ」確率が4.1%だったでしょ?5%っていう基準よりも小さいので、「滅多に起きない」って言っていいわけ。つまり、「勝敗が50%の確率で決まる」っていう前提が間違いだと考えられるので、きっとA君が、何かずるをしている可能性が高いだろうと考えられるんだよ。でも、珍しさの程度はあくまでも、4%、つまり、100回中4回ぐらいは起きても構わないってことだからね。A君が言うように「勝敗が50%の確率で決まる」ってことは絶対無いなんて言える訳じゃないからね。 さすがのB君も、確率とか統計とかが出てくるとこんがらがってきたようです。 ともかく、A君がずるをしているのかも知れないという可能性を、何だか難しい話しで説明してもらったB君、少しは納得できたようです。ついでに、どうすればずるをされなくなるか、聞いてみました。何回か一緒にジャンケンをしてみたところ、手や体の動きに癖は無さそうです。そうすると、きっと、出し方のパターンを覚えられてるのだろうという事になり、乱数表をおみやげに貰いました。ジャンケンをする前に、この表をこっそり見て、何を出すかを決めるそうです。。。。 PHP(とXitami)の動作確認 †
第9回授業の課題 †
課題1.アンケート調査 †
*第9回授業アンケート **氏名: **課題への回答 -今日(6月15日)の授業の進み方は?(はやい、丁度いい、おそい) --回答: -今日の授業の難しさはどう感じましたか(簡単すぎ 簡単 丁度いい 難しい 難しすぎ): --回答: -難しいと答えた人は、特にどの点が難しかったですか?: --回答: -今日の授業は(よく分かった 分かった 分からなかった): --回答: -分からないと答えた人は、特にどの点が分からなかったですか?: --回答: -今日の講義で理解できなかった用語があったら挙げてください: --回答: -この授業では大量のデータをいかに効率良く処理するかということに注目しています。 そこで、次の質問に答えてください。 -これまでの人生で、自分が扱った最も大きなデータの規模を答えてください。例えば、 名簿の場合人数と項目、実験データの場合、何件のデータとか。 --回答: -今後の大学生活で、自分がどのくらいの大きなデータを扱うことになるか、データの種類と規模を 想像で答えてください。 --回答: 課題2.復習:Rを使った統計的検定 †
課題3.予習 :PHPによるプログラミング演習 †
|