torutkのブログ

ソフトウェア・エンジニアのブログ

「データ分析勉強会 第3回 Rで紐解くソフトウェアメトリクス」に参加してきました

はじめに

ソフトウェア品質技術者の勉強会コミュニティ(と称していいのかな?)による、この5年くらい月1回のペースで継続的に開催されている「(ソフトウェア品質技術者のための)データ分析勉強会」において、この7月に統計ツールRの基本操作的な勉強会が開催されると知ったので参加しました。この勉強会には初参加です。

2015/07/11 第3回 Rで紐解くソフトウェアメトリクス - ソフトウェア品質技術者のための「データ分析勉強会」

復習の意味を兼ねて、ツールの操作をたどりながら本日記を記述しています。

動機

品質系はちょっと苦手な開発サイドのエンジニアでも、統計をちょっと使いこなすことが必要な場面があります。パフォーマンス改善がその一例です。改善前と改善後のパフォーマンスを計測して改善効果があるのかどうかを判断することがよくあります。改善前と改善後それぞれで、何回計測を実施すればよいでしょうか、計測値を比べるにはどうすればよいでしょうか、そうした悩みに科学的に(統計は数学分野なので)答えられるようにするため、統計を知っておくのがよいと思っています。

この統計処理に活用できるツールがRです。ライセンスはGPL*1で広く使われ、書店でもR関係の本は多数並んでいます。ところが、Rを使って統計処理をするには、Rの操作方法と統計の基礎知識の双方が必要なので、なかなか手に馴染むところまで到達できませんでした。そこで、このようにRの基礎から実際にツールを使いながら学べる勉強会があるといいなと思っていたので、参加してみました。

事前準備

Rについては、今回使用する"R Commander"を始めいろいろ追加パッケージを入れます。勉強会のサイトには事前にRをインストールするためのガイド資料が用意されていますので、前日夜にノートPCにガイドどおりにインストールをしておきました。追加パッケージはネットワークからダウンロードしてインストールするため、あらかじめインターネット利用環境でセットアップを済ませておく必要があります。

以前、軽くRに触ったときは、CSV形式でデータを作っておいて、Rのスクリプトでそれを読み出し関数を使って統計処理をするという形で、割とプログラミング寄りな方法でした。今回使用するR Commanderは、あらかじめデータセットを用意しておき(エクセルからのコピーペーストでも作成可能)、メニューから使用する統計処理を選択、結果をテキストやグラフに生成するという操作で、Rのスクリプト(関数)を知らなくても統計処理ができるようなツールになっています。

当日

会場は、東洋大学白山キャンパスの教室です。最寄駅(都営地下鉄白山駅)から徒歩3,4分と便利な場所にあります。4,5人ごとにグループとなる座席配置で、申込時のR使用経験アンケートから初心者が詰まらないように各グループの構成メンバーが工夫され、途中同グループの参加者と相談しながら進めることができるようになっていました。

R Commanderの使い方の最初の説明と演習では、Rに含まれるサンプルのデータ(iris)を、[統計量]メニュー > [要約] > [数値による要約]で処理し、Rコマンダー画面にテキストで結果(平均値、標準偏差、四分位範囲、オプションで追加チェックを付けると平均の標準誤差、変動係数、歪度、尖度)を表示し、グラフとしてヒストグラム、箱ひげ図を出し、基本操作を学びました。Rが、というよりもR Commanderツールが便利です。

箱ひげ図は、過去なんとなく見たなぁ程度でしたので、今回の勉強会の解説で初めて図の意味を理解しました・・・(という初心者レベル・・・)。と思っていたら、箱ひげ図の定義について議論に・・・、Rでの定義や、SECで使っている定義、など図の記述においていくつか流儀があるようです。

次に、Excelヒストグラムを作成する演習です。Excelで統計処理はできるけど手間がかかりますよ、ということを体感する演習です。Excelの演習シートには計測データ(iris)と、階級(以上・未満)が記載されており、空欄となっている階級幅、中央値、度数、累積度数、相対度数を埋めていきましょうというものです。
まずは度数分布を作るところですが、今回はいきなり「さあ、やってください」でしたので、何をどうしてよいやら、使う関数も分からない状態でした。度数は力技でCOUNTIFを使う(ただし以上、未満の条件が1発で書けないので2つのCOUNTIFの引き算で算出する)方法にしてみましたが、うまくいかずに時間切れです。
Excelアドインのデータ分析を入れてヒストグラムを出す方法も紹介があり、そちらを使った方は短時間でできました。

COUNTIFではない方法もあるらしい(隣のグループが試みていた)のですが、そのときは関数名まで聞かなかったので、帰宅後調べてみました。度数をExcelで算出する方法をぐぐってみると、COUNTIFで計算する方法のほかに、FREQUENCY関数を使う方法があると分かりました。
ただ、FREQUENCY関数を使う場合、操作が分かりづらく、(Ctrl + Shift + [OK]ボタンを押すとか)、なんとも・・・

お昼、ここの学食はレベルが高い

さて、途中でお昼があるので、会場の東洋大学の学食で食べました。学食といっても昔の大学の学食イメージではなく、ショッピングセンターのフードコートのようにいろいろなジャンルのお店が並んでおり、好きな店のところで注文して食べるという形式です。しかも値段は学食レベル(500円あたり)です。

午後の部

午後は、検定に入りました。
本日の勉強会用に用意されたテキストでは、R CommanderとExcelとでそれぞれ作業をして、Excelは大変ですよということを味わうレシピなのですが、すでに午前中のExcel作業でみな十二分に味わいましたよね(時間もないので)、ということでR Commanderのみで課題を進めていきました。

