Pandas pd.value_counts() 関数

Pandas 通用函数Pandas よく使う関数


pd.value_counts()Pandasライブラリで使用される各値の出現頻度を集計する関数です。配列内の各一意な値の出現回数を計算し、頻度の降順で返します。

これはカテゴリデータ分析で最もよく使われる関数の1つで、データの分布状況をすばやく把握できます。例えば、投票結果や製品カテゴリの分布などを集計できます。

単語の意味: value_counts「値を集計する」という意味で、各値の出現回数を数えます。


基本構文とパラメータ

pd.value_counts()Pandasライブラリのトップレベル関数で、各一意な値の頻度を計算します。

構文形式

pd.value_counts(values, sort=True, ascending=False, normalize=False, bins=None, dropna=True)

パラメータの説明

  • パラメータ: values
    • 型: Series、配列類似オブジェクト。
    • 説明: 頻度を集計するデータ。通常はSeriesです。
  • パラメータ: sort
    • 型: ブール値。
    • 頻度で並べ替えるかどうか。デフォルトはTrue(頻度の降順)。
  • パラメータ: ascending
    • 型: ブール値。
    • もしTrueの場合は頻度の昇順で並べ替え、もしFalse(デフォルト)の場合は頻度の降順で並べ替えます。
  • パラメータ: normalize
    • 型: ブール値。
    • もしTrueの場合は、絶対頻度ではなく各値の出現割合(0から1の間)を返します。デフォルトはFalse。
  • パラメータ: bins
    • 型: 整数またはNone。
    • 整数を指定すると、数値データをビンに分割して頻度を集計します(ヒストグラムに似ています)。カテゴリデータには適用できません。
  • パラメータ: dropna
    • 型: ブール値。
    • NaNを統計結果に含めるかどうか。デフォルトはTrue(含めない)。
  • 関数の説明

    • 戻り値: 一意な値をインデックスとし、頻度(または割合)を値とするSeriesを返します。
    • 効果: 各一意な値の出現回数を集計して表示します。

    例

    簡単なものから複雑なものまでの一連の例を通して、完全に習得しましょうpd.value_counts()の使い方を。

    例1:基本的な使い方 - カテゴリデータの頻度を集計する

    例

    import pandas as pd
    import numpy as np

    # 1. 重複する値を持つSeriesを作成
    colors = pd.Series(['red', 'blue', 'green', 'red', 'blue', 'yellow', 'red', 'blue', 'blue'])

    print("=== 元のSeries ===")
    print(colors)

    # 2. pd.value_counts() を使って頻度を集計
    result = pd.value_counts(colors)
    print("\n=== pd.value_counts() による頻度集計 ===")
    print(result)

    実行結果の想定:

    === 原始 Series ===
    0       red
    1      blue
    2     green
    3       red
    4     blue
    5     yellow
    6       red
    7      blue
    8       blue
    dtype: object
    
    === pd.value_counts() 频次统计 ===
    blue      4
    red       3
    green     1
    yellow    1
    dtype: int64
    

    コードの解説:

    1. 結果は頻度の降順で並び、blueが最も多く(4回)、redが次に多く(3回)、greenとyellowがそれぞれ1回です。
    2. 返されるのはSeriesで、インデックスは色の値、値は出現回数です。

    例2:normalizeパラメータを使用して割合を計算する

    normalize=True頻度を割合に変換して、データの相対的な分布を確認しやすくします。

    例

    import pandas as pd
    import numpy as np

    # 投票データを作成
    votes = pd.Series(['A', 'B', 'A', 'C', 'A', 'B', 'A', 'A', 'C', 'B', 'A', 'B'])

    print("=== 投票データ ===")
    print(votes)

    # 1. 絶対頻度
    print("\n=== 絶対頻度 ===")
    print(pd.value_counts(votes))

    # 2. 相対割合(normalize=True)
    print("\n=== 相対割合 ===")
    result_normalized = pd.value_counts(votes, normalize=True)
    print(result_normalized)
    print(f"\n割合の合計: {result_normalized.sum():.2f}")

    # 3. 昇順に並べ替え
    print("\n=== 昇順の並べ替え ===")
    print(pd.value_counts(votes, ascending=True))

    実行結果の想定:

    === 投票数据 ===
    0        A
    1        B
    2        A
    3        C
    4        A
    5        B
    值 'A' 出现 6 次,占 50%
    值 'B' 出现 4 次,约 33.3%
    值 'C' 出现 2 次,约 16.7%
    
    === 相对比例 ===
    A    0.500000
    B    0.333333
    C    0.166667
    dtype: float64
    
    === 升序排列 ===
    C    2
    B    4
    A    6
    dtype: int64
    

    コードの解説:

    • を使用するとnormalize=True各カテゴリの割合をすばやく計算できます。
    • すべての割合を合計すると1.0になり、割合の分析に便利です。
    • を使用するとascending=True頻度の昇順で結果を確認できます。

    例3:数値データの処理とbinsパラメータの使用

    連続する数値には、binsパラメータを使用してビン分割集計ができます。

    例

    import pandas as pd
    import numpy as np

    # 1. 数値データを作成
    scores = pd.Series([85, 90, 78, 92, 88, 76, 95, 82, 70, 89, 91, 77, 84, 86])

    print("=== 学生の成績 ===")
    print(scores)

    # 2. ビン分割なし - 各一意な値を集計
    print("\n=== 各得点の集計 ===")
    print(pd.value_counts(scores))

    # 3. binsパラメータでビン分割
    print("\n=== 4つのビンに分割 ===")
    result_bins = pd.value_counts(scores, bins=4)
    print(result_bins)

    # 4. ビンの境界を確認
    print("\n=== ビンの境界 ===")
    print(f"最小値: {scores.min()}, 最大値: {scores.max()}")

    実行結果の想定:

    === 学生成绩 ===
    [85, 90, 78, 92, 88, 76, 95, 82, 70, 89, 91, 77, 84, 86]
    
    === 统计每个分数 ===
    85    2
    90    1
    78    1
    92    1
    88    1
    76    1
    95    1
    82    1
    70    1
    89    1
    91    1
    77    1
    84    1
    86    1
    Name: count, dtype: int64
    
    === 分成 4 个箱 ===
      result_bins = pd.value_counts(scores, bins=4)
    (88.75, 95.0]                 5
    (82.5, 88.75]                 4
    (76.25, 82.5]                 3
    (69.97399999999999, 76.25]    2
    Name: count, dtype: int64
    
    === 分箱边界 ===
    最小值: 70, 最大值: 95
    

    これはヒストグラムに似ており、成績の分布が中高得点帯に集中していることがわかります。binsパラメータは数値データを範囲ごとに離散的なビンに分割し、各ビン内のデータ量を集計します。

    例4:欠損値の処理

    を使用するとdropnaパラメータで欠損値を集計するかどうかを制御できます。

    例

    import pandas as pd
    import numpy as np

    # 1. 欠損値を含むデータ
    data = pd.Series(['a', 'b', np.nan, 'a', None, 'c', np.nan, 'b', 'a'])

    print("=== 欠損値を含むデータ ===")
    print(data)

    # 2. デフォルトではNaNを含めない(dropna=True)
    print("\n=== デフォルトではNaNを含めない ===")
    print(pd.value_counts(data))

    # 3. NaNを含める(dropna=False)
    print("\n=== NaNを含める ===")
    print(pd.value_counts(data, dropna=False))

    # 4. 数値型の欠損値を集計
    numeric_data = pd.Series([1, 2, np.nan, 3, 2, np.nan, 1, 4])
    print("\n=== 数値型データにNaNを含める ===")
    print(pd.value_counts(numeric_data, dropna=False))

    実行結果の想定:

    === 包含缺失值的数据 ===
    0       a
    1       b
    2     NaN
    3       a
    4    None
    5       c
    6     NaN
    7       b
    8       a
    dtype: object
    
    === 默认不包含 NaN ===
    a    3
    b    2
    c    1
    dtype: 64
    
    === 包含 NaN (dropna=False) ===
    a       3
    b       2
    NaN     2  # 2 个 NaN (2 个 np.nan)
    c       1
    dtype: int64
    
    === 数值型数据包含 NaN ===
    1.0    2
    2.0    2
    NaN    2  # 2 个 NaN
    3.0    1
    4.0    1
    dtype: int64
    

    コードの解説:

    • デフォルトでは(dropna=True)、NaN値は集計されません。
    • を使用するとdropna=False欠損値の数を確認できます。これはデータ品質分析に役立ちます。
    • 数値型データにも同様に適用できます。

    ヒント: pd.value_counts()は探索的データ分析において最も重要な関数の1つで、データの分布をすばやく把握できます。頻度を必要とせず一意な値のリストだけが必要な場合は、pd.unique()関数を使用してください。

    Pandas 常用函数Pandas よく使う関数

    その他の拡張