Python

Python初心者向け:クロス集計の際の注意点を解説

スポンサーリンク


▶ ピボットテーブルの基本的な使い方は以下の記事を参考にしてください。

はじめに

今回はpandasのpivot_table()メソッドを使った集計を扱います。以前、このブログでもpivot_table()を扱ったことがありますが、今回は注意点や集計時のちょっとしたTipsをご紹介します。

やりたいこと

サンプルデータ

今回は次のような2つのデータを扱うことにしましょう。1つは、会員データを記録した会員マスタで各会員がどの店舗のお客様であるかがわかるようになっています。もう一つは受注データです。受注データではどの会員が、どのような商品カテゴリで、いくら買ったか、が月ごとにわかるようになっています。ここでは、会員マスタを「customer_data」、受注データを「order_data」とします。

customer_data=pd.read_csv('data/customer.csv',encoding='cp932')
order_data=pd.read_csv('data/order.csv',encoding='cp932')

<会員マスタ:customer_data>

<受注データ:order_data>

やりたいこと

各店舗の月別・商品カテゴリ別の受注件数を集計して、一覧で実績がわかるようにしたい。

データを眺める

会員マスタ

会員マスタは「会員No」と「店舗」の2つのの列しかないようです。「会員No」はシリアルに番号が採番されているようですが、

  • 「会員」は何人くらいいるのでしょうか?
  • 「店舗」はいくつくらいの種類があるのでしょうか?
customer_data['会員No'].nunique()


会員は22人いることがわかります。

print(customer_data['店舗'].nunique())
print(customer_data['店舗'].unique())


店舗は4店舗あり、「A店舗」から「D店舗」までとわかります。

受注データ

受注データは、 「会員No」「商品カテゴリ」「受注月」「受注件数」「店舗」の列があります。

  • どのような商品カテゴリがあるのか?
  • いつからいつまでの期間のデータなのか?

をみてみましょう。

print(order_data['商品カテゴリ'].nunique())
print(order_data['商品カテゴリ'].unique())

商品カテゴリは5つあって、それは「家具」「生活用品」「文具」「オフィス用品」「パソコン」であることがわかります。

print(order_data['受注月'].nunique())
print(order_data['受注月'].unique())

受注月は10月,11月,12月,1月の4か月のデータであることがわかりました。これらのデータを使って集計をしていきましょう。

集計

データを結合する

まずは2つのデータを結合してみましょう。2つのデータは「会員No」で結合することができますね。

connect=pd.merge(order_data,customer_data,on='会員No',how='left')
connect.head()

念のためにレコード数を確認しておきましょう。結合前と結合後でレコード数が変わっていないことを確認できればOKです。

print('結合前の受注データの件数は%dです'%len(order_data))
print('結合後のデータの件数は%dです'%len(connect))

結合前後でレコード数が変わらないので問題なさそうですね。では、集計をしていきましょう。

pivot_table()メソッドでクロス集計をする

店舗ごとに、月別・商材別に受注件数を集計するのであれば、pivot_table()メソッドを使えば簡単でできそうです。早速やってみましょう。

pd.pivot_table(connect,index='店舗',columns=['受注月','商品カテゴリ'],values='受注件数',aggfunc='sum')


できました。念のためにいくつかデータを確認してみましょう。

まずは店舗ごとの受注件数です。ピボットテーブルでは右端に合計を表示しています。これをgroupbyで計算してみましょう。

connect.groupby('店舗').agg({'受注件数':'sum'}).reset_index()

A店舗からC店舗まですべて合計が合ってそうですね。続いて、受注月・商品カテゴリごとの受注件数を確認してみましょう。

connect.groupby(['受注月','商品カテゴリ']).agg({'受注件数':'sum'}).reset_index()

これも数字があっていますね。集計値としてはこれで正しそうです。ただ、集計データが使われる状況にもよりますが、この集計表にはいくつか注意点があります。

注意点

店舗は「A店舗」から「D店舗」まで4店舗、商品カテゴリは「家具」「生活用品」「文具」「オフィス用品」「パソコン」の5つありました。ただ、今回集計した表を改めてみてみると、次のようになっています。

例えば、

  • 10月の商品カテゴリは、「オフィス用品」「家具」「文具」「生活用品」
  • 11月の商品カテゴリは、「パソコン」「家具」「文具」

となっています。各店舗の商品カテゴリの毎の受注件数を月ごとにみたい、というときに各月の列が欠落などして揃っていないと比較することができません。

また、店舗に関しても、D店舗は新規出店の準備をしているだけのようなケースではよいかもしれませんが、受注件数が0であっても明示的に表示させておきたい場合もあります。

スポンサーリンク

まとめ

いかがでしたか?pivot_table()は便利ですが、集計したそのままでは表示されない組み合わせがあることがあります。その点に注意して扱うことが大切ですね。次回は、今回ご紹介した注意点を修正する方法を扱います。

▶ 今回ご紹介した注意点を修正する方法を記載した記事はこちらになります。

コメント

タイトルとURLをコピーしました