偏差値計算

偏差値を計算するプログラムを実装してみた。

実行結果

[実験1:スコア (0,10,20,30,40,50,60,70,80,90,100)]
[平均点]50
[標準偏差]31.622776601684
[30点の偏差値]43.675444679663
[100点の偏差値]65.811388300842
[実験2:スコア (0,30,31,32,33,34,35,36,37,38,39,40,100)]
[平均点]37.307692307692
[標準偏差]20.551565972094
[30点の偏差値]46.444216310516
[100点の偏差値]80.504881125572

プログラム

<?php
test();
exit;

// テスト
function test() {
	$hensachi = new Hensachi();
	$score_list = array(0,10,20,30,40,50,60,70,80,90,100);
	d("実験1:スコア (0,10,20,30,40,50,60,70,80,90,100)");
	$hensachi->setScoreList($score_list);
	d('平均点', $hensachi->avg);
	d('標準偏差', $hensachi->hensa);
	d('30点の偏差値', $hensachi->get(30));
	d('100点の偏差値', $hensachi->get(100));

	$hensachi = new Hensachi();
	$score_list = array(0,30,31,32,33,34,35,36,37,38,39,40,100);
	d("実験2:スコア (0,30,31,32,33,34,35,36,37,38,39,40,100)");
	$hensachi->setScoreList($score_list);
	d('平均点', $hensachi->avg);
	d('標準偏差', $hensachi->hensa);
	d('30点の偏差値', $hensachi->get(30));
	d('100点の偏差値', $hensachi->get(100));
}

/**
 * 偏差値を計算するクラス
 *ex)
 $hensachi = new Hensachi();
 $score_list = array(0,10,20,30,40,50,60,70,80,90,100);
 d("実験1:スコア (0,10,20,30,40,50,60,70,80,90,100)");
 $hensachi->setScoreList($score_list);
 d('平均点', $hensachi->avg);
 d('標準偏差', $hensachi->hensa);
 d('30点の偏差値', $hensachi->get(30));
 d('100点の偏差値', $hensachi->get(100));
 */
class Hensachi {
	/** 平均点 */
	var $avg;
	/** 標準偏差 */
	var $hensa;
	/**
	 * 偏差値を取得
	 *@param score 点数
	 *@return float 偏差値
	 */
	function get($score) {
		$hensachi = 10 * ($score - $this->avg) / $this->hensa + 50;
		return $hensachi;
	}
	/**
	 * 点数リストをセット
	 *@param array(int) score_list 点数の配列
	 */
	function setScoreList($score_list) {
		$this->avg = $this->calcAvarage($score_list);
		$this->hensa = $this->calcHensa($score_list, $this->avg);
	}
	/**
	 * 平均点を計算
	 *@param array(int) score_list 点数の配列
	 */
	function calcAvarage($score_list) {
		$sum = 0;
		for ($i=0; $i < count($score_list); $i++) {
			$sum += $score_list[$i];
		}
		$avg = $sum / count($score_list);
		return $avg;
	}
	/**
	 * 標準偏差を計算
	 *@param array(int) score_list 点数の配列
	 *@param int avg 平均点
	 */
	function calcHensa($score_list, $avg) {
		$sum = 0;
		for ($i=0; $i < count($score_list); $i++) {
			$sum += pow($score_list[$i] - $avg, 2);
		}
		$hensa = sqrt($sum / count($score_list));
		return $hensa;
	}
}

// debug
function d($name, $s="") {
	if (is_array($s)) {
		$s = preg_replace("/[\r\n]/", "", print_r($s, true));
	}
	echo '[' . $name . ']' . $s . "\n";
}