R での K-means クラスタリングと例

クラスター分析とは何ですか?

クラスター分析は、 教師なし学習。 クラスターは、同様の特徴を共有するデータのグループです。 クラスタリング分析は予測というより発見であると言えます。 マシンはデータ内の類似性を検索します。 たとえば、クラスター分析を次の目的で使用できます。wing アプリケーション:

  • 顧客のセグメンテーション: 顧客グループ間の類似性を探します。
  • 株式市場のクラスタリング: 業績に基づくグループ株式
  • 類似した値を持つ観測値をグループ化することで、データセットの次元を削減します。

クラスタリング分析は実装がそれほど難しくなく、ビジネスにとって有意義かつ実用的です。

教師あり学習と教師なし学習の最も顕著な違いは、結果にあります。 教師なし学習では新しい変数であるラベルが作成されますが、教師あり学習では結果が予測されます。 このマシンは、実務者が密接な関連性に基づいてデータにラベルを付けるのに役立ちます。 グループを利用し、それらに名前を付けるかどうかは分析者次第です。

クラスタリングの概念を理解するために例を作成してみましょう。 簡単にするために、XNUMX 次元で作業します。 顧客の総支出額とその年齢に関するデータがあります。 広告を改善するために、マーケティング チームは、よりターゲットを絞った電子メールを送信したいと考えています。mail顧客に。

続きましてwing グラフでは、総支出額と顧客の年齢をプロットします。

library(ggplot2)
df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54),
    spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24)
)
ggplot(df, aes(x = age, y = spend)) +
    geom_point()

クラスター分析

この時点でパターンが表示されます

  1. 左下には購買力の低い若者がいます。
  2. アッパーミドルは、より多くの費用を費やせる余裕のある仕事に就いている人々を反映しています
  3. 最後に、予算が低い高齢者です。

クラスター分析

上の図では、観測値を手動でクラスタリングし、XNUMX つのグループをそれぞれ定義します。 この例は、やや単純で非常に視覚的です。 新しい観測値がデータセットに追加された場合は、円内にラベルを付けることができます。 私たちの判断に基づいて円を定義します。 代わりに、次を使用できます。 機械学習 データを客観的にグループ化します。

このチュートリアルでは、 k平均法 アルゴリズム。

K-meansアルゴリズム

K 平均法は間違いなく、最も一般的なクラスタリング手法です。 研究者は数十年前にこのアルゴリズムをリリースし、K 平均法には多くの改良が加えられました。

このアルゴリズムは、観測値間の距離を最小化することによってグループを見つけようとします。 局所最適 ソリューション。 距離は観測の座標に基づいて測定されます。 たとえば、XNUMX 次元空間では、座標は単純であり、 です。

K 平均法アルゴリズム

アルゴリズムは次のように機能します。

  • ステップ 1: 機能プラン内のグループをランダムに選択する
  • ステップ 2: クラスターの中心とさまざまな観測値の間の距離を最小限に抑えます (重心)。 観察結果のあるグループが生成されます
  • ステップ 3: 初期重心をグループ内の座標の平均にシフトします。
  • ステップ 4: 新しい重心に従って距離を最小化します。 新しい境界線が作成されます。 したがって、観察はあるグループから別のグループに移動します。
  • グループに変化が観察されなくなるまで繰り返します

K 平均法は通常、特徴と特徴の間のユークリッド距離を計算します。

K 平均法アルゴリズム

マンハッタン距離やミンロウスキー距離など、さまざまな尺度を使用できます。 K-mean は、アルゴリズムを実行するたびに異なるグループを返すことに注意してください。 最初の初期推定はランダムであることを思い出し、アルゴリズムがグループ内で均一に達するまで距離を計算します。 つまり、k 平均は最初の選択に対して非常に敏感であり、観測値とグループの数が少ない場合を除き、同じクラスタリングを取得することはほとんど不可能です。

クラスターの数を選択します

K 平均法で見られるもう XNUMX つの困難は、クラスターの数の選択です。 安定性を向上させるために、 の高い値、つまり多数のグループを設定できますが、最終的には次のような結果になる可能性があります。 オーバーフィット データの。過学習とは、新しく到着するデータに対してモデルのパフォーマンスが大幅に低下することを意味します。機械は小さなデを学習しましたtails データセットの全体的なパターンを一般化するのに苦労しています。

クラスターの数は、データ セット、業界、ビジネスなどの性質によって異なります。 ただし、適切な数のクラスターを選択するための経験則があります。

クラスターの数を選択してください

データセット内の観測値の数に等しい。

一般に、ビジネス ニーズに適合する最適な値を時間をかけて探すのは興味深いことです。

