「記述統計学」について学ぶ(統計学)

2023年5月13日

この記事では、統計学を初めて学ぶ筆者が、「記述統計学」について学んだ内容について記載しています。

学習には、Wikipediaの「記述統計学」の記事を参考にし、Pythonのプログラミングにも触れ、理解を深めました。

プログラミングには、機械学習ライブラリのscikit-learnを使用しました。

この記事は、他の人が参考にできるよう、わかりやすく書くことを心がけました。

要約統計量

統計学は、記述統計学と推定統計学に分かれます。記述統計学は、データの特徴を記述する学問であり、推定統計学は、標本から母集団を推定する学問です。具体的に言うと、記述統計学はデータ全体の特徴を記述・説明することに重点を置き、データ全体の特徴を要約して記述するために要約統計量を使います。例えば、データの平均値や標準偏差などがあります。

要約統計量とは、標本の分布の特徴を代表的に(要約して)表す統計学上の値であり、統計量の一種。記述統計量、基本統計量、代表値ともいう。

要約統計量

正規分布では、データの特徴は平均値で表され、分布の形は標準偏差と分散で決まります。正規分布から外れた部分を知るには、尖度や歪度という統計量を使います。具体例としては、身長のデータが正規分布に従う場合、平均値は平均身長、標準偏差は個人差、尖度や歪度は身長分布の偏りや峰の尖り具合を表します。

正規分布の場合は、平均と、分散または標準偏差で分布を記述できる。正規分布からのずれを知るためには、尖度や歪度などの高次モーメントから求められる統計量を用いる。

要約統計量

正規分布から大きく外れた場合には、平均値や標準偏差ではなく、中央値、四分位数、最大値、最小値、最頻値といった統計量がよく使われます。これらは、「頑健」と呼ばれる統計量で、分布が非対称であったり、外れ値があったりする場合でも、その影響を受けにくい特徴があります。具体例としては、収入のデータが正規分布から大きく外れた場合、平均値は外れ値の影響を受けやすく、代わりに中央値や四分位数を使ってデータを解析することがあります。

正規分布から著しく外れた場合には、より頑健な中央値、四分位点、最大値・最小値や最頻値が用いられる。「頑健」とは分布の非対称性や外れ値などの影響を受けにくいことを意味する統計用語である。

要約統計量

年収のようなデータの場合、最も低い人の年収は0を超えているため、データは正の側に偏っています。また、極端に高い年収を持つ人も存在するため、平均値はそれらの極端な値に引っ張られてしまいます。そのため、平均値は代表値として不適切な場合がありますが、中央値や最頻値は大多数の人の年収を反映する値として妥当です。具体例として、年収が正規分布から外れたデータである場合、平均値ではなく中央値を用いることがよくあります。

例えば、労働者一人あたりの年収を例に採れば、最も収入が少なくても0未満にはならないのに対し、収入が多いほうでは数十億円という年収を稼ぐ少数者があり得る。この場合の分布は、少数者が上側にいることによって、上側に極端に尾を引いた非対称な分布となる。平均値はこれらの極端な高値の影響を受け、分布の代表値として適切でないものとなってしまう。中央値や最頻値では、いかに飛び抜けた値であっても1例としてしか扱われないので、より大多数の実感に近い値を示すことができる。

要約統計量

モーメントから求められる要約統計量

統計学におけるn次モーメントは、確率変数をn乗した値の期待値を表す要約統計量のことです。ここで、確率変数とは、観測されるデータの値が確率的に分布する変数のことを指します。n次モーメントは、データの分布や形状を表現する統計量の1つであり、nが大きくなるにつれて、より高次元の情報を表現します。代表的なn次モーメントには、1次モーメント(平均)、2次モーメント(分散)、3次モーメント(歪度)、4次モーメント(尖度)があります。モーメントは、データの性質を数値的に表現することができるため、データ解析や確率論などの数学的な理論の基礎として広く用いられています。

具体例として、身長のデータに対して2次モーメント(分散)を求めることができます。また、3次モーメント(歪度)を使うことで、データが左右対称であるか、どちらかに偏っているかを知ることができます。

平均

平均は、1次モーメントから求められる統計量で、データの総和をデータの個数で割った値を表します。具体例として、10個のテストスコアがある場合、これらのスコアの平均を求めるには、スコアを合計し、10で割ることによって求めることができます。平均は、データの集まりを代表する値として広く用いられており、分布の中心傾向を表すためにも用いられます。

