平均・分散・標準偏差・中央値・最頻値をPythonを使って表現します。
日常生活で平均を使う場面は多いですが、
データを解析する上では、分散や標準偏差の理解も大切となります。
本記事では、統計の基本である平均・分散・標準偏差について解説をします。
高校生の時に学んだという方も今一度確認しておくべき内容です。
- 平均
- 分散
- 標準偏差
- 中央値
- 最頻値
平均
平均は、数値の集合に対してその値を代表する指標の一つで、すべての数値を合計して、その合計値を集合の数で割った値のことを指します。一般に、数学記号で表すと以下のようになります。
$$ 平均 = \frac{数値の合計}{数値の個数} $$
例えば、{2, 4, 6, 8}という4つの数値がある場合、これらの数値の平均は、
$$ 平均 = \frac{2+4+6+8}{4} $$
となります。したがって、この集合の平均値は5となります。
Pythonで平均を表現
Pythonで平均を計算するには、組み込みの関数である sum() と len() を使って、数値のリストやタプルを合計し、個数で割ることができます。
sum() 関数は数値の合計を計算します。また、 len() 関数は数値の個数を取得しています。
最後に、計算結果を表示するために print() 関数を使用しています。
以下は、Pythonで平均を計算する方法の例です。
# リストの平均を計算する例
numbers = [2, 4, 6, 8]
average = sum(numbers) / len(numbers)
print("平均値:", average)
# タプルの平均を計算する例
numbers = (3, 5, 7, 9)
average = sum(numbers) / len(numbers)
print("平均値:", average)
また、NumPyは、多次元配列や行列の平均を計算するための numpy.mean() 関数が用意されています。
NumPyを使う場合は、以下のように記述することができます。
import numpy as np
# NumPyを使ったリストの平均を計算する例
numbers = [2, 4, 6, 8]
average = np.mean(numbers)
print("平均値:", average)
# NumPyを使ったタプルの平均を計算する例
numbers = (3, 5, 7, 9)
average = np.mean(numbers)
print("平均値:", average)
出力は次のようになります。(google colaboratory使用)
平均の注意点
平均は、手軽な計算でデータの特徴を簡単に表すことができます。
一方で、外れ値の影響を受けやすいです。例えば、100点満点のテストがあり、10人の平均を計算したところ平均点が50点でした。
しかし、各々の点数を確認すると、「scores1」は、50点付近の点数ですが、「scores2」は、90点、80点の高得点から、10点、20点の低得点とばらつきがあります。
特に、「scores3」は,0点5人、100点5人と極端な分布ですが、3つの平均点はいずれも50点です。
import numpy as np
scores1 = [48, 53, 55, 50, 44, 50, 50, 53, 52, 45]
scores2 = [93, 98, 32, 80, 10, 20, 0, 99, 28, 40]
scores3 = [100, 100, 100, 100, 100, 0, 0, 0, 0, 0]
average1=np.mean(scores1)
average2=np.mean(scores2)
average3=np.mean(scores3)
print("平均点1:", average1)
print("平均点2:", average2)
print("平均点3:", average3)
##########出力結果##########
#平均点1: 50.0
#平均点2: 50.0
#平均点3: 50.0
###########################
このように、平均は外れ値に影響されやすいので、使用には注意が必要です
分散
分散とは、データの散らばり具合を表す統計量の一つで、平均からの偏差の二乗平均を表します。具体的には、データの各要素から平均値を引いた差を二乗し、その平均を求めたものです。
値が平均からどの程度離れているかを示す指標として使用されます。
分散が大きいほど、データの散らばりが大きいといえます。
分散は以下の式で表されます。
$$\frac {1}{n}\sum_{i = 1}^n (x_i – \bar{x})^2 $$
\(n\)はデータの個数、\( x_i \)はデータの\(i\)番目の値、\(\bar{x} \)はデータの平均値を表します。
Pythonで分散を表現
Pythonで分散を計算するには、NumPyのnumpy.var()関数を使用します。
import numpy as np
data = [2, 4, 6, 8, 10]
variance = np.var(data)
print("分散:", variance)
dataリストにデータの値を格納し、np.var()関数を使用して分散を計算しています。
計算結果はvariance変数に格納され、print()関数を使用して表示されます。
前述した平均の問題は、外れ値に影響されやすいことでした。
データにばらつきがあるものの、全ての平均値が50であるため、正しい評価ができないことが問題でした。
しかし、分散は、データのばらつきの大きさを示すので、データの散らばりを数値化できます。
データが全て50の場合は分散が0で、ばらつきが大きくなるにつれて分散が大きくなっていることが分かります。
import numpy as np
scores0 = [50, 50, 50, 50, 50, 50, 50, 50, 50, 50]
scores1 = [48, 53, 55, 50, 44, 50, 50, 53, 52, 45]
scores2 = [93, 98, 32, 80, 10, 20, 0, 99, 28, 40]
scores3 = [100, 100, 100, 100, 100, 0, 0, 0, 0, 0]
variance0 = np.var(scores0)
variance1 = np.var(scores1)
variance2 = np.var(scores2)
variance3 = np.var(scores3)
print("分散0:", variance0)
print("分散1:", variance1)
print("分散2:", variance2)
print("分散3:", variance3)
##########出力結果##########
#分散0: 0.0
#分散1: 11.2
#分散2: 1336.2
#分散3: 2500.0
###########################
分散の注意点
分散も平均点と同様に外れ値によって値が変わり、影響を受けることがいえます。
また分、データのばらつきを二乗しているので、単位も二乗されています。
例えば、テストの分散の単位は「点」ではなく、「\(点^2\)」であるためデータの解釈が難しくなります。
したがって、この単位の違和感を解消に「標準偏差」を使用します。
標準偏差
標準偏差は、データセットのばらつきやばらつきの度合いを表す統計的な尺度で、データ点が平均値からどれだけ離れているかを示す指標です。
$$\sqrt{\frac {1}{n}\sum_{i = 1}^n (x_i – \bar{x})^2 }$$
\(n\)はデータの個数、\( x_i \)はデータの\(i\)番目の値、\(\bar{x} \)はデータの平均値を表します。
Pythonで標準偏差を表現
Pythonで標準偏差を計算するには、NumPyのnumpy.std()関数を使用します。
import numpy as np
data = [2, 4, 6, 8, 10]
standard_deviation = np.std(data)
print("標準偏差:", standard_deviation)
dataリストにデータの値を格納し、np.std()関数を使用して標準偏差を計算しています。計算結果はstandard_deviation変数に格納され、print()関数を使用して表示されます。
標準偏差は、データのばらつきの尺度として非常に一般的に使用されます。
分散と同様にデータの散らばり具合を表し、平均値に対する偏差の大きさを示します。
ただし、標準偏差は分散と異なり、元のデータと同じ単位を持つため、解釈が容易です。
前回の分散では、データの散らばりが0から2500と尺度の幅が大きかったです。それを平方根で単位を揃えたことで、データのばらつきに関して評価がしやすくなります。
import numpy as np
scores0 = [50, 50, 50, 50, 50, 50, 50, 50, 50, 50]
scores1 = [48, 53, 55, 50, 44, 50, 50, 53, 52, 45]
scores2 = [93, 98, 32, 80, 10, 20, 0, 99, 28, 40]
scores3 = [100, 100, 100, 100, 100, 0, 0, 0, 0, 0]
variance0 = np.var(scores0)
variance1 = np.var(scores1)
variance2 = np.var(scores2)
variance3 = np.var(scores3)
std_deviation0 = np.sqrt(variance0)
std_deviation1 = np.sqrt(variance1)
std_deviation2 = np.sqrt(variance2)
std_deviation3 = np.sqrt(variance3)
print("標準偏差0:", std_deviation0)
print("標準偏差1:", std_deviation1)
print("標準偏差2:", std_deviation2)
print("標準偏差3:", std_deviation3)
##########出力結果##########
#標準偏差0: 0.0
#標準偏差1: 3.3470980089691406
#標準偏差2: 36.54426863293218
#標準偏差3: 50.0
###########################
標準偏差の注意点
標準偏差も平均値、分散と同様に外れ値の影響が受けやすいです。
また、標準偏差は単位を揃えたものの、複数の単位を扱うことは適切な評価はできません。
例えば、「テストの点数は身長と体重は関係あるのか」と考えたときに、「点」、「kg」,「cm」と3つの単位を抱えて、標準偏差から評価することは正しいと言えません。
UdemyでPythonを学習
Udemyは、オンデマンド式の学習講座です。
趣味から実務まで使えるおすすめの講座を紹介します。
- 現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル
Pythonをインストールから環境設定、基本文法が学習
さらに暗号化、インフラ自動化、非同期処理についても学べます。
Pythonを基礎から応用まで学びたい人におすすめ
- みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習 【2024年最新版】
機械学習ライブラリで文字認識や株価分析などを行う。
人口知能やニューラルネットワーク、機械学習を学びたい人におすすめ。
- 【世界で55万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜
統計分析、機械学習の実装、ディープラーニングの実装を学習。
データサイエンティストになりたい人におすすめ。
- 0から始めるTkinterの使い方完全マスター講座〜Python×GUIの基礎・応用〜
TkinterのGUIを作成から発展的な操作までアプリ実例を示して学習。
アプリ開発したい人におすすめ。
最頻値
最頻値(モード)は、データセット内で最も頻繁に出現する値を指します。
最頻値は、データの集中度合いや多くの値がどこに集まっているかを示すのに有効です。
したがって、公式はないです。
Pythonで最頻値を表現
Pythonで最頻値を求めるには、scipyライブラリのstats.mode()関数を使用します。
import numpy as np
scores0 = [50, 50, 50, 50, 50, 50, 50, 50, 50, 50]
scores1 = [48, 53, 55, 50, 44, 50, 50, 53, 52, 45]
scores2 = [93, 98, 32, 80, 10, 20, 0, 99, 28, 40]
scores3 = [100, 100, 100, 100, 100, 0, 0, 0, 0, 0]
variance0 = np.var(scores0)
variance1 = np.var(scores1)
variance2 = np.var(scores2)
variance3 = np.var(scores3)
print("最頻値0:", variance0)
print("最頻値1:", variance1)
print("最頻値2:", variance2)
print("最頻値3:", variance3)
##########出力結果##########
#最頻値0: 50
#最頻値1: 50
#最頻値2: 0
#最頻値3: 0
###########################
dataリストにデータの値を格納し、stats.mode()関数を使用して最頻値を計算しています。
計算結果はmode変数に格納され、print()関数を使用して表示されます。
注意点
最頻値はデータに複数の値が同じ頻度で出現する場合(多モード)、その値すべてが最頻値となることがあります。
また、データに重複がない場合には最頻値が存在しないこともあります。
データの偏りに左右されやすいことが挙げられます。
中央値
中央値(メディアン)は、データを小さい順または大きい順に並べたときに真ん中に位置する値を指します。
データの分布を把握する際に、平均値と比較して外れ値の影響を受けにくい指標として使われます。
こちらも最頻値と同様に公式はありません。
Pythonで中央値を表現
Pythonで中央値を求めるには、numpyライブラリのmedian()関数を使用します。
import numpy as np
scores0 = [50, 50, 50, 50, 50, 50, 50, 50, 50, 50]
scores1 = [48, 53, 55, 50, 44, 50, 50, 53, 52, 45]
scores2 = [93, 98, 32, 80, 10, 20, 0, 99, 28, 40]
scores3 = [100, 100, 100, 100, 100, 0, 0, 0, 0, 0]
# 中央値を求める
median0 = np.median(scores0)
median1 = np.median(scores1)
median2 = np.median(scores2)
median3 = np.median(scores3)
print("中央値0:", median0)
print("中央値1:", median1)
print("中央値2:", median2)
print("中央値3:", median3)
##########出力結果##########
#中央値0: 50
#中央値1: 50
#中央値2: 36
#中央値3: 50
###########################
dataリストにデータの値を格納し、np.median()関数を使用して中央値を計算しています。計算結果はmedian変数に格納され、print()関数を使用して表示されます。
注意点
中央値はデータが偶数個の場合には、中央の2つの値の平均が採用されます。
そのため、データの個数によって中央値の求め方が異なることを理解しておく必要があります。
まとめ
numpyで平均を扱うには、 numpy.mean() 。分散を扱うには、numpy.var()。標準偏差をあつかうには、numpy.std()を使います。
項目 | 関数 |
平均 | np.mean() |
分散 | np.var() |
標準偏差 | np.std() |
3つの計算はいずれも外れ値によって計算値が変わるので、使用には注意が必要です。
また、最頻値と中央値はそれぞれ、stats.mode()関数とnp.median()関数を使用します。
項目 | 関数 |
最頻値 | stats.mode() |
中央値 | np.median() |