クラスタリング分析を実行するには、パーソナル コンピュータの価格データセットを使用します。 このデータセットには 6259 個の観測値と 10 個の特徴が含まれています。 このデータセットは、1993 年から 1995 年までの米国の 486 台のパーソナル コンピュータの価格を観察しています。 変数には、価格、速度、RAM、画面、CD などがあります。

次のように進めます。

  • インポート日
  • モデルを訓練する
  • モデルを評価する

インポート日

K 平均は距離に基づいており、離散値は意味のある値を返さないため、因子変数には適していません。 データセット内の XNUMX つのカテゴリ変数を削除できます。 さらに、このデータセットには欠損値はありません。

library(dplyr)
PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv"
df <- read.csv(PATH) %>%
select(-c(X, cd, multi, premium))
glimpse(df)

出力

## Observations: 6, 259
## Variables: 7
## $ price < int > 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2...
##$ speed < int > 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25, ...
##$ hd < int > 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210...
##$ ram < int > 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4, ...
##$ screen < int > 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, ...
##$ ads < int > 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, ...
## $ trend  <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...

概要統計から、データに大きな値があることがわかります。 k の平均と距離の計算を行う場合は、平均が XNUMX に等しく、標準偏差が XNUMX に等しくなるようにデータを再スケールすることをお勧めします。

summary(df)

出力:

##      price          speed              hd              ram        
##  Min.   : 949   Min.   : 25.00   Min.   :  80.0   Min.   : 2.000  
##  1st Qu.:1794   1st Qu.: 33.00   1st Qu.: 214.0   1st Qu.: 4.000  `
##  Median :2144   Median : 50.00   Median : 340.0   Median : 8.000  
##  Mean   :2220   Mean   : 52.01   Mean   : 416.6   Mean   : 8.287  
##  3rd Qu.:2595   3rd Qu.: 66.00   3rd Qu.: 528.0   3rd Qu.: 8.000  
##  Max.   :5399   Max.   :100.00   Max.   :2100.0   Max.   :32.000  
##      screen           ads            trend      
##  Min.   :14.00   Min.   : 39.0   Min.   : 1.00  
##  1st Qu.:14.00   1st Qu.:162.5   1st Qu.:10.00  
##  Median :14.00   Median :246.0   Median :16.00  
##  Mean   :14.61   Mean   :221.3   Mean   :15.93  
##  3rd Qu.:15.00   3rd Qu.:275.0   3rd Qu.:21.50  
##  Max.   :17.00   Max.   :339.0   Max.   :35.00

dplyr ライブラリのscale() 関数を使用して変数を再スケーリングします。 変換により外れ値の影響が軽減され、単一の観測値を平均値と比較できるようになります。 標準化された値(または Zスコア) が高い場合、この観測値が実際に平均を上回っていると確信できます (Z スコアが大きいということは、この点が標準偏差の観点から平均から遠く離れていることを意味します。Z スコアが 2 は、値が XNUMX 標準であることを示します) Z スコアはガウス分布に従い、平均を中心に対称であることに注意してください。

rescale_df <- df % > %
mutate(price_scal = scale(price),
    hd_scal = scale(hd),
    ram_scal = scale(ram),
    screen_scal = scale(screen),
    ads_scal = scale(ads),
    trend_scal = scale(trend)) % > %
select(-c(price, speed, hd, ram, screen, ads, trend))

R Base には、k 平均アルゴリズムを実行する機能があります。 k 平均の基本関数は次のとおりです。

kmeans(df, k)
arguments:
-df: dataset used to run the algorithm
-k: Number of clusters

モデルを訓練する

図 XNUMX では、アルゴリズムがどのように機能するかを詳しく説明しました。 Yi Hui (Knit for Rmarkdown の作成者でもある) によって構築された優れたパッケージを使用すると、各ステップをグラフィカルに確認できます。 パッケージ アニメーションは conda ライブラリでは使用できません。 install.packages(“animation”) を使用して、別の方法でパッケージをインストールすることもできます。 パッケージが Anaconda フォルダーにインストールされているかどうかを確認できます。

install.packages("animation")

ライブラリをロードした後、kmeans の後に .ani を追加します。 R すべてのステップをプロットします。 説明のために、XNUMX つのクラスターで再スケーリングされた変数 hd および ram を使用してアルゴリズムのみを実行します。

set.seed(2345)
library(animation)
kmeans.ani(rescale_df[2:3], 3)

コードの説明

  • kmeans.ani(rescale_df[2:3], 3): rescale_df データ セットの列 2 と 3 を選択し、k セットを 3 に設定してアルゴリズムを実行します。アニメーションをプロットします。

モデルをトレーニングする

モデルをトレーニングする

