数学や統計学において、円平均または角度平均とは、角度や、時刻、実数の小数部分など、同様の周期的な量に対して設計された平均のことです。
これは、角度のような量には、通常の方法のほとんどが適切でない可能性があるため必要です。たとえば、 0°と360°の算術平均は180°ですが、360°は完全なサイクルを法として0°に等しいため、これは誤解を招きます。[ 1 ]別の例として、午後11時から午前1時までの「平均時間」は、2つの時間が1つの夜の一部であるか、1つの暦日の一部であるかに応じて、真夜中または正午になります。
円形平均は、方向統計と非ユークリッド空間の統計の最も単純な例の 1 つです。この計算では算術平均とは異なる結果が得られ、角度が広く分布しているほどその差は大きくなります。たとえば、3 つの角度 0°、0°、90° の算術平均は (0° + 0° + 90°) / 3 = 30° ですが、ベクトル平均は arctan(1/2) = 26.565° です。さらに、算術平均では、円形分散は ±180° の範囲でのみ定義されます。
角度の場合、算術平均は必ずしも適切ではないため、角度の平均値と分散の両方を求めるには、次の方法を使用できます。
すべての角度を単位円上の対応する点に変換します。例:につまり、極座標をデカルト座標に変換します。次に、これらの点の算術平均を計算します。結果として得られる点は単位円盤内にありますが、一般的には単位円上にはありません。その点を極座標に戻します。角度は入力角度の妥当な平均です。すべての角度が等しい場合、結果として得られる半径は 1 になります。角度が円上に均等に分布している場合、結果として得られる半径は 0 になり、円平均は存在しません。(実際には、円上で連続平均演算を定義することは不可能です。)言い換えれば、半径は角度の集中度を表します。
角度を考慮すると逆正接関数のatan2変種を用いた平均値の一般的な公式は次のとおりです。

複素数を用いて同様の定義を定式化することもできる。
上記の導出を点の算術平均を用いて一致させるには、合計をで割る必要がある。ただし、スケーリングは重要ではありません。そしてしたがって、省略できる。
方向データは実際には単位長のベクトルであると認識すれば、これはより簡潔に表現できるだろう。一次元データの場合、これらのデータ点は単位大きさの複素数として都合よく表現できる。、 どこは測定された角度です。サンプルの平均合成ベクトルは次のようになります。
標本平均角度は、平均合成角の偏角となる。
標本平均合成ベクトルの長さは次のとおりです。
そして、その値は0から1の間になります。したがって、標本平均の結果ベクトルは次のように表すことができます。
同様の計算は、円形分散を定義するためにも使用されます。
円形平均、
一連の角度([0°, 360°]の範囲)の平均を計算する簡単な方法は、各角度のコサインとサインの平均を計算し、逆正接を計算することで角度を得ることです。例として、10度、20度、30度の3つの角度を考えてみましょう。直感的には、平均を計算するには、これら3つの角度を足し合わせて3で割る必要があり、この場合、正しい平均角度である20度が得られます。このシステムを反時計回りに15度回転させると、3つの角度は355度、5度、15度になります。算術平均は125度になりますが、これは間違った答えで、5度であるべきです。ベクトル平均平均正弦波を用いて、以下のように計算できます。平均コサイン:
// 結果として得られる角度が負の場合は、360 を加算して標準範囲 0 ~ 360 にします。例: if result < 0 then result := result + 360;
このPythonコードでは、日中の時間を使用して、それらの円平均を求めます。
import mathdef circular_mean ( hours : list [ int ]) -> float : """時間をラジアンに変換""" # 時間を度数に変換するには、 # 時間を 360/24 = 15 で乗算する必要があります。 radians = [ math . radians ( hour * 15 ) for hour in hours ]# sin と cos の値の合計を計算しますsin_sum = sum ([ math . sin ( rad ) for rad in radians ]) cos_sum = sum ([ math . cos ( rad ) for rad in radians ])# arctan2 を使用して円形の平均を計算しますmean_rad = math . atan2 ( sin_sum , cos_sum )# 平均値を時間単位に変換するmean_hour = ( math . degrees ( mean_rad ) / 15 ) % 24平均時間を返す# 使用例: hours = [ 0 , 12 , 18 ] mean_hour = circular_mean ( hours ) print ( "最初の円形平均: " , round ( mean_hour , 2 ))hours = [ 0 , 12 ] mean_hour = circular_mean ( hours ) print ( "2 番目の円形平均: " , round ( mean_hour , 2 ))hours = [ 0 , 0 , 12 , 12 , 24 ] mean_hour = circular_mean ( hours ) print ( "3 番目の円形平均: " , round ( mean_hour , 2 ))上記の機能は、SciPyのcircmean関数によって既に実装されていることに注意してください。