分散、標準偏差

2次モーメントは分布の広がりを表す統計量であり、正規分布の場合には分布の特徴が平均値と分散(標準偏差の2乗)で表されます。正規分布は、確率密度関数がガウス関数と呼ばれる形で表される分布であり、平均をμ、分散をσ2 として、N(μ, σ2 )で表します。

f:id:ikeda12345:20210919203641p:plain

例えば、あるデータが正規分布に従っている場合、その平均値からのずれが±1σ以下の範囲にデータが含まれる確率は68.27%であり、±2σ以下だと95.45%、さらに±3σ以下だと99.73%ということになります。これは、正規分布が広く用いられる理由の一つです。

f:id:ikeda12345:20210919203757p:plain

Pythonプログラミング

「平均」、「分散、標準偏差」をイメージしやすいようPythonでのプログラミングについても学びます。

scikit-learn トイデータセット

機械学習ライブラリscikit-learnに用意されている「トイデータセット」を使います。トイデータセットは、機械学習の問題を解くためのサンプルデータセットのことで、いくつかの種類が用意されています。例えば、Iris(アヤメ)の花の特徴から、その種類を分類する問題を解くための「irisデータセット」や、ボストン市の住宅価格に関するデータを用いて、住宅価格を予測する問題を解くための「bostonデータセット」などがあります。

Irisデータセットは、Setosa、Versicolour、Virginicaの3種類のアヤメの花のデータが含まれており、各種類について50個のサンプルがあります。このデータセットには、がく片の長さや幅、花びらの長さや幅、そしてアヤメの種類という4つの特徴量が含まれています。

各特徴量について、3種類のアヤメの平均、分散、標準偏差を計算することができます。これにより、データセットの傾向を調査することができます。たとえば、各アヤメの花びらの長さの平均、分散、標準偏差を比較することで、アヤメの種類ごとに花びらの長さの傾向を調べることができます。

平均は、データセットの値の合計をサンプル数で割った値です。分散は、データの散らばり具合を表す指標であり、値が大きいほどデータが散らばっていることを示します。標準偏差は、分散の正の平方根であり、データがどの程度平均値からばらついているかを表します。

以上のように、平均、分散、標準偏差を計算することで、データセットの特徴を理解し、傾向を調査することができます。

scikit-learnにはいくつかの小さな標準データセットが付属しており、外部のウェブサイトからファイルをダウンロードする必要はありません。

これらは以下の関数を使って読み込むことができます。

load_boston() : load_boston は 1.0 で非推奨となり、1.2 で削除される予定である。

load_iris() : アヤメのデータセット(分類)をロードして返す。

load_diabetes() : 糖尿病のデータセット(回帰)をロードして返す。

load_digits() : 数字のデータセット(分類)をロードして返す。

load_linnerud() : 身体運動のデータセットをロードして返す。

load_wine() : ワインのデータセット(分類)をロードして返す。

load_breast_cancer() : ウィスコンシン州の乳がんのデータセット(分類)をロードして返す。7.1. Toy datasetsts

アヤメのデータセット

アヤメのデータセットは、機械学習における代表的なデータセットの1つであり、サンプルデータの中でも特に有名なものの1つです。

アヤメのデータセットには、ヒオウギアヤメ(Iris-Setosa)、アイリス・バージカラー(Iris Versicolour)、アイリス・ヴァージニカ(Iris Virginica)の3種類のアヤメが含まれており、各々50件のデータがあります。データには、「がく片の長さ」、「がく片の幅」、「花びらの長さ」、「花びらの幅」といった4つの属性があり、また3種のアヤメの分類に関するデータも含まれています。

Iris Setosa (ヒオウギアヤメ)

アラスカ、メイン、カナダ(ブリティッシュコロンビア、ニューファンドランド、ケベック、ユーコンなど)、ロシア(シベリアなど)、アジア北東部、中国、韓国、日本など北極海を越えて広く分布する根生葉の多年草です。

茎は高く伸び、葉は中緑色、花は紫、紫紺、青、ラベンダー色です。また、ピンクや白の花を咲かせる植物もあります。

Irissetosa1.jpg
Iris Setosa (ヒオウギアヤメ)

Iris Versicolour (アイリス・バージカラー)

北アメリカ、アメリカ東部とカナダ東部に自生するアヤメの一種です。スゲ草地や湿地、川岸や海岸に普通に見られます。

