Pythonで標準偏差・分散・平均値・中央値 等の統計量を取得する方法 – サンプルコードあり

学力試験という身近なデータを題材に Python3 + Pandas + Matplotlib でデータの可視化、平均値・中央値・標準偏差・分散といった代表値を取得する方法をサンプルコード付きで説明します。

学習内容
  • Python3 / Pandas によるCSV読み込み・書き込み操作
  • Pandas による平均値、中央値、標準偏差、分散 等の取得方法
  • Matplotlib によるデータの可視化(ヒストグラム)
  • 統計学・データサイエンスの基礎知識

 

入力データと出力データ

まずはデータソース(入力データ)から最終的にどのようなデータを出力するかを検討します。

入力データ

生徒の試験結果(受験者数3,000人)が今回の入力データになります。下記のように「Student ID(生徒ID)」 と「 Score(点数)」の2項目からなるデータ(n=3000)です。CSVファイルはこちらからダウンロードできます。※実際の試験データではなく自動生成によるダミーの試験結果です。

CSVキャプチャー

出力データ

入力データは数字(点数)が羅列されているだけで、平均値(平均点)や得点分布状況といった全体の概要を把握することができません。また、相対評価に必要な順位・偏差値といったデータもありません。

そこで下記3点を出力することにします。

  1. 可視化のためのヒストグラム(PNG画像)
  2. 平均値、中央値、標準偏差 等を記入した要約データ(CSVファイル)
  3. 順位と偏差値を追加した一覧データ(CSVファイル)

 

Python3 のサンプル・ソースコード

詳細は後程として … まずはソースコードです。コード量はわずかですが、 Python 3 + Pandas + Matplotlib によるデータ解析に関するエッセンスを詰め込んでいます。

 

出力結果

実行すると以下の結果が得られます。

・平均値、中央値、標準偏差 等を記入した要約データ(CSVをダウンロード
・順位と偏差値を追加した一覧データ(CSVをダウンロード

Matplotlib によるヒストグラム

 

ソースコードの詳細説明

さてソースコードをポイント解説します。

Pandas によるCSVデータの読み込み・書き込み

Pandas は CSV や JSON などのファイルを直接読み込むことができます。

読み込み
CSVファイルを読み込むには pandas.read_csv() メソッドを使います。
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

書き込み
Pandas のデータをCSVに書き出すには pandas.Series.to_csv() または pandas.DataFrame.to_csv() メソッドを使います。どちらも to_csv() という共通インターフェースなので、とてもわかりやすいですね。

pandas.Series.to_csv()
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.to_csv.html

pandas.DataFrame.to_csv()
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html

 

Python3 標準モジュールによるCSV操作

Python3 にはCSVファイルを読み込み・書き込みするための標準モジュール csv があります。概要データについてはPython3 標準 csv モジュールで書き出しています。

https://docs.python.jp/3/library/csv.html#csv.writer

 

データの可視化

定番ライブラリ matplotlib によりヒストグラムを出力することで、テスト結果を可視化をしています。matplotlib はヒストグラムの他に散布図、折れ線グラフ、棒グラフ、円グラフ…etc. 様々な図を描画することができます。

matplotlib は Python3 の標準モジュールではないため pip install matplotlib によりインストールが必要です。

 

データの代表値の算出

Pandas の DataFrame / Series には平均値、中央値、最頻値といった代表値を算出するメソッドが用意されています。四分位数についても quantile() メソッドにより簡単に取得できます。

サンプルコードでは代表値を個別計算していますが、 Series.describe() というメソッドを使うと代表値をまとめて取得することができます。

 

なお describe() メソッドの返す分散・標準偏差は不偏推定値(n-1法)です。厳密な値を求められる場合には注意しましょう。

 

分散と標準偏差の算出

Pandas の DataFrame / Series には分散と標準偏差 を算出するメソッドが用意されています。分散は var() 、標準偏差は std() というわかりやすいメソッド名となっています。

ddof 引数

分散・標準偏差は全データから計算する場合と一部のデータから推定する場合で計算方法が異なります。今回は全データのため ddof=0 という引数で分散・標準偏差の計算方法を指定しています。

統計学について少し突っ込んだ知識が必要になるので、詳しくは下記記事を参照ください。
「分散」と「標準偏差」の正しい計算法 – Python(Numpy, Pandas)、Excel、R の比較

var(ddof=2) や std(ddof=2) は n-2、var(ddof=3) や std(ddof=3) は n-3 で割った値になります。このように Pandas では自由度に応じた分散・標準偏差を取得できます。

 

なお引数 ddof を指定しない場合(デフォルト)、Pandasでは ddof=1 と同じ値になります。統計学の用語でいうなら不偏推定値がデフォルトの仕様です。
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.var.html

 

順位付け

自前で順位を算出しようとすると地味に手間がかかりますが、DataFrame や Series には rank() という便利なメソッドがあります。

キーワード引数 ascending により昇順・降順を設定して順位付けができます。

同点の人が複数いる場合に3位タイといった「〜タイ」にしたい場合には、キーワード引数 method によりルールを指定します。今回は ‘min’ を採用しています。

pandas.Series.rank() には method / ascending の他にも順位付け設定を行う引数があるので、公式ドキュメントをチェックしましょう。
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.rank.html

 

偏差値

名称が似ていて紛らわしいですが、「偏差値(学力偏差値)」はデータサイエンス・統計学の「標準偏差」とは異なる独自の値です。日本の教育機関で使用される学力偏差値は以下で定義されます。

偏差値 = (得点 − 平均点) ÷ 標準偏差 × 10 + 50

Wikipedia によると学力偏差値は国により定義が異なるようです。上記は日本国内でしか通じないので注意しましょう。

Pandas に学力偏差値を計算する関数やメソッドはないので、自前で算出する必要があります。

一括適用する際にはパフォーマンスの点からも for でループ処理せずに Series.map() メソッドを使いましょう。

サンプルコードでは 無名関数 lamda と Series.map() で実装しています。もし lamda について初めてなら無名関数 lambda(ラムダ式)の基本が役に立つかと思います。

 

以上となります。

この記事が役に立ったら是非シェアください!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です