質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

5回答

251閲覧

pythonのテキストでわからないことがあります

python_

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

1クリップ

投稿2019/05/08 14:03

monk_fish_team=[158,157,163,157,145]

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

variance=variance/length
variance

以上のリテラルが参考書(みんなのpython 第4版)の80ページにあるforを習ってそれを使って分散を計算するというものなんですがvarianceの変数が必要な意味が分かりません。variance以下

for height in monk_fish_team:
height=(height-mean)**2

height=height/length
height

でいいような気がしてよくわからないです。
要するにvarianceの変数をわざわざ作って0を当てはめる必要性がわからないんです。
どなたか解答していただけたら嬉しいです。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otolab

2019/05/08 14:06 編集

コードをそのまま文中に乗せるとスペースやタブが消えるので、 ``` で囲ってください。 読みづらいっす。
guest

回答5

0

for height in monk_fish_team: height=(height-mean)**2

ですかね?

heightはfor文が進むたびに値がmonk_fish_teamの中の設定されるので、for文の中の計算式で代入してもすぐにその値は更新されてしまいます。(また、スコープの問題もあります)

関数言語的にreduceなどをつかって計算するとイメージに近いコードになるかもしれないですが、そもそもfor文の解説をしている箇所とのことなので、そういう挙動をするのだと理解するのが正解だと思います。

投稿2019/05/08 14:11

otolab

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

まず、求めたい「期待される結果」を手計算で出します。

[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))

投稿2019/05/08 19:51

takepan1973

総合スコア821

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

python

1monk_fish_team=[158,157,163,157,145] 2 3total=sum(monk_fish_team) 4length=len(monk_fish_team) 5mean=total/length 6 7for height in monk_fish_team: 8 print(height) 9 height=(height-mean)**2 10 print(height) 11 12height=height/length 13height

で、実行してみるとvarianceが必要な理由がわかると思います。

実行確認していないので、エラー出たらごめんなさい。

投稿2019/05/08 14:51

yayakona

総合スコア69

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

数学の「分散」について調べてみてください。

投稿2019/05/08 14:13

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

実際にコードを実行してみるとわかりますが、結果が正しくありません。

投稿2019/05/08 14:09

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問