データの集約と要約統計量
pandas の Series や DataFrame には列について合計や平均、標準偏差などを求める 集約メソッド が用意されています。以下のコードで太陽系の惑星一覧表を取得して DataFrame を作成します (planets.csv は Wikipedia から得たデータを元に作成しました)。
# PANDAS_AGGREGATION_METHODS
# In[1]
import numpy as np
import pandas as pd
# ファイルのパス
u = "https://python.atelierkobato.com/wp-content/uploads/2019/07/planets.csv"
# CSVファイルを読み込んでデータフレームに変換
# 最初の行を列ラベル、左の列を行ラベルに設定
planets = pd.read_csv(u, encoding="SHIFT-JIS",
header=0, index_col="惑星")
print(planets)
出力する表はこのサイトのページ幅に収まらないので、実行結果の掲載は割愛します。drop()メソッドを使って、いくつかの項目を削除しておきます。
# In[2]
# 削除する項目のリスト
drop_list = ["軌道傾斜角", "軌道離心率",
"表面重力", "自転周期", "衛星数"]
# リストにある項目をすべて削除
planets = planets.drop(drop_list, axis=1)
print(planets)
'''
半径 質量 軌道長半径 公転周期
惑星
水星 2440 0.06 0.387 0.241
金星 6052 0.82 0.723 0.615
地球 6378 1.00 1.000 1.000
火星 3396 0.11 1.524 1.881
木星 71492 318.26 5.204 11.862
土星 60268 95.14 9.582 29.457
天王星 25559 14.54 19.201 84.011
海王星 24764 17.09 30.047 164.790
'''
これで準備が整いました。いくつかの集約メソッドを試してみましょう。
たとえば、mean()メソッドは列ごとに平均値を計算します。
# In[3]
# 列ごとに平均値を計算
p_mean = planets.mean()
print(p_mean)
# 半径 25043.625000
# 質量 55.877500
# 軌道長半径 8.458500
# 公転周期 36.732125
# dtype: float64
min()メソッドは列ごとに最小値を抽出します。
# In[4]
# 列ごとに最小値を抽出
p_min = planets.min()
print(p_min)
# 半径 2440
# 質量 0.06
# 軌道長半径 0.387
# 公転周期 0.241
# dtype: object
cumsum()メソッドは列ごとに累積和を計算します。これによって、内惑星 (水星、金星、地球、火星) の質量の和などを知ることができます。
# In[5]
# 列ごとに累積和を計算
p_cs = planets.cumsum()
print(p_cs)
'''
半径 質量 軌道長半径 公転周期
惑星
水星 2440.0 0.06 0.387 0.241
金星 8492.0 0.88 1.110 0.856
地球 14870.0 1.88 2.110 1.856
火星 18266.0 1.99 3.634 3.737
木星 89758.0 320.25 8.838 15.599
土星 150026.0 415.39 18.420 45.056
天王星 175585.0 429.93 37.621 129.067
海王星 200349.0 447.02 67.668 293.857
'''
idxmax()メソッドは列ごとに最大値のインデクス (行ラベル) を取得します。
これを使って、最大質量をもつ惑星や公転周期が最も長い惑星などを検索できます。
# In[6]
# 最大値の行ラベルを参照
p_imax = planets.idxmax()
print(p_imax)
# 半径 木星
# 質量 木星
# 軌道長半径 海王星
# 公転周期 海王星
# dtype: object
pandas の代表的な集約メソッドをまとめておきます。
集約メソッド | 説明 |
---|---|
sum() | 総和 |
cumsum() | 累積和 |
min() | 最小値 |
max() | 最大値 |
idxmin() | 最小値のラベル |
idxmax() | 最大値のラベル |
mean() | 平均値 |
median() | 中央値 |
std() | 標準偏差 |
var() | 分散 |
mad() | 平均絶対偏差 |
diff() | 差分 |
pandas.DataFrame.describe
DataFrame の describe() メソッドを使うと、列ごとにデータ数 (count), 平均値 (mean), 標準偏差 (std), 最小値 (min), 最大値 (max) などの統計データをまとめて取得できます。
# In[7]
# すべての項目について要約統計量を取得
p_dsb = planets.describe()
print(p_dsb)
'''
半径 質量 軌道長半径 公転周期
count 8.000000 8.000000 8.000000 8.000000
mean 25043.625000 55.877500 8.458500 36.732125
std 26958.123196 110.755751 10.836593 59.079845
min 2440.000000 0.060000 0.387000 0.241000
25% 5388.000000 0.642500 0.930750 0.903750
50% 15571.000000 7.770000 3.364000 6.871500
75% 34236.250000 36.602500 11.986750 43.095500
max 71492.000000 318.260000 30.047000 164.790000
'''
50% は中央値 (median), 25% と 75% はそれぞれ 1/4分位数、3/4分位数です。
【ChatGPT講義】pandasのdescribeメソッド
ユーザー: pandasのdescribeメソッドについて教えてください。
AI:はい、もちろんです!pandasのdescribeメソッドは、データフレームやシリーズの要約統計情報を提供するための便利なメソッドです。データの基本的な統計的な特徴を一括で取得することができます。
ユーザー:それは便利そうですね。どのように使用すればいいですか?
AI:describeメソッドは、データフレームやシリーズオブジェクトに対して直接呼び出すことができます。例えば、df.describe()とすると、データフレームdfの各数値列に対して統計情報が計算されます。
ユーザー: 統計情報とは具体的に何が含まれるのでしょうか?
AI: describeメソッドは、データの中央値、平均値、標準偏差、最小値、最大値などの統計情報を提供します。また、25パーセンタイル、50パーセンタイル(中央値)、75パーセンタイルなどのパーセンタイル情報も含まれます。
ユーザー:なるほど、具体的な使い方を教えてください。
AI:もちろんです!以下の例を使って具体的な使い方を示します。まず、以下のようなデータフレームdfがあるとします。
このデータフレームに対して、df.describe()を実行すると、次のような結果が得られます。
この結果から、各列のカウント数、平均値、標準偏差、最小値、最大値、パーセンタイルなどがわかります。