特異形質バージカラー(versicolor)は「様々な色彩の」という意味です。

Blue Flag, Ottawa.jpg
Iris Versicolour (アイリス・バージカラー)

Iris Virginica (アイリス・ヴァージニカ)

北アメリカ東部原産の多年草です。アメリカ南東部のフロリダ州からジョージア州にかけての海岸平野によく見られます。

Iris virginica 2.jpg
Iris Virginica (アイリス・ヴァージニカ)

プログラム

以下のPythonプログラムは、アヤメのデータセットの各種類、各特徴量の平均、分散、標準偏差を求めるものです。これにより、データセットの傾向を調べることができます。

import pandas as pd
from sklearn.datasets import load_iris

# アヤメのデータセットを読み込み
iris = load_iris()

# データと属性名をデータフレームに設定
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# 分類をデータフレームに追加
df['Species'] = iris.target_names[iris.target]

# 各種類ごとに統計量を算出
grouped = df.groupby('Species')
result = grouped.agg(['mean', 'var', 'std'])

# 特徴量ごとに並べて出力
for feature in iris.feature_names:
    print(f"{feature}:")
    print(result[feature])
    print("\n")

実行結果

アヤメの3種類の花に対して、それぞれの特徴量の平均値、分散、標準偏差が算出されました。傾向としては、「花びらの長さ(petal length)」と「花びらの幅(petal width)」が花の種類ごとに大きな差異を示しており、これらの特徴量は花の種類を識別する上で重要な情報を持っていることがわかります。一方、「がく片の長さ(sepal length)」と「がく片の幅(sepal width)」は、花の種類ごとに大きな差異は見られませんでした。

sepal length (cm):
             mean       var       std
Species                              
setosa      5.006  0.124249  0.352490
versicolor  5.936  0.266433  0.516171
virginica   6.588  0.404343  0.635880


sepal width (cm):
             mean       var       std
Species                              
setosa      3.428  0.143690  0.379064
versicolor  2.770  0.098469  0.313798
virginica   2.974  0.104004  0.322497


petal length (cm):
             mean       var       std
Species                              
setosa      1.462  0.030159  0.173664
versicolor  4.260  0.220816  0.469911
virginica   5.552  0.304588  0.551895


petal width (cm):
             mean       var       std
Species                              
setosa      0.246  0.011106  0.105386
versicolor  1.326  0.039106  0.197753
virginica   2.026  0.075433  0.274650

プログラムの説明

import pandas as pd
from sklearn.datasets import load_iris

pandas ライブラリを pd という名前でインポートします。
sklearn.datasets ライブラリから load_iris 関数をインポートします。

# アヤメのデータセットを読み込み
iris = load_iris()

# データと属性名をデータフレームに設定
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# 分類をデータフレームに追加
df['Species'] = iris.target_names[iris.target]

load_iris 関数を使用してアヤメのデータセットを読み込み、iris という変数に代入します。
データセットを DataFrame に変換し、df という変数に代入します。列名は iris.feature_names を使用して設定します。
iris.target に対応する iris.target_names のラベルを df の Species 列に追加します。

# 各種類ごとに統計量を算出
grouped = df.groupby('Species')
result = grouped.agg(['mean', 'var', 'std'])

groupbyは、指定された列の値を基準にデータをグループ化します。このプログラムでは、Species列を基準にデータをグループ化しています。つまり、同じ種類のアヤメを一つのグループにまとめます。

