非プログラマーのためのインフォマティクス入門。(仮)

非プログラマーがインフォマティクスについて勉強したことを記録します。主にKNIMEというソフトを使用しています。

【KNIME】ノード紹介:GroupBy 〜同じものをひとまとめに〜

前回までにcell splitterを使って、セルの中身を縦・横にぶった切る方法を紹介しました。

【KNIME】ノード紹介:cell splitter 〜文字列を分割したい〜

【KNIME】ノード紹介:cell splitterとUngroupのコラボ 〜文字列を縦方向に分割したい〜

予告通り、今回はバラバラにしたものを元の形に戻す方法を紹介したいと思います。

…KNIME内の処理は、最初のデータを上書きして消しているわけではないので作業自体に意味はないです。でも、子供の頃とかいろんな玩具や機械を分解したことありませんか?その時に、もう一度組み直すことができるとなんとなく仕組みがわかった気が私はしました。やっぱり綺麗なデータを準備するには、tableの中身を自在に扱えた方がいいと思います。なので、【バラす】【まとめる】を続けて紹介したいなーと感じ今回の題材を選びました。

例題では、前回のデータの名前(年齢も重複ですが)が重複するものをまとめて、元の形に戻していきます。

f:id:sumtat:20170728220234p:plain

GroupBy

名前通り、【***でグループにする】処理を実行するノードです。使用頻度は非常に高いです。

早速設定画面を見ていきます。

f:id:sumtat:20170729214906p:plain

 まずはGroupsの設定です。どのカラム内のデータに対し重複を探してまとめるかを指定します。今回は【名前】を指定しました。もし、このに年齢も指定すると「名前も年齢も同じ場合はまとめる」という意味になります。

続いてManual Aggregationの設定に移ります。

f:id:sumtat:20170729220630p:plainこの設定をしないと、Groupsで指定したカラムしか残りません。まとめた時に、他のカラムはどうするの?というKNIMEの疑問に答えるのがこの設定になります。Available columnsにあるもののうち、残しておきたい情報を右側に移動します。で、Aggregation (clicl to change)の部分を指示通りクリックするとプルダウンで選択肢が選べます。今回はUnique concatenate(重複を除去して連結)、Concatenate(全て連結)を指定しました。連結時の区切り文字は画面下部のValue delimiterで指定できます。今回は改行としました。Column naming に関しては、私は事情がない限りKeep original name(s)を選択します。

Aggregationの方法は

  • First(最初のやつ)、Last(最後のやつ)
  • Max(最大値)、Min(最小値)、Mean(平均)
  • Count(数)、Unique Count(重複除去した数)
  • List(リストとしてまとめる)

などなど、非常に多彩です。場面に合わせて、色々な方法を採用できます。

注意としては、設定内"missing"のチェックを入れる・入れないです。チェックが入っていると「欠損値と欠損値として扱う」、チェックがないと「欠損値はとばす(←たぶん)」という扱いになります。

例えば、欠損値が1つある場合にCountをすると

チェック有りの時の結果=チェック無しの結果+1

になります。

平均を取る時やカウントをする時には慎重にお願いします。

<おまけ>

カラムの数が多いと、Manual Aggregationで1つずつ指定するのが大変になってきます。隣のPattern or Type based Aggregationを使うことで少し楽になると思います。

f:id:sumtat:20170729221939p:plain特にPattern basedの方では正規表現によりカラムを指定できますので、何も考えず、すべてのカラムに対し同じ処理をしたいならば

カラム名:.*

にして、Regexにチェック!

これで解決します。

 

実行結果を見てみましょう。

f:id:sumtat:20170729222304p:plainはい、元通りです

結構簡単だと思いませんか?だからこそ、ちゃんと思い通りの処理ができているか、1処理(1ノード)ずつ結果を確認してください。途中経過を、すぐにTableとして確認できるのはKNIMEの特徴ですので、活用するといいと思います。 

データ数の確認・処理内容の確認、これはmustです。

...元通りと思った方、だまされてますよ!

年齢の属性がStringになってますね。元はIntegerでした。くっつけ方でconcatenateを指定したからですね。例えばFirstやMeanを選んでおけばIntegerだったはずです。

(こういう場合でも、string to numberというノードを使って後から直せます)

こんなこともあるので、よーく確認が必要なんです。

 

データの前処理は多くの人が大事だよーと言っているようです。

japan.zdnet.com

地味だし、なかなか評価もされないし、割と細かいこと気にしないといけなし…。

でも、これができてこそのデータ解析、機械学習です。

 

さて、次回は上のデータを細工して(年齢に歳をつける・番号のハイフンを@に置換)

f:id:sumtat:20170729224809p:plainこんな感じにしてみようと思います。