アニメーションは次のように解釈できます。

  • ステップ 1: R はランダムに XNUMX つの点を選択します
  • ステップ 2: ユークリッド距離を計算し、クラスターを描画します。 左下に緑色のクラスターが XNUMX つ、右側に黒色の大きなクラスターが XNUMX つ、それらの間に赤色のクラスターが XNUMX つあります。
  • ステップ 3: 重心、つまりクラスターの平均を計算します。
  • データがクラスターに変更されなくなるまで繰り返します

アルゴリズムは XNUMX 回の反復後に収束しました。 XNUMX つのクラスターを含むデータセットで K 平均アルゴリズムを実行し、それを pc_cluster と呼ぶことができます。

pc_cluster <-kmeans(rescale_df, 5)
  • リスト pc_cluster には XNUMX つの興味深い要素が含まれています。
  • pc_cluster$cluster: 各観測のクラスターを示します
  • pc_cluster$centers: クラスターの中心
  • pc_cluster$totss: squ の合計ares
  • pc_cluster$withinss: 二乗和以内。 返されるコンポーネントの数は「k」に等しい
  • pc_cluster$tot.withinss: insidess の合計
  • pc_clusterbetweenss: 二乗和の合計から二乗和以内
  • pc_cluster$size: 各クラスター内の観測数

最適なクラスター数 k を計算するには、範囲内平方和の合計 (つまり tot.withinss) を使用します。 k を見つけることは確かに重要な仕事です。

最適なk

最適な k を選択するための XNUMX つの手法は、 エルボー法。 この方法では、グループ内均一性またはグループ内不均一性を使用して変動性を評価します。 言い換えれば、各クラスターによって説明される分散のパーセンテージに興味があるということです。 クラスターの数に応じて変動性が増加するか、不均一性が減少することが期待できます。 私たちの課題は、収穫逓減を超えた k を見つけることです。 新しいクラスターを追加しても、説明できる情報がほとんど残っていないため、データのばらつきは改善されません。

このチュートリアルでは、不均一性の尺度を使用してこの点を見つけます。 クラスタ内の合計平方根の合計ares kmean() によって返されるリスト内の tot.withinss です。

次のようにエルボ グラフを作成し、最適な k を見つけることができます。

  • ステップ 1: squ のクラスター内の合計を計算する関数を構築するares
  • ステップ 2: アルゴリズムを何度も実行する
  • ステップ 3: アルゴリズムの結果を使用してデータ フレームを作成する
  • ステップ 4: 結果をプロットする

ステップ1) squ のクラスター内の合計を計算する関数を構築します。ares

K 平均アルゴリズムを実行する関数を作成し、クラスタ内の合計を squ の合計に保存します。ares

kmean_withinss <- function(k) {
    cluster <- kmeans(rescale_df, k)
    return (cluster$tot.withinss)
}

コードの説明

  • function(k): 関数の引数の数を設定します。
  • kmeans(rescale_df, k): アルゴリズムを k 回実行します
  • return(clu​​ster$tot.withinss): squ のクラスター内の合計を格納します。ares

関数は、equals 2 でテストできます。

出力:

## Try with 2 cluster
kmean_withinss(2)

出力:

## [1] 27087.07

ステップ2) アルゴリズムをn回実行する

sapply() 関数を使用して、k の範囲にわたってアルゴリズムを実行します。 この手法は、ループを作成して値を保存するよりも高速です。

# Set maximum cluster 
max_k <-20 
# Run algorithm over a range of k 
wss <- sapply(2:max_k, kmean_withinss)

コードの説明

  • max_k <-20: 最大数を 20 に設定します
  • sapply(2:max_k, kmean_withinss): 関数 kmean_withinss() を 2:max_k、つまり 2 ~ 20 の範囲で実行します。

ステップ3) アルゴリズムの結果を使用してデータ フレームを作成する

関数を作成してテストした後、2 ~ 20 の範囲で K 平均アルゴリズムを実行し、tot.withinss 値を保存できます。

# Create a data frame to plot the graph
elbow <-data.frame(2:max_k, wss)

コードの説明

  • data.frame(2:max_k, wss): wss に格納されたアルゴリズムの出力を使用してデータ フレームを作成します。

ステップ4) 結果をプロットする

グラフをプロットしてエルボ ポイントがどこにあるかを視覚化します。

# Plot the graph with gglop
ggplot(elbow, aes(x = X2.max_k, y = wss)) +
    geom_point() +
    geom_line() +
    scale_x_continuous(breaks = seq(1, 20, by = 1))

最適なk

グラフから、最適な k は XNUMX であることがわかります。ここでは、曲線の収益が逓減し始めています。

