Rで『身近な統計(’12)』第3章 ヒストグラム(投球分布)
今回のお題
今回は投球データから、ヒストグラム?を作ります。
データの準備
テキスト付属のDVDがある方は、ExcelからCSV形式のファイルを作成してください。
今回は、CSVファイルを用意してみました。
ただし、エンコードは、UTF-8(MacやUNIX/Linuxの標準)ですので、read.csv()の引数(オプション)に、「fileEncoding = “UTF-8”」を追加してください。
df <- read.csv("chapter03_4.csv", skip = 2, fileEncoding = "UTF-8")
作成例
データさえきちんと読み込めてしまえば、簡単なものなら、数値処理やグラフの描画は、もの凄く簡単なスクリプトで実現できてしまいます。
出力
スクリプトの説明
2行目
データを読み込みます。ダルビッシュ投手の場合は、skip = 5 にしてください。
また、必要に応じて、fileEncoding = “UTF-8” または fileEncoding = “CP932” を指定してください。
ご自分で読み込み用のデータを作成された方は、skipもfileEncodingも、適宜調整してください。
4行目
必要なデータは球種と球速だけなので、それだけ取り出しています。
5行目
Excelの項目名をデータフレームの列の名称にするとき、不適切な文字(スペースや括弧など)はピリオドに変換されてしまいますので、名前を変更してみました。
もちろん、日本語でもOKですが、環境によっては問題になることもありますので、英数字ば無難です。
…ただ、結局、あまり使いませんでした。
6行目
条件が成立した行だけが取り出して、球速0km/hの行を取り除いたデータフレームを作ります。
参照の方法がたくさんあって、なかなか説明しにくいですが、実は中の条件式で、成立(TRUE)/不成立(FALSE)の理論値のベクトルが返ってきて、さらにそれがデータフレームの各行に適用されて、条件式がTRUEの行だけが残ります。…わかりにくいですよね?すみません<(_ _)>
ここを、df <- df[df[, 2] > 0, ]
としておけば、5行目は必要なかったような…。
8行目
table()を使って、球速と球種ごとに分類して、カウントした表(行列)を作ります。
ここでは、2列のデータフレームdfを引数として与えていますが、table(df$type, df$speed)
としてもいいですし、読み込み直後のデータから0km/hを取り除いて、table(df[, 3:4])
でもOKです。…ますます、これより上の処理があやしい…。
つまり、4行目から8行目は、
df <- df[df[, 3] > 0, ]
dt <- table(df[, 3:4])
とできて、2行ですんだのでは、…ということです。
後のことを心配しながら作ったら、そうなっちゃったのだけなので、今さら修正しません…。
9行目
後で、凡例を書くのに使うため、球種を取り出しています。
球種は、テーブルdtの列の名前として整理されているので、それを参照します。
10行目
テーブルdtの列(球速)ごとの合計を計算し、その最大値を得ます。
グラフは球速ごとに、棒グラフが積み上がるので、その合計の最大値を探し出して、縦軸の調整に使うためです。
apply(X, MARGIN, FUN, …)の引数は、
- X:配列です。行列を含みます。
- MARGIN
1で行について、2で列について、あとに続くFUNで指定する関数を実行します。c(1, 2)では行と列です。Xが名前付きの配列名の場合は、文字のベクトルで、次元名を選択できます。…なんか、よくわかりませんが、とりあえず、1で行、2で列を処理する、ぐらいでいいと思います。 - FUN:関数(名)です。
- …:FUNに与えるオプションです。
ここでは、テーブルdtの列の合計を、apply(dt, 2, sum) で計算しています。
これで、それぞれの球速の合計のベクトルが得られるので、max()で、最大値を求めています。
15行目〜17行目
barplot()で、棒グラフと凡例を一気に書いてしまいます。
カラーはあまり好きではありませんが、種類が多く、また、棒も細いので、今回はカラーにしました。
以下、引数・オプションなどの説明です。
- barplot(dt
dt(barplotの仮引数としてはheight)の部分には今まで、棒の高さのベクトルを渡していましたが、今回は行列を渡すことで、複数の系列の棒グラフを一気に描きます。 - legend.text = t
凡例のテキストです。tは9行目で取り出した球種の文字列のベクトルです。 - col = 1:length(t)
棒グラフの色です。球種の数だけ色が必要ですので、1〜球種の数のベクトルを与えて、色を分けます。 - xlab = “球速 [km/h]”, ylab = “球数”
横軸のタイトル、縦軸のタイトルです。 - ylim = c(0, y_lim * 1.1)
縦軸の範囲です。棒の上がプロット領域まわりの線につかないように、10%の余裕を見込んでいます。 - args.legend = list(x = 5, y = y_lim, xjust = 0)
凡例のオプションです。legend.textが有効な場合のみ有効です。
ここでは、横位置、縦位置、左寄せ(位置の基準を凡例のエリアの左側に)を指定しています。 - yaxs = “i”
今回はpar()に書かずに、こちらに書いてみました。
横方向は、少し余裕があっても良いのですが、縦方向で、下側に隙間を作りたくなかったので指定しました。
その他
- パラメータの退避、設定、復元をしています。
- グラフのファイルをpng形式で直接吐き出す部分は、コメントアウトしています。