rによるクラスター分析
TRANSCRIPT
によるクラスター分析 入門 ~階層的クラスター編~
1
※いろいろなサイト・本を 自分なりにまとめてみました。
みなさん 2
突然ですが 3
この選手
4
知ってますか
打ってよし!投げてよし!
大 谷
翔 平
5
投手でも野手でもある大谷選手をほかの選手と比較したら誰と似ているのだろう・・・
Question
6
投手でも野手でもある大谷選手をほかの選手と比較したら誰と似ているのだろう・・・
Question
クラスター分析で見てみよう…
7
What’s cluster analysis ? データのパターンが似ている個体を 同じグループにまとめるための手法
8
Clustering process ① データから距離(類似度)を求める (ユークリッド距離・最大距離・マンハッタン距離・キャンベラ距離・
バイナリ距離・ミンコウスキー距離)
② 分析の方法を決める (最近隣法・最遠隣法・群平均法・重心法・メディアン法・ウォード法)
③ ②の方法のコーフェン行列を求める
④ コーフェン行列に基づいて樹形図を作成する
⑤ 結果について検討する 9
Clustering process ① データから距離(類似度)を求める (ユークリッド距離・最大距離・マンハッタン距離・キャンベラ距離・
バイナリ距離・ミンコウスキー距離)
② 分析の方法を決める (最近隣法・最遠隣法・群平均法・重心法・メディアン法・ウォード法)
③ ②の方法のコーフェン行列を求める
④ コーフェン行列に基づいて樹形図を作成する
⑤ 結果について検討する 10
About data. 使用するデータ 規定投球回の1/3以上を投げているパ・リーグの投手のデータ : 57行16列
規定打席数の1/3以上打席に立っているパ・リーグの野手のデータ : 76行15列
11
ユークリッド 最大距離 マンハッタン
キャン ベラ バイナリ ミンコウ
スキー
About distance.
12
↑ のデータを R で test という名前でインポート(rownamesに名前、データフレームに防御率~自責点)
> dist(test, method=“euclidean”) # ユークリッド距離 田中 将大 金子 千尋 金子 千尋 74.41021 大谷 翔平 595.70664 657.63110
> test[1,] - test[2,] # 田中 将大と金子 千尋を比較 防御率 試合数 勝利 敗北 セーブ ホールド 勝率 対戦打者数 投球回 被安打 被本塁打 フォアボール デッドボール 奪三振 失点 自責点 -0.74 -1 9 -8 1 0 0.348 -59 -11.1 2 -4 -26 0 -17 -20 -20> sqrt(sum((test[1,] - test[2,])^2))[1] 74.41021
※普通、標準化して距離を求めますが、ここでは割愛
ユークリッド 最大距離 マンハッタン
キャン ベラ バイナリ ミンコウ
スキー
About distance.
13
↑ のデータを R で test という名前でインポート(rownamesに名前、データフレームに防御率~自責点)
> dist(test, method=“maximum”) # 最大距離 田中 将大 金子 千尋 金子 千尋 59 大谷 翔平 548 607
> test[1,] - test[2,] # 田中 将大と金子 千尋を比較 防御率 試合数 勝利 敗北 セーブ ホールド 勝率 対戦打者数 投球回 被安打 被本塁打 フォアボール デッドボール 奪三振 失点 自責点 -0.74 -1 9 -8 1 0 0.348 -59 -11.1 2 -4 -26 0 -17 -20 -20> max(abs(test[1,] - test[2,])) # 最大距離の算出方法[1] 59
※普通、標準化して距離を求めますが、ここでは割愛
ユークリッド 最大距離 マンハッタン
キャン ベラ バイナリ ミンコウ
スキー
About distance.
14
↑ のデータを R で test という名前でインポート(rownamesに名前、データフレームに防御率~自責点)
> dist(test, method=“manhattan”) # マンハッタン距離 田中 将大 金子 千尋 金子 千尋 179.188 大谷 翔平 1000.760 1152.468
> test[1,] - test[2,] # 田中 将大と金子 千尋を比較 防御率 試合数 勝利 敗北 セーブ ホールド 勝率 対戦打者数 投球回 被安打 被本塁打 フォアボール デッドボール 奪三振 失点 自責点 -0.74 -1 9 -8 1 0 0.348 -59 -11.1 2 -4 -26 0 -17 -20 -20> sum(abs(test[1,] - test[2,])) # マンハッタン距離の算出方法[1] 179.188
※普通、標準化して距離を求めますが、ここでは割愛
ユークリッド 最大距離 マンハッタン
キャン ベラ バイナリ ミンコウ
スキー
About distance.
15
↑ のデータを R で test という名前でインポート(rownamesに名前、データフレームに防御率~自責点) > dist(test, method=“canberra”) # キャンベラ距離 田中 将大 金子 千尋 金子 千尋 4.059966 大谷 翔平 6.387633 7.476160
> test[1,] - test[2,] # 田中 将大と金子 千尋を比較 防御率 試合数 勝利 敗北 セーブ ホールド 勝率 対戦打者数 投球回 被安打 被本塁打 フォアボール デッドボール 奪三振 失点 自責点 -0.74 -1 9 -8 1 0 0.348 -59 -11.1 2 -4 -26 0 -17 -20 -20> sum(abs(test[1,] - test[2,]) / (abs(test[1,]) + abs(test[2,])))[1] NaN # 分母に0があるため(ホールド)計算できない(dist()では、それ以外の値の平均を代入する)> A <- abs(test[1,-6] - test[2,-6]) / (abs(test[1,-6]) + abs(test[2,-6]))> sum(A) + mean(as.matrix(A))[1] 4.059966
※普通、標準化して距離を求めますが、ここでは割愛
ユークリッド 最大距離 マンハッタン
キャン ベラ バイナリ ミンコウ
スキー
About distance.
16
↑ のデータを R で test という名前でインポート(rownamesに名前、データフレームに防御率~自責点)
> dist(test, method=“binary”) # バイナリ距離 2進法による異なるビットの割合 一般にデータが 0,1 のときに用いるので省略
※普通、標準化して距離を求めますが、ここでは割愛
ユークリッド 最大距離 マンハッタン
キャン ベラ バイナリ ミンコウ
スキー
About distance.
17
↑ のデータを R で test という名前でインポート(rownamesに名前、データフレームに防御率~自責点)
> dist(test, method=“minkowski”,p = 3) # ミンコウスキー距離 田中 将大 金子 千尋 金子 千尋 62.70502 大谷 翔平 556.07350 615.24519
> test[1,] - test[2,] # 田中 将大と金子 千尋を比較 防御率 試合数 勝利 敗北 セーブ ホールド 勝率 対戦打者数 投球回 被安打 被本塁打 フォアボール デッドボール 奪三振 失点 自責点 -0.74 -1 9 -8 1 0 0.348 -59 -11.1 2 -4 -26 0 -17 -20 -20> sum(abs(test[1,] - test[2,])^3)^(1/3)[1] 62.70502
※普通、標準化して距離を求めますが、ここでは割愛
Clustering process ① データから距離(類似度)を求める (ユークリッド距離・最大距離・マンハッタン距離・キャンベラ距離・
バイナリ距離・ミンコウスキー距離)
② 分析の方法を決める (最近隣法・最遠隣法・群平均法・重心法・メディアン法・ウォード法)
③ ②の方法のコーフェン行列を求める
④ コーフェン行列に基づいて樹形図を作成する
⑤ 結果について検討する 18
About clustering.
19
About clustering.
きっと文章で聞いた方がわかりやすいです 20
最近隣法 最遠隣法
群平均法 重心法 メディ
アン法 ウォード法
21
About clustering. ※距離はユークリッド距離を使用
Rのコードsingle <- hclust(di, method=“single”) # diはdist(パ・リーグ全体の投手plot(single,hang=-1,main="最近隣法") ,methods=“euclidean”)
最近隣法は、2つのクラスターのそれぞれの中から1個ずつ個体を選んで個体間の距離を求め、それらの中で、最も近い個体間の距離をこの2つのクラスター間の距離とする方法。
最近隣法 最遠隣法
群平均法 重心法 メディ
アン法 ウォード法
22
About clustering. ※距離はユークリッド距離を使用
Rのコードcomplete <- hclust(di, method=“complete”) # diはdist(パ・リーグ全体の投手plot(complete,hang=-1,main=“最遠隣法”) ,methods=“euclidean”)
最遠隣法は、2つのクラスターのそれぞれの中から1個ずつ個体を選んで個体間の距離を求め、それらの中で、最も遠い個体間の距離をこの2つのクラスター間の距離とする方法。
最近隣法 最遠隣法
群平均法 重心法 メディ
アン法 ウォード法
23
About clustering. ※距離はユークリッド距離を使用
Rのコードaverage <- hclust(di, method=“average”) # diはdist(パ・リーグ全体の投手plot(average,hang=-1,main=“群平均法") ,methods=“euclidean”)
最近隣法と最遠隣法を折衷した方法で、2つのクラスターのそれぞれの中から1個ずつ個体を選んで個体間の距離を求め、それらの距離の平均値を2つのクラスター間の距離とする。
最近隣法 最遠隣法
群平均法 重心法 メディ
アン法 ウォード法
24
About clustering. ※距離はユークリッド距離を使用
Rのコードcentroid <- hclust(di, method=“centroid”) # diはdist(パ・リーグ全体の投手plot(centroid,hang=-1,main=“重心法”) ,methods=“euclidean”)
重心法は、クラスターのそれぞれの重心を求め、その重心間の距離をクラスターの間の距離とする。重心を求める際には、個体数を重みとして用いる。
最近隣法 最遠隣法
群平均法 重心法 メディ
アン法 ウォード法
25
About clustering. ※距離はユークリッド距離を使用
Rのコードmedian <- hclust(di, method=“median”) # diはdist(パ・リーグ全体の投手plot(median,hang=-1,main=“メディアン法") ,methods=“euclidean”)
メディアン法は、重心法の変形で、2つのクラスターの重心の間の重み付きの距離を求めるとき、重みを等しくして求めた距離の値を、2つのクラスター間の距離とする。
最近隣法 最遠隣法
群平均法 重心法 メディ
アン法 ウォード法
26
About clustering. ※距離はユークリッド距離を使用
Rのコードward <- hclust(di, method=“ward”) # diはdist(パ・リーグ全体の投手plot(ward,hang=-1,main=“ウォード法") ,methods=“euclidean”)
ウォード法は、2つのクラスターを融合した際に、生じる分散の変化が最小になるようにクラスターを形成していく方法である。(一般にはこの方法が一番感度が良いとされている。)
Clustering process ① データから距離(類似度)を求める (ユークリッド距離・最大距離・マンハッタン距離・キャンベラ距離・
バイナリ距離・ミンコウスキー距離)
② 分析の方法を決める (最近隣法・最遠隣法・群平均法・重心法・メディアン法・ウォード法)
③ ②の方法のコーフェン行列を求める
④ コーフェン行列に基づいて樹形図を作成する
⑤ 結果について検討する 27
• どの方法が良いかは一概には言えないので、他のデータ解析方法も用いて、多角的にデータを眺め、総合的に判断することが必要である。
• 一般的に計算方法からしてもウォード法が汎用性があると考えられている。
28
ということで
29
本題に戻ります
30
~Pitcher編~(ユークリッド距離)
31
~Pitcher編~(マンハッタン距離)
32
~Pitcher編~(キャンベラ距離)
33
防御率 試合数 勝利 敗北 セーブ ホールド 勝率 対戦打者数 戸村 3.33 12 4 2 0 0 0.667 284 大谷 4.23 13 3 0 0 0 1.000 274
投球回 被安打 被本塁打 フォアボール デッドボール 奪三振 失点 自責点 戸村 67.2 63 4 28 3 22 27 25 大谷 61.2 57 4 33 8 46 30 29
比 較
34
防御率 試合数 勝利 敗北 セーブ ホールド 勝率 対戦打者数 戸村 3.33 12 4 2 0 0 0.667 284 大谷 4.23 13 3 0 0 0 1.000 274
投球回 被安打 被本塁打 フォアボール デッドボール 奪三振 失点 自責点 戸村 67.2 63 4 28 3 22 27 25 大谷 61.2 57 4 33 8 46 30 29
比 較
35
似てると言えば似てる
~Batter編~(ユークリッド距離)
36
~Batter編~(マンハッタン距離)
37
~Batter編~(キャンベラ距離)
38
打率 試合数 打席数 打数 安打 HR 打点 盗塁 四球 死球 三振 サブロー 0.245 73 216 184 45 5 24 0 27 0 42 大谷 0.238 77 204 189 45 3 20 4 12 1 64 犠打 併殺打 長打率 出塁率 サブロー 1 6 0.375 0.335 大谷 0 3 0.376 0.284
比 較
39
打率 試合数 打席数 打数 安打 HR 打点 盗塁 四球 死球 三振 サブロー 0.245 73 216 184 45 5 24 0 27 0 42 大谷 0.238 77 204 189 45 3 20 4 12 1 64 犠打 併殺打 長打率 出塁率 サブロー 1 6 0.375 0.335 大谷 0 3 0.376 0.284
比 較
40
似てると言えば似てる
まとめ ・クラスター分析単体では、計算過程から もわかる通り、うまく活用しにくい。
(しかし、数字・グラフで嘘をつきたい人に とってはとても有用な手法)
・私的には非階層クラスタリングの方がグ ラフから読み取りづらいが精度よくクラ スタ分けできると思っている。
41
参考文献 プロ野球データFreak: http://baseball-data.com/ マクロミル: http://www.macromill.com/landing/words/b003.html Rによるデータサイエンス:
R逆引きハンドブック:
42
43
Let’s enjoy clustering!!