検定は、最初にパラメトリック検定を、次にノンパラメトリック検定を演習しました。
パラメトリック検定は、母集団の分布が特定の分布に従っていることが前提となるので、前提条件の確認をする検定を先に行うのがよいとされています。

今回は、T検定を適用するので、前提となる正規分布に従っているかをシャピロ・ウィルクの正規性検定を実施して確認します。演習のデータは引き続きiris(植物のアヤメ)です。分析対象はアヤメの花弁長で、150件あり、3種類のアヤメが含まれます。

まず、R Commanderの[統計量]メニュー > [要約] > [シャピロウィルクの正規性の検定]をクリックし、4つの変数からPetal.Lengthを選択して実行すると、p-value = 7.412e-10と帰無仮説正規分布である)が棄却されます。

次は3種類のアヤメのうち1種類(setosa)のみのデータの正規性を検定します。データセットにあるirisは3種類のアヤメを分離できないので、別途Excel上から対象データ(Speciesがsetosaのもの)をクリップボードにコピーし、R Commanderの[データ]メニュー > [データのインポート] > [テキストファイルまたはクリップボード、URLから]をクリックし、データセット名を"iris_setosa"(一例)、データファイルの場所にクリップボード、フィールド区切り記号にタブ(Excelクリップボードにコピーしたデータの区切りはタブになる)を指定します。すると新たなデータセットが生成されます。

作成したiris_setosaデータセットを選択し、再度シャピロ・ウィルクの検定を実施します。すると、p-value=0.05481となり、有意水準5%で帰無仮説(「正規分布である母集団からサンプリングされた標本である」)を棄却できないので正規性あり(正確には「正規性がないとはいえない」)となります。

R Commanderでは、データセットの形式によって実施できない処理があるときは、Excelでデータを用意しそれを使って新たなデータセットを作るのがよいようです。

さて、次は別なデータセット(sleep)で、F検定とt検定により2つのグループ間に差があるかを調べる演習です。このデータセットは、列(変数)に計測値とグループ(1と2のいずれか)が書かれた表となっています。

F検定は[統計量]メニュー > [分散] > [分散比のF検定]で実施し、グループと目的変数をそれぞれ1つ選択することで2標本の等分散を検定します。グループには"group"を、目的変数には"extra"を指定しました。演習のデータセットでは、p-valueが0.7427と帰無仮説(分散に差がない)を棄却できないので等分散となります。

本題のt検定(2標本t検定)です。[統計量]メニュー > [平均] > [独立サンプルt検定]で実施し、グループと目的変数を先のF検定と同じに指定します。[オプション]タブに、両側/片側検定、信頼水準、等分散かどうかの指定があるので、今回は、両側、信頼水準0.95、等分散(yes)を指定しました。演習のデータセットでは、p-valueが0.07919となり、帰無仮説(平均に差がない)を棄却できません。

この演習は、書籍「R Commanderハンドブック」の4.6節 平均値に対する2標本検定になりますが、使用しているデータセット(sleep)の説明をよく読むと、同一患者に2つの試薬を投じているので、独立二群ではなく関連二群として検定しなくてはいけないよ、という話となりました。
R Commanderではデータセット"sleep"の形式では計算できないので、Excelでデータを並べなおしたものから新しいデータセットとして定義して検定をします。Rのスクリプトで記述すればデータセットsleepのままでも検定ができます。

変更したデータセットで[統計量]メニュー > [平均] > [対応のあるt検定]を実施します。今度はp-valueが0.002833となり、帰無仮説(平均に差がない)を棄却できました。

と、間違った(?)検定を使うと結果が逆になってしまうという、とても考えさせられる題材です。ここまで検定方法の意味を考えたことがなかったので、有意義な内容でした。

ここからは、ノンパラメトリック検定に移ります。
正規分布を前提としない解析ができます。

まず、sleepデータセットで独立二群のノンパラメトリック検定をします。[統計量]メニュー > [ノンパラメトリック検定] > [2標本ウィルコクソン検定]を実施します。グループと目的変数を指定し実行すると、p-valueは0.06933と帰無仮説を棄却できない結果となります。先ほどの2標本t検定と同じですね。

次に、関連二群のノンパラメトリック検定をします。データセットsleepでは、[対応のあるウィルコクソン検定]が選択できないので、関連二群のt検定で作ったデータセットに切り替えて実施します。データセットを切り替えると、[2標本ウィルコクソン検定]メニューがグレーアウト(選択不可)となり、[対応のあるウィルコクソン検定]が選択できるようになります。p-valueが0.009091となり、帰無仮説を棄却できました。

このあとは、散布図、グラフ画面を2つ出す方法、層別で図を書く方法、色の選択などの紹介ですが、時間の都合で駆け足だったので帰宅後の復習に至りませんでした。

追記

R Commanderの[Rマークダウン]タブにある[HTMLレポートの作成]を実行すると、R Commanderで実施してきた統計処理や作成したグラフがすべてHTMLに生成されます。これを使うと、試行錯誤して出来た結果をあとから見ることや、グラフを画像で取り出すことが容易になるので、かなり便利そうな機能です。

まとめ、感想

講師の方が復習しないとね、と言ってましたので、ふりかえりながら日記にまとめてみました。
R Commanderの存在を知ったのも大きな収穫でした。早速帰路書店によって「R Commanderハンドブック」を買いました。

「R」Commanderハンドブック

「R」Commanderハンドブック

初参加、初心者の参加者への配慮も行き届いており、すばらしい勉強会でした。Rだけでなく勉強会の運営でも得るところがありました。講師、主催者、スタッフの皆さん、ありがとうございました。

懇親会(なんと16時から)にも参加したかったのですが、今回は都合で残念ながら不参加でした。

*1:パッケージについては、個々にライセンスが異なるので、パッケージ込みで配布するときなどはそれぞれ確認が必要です。