Help us understand the problem. What is going on with this article?

SAS Viyaでデータをカウントする

More than 1 year has passed since last update.

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

機械学習を用いる際に専用のテーブル(casTable)を用いますが、今回はデータのカウントについて紹介します。

データを確認する

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

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

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

organics.casTable.head()
Selected Rows from Table ORGANICS
CUSTID GENDER DOB EDATE AGE AGEGRP1 AGEGRP2 TV_REG NGROUP NEIGHBORHOOD LCDATE ORGANICS BILL REGION CLASS ORGYN AFFL LTIME
0 0000000140 U 1921-09-16 1998-02-23 76.0 60-80 70-80 Wales & West C 16 1994-11-07 0.0 16000.00 Midlands Gold 0.0 10.0 4.0
1 0000000620 U 1949-02-12 1998-02-23 49.0 40-60 40-50 Wales & West D 35 1993-06-04 0.0 6000.00 Midlands Gold 0.0 4.0 5.0

カウントを取る

カウントは district メソッドを使います。

organics.distinct()

結果は例えば以下のように返ってきます。

§ Distinct
Distinct Counts for ORGANICS
Column NDistinct NMiss Trunc
0 CUSTID 22223.0 0.0 0.0
1 GENDER 4.0 2512.0 0.0
2 DOB 12868.0 0.0 0.0
3 EDATE 1.0 0.0 0.0
4 AGE 63.0 1508.0 0.0
5 AGEGRP1 5.0 1508.0 0.0
6 AGEGRP2 8.0 1508.0 0.0
7 TV_REG 14.0 465.0 0.0
8 NGROUP 8.0 674.0 0.0
9 NEIGHBORHOOD 56.0 674.0 0.0
10 LCDATE 3535.0 281.0 0.0
11 ORGANICS 4.0 0.0 0.0
12 BILL 2606.0 0.0 0.0
13 REGION 6.0 465.0 0.0
14 CLASS 4.0 0.0 0.0
15 ORGYN 2.0 0.0 0.0
16 AFFL 34.0 1085.0 0.0
17 LTIME 40.0 281.0 0.0



elapsed 0.0482s · user 0.104s · sys 0.005s · mem 11.4MB

データ数によって絞り込みも行えます。

organics.distinct(maxnvals=500)
§ Distinct
Distinct Counts for ORGANICS
Column NDistinct NMiss Trunc
0 CUSTID 500.0 0.0 1.0
1 GENDER 4.0 2512.0 0.0
2 DOB 500.0 0.0 1.0
3 EDATE 1.0 0.0 0.0
4 AGE 63.0 1508.0 0.0
5 AGEGRP1 5.0 1508.0 0.0
6 AGEGRP2 8.0 1508.0 0.0
7 TV_REG 14.0 465.0 0.0
8 NGROUP 8.0 674.0 0.0
9 NEIGHBORHOOD 56.0 674.0 0.0
10 LCDATE 500.0 281.0 1.0
11 ORGANICS 4.0 0.0 0.0
12 BILL 500.0 0.0 1.0
13 REGION 6.0 465.0 0.0
14 CLASS 4.0 0.0 0.0
15 ORGYN 2.0 0.0 0.0
16 AFFL 34.0 1085.0 0.0
17 LTIME 40.0 281.0 0.0



elapsed 0.0299s · user 0.075s · sys 0.003s · mem 5.96MB

結果を別テーブルにする

以下のように書くと結果を別テーブルに出力できます。

result = sess.CASTable('distinctOutput', replace=True)
organics.distinct(maxnvals=500, casout=result)
result.head()

結果は以下のようになります。

Selected Rows from Table DISTINCTOUTPUT
_Column_ _NDis_ _NMiss_ _Truncated_
0 CUSTID 0.0 0.0 1.0
1 GENDER 4.0 2512.0 0.0
2 DOB 0.0 0.0 1.0
3 EDATE 1.0 0.0 0.0
4 AGE 63.0 1508.0 0.0

さらにこの結果テーブルをカウントごとに分類してみます。

out1 = organics.columninfo()['ColumnInfo']
out2 = organics.distinct(maxnvals=1000)['Distinct']
out3 = pd.merge(out1, out2, left_on='Column', right_on='Column', how='left')
varlist = {'cats': [], 'conts': [], 'others': []}
for index, row in out3.iterrows():
    varname = row['Column'].lower()
    vartype = row['Type'].lower()
    if vartype == 'char' and row['NDistinct'] <= 128:
        varlist['cats'].append(varname)
    elif vartype == 'double' and row['NDistinct'] <= 16:
        varlist['cats'].append(varname)
    elif vartype == 'double' and row['NDistinct'] > 16:
        varlist['conts'].append(varname)
    else:
        varlist['others'].append(varname)
print(varlist)
{
  'cats': ['gender', 'edate', 'agegrp1', 'agegrp2', 'tv_reg', 'ngroup', 'neighborhood', 'organics', 'region', 'class', 'orgyn'],
  'conts': ['dob', 'age', 'lcdate', 'bill', 'affl', 'ltime'],
  'others': ['custid']
}

まとめ

Pythonと組み合わせることで分析とデータの傾向を確認するのが簡単になります。ぜひご利用ください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away