2. 基本統計処理

2.1. はじめに

2.1.1. 開始前に行うこと(重要)

まず,Chrome 等のブラウザを利用して,本教材の URL にアクセスし,画面の指示に従い Google アカウントにログインしてください.その後,ブラウザ表示画面左上の「ファイル」をクリックし,さらにポップアップで出てくる項目から「ドライブにコピーを保存」をクリックしてください.これにより,本教材のコピーが自分のGoogleドライブに保存され,自分で書いたプログラムを実行できるようになります.

また,多くのセルが非表示になっていると思われるため,同じくブラウザ表示画面上の「表示」をクリックし,さらにその項目から「セクションを展開」をクリックし,非表示のセルを表示させてください.

Hint

各ページの上部にロケットのアイコン があるのでこれをクリックして各ページのファイルを Google Colaboratory 上で開いて利用してください.

2.1.2. 到達目標

NumPy を利用して基本的な統計処理ができるようになること目標とします.

2.1.3. NumPy とは

NumPy は,Python で科学技術などを行う際に使用する基本的なライブラリです.ベクトルや行列を扱えるほか,線形代数や統計の基本処理や離散フーリエ変換を行うこともできます.C言語でコンパイルされているため,C言語並みに高速に動作します.使い方の概要や詳細については,NumPyユーザーガイドをご覧ください.

2.1.4. NumPy のインポート

NumPy は以下のようにインポートします.NumPy には np という略称を与えて利用するのが普通です.その都度 numpy とタイピングするのが面倒だからです.

import numpy as np

2.1.5. 学習の進め方

上から順に読み進み,【実習】と書いてある箇所でコードを書いて実行してください.基本的に入力するコードの前に見本のコードが書かれており,見本と同じコードを書けば正しく動作するようになっています(見本コードの上下に入っている区切り線は入力する必要ありません).理解を深めるには,見本とは異なるコードを書いて試してみることも役立つと思います. なお, Colab では,コードが書かれている領域をコードセル,説明文等が書かれている領域をテキストセルといいます.

2.2. NumPy の基本操作

2.2.1. NumPyによる1次元配列

1変量データを扱う場合はNumPyアレイを使うと便利です.

【実習】NumPyアレイにより架空の年齢データを保持する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
ages = np.array([23, 10, 15, 16, 32, 14, 18, 41, 35, 26])
ages
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

2.2.2. 配列のデータ数(標本数)

【実習】年齢データのデータ数を求める.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
len(ages)
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

2.2.3. 最大値と最小値

【実習】年齢の最大値を求める.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
np.max(ages)
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】年齢の最小値を求める.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
np.min(ages)
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

2.2.4. 合計

【実習】全員の年齢の合計値を求める.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
np.sum(ages)
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

2.2.5. 平均値

平均値は下記の式で定義されます.

\[\mu = \frac{1}{N}\sum_{i=1}^N x_i\]
  • \(\mu\): データの平均値

  • \(N\): 標本数

  • \(x_i\): データ

【実習】全員の年齢の平均値を計算する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
np.mean(ages)
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

【実習】全員の年齢の平均値を自分で計算する.NumPy関数で計算した結果と同じになることを確認する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
np.sum(ages) / len(ages)
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

2.2.6. 分散

  • 分散は「各データが平均値からどれほど離れているか」を表す指標です.

  • 「標本分散」と「不偏分散」の2つの定義がありますが,本講義では「標本分散」を扱います.

  • (標本)分散は下記の式で定義されます.分散が大きいほど,各データが平均値から大きくズレていることを意味します.

\[ \sigma^2 = \frac{1}{N}\sum_{i=1}^N (x_i - \mu)^2 \]
  • \(\sigma^2\): 分散

  • \(N\): 標本数

  • \(\mu\): 持っているデータの平均値

  • \(x_i\): データ

  • 分母を\(N-1\)にすると不偏分散となります.

【実習】年齢データの分散を計算する.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
np.var(ages)
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

2.2.7. 標準偏差

標準偏差とは分散の平方根です.

  • 平方根を取ることで単位が元のデータと同じになる

  • 分散として本講義では標本分散を使う(不偏分散を使うこともある)

  • 数式で書くと以下のようになる

\[\sigma = \sqrt{\frac{1}{N}\sum_{i=1}^N (x_i - \mu)^2}\]
  • \(\sigma\): 標準偏差

  • \(N\): 標本数

  • \(\mu\): 持っているデータの平均値

  • \(x_i\): データ

  • 各データの平均値からのズレの大きさを表す指標

  • しばしばSDと表記される(英語だとStandard Deviationのため)

【実習】年齢データの標準偏差を求める.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
np.std(ages)
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

Note

年齢データの平均値からのズレは10歳くらいであると言えます.

2.2.8. 中央値

  • データを大きい順に並び替えた時に,真ん中にくるデータの値

    • データ数が偶数の時は真ん中二つのデータの平均値となる

【実習】年齢データの中央値を求める.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
np.median(ages)
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

Hint

真ん中の値は18と23なので,それらの平均値(20.5)になります.

2.2.9. 欠損値がある時の処理

  • データ収集で一部のデータが入手できなかった場合など,一部のデータが欠落することがある.
    このような欠落した値を欠損値という.

  • NumPyでは欠損値をnp.nanと表す

  • NumPyでは欠損値を含んだNumPyアレイ(ndarray)に対する基本統計処理の関数が用意されている

    • 従来の関数名の前にnanをつける

統計値

欠損値なし

欠損値あり

最大値

max

nanmax

最小値

min

nanmin

合計

sum

nansum

平均

mean

nanmean

分散

var

nanvar

標準偏差

std

nanstd

中央値

median

nanmedian

【実習】5つのバイトの時給はそれぞれ,1013, 790, 810, n/a, 1500である(n/aは入手不可; not available).このデータについて,基本統計量を求める.

#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#
pay = np.array([1013, 790, 810, np.nan, 1500])
print("Max: ", np.nanmax(pay))
print("Min: ", np.nanmin(pay))
print("Sum: ", np.nansum(pay))
print("Average: ", np.nanmean(pay))
print("Var: ", np.nanvar(pay))
print("SD: ", np.nanstd(pay))
print("Median:", np.nanmedian(pay))
#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#--#

Note

終わりです.