Python、機械学習

【Python】リスト、Numpy配列、Seriesに含まれる要素の出現回数をカウントする(データの前処理で使う)

Pythonのリストや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の場合、np.value_counts()を使うことで、それぞれの要素の数をカウントできます。

import pandas as pd
party = pd.Series(party)
party.value_counts()

僧侶   4
戦士   4
魔法使い  2
勇者   2
dtype: int64

戦士の出現回数を取り出したければ、後ろにをつければOKです。

party.value_counts()

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となります。