本サイトAIZU ONLINE JUDGE ITP1_10_C へはこちらから
問題:標準偏差
n 人の学生を含むクラスでプログラミングの試験を行った。それぞれの得点をs1, s2 … snとしたときの、標準偏差を求めるプログラムを作成せよ。
得点の平均値をmとすれば、分散α2は以下の式で得られる:
α2 = (∑ni=1(si – m)2)/n
Input
複数のデータセットが入力として与えられる。各データセットは以下の形式で与えられる:
学生の数 n
s1 s2 ... sn
n が 0 のとき入力の終わりとする。
Output
各データセットに対して、標準偏差を1行に出力せよ。ただし、0.0001以下の誤差があってもよい。
Constraints
- 入力で与えられる n が1000を超えることはない。
- 0 ≤ si ≤ 100
Sample Input
5
70 80 100 90 20
3
80 80 80
0
Sample Output
27.85677655
0.00000000
解答例
while True:
n = int(input())
if n == 0:
break
score = list(map(int, input().split()))
mean = sum(score)/n
var_sum = 0
for i in range(n):
var_sum += (score[i]-mean)**2
print((var_sum/n)**0.5)
解説
以下のように解いていきます。
while文を使用し、入力処理を行う
ある条件まで入力を続ける場合はwhile文とif文を組み合わせて、入力処理を行います。
# if文の条件式に当てはまるまでループ処理を続ける
while True:
処理
# この条件式に当てはまる場合、break文でループ処理を終了する
if 条件式:
break
今回は、whileループ内でまずint関数の引数にinput関数を設定し、整数の入力を行います。
次にif文を使用し、入力された整数が 0 場合にbreak文で処理を終了します。
# 終了条件に当てはまるまで処理を続ける
while True:
# input関数をint関数で囲み、整数値として変数に代入
n = int(input())
# nが0の場合にbreak文で処理を終了
if n == 0:
break
※サイト内「AIZU ONLINE JUDGE ITP1_1_Bをpythonで解いてみた」の、input関数とはに使用方法が書かれておりますのでぜひご覧ください。
※サイト内「AIZU ONLINE JUDGE ITP1_3_Cをpythonで解いてみた」の、break文とはに使用方法が書かれておりますのでよかったらご覧ください。
得点の読み込みから偏差の合計を求める
得点の読み込みでは、map関数を使用します。第二引数のinput().split()で空白区切りの文字列を取得した値を、一つずつint関数に当てはめてint型に変換、さらにlist関数で囲み、リストとして変数scoreに設定します。
# input().split()で空白区切りの文字列を取得 → intに変換 → list関数で囲み、リストとしてscoreに設定
score = list(map(int, input().split()))
※サイト内「AIZU ONLINE JUDGE ITP1_1_Cをpythonで解いてみた」の、map関数とはに使用方法が書かれておりますのでよかったらご覧ください。
標準偏差を求めるときの手順をまとめました。
- データ全体の平均値を求める
- 偏差(各データから平均値を差し引いた値)を求める
- ❷で算出した偏差を2乗する
- ❸で算出した偏差の合計を求める
- 偏差の合計をデータの総数で割り分散を求める
- 5で出した分散の正の平方根を求めて標準偏差を算出する
まずは❶データ全体の平均値を求めるを行います。
先ほど読み込んだ得点scoreをsum関数の引数に設定し合計値を算出し、データの総数nで割り平均値を求めます。
# ❶データ全体の平均値を求める
mean = sum(score)/n
※サイト内「AIZU ONLINE JUDGE ITP1_4_Dをpythonで解いてみた」の、sum関数とはに使用方法が書かれておりますのでよかったらご覧ください。
続いてfor文を使用し、❷ ~ ❹ を行います。
イテラブル(繰り返し可能なオブジェクト)にrange(n)を設定し、データの総数n回処理を実施します。
forループ内で、得点score[i]から平均値meanを引き、それを2乗した値を変数var_sumに足していきます。
var_sum = 0
# データの個数分ループ処理を行う
for i in range(n):
# ❷偏差を求める(score[i]-mean) → ❸2乗する → ❹偏差の合計を求める
var_sum += (score[i]-mean)**2
標準偏差の表示
ここでは❺,❻を行い、標準偏差を求めます。
先ほど算出した偏差の合計var_sumをデータの総数nで割り分散を求め、それを0.5乗し平方根を求めることで、標準偏差を算出します。
# ❺分散(偏差の合計/データの個数)を算出 → ❻分散を0.5乗し、標準偏差を算出する
print((var_sum/n)**0.5)
最後に、もう一度プログラムを確認してみましょう。
# 終了条件に当てはまるまで処理を続ける
while True:
# input関数をint関数で囲み、整数値として変数に代入
n = int(input())
# nが0の場合にbreak文で処理を終了
if n == 0:
break
# input().split()で空白区切りの文字列を取得 → intに変換 → list関数で囲み、リストとしてscoreに設定
score = list(map(int, input().split()))
# 以下❶〜❻で標準偏差を求める
# ❶データ全体の平均値を求める
mean = sum(score)/n
var_sum = 0
# データの個数分ループ処理を行う
for i in range(n):
# ❷偏差を求める(score[i]-mean) → ❸2乗する → ❹偏差の合計を求める
var_sum += (score[i]-mean)**2
# ❺分散(偏差の合計/データの個数)を算出 → ❻分散を0.5乗し、標準偏差を算出する
print((var_sum/n)**0.5)
コメント