基本機能編では、Rに馴染むための様々な処理を採り上げる。どのようなツールでも言えること(ソフトウェアに限らず)だが、ある程度のツールへの慣れがあることは、その後のツールの「腕磨き」には重要である。
もちろん、いきなり監査現場で使ってみるというつわものを否定するものではない。但し、現場でツールの練習をする余裕などないことくらい、誰でも分かっている。むしろ、現場では「今まで通り」の仕事をしながら疑問を感じて、今後の業務改善を目指したR学習のための「ネタ」を探すのもよいだろう。
Rで何ができるのかと尋ねる方には、話を聞くよりまず触ってみることをお勧めする。幸いにも無償で入手できるしインストールも簡単かつファイル容量も小さいので、入り口のバリアは著しく低い。また、Rに関する日本語の入門書もたくさんあるので、勉強ネタにも事欠かないから、何らの躊躇も不要である。 ソフトウェアに限らず道具類について一般的に言えることであるが、
人間の動物との違いは道具を使って工夫できること[1]である。そして道具を使うことによって利便性を享受し、道具を発展させることで文明を築いてきた。
「コンピュータ(人工知能など)が何々してくれる」という表現には注意したほうがよい。コンピュータは人間が工夫するために用いる道具であり、人間の意思を形にできても、(意を汲取って)何かをしてくれるわけではない。もしそう感じるときがあれば、誰かが工夫したものを使って自分が便益を享受しているときだ。コンピュータでゲームをする時には、開発者の意図に思いきりはまり込む方が楽しめるだろうが、こと監査においては自分が恩恵をうけてよい部分と工夫をしなければならない部分とは峻別する意識を常に持っておくべきだ。Rの豊富な機能を実務においてどう活かせるかを工夫するというスタンスでこのテキストは用意している。
以上の原則は忘れないようにしよう。
Rを起動すると不等号のようなマーク「>」が出る。これは、「ここに処理を入力して下さい」と促す記号で、プロンプトと言われるものだ。Rの処理は全てこのプロンプト部分に処理を入力しエンター(リターン)ーキーを押すことでその処理が実行される。
まずは四則演算から入ろう。プロンプトで、以下のように入力してみよう(#より右はコメントなので入力不要)。
1+2 # 1たす2 3-10 # 3ひく10 5*8 # 5かける8 3*4/5 # 3かける4わる5 2^10 # 2の10乗
四則演算に使う「+ - * /」などの記号を演算子と呼ぶ。それぞれ「和・差・積・商」を意味する。ここは表計算ソフトと全く同じなので、違和感なく使えるだろう。
演算子を誤って用いるとRが命令を解釈できないため、エラーメッセージが出る。例えば、わざと以下のように誤った式を入れて確かめてみよう。
3//10 # 3/10と入れるべきところ、誤って3//10と入力
エラーメッセージが出てくる。
エラーには三種類ある。
一つは、プログラムを書いたりコマンドを入力するときの「書き方」(文法)の誤りだ。二つ目は、意図していることと違う処理を書いてしまう誤りである。三つめは二つ目の誤りを正しいものとして人間が受け入れてしまうことである。
コンピュータの出すエラーメッセージはあくまでも文法上のエラーであって、論理的なエラーではないということには気をつけたい。例えば、正しくは足し算すべきところを誤って掛け算にしても、文法上はエラーではないのでメッセージは出てこない。論理エラーは処理ステップが増えれば増えるほど見つけにくくなり、処理量が増えて誤りの影響が大きく出てくるとようやく気が付くことがあるという、厄介な存在である。
三つめの誤りは、計算機の処理結果を妄信してはならないし、たとえ答えが正しくともそれが全ての選択肢ではない。人間が一番厄介な存在かもしれない。
Rにはよく使う演算が予め関数として組み込まれている。関数は、後で述べるように、組み込まれているもの以外にも自分で定義して作ることもできる。
sqrt(2) # 人見ごろ sqrt(3) # 人並 sqrt(4) # 2 sqrt(5) # 富士山麓
log(2, 10) log2(10) log10(10) log(10)
sin() cos() tan()
mean() median() quantile() max() min() sd() var() pnorm()
監査においては四則演算以外の数値演算を使うことは、一部の金融商品の時価算定や年金数理計算などの領域を除き、あまりないかもしれない。関数は上記の数値演算以外にも様々な使い方があり、Rを使いこなすことはすなわち関数を使いこなすことでもある。ここでは一般的な数値演算の解説に留め、後々、必要に応じた関数の説明をしていく。
演算の結果として真偽を返す。
== != < >
Rを使う理由として筆者が真っ先に挙げるのは、Rに備わる多彩なグラフ表現力だ。おそらく利用者の多くの同意を得るだろう。
グラフが表現しようとするのは、あらゆるものの「比較」である。端的には、折れ線グラフは同じ項目を時系列に並べて比較することで推移を表しているし、円グラフはある集合の要素の構成割合をパイの切り方(大きさ)で表すし、円全体の大きさは全体の推移を表すことも可能だ(但し、円での大きさ比較はあまり使うべきではない)。棒グラフは要素同士の量的な違いや、時系列での量の推移を表現している。
これまでの監査では、監査調書にグラフを載せる機会はあまりなかったが、今後はもっと多用されてよいだろう。特に監査対象領域全体を端的に示す方法として、グラフによる表現は最も優れているし、平均や分散、最大・最小などの基本統計量だけでは表現できないようなことも、グラフを用いれば全体の傾向を大雑把に掴むことができるので、分析的手続には最も適合する手段だろう。また、データの傾向を掴めれば、一方でその傾向から外れたデータの存在を示すことも可能となるため、監査でよく言われる「異常点把握」にも適した方法となる。
グラフはそれ単独で存在し得るものではなくレジェンドが必要だ。
いきなりプログラミングと言われて面食らうかもしれないが、その心配は無用だ。前述したとおりRを使うことは関数を使いこなすことであり、関数を使いこなすことはプログラミングができるということとほぼ同じだ。但し、Rでいうところのプログラミングとは、アプリケーション開発のためのプログラミングではなく、あくまでもデータを処理するための一連の命令のことだ。
処理命令を一塊にしたものは、スクリプトとも称される。Rのコマンドや関数を覚え、さらにスクリプトをマスタすれば、今までとは全く違う仕事ができるようになるだろう。すなわちそれは、自分の仕事に付加価値をもたらすだけではなく、監査という仕事に新たな知見が加わって監査が進歩することを意味している。つまり、Rに限らずプログラミングを学ぶことは、データを扱う監査という仕事に携わる者の必要スキルでもあり責務の一つであるといっても過言ではない。
プログラミングとは再現可能な形で処理結果を残すこと。ノウハウを形として蓄積し続けていくことができる。
変数の型文字数値日付因子論理ヌルベクトル行列データフレーム
以下は自分がよくやる凡ミスです。
Rのオブジェクトや関数は、大文字と小文字を別の文字として扱います。ゆえに、「綴り方はあっているのにエラーメッセージが出る」ときには、関数の中に大文字が入っていないか注意しましょう。
Rのオブジェクトは全角文字でも受け付けられます。個人的には漢字表記は分かりやすくて好きなのですが、ことコマンドラインでの入力(CUI)環境では、漢字入力はFEPの切り替えがとても煩わしいものでもあり、データ以外のところでは半角英数を使ったほうが入力に関しては楽です。ひらがなや漢字は基本的には全角文字なので半角と間違うことはありませんが、こと英文字となると最近のフォントによっては、全角・半角が一目ではよく分からないものがあります。
obj <- 100 #(1) obj <-100 #(2)
(1)は、objには100が代入されることは明白ですが、それでは(2)はどうでしょうか。
objがマイナス100より小さいかどうかを示したいのであれば、不等号と負記号との間にスペースを入れます。
しかしもっと明示的にしたければ、−100を括弧で囲めばわかりやすいでしょう。
obj <(-100)
Rの関数につけられる名前は英単語を用いられることが多いですが、複数形の関数は注意しましょう。
NG | ではなく | OK |
---|---|---|
install.package() | ではなく | install.packages() |
あくまでも筆者の場合です。
Rは非常に処理速度が速く、ストレスなく動いてくれますが、これは処理に必要な関数やデータをメモリに一括して読み込んで処理しているため、メディアへの物理的なデータアクセスが最初のデータ読み込みの際だけだからです。
Windows7などで32ビットOSを使っていれば、OSが認識するメモリ範囲は4GBが上限で、うち2GB程度はOS自体が使ってしまうので、ユーザが使える領域は残りの2GBくらいになります。
データの容量は処理の内容にもよりますが、あまりに大きなデータを処理する場合には、メモリへの負荷を考えてください。経験上は数十メガ単位のデータを扱っても、まず、1Gのメモリを消費することはありませんが、Rと一緒に他のアプリケーションが動いていることも多いですから、あくまでもRだけではなく利用している環境全体で考えてください。