3 Övningskompendium Deskriptiv Statistik
3.1 Deskription
Uppgift 16
betyg <- c(1, 4, 4, 3, 2, 3, 3, 3, 5,
2, 3, 3, 3, 2, 4, 4, 3, 1,
2, 5, 3, 3, 4, 2, 3, 4, 2, 3)
mean(betyg)
## [1] 3
median(betyg)
## [1] 3
Det finns faktiskt ingen inbyggd funktion i R för typ-värde(!), men vi kan använda table()
för att hitta vad vi söker. 3 förekommer 12 gånger.
table(betyg)
## betyg
## 1 2 3 4 5
## 2 6 12 6 2
x <- table(betyg)
barplot(x)
Uppigift 17
husdjur <- c(rep(0,20), rep(1,15), rep(2,10), rep(3,5))
mean(husdjur)
## [1] 1
median(husdjur)
## [1] 1
x <- table(husdjur)
plot(cumsum(x), # cumsum för cumulative sum
type = "S", # "S" för "steps"
xlim = c(0,4), # Undre och övre gräns för x
ylim = c(0,50), # Undre och övre gräns för y
xlab = "Antal Husdjur" , # Text på x-axeln
ylab = "Summa Antal Familjer") # Text på y-axeln
segments(x0 = 0, y0 = 0, x1 = 0, y1 = 20)
segments(x0 = 0, y0 = 20, x1 = 1, y1 = 20)
segments(x0 = 0, y0 = 25,x1 = 1, y1 = 25,col = "red",lwd=2,lty = 6)
arrows(x0 = 1,y0 = 25,x1 = 1,y1 = 0, col = "red",lwd=2, lty = 6)
Uppgift 18
löner <- c(341000, 193000, 167000, 167000, 156000,
154000, 148000, 148000, 148000, 148000)
mean(löner)
## [1] 177000
median(löner)
## [1] 155000
table(löner)
## löner
## 148000 154000 156000 167000 193000 341000
## 4 1 1 2 1 1
barplot(table(löner)) # Sned fördelning -> använd median
Uppgift 21
Vi har följande tabell
Antal Olycksfall per dag | Frekvens |
---|---|
0 | 21 |
1 | 18 |
3 | 10 |
4 | 1 |
Givetvis kan vi skapa vektorn och använda mean()
och sd()
tabell <- c(rep(0,21),rep(1,18),rep(2,7),rep(3,3),rep(4,1))
mean(tabell)
## [1] 0.9
var(tabell)
## [1] 0.9897959
Men säg att vi hade fått en stor dataframe, och det hade varit för mycket jobb för att skriva en massa rep()
. Det vill säga, säg att någon gav oss df
nedan
df <- as.data.frame(cbind(c(0,1,2,3,4),c(21,18,7,3,1)))
colnames(df) <- c("olycksfall", "frekvens")
df
## olycksfall frekvens
## 1 0 21
## 2 1 18
## 3 2 7
## 4 3 3
## 5 4 1
Istället för att återskapa tabell
ovan (som förvisso är väldigt enkelt - bara använd table()
), så kan vi gå den långa vägen och använda.
\[\bar{x} = \frac{\sum{f_i x_i}}{n}\]
\[s^2 = \frac{\sum{f_i x_i^2}-\frac{\sum{(f_i x_i)}^2}{n}}{n-1}\]
n <- sum(df$frekvens)
f = df$frekvens
x = df$olycksfall
medelvärde = sum(f*x)/n
varians = (sum(f*x^2) - sum((f*x))^2/n) / (n-1)
medelvärde
## [1] 0.9
varians
## [1] 0.9897959
3.2 Spridningsdiagram och Korrelation
Uppgift 101
x <- as.data.frame(cbind(c(5500,6000,6500,6000,5000,6500,4500,5000),
c(41,38,35,40,44,38,45,42)))
colnames(x) <- c("Pris","Försäljning")
Vilket ger oss följande dataframe
head(x)
## Pris Försäljning
## 1 5500 41
## 2 6000 38
## 3 6500 35
## 4 6000 40
## 5 5000 44
## 6 6500 38
Korrelationsmatris
cor(x)
## Pris Försäljning
## Pris 1.0000000 -0.9426412
## Försäljning -0.9426412 1.0000000
Notera att vi egentligen inte behöver skriva type="p"
i plot()
nedan, eftersom detta är default när man använder funktionen på objekt som x
.
plot(x, type= "p" ,
xlab = "Pris (kr)",
ylab = "Försäljning (antal)",
pch=16) # För at få prickarna ifyllda
Gör precis samma sak för uppgift 102
Uppgift 105
dat <- cbind.data.frame(1:12,
c(3,4,6,2,5,6,5,4,7,6,5,4),
c(14,23,25,17,30,44,35,34,39,32,38,29),
c(23,30,29,26,35,58,30,50,55,45,44,34))
colnames(dat) <- c("person","X","Y","Z")
Z <- dat$Z
Y <- dat$Y
Såhär ser vår dataframe ut
head(dat)
## person X Y Z
## 1 1 3 14 23
## 2 2 4 23 30
## 3 3 6 25 29
## 4 4 2 17 26
## 5 5 5 30 35
## 6 6 6 44 58
Korrelationsmatris igen
cor(dat)
## person X Y Z
## person 1.0000000 0.3634301 0.6489737 0.5587045
## X 0.3634301 1.0000000 0.7407156 0.6456707
## Y 0.6489737 0.7407156 1.0000000 0.8650861
## Z 0.5587045 0.6456707 0.8650861 1.0000000
Vi ser att Y verkar ha högst korrelation med X, ungefär \(0.74\).
Linjär regression i R är enkelt. I funktionen lm()
anger du vilken data du vill använda, i vårt fall data = dat
, formulan skrivs på formen formula = y~z
. Ett intercept skattas per default, men kan undvikas genom att skriva -1
i formulan, i.e y~x-1
.
lm(Y ~ Z, dat)
##
## Call:
## lm(formula = Y ~ Z, data = dat)
##
## Coefficients:
## (Intercept) Z
## 4.7390 0.6604
plot(Z, Y, pch=16)
abline(lm(Y ~ Z, dat), col="red")
Uppgift 107
Förbered data
res <- cbind.data.frame(c("A","B","C","D","E","F"),
c(11.2, 11.4, 10.8, 10.9, 11.0 , 11.3),
c(676, 660, 685, 670, 690, 669))
colnames(res) <- c("pers","löp","hopp")
Beräkningar
cor(res$löp,res$hopp)
## [1] -0.695163
summary(res$löp)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.80 10.93 11.10 11.10 11.28 11.40
summary(res$hopp)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 660.0 669.2 673.0 675.0 682.8 690.0
y <- res$löp
x <- res$hopp
plot(x,y,
xlim = c(650,700),
ylim = c(10,12),
pch = 16,
ylab = "Löp (sek)",
xlab = "Hopp (cm)")
3.3 Tidsserier
Uppgift 401
y <-c(0.175, 0.249, 0.279, 0.376, 0.528, 0.781, 1.123, 1.681, 3.131)
t <- 1970:1978 - 1974
lm(y~t)
##
## Call:
## lm(formula = y ~ t)
##
## Coefficients:
## (Intercept) t
## 0.9248 0.3035
Uppgift 402
y <-c(0.175, 0.249, 0.279, 0.376, 0.528, 0.781, 1.123, 1.681, 3.131)
y <- ts(y,
start = 1970,
end = 1978,
frequency = 1)
plot.ts(y)
Vi försöker igen med en expoentiell trend.
y_prime = log(y,base = 10)
lm(y_prime~t)
##
## Call:
## lm(formula = y_prime ~ t)
##
## Coefficients:
## (Intercept) t
## -0.2170 0.1504
För att få tillbaka vårt önskade resulat (se lösningarna för detaljer) så löser vi
m <- lm(y_prime~t)
10^m$coefficients
## (Intercept) t
## 0.6067278 1.4139314