Python超基礎4:データの集計

ここからはいよいよデータの集計に入っていく。

4. データの集計

授業でも伝えた通り、ビッグデータは全体の傾向を掴むのに長けているが、一方で生のデータから個々の現象を眺めているだけでそれを理解するのは難しい。そこでまずは様々な観点から集計してみることにする。

4.1 データ全体の集計

データ分析の基本として、データの代表値(平均や分散など)の確認から。データをそのまま足し合わせたり平均したりといった集計はdescribe関数を使えば一発で一通り算出してくれる。

データは前回読み出してdという名前のpandasデータフレームにしているとすれば、

				
					d.describe()
				
			

主な値

  • count:サンプルサイズ
  • mean:算術平均値
  • min/max:最小値 / 最大値
  • 25, 50, 75%:分位点(50%分位を特に中央値)

describeでは数値変数をすべて集計対象としている。つまり日時のような変数は当然平均も分散も計算できないため問題はないが、一方で「月」のように計算が意味をなさない変数でも画像の通り集計に含まれてしまうので注意が必要である。

4.2 顧客ごとの集計

このデータは購入されたある1回の商品ごとのデータになっており、全体の傾向が掴みにくい。理解しやすくするためにもまずは顧客ごとの集計を行ってみる。

特定のグループごとに集計を行う場合にはgroupby関数を用いる。

				
					d.groupby('ユーザーID').sum()
				
			

これは今読み込んだデータをgroup by ユーザーID(=顧客IDによってグループ化)した上で、sum(=合計)を計算するコマンド。つまり、顧客ごとにグループ化して各グループの合計値を算出する。

先ほどまで同じ顧客が何回も出てきていたデータが顧客ごとに足し合わされ、それぞれが合計何個/いくら購入したのかを表すデータになった。

とはいえ、これは現状でユーザーID順になっているため、金額や個数の多寡はわからない。そこでデータを並び替えてみる。並び替えにはsort_values(‘ソートしたい変数名’)を用いて、

				
					d.groupby('ユーザーID').sum().sort_values('合計金額')
				
			

で実行できる。これによって、ユーザーIDごとに合計されたデータセットについて、それを合計金額の低い顧客から順に並び替えたものとなったことがわかる。

ちなみにこれは昇順になっているが、降順にしたければsort_valuesのオプションascending=Falseをつける。ascendingは昇順を意味しているため、昇順=False(否)で降順になる。ascendingは省略した場合には自動的にTrueと見做されるので、デフォルトでは昇順の並び替えとなるわけだ。

				
					d.groupby('ユーザーID').sum().sort_values('合計金額', ascending=False)
				
			

ちなみにここでは「価格」(=単価)や「月」など合計しても仕方のない変数も一緒に計算されている。先ほどデータセットのうちのあるひとつの変数を選択する場合にd[‘変数名’]という文法を使ったが、pandasではd[[‘変数名1’, ‘変数名2’, …, ‘変数名N’]] という形で必要な変数を複数個選択することもできる。これを応用することで、必要な変数だけに絞って集計することが可能。

試しに数量と合計金額のみを選択した状態で先ほどの処理をやってみるなら、

				
					d[['数量', '合計金額']].groupby('ユーザーID').sum().sort_values('合計金額', ascending=False)
				
			

一連のコードを左から順に読み進めていくと、「まずデータセットとしてdを呼び出し、そのうちの数量と合計金額だけを選択し([[‘数量’, ‘合計金額’]])、ユーザーIDでグループ化し(groupby(‘ユーザーID’))、その変数を合計し(sum())、合計金額をもとに降順に並び替える(sort_values())」という処理を行っていることになる。

このように、pandasの利点は各処理を関数としてどんどん数珠つなぎにしていける操作性の高さと、後から読み返した際に理解しやすい可読性の高さにある(その代わりデータ処理の動作は決して早いとはいえない)。

4.3 ブランドごとの集計

上では顧客IDでグループ化したが、同じ操作でブランドごとに集計をとるとすればどうやればいいだろうか。

グループ化で先ほどと同じように合計を出しても仕方ないので、今回はグループごとの平均をとってみる。平均はmeanを用いて、

				
					d.groupby('ブランド名').mean()
				
			

といった形でブランドごとの平均を算出できる。ここから検定を用いて「ブランド間の平均購買数量に統計的に有意な差が存在するか」などを調べていくわけだ(今回は入門なので扱わない)。