#Aufgabe 2

#Einlesen der Daten
euro <- read.table("europa.txt",header=T)
X.euro <- euro[,-1]

#a)

cov.euro <- cov(X.euro)
#Die PCA ist nicht skaleninvariant; hier sind die Varianzen sehr unterschiedlich,
#dh. es wird fast nur ober eine Rolle spielen. Daher sollte man zun�chst eine
#Skalierung durchf�hren, z.B. so dass alle Variablen die Varianz 1 haben
#(Standardisierung)


#b)

#Korrelationsmatrix = Kovarianzmatrix der standardisierten Variablen.
cor.euro <- cor(X.euro)

# Standardisiere Matrix => cov = cor
euro.stand<-scale(X.euro)
cov(euro.stand)
cor(euro.stand)
cor.euro

#PCA entspricht Spektralzerlegung der Kovarianzmatrix (bzw. hier Korrelationsmatrix;
#vgl. Vorlesung)
eigen.cor <- eigen(cor.euro)

#Anteil der durch die ersten beiden Hauptkomponenten erkl�rten Streuung
frac2 <- sum(eigen.cor$values[1:2])/sum(eigen.cor$values)
frac2
#84.25% der gesamten Streuung werden durch die ersten beiden Hauptkomponenten erkl�rt.

#c)

frac.expl <- cumsum(eigen.cor$values)/sum(eigen.cor$values)
frac.expl
#1. HK: 48.66% der Streuung
#1.+ 2. HK: 84.25% der Streuung (vgl. oben)
#1.+ 2.+ 3. HK: 93.58% der Streuung
#1. + ... + 4. HK: 100% der Streuung

#1. +2. HK enthalten 84.25% der Gesamtstreuung: diese beiden sollte man f�r
#notwendig erachten

#d)

#Matrix Q der Eigenvektoren
Q <- eigen.cor$vectors
p <- dim(Q)[2]

#Vektor f�r Namen
names <- names(X.euro)
par(mfrow = c(p,1))

#Balkendiagramm f�r jede Hauptkomponente
for (i in 1:p){
   if(all(Q[,i]<0)){
     Q[,i] <- -Q[,i]  #Vorzeichen�nderung
   }
   #Anordnung gem�� der absoluten Werte
   o <- rev(order(abs(Q[,i])))
   barplot(Q[o,i],names.arg = names[o])
   abline(h = 0)
}


#e)

#Wir betrachten die ersten beiden Hauptkomponenten. Die neuen Kovariablen erh�lt
#man wie folgt: y_1=a_1'x, y_2=a_2'x

#X.euro zun�chst standardisieren, da man auf Basis von Korrelationsmatrix arbeitet:
Y12 <- as.matrix(euro.stand) %*% eigen.cor$vectors[,1:2]

## Alternativ: Berechnung �ber princomp
PCEuro<-princomp(X.euro,cor=T)

#Indices f�r CH, BUL, D, PL
ind <- which(euro[,1]=="Schweiz"| euro[,1]=="Bulgarien")

Y12.sel <- Y12[ind,]
row.names(Y12.sel) <- as.character(euro[ind,1])
Y12.sel
## Alternativ: Berechnung �ber princomp
PCEuro$scores[ind,1:2] # numerische Abweichungen gegen�ber der L�sung mit princomp

#Interpretation: betrachte hierzu ersten und zweiten Eigenvektor
eigen.cor$vectors[,1:2]
## Alternativ: Berechnung �ber princomp
PCEuro$loadings


#sowie die urspr�nglichen Variablen

X.euro[ind,]

#-BUL: BIP niedrig, arbl hoch; also y_1 eher. klein, y_2 gro�
#-CH: BIP hoch, arbl niedrig; also y_1 hoch, y_2 eher. klein (umgekehrt)
#Die Einwohnerzahl ist fast gleich, bei der Fl�che ist BUL etwa 2.5mal so gro�
#(erkl�rt Unterschiede in Auspr�gung nach oben und unten).

#Das Ganze geht nat�rlich auch mit Hilfe der Funktion princomp()