#======================================================
#	1 Ｒ入門
#======================================================
#======================================================
#	1.1 はじめに
#======================================================

#R起動後、最初にやるべきこと
#まず、「ファイル＞ディレクトリの変更」で、
#作業ディレクトリを「c:\r\users\[プロジェクト名]」に変更しておく。

#----------<スクリプト・ファイル>----------

#これは、コメントです。
print("Hello World!") #これ以降の部分も、コメントです。

#======================================================
#	1.2 Ｒによる数値計算
#======================================================

#----------<算術演算子>----------
#加減乗除とべき乗「+」、「-」、「*」、「/」及び「^」

#整数商
10 %/% 3
#剰余
10 %% 3

#----------<論理演算子>----------

1 == 2 #等しい
1 != 2 #等しくない
T & F  #AND
T | F  #OR

#----------<変数への値の代入>----------

a <- 3
a
x = 7
x
x = x + 2
b <- 5 -> c
b
c
練習 <- 1
練習
00練習 <- 1

#----------<ベクトルと数列>----------

#任意のベクトル
a <- c(2, 10, 7, 12, 9, 3, 1, 5, 8, 4, 11, 6)
a
length(a) #ベクトルの長さ（要素の数）

#整数列
1:10
5:-5

#任意の等差数列
seq(from=0.1, to=1.0, by=0.2) #公差0.2を指定
seq(from=0, to=5, length=10)　#長さ10を指定

#----------<行列>----------

#行列
A <- matrix(c(2, 10, 7, 12, 9, 3, 1, 5, 8, 4, 11, 6), nrow=4, ncol=3)
A
#行から並べる。
(B <- matrix(c(2, 10, 7, 12, 9, 3, 1, 5, 8, 4, 11, 6), 4, 3, byrow=T))

dim(A) #行列の次元を調べる。

#単位行列
diag(3)

#対角行列
(D <- diag(2:4))

#トレース
sum(diag(D))

#行列の転置
A
t(A)

#行列の要素ごとの積
A * B

#行列積
(C <- t(A) %*% B)

#逆行列
(C.inv <- solve(C))
#検算
C.inv %*% C
#数字を丸める。
zapsmall(C.inv %*% C)

#----------<リスト>----------

#リスト
(list.a <- list(名称="分析結果", a=a, A=A))

names(list.a) #リストの各成分名を調べる。

list.a$A[2, 1] #リストのある成分のある要素を抽出する。

#----------<データフレーム>----------
#各列が同じ長さのリスト
#リストなので数値、因子、文字列など様々な属性のデータを含められる。
#Excelのワークシートのようなもの

#----------<現在の作業スペースのオブジェクト>----------

#オブジェクトの一覧
ls()

#オブジェクトの削除
rm(a, A)
ls()

#オブジェクトの一括削除
rm(list = ls())
ls()

#------------<Accessからデータをインポート>------------

library(RODBC) #パッケージをロードする。

#Accessからテーブルをインポートして、データフレームに代入する。
channel <- odbcConnectAccess2007("C:/r/users/book/data/国勢調査2010.accdb")
都道府県 <- sqlQuery(channel, "Select * from 都道府県")
市区町村 <- sqlQuery(channel, "Select * from 市区町村")
close(channel)

#インポートしたデータの確認
head(市区町村) #最初の６行
tail(市区町村) #最後の６行

#データフレームの要約
summary(市区町村)

#添字抽出
names(都道府県)  #変数の列番号を確認

年齢別人口.2010 <- 都道府県[ ,c(2, 9:11)]   #番号による抽出
head(年齢別人口.2010)

東京.2010 <- 市区町村[市区町村$都道府県=="東京都", ] #論理式による抽出
head(東京.2010)

#------------<Excelからデータをインポート>------------

#csvファイルの読み込み
AAPL <- read.csv("C:/r/users/book/data/AAPL.csv", row.names=1)
head(AAPL)
tail(AAPL)

#------------<各種の集計方法>------------

#集計用の変数を作成する。
市区町村$市区町村別[市区町村$市などの別==0] <- "区"
市区町村$市区町村別[市区町村$市などの別==2] <- "市"
市区町村$市区町村別[市区町村$市などの別==3] <- "町村"

#単純集計
(tab <- table(市区町村$市区町村別))

#連続変数の単純集計
quantile(市区町村$平均年齢) #区分する変数の分布を確認
bks <- seq(from=35, to=65, by=5) #連続変数の区分点
table(cut(市区町村$平均年齢, breaks=bks))

table(cut(市区町村$平均年齢, breaks=bks, right=F))　#「○○以上○○未満」

#クロス集計
(tab2 <- table(市区町村$都道府県, 市区町村$市区町村別))

#都道府県のコードブックを作成
コード <- list(都道府県 = 
	c("北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県",
	"茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県",
	"新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県",
	"静岡県","愛知県","三重県","滋賀県","京都府","大阪府","兵庫県",
	"奈良県","和歌山県","鳥取県","島根県","岡山県","広島県","山口県",
	"徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県",
	"熊本県","大分県","宮崎県","鹿児島県","沖縄県")) 

