R - 主成分行列

Section 1.8

次のデータを使って、分散共分散行列から主成分分析をしてみる

No. 身長 体重
1 151 48
2 164 53
3 146 45
4 158 61

Rで記述してみると...

身長 <- c(151, 164, 146, 158)
体重 <- c(48, 53, 45, 61)

data <- data.frame(身長, 体重)

result <- matrix(0, 5, 2)
rownames(result) <- c("身長", "体重", "固有値", "寄与率", "累積寄与率")
colnames(result) <- c("第1主成分", "第2主成分")

data.pc <- prcomp(data) #主成分分析

result[1:2,] <- data.pc$rotation                  #主成分
result[3,]   <- data.pc$sdev^2                    #固有値
result[4:5,] <- summary(data.pc)$importance[2:3,] #寄与率

実行して、結果(result)を表示してみると...

1主成分  第2主成分
身長        0.7654095 -0.6435435
体重        0.6435435  0.7654095
固有値     94.4099601 16.7567066
寄与率      0.8492700  0.1507300
累積寄与率  0.8492700  1.0000000

補足

相関行列から主成分分析をするには、関数 prcomp() の引数に scale=T を指定すればよいっぽい。

data.pc <- prcomp(data, scale=T) #主成分分析

結果はこうなる。

1主成分  第2主成分
身長       0.7071068 -0.7071068
体重       0.7071068  0.7071068
固有値     1.6931597  0.3068403
寄与率     0.8465800  0.1534200
累積寄与率 0.8465800  1.0000000

しかし、分散共分散行列からの主成分分析と相関行列からの主成分分析をどう使い分ければよいのかしらん?軽く調べたけどまだしっくりこず...

参考

入門はじめての多変量解析

入門はじめての多変量解析

R - 相関行列

Section 1.8

次のデータを使って、相関行列を求めてみる

No. 身長 体重
1 151 48
2 164 53
3 146 45
4 158 61

Rで記述してみると...

身長 <- c(151, 164, 146, 158)
体重 <- c(48, 53, 45, 61)

data <- data.frame(身長, 体重)

result <- cor(data) #相関行列

実行して、結果(result)を表示してみると...

          身長      体重
身長 1.0000000 0.6931597
体重 0.6931597 1.0000000

参考

入門はじめての多変量解析

入門はじめての多変量解析

R - 分散共分散行列

Section 1.8

次のデータを使って、分散共分散行列を求めてみる

No. 身長 体重
1 151 48
2 164 53
3 146 45
4 158 61

Rで記述してみると...

身長 <- c(151, 164, 146, 158)
体重 <- c(48, 53, 45, 61)

data <- data.frame(身長, 体重)

result <- var(data) #分散共分散行列

実行して、結果(result)を表示してみると...

      身長     体重
身長 62.25 38.25000
体重 38.25 48.91667

参考

入門はじめての多変量解析

入門はじめての多変量解析

R - データの標準化

Section 1.8

次のデータを使って、データの標準化をしてみる

No. 身長 体重
1 151 48
2 164 53
3 146 45
4 158 61

Rで記述してみると...

身長 <- c(151, 164, 146, 158)
体重 <- c(48, 53, 45, 61)

data <- data.frame(身長, 体重)

result <- scale(data)[,] #データの標準化
rownames(result) <- rownames(data)

実行して、結果(result)を表示してみると...

        身長       体重
1 -0.4752932 -0.5361704
2  1.1723899  0.1787235
3 -1.1090174 -0.9651067
4  0.4119208  1.3225537

参考

入門はじめての多変量解析

入門はじめての多変量解析

R - 分散

入門はじめての多変量解析」の内容をもとに多変量解析をRでお勉強していこかと

Section 1.8

次のデータを使って、平均、分散、標準偏差を求めてみる

No. 身長 体重
1 151 48
2 164 53
3 146 45
4 158 61

Rで記述してみると...

身長 <- c(151, 164, 146, 158)
体重 <- c(48, 53, 45, 61)

data <- data.frame(身長, 体重)

result <- matrix(0, 2, 3)
rownames(result) <- c("身長", "体重")
colnames(result) <- c("平均", "分散", "標準偏差")

result[,1] <- mean(data)       # 平均
result[,2] <- diag(var(data))  # 分散
result[,3] <- sd(data)         # 標準偏差

