casTableの複数カラムを使ったグループ化

[SAS Viya](https://www.sas.com/ja_jp/software/viya.html)はAIプラットフォームになります。Webブラウザ上で機械学習の設計、実行ができるStudioという環境も用意されていますが、開発者はプログラミングコードで開発することも可能です。プログラミング言語はJava/Python/R/SASが選べます。

機械学習を用いる際に専用のテーブル（casTable）を用いますが、今回はそのテーブルの複数カラムを指定するグループ化について解説します。

## データを取り込む

今回使うのは `organics.sas7bdat` です。年齢、性別ごとに健康状態などが入ったデータです。まずこのデータを読み込みます。

```py
organics = sess.upload('organics.sas7bdat')
```

## グループ化するカラムを指定する

まず一つのカラムでグルーピングします。

```py
organics.casTable.groupby = 'NGroup'
```

グループ化した際の値を確認します。

```py
result = organics.casTable.summary(inputs='Age')
result['ByGroupInfo']
```

|   | NGROUP | NGROUP_f | _key_
|----|----|----|----|
| 0 |  |  | 
| 1 | A | A | A
| 6 | F | F | F
| 7 | U | U | U

## データを閲覧する

では実際のデータを確認します。

```py
result2 = result.concat_bygroups()
result2['Summary'][['N', 'Min', 'Mean', 'Max', 'Std']]
```

|    | N | Min | Mean | Max | Std |
|----|----|----|----|----|----|
| NGROUP |  |  |  |  |  |
| | 620.0 | 18.0 | 51.943548 | 79.0 | 13.402615
| A | 1725.0 | 19.0 | 57.141449 | 79.0 | 12.670404
| B | 3863.0 | 18.0 | 57.054103 | 79.0 | 12.526261
| C | 4228.0 | 18.0 | 53.967360 | 79.0 | 13.124790
| D | 4107.0 | 19.0 | 52.899440 | 79.0 | 12.772080
| E | 2431.0 | 21.0 | 53.461950 | 79.0 | 13.376446
| F | 3691.0 | 19.0 | 50.236521 | 79.0 | 13.375629
| U | 50.0 | 26.0 | 48.260000 | 77.0 | 15.145296

こうやってグルーピングしたデータを確認できます。

## 複数カラムを指定する

ではここから本番です。複数カラムをグルーピングに指定します。

```py
organics.casTable.groupby = ['NGroup', 'Gender']
result = organics.casTable.summary(inputs='Age')
result3 = result.concat_bygroups()
result3['Summary'][['N', 'Min', 'Mean', 'Max', 'Std']]
```

そうするとデータも多段階に展開されます。

<table border="1" class="dataframe"><caption>Descriptive Statistics for ORGANICS</caption>
  <thead>
    <tr style="text-align: right;">
      <th title=""></th>
      <th title=""></th>
      <th title="N">N</th>
      <th title="Minimum">Min</th>
      <th title="Mean">Mean</th>
      <th title="Maximum">Max</th>
      <th title="Std Dev">Std</th>
    </tr>
    <tr>
      <th title="NGROUP">NGROUP</th>
      <th title="GENDER">GENDER</th>
      <th title=""></th>
      <th title=""></th>
      <th title=""></th>
      <th title=""></th>
      <th title=""></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="4" valign="top"></th>
      <th></th>
      <td>57.0</td>
      <td>29.0</td>
      <td>54.298246</td>
      <td>78.0</td>
      <td>12.562650</td>
    </tr>
    <tr>
      <th>F</th>
      <td>365.0</td>
      <td>24.0</td>
      <td>50.682192</td>
      <td>79.0</td>
      <td>13.316223</td>
    </tr>
    <tr>
      <th>M</th>
      <td>155.0</td>
      <td>23.0</td>
      <td>53.858065</td>
      <td>78.0</td>
      <td>13.177331</td>
    </tr>
    <tr>
      <th>U</th>
      <td>43.0</td>
      <td>18.0</td>
      <td>52.627907</td>
      <td>78.0</td>
      <td>15.104435</td>
    </tr>
    <tr>
      <th rowspan="4" valign="top">A</th>
      <th></th>
      <td>228.0</td>
      <td>27.0</td>
      <td>58.070175</td>
      <td>79.0</td>
      <td>10.859308</td>
    </tr>
    <tr>
      <th>F</th>
      <td>892.0</td>
      <td>19.0</td>
      <td>56.383408</td>
      <td>79.0</td>
      <td>13.528325</td>
    </tr>
    <tr>
      <th>M</th>
      <td>452.0</td>
      <td>24.0</td>
      <td>57.488938</td>
      <td>79.0</td>
      <td>11.934127</td>
    </tr>
    <tr>
      <th>U</th>
      <td>153.0</td>
      <td>21.0</td>
      <td>59.150327</td>
      <td>79.0</td>
      <td>11.843148</td>
    </tr>
    <tr>
      <th rowspan="4" valign="top">B</th>
      <th></th>
      <td>451.0</td>
      <td>20.0</td>
      <td>56.416851</td>
      <td>79.0</td>
      <td>12.255215</td>
    </tr>
    <tr>
      <th>F</th>
      <td>2079.0</td>
      <td>19.0</td>
      <td>56.823954</td>
      <td>79.0</td>
      <td>12.702405</td>
    </tr>
    <tr>
      <th>M</th>
      <td>1026.0</td>
      <td>18.0</td>
      <td>57.592593</td>
      <td>79.0</td>
      <td>12.522748</td>
    </tr>
    <tr>
      <th>U</th>
      <td>307.0</td>
      <td>28.0</td>
      <td>57.749186</td>
      <td>79.0</td>
      <td>11.662981</td>
    </tr>
    <tr>
      <th rowspan="4" valign="top">U</th>
      <th></th>
      <td>5.0</td>
      <td>27.0</td>
      <td>56.800000</td>
      <td>76.0</td>
      <td>18.212633</td>
    </tr>
    <tr>
      <th>F</th>
      <td>32.0</td>
      <td>27.0</td>
      <td>47.500000</td>
      <td>77.0</td>
      <td>16.372676</td>
    </tr>
    <tr>
      <th>M</th>
      <td>12.0</td>
      <td>26.0</td>
      <td>46.250000</td>
      <td>57.0</td>
      <td>10.172378</td>
    </tr>
    <tr>
      <th>U</th>
      <td>1.0</td>
      <td>54.0</td>
      <td>54.000000</td>
      <td>54.0</td>
      <td>NaN</td>
    </tr>
  </tbody>
</table>

この表示は `organics.casTable.groupby` のカラムを指定した順番で並びます。

----

グルーピングすることでデータの傾向が見えやすくなります。データを取り込んだ際に、まずデータの内容を分析する際に使ってみてください。