2016年3月20日日曜日

rJava : プログラミング(13) クラスタ分析

rjavaで二次医療圏のクラスタ化をしてみました。
流れとしては
1. DBに接続しデータを持ってくる(344医療圏×4項目)
2. R配列作成
3. Rで距離行列作成
4. クラスタを計算
5. 樹形図で表示

結果は表示できましたが、件数が多くなんだかわからない状態に。表示を工夫する必要があります。ひとまず出来たようでよかったです。





[Medical2_Cluster01.java]

import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;
import java.sql.*;
import java.util.Arrays;

public class Medical2_Cluster01 {

        public static void main(String[] args)
        {
                MySQL mysql = new MySQL();
                Rengine re = new Rengine( new String[]{"--no-save"}, false, null );
                ResultSet rs = mysql.selectZones();

                double values [][] = new double[344][4];
                int index = 0;
                try {
                        while(rs.next()){
                                values[index][0] = rs.getDouble("zone_nontrans")/rs.getDouble("zone_eventnum")*100;
                                values[index][1] = rs.getDouble("zone_dpc")/rs.getDouble("zone_eventnum")*100;
                                values[index][2] = rs.getDouble("zone_event4")/rs.getDouble("zone_totalnum")*100;
                                values[index][3] = rs.getDouble("zone_eventnum")/rs.getDouble("zone_population")*100;
                                System.out.println("Rate for Non-Transition("+rs.getString("id")+")"+values[index][0]);
                                System.out.println("Rate for DPC-Transition("+rs.getString("id")+")"+values[index][1]);
                                System.out.println("Rate for Contact more than 4 times("+rs.getString("id")+")"+values[index][2]);
                                System.out.println("Rate for Occurance of events("+rs.getString("id")+")"+values[index][3]);
                                System.out.println("");
                                index++;
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }

                StringBuffer buf1 = new StringBuffer();
                buf1.append("c_values<-c(");
                for(int i = 0; i < values.length; i++){
                        if(i == values.length-1)
                                buf1.append(values[i][0]+","+values[i][1]+","+values[i][2]+","+values[i][3]+")");
                        else
                                buf1.append(values[i][0]+","+values[i][1]+","+values[i][2]+","+values[i][3]+",");
                }
                String c_values = buf1.toString();
                re.eval(c_values);
                re.eval("colnames(c_values)<-c('non-trans','doc','4times,'event)");
                re.eval("c_values.d<-dist(c_values)");
                re.eval("c_values.h<-hclust(c_values.d)");
                REXP x1 = re.eval("round(c_values.d)");
                System.out.println(x1);

                re.eval("png('Medical2_Cluster01.png', 640, 480)");
                re.eval("plot(c_values.h)");
                re.eval("dev.off()");

                re.end();
        }
}


参考
http://midoriit.com/2014/05/r%E3%81%AB%E3%82%88%E3%82%8B%E7%B5%B1%E8%A8%88%E8%A7%A3%E6%9E%901.html
https://www1.doshisha.ac.jp/~mjin/R/28/28.html

0 件のコメント:

コメントを投稿