実行して、結果(result)を表示してみると...

       平均     分散 標準偏差
身長 154.75 62.25000 7.889867
体重  51.75 48.91667 6.994045

補足

分散には不偏分散と標本分散があるみたく、Rの関数 var() は不偏分散を求める関数とのこと。で、標本分散を求めるには、次のような関数をユーザで定義すればよいっぽい。

varp <- function(x) { var(x) * (length(x)-1) / length(x) }

参考

入門はじめての多変量解析

入門はじめての多変量解析

foursqure のログの保存し方1

Google App Engine for Java 上で Twilogfoursquare 版(自分用)を OAuth 2.0 のお勉強も兼ねて作成してみることに...途中で投げ出すかも

アプリケーションの登録

  1. ログ保存アプリケーションのアプリケーション登録申請を行う
    • 「CALLBACK URL」には、OAuth 2.0 認証時に foursquare からのコールバックを受信するサーブレットのURLを指定する
  2. 「CLIENT ID」と「CLIENT SECRET」を保存する

認証画面へのリダイレクト

Authentication - foursquare APIv2 の「2. Obtain an access token」を参考に認証画面へリダイレクトするサーブレットを作成

import java.io.IOException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Signin4sqServlet 
    extends HttpServlet {

    private final static String CALLBACK_URL = "{CALLBACK URL}";
    private final static String CLIENT_ID = "{CLIENT ID}";
	
    public void doGet(HttpServletRequest req, HttpServletResponse res)
        throws IOException {
		
        String url = "https://ja.foursquare.com/oauth2/authorize";
        url += "?client_id=" + CLIENT_ID;
        url += "&response_type=code";
        url += "&redirect_uri=" + CALLBACK_URL;

        res.sendRedirect(url);
	
    }

}

HTTP GET リクエストの送信

Google App Engine for Java 上では java.net.Socket の実装がないため HttpClient使えないっぽ、そこでHTTP GET リクエストを送信するユーティリティを作成

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class HttpGet {
	
    private URL url_;
	
    private HttpURLConnection con_;
	
    private InputStream in_;
	
    public HttpGet(String url) 
        throws MalformedURLException {
		
        url_ = new URL(url);
	
    }

    public void open() 
        throws IOException {
		
        if(con_ != null) {
            return;
        }
		
        con_ = (HttpURLConnection) url_.openConnection();
        con_.setRequestProperty("Content-type", "text/xml");
        con_.setRequestMethod("GET");
        con_.setConnectTimeout(60000);
		
    }
	
    public void close() 
        throws IOException {
		
        if(in_ != null) {
            in_.close();
            in_ = null;
        }
		
        if(con_ != null) {
            con_.disconnect();
            con_ = null;
        }

    }
	
    public InputStream execute() 
        throws IOException {
		
        this.open();
		
        in_ = con_.getInputStream();
		
        return in_;
	    
    }
	
}

アクセストークンの取得

Authentication - foursquare APIv2 の「2. Obtain an access token」を参考に foursquare からのコールバックを受信してアクセストークンを取得するサーブレット(アプリケーションの登録の際に「CALLBACK URL」で指定したサーブレット)を作成、JSON の解析には JSONIC を利用

import java.io.IOException;
import java.util.Map;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.arnx.jsonic.JSON;

@SuppressWarnings("serial")
public class Callback4sqServlet 
    extends HttpServlet {

    private final static String CALLBACK_URL = "{CALLBACK URL}";
    private final static String CLIENT_ID = "{CLIENT ID}";
    private final static String CLIENT_SECRET = "{CLIENT SECRET}";
	
    public void doGet(HttpServletRequest req, HttpServletResponse res)
        throws IOException {
		
        String code = req.getParameter("code");
		
	String accessToken = _getAccessToken(code);

    }
	
    private String _getAccessToken(String code) 
        throws IOException {
		
        String url = "https://ja.foursquare.com/oauth2/access_token";
        url += "?client_id=" + CLIENT_ID;
        url += "&client_secret=" + CLIENT_SECRET;
        url += "&grant_type=authorization_code";
        url += "&redirect_uri=" + CALLBACK_URL;
        url += "&code=" + code;

        HttpGet httpGet = new HttpGet(url);
		
        Map map = (Map)JSON.decode(httpGet.execute());
		
        httpGet.close();
		
        return map.get("access_token").toString();
		
    }
	
}