COMPANY

PAGE TOP

BLOG

RapidMinerで簡単にデータ変換!縦長横長へ

R言語のgather/spread と RapidMinerのpivot/depivotの比較

こんにちは、株式会社KSKアナリティクスの周です。
今からプログラミングを勉強して
データの前処理にチャレンジしようという人向けに
より簡単にできるRapidMinerの機能を紹介します!

例えば、R言語を使っているデータ分析者たちは
必ずtidyer+dplyrを熟知しているでしょう、
データの前処理でとても便利なライブラリーです。

gather/spreadを使って縦長・横長・入れ子に変形・整形することが楽にできます。
しかし、プログラミングを上手く書けない人は、
同じようなデータ処理をしたい場合はどうすればいいでしょう。

EXCELのピボットテーブルでも同様の処理を行うことはできます。
しかし、EXCELではそのまま高度な分析に入ることはできませんよね?
そこで、RapidMinerを使うと、
データの変換も、さらには高度な分析まで素早く行うことができます。

では、RapidMinerでどのように操作するのかを一緒に見てみましょう。

なお、ここでは比較のために、
R言語でする場合とRapidMinerでの操作方法を
比べながら、説明していきたいと思います。

例でR言語に標準で用意されているデータセットtreesを使用します。

このデータセットは31本の材木の
直径(Girth)、高さ(Height)、体積(Volume)を表しています。
(Girthは本来の意味では「周囲の長さ」というですが
Rのドキュメントによると「直径」を表しているとのことです。)

では、まずデータを見ましょう。

# ライブラリーを呼び出す。
> library(tidyr)

# dfを作成する。
> df <- trees[c(1:5),]>
> num <- nrow(df)

# カラムidを付け、id_1~31という形で木材のidを作成する。
> df$id <- c(paste("id_",1:num))

# dfを確認する。
> df
  Girth Height Volume    id
1   8.3     70   10.3 id_ 1
2   8.6     65   10.3 id_ 2
3   8.8     63   10.2 id_ 3
4  10.5     72   16.4 id_ 4
5  10.7     81   18.8 id_ 5

後でRapidMinerの説明をするために、ローカルにcsvファイルをアウトプットします。

> write.csv(df, "/trees.csv")

gather()で並び替えます。分析対象が増えても、行だけが増えるようにデータの構造を変更します。

> df_gather <- gather(data = df,
                key = measurements,
                       value = value,
                       Girth,Height,Volume)

> df_gather
      id measurements value
1  id_ 1        Girth   8.3
2  id_ 2        Girth   8.6
3  id_ 3        Girth   8.8
4  id_ 4        Girth  10.5
5  id_ 5        Girth  10.7
6  id_ 1       Height  70.0
7  id_ 2       Height  65.0
8  id_ 3       Height  63.0
9  id_ 4       Height  72.0
10 id_ 5       Height  81.0
11 id_ 1       Volume  10.3
12 id_ 2       Volume  10.3
13 id_ 3       Volume  10.2
14 id_ 4       Volume  16.4
15 id_ 5       Volume  18.8

spread()で元に戻ります。

> df_spread <- spread(data = df_gather, 
                      key = measurements,   
                      value = value)

> df_spread
     id Girth Height Volume
1 id_ 1   8.3     70   10.3
2 id_ 2   8.6     65   10.3
3 id_ 3   8.8     63   10.2
4 id_ 4  10.5     72   16.4
5 id_ 5  10.7     81   18.8

では、RapidMinerの操作方法を見ましょう。
まず作ったデータをインポートします。
Read CSVなどを使って読み込みましょう。

インポートする際に、このまま読み込むと、行番号まで入ってしまったので、削除します。

またHeightの部分をinteger型からreal型に変換します。
(赤い線のところで削除、数値型の変換ができます。)

読み込むと以下のようになります。

そして、オペレーターのDe-Povitをデータセットの後ろにドラッグして、
画面右側のパラメータを編集しましょう。
create nominal indexにチェックを、
index attributeにmeasurementsを入れます。

attribute nameの隣のEdit Listをクリックすると、以下の画面が出てきます。
attribute nameの空欄にvalueというカラム名を入れ、 attributesの欄に縦長したいカラムを選びましょう

赤丸のボタンをクリックして下の画面が出てきます。
三つのカラムを使いたいため、Girth|Height|Volumeと入力してください。
Regular Expressionの使い方についてここで詳しく紹介しませんが、また今後のブログで説明させて頂きます。
下の画面が出てきたら、右下のApplyをクリックしましょう。

以下のような画面になっているでしょうか?

実行すると、上で説明したdf_gatherと同じような変換ができましたね。

もう一度、最初の形に戻す場合はどうすればいいでしょうか?
オペレーターのPivotを使ってみましょう。

Pivotを先ほどのプロセスの後ろに置いて、パラメータを編集しましょう。

group by attributes のSelect Attributesをクリックし、idを選択、Applyします。

そして、column grouping attributeのmeasurementsを選び、
aggregation attributesのEdit Listをクリックすると、
aggregation attributeのvalueを,
aggregation function のfirstを選択し、
Applyしましょう。

全てのオペレーターを繋げて

実行!

また元に戻りましたね。
だけど、RapidMinerがデータを元に戻した時に、
各カラム名の前にfirst(value)_
がついてしまっています。修正したい場合は、オペレーターのRenameを使ってください。

今回のblogは以上になりますが、RapidMinerのPivotとDe-pivotを上手く使えば、データを縦長と横長の変換はすぐできますね。
どうですか?とても簡単でしょう、ワクワクしませんか?

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

もしRapidMinerに興味を持ちましたら、
是非今度のハンズオンに参加してみましょう!
またご質問とかありましたら、下の連絡先まで連絡してください。

https://ksk-anl.smktg.jp/public/application/add/43

1日で機械学習の基礎が学べる!無償ハンズオンセミナー随時開催中
https://www.ksk-anl.com/event/

RapidMinerをもっと知りたい方はこちら
https://www.rapidminer.jp/

早速使ってみたい!RapidMinerの体験版の無償DL
https://www.rapidminer.jp/download/

導入を検討中!わかりやすい詳細なQ&A
https://www.rapidminer.jp/faq/

$$ \begin{aligned} \newcommand\argmin{\mathop{\rm arg~min}\limits} \boldsymbol{\beta}_{\text{ridge}} & = \argmin_{\boldsymbol{\beta} \in \mathcal{R^p}} \biggl[ ||\boldsymbol{y}-\boldsymbol{X\beta}||^2 + \lambda ||\boldsymbol{\beta}||^2 \biggr] \\ & = (\boldsymbol{X}^T\boldsymbol{X} + \lambda\boldsymbol{I_{p+1}})^{-1}\boldsymbol{X}^T\boldsymbol{y} \end{aligned} $$
PAGE TOP