#再集計
(tab2 <- table(factor(市区町村$都道府県, levels=コード$都道府県), 
	市区町村$市区町村別))

#集計対象を絞り込む。
コード$首都圏 <- c("埼玉県","千葉県","東京都","神奈川県")
idx <- 市区町村$都道府県 %in% コード$首都圏 #該当する都道府県のインデックス

#絞り込んだ集計結果
(tab3 <- table(factor(市区町村$都道府県[idx], levels=コード$首都圏), 
	市区町村$市区町村別[idx]))

#関数apply
#各列の標準偏差
apply(市区町村[ ,c("人口密度", "平均年齢")], MARGIN=2, FUN=sd)

#メディアン絶対偏差
apply(市区町村[ ,c("人口密度", "平均年齢")], 2, mad)

#関数tapplyとsapply
#単純集計
#市区町村平均の都道府県ごとの単純平均（誤り）
total <- tapply(市区町村$平均年齢, INDEX=factor(市区町村$都道府県,
        levels=コード$都道府県), FUN=mean)
total

#市区町村平均の都道府県ごとの加重平均（正しい）
total <- sapply(split(市区町村, 
       factor(市区町村$都道府県,levels=コード$都道府県)),
       function(x) weighted.mean(x$平均年齢, x$人口総数))
total

#別解１：tapplyを引き続き使う方法
tapply(seq(along=市区町村$平均年齢), 
        INDEX=factor(市区町村$都道府県, levels=コード$都道府県), 
	 function(i, v=市区町村$平均年齢, w=市区町村$人口総数) 
	         weighted.mean(v[i], w[i]))

#別解２：パッケージplyrを使う方法
library(plyr)
unlist(dlply(市区町村, "都道府県",
	function(x) weighted.mean(x$平均年齢, x$人口総数)))[コード$都道府県]

#クロス集計
#クロス集計における単純平均（誤り）
cross <-  tapply(市区町村$平均年齢,
        INDEX=list(factor(市区町村$都道府県, levels=コード$都道府県),
        市区町村$市区町村別), FUN=mean)
cross

#クロス集計における加重平均（正しい）
cross <- sapply(split(市区町村, 
	list(factor(市区町村$都道府県, levels=コード$都道府県),
		市区町村$市区町村別)),
	function(x) weighted.mean(x$平均年齢, x$人口総数))
cross <- matrix(cross, nrow=47)　#後処理
dimnames(cross) <- list(コード$都道府県, c("区", "市", "町村"))

#別解：パッケージplyrとreshape2を使う方法
df <- ddply(市区町村, .(都道府県=factor(都道府県, levels=コード$都道府県), 
        市区町村別),
        function(x) weighted.mean(x$平均年齢, x$人口総数))
library(reshape2)
cross <- dcast(df, 都道府県~市区町村別)

#両データの結合
tab3 <- cbind(cross, total)　#列結合
tab3

#------------<作業スペースの保存>------------
ls()

#不要なファイルを削除
rm(list=ls()[1:9]) #不要なファイルの番号は、慎重に確認すること
ls()

#ファイル＞作業スペースの保存を実行

#======================================================
#	1.3 行列の分解
#======================================================

#------------<QR分解>------------

A <- matrix(c(2, 10, 7, 12, 9, 3, 1, 5, 8, 4, 11, 6), nrow=4, ncol=3)
A
QR <- qr(A)                 #QR分解
(Q <- qr.Q(QR,complete=T))  #Q（n×n）の取得
(R <- qr.R(QR,complete=T))  #R（n×m）の取得
zapsmall(Q %*% t(Q))        #直交行列
Q %*% R                     #検算（= A）

#------------<固有値分解>------------

(S <- cov(A))  #分散共分散行列
(eigen.S <- eigen(S))  #固有値分解

U <- eigen.S$vectors   #固有ベクトル
Lambda　<- diag(eigen.S$values)  #固有値
U %*% Lambda %*% t(U)  #検算（= S）

#------------<特異値分解>------------

(svd.A <- svd(A))  #特異値分解

ATA <- t(A) %*% A  #積和行列
eigen.ATA <- eigen(ATA) #固有値分解
sqrt(eigen.ATA$values)  #固有値の平方根

svd.A$u %*% diag(svd.A$d) %*% t(svd.A$v) #検算（= A）

#======================================================
#	1.4 確率と乱数
#======================================================

#----------<確率と乱数>----------

xx <- seq(-4, 4, length=200)
p <- seq(0, 1, length=200)
op <- par(mfrow=c(2, 2))
plot(xx, dnorm(xx), type="l", main="密度関数")
plot(xx, pnorm(xx), type="l", main="累積分布関数")
plot(p, qnorm(p), type="l", main="分位点関数")
hist(rnorm(10000), main="乱数")
par(op)
