<< トップページへ

<< 目次へ

更新日:2013.4.13

グループ集計を行う



 データマイニング業務の現場では「グループ集計」がしばしば行われる。グループ集計とは、例えば「都道府県ごとの人数」(=計数)、「学年ごとの数学の平均値」(=平均)、「顧客ごとの累積購買金額」(=合計)といったものを算出することである。

ID 年齢 グループ 出身地 得点
001 10 A 群馬 10.223
002 20 A 神奈川 20.345
003 20 C 群馬 30.321
004 40 B 東京 10.894
005 30 B 東京 50.009
006 10 C 東京 40.332
007 50 A 埼玉 10.501
008 30 B 神奈川 40.444
009 20 A 埼玉 40.441
010 60 A 東京 20.004
受験者テーブル.csv


■GROUP BY 基本構文

 集計の際にはCOUNT()、SUM()、AVG()といった既存の関数を利用することができ、あるグループ化変数(統計学的にいえばカテゴリカル型変数)について、グループ集計を行う場合にはGROUP BY構文を用いる。

 
select 関数名(カラム名) from [テーブル名] group by [グループ化変数];
 


■グループ(A,B,C)ごとの計数を算出

 計数を算出するための関数としてCOUNT()が用意されている。SELECT * FROMの部分において、任意のカラム名を指定することで表示させるカラムを制御することができる(そもそも * は「すべてのカラム」という意味である)。

 
select count(grp) from jyuken group by grp;


# ーーーーー 【実行例】
mysql> select count(grp) from jyuken group by grp;
+------------+
| count(grp) |
+------------+
|          5 |
|          3 |
|          2 |
+------------+

mysql> select grp, count(grp) from jyuken group by grp;
+------+------------+
| grp  | count(grp) |
+------+------------+
| A    |          5 | ←表示させるカラムは自由に指定できる
| B    |          3 |  grpを一緒に表示させた方が分かりやすい
| C    |          2 |
+------+------------+
 


■グループごとの得点の平均値を算出

 平均を算出するための関数としてAVG()が用意されている。

 
select grp, avg(score) from jyuken group by grp;


# ーーーーー 【実行例】
mysql> select grp, avg(score) from jyuken group by grp;
+------+------------------+
| grp  | avg(score)       |
+------+------------------+
| A    |          20.3028 |
| B    | 33.7823333333333 |
| C    |          35.3265 |
+------+------------------+
 


■出身地ごとの得点の合計を算出

 合計を算出するための関数としてSUM()が用意されている。

 
select area, sum(score) from jyuken group by area;


# ーーーーー 【実行例】
mysql> select area, sum(score) from jyuken group by area;
+--------+------------+
| area   | sum(score) |
+--------+------------+
| 群馬   |     40.544 |
| 埼玉   |     50.942 |
| 神奈川 |     60.789 |
| 東京   |    121.239 |
+--------+------------+
 


■東京のなかで、グループごとの得点の平均値を算出

 まずWHERE構文によって特定の条件でレコードを絞り、そのうえで、あるグループ変数についての平均を求めるようなこともできる。場合によっては集計結果をソートして表示させた方が分かりやすいことがある。

 
select grp, avg(score) from jyuken where area='東京' group by grp;


# ーーーーー 【実行例】
mysql> select grp, avg(score) from jyuken where area='東京' group by grp;
+------+------------+
| grp  | avg(score) |
+------+------------+
| A    |     20.004 |
| B    |    30.4515 |
| C    |     40.332 |
+------+------------+



select grp, avg(score) from jyuken 
   where area='東京' 
   group by grp 
   order by avg(score) desc;


# ーーーーー 【実行例】
mysql> select grp, avg(score) from jyuken
    ->    where area='東京'
    ->    group by grp
    ->    order by avg(score) desc;
+------+------------+
| grp  | avg(score) |
+------+------------+
| C    |     40.332 | ←ソートして表示させることもできる
| B    |    30.4515 |
| A    |     20.004 |
+------+------------+
 


■出身地ごとに得点の平均値を出し、得点の全平均以上のものだけを表示

 あらかじめ全体の平均値を求めておき、エリアごとの平均値の中から、全平均以上であるものだけを表示させるようなこともできる。

 
# あらかじめ得点の全平均を計算して把握しておく(全平均=27.35)
select avg(score) from jyuken;


# ーーーーー 【実行例】
mysql> select avg(score) from jyuken;
+------------+
| avg(score) |
+------------+
|    27.3514 |
+------------+



select area, avg(score) from jyuken group by area having avg(score)>=27.35;


# ーーーーー 【実行例】
mysql> select area, avg(score) from jyuken group by area having avg(score)>=27.35;
+--------+------------+
| area   | avg(score) |
+--------+------------+
| 神奈川 |    30.3945 |
| 東京   |   30.30975 |
+--------+------------+