最近、機械学習の分野に興味があり、回帰やディープラーニングなどのチューリアルをすることがよくある。

しかし中卒の俺に機械学習で必要な数学力があるわけもなく、チュートリアルの内容を完全に理解することができなかったので、まずは機械学習で必要な統計の基礎を勉強することにした。

今後、勉強した内容は備忘録として記事にまとめていくことにする。

データの特徴を浮き彫りにする縮約

今回は統計の基礎でもある縮約と言われる手法の中から度数分布表を作成する方法と、作成した表を元にヒストグラムと言われるグラフを作成する方法を紹介する。

縮約とは

統計の基礎概念といったところだろうか。

何千件、何万件とあるデータを一つずつ眺めていても全体の特徴などは何も分からない。

この散らばったデータを、あるルールに基づいて整理し必要な情報のみを抜き出すのが縮約と言われる手法だ。

サンプルデータの用意

今回はpythonを使ってランダムに生成した身長データを使う。

Jupyter Notebookを開いて、以下のコードを入力してくれ。

import numpy as np
import pandas as pd

# 平均170cm標準偏差10のランダムデータを100件作成
height = np.random.normal(170, 10, 100)

# 整数に変換
height = list(map(int, height))

# CSVファイルをデスクトップにダウンロード
df = pd.DataFrame(height)
df.to_csv("~/Desktop/height.csv")

コードを実行すると170cmを平均値とした標準偏差10の身長データが100件生成されるはずだ。

今回はこのバラバラの身長データを縮約し、このデータ群にどんな特徴があるかを確認してみよう。

度数分布表の作成

作成したCSVファイルを元に、これから度数分布表を作っていく。

ステップ1

データ群の中から最大値最小値を見つける。

ステップ2

最大値から最小値までの範囲を5〜8程度の範囲(小区間)に区切る。
この区間を階級と呼ぶ。

ステップ3

各階級の代表となる値を決める。
通常はそれぞれの階級の中で真ん中の値を選ぶことが多く、これを階級値と呼ぶ。

ステップ4

それぞれの階級に属するデータの数をカウントする。
これを度数と呼ぶ。

ステップ5

データ全体から見た、各階級の度数の割合を調べる。
度数 / (全階級の度数総和) の式でそれぞれの階級の相対度数を求める。
全階級の相対度数の総和は必ず1になる。

ステップ6

その階級までの度数を合計した数を計算する。
これを累積度数と呼ぶ。

サンプルデータの度数分布表を作成する

ではここまで紹介した手順を元に度数分布表を作成してみよう。

サンプルのcsvデータをExcelやNumbers、Googleスプレッドシートなどの表計算ソフトで開き、まずは最大値最小値を求める。

次に区切りのいい数字として、最小値143に近い140、最大値205に近い210を選び、140から210まで10cm刻みで7つの階級を作る。

階級値としては真ん中の値を使うことにする。
つまり140〜149までの階級の場合、階級値は144になる。

ここまでの手順で出来た度数分布表は次のとおり。

次に度数を求めていく。

作業用にF列・G列に各階級のx以上y以下のxy値を入力した。
ここまで用意できたら度数のセルに以下の関数を入力し、度数を求めていく。
※オートフィルを使って全てのセルに関数を適用してくれ。

=countifs($A$2:$A$101,">="&F2,$A$2:$A$101,"<"&G2)

度数を求めることができたら、追加した作業用列は非表示にしておこう。

次に相対度数を求める。

セルに以下の関数を入力してくれ。

=H2/sum($H$2:$H$8)

最後に累積度数を求めよう。
単純な度数の足し算なので特に関数などは必要ないはずだ。

度数分布表を作成したことで失った情報

表を見てもらったら分かるとおり、この表からは元々の情報(最小、最大値など)を確認することができなくなっている。
つまり、生の情報が失われているということだ。

度数分布表から得られる情報

生の情報は失われたが、その分この表から得られる情報は多い。

まず、サンプルデータ100件の身長は均等に分布しているわけではなく、特定の場所にデータが集中していることが分かる。
特に160cm〜179cmの階級に集中している。
※pythonでサンプルデータを生成した際に、平均値を170と指定したので、まぁ想定内の結果ではあるのだが。

また、集中している階級から最小、最大、各方面に向かって大きく度数は下がっている。
その度数の下がり方も8…3、9…4…1と似たような推移の仕方だ。

つまり、データの分布は集中している階級を軸に、左右の対称性があるということが分かる。

このことから、まずサンプルの身長データには平均値をベースにある範囲内で度数の分布が見られるが極端に小さい身長(100cmなど)や大きい身長(300cm)は見られない、また平均値の170cmあたりに集中する、平均値を基点に最小、最大両端に向かって似たような推移で現れにくくなる、といった特徴が見て取れる。

ヒストグラムを作成する

今度は作成した度数分布表を棒グラフにして、データを可視化していこう。

x軸に階級値、y軸に度数を設定した棒グラフを作成する。

Googleスプレッドシートで簡単に作成した図がこちらだ。

グラフ化するとより直感的にデータの分布、特徴が分かりやすいはずだ。

Jupyterでのヒストグラム化

参考までにJupyter Notebook上でヒストグラムを表示する方法も紹介しておく。

下記のコードを入力する。

import numpy as np
import matplotlib.pyplot as plt

# csv読み込み ファイルは/Users/username内に配置する
data = np.loadtxt("./height.csv"
                 , delimiter=","
                 , skiprows=1  # 1行目を除外 
                 , usecols=(1) # 身長値が入っている列のみを使用
            )
# ヒストグラムの表示
plt.hist(
    data
    , bins=7 # 階級の数
)

統計学を勉強するにあたり、Pythonを使うことができれば、より簡単にデータをヒストグラム化することができるので、基本的なコードとJupyterの使い方は覚えておくと良いだろう。

【中卒でも分かる統計学入門】連載記事一覧

  1. 度数分布表とヒストグラム ←←現在見ている記事
  2. 度数分布表から平均値を求める
  3. 色々な平均値の求め方
  4. データの散らばり具合をみる分散と標準偏差
  5. 度数分布表から標準偏差を求める
  6. 標準偏差を理解して偏差値の求め方と意味を知る
  7. Pythonで偏差値を求める
  8. 仮説検定で一つのデータから母集団を推定する
  9. Pythonで95パーセント信頼区間を求める
  10. 平均に対する区間推定
  11. 母集団からとった標本平均の95パーセント予言的中区間
  12. 標本平均から母平均を区間推定する
  13. 標本分散とカイ二乗分布
  14. カイ二乗分布から母分散を推定する
  15. 標本分散に比例する統計量Wの求め方
  16. 母平均が分からなくても母標準偏差を推定する方法
  17. 統計量Tを求めてt分布を理解する
  18. t分布を使った区間推定