この例ではカンマ区切りの名前と点数 の行からなるデータを読み込んで,平均,分散,偏差,標準偏差そして偏差値を計算する.
package org.tanuneko; import com.google.common.base.Function; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.io.Files; import com.google.common.io.LineProcessor; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.util.List; import java.util.stream.Stream; public class STDDev { public static void main(String args[]) throws Exception { new STDDev(); } public STDDev() throws IOException { File scoreFile = new File(STDDev.class.getClassLoader().getResource("score.txt").getPath()); ImmutableList<Record> rec = Files.asCharSource(scoreFile, Charset.defaultCharset()) .readLines(new LineProcessor<ImmutableList<Record>>() { List<Record> results = Lists.newArrayList(); @Override public boolean processLine(String line) throws IOException { List<String> elems = Splitter.on(",").splitToList(line); Preconditions.checkState(elems.size() == 2); results.add(new Record(elems.get(0), Integer.parseInt(elems.get(1)))); return true; } @Override public ImmutableList<Record> getResult() { return ImmutableList.copyOf(results); } }); int totalScore = rec.stream().mapToInt(x->x.getScore()).sum(); double avg = totalScore / rec.size(); rec.stream().forEach(x->x.setDev(x.getScore() - avg)); double v = calcVariation(rec); double d = calcStddev(rec); System.out.println("total:" + totalScore + ", avg:" + avg); System.out.println("variation:" + v); System.out.println("stddev:" + d); System.out.println(checkDev(rec)); rec.stream().forEach(x -> { x.setScoreDev(50 + 10 * (x.getDev()/d)); }); System.out.println(rec); } private double calcVariation(ImmutableList<Record> rec) { return rec.stream().mapToDouble(x->x.getDev()) .reduce(0, (x,y)-> x + Math.pow(y, 2)) / rec.size(); } private double calcStddev(ImmutableList<Record> rec) { return Math.sqrt(calcVariation(rec)); } private boolean checkDev(ImmutableList<Record> rec) { double d = rec.stream().mapToDouble(x->x.getDev()) .sum(); System.out.println(d); return d == 0; } } class Record { private String name; private int score; private double dev; private double scoreDev; public Record(String name, int score) { this.name = name; this.score = score; dev = scoreDev = 0d; } public String getName() { return name; } @Override public String toString() { return MoreObjects.toStringHelper(this) .add("name", name) .add("score", score) .add("dev", dev) .add("score dev", scoreDev) .toString(); } public int getScore() { return score; } public double getDev() { return dev; } public void setDev(double dev) { this.dev = dev; } public double getScoreDev() { return scoreDev; } public void setScoreDev(double scoreDev) { this.scoreDev = scoreDev; } }
0 件のコメント:
コメントを投稿