aggメソッドは、データフレームの統計量を計算するための便利なメソッドです。このプログラムでは、agg(['mean’, 'var’, 'std’])を使用して、各グループ(種類ごとのアヤメ)の平均、分散、標準偏差を計算しています。結果はresultという変数に保存され、後で特徴量ごとに表示されます。

# 特徴量ごとに並べて出力
for feature in iris.feature_names:
    print(f"{feature}:")
    print(result[feature])
    print("\n")

この部分は、各特徴量ごとに統計量を出力するためのループです。アヤメのデータセットには、合計4つの特徴量があります。そのため、iris.feature_namesを使用して、特徴量名をループ変数featureに順番に代入しています。

次に、各特徴量ごとに平均値、分散、標準偏差の統計量を保持しているresultデータフレームから、ループ変数featureに対応する列を取り出して出力しています。

result[feature]によって、featureに対応する列を取得しています。そして、print()関数を使用して、特徴量名とその統計量を出力しています。また、出力結果が見やすくなるように、各特徴量の統計量ごとに改行しています。

歪度

歪度は、分布の左右非対称性を表す統計量であり、3次モーメントから求められます。具体的には、分布の左右どちらにデータが偏っているかを示し、正の値の場合は右に偏り、負の値の場合は左に偏りがあることを意味します。例えば、身長の分布が左に偏っているときは、平均値よりも低い身長の人が多いことを示します。

尖度

尖度は分布の形状が正規分布からどれだけ異なるかを表します。正規分布に比べて、尖度が大きい分布は、中央に高い山があるような尖った形をしており、小さければ平らな形をしています。具体例として、尖度が大きい分布としては、t分布やカイ二乗分布、尖度が小さい分布としては、一様分布やコーシー分布などがあります。

t分布は、母集団の標準偏差が未知である場合に、標本平均の分布を表す確率分布です。t分布は正規分布に近い形状をしていますが、標本数が少ない場合には尖度が大きくなります。

カイ二乗分布は、正規分布から独立に抽出された分散を表す確率変数の分布です。カイ二乗分布も尖度が小さい分布の一つです。

一様分布は、ある範囲の間で全ての値が等しい確率で出現する分布です。尖度が小さい分布の代表例の一つで、どの値も同じ頻度で出現するため、平均値と中央値が等しくなります。

コーシー分布は、平均値や標準偏差が存在しないような、非常に尖った分布の一つです。この分布は正規分布よりも尖度が大きく、極端な外れ値が存在するため、平均値や標準偏差といった要約統計量が適切に表現できません。

Pythonプログラミング

「歪度」や「尖度」をイメージしやすいよう、pythonでのプログラミングについても学びます。

プログラム

以下のPythonプログラムは、アヤメのデータセットの各種類、各特徴量の歪度や尖度を求めるものです。これにより、データセットの傾向を調べることができます。

import pandas as pd
from scipy.stats import skew, kurtosis
from sklearn.datasets import load_iris

# アヤメのデータセットを読み込み
iris = load_iris()

# データと属性名をデータフレームに設定
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# 分類をデータフレームに追加
df['Species'] = iris.target_names[iris.target]

# 各種類ごとに歪度と尖度を算出
grouped = df.groupby('Species')
result = grouped.agg([skew, kurtosis])

# 特徴量ごとに並べて出力
for feature in iris.feature_names:
    print(f"{feature}:")
    print(result[feature])
    print("\n")

実行結果

アヤメの3種類の花に対して、それぞれの特徴量の歪度や尖度が算出されました。

sepal length(cm)の傾向:

  • 歪度が0に近いため、ほぼ正規分布に近い形状をしている。
  • 尖度は、ほとんどの種類で負の値であり、尖ったピークを持たないため、分布が平らであることを示している。
  • Iris Versicolourのsepal length(cm)の分布は、他の2種類と比較して尖度がわずかに高いため、ピークが他の2種類に比べて尖っていることがわかる。

sepal width(cm)の傾向:

  • 歪度は、全体的に0に近いため、ほぼ正規分布に近い形状をしている。
  • 尖度は、Iris Setosaを除いて、ほぼ0に近いため、分布が平坦であることを示している。
  • Iris Setosaのsepal width(cm)の分布は、他の2種類と比較して尖度が高く、ピークが尖っていることがわかる。

petal length(cm)の傾向:

  • 全体的に歪度が0に近く、正規分布に近い形状をしている。
  • 尖度は、全体的に正の値であり、ピークが尖った形状をしていることを示している。
  • Iris Setosaのpetal length(cm)の分布は、他の2種類と比較して短く、ピークが低いため、尖度がやや低いことがわかる。

petal width(cm)の傾向:

  • 歪度は、全体的に0に近いため、ほぼ正規分布に近い形状をしている。
  • 尖度は、全体的に正の値であり、ピークが尖った形状をしていることを示している。
  • Iris Setosaのpetal width(cm)の分布は、他の2種類と比較してやや幅が狭く、ピークが低いため、尖度がやや低いことがわかる。
sepal length (cm):
                skew  kurtosis
Species                       
setosa      0.116454 -0.345765
versicolor  0.102190 -0.598827
virginica   0.114445 -0.087942


sepal width (cm):
                skew  kurtosis
Species                       
setosa      0.039921  0.744222
versicolor -0.351867 -0.448272
virginica   0.354878  0.519766


petal length (cm):
                skew  kurtosis
Species                       
setosa      0.103175  0.804592
versicolor -0.588159 -0.074402
virginica   0.532822 -0.256472


petal width (cm):
                skew  kurtosis
Species                       
setosa      1.215928  1.434317
versicolor -0.030236 -0.487833
virginica  -0.125560 -0.661348

プログラムの説明

import pandas as pd
from scipy.stats import skew, kurtosis
from sklearn.datasets import load_iris

# アヤメのデータセットを読み込み
iris = load_iris()

# データと属性名をデータフレームに設定
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# 分類をデータフレームに追加
df['Species'] = iris.target_names[iris.target]

「平均」、「分散、標準偏差」で記載されている内容と同じですので、説明を省略します。

# 各種類ごとに歪度と尖度を算出
grouped = df.groupby('Species')
result = grouped.agg([skew, kurtosis])

groupbyは、指定された列の値を基準にデータをグループ化します。このプログラムでは、Species列を基準にデータをグループ化しています。つまり、同じ種類のアヤメを一つのグループにまとめます。

aggメソッドは、データフレームの統計量を計算するための便利なメソッドです。このプログラムでは、agg([skew, kurtosis])を使用して、各グループ(種類ごとのアヤメ)の歪度と尖度を計算しています。結果はresultという変数に保存され、後で特徴量ごとに表示されます。

# 特徴量ごとに並べて出力
for feature in iris.feature_names:
    print(f"{feature}:")
    print(result[feature])
    print("\n")

「平均」、「分散、標準偏差」で記載されている内容と同じですので、説明を省略します。

順序から求められる要約統計量

以下は、データを昇順に並べ替えた上で求めることができる統計量です。

中央値

中央値とは、データを小さい順に並べたときに、真ん中に位置する値のことを指します。例えば、{1, 2, 3, 4, 5}というデータがあった場合、中央値は3になります。この統計量は、データの分布が偏っていたり、外れ値があった場合に有効な代表値として用いられます。

刈込平均(トリム平均)

刈込平均(トリム平均)は、データの極端な値(最大値や最小値)が平均値に大きな影響を与えることを避けるために用いられます。最大値と最小値を一定割合(例えば5%)だけ除いたデータの平均値を求めます。たとえば、10個のデータがある場合、最大値と最小値を1つずつ除いた8個のデータの平均値を求めます。

四分位点

四分位点とは、データを小さい順に並べたときに、データ全体を4等分するために使われる値です。つまり、最小値から25%、50%、75%の位置にある値をそれぞれ第1四分位点、中央値、第3四分位点と呼びます。例えば、以下のような数列があった場合、

3, 5, 7, 8, 9, 11, 15, 16, 20, 21, 23, 24, 25, 26, 27, 28, 29, 30

この数列の中央値は、値を小さい順に並べたときに真ん中に来る値である「21」です。また、第1四分位点は「8」、第3四分位点は「27」となります。これらの値は、データの分布をざっくりと把握するために用いられます。

最小値・最大値

最も小さな値と最も大きな値を表す統計量です。例えば、1から10までの整数がある場合、最小値は1で最大値は10になります。

中点値

中点値は、データの最大値と最小値を足して2で割った値です。例えば、1, 3, 5, 7, 9というデータがあった場合、最大値は9、最小値は1であり、中点値は(9+1)/2=5となります。中点値は、データの中央に位置する値であり、中央値とは異なり、データがソートされていなくても求めることができます。

範囲

範囲とは、データの最大値から最小値を引いた値を表します。例えば、データが以下のように与えられた場合、

4, 8, 2, 10, 5

最大値は10、最小値は2なので、範囲は10-2=8となります。

度数から求められる要約統計量

最頻値

度数分布とは、データをいくつかの区間に分け、それぞれの区間に含まれるデータの個数を数えたものです。最頻値は、この度数分布の中で最も頻繁に出現するデータの値を指します。

例えば、ある学校の1年生の身長を調べたとき、160cmから165cmの区間に10人、165cmから170cmの区間に15人、170cmから175cmの区間に20人、175cmから180cmの区間に10人、180cmから185cmの区間に5人の生徒がいたとします。この場合、度数分布の中で最も高い頻度を示す区間は170cmから175cmの区間で、最頻値はこの区間の中央値である172.5cmになります。