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]
集計統計の計算方法#
統計の集計#
タイタニック号の乗客の平均年齢は?
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"]]
。次に、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
注記
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操作に関するページに記載されています。