【Pandasデータ探索】ユニークな要素の数と頻度(出現回数)をカウントする方法


 

データ分析の初期段階で非常に重要なのが、データセットに含まれるユニーク(一意な)な要素の数を把握したり、各要素がどれくらいの頻度(出現回数)で登場するかを調べたりすることです。Pandasは、これらの集計作業を簡単かつ効率的に行うための強力なメソッドを提供しています。この記事では、DataFrameやSeriesからユニークな要素の数や頻度をカウントする主要なテクニックを、短いサンプルコードと丁寧な解説を交えてご紹介します。


 

なぜユニークな要素と頻度をカウントするのか?

 

ユニークな要素の数や頻度をカウントする主な理由は以下の通りです。

  • データの特徴把握: データの多様性や偏りを理解し、カテゴリカルデータの内容を確認できます。

    • 例: 顧客の居住地の種類がいくつあるか、最も多い年齢層は何か。

  • データ品質の確認: 表記ゆれや誤入力がないかを発見する手助けになります。

    • 例: “東京”と”東京都”が別々のユニークな値としてカウントされた場合、表記ゆれを特定できます。

  • 前処理の計画: 頻度が低い(レアな)カテゴリ値の処理方法を検討したり、高すぎる頻度の値に注意を払ったりする際に役立ちます。

  • 基礎統計量の把握: データの分布やパターンを理解するための第一歩となります。


 

ユニークな要素の数をカウントする

 

あるSeries(DataFrameの列)に、重複を除いていくつの異なる値が存在するかをカウントします。

 

nunique()メソッドを使う

 

nunique()メソッドは、Series(またはDataFrameの列)に含まれるユニークな要素の数を返します。欠損値(NaN)はデフォルトでカウントから除外されます。

Python
 
import pandas as pd
import numpy as np

# サンプルDataFrameの作成
df = pd.DataFrame({
    '商品カテゴリ': ['家電', '食品', '家電', '書籍', '食品', '家電'],
    '地域': ['東京', '大阪', '東京', '福岡', np.nan, '大阪'], # NaNを含む
    '評価点': [5, 4, 5, 3, 4, 5]
})
print("オリジナルDataFrame:\n", df)

# '商品カテゴリ'列のユニークな要素の数をカウント
unique_categories = df['商品カテゴリ'].nunique()
print(f"\n'商品カテゴリ'のユニークな数: {unique_categories}")

# '地域'列のユニークな要素の数をカウント(NaNはデフォルトで除外)
unique_regions = df['地域'].nunique()
print(f"'地域'のユニークな数 (NaN除外): {unique_regions}")

# NaNを含めてユニークな数をカウント
unique_regions_with_nan = df['地域'].nunique(dropna=False)
print(f"'地域'のユニークな数 (NaN含む): {unique_regions_with_nan}")

解説:

  • df['商品カテゴリ'].nunique(): '家電', '食品', '書籍'の3種類がユニークな要素としてカウントされます。

  • dropna=False: nunique()の引数でdropna=Falseを指定すると、np.nanも1つのユニークな要素としてカウントされます。


 

各要素の頻度(出現回数)をカウントする

 

各ユニークな要素がデータセット(Series)の中で何回出現するかをカウントします。

 

value_counts()メソッドを使う

 

value_counts()メソッドは、Seriesに含まれる各ユニークな要素の出現回数をカウントし、降順でSeriesとして返します。

Python
 
# '商品カテゴリ'列の各要素の出現回数をカウント
category_counts = df['商品カテゴリ'].value_counts()
print(f"\n'商品カテゴリ'の出現回数:\n{category_counts}")

# '地域'列の各要素の出現回数をカウント(NaNはデフォルトで除外)
region_counts = df['地域'].value_counts()
print(f"\n'地域'の出現回数 (NaN除外):\n{region_counts}")

# NaNを含めて出現回数をカウント
region_counts_with_nan = df['地域'].value_counts(dropna=False)
print(f"\n'地域'の出現回数 (NaN含む):\n{region_counts_with_nan}")

解説:

  • df['商品カテゴリ'].value_counts(): '家電'が3回、'食品'が2回、'書籍'が1回出現していることがわかります。結果はSeriesとして返され、インデックスがユニークな要素、値がその出現回数となります。

  • value_counts()dropna=Falseを指定することで、np.nanの出現回数もカウントできます。

 

相対頻度(割合)を計算する

 

normalize=True引数をvalue_counts()に渡すと、出現回数ではなく、全体のデータに対する割合(相対頻度)を計算できます。

Python
 
# '商品カテゴリ'列の相対頻度を計算
category_proportions = df['商品カテゴリ'].value_counts(normalize=True)
print(f"\n'商品カテゴリ'の相対頻度:\n{category_proportions}")

解説:

各カテゴリが全体のデータに対してどれくらいの割合を占めるかがわかります。


 

複数の列にまたがるユニークな組み合わせと頻度

 

複数の列の組み合わせでユニークなパターンやその頻度をカウントすることも可能です。

 

groupby()size()を使う

 

複数の列のユニークな組み合わせの頻度をカウントしたい場合、groupby()メソッドでこれらの列を指定し、size()メソッドでグループごとの要素数を数えます。

Python
 
# '商品カテゴリ'と'地域'の組み合わせの出現回数をカウント
combination_counts = df.groupby(['商品カテゴリ', '地域']).size()
print(f"\n'商品カテゴリ'と'地域'の組み合わせの出現回数:\n{combination_counts}")

解説:

groupby([‘商品カテゴリ’, ‘地域’])で、指定した2つの列のユニークな組み合わせごとにグループ化し、.size()で各グループの行数(出現回数)をカウントしています。結果はMultiIndexのSeriesとして返されます。

 

drop_duplicates()shape[0]を使う

 

特定の列(または全ての列)のユニークな組み合わせの数を数えるだけであれば、drop_duplicates()shape[0]を組み合わせる方法もあります。

Python
 
# '商品カテゴリ'と'地域'のユニークな組み合わせの数をカウント
unique_combinations_count = df[['商品カテゴリ', '地域']].drop_duplicates().shape[0]
print(f"\n'商品カテゴリ'と'地域'のユニークな組み合わせの数: {unique_combinations_count}")

解説:

df[[‘商品カテゴリ’, ‘地域’]].drop_duplicates()で、指定した列の組み合わせが重複しない行のみを残します。その後、.shape[0]で残った行数(ユニークな組み合わせの数)を取得します。


 

まとめ

 

Pandasのnunique()value_counts()メソッドは、データセットのユニークな要素の数や頻度を効率的に把握するための非常に強力なツールです。nunique()でデータの多様性を、value_counts()で各要素の分布を確認できます。さらに、groupby()drop_duplicates()を組み合わせることで、複数の列にまたがるユニークなパターンやその頻度も分析できます。これらの機能を使いこなして、データ探索の精度と効率を向上させ、より深い洞察を得ましょう。