今回のお題

今回は投球データから、ヒストグラム?を作ります。

データの準備

テキスト付属の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")

chapter03_4.csv(松坂投手のデータ)

chapter03_5.csv(ダルビッシュ投手のデータ)

作成例

データさえきちんと読み込めてしまえば、簡単なものなら、数値処理やグラフの描画は、もの凄く簡単なスクリプトで実現できてしまいます。

出力

スクリプトの説明

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形式で直接吐き出す部分は、コメントアウトしています。