カテゴリ度数の計算
カテゴリ値をとるデータに対して各カテゴリ値の生起頻度を数えることは基本的な操作の1つである。また、カテゴリ値を数値と入れ換えて、量的分析が行われることがある。
まず、カテゴリ頻度を数えるスクリプト例を試み、その後、カテゴリ値を入れ換えるスクリプト例を試みる。
最後に、クロス表の作成を試みた。
20人の人にペットの好き嫌いを聞いたところ、次のリストに示す結果を得たとする。
data = ['好き', '嫌い',
'好き', '嫌い', '嫌い',
'好き', '嫌い',
'嫌い', '好き', '嫌い',
'好き', '好き',
'どちらでもない', '好き',
'好き', '好き',
'嫌い', '好き', '嫌い', '嫌い']
この好き嫌いの回答の度数を数えるスクリプトをリスト1のように作成した。
リスト1 カテゴリ値の度数を数えるスクリプト例
data = ['好き', '嫌い',
'好き', '嫌い', '嫌い',
'好き', '嫌い',
'嫌い', '好き', '嫌い',
'好き', '好き',
'どちらでもない', '好き',
'好き', '好き',
'嫌い', '好き', '嫌い', '嫌い']
print(len(data))
cnt_dict = {}
for v in data:
if v in cnt_dict:
cnt_dict[v] += 1
else:
cnt_dict[v] = 1
print(cnt_dict)
まず、空の辞書cnt_dictを用意する。カテゴリ値をキーとして、カテゴリ値の頻度を記録する。
For文「for v in data:」において、カテゴリ値が最初のものであれば、そのカテゴリ値をキーとして頻度を0に設定する。
カテゴリ値が既に数えられたもの、すなわち、そのカテゴリ値がキーとして存在すれば、そのキーに対する値を1つ増やす。
上の手続きにより、for文「for v in data:〜」の終了後は、cnt_dictの各キーの値には、キーの表すカテゴリの頻度が設定されている。設定された内容は、最後のprint文により、以下のように出力される。
{'好き': 10, '嫌い': 9, 'どちらでもない': 1}
カテゴリ値を数値など他の値に変換して処理を行いたいことがある。カテゴリ値をキーとして、その変換値をキーに対する値として辞書を用意して処理することを試みた。
リスト2では、リスト1におけるカテゴリ値「好き」を1に、「どちらでもない」を0に、「嫌い」を−1に変換するための辞書val_dictを用意している。
リスト2 カテゴリ値の変換スクリプト例
val_dict = {'好き':1, 'どちらでもない':0, '嫌い':-1}
val_data = []
for v in data:
val_data.append(val_dict[v])
for x, y in zip(val_data, data):
print(x, y)
変換値を格納するリストval_dataを用意してfor文「for v in data:〜」を実行すると、変換値がリストval_dataに格納される。
リスト1のスクリプトに続いてリスト2のスクリプトを実行すると、変換結果がprint文で出力されて、以下の結果を得る。
1 好き
-1 嫌い
1 好き
-1 嫌い
-1 嫌い
1 好き
-1 嫌い
-1 嫌い
1 好き
-1 嫌い
1 好き
1 好き
0 どちらでもない
1 好き
1 好き
1 好き
-1 嫌い
1 好き
-1 嫌い
-1 嫌い
カテゴリ変数2変数のデータが次のように与えられたとする。
data = [['A', 1], ['A', 1], ['A', 1],
['A', 1], ['A', 1],
['B', 1], ['B', 1], ['A', 2], ['A', 2], ['A', 2],
['A', 1], ['B', 1], ['A', 1], ['A', 1], ['A', 2],
['B', 1], ['A', 2], ['A', 2], ['B', 1], ['A', 1]]
上記データに対してクロス表を作成するスクリプトをリスト3のように作成してみた。
data = [['A', 1], ['A', 1], ['A', 1],
['A', 1], ['A', 1],
['B', 1], ['B', 1], ['A', 2], ['A', 2], ['A', 2],
['A', 1], ['B', 1], ['A', 1], ['A', 1], ['A', 2],
['B', 1], ['A', 2], ['A', 2], ['B', 1], ['A', 1]]
cnt_dic = {} # 回答パターンの計数用辞書
for v in data:
x = v[0]
y = v[1]
if (x, y) in cnt_dic:
cnt_dic[(x, y)] += 1 # 既に数えられたパターンであれば、度数を1つ増やす
else:
cnt_dic[(x, y)] = 1 # 新しいパターンであれば、キーとして設定して、度数を1とする
print('cnt_dic =\n',cnt_dic)
v_keys = cnt_dic.keys()
print('Keys of cnt_dic =\n', v_keys)
k1 = set()
# 1番目のキーを集める集合
k2 = set()
# 2番目のキーを集める集合
for v in v_keys:
k1.add(v[0])
k2.add(v[1])
print('k1 =\n', k1)
print('k2 =\n', k2)
for x in k1:
for y in k2:
if
not (x,y) in cnt_dic: # 計数されなかったパターンであれば、キーとして登録して、度数を0に設定
cnt_dic[(x,y)] = 0
print('Filled cnt_dic =\n', cnt_dic)
"""
クロス表として出力
"""
print()
print('Cross Table')
print(f'{" ":>12s}',
end='')
for y in k2:
print(f'{y:>12}', end='')
print()
for x in k1:
print(f'{x:>12}', end='')
for y in k2:
print(f'{cnt_dic[(x,y)]:>12}', end='')
print()
データのカテゴリ変数の値の組み合わせをキーとして、各組合せの度数をキーに対する値とする辞書cnt_dicを作成している。
作成した辞書の内容は、最後にクロス表として出力している。
リスト3を実行すると、以下のようにクロス表が出力される。
Cross Table
1
2
B
5 0
A
9
6
参考書
岡本安晴(2019)いまさら聞けけないPythonでデータ分析.丸善出版