2015年2月12日木曜日

Rでクラスター分析(非階層)してみる


【クラスター分析とは(非階層)】


クラスター分析とは、データを互いに類似するもの同士のグループに分類(セグメント化)する分析手法。
データ間の類似度は、データ間の距離で判定する。
距離の計算方法には、代表的なユークリッド距離の計算方法がある。

  AとBの距離 = √(距離)の2乗+(距離)の2乗+・・・・

<非階層的クラスター分析>
非階層的クラスター分析の代表的な分析手法に、k-means法 がある。
k-means法では次のようにデータをクラスター化していく。

  1. データをk個の初期クラスターに分類
  2. クラスターの中心を計算
  3. すべてのデータとクラスターの中心との距離を求め、最も近いクラスターに分類
  4. クラスターの中心を再計算(新しい中心を決定)
  5. クラスターの中心が変化しなければ計算終了、それ以外は3に戻る

    ※無限ループする場合がまれにあるので、10回をMAX値に設定することが多い。

【Rを使ってクラスター分析をしてみる】


非階層のクラスター分析を用いて地震のデータの分類を行う。
ここでは、R言語に付属しているフィジーの地震データ(quakes)を使う。このデータはすでに利用できる状態にある。

> quakes
> class(quakes)
[1] "data.frame"
> nrow(quakes)
[1] 1000
> colnames(quakes)
[1] "lat" "long" "depth" "mag" "stations"

cf) 緯度(lat)、経度(long)、深度 km(depth)、マグニチュード(mag)、報告数(stations)

quakesから緯度と経度を取り出したデータフレームを作成する。
変数 x を、plot() 関数を使ってプロットすると、地理的な地震の発生情報がグラフで確認できる。

> x <-data.frame(lat=quakes$lat, long=quakes$long)
> plot(x)



クラスター分析(k-means法)を使って、データを2つのクラスターに分類する。
(初期クラスターは2)

> c1 <- kmeans(x, center=2)

所属クラスターの確認、中心の確認をする。

> c1$cluster
[1] 1 1 1 1 1 1 2 1 1 1 1 1 2 1 1 2 1 2  
          ←1~6件目がクラスタ1、7件目はクラスタ2であることが分かる
> c1$centers
     lat       long
1  -21.87143   182.3506     ←ラスタ1の中心の緯度経度
2  -15.87785   168.2598   ←ラスタ2の中心の緯度経度

この結果をプロットしてみる。
クラスターはcol で色指定することができ、クラスターの中心はpoints() でデータに点を表示する。

> plot(x, col=c1$cluster)
> points(c1$center, col=3:4,pch=8,cex=2)

points()関数: データに点を表示
    colオプション:色を指定(1:黒、2:赤、3:緑、4:青)
    pchオプション:点の種類 1~25までの種類を選択可能
    cexオプション:点の大きさを指定



今度はすべての属性を用いて同様にクラスター分析を行う。
ここではクラスター数を4にする。

> c2 <- kmeans(quakes, centers=4)
> c2$clouster
> c2$centers
> plot(quakes$lat, quakes$long, col=c2$cluster)
> points(c2$center, col=1:4,pch=8,cex=2)



属性は5つあるため、2次元のグラフは正確なグラフではないが、先ほどとは異なる結果となる。
たくさんの要素が入ることにより、データの距離が、特定のデータに引っ張られている。

2015年2月11日水曜日

Rでアソシエーション分析してみる


Rは標準ではアソシエーション分析はできないので、アソシエーション分析用のライブラリ”arules”を用いる。

> install.packages("arules")

arulesライブラリを読み込む。

> library(arules)

arulesライブラリに付属している食品雑貨店の販売データ(Groceries)を利用する。
付属しているデータについては、data()コマンドで確認できる。

> data()

Groceriesデータを読み込む。

> data(Groceries)

Groceriesデータの属性(データ型、行数、列の名前)を確認する。

> class(Groceries)
[1] "transactions"
attr (, "package")
[1] "arules"
> nrow(Groceries)
[1] 9835
> colnames(Groceries)

colnames(Groceries)の結果は、品名の列になっている。購入した場合は”1”と入っている。




トランザクションデータを確認する場合は、inspect() 関数を使う。
表示を途中で止める場合はEscキーで抜ける。

> inspect(Groceries)



ここから、アソシエーション分析を行う。
アソシエーション分析をおこなうためには、apriori関数を実行する。
apriori関数では、信頼度と支持度の下限値を設定し、前提部と帰結部のMAX LENGTHを、
パラメータに指定する。(例:信頼度0.5、支持度0.01、ルールの最大長4)

> res <- apriori(Groceries, parameter = list(confidence=0.5, support=0.01, maxlen=4))

   confidence: 信頼度の下限値
   support:   支持度の下限値
   maxlen:    ルールの長さ
            (以下は全てmaxlen=4)
             A,B,C→D
             A→B,C,D
             A,B→C,D
            ※普通は前提部が長い

抽出されたルールの情報を、SORT関数を利用して、信頼度の高い順番に表示して確認する。

> inspect(SORT(res, by="confidence"))



信頼度を降順に見て、リフトも3あれば、相関はあるといえそう。
支持度は0.01だが、たくさんのものが購入される食品店では全体の1%くらいは妥当であろう。



アソシエーション分析とは?

アソシエーション分析とは、データ間の相関関係の強さを計算してルールを抽出する分析手法。

購買履歴のデータを用いてどの商品が一緒に購入されるかの分析に用いられるため、「バスケット分析」とも呼ばれる。

  IF X THEN Y を X→Y と表記する。(X:前提部、Y:帰結部)

