Pythonで実装する記述統計①(ヒストグラム、平均、分散)|スクラッチ実装で理解する基礎統計 #1

f:id:lib-arts:20190418180916p:plain

上記のシリーズで機械学習アルゴリズムの実装を行っているのですが、他の内容もできればということで同様のイメージで基礎統計を実装していければと思います。
#1ではデータの整理と要約の方法を取り扱う記述統計学の中から、1変数を取り扱った非常にシンプルな概念であるヒストグラム、平均、分散などを取り扱えればと思います。以下目次になります。
 
1. 前提の補足(記述統計、変数などについて)
2. ヒストグラムの概要とPythonでの実装
3. 平均、中央値などの代表値とPythonでの実装
4. 分散とPythonでの実装
5. まとめ

 

1. 前提の補足(記述統計、変数などについて)
まずは前提の整理からできればと思います。
今回取り扱う記述統計は、何かしらの調査や記録によって得られたデータの整理と要約の方法です。表計算ソフトやRDBMSに保存されている表型のデータを思い浮かべていただければと思います。具体例がある方が望ましいので、下記のコードを実行してみてください。

import pandas as pd
from sklearn import datasets

iris = datasets.load_iris()
X = pd.DataFrame(iris.data, columns=iris.feature_names)
X.head(10) 

実行結果は以下のようになります。

f:id:lib-arts:20190418180952p:plain
上記はサンプルのデータセットとしてよく用いられるiris(アヤメ)のデータセットですが、このように一つのサンプル(アヤメの一個体)を行単位で持ち、列単位では何かしらの特徴の値(例えばがくや花弁のながさ)を持ちます。このデータに置いて行はサンプル、列は変数と一旦押さえておくと良いです。

さて、前提の解説に戻りますが、ここで意識したいのが、記述統計は図のようなデータが得られた際にそこからデータを記述するための統計だということです。記述統計のメインの内容は1変数に着目してどう知見を抽出するかや2変数の関係性をどう見抜くかがメインです。今回は1変数に着目するので、1変数に着目した際の話をすると、データの図示(ヒストグラム)、データの中心(平均、中央値)、データの散らばり(分散)などの話をしていきます。それぞれ、2節、3節、4節で解説とPythonを用いた実装をご紹介します。

 

2. ヒストグラムの概要とPythonでの実装
2節ではヒストグラムの解説を行って行きます。ヒストグラムは度数分布を棒グラフで表したものです。度数分布とは、データを値の大きさに応じていくつかの階級(class)に分類し、整理した際にデータの特徴を大雑把に捉えるものです。各階級のデータの数を度数(frequency)と呼び、階級に度数を対応させたものを度数分布(frequency distribution)と言います。ここで出てきたdistributionは確率分布のところでも出てくるので意識しておくと良いです。
この度数分布を棒グラフを用いて図式化したのがヒストグラムなのですが、言葉だけで理解するのは大変なので、早速実装を元に解説します。以下のコードを実行してみてください。

import matplotlib.pyplot as plt

plt.hist(X["sepal width (cm)"],20)
plt.show()

実行結果は以下のようになります。

f:id:lib-arts:20190418182830p:plain
上記は「sepal width(がくの幅)」の値を元にデータの数を数えたものになります。単位はcmとなっているので、上記をみることでだいたい3cmほどの個体が一番多いということがわかります。
このようにヒストグラムを描くことで、データがだいたいどのように分布しているのかについての外観を知ることができます。数字の羅列を見るだけではなかなか大変ですが、図にすることで一目瞭然となります。


3. 平均、中央値などの代表値とPythonでの実装
2節ではヒストグラムを描くことで、データの分布を俯瞰しました。3節と4節ではヒストグラムだけでは定性的なので、定量的に考察するにあたって、代表値と散らばり具合の値を実際に定義し計算してみます。定量的に考察するにあたって数式が出てくるのが常ですが、統計における数式は実際に数字を入れてみることでイメージがつくので避けるのではなくとにかく値を入れてみて理解するというスタンスを取るのが良いかと思います。
さて、3節のメインテーマとしては代表値を取り扱います。代表値とはその名の通り、変数を代表する値のことです。代表値の計算方法は色々とあり、よくありがちなのが、平均と中央値です。平均は全ての値の合計をサンプルで割ることで計算できます。
\overline{x}=\frac{1}{N}\sum_{i=1}^{N}x_{i}
平均は代表値としてよく用いられる概念で、まずは平均を取ってみるというアプローチがよくなされます。が、ここで気をつけたいのが平均はよく用いられる便利な考え方であるものの、万能だと勘違いしないようにするべきということです。例えば、外れ値(一つだけ大きな値)がある時、平均はその大きな値の影響を受けすぎてしまうということです。例えば、30名の平均年収が500万と考えた際に、全員が500万ほどの時もありますが、一人だけ1億で他29人が200万弱という場合も指標としては起こり得ます。
この際に用いるのが中央値です。中央値はデータに順番を割り振り真ん中のサンプルの値を値とします。平均、中央値はそれぞれ良い点悪い点があるので、それを踏まえた上で使用していくことが重要です。
概要の解説は行えたので、実際に実装に移ってみましょう。下記を実行することで平均と中央値が計算できます。

mean = sum(X["sepal width (cm)"])/X.shape[0]
X_ = X.sort_values(by=["sepal width (cm)"], ascending=True)
median = (X_["sepal width (cm)"][74]+X_["sepal width (cm)"][75])/2
print(mean)
print(median)

実行結果は下記になります。

f:id:lib-arts:20190418185008p:plain
平均、中央値を計算するアルゴリズムは機能として実装されていますが、中身がわかる方が良いのではということであえて基礎的な実装としています。中央値(median)の計算に関してはソート処理を行った上で、真ん中の二つの値の平均を計算しました。


4. 分散とPythonでの実装
3節では代表値について取り扱いましたので、4節では散らばり具合について取り扱います。要は1変数のデータ群を取り扱うにあたっては、全体の真ん中の値とそこからの散らばりがわかればデータが要約できるという考え方です。この考え方は、確率分布などの考え方に繋がってくるのですが、詳細は確率分布を取り扱う際に取り扱えればと思います。
散らばり具合を表す指標としては分散がよく用いられます。分散を数式で定義すると下記のようになります。
Var(x)=\frac{1}{N}\sum_{i=1}^{N}(x_{i}-\overline{x})^2
当座の理解としては、平均からの差をサンプルごとに足し合わせることで、散らばり具合を定義できるとざっくり把握しておくと良いのではと思います。数式だけでは難しいので、以下に実装をご紹介します。

Var_x = sum((X["sepal width (cm)"]-mean)**2)/X.shape[0]
print(Var_x)

実行結果は以下になります。

f:id:lib-arts:20190418190053p:plain


5. まとめ
説明や数式だけではとっつきづらいと思うので、具体的なデータを元に実際に実装しながら理解する方がイメージがついて良いではと思います。
#1では記述統計の中から1変数の取り扱いについてご紹介しましたので、#2では2変数の取り扱いをご紹介できればと思います。