In [1]: import pandas as pd
このチュートリアルで使用するデータ
  • このチュートリアルでは、CSV として保存されているタイタニック号のデータセットを使用します。データは次のデータ列で構成されています。

    • PassengerId: 各乗客のID。

    • Survived: 乗客が生存したかどうかを示す。生存した場合は 0、生存しなかった場合は 1

    • Pclass: 3つのチケットクラスのうちの1つ: Class 1、Class 2、Class 3

    • Name: 乗客の名前。

    • Sex: 乗客の性別。

    • Age: 乗客の年齢 (年単位)。

    • SibSp: 乗船していた兄弟姉妹または配偶者の数。

    • Parch: 乗船していた両親または子供の数。

    • Ticket: 乗客のチケット番号。

    • Fare: 運賃を示す。

    • Cabin: 乗客の客室番号。

    • Embarked: 乗船港。

    生データへ
    In [2]: titanic = pd.read_csv("data/titanic.csv")
    
    In [3]: titanic.head()
    Out[3]: 
       PassengerId  Survived  Pclass  ...     Fare Cabin  Embarked
    0            1         0       3  ...   7.2500   NaN         S
    1            2         1       1  ...  71.2833   C85         C
    2            3         1       3  ...   7.9250   NaN         S
    3            4         1       1  ...  53.1000  C123         S
    4            5         0       3  ...   8.0500   NaN         S
    
    [5 rows x 12 columns]
    

要約統計量の計算方法#

統計量の集計#

../../_images/06_aggregate.svg
  • タイタニック号の乗客の平均年齢は?

    In [4]: titanic["Age"].mean()
    Out[4]: 29.69911764705882
    

さまざまな統計量が利用可能で、数値データのある列に適用できます。通常、操作は欠損データを除外し、デフォルトでは行全体にわたって実行されます。

../../_images/06_reduction.svg
  • タイタニック号の乗客の年齢の中央値とチケット運賃の中央値は?

    In [5]: titanic[["Age", "Fare"]].median()
    Out[5]: 
    Age     28.0000
    Fare    14.4542
    dtype: float64
    

    DataFrame の複数の列に適用される統計量(2つの列の選択はDataFrame を返します。 データのサブセットチュートリアルを参照)は、各数値列に対して計算されます。

集計統計量は複数の列に対して同時に計算できます。最初のチュートリアルで説明したdescribe関数を覚えていますか?

In [6]: titanic[["Age", "Fare"]].describe()
Out[6]: 
              Age        Fare
count  714.000000  891.000000
mean    29.699118   32.204208
std     14.526497   49.693429
min      0.420000    0.000000
25%     20.125000    7.910400
50%     28.000000   14.454200
75%     38.000000   31.000000
max     80.000000  512.329200

事前に定義された統計量ではなく、特定の列の集計統計量の特定の組み合わせは、DataFrame.agg() メソッドを使用して定義できます。

In [7]: titanic.agg(
   ...:     {
   ...:         "Age": ["min", "max", "median", "skew"],
   ...:         "Fare": ["min", "max", "median", "mean"],
   ...:     }
   ...: )
   ...: 
Out[7]: 
              Age        Fare
min      0.420000    0.000000
max     80.000000  512.329200
median  28.000000   14.454200
skew     0.389108         NaN
mean          NaN   32.204208
ユーザーガイドへ

記述統計量の詳細については、記述統計量に関するユーザーガイドセクションを参照してください。

カテゴリ別にグループ化された統計量の集計#

../../_images/06_groupby.svg
  • タイタニック号の男性乗客と女性乗客の平均年齢は?

    In [8]: titanic[["Sex", "Age"]].groupby("Sex").mean()
    Out[8]: 
                  Age
    Sex              
    female  27.915709
    male    30.726645
    

    関心があるのは各性別の平均年齢であるため、まずこれら2つの列のサブセレクションtitanic[["Sex", "Age"]] を行います。次に、Sex 列にgroupby() メソッドを適用して、カテゴリごとにグループを作成します。 _各性別の_平均年齢が計算され、返されます。