最適な k を取得したら、k を 7 に設定してアルゴリズムを再実行し、クラスターを評価します。

クラスターを調べる

pc_cluster_2 <-kmeans(rescale_df, 7)

前に述べたように、kmean() によって返されるリスト内の残りの興味深い情報にアクセスできます。

pc_cluster_2$cluster
pc_cluster_2$centers
pc_cluster_2$size

評価部分は主観的なものであり、アルゴリズムの使用に依存します。 ここでの目的は、同様の機能を持つコンピューターを集めることです。 コンピューター担当者は手作業で仕事を行い、専門知識に基づいてコンピューターをグループ化できます。 ただし、このプロセスには時間がかかり、エラーが発生しやすくなります。 K 平均アルゴリズムは、クラスターを提案することにより、ユーザーのためにフィールドを準備できます。

事前の評価として、クラスターのサイズを調べることができます。

pc_cluster_2$size

出力:

## [1] 608 1596 1231  580 1003  699  542

最初のクラスターは 608 個の観測値で構成されていますが、最小のクラスター 4 にはコンピューターが 580 台しかありません。 クラスター間で均一性があるのは良いことですが、そうでない場合は、より薄いデータの準備が必要になる可能性があります。

中央のコンポーネントを使用してデータを詳しく見ることができます。 行はクラスターの数を参照し、列はアルゴリズムで使用される変数を参照します。 値は、対象の列の各クラスターによる平均スコアです。 標準化により解釈が容易になります。 正の値は、特定のクラスターの Z スコアが全体の平均を上回っていることを示します。 たとえば、クラスター 2 は、すべてのクラスターの中で最も高い価格平均を持っています。

center <-pc_cluster_2$centers
center

出力:

##   price_scal    hd_scal     ram_scal screen_scal   ads_scal trend_scal
## 1 -0.6372457 -0.7097995 -0.691520682  -0.4401632  0.6780366 -0.3379751
## 2 -0.1323863  0.6299541  0.004786730   2.6419582 -0.8894946  1.2673184
## 3  0.8745816  0.2574164  0.513105797  -0.2003237  0.6734261 -0.3300536
## 4  1.0912296 -0.2401936  0.006526723   2.6419582  0.4704301 -0.4132057
## 5 -0.8155183  0.2814882 -0.307621003  -0.3205176 -0.9052979  1.2177279
## 6  0.8830191  2.1019454  2.168706085   0.4492922 -0.9035248  1.2069855
## 7  0.2215678 -0.7132577 -0.318050275  -0.3878782 -1.3206229 -1.5490909

ggplot を使用してヒート マップを作成すると、カテゴリ間の違いを強調することができます。

ggplot のデフォルトの色は、RColorBrewer ライブラリを使用して変更する必要があります。 コンダを使用できます ライブラリ ターミナルで起動するコード:

conda install -cr r-rcolorbrewer

ヒート マップを作成するには、次の XNUMX つの手順を実行します。

  • 中心の値を使用してデータ フレームを構築し、クラスターの番号を使用して変数を作成します
  • Tidyr ライブラリの Gather() 関数を使用してデータを再整形します。 データをワイドデータからロングデータに変換したいと考えています。
  • colorRampPalette() 関数で色のパレットを作成する

ステップ1) データフレームを構築する

変形データセットを作成しましょう

library(tidyr)

# create dataset with the cluster number

cluster <- c(1: 7)
center_df <- data.frame(cluster, center)

# Reshape the data

center_reshape <- gather(center_df, features, values, price_scal: trend_scal)
head(center_reshape)

出力:

##   cluster   features     values
## 1       1 price_scal -0.6372457
## 2       2 price_scal -0.1323863
## 3       3 price_scal  0.8745816
## 4       4 price_scal  1.0912296
## 5       5 price_scal -0.8155183
## 6       6 price_scal  0.8830191		

ステップ2) データを再形成する

以下のコードは、ヒート マップのプロットに使用する色のパレットを作成します。

library(RColorBrewer)
# Create the palette
hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')

ステップ 3) 視覚化する

グラフをプロットして、クラスターがどのように見えるかを確認できます。

# Plot the heat map
ggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) +
    scale_y_continuous(breaks = seq(1, 7, by = 1)) +
    geom_tile() +
    coord_equal() +
    scale_fill_gradientn(colours = hm.palette(90)) +
    theme_classic()

クラスターの検査

まとめ

K 平均アルゴリズムを以下の表にまとめます。

パッケージ DevOps Tools Engineer試験のObjective 演算 引数
ベース K 平均を訓練する kmeans() DF、K
アクセスクラスター kmeans()$クラスター
クラスターセンター kmeans()$センター
サイズクラスター kmeans()$size