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

    • PassengerId:各乗客のID。

    • Survived:乗客の生存状況を示します。0は生存、1は死亡。

    • Pclass:3つのチケットクラスのいずれか:クラス1、クラス2、クラス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"]]。次に、groupby()メソッドをSex列に適用して、カテゴリごとにグループを作成します。各性別の平均年齢が計算され、返されます。

特定の統計(例:mean年齢)を列の各カテゴリ(例:Sex列の男性/女性)で計算することは一般的なパターンです。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操作に関するページに記載されています。