【Python・データ分析】クロス集計表の作成方法

こんにちは、Kosei(@kay_diacc2)です!

Pythonによるクロス集計表の作成手順を解説した記事です。本記事読了後は、クロス集計表作成メソッドや引数を駆使して、目的に応じた集計表が作成できるようになります。丁寧なプログラム解説もありますため是非ご覧ください。

目次

クロス集計表とは

クロス集計とは異なる2つ以上の情報をかけ合わせて集計する方法です。上図のように、アンケート結果等のマーケティング用途に利用されたり、財務や業務に適用される等様々な側面で用いられています。

【実践】Pythonでクロス集計表を作成する

実際にPythonでクロス集計表を作成してみましょう。具体的に下記の手順でプログラミングしていきます。

  1. データ読込
  2. pandas.crosstab()メソッドでクロス集計表作成
  3. 引数を駆使して多様な目的に応じたクロス集計表作成

データ読込

クロス集計表を作成する上で必要なデータを読み込みます。今回はサンプルとして下記を記述してみましょう。

import pandas as pd
from io import StringIO

# クロス集計表を作成するためのデータ
csv_data = \
    '''
    名前  性別 年齢  出身  結婚
    田中  女   20代  関東  未婚
    佐藤  女   30代  関西  未婚
    山田  男   30代  関西  既婚
    高橋  男   40代  関東  未婚
    田口  女   30代  関東  既婚
    伊藤  女   30代  九州  既婚
    大野  男   30代  関東  未婚
    松永  男   40代  関東  既婚
    入江  女   50代  九州  既婚
    '''

# データフレーム
df = pd.read_table(StringIO(csv_data),sep='\s+')

Pandas.crosstabメソッドでクロス集計表作成

クロス集計表はPandasライブラリのcrosstab()メソッドを用いて作成します。まずは、下記に示すような最小限必要な引数を指定し、集計表を作成してみましょう!

pandas.crosstab(index, columns)
# 第一引数:行の項目(index)
# 第二引数: 列の項目(columns)

具体的なクロス集計表作成例を示します。

年齢 vs 出身地

pd.crosstab(df["年齢"], df["出身"])

性別 vs 出身

pd.crosstab(df["性別"], df["出身"])

(性別 × 年齢) vs 出身

pd.crosstab([df["性別"],df["年齢"]], df["出身"])

(性別 × 年齢) vs (出身 × 結婚)

pd.crosstab([df["性別"],df["年齢"]], [df["出身"], df["結婚"]])

【実践】引数を駆使して多様な目的に応じたクロス集計表を作成する

続いてcrosstab()メソッドの引数を理解し、分析の目的に合わせてクロス集計表を加工できるようになりましょう。crosstab()メソッドに全ての引数を与えた場合、下記のように記述できます。

pandas.crosstab(
                index, columns, values=None, 
                rownames=None, colnames=None, aggfunc=None, 
                margins=False, margins_name='All', 
                dropna=True, normalize=False
               )

Pandas.crosstabメソッドの引数一覧

スクロールできます
引数名概要デフォルト
index行の項目必須
columns列の項目必須
values関数(aggfunc)で処理する値None
rownames行の名前None
colnames列の名前None
aggfunc関数None
margins小計表示要否False
margins_name小計の名前“All”
dropna全ての値がnullの列の削除要否True
normalize最大1最小0での正規化要否False

引数を用いてクロス集計表作成

前述で紹介した引数の中でよく使うものを用いてクロス集計表を加工してみます。引き続き作成に用いるデータとして下記を利用しますため、予め記述しておきましょう。

import pandas as pd
from io import StringIO

# クロス集計表を作成するためのデータ
csv_data = \
    '''
    名前  性別 年齢  出身  結婚
    田中  女   20代  関東  未婚
    佐藤  女   30代  関西  未婚
    山田  男   30代  関西  既婚
    高橋  男   40代  関東  未婚
    田口  女   30代  関東  既婚
    伊藤  女   30代  九州  既婚
    大野  男   30代  関東  未婚
    松永  男   40代  関東  既婚
    入江  女   50代  九州  既婚
    '''

# データフレーム
df = pd.read_table(StringIO(csv_data),sep='\s+')

小計(margins)を指定

pd.crosstab(df["年齢"], df["出身"], margins=True, margins_name="小計")

正規化処理を指定(normalize=True:総計が1になるように正規化)

pd.crosstab(df["年齢"], df["出身"], normalize=True, margins=True, margins_name="小計")

正規化処理を指定(normalize=”index”:行の小計が1になるよう正規化)

pd.crosstab(df["年齢"], df["出身"], normalize="index", margins=True)

正規化処理を指定(normalize=”columns”:列の小計が1になるよう正規化)

pd.crosstab(df["年齢"], df["出身"], normalize="columns", margins=True)

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
URLをコピーする
URLをコピーしました!
目次
閉じる