In [1]: import pandas as pd
- タイタニック号のデータ
このチュートリアルでは、CSV として保存されているタイタニック号のデータセットを使用します。データは次のデータ列で構成されています。
PassengerId: 各乗客のID。
Survived: 乗客が生存したかどうかを示す。生存した場合は
0、生存しなかった場合は1。Pclass: 3つのチケットクラスのうちの1つ: Class
1、Class2、Class3。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]
要約統計量の計算方法#
統計量の集計#
タイタニック号の乗客の平均年齢は?
In [4]: titanic["Age"].mean() Out[4]: 29.69911764705882
さまざまな統計量が利用可能で、数値データのある列に適用できます。通常、操作は欠損データを除外し、デフォルトでは行全体にわたって実行されます。
タイタニック号の乗客の年齢の中央値とチケット運賃の中央値は?
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
記述統計量の詳細については、記述統計量に関するユーザーガイドセクションを参照してください。
カテゴリ別にグループ化された統計量の集計#
タイタニック号の男性乗客と女性乗客の平均年齢は?
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
注
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 操作に関するユーザーガイドセクションに記載されています。
カテゴリごとのレコード数のカウント#
各客室クラスの乗客数は?
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
注
size と count は両方とも groupby と組み合わせて使用できます。size は NaN 値を含み、行数(テーブルのサイズ)のみを提供しますが、count は欠損値を除外します。value_counts メソッドでは、dropna 引数を使用して NaN 値を含めるか除外するかを設定します。
ユーザーガイドには value_counts に関する専用のセクションがあり、離散化に関するページを参照してください。
覚えておいてください
集計統計量は、列全体または行全体で計算できます。
groupbyは _split-apply-combine_ パターンの力を提供します。value_countsは、変数の各カテゴリのエントリ数をカウントする便利なショートカットです。
split-apply-combine アプローチの完全な説明は、groupby 操作に関するユーザーガイドページに記載されています。