Pythonでデータフレームの行・列ごとの平均絶対偏差(MAD)を求める方法
解決策
データフレームが与えられ、その行および列の平均絶対偏差(MAD: Mean Absolute Deviation)を求めたいとします。平均絶対偏差とは、各データ点と平均値との差の絶対値を取ったものの平均であり、データのばらつき具合を測る指標の一つです。
期待される出力は次のとおりです。
mad of columns: Column1 0.938776 Column2 0.600000 dtype: float64 mad of rows: 0 0.500 1 0.900 2 0.650 3 0.900 4 0.750 5 0.575 6 1.325 dtype: float64
この問題を解くには、以下の手順に従います。
- pandasを使ってデータフレームを定義する
- 列ごとの平均絶対偏差は
df.mad()で計算する - 行ごとの平均絶対偏差は
df.mad(axis=1)で計算する
例
それでは、実際のコードを見ながら理解を深めましょう。
import pandas as pd
data = {"Column1": [6, 5.3, 5.9, 7.8, 7.6, 7.45, 7.75],
"Column2": [7, 7.1, 7.2, 6, 6.1, 6.3, 5.1]}
df = pd.DataFrame(data)
print("DataFrame is:\n", df)
print("mad of columns:\n", df.mad())
print("mad of rows:\n", df.mad(axis=1))
出力
DataFrame is: Column1 Column2 0 6.00 7.0 1 5.30 7.1 2 5.90 7.2 3 7.80 6.0 4 7.60 6.1 5 7.45 6.3 6 7.75 5.1 mad of columns: Column1 0.938776 Column2 0.600000 dtype: float64 mad of rows: 0 0.500 1 0.900 2 0.650 3 0.900 4 0.750 5 0.575 6 1.325 dtype: float64
補足:pandas 2.0以降の環境について
DataFrame.mad() メソッドはpandas 1.5.0で非推奨となり、pandas 2.0で削除されました。最新の環境では、代わりに以下のように「平均との差の絶対値の平均」を直接計算すると同じ結果が得られます。
# 列ごとのMAD (df - df.mean()).abs().mean() # 行ごとのMAD df.sub(df.mean(axis=1), axis=0).abs().mean(axis=1)
この方法なら、どのバージョンのpandasでも一貫して平均絶対偏差を求めることができます。
-
Pythonで2次元累積和(接頭辞和)行列を求める方法:各要素が左上領域の合計になる行列の作り方
問題の概要 ある行列が与えられたとき、同じサイズを持つ新しい行列 res を求めることを考えます。この新しい行列の各要素は、次のように定義されます。 res[i][j] = 元の行列における matrix[r][c] の合計(ただし r ≤ i かつ c ≤ j を満たすすべての要素) つまり、各位置 (i, j) には「その位置から見て左上側にあるすべての要素の合計」が入ります。これはいわゆる2次元累積和(Prefix Sum)と呼ばれる手法で、画像処理や動的計画法など、さまざまな分野で活用される重要なテクニックです。 入力例 82 74 出力例 810 1521 例えば
-
Pythonのグラフでクリティカルエッジと疑似クリティカルエッジを見つける方法
問題の概要 頂点 0 から n − 1 までの番号が付いた n 個の頂点を持つ無向グラフが与えられ、各辺には重みが設定されているものとします。このグラフをもとに、最小全域木(MST)に含まれる「クリティカルエッジ」と「疑似クリティカルエッジ」を特定します。 クリティカルエッジとは、その辺を削除すると MST の総重みが増加してしまう辺のことです。一方、疑似クリティカルエッジとは、すべての MST に必ず含まれるわけではないものの、何らかの MST には現れ得る辺のことです。ここでは、入力として与えられたグラフに対して、該当する辺のインデックスを求めます。 たとえば、次のようなグラフが入力とし