R の k-medoids: ステップバイステップの例
クラスタリングは、データセット内で観察のグループまたはクラスターを見つけようとする機械学習手法です。
目標は、各クラスター内の観測値が互いに非常に類似している一方で、異なるクラスター内の観測値が互いに大きく異なるようなクラスターを見つけることです。
クラスタリングは、 応答変数の値を予測するのではなく、単にデータセット内の構造を見つけようとしているだけであるため、 教師なし学習の一種です。
クラスタリングは、企業が次のような情報にアクセスできる場合にマーケティングでよく使用されます。
- 世帯収入
- 世帯規模
- 世帯主の職業
- 最寄りの市街地までの距離
この情報が利用可能な場合、クラスタリングを使用して、特定の製品を購入する可能性が高い、または特定の種類の広告によりよく反応する可能性が高い、類似した世帯を識別することができます。
クラスタリングの最も一般的な形式の 1 つは、 k-means クラスタリングとして知られています。
残念ながら、この方法は外れ値の影響を受ける可能性があるため、代替としてk-medoids クラスタリングがよく使用されます。
K-Medoids クラスタリングとは何ですか?
K-medoids クラスタリングは、データセット内の各観測値をK個のクラスターの 1 つに配置する手法です。
最終的な目標は、各クラスター内の観測値が互いによく似ている一方で、異なるクラスター内の観測値が互いにまったく異なるK個のクラスターを作成することです。
実際には、次の手順を使用して K-means クラスタリングを実行します。
1. Kの値を選択します。
- まず、データ内で識別するクラスターの数を決定する必要があります。多くの場合、 Kのいくつかの異なる値をテストし、その結果を分析して、特定の問題に対してどのクラスターの数が最も合理的であるかを確認する必要があります。
2. 各観測値を 1 からKまでの初期クラスターにランダムに割り当てます。
3. クラスターの割り当てが変更されなくなるまで、次の手順を実行します。
- K個のクラスターのそれぞれについて、クラスターの重心を計算します。これは、 k番目のクラスターの観測値の特徴のp中央値のベクトルです。
- 各観測値を最も近い重心を持つクラスターに割り当てます。ここで、最も近いはユークリッド距離を使用して定義されます。
技術的なメモ:
k-medoids は平均値ではなく中央値を使用してクラスターの重心を計算するため、k-means よりも外れ値に対して堅牢になる傾向があります。
実際には、データセットに極端な外れ値がない場合、k-means と k-medoid は同様の結果を生成します。
R での K-Medoid クラスタリング
次のチュートリアルでは、R で k-medoids クラスタリングを実行する方法の段階的な例を示します。
ステップ 1: 必要なパッケージをロードする
まず、R での k-medoids クラスタリングに役立ついくつかの関数を含む 2 つのパッケージをロードします。
library (factoextra) library (cluster)
ステップ 2: データのロードと準備
この例では、R に組み込まれているUSArrestsデータセットを使用します。このデータセットには、1973 年の米国各州の人口 100,000 人あたりの殺人、暴行、強姦の逮捕数と、都市部に住む各州の人口の割合が含まれています。地域。 、アーバンポップ。
次のコードは、次のことを行う方法を示しています。
- USArrestsデータセットをロードする
- 欠損値のある行をすべて削除します
- データセット内の各変数を、平均が 0、標準偏差が 1 になるようにスケーリングします。
#load data df <-USArrests #remove rows with missing values df <- na. omitted (df) #scale each variable to have a mean of 0 and sd of 1 df <- scale(df) #view first six rows of dataset head(df) Murder Assault UrbanPop Rape Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473 Alaska 0.50786248 1.1068225 -1.2117642 2.484202941 Arizona 0.07163341 1.4788032 0.9989801 1.042878388 Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602 California 0.27826823 1.2628144 1.7589234 2.067820292 Colorado 0.02571456 0.3988593 0.8608085 1.864967207
ステップ 3: 最適なクラスター数を見つける
R で k-medoid クラスタリングを実行するには、 pam()関数を使用できます。これは「中央値の周りの分割」を表し、次の構文を使用します。
pam(データ, k, メトリック = “ユークリッド”, スタンド = FALSE)
金:
- data:データセットの名前。
- k:クラスターの数。
- metric:距離の計算に使用するメトリック。デフォルトはユークリッドですが、 manhattanを指定することもできます。
- スタンド:データセット内の各変数を正規化するかどうか。デフォルト値は false です。
最適なクラスターの数が事前にわからないため、決定に役立つ 2 つの異なるグラフを作成します。
1. 平方和の合計に対するクラスターの数
まず、 fviz_nbclust()関数を使用して、クラスター数と平方和の合計のプロットを作成します。
fviz_nbclust(df, pam, method = “ wss ”)
通常、クラスターの数が増加すると、平方和の合計は常に増加します。したがって、このタイプのプロットを作成するときは、平方和が「曲がる」か横ばいになり始める「膝」を探します。
プロットの曲率点は通常、最適なクラスター数に対応します。この数値を超えると、 過学習が発生する可能性があります。
このグラフでは、k = 4 クラスターに小さなねじれまたは「曲がり」があるように見えます。
2. クラスター数とギャップ統計
最適なクラスター数を決定するもう 1 つの方法は、 偏差統計と呼ばれるメトリックを使用することです。これは、k のさまざまな値のクラスター内変動の合計を、クラスター化を行わない分布の期待値と比較します。
クラスターパッケージのclusGap()関数を使用してクラスターの数ごとのギャップ統計を計算したり、 fviz_gap_stat()関数を使用してクラスターとギャップ統計のプロットを計算したりできます。
#calculate gap statistic based on number of clusters gap_stat <- clusGap(df, FUN = pam, K.max = 10, #max clusters to consider B = 50) #total bootstrapped iterations #plot number of clusters vs. gap statistic fviz_gap_stat(gap_stat)
グラフから、ギャップ統計が k = 4 クラスターで最も高くなることがわかります。これは、以前に使用したエルボー法に対応します。
ステップ 4: Optimal Kを使用して K-Medoids クラスタリングを実行する
最後に、 kの最適値 4 を使用して、データセットに対して k-medoids クラスタリングを実行できます。
#make this example reproducible set.seed(1) #perform k-medoids clustering with k = 4 clusters kmed <- pam(df, k = 4) #view results kmed ID Murder Assault UrbanPop Rape Alabama 1 1.2425641 0.7828393 -0.5209066 -0.003416473 Michigan 22 0.9900104 1.0108275 0.5844655 1.480613993 Oklahoma 36 -0.2727580 -0.2371077 0.1699510 -0.131534211 New Hampshire 29 -1.3059321 -1.3650491 -0.6590781 -1.252564419 Vector clustering: Alabama Alaska Arizona Arkansas California 1 2 2 1 2 Colorado Connecticut Delaware Florida Georgia 2 3 3 2 1 Hawaii Idaho Illinois Indiana Iowa 3 4 2 3 4 Kansas Kentucky Louisiana Maine Maryland 3 3 1 4 2 Massachusetts Michigan Minnesota Mississippi Missouri 3 2 4 1 3 Montana Nebraska Nevada New Hampshire New Jersey 3 3 2 4 3 New Mexico New York North Carolina North Dakota Ohio 2 2 1 4 3 Oklahoma Oregon Pennsylvania Rhode Island South Carolina 3 3 3 3 1 South Dakota Tennessee Texas Utah Vermont 4 1 2 3 4 Virginia Washington West Virginia Wisconsin Wyoming 3 3 4 4 3 Objective function: build swap 1.035116 1.027102 Available components: [1] "medoids" "id.med" "clustering" "objective" "isolation" [6] "clusinfo" "silinfo" "diss" "call" "data"
4 つのクラスター重心はすべて、データセット内の実際の観測値であることに注意してください。出力の上部近くで、4 つの重心が次の状態であることがわかります。
- アラバマ州
- ミシガン州
- オクラホマ州
- ニューハンプシャー
fivz_cluster()関数を使用して、軸上の最初の 2 つの主成分を表示する散布図でクラスターを視覚化できます。
#plot results of final k-medoids model
fviz_cluster(kmed, data = df)
各州のクラスター割り当てを元のデータセットに追加することもできます。
#add cluster assignment to original data
final_data <- cbind(USArrests, cluster = kmed$cluster)
#view final data
head(final_data)
Murder Assault UrbanPop Rape cluster
Alabama 13.2 236 58 21.2 1
Alaska 10.0 263 48 44.5 2
Arizona 8.1 294 80 31.0 2
Arkansas 8.8 190 50 19.5 1
California 9.0 276 91 40.6 2
Colorado 7.9 204 78 38.7 2
この例で使用されている完全な R コードは、 ここで見つけることができます。