(例えばスーパーで、ネギ(X)を買ったときに豆腐(Y)を買う というルールをX→Yと表記する。)


  • 信頼度: 前提部(X)を満たすデータが帰結部(Y)を満たす割合


          X→Yの数
                   ----------
           Xの数
         
        X→Yというルールがどの程度信頼できるか(相関関係が強いか)を示す。
        信頼度が高い = その組み合わせの相関関係が強い
        (ネギが買われたケースのうち、どのくらいネギと豆腐がセットで買われたか)


  • 支持度: 全データの中にX→Yが登場する割合


          X→Yの数
         -----------
          全体の数
 
        X→Yというルールが全体の中でどの程度発生するかかを示す。
        ビジネスのボリュームをみる。
        これが小さければ、X→Yというルールに着目しても影響度が少なすぎる。
        (ネギと豆腐をセットで買うケースが全体の中でどれくらいあるか)
       

  • リフト: Yの全体比率とX→Yの信頼度との比


          X→Yの信頼度
         ---------------
           Yの全体比率

        X→Yの引き上げ効果がどの程度あるかを示す。
        これが小さければ、Y単体の魅力であり、X→Yという引き上げ効果はない。
        (ネギを買えば豆腐を買うという信頼度は、豆腐を買う全体比率と比べて高いか)
        ***言い換えると***
        前提部の影響により、帰結部が発生する割合がどのくらい増加するかを表す。
        リフトが1を下回っている場合、前提部により帰結部の発生割合が増えていない
        ため、その組み合わせに意味があるとは言えない。

(例題)
     購入ケース1: ネギ、豆腐、牛乳
     購入ケース2: ネギ、豆腐、白菜、豚肉
     購入ケース3: ネギ、豆腐、みょうが
     購入ケース4: 醤油、豆腐

     ネギ(X)→豆腐(Y)の
        信頼度 = 3/3 = 1
        支持度 = 3/4 = 0.75
        リフト  = 1/1 = 1 (実は引き上げ効果はない。やってもやらなくても効果同じ)



  • 分析手法は、Aprioriアルゴリズムを用いる。

R言語とRStudioを使う(基本操作編)

事前にRとRStudioをインストールしておく。

RStudio

(1) R基本操作

RStudioを立ち上げる。



まずは足し算。10+20 と入力して Enter 押すと、30 という結果が返る。
> 10+20
[1] 30

次は変数を使う。
x = 10, y= 20 とすると、右上のWorkspace画面のValuesの情報が表示される。
x+y とすると、結果の30 が返る。
> x <- 10
> y <- 20
> x+y
[1] 30


関数やベクトル(配列)も利用できる。
> z <- 1.546
> round(z, 2)                ←Zを小数点第2位に丸めこむ
[1] 1.55
> x <- c(1, 2, 3, 4, 5)      ←5つの数字 (1,2,3,4,5) をベクトル(配列)として x に代入
> sum(x)                         ←x の合計を算出
[1] 15
> mean(x)              ←x の平均を算出
[1] 3


関数の詳細を調べるには、help() を使う。右下にHelp画面が表示される。
> help("mean")



このようにコマンドを1つ1つ打つ以外にも、スクリプトを予め用意して、1行ずつ実行させることもできる。
メニュー→「File」→「Open File」から、スクリプトファイル「demo.r」を開くと、スクリプトのエディタ画面が表示される。


左上のエディタ画面で、実行したいコマンドの行にカーソルを合わせるか、複数行を選択し、Runボタンをクリックすると、そのコマンドが実行される。実行された結果は左下のコンソール画面に表示される。


(2) データの取り込みとプロット表示


作業ディレクトリを指定し、作業フォルダーにあるデータファイルを読み込む。
このファイルは、東京、愛知、大阪、福岡の男女別人口統計を集計したものである。

> setwd("c:/Users/junko/Documents/R/Labs")   ←作業ディレクトリを指定
> getwd()                            ←作業ディレクトリの確認
> ds <- read.csv("jinkou.csv", header=T)       ←ds にcsvデータを読み込む
> ds                                                                  ←読み込んだデータの確認

read.csv() :CSVファイルを表形式のデータフレーム型(data.frame)で取り込む
        第一引数はCSVファイル名。1行目が列の場合headerオプションはT。

> head(ds)                 ←データの先頭部を表示
> tail(ds)                   ←データの最終部を表示
> range(ds$year)             ←年の範囲(最小値と最大値)を確認

range(変数名$列名)  :データの範囲(最小値と最大値)を確認。



(例題)
1960年から2009年までの、東京、愛知、大阪、福岡における男女の人口が入ったデータがある。
①ここから男性の平均人口を求める。
②各年度の男女の合計人口の推移をグラフにプロットする。

> male <- ds$tokyo_m + ds$aichi_m + ds$osaka_m + ds$fukuoka_m
> mean(male)
> female <- ds$tokyo_f + ds$aichi_f + ds$osaka_f + ds$fukuoka_f
> t1 <- male + female
> plot(ds$year, t1, type="l", xlab="年", ylab="人口")         ←グラフのプロット表示

plot() 関数 :データをグラフに表示する。
         第一引数:X軸のデータ
         第二引数:Y軸のデータ
         typeオプション:グラフの種類(線:1、点:p、棒:h)
         xlabオプション:X軸の名前
         ylabオプション:Y軸の名前






Rは標準ではアソシエーション分析はできないので、アソシエーション分析用のライブラリ”arules”を用いる。