グルーピングしたデータごとにヒストグラムを確認する

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

機械学習を用いる際に専用のテーブル（casTable）を用いますが、今回はそのテーブルのヒストグラムをまとめて確認する方法を紹介します。

## データを確認する

今回は organics.sas7bdat を用います。

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

データは以下のようになっています。

```python
organics.casTable.head()
```

<table border="1" class="dataframe"><caption>Selected Rows from Table ORGANICS</caption>
  <thead>
    <tr style="text-align: right;">
      <th title=""></th>
      <th title="Customer Id">CUSTID</th>
      <th title="GENDER">GENDER</th>
      <th title="Date of Birth">DOB</th>
      <th title="Date data taken from data base">EDATE</th>
      <th title="Age">AGE</th>
      <th title="Age Group 1">AGEGRP1</th>
      <th title="Age Group 2">AGEGRP2</th>
      <th title="TV Region">TV_REG</th>
      <th title="Neighborhood Group">NGROUP</th>
      <th title="Type of Residential Neighborhood">NEIGHBORHOOD</th>
      <th title="Loyalty card application date">LCDATE</th>
      <th title="Number of Organic Products Purchased">ORGANICS</th>
      <th title="Total Amount Spent">BILL</th>
      <th title="Geographic Region">REGION</th>
      <th title="Customer Loyalty Status">CLASS</th>
      <th title="Organics Purchased?">ORGYN</th>
      <th title="Affluence grade">AFFL</th>
      <th title="Years as Loyalty Card Member">LTIME</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0000000140</td>
      <td>U</td>
      <td>1921-09-16</td>
      <td>1998-02-23</td>
      <td>76.0</td>
      <td>60-80</td>
      <td>70-80</td>
      <td>Wales &amp; West</td>
      <td>C</td>
      <td>16</td>
      <td>1994-11-07</td>
      <td>0.0</td>
      <td>16000.00</td>
      <td>Midlands</td>
      <td>Gold</td>
      <td>0.0</td>
      <td>10.0</td>
      <td>4.0</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0000000620</td>
      <td>U</td>
      <td>1949-02-12</td>
      <td>1998-02-23</td>
      <td>49.0</td>
      <td>40-60</td>
      <td>40-50</td>
      <td>Wales &amp; West</td>
      <td>D</td>
      <td>35</td>
      <td>1993-06-04</td>
      <td>0.0</td>
      <td>6000.00</td>
      <td>Midlands</td>
      <td>Gold</td>
      <td>0.0</td>
      <td>4.0</td>
      <td>5.0</td>
    </tr>
  </tbody>
</table>

## データをグルーピングする

まずデータをグルーピングします。

```py
organics.casTable.groupby = ['GENDER', 'AGEGRP1']
```

そしてヒストグラムを取り出します。

```py
result = organics.casTable.histogram(
    reqpacks=[{'nicebinning': False, 'nbins': 20}],
    inputs=['AFFL']
)
```

そうするとGENDERとAGEGRP1ごとにデータが分かれます。結果が分かれているのに気づくでしょう。

```py
list(result.keys())
['ByGroupInfo',
 'ByGroup1.BinDetails',
 'ByGroup2.BinDetails',
 'ByGroup3.BinDetails',
 'ByGroup4.BinDetails',
 'ByGroup5.BinDetails',
 'ByGroup6.BinDetails',
 'ByGroup7.BinDetails',
 'ByGroup8.BinDetails',
 'ByGroup9.BinDetails',
 'ByGroup10.BinDetails',
 'ByGroup11.BinDetails',
 'ByGroup12.BinDetails']
```

情報を確認します。

```py
result['ByGroupInfo']
```

結果は以下のようになっています（一部）。

<table border="1" class="dataframe"><caption>ByGroupInfo</caption>
  <thead>
    <tr style="text-align: right;">
      <th title=""></th>
      <th title="GENDER">GENDER</th>
      <th title="GENDER_f">GENDER_f</th>
      <th title="AGEGRP1">AGEGRP1</th>
      <th title="AGEGRP1_f">AGEGRP1_f</th>
      <th title="_key_">_key_</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>F</td>
      <td>F</td>
      <td>&lt;20</td>
      <td>&lt;20</td>
      <td>F&lt;20</td>
    </tr>
    <tr>
      <th>1</th>
      <td>F</td>
      <td>F</td>
      <td>20-40</td>
      <td>20-40</td>
      <td>F20-40</td>
    </tr>
    <tr>
      <th>2</th>
      <td>F</td>
      <td>F</td>
      <td>40-60</td>
      <td>40-60</td>
      <td>F40-60</td>
    </tr>
  </tbody>
</table>

## 可視化する

ではこのヒストグラムを可視化します。条件に応じて4パターン取り出します。

```py
all_df = {
    'GENDER=Female, AGEGRP1=<20': result['ByGroup1.BinDetails'],
    'GENDER=Female, AGEGRP1=20-40': result['ByGroup2.BinDetails'],
    'GENDER=Female, AGEGRP1=40-60': result['ByGroup3.BinDetails'],
    'GENDER=Female, AGEGRP1=60-80': result['ByGroup4.BinDetails'],
}
```

可視化するためにpandasなどを読み込みます。

```py
import pandas as pd
from bokeh.charts import Bar, Scatter, output_file, show, Area
from bokeh.io import gridplot
```

データをグラフに追加します。

```py
all_pic = []
for this_title in all_df:
    this_pic = Bar(all_df[this_title], 'MidPoint', values='Percent',
                  color='#1f77b4', agg='mean', title=this_title, legend=None,
                  xlabel='AFFL', ylabel='Percent'
                  )
    all_pic.append(this_pic)
p = gridplot([all_pic[0], all_pic[1]], [all_pic[2], all_pic[3]])
output_file('grid.html')
show(p)
```

こうするとグラフが4つ描かれたHTMLファイルが出力されます。

![Screenshot_ 2019-02-08 16.22.31.png](https://qiita-image-store.s3.amazonaws.com/0/274479/51536c7e-0418-66a5-7649-ad33e0d8afa7.png)

## まとめ

ByGroupInfoを見ることでデータ構造が分かります。そして各グルーピングされたデータごとに傾向を見ることで、大筋でのデータ把握ができるようになります。本格的な分析を行う前に行うのがお勧めです。