まず、求めたい「期待される結果」を手計算で出します。
[158, 157, 163, 157, 145] の平均は156です。
それぞれの値の差の2乗は [4, 1, 49, 1, 121]
で、その平均である分散は35.2(176÷5)になります。
参考書の通りにやると、正しい結果が出ます。
相談者さんのコードを実行すると、24.2になり、正しい結果が出ません。
なぜかというと、heightに入っている値がどんどん書き換えられているからです。
ループの1回目、heightに158が入ってきて、 height = (height - mean)**2
が計算され、heightに4が入ります。
次に、heightに157が入ってきて、同様の計算の結果、1が入ります。
さらに49、1と入ってきて、最後に121が入ります。
その結果、出力される値は24.2(121÷5)になります。
つまり、分散を計算するときに必要な「各項の差の2乗の合計を求めるために必要な変数」に、「各項の差の2乗をどんどん上書きしている」ため、正しい計算結果が出ません。
実際に、[158, 157, 163, 157, 145]
の並びを変えるだけで、計算結果が変わってしまうと思います。
for height in monk_fish_team
のところで取り出されるheightはあくまで「身長」です。その変数に、「身長じゃないもの」は入れない方が良いです。
下記、検証に使ったコードです(配列の値を組み換え済)
# coding: utf-8
monk_fish_team=[145, 158, 157, 163, 157]
total=sum(monk_fish_team)
length=len(monk_fish_team)
mean=total/length
variance=0
for height in monk_fish_team:
variance+=(height-mean)**2
print("variance:" + str(variance))
variance=variance/length
print("result = " + str(variance))
for height in monk_fish_team:
print("before:" + str(height))
height=(height-mean)**2
print("after:" + str(height))
height=height/length
print("result2 = " + str(height))