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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

2回答

7719閲覧

CSVファイルの値を読み込み、平均値・中央値・標準偏差を計算した上で、別のCSVファイルに出力する

ranranrankocha

総合スコア8

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/07/26 11:26

編集2017/07/26 11:45

###前提・実現したいこと
適当な数字10個が入ったcsvファイルをjavaで読み込み、平均値・中央値・標準偏差を計算して、新たなcsvファイルに出力するプログラムを書いています。

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

平均値まではできたのですが、中央値・標準偏差のやり方がわかりません。 インターネットの情報をいろいろ試しましたが、全くの初心者なので、限界を感じています。

###該当のソースコード

public static void main(String[] args) { try { //データをうまく入出力できるとき String inputfile = "/Users/Documents/input.csv"; //インプットファイル名 BufferedReader br = new BufferedReader(new FileReader(inputfile)); String line = null; //1行ごとに読み込む変数を用意 int i=0; ArrayList<String> list = new ArrayList<String>(); for(i = 0 ; i < args.length ; i++) { list.add(args[i]); } int count=0; double ave = 0; double M =0; double stdev=0; while ((line = br.readLine()) != null) { //最終行になるまで読み込む ave += Double.valueOf(line); M += Double.valueOf(line); stdev += Double.valueOf(line); count++; } ave /= count;//平均の計算 M+=Math.pow(i-ave,2.0);//i(それぞれの数)-aveの2乗をnで割る stdev=Math.sqrt(M/count);//Mの平方根をとる br.close(); String outputfile = "/Users/Documents/output.csv"; //アウトプットファイル名 PrintWriter pw = new PrintWriter(new FileWriter(outputfile)); pw.println(ave); pw.println(stdev); pw.close(); } catch( IOException e ) { //データを入出力ができなかったとき System.out.println("データ入出力失敗"); } } }

###試したこと
配列を用意する

###補足情報(言語/FW/ツール等のバージョンなど)
Javaです

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

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

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

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

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

guest

回答2

0

全部まとめて一気にやろうとするから混乱します。順番に処理しましょう。
まずはデータを配列かリストかに格納しておきます。

  • 平均値: すべてのデータを合計して、データの個数で割る
  • 中央値: すべてのデータを昇順に並び替え、その真ん中に位置するデータ(偶数個の場合は中央2個の平均)
  • 標準偏差: 各データから平均値を引き、2乗したものを合計する。それをデータの個数で割り、正の平方根を取る

これをそれぞれコードで書けばいいだけの話です。

投稿2017/07/26 14:54

swordone

総合スコア20651

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

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

0

とりあえず、平均値を出す機能をメソッドとして分離してください。
そして、次の二つの配列を用意しましょう。

  • 値はそのまま、しかしソートした配列
  • 値を二乗した配列

前者の配列の長さをlengthとしたとき、中央値はその配列のlength/2番目の要素です。
本当は要素数の偶奇で処理を分けなければなりませんが、まず簡単な方法でやってみましょう。

次に、標準偏差を計算します。標準偏差は、分散の平方根です。
分散は、(2乗の平均 - 平均の2乗)で計算すればよいでしょう。

ご提示のコードでは、読み取りと同時に計算も試みているように見えます。
速度の観点ではともかく、可読性から言えば、最初に読み取りだけ行った方がよいです。
とりあえずやってみましょう。

重要

コードはバッククオート三つで括ってください。
よくわからない場合は、マークダウン記法について調べてみてください。

これをしていないと、付く回答も付きません。

投稿2017/07/26 11:35

編集2017/07/26 11:42
LouiS0616

総合スコア35660

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

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

ranranrankocha

2017/07/26 11:46

バッククオートの件、ありがとうございます。????
LouiS0616

2017/07/26 11:48

これはお節介かもしれませんが... 行頭以外でタブを用いるのもやめた方がいいです。 なぜなら、環境によってその幅が異なるからです。スペースを用いてください。 どのIDEを使っているが存じ上げませんが、置換できるようならやってみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問