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

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

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

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

Q&A

解決済

2回答

2207閲覧

標準偏差・分散の四捨五入の丸めについて

200269km

総合スコア1

Python 3.x

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

0グッド

0クリップ

投稿2021/04/20 01:59

編集2021/04/20 12:36

前提・実現したいこと

下記コードのテストコードをpassさせたいです。

2種類属性の数値の分散と標準偏差を計算するコードです。

入力は

入力の一行目:これから入力される個数n
以降の入力(n個):2種類の数値

です。

具体的な入力値と予想される出力
それに誤っている私の出力です

##入力
入力値 行数: 6
5
299 6
327 5
178 0
432 2
437 2

##出力
pass
9164 96
5 2

誤っている出力(私)
9165 96
5 2

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

ひとつめの9164になるところ9165になってしまうのですが アルゴリズムがわかりません。

該当のソースコード

test.py

1import numpy as np 2import math 3import numpy 4from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_DOWN 5 6 7#math.sqrt(x) 8#numpy.sqrt(array) 配列の要素の平方根 9#https://www.mathpython.com/ja/python-number-ceil/ 10#数値の切り上げと切り下げ 11def num_round(x): 12 if (x*10)%10 >= 5: 13 x = str(x) 14 x = Decimal(x).quantize(Decimal('0'), rounding=ROUND_HALF_UP) 15 else: 16 x = Decimal(x).quantize(Decimal('0'), rounding=ROUND_HALF_DOWN) 17 return x 18 19n = int(input()) 20x = np.zeros(n) 21y = np.zeros(n) 22for i in range(n): 23 xi, yi = map(int, input().split()) 24 x[i] = xi 25 y[i] = yi 26 27aveX = int(sum(x)/n) 28aveY = int(sum(y)/n) 29#print(aveY) 30 31 32aveX2 =0 33aveY2 =0 34 35for i in range(n): 36 aveX2 += (x[i] -aveX)*(x[i] -aveX) 37 #print(aveX2) 38 aveY2 += (y[i] -aveY)*(y[i] -aveY) 39 #print(aveY2) 40 41### 重さの分散 42var_x = aveX2/n 43#print(var_x) 44### 重さの標準偏差 45std_x = math.sqrt(var_x) 46 47var_x = num_round(var_x) 48std_x = num_round(std_x) 49### 糖度の分散 50var_y = aveY2/n 51 52### 糖度の標準偏差 53std_y = math.sqrt(var_y) 54 55var_y = num_round(var_y) 56std_y = num_round(std_y) 57 58 59print(var_x, std_x) 60print(var_y, std_y)

試したこと

int(x)→round(x)→Decimalを試しました。

補足情報(FW/ツールのバージョンなど)

TechFulの練習問題です

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

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

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

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

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

ppaul

2021/04/20 08:30

>>> print(avg_x) 3 >>> print(avg_y) 335 のあとのコードを追加してください。
200269km

2021/04/20 12:37

反応ありがとうございます。 記述漏れのコードを書きました。
guest

回答2

0

ベストアンサー

何が間違っているのかですが、

output

1pass 29164 96 35 2

というのがもっとも変ですね。
統計学としてみると、分散と標準偏差は実数(浮動小数点数)で出てくるものであって整数にするというのは意味がありません。これが模範解答なのだとすると、出題者は統計学の素養がない人でしょう。

次に、なぜ計算が合わないかという点にもっとも影響しているのは、
aveY = int(sum(y)/n)
です。
これを
aveY = sum(y)/n
とすれば、

python

1>>> print(var_x, std_x) 25 2 3>>> print(var_y, std_y) 49164 96

となります。つまり、浮動小数点計算をやるときに、途中で整数化を行えば、当然のことながら間違った答えが出ます。

本来あるべき答えは

9164.24 95.73003708345672

です。

もしも、将来200269kmさんが、統計関連のソフトに関わったとき、分散や標準偏差を整数で出したとすると、とんでもない間違いになってしまいます。
そういう誤解を与えるような問題が出されているのだとすると、TechFulというものに関わるのはやめておいた方が良いというのが私の意見です。

投稿2021/04/20 14:04

ppaul

総合スコア24670

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

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

200269km

2021/04/21 01:00

aveY = int(sum(y)/n)がいけなかったのですね。 統計の計算プロセスの基本についての指摘も大変ためになりました。 自分で考えられるように、勉強の糧にしていきたいです。 お時間を取って、回答いただき、ありがとうございました。
guest

0

平均値を切捨てているのが問題なのでは?

Python

1#aveX = int(sum(x)/n) 2#aveY = int(sum(y)/n) 3aveX = sum(x)/n 4aveY = sum(y)/n

あと num_round() では 0.5 以上を四捨五入して 0.5 未満を五捨六入しようとしているように見えますが

Python

1 x = Decimal(x).quantize(Decimal('0'), rounding=ROUND_HALF_DOWN)

の Decimal(x) の x を str 型にしていないのは意図してなのでしょうか?

num_round() は単に小数点以下第一位を四捨五入する意図と思いますが

Python

1def num_round(x): 2 x = str(x) 3 x = Decimal(x).quantize(Decimal('0'), rounding=ROUND_HALF_UP) 4 return x

で良いのでは?

投稿2021/04/20 13:33

lehshell

総合スコア1156

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

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

200269km

2021/04/21 01:44

無駄な、コードを書いていたのですね。 ご指摘ありがとうございます。動作を確認しました。 お時間をいただいて、アドバイスをありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問