_列の各カテゴリ_(例:Sex 列の男性/女性)に対する特定の統計量(例:mean 年齢)の計算は一般的なパターンです。groupby メソッドは、この種の操作をサポートするために使用されます。これは、より一般的なsplit-apply-combine パターンに当てはまります。

  • データをグループに分割する

  • 各グループに独立して関数を適用する

  • 結果をデータ構造に結合する

適用と結合のステップは、通常pandasで一緒に行われます。

前の例では、最初に2つの列を明示的に選択しました。そうしないと、numeric_only=True を渡すことで、数値列を含む各列にmean メソッドが適用されます。

In [9]: titanic.groupby("Sex").mean(numeric_only=True)
Out[9]: 
        PassengerId  Survived    Pclass  ...     SibSp     Parch       Fare
Sex                                      ...                               
female   431.028662  0.742038  2.159236  ...  0.694268  0.649682  44.479818
male     454.147314  0.188908  2.389948  ...  0.429809  0.235702  25.523893

[2 rows x 7 columns]

Pclass の平均値を取得してもあまり意味がありません。各性別の平均年齢にのみ関心がある場合は、グループ化されたデータに対しても列の選択(通常通り角括弧[])がサポートされます。

In [10]: titanic.groupby("Sex")["Age"].mean()
Out[10]: 
Sex
female    27.915709
male      30.726645
Name: Age, dtype: float64
../../_images/06_groupby_select_detail.svg

Pclass 列には数値データが含まれていますが、実際にはそれぞれ「1」、「2」、「3」というラベルを持つ3つのカテゴリ(または因子)を表しています。これらの統計量を計算してもあまり意味がありません。そのため、pandasはこの種のデータを処理するためのCategorical データ型を提供しています。詳細については、ユーザーガイドのカテゴリカルデータセクションを参照してください。

  • 性別と客室クラスの組み合わせごとのチケット運賃の平均価格は?

    In [11]: titanic.groupby(["Sex", "Pclass"])["Fare"].mean()
    Out[11]: 
    Sex     Pclass
    female  1         106.125798
            2          21.970121
            3          16.118810
    male    1          67.226127
            2          19.741782
            3          12.661633
    Name: Fare, dtype: float64
    

    複数の列で同時にグループ化できます。groupby() メソッドに列名をリストとして指定します。

ユーザーガイドへ

split-apply-combine アプローチの完全な説明は、groupby 操作に関するユーザーガイドセクションに記載されています。

カテゴリごとのレコード数のカウント#

../../_images/06_valuecounts.svg
  • 各客室クラスの乗客数は?

    In [12]: titanic["Pclass"].value_counts()
    Out[12]: 
    Pclass
    3    491
    1    216
    2    184
    Name: count, dtype: int64
    

    value_counts() メソッドは、列内の各カテゴリのレコード数をカウントします。

この関数は、実際には各グループ内のレコード数のカウントと組み合わせたgroupby操作であるため、ショートカットです。

In [13]: titanic.groupby("Pclass")["Pclass"].count()
Out[13]: 
Pclass
1    216
2    184
3    491
Name: Pclass, dtype: int64

sizecount は両方とも groupby と組み合わせて使用できます。sizeNaN 値を含み、行数(テーブルのサイズ)のみを提供しますが、count は欠損値を除外します。value_counts メソッドでは、dropna 引数を使用して NaN 値を含めるか除外するかを設定します。

ユーザーガイドへ

ユーザーガイドには value_counts に関する専用のセクションがあり、離散化に関するページを参照してください。

覚えておいてください

  • 集計統計量は、列全体または行全体で計算できます。

  • groupby は _split-apply-combine_ パターンの力を提供します。

  • value_counts は、変数の各カテゴリのエントリ数をカウントする便利なショートカットです。

ユーザーガイドへ

split-apply-combine アプローチの完全な説明は、groupby 操作に関するユーザーガイドページに記載されています。