情報基礎実践B 第5回 (2014年11月17日)
–
/ 34情報基礎実践
B
第
5
回
統計処理
(2) —
補足(
VBA
,
R
)
京都大学 大学院情報学研究科 数理工学専攻/高度情報教育基盤コア準備室 關戸 啓人
情報基礎実践B 第5回 (2014年11月17日)
1
/ 34VBA
エクセルでは用意された関数をしようする以外に,自分でVBA (Visual
Ba-sic for Applications) を用いてプログラミングをすることもできる.開発の
タブのVisual Basicを選び,挿入,標準モジュールと行い,プログラミング
できるようになる.開発のタブがないなら,リボンを右クリックし,リボン のユーザー設定から追加してください.
VBAは,Visual Basicというプログラミング言語を基本とし,各セルの値を
読み込む,書き込む,または,セル,ワークシート,ブックなどを操作する命 令を備えたものである.
Visual Basic自体は一般の手続き型言語で,C言語など他の手続き型言語に
慣れていれば,習得は難しくない.
情報基礎実践B 第5回 (2014年11月17日)
2
/ 34VBA
例題
先頭の2桁の数字は解説のための行番号であり,打ち込んではならない.ま た,保存する際は,マクロ付きExcelファイル(拡張子.xlsm)で保存する. 01 Sub test() 02 Dim tmp As Double 03 tmp = Worksheets("Sheet1").Range("C4").Value 04 tmp = tmp * tmp 05 Range("E4").Value = tmp 06 Range("F4").Value = "=POWER(C4,2)" 07 MsgBox("実行しました: 値=" + CStr(tmp)) 08 End Sub 一度作れば,開発タブのマクロから実行できる.(上のマクロ名はtest)情報基礎実践B 第5回 (2014年11月17日)
3
/ 34VBA
例題
01行と08行では,Subプロシージャtestを定義している.ここに囲まれ たプログラムが1つの塊としてみなされて,testを実行してくださいと言え ばこの塊が実行される. 02行目では,Double型の変数tmpを定義している.一般的にはDim 変数 名 As 型名と書くと変数が使えるようになる.Double型というのは,tmp には自由に(有限桁に丸めた)実数を格納できるということである. 注意:実は,Dim 変数名 As 型名と書かなくてもいきなり変数を使えるの だが,(個人的に)あまりおすすめはしない.また,As 型名も省略できるの だが,これもあまりおすすめはしない.情報基礎実践B 第5回 (2014年11月17日)
4
/ 34VBA
例題
03行目では,Sheet1のC4のセルの値をtmpに代入している.ここでは, =は等しいという意味ではなく,右の値を左の変数に代入する,という意味で ある.また,プログラム中に文字列を書きたい場合は,""で囲む. 04行目では,tmpに保存されている値の2乗を計算してから,その値をtmp に代入している. 05行目では,E4のセルの値にtmpの値を代入している.つまり,E4のセル を書き換えている.ワークシートの指定を省略した場合は,現在アクティブ なワークシートのことだと補完かれる.情報基礎実践B 第5回 (2014年11月17日)
5
/ 34VBA
例題
06行目では,セルF4に"=POWER(C4,2)"という文字列を書き込んでい る.これは,エクセルの関数を書き込んでおり,書き込んだ後,値が評価さ れる. 07行目では,メッセージウインドウを作り, "実行しました: 値=" + CStr(tmp) という文字列を出力している.ここ で,文字列の足し算+とは連結のことであり,例えば,"AB"+"CD"は"ABCD" となる.また,実数を文字列に変換するためにCStr()を用いている.情報基礎実践B 第5回 (2014年11月17日)
6
/ 34VBA
一般的な注意
VBAでは大文字と小文字は区別しない. 02 Dim tmp As Double と 02 dim tmp as double は同じ意味になる. ただし,文字列においては,大文字と小文字は区別する."a"という文字列 と,"A"という文字列は等しくないとみなされる. ’以降行末まではコメントみなされ無視される.情報基礎実践B 第5回 (2014年11月17日)
7
/ 34VBA
型について
よく使われる型は以下の通り.(これで全てではない) 型名 : その形の変数が格納できるもの Integer : −215以上215未満の整数 Long : −231以上231未満の整数 Currency : −263以上263未満の整数(主に金額を扱う,挙動が独特) Single : (10進数で)有効数字6桁程度の実数 Double : (10進数で)有効数字15桁程度の実数 String : 文字列Boolean : TrueかFalse
Variant : その都度,適正な他の型だと見なしてくれる.宣言時に型を
省略するとこれ
情報基礎実践B 第5回 (2014年11月17日)
8
/ 34VBA
演算について
よく使われる演算は以下の通り.(これで全てではない) 演算子 : 意味,例 + : 足し算.3+4は7になる.文字列の場合は連結. - : 引き算.3-4は-1になる. * : 掛け算.3*4は12になる. / : 割り算.整数の場合は最も近い整数に丸める.3/4は1になる. \ (or 円マーク) : 商.割り算した結果の整数部分.3\4は0になる. Mod : 余り.8 Mod 3は2になる. ^ : べき乗.3^2は32で9になる. 足し算より掛け算を先にやるなどの優先順位がある.自信がないときは()をつければ良い.情報基礎実践B 第5回 (2014年11月17日)
9
/ 34VBA
条件分岐
(
概要
)
条件により,処理を分岐させたい場合は,If,ElseIf,Else,End If
を用いる. 01 If 条件式A Then 02 条件式Aを満たす時の処理 03 ElseIf 条件式B Then 04 条件式Aを満たさず,条件式Bを満たす時の処理 05 ElseIf 条件式C Then 06 条件式A, Bを満たさず,条件式Cを満たす時の処理 07 Else 08 条件式A, B, Cを満たさない時の処理 09 End If ElseIfは何個あっても,0個でも良い.Elseはなくても良い.
情報基礎実践B 第5回 (2014年11月17日)
10
/ 34VBA
条件分岐
(
条件式
)
条件式に用いることができるものは以下の通り. 式A = 式B : 式Aの値と式Bの値は等しいとTrue.条件式中では,=は 代入ではない. 式A < 式B : 式Aの値が式Bの値より小さいとTrue. 式A > 式B : 式Aの値が式Bの値より大きいとTrue. 式A <= 式B : 式Aの値が式Bの値以下ならTrue. 式A >= 式B : 式Aの値が式Bの値以上ならTrue. 式A <> 式B : 式Aの値が式Bと等しくないとTrue.条件式A And 条件式B : 条件式Aと条件式Bの両方がTrueならTrue.
条件式A Or 条件式B : 条件式Aと条件式Bの少なくても一方がTrueな
らTrue.
Not 条件式A : 条件式AがTrueでないならTrue.
情報基礎実践B 第5回 (2014年11月17日)
11
/ 34VBA
ループ処理
(For)
Forを用いると,ループ処理をすることができる.ForとNextで囲まれた
部分は,カウンタ変数の値を変えながら,カウンタ変数の値がある値に行く まで繰り返す. 01 For カウンタ変数 = 初期値 To 変数の向かう先 Step 加算する値 02 処理 03 Next というような書き方をする.加算する値が正ならば,カウンタ変数が変数の 向かう先以下であるかぎり処理が実行され,加算する値が負ならば,カウン タ変数が変数の向かう先以上であるかぎり処理が実行される. Step 加算する値を省略したら,加算する値は1とみなされる.
情報基礎実践B 第5回 (2014年11月17日)
12
/ 34VBA
ループ処理
(For)
以下でいくつかの例を示す. 01 Dim i As Integer 02 For i = 3 To 10 Step 2 03 処理 ’(i=3, 5, 7, 9で4回実行される) 04 Next 01 Dim i As Integer 02 For i = 1 To 5 03 処理 ’(i=1, 2, 3, 4, 5で5回実行される) 04 Next 01 Dim i As Integer 02 For i = 10 To 3 Step -3 03 処理 ’(i=10, 7, 4で3回実行される) 04 Next情報基礎実践B 第5回 (2014年11月17日)
13
/ 34VBA
ループ処理
(For)
Forを途中で抜けたければ,Exit Forを用いれば良い.
01 Dim i As Integer
02 For i = 3 To 10 Step 2
03 If i = 7 Then
04 Exit For ’ i=7の時Forを終了する
05 End If
06 処理 ’(i=3, 5で2回実行される)
07 Next
情報基礎実践B 第5回 (2014年11月17日)
14
/ 34VBA
ループ処理
(Do)
Do,Loopを用いてもループ処理ができる.途中で抜けるにはExit Doを 用いる. 01 Dim i As Integer 02 i = 1 03 Do 04 処理 ’(i=1, 2, 3, 4で4回実行される) 05 i = i + 1 06 If i = 5 Then 07 Eixt Do 08 End If 09 Loop情報基礎実践B 第5回 (2014年11月17日)
15
/ 34VBA
ループ処理
(Do, While)
Do,Loopのループ処理に対して,条件を満たす限りループ処理を行うと いう時には,Whileを付け加えると良い. 01 Dim i As Integer 02 i = 1 03 Do While i < 5 04 処理 ’(i=1, 2, 3, 4で4回実行される) 05 i = i + 1 06 Loop 01 Dim i As Integer 02 i = 10 03 Do While i < 5 04 処理 ’(この処理は1回も行われない) 05 i = i + 1 06 Loop
情報基礎実践B 第5回 (2014年11月17日)
16
/ 34VBA
型の変換
型を変換するときには,以下の関数を用いる. CInt : Integer型に変換する.小数点以下は最も近い整数に丸められる. CLng : Long型に変換する CSng : Single型に変換する CDbl : Double型に変換する CStr : String型に変換する情報基礎実践B 第5回 (2014年11月17日)
17
/ 34VBA
配列
配列を用いると,1つの変数で,同じ型のデータを複数個格納できる.配列 を使うには,Dim 配列名(最終要素番号) As 各要素の型で宣言する.する と,配列名(0),配列名(1),. . .,配列名(最終要素番号)の最終要素番号+1 個の変数を使用することができるようになる. 01 Dim i As Integer02 Dim arr(5) As Integer
03 For i = 0 To 5
04 arr(i) = i * i 05 Next
で,例えばarr(0)には0が,arr(3)には9が,arr(5)には25が代入さ
れる.
情報基礎実践B 第5回 (2014年11月17日)
18
/ 34VBA
諸注意
変数を宣言するとき,
01 Dim i As Integer
02 Dim arr(5) As Integer
をまとめて,
01 Dim i As Integer, arr(5) As Integer
と書いても良いが,
01 Dim i, arr(5) As Integer
と書くと,iはVariant型になる.
情報基礎実践B 第5回 (2014年11月17日)
19
/ 34VBA
セルへのアクセス
セルへアクセスするには,セルの名前を用いて, Worksheets("Sheet1").Range("C4").Value のようにするか,もしくは,行番号と列番号を用いて, Worksheets("Sheet1").Cells(4,3).Value とする.どちらもC4のセルにアクセスしている.Worksheets("Sheet1"). を省略するとアクティブなワークシートのセルにアクセスする.情報基礎実践B 第5回 (2014年11月17日)
20
/ 34VBA
その他
プロシージャ (Sub,Function)や,変数のスコープなど大事な概念が他 にもあるが詳細は省略する.プロシージャだけ簡単な説明をする.プロシー ジャは最初の例のSubのように,プログラムの塊を定義する.また,プログ ラムの塊には,値などを渡すことができる. 行列AとB をQR 分解したいのなら,QR 分解のコードを2回書くのではなく, 一般の行列をQR 分解するプロシージャを作り,そこに行列 AとB をそれぞれ 渡し2回実行させれば良い.プログラムが複雑になってくると,プロシージャ を用いることで簡便なコードになり,修正なども楽になる.情報基礎実践B 第5回 (2014年11月17日)
21
/ 34VBA
プロシージャ
Subプロシージャを作成しておくと,そのプロシージャを呼び出すことで, それを実行できる.また,プロシージャには変数を引数に取ることができる. Functionプロシージャは,Subプロシージャの機能に付け加えて,値を呼 び出し元に返すことができる. 01 Sub Kaku(n As Long)02 Dim i As Long
03 For i = 1 To n
04 Cells(i, 1) = 0
05 Next
06 End Sub
と書いておけば,好きな場所でCall Kaku(5)またはKaku 5と書くこと
で,1列目の上から5個のセルを0で埋めることができる.
情報基礎実践B 第5回 (2014年11月17日)
22
/ 34VBA
プロシージャ
01 Function MySum(n As Long)
02 Dim i As Long, s As Long
03 s = 0 04 For i = 1 To n 05 s = s + i 06 Next 07 MySum = s 08 End Function と書いておけば,好きな場所でn = MySum(5)と書くことで,nに1+2+3+ 4+ 5で15が代入される.
情報基礎実践B 第5回 (2014年11月17日)
23
/ 34VBA
変数のスコープ
大雑把な説明をすると,プロシージャの中で変数を定義したなら,そのプ ロシージャの中でのみ,その変数は使うことができる.プロシージャの外で 定義すれば,変数はどこででも使うことができる.基本的に,変数を定義し た場所,および,その中でのみ,その変数を使うことができる.情報基礎実践B 第5回 (2014年11月17日)
24
/ 34R
言語の特徴
フリーウェア,無償 オープンソフトウェア,個人が開発,改良できる プログラミング言語で,自由にロジックが記述可能,汎用性が高い 行列計算,ベクトル計算は速い.統計処理だけなら速い 統計処理するには,関数などを書かねばならず,とっつきにくい(Rコマ ンダーなどのGUIもある) 行列計算以外の処理などは速くない情報基礎実践B 第5回 (2014年11月17日)
25
/ 34その他との比較
Excel 直感的な操作が可能 有償(そこまで高価ではなく,インストールされているPCも多い) 限られた処理しかできない(VBAで多少補える,また有償でアドイン が販売されていることもある) 有償ソフトウェア(SASなど) 性能は様々.基本的に良い.汎用性は様々 有償で,一般的にかなり高価 C言語など 無償,汎用性が高い.うまくプログラミングすれば高速 開発コストがとても高い情報基礎実践B 第5回 (2014年11月17日)
26
/ 34変数,代入,演算
変数は代入されることによって定義される.名前は,アルファベット,数字からなり,最初 の文字は数字であってはならない.名前は,大文字,小文字は区別される.また,以下の名前 を使用することはできない:break,else,for,function,if,in,next,repeat, return,while,TRUE,FALSE.
代入するには,<-を用いる(他にも,->,=,assignがあるが,通常<-だけで十分である). 例えば, x <- 1 とすると,変数xに1が代入される. 演算は,+が足し算,-が引き算,*が掛け算,/が割り算,**または^がべき乗を表す.例え ば, 2/3 は0.6666667となり, 2**4 は16となる.
情報基礎実践B 第5回 (2014年11月17日)
27
/ 34ベクトル
ベクトル(2, 4, 7)を変数yに代入するには, y <- c(2, 4, 7) と書く.ベクトル通しの足し算などもでき, c(2, 4, 7) + c(5, 4, 3) とすると,ベクトル(7, 8, 10)となり, c(2, 4, 7) * c(5, 4, 3) とすると,ベクトル(10, 16, 21)となる.(各要素ごとに掛け算された) 長さが違うベクトル通しの演算は,長さが短いベクトルが周期的に長さが何倍かに拡張され て行われる.例えば, c(1,2,3,4,5,6) + c(100,1000) は(101, 1002, 103, 1004, 105, 1006)となるが, c(1,2,3,4,5,6,7) + c(100,1000) はエラーになる.(「長いオブジェクトの長さが短いオブジェクトの長さの倍数になっていま せん」といわれる)情報基礎実践B 第5回 (2014年11月17日)
28
/ 34ベクトル
スカラー変数は,長さ1のベクトルと思って計算される.例えば, c(1, 2, 3, 4) * 2 は(2, 4, 6, 8)に, c(1, 2, 3, 4) + 2 は(3, 4, 5, 6)に, c(1, 2, 3, 4) ** 2 は(1, 4, 9, 16)となる. c(2:6)はc(2,3,4,5,6)と同じです.ベクトルxの長さを取得するにはlength(x)を用 います.ベクトルxのk番目の要素はx[k]で参照できます(最初の要素は1番目の要素です). 2番目の要素から,4番目の要素を取り出すには,x[2:4]で取り出せます.ベクトルxとベク トルyをつなげて,長いベクトルを作るには,append(x,y)とします.ベクトルxの中で,3 より大きい要素だけを取り出すにはx[x>3]と書きます.これは,要素数5のベクトルxの中 で,2番目と4番目の要素だけ取り出すとき,x[c(FALSE,TRUE,FALSE,TRUE,FALSE)] と書くことができ,それの省略形になります.情報基礎実践B 第5回 (2014年11月17日)
29
/ 34行列
行列を作るには,
matrix(ベクトル, nrow=行数, ncol=列数, byrow=TRUE)
とすれば,ベクトルの各要素を,(1, 1)成分,(1, 2)成分,と埋めていった行列が作られる. byrow=FALSEとすると,列について連続になるように埋めていく. 行列についても,演算は各要素ごとに行われる.行列積には%*%を用いる. 行列xの2行目を取り出してベクトルにするときはx[2,],2列目を取り出してベクトルに するときはx[,2]とする. 行列xの各行の平均を求めるときはapply(mean, 1, x),各列の平均を求めるときは apply(mean, 2, x)とする.
情報基礎実践B 第5回 (2014年11月17日)
30
/ 34行列
例 > x <- matrix(c(1,2,3,4),nrow=2,ncol=2,byrow=TRUE) > x [,1] [,2] [1,] 1 2 [2,] 3 4 > y <- matrix(c(2,3,4,5),nrow=2,ncol=2,byrow=TRUE) > x * y [,1] [,2] [1,] 2 6 [2,] 12 20 > x %*% y [,1] [,2] [1,] 10 13 [2,] 22 29情報基礎実践B 第5回 (2014年11月17日)
31
/ 34read.table
read.tableはデータを表として読み込む関数である.もっともシンプルな形は, x <- read.table("hoge.txt") とすれば,hoge.txtに記述されている内容が,列に対してはスペース区切りで表(データ フレーム型)として,xに代入される.オプションもいろいろ有り,例えば,x <- read.table("hoge.csv", header=TRUE, sep=",")
の意味は,header=TRUEは1行目は列のラベルが書かれているという意味であり,sep="," は列の区切り文字がコンマという意味である. また,csvファイルを読み込むときには,read.csvという関数が用意されている. 補足:リストは,どんな型でも良い変数の配列で,データフレーム型はリストの2次元版で, どんな方でも良い変数の行列を表す型である.
情報基礎実践B 第5回 (2014年11月17日)
32
/ 34条件分岐
条件分岐の書き方は以下のとおりです. if(条件文){ 処理 }else if(条件文){ 処理 }else if(条件文){ 処理 }else{ 処理 }情報基礎実践B 第5回 (2014年11月17日)
33
/ 34for
ループ
forを用いてループ処理するには,以下のようにします. for(変数名 in ベクトル){ 処理 (変数にベクトルの各々の要素が代入されてこの処理がされる) } 例えば,変数iについて,1から100までループを回すには, for(i in c(1:100)){ 処理 } と書くことができます.情報基礎実践B 第5回 (2014年11月17日)