Pythonにて、リストやNumpy配列、Seriesに含まれる要素の数をカウントしたいとき、それぞれcount()、np.count_nonzero()、value_counts()を使います。
また、collectionsというライブラリをimportすれば、collections.Counter()でリストやNumpy配列、Seriesすべてに共通して使えます。
リスト、Numpy配列、Series全てに使えるカウント方法
ドラクエを例に考えます。
party = ['戦士', '勇者', '僧侶', '魔法使い', '戦士', '僧侶',
'魔法使い', '戦士', '僧侶', '勇者', '戦士', '僧侶']
リスト、Numpy配列、Seriesの全てで使えるカウント方法がこちらです。
import collections
collections.Counter(party)
Counter({‘戦士’: 4, ‘勇者’: 2, ‘僧侶’: 4, ‘魔法使い’: 2})
戦士の出現回数を取り出したければ、後ろに[‘戦士’]をつければOKです。
collections.Counter(party)['戦士']
4
リストの場合、count()が使える
リストだと、count()を使うことでそれぞれの要素の数をカウントできます。
party.count('戦士')
4
Numpy配列の場合、np.count_nonzero()が使える
Numpy配列の場合、np.count_nonzero()を使うことでそれぞれの要素の数をカウントできます。カッコの中は、条件の形で表します。
import numpy as np
np.count_nonzero(party == '戦士')
4
Seriesの場合、value_counts()が使える
Seriesの場合、value_counts()を使うことで、それぞれの要素の数をカウントできます。
import pandas as pd
party = pd.Series(party)
party.value_counts()
僧侶 4
戦士 4
魔法使い 2
勇者 2
dtype: int64
戦士の出現回数を取り出したければ、後ろに[1]をつければOKです。
party.value_counts()[1]
4
ちなみに、np.count_nonzero()も使えます。
応用編:出現回数ではなく、出現頻度(出現確率)で表す
出現回数ではなく、出現頻度(出現確率)で表すこともできます。
import pandas as pd
party = pd.Series(party)
party.value_counts() / party.value_counts().sum()
僧侶 0.333333
戦士 0.333333
魔法使い 0.166667
勇者 0.166667
dtype: int64
どういう場面で使うか?:データの前処理
データ分析では、同じ値を多く含む変数を削除します。例えば、2-foldクロスバリデーションを行う場合は、同じ値を5割以上含む変数を削除します。
なぜなら、2-foldだと全データの50%をtrainデータ、50%をtestデータに分けますので、同じ値が5割以上あると、trainデータの中の変数が全て同じ値になる可能性があるからです。
変数が全て同じ値になると、trainデータのその変数の分散が0になってしまい、スケーリング(標準化)ができなくなってしまいます。
そこで、上記のコードで変数の中の値の出現頻度を算出し、出現頻度が5割以上の値がないかどうかチェックします。
ドラクエの例ですと、最も出現頻度が高いのは僧侶と戦士で、それぞれ33.3%です。よって、2-foldクロスバリデーションには対応できます。
もし5-foldクロスバリデーションをする場合は、全データの80%をtrainデータ、20%をtestデータに分けることになりますので、ドラクエの例だとNGとなります。