Bruker data fra levekårsundersøkelsen i Bergen. Data er tilgjengelig som en pdf fra Bergen kommune sine nettsider.
# Dataloading and preparations
library(ggplot2) # loading ggplot for use in plotting
library(foreign) # loading foreign for SPSS import
library(xtable) # for describing data
levekar <- read.spss("data.sav", to.data.frame = TRUE, reencode = TRUE)
scatterlabels <- c("Sosialhjelp til unge",
"Barnevernstilfeller",
"Lav utdanning",
"Median bruttoinnt.",
"Barnefattigdom",
"Barneflytting",
"Kommunale boliger",
"Kriminalitet",
"Uførepensjon",
"Sykefravær",
"Dødelighet")
scattersub <- data.frame(levekar$sosialhjelptilunge,
levekar$barnevernstilfeller,
levekar$lavutdannign,
levekar$medianbruttoinntekt,
levekar$barnefattigdom,
levekar$barneflytting,
levekar$kommunaleboliger,
levekar$kriminalitet,
levekar$uforepensjon,
levekar$sykefraver,
levekar$dodelighet)
names(scattersub) <- scatterlabels
# Subsetting data
income <- data.frame(levekar$medianbruttoinntekt,
levekar$sosialhjelptilunge,
levekar$barnevernstilfeller,
levekar$barnefattigdom,
levekar$barneflytting,
levekar$kommunaleboliger,
levekar$kriminalitet,
levekar$dodelighet)
incomelabs <- c("Median bruttoinntekt",
"Sosialhjelp til unge",
"Barnevernstilfeller",
"Barnefattigdom",
"Barneflytting",
"Kommunale boliger",
"Kriminalitet",
"Dødelighet")
names(income) <- incomelabs
education <- data.frame(levekar$lavutdannign,
levekar$sosialhjelptilunge,
levekar$barnevernstilfeller,
levekar$barnefattigdom,
levekar$barneflytting,
levekar$kommunaleboliger,
levekar$kriminalitet,
levekar$dodelighet)
edulabs <- c("Lav utdanning",
"Sosialhjelp til unge",
"Barnevernstilfeller",
"Barnefattigdom",
"Barneflytting",
"Kommunale boliger",
"Kriminalitet",
"Dødelighet")
names(education) <- edulabs
Bruker xtable sin html funksjon for å beskrive datasettet direkte i tabellform.
print(xtable(levekar[1:13]), type="html",include.rownames=FALSE)
| id | sone | sosialhjelptilunge | barnevernstilfeller | lavutdannign | medianbruttoinntekt | barnefattigdom | barneflytting | kommunaleboliger | kriminalitet | uforepensjon | sykefraver | dodelighet |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 36.00 | Alvøy | 3.70 | 1.90 | 17.60 | 353000.00 | 2.40 | 3.20 | 0.00 | 9.00 | 2.30 | 6.60 | 7.10 |
| 11.00 | Arna | 5.00 | 4.30 | 18.50 | 322800.00 | 4.20 | 2.60 | 2.30 | 7.00 | 3.70 | 6.90 | 5.90 |
| 2.00 | Breistein | 5.70 | 3.40 | 22.50 | 318000.00 | 3.80 | 4.00 | 1.20 | 11.00 | 4.90 | 6.90 | 5.70 |
| 44.00 | Bønesskogen | 2.70 | 2.40 | 12.60 | 367600.00 | 3.40 | 4.50 | 0.90 | 7.00 | 2.30 | 5.30 | 5.10 |
| 12.00 | Eidsvåg | 4.00 | 2.60 | 13.80 | 343900.00 | 4.20 | 5.20 | 0.00 | 13.00 | 2.50 | 5.50 | 5.40 |
| 10.00 | Espeland | 9.20 | 3.80 | 23.50 | 308000.00 | 3.30 | 8.80 | 0.00 | 9.00 | 2.70 | 8.50 | 5.10 |
| 50.00 | Fanabygda | 2.50 | 4.20 | 15.70 | 350500.00 | 4.00 | 3.70 | 1.00 | 9.00 | 2.10 | 5.10 | 5.90 |
| 29.00 | Fantoft | 1.10 | 2.60 | 10.90 | 270000.00 | 10.80 | 24.30 | 2.00 | 4.00 | 2.10 | 5.00 | 7.70 |
| 15.00 | Fjellsiden nord | 3.80 | 5.60 | 12.30 | 335200.00 | 5.40 | 8.80 | 2.80 | 12.00 | 2.00 | 5.40 | 7.20 |
| 16.00 | Fjellsiden sør | 1.10 | 3.00 | 7.00 | 392100.00 | 4.10 | 9.90 | 0.30 | 8.00 | 1.30 | 4.10 | 5.20 |
| 8.00 | Flaktveit | 4.20 | 4.80 | 22.60 | 322400.00 | 7.30 | 6.50 | 1.90 | 8.00 | 3.50 | 8.10 | 6.60 |
| 48.00 | Flesland | 2.70 | 3.10 | 16.30 | 346800.00 | 3.20 | 5.70 | 0.00 | 9.00 | 1.70 | 6.10 | 5.40 |
| 33.00 | Godvik | 2.70 | 3.90 | 18.40 | 348500.00 | 4.70 | 3.90 | 2.30 | 11.00 | 2.60 | 6.40 | 6.20 |
| 39.00 | Gravdal | 4.10 | 3.40 | 18.60 | 321200.00 | 4.70 | 6.80 | 0.20 | 8.00 | 2.00 | 6.90 | 6.60 |
| 9.00 | Gullfjellet | 2.90 | 4.50 | 23.20 | 303400.00 | 3.40 | 5.30 | 0.30 | 7.00 | 2.70 | 7.60 | 4.20 |
| 7.00 | Haukedal | 3.50 | 4.30 | 17.60 | 327200.00 | 3.60 | 7.60 | 0.50 | 8.00 | 3.90 | 6.60 | 7.00 |
| 13.00 | Hellen | 3.90 | 2.40 | 13.60 | 329200.00 | 4.70 | 5.00 | 1.70 | 8.00 | 2.10 | 5.60 | 7.70 |
| 37.00 | Hetlevik | 2.70 | 4.60 | 23.10 | 330100.00 | 3.50 | 8.80 | 0.10 | 12.00 | 2.50 | 6.80 | 6.90 |
| 3.00 | Hordvik | 2.60 | 2.20 | 17.50 | 345100.00 | 3.20 | 3.20 | 0.00 | 7.00 | 2.60 | 7.20 | 5.20 |
| 35.00 | Kjøkkelvik | 3.90 | 5.90 | 22.50 | 334400.00 | 3.60 | 6.90 | 0.50 | 10.00 | 3.00 | 6.70 | 5.80 |
| 22.00 | Kronstad | 4.20 | 5.00 | 13.90 | 332600.00 | 6.70 | 10.40 | 2.60 | 12.00 | 1.80 | 4.40 | 6.20 |
| 45.00 | Kyrkjetangen | 2.00 | 2.20 | 10.70 | 365200.00 | 3.40 | 6.50 | 0.40 | 6.00 | 2.20 | 5.30 | 6.90 |
| 40.00 | Laksevåg | 7.20 | 7.60 | 22.30 | 296600.00 | 12.30 | 10.70 | 5.10 | 15.00 | 3.30 | 6.00 | 7.40 |
| 23.00 | Landås | 4.10 | 3.70 | 10.80 | 332300.00 | 2.90 | 8.00 | 1.40 | 7.00 | 1.90 | 5.50 | 6.10 |
| 38.00 | Loddefjord | 3.40 | 8.40 | 32.30 | 294100.00 | 9.30 | 9.50 | 0.60 | 9.00 | 5.10 | 9.00 | 9.90 |
| 24.00 | Minde | 6.90 | 5.30 | 15.00 | 312800.00 | 7.80 | 8.40 | 2.80 | 12.00 | 1.40 | 6.50 | 5.40 |
| 4.00 | Mjølkeråen | 5.90 | 3.80 | 24.20 | 304800.00 | 6.90 | 4.10 | 2.80 | 10.00 | 4.40 | 8.00 | 5.40 |
| 6.00 | Morvik | 3.10 | 2.70 | 14.60 | 346500.00 | 3.10 | 4.00 | 0.20 | 9.00 | 3.40 | 5.60 | 4.80 |
| 27.00 | Nattlandsfjellet | 3.50 | 1.70 | 6.40 | 390500.00 | 1.90 | 5.80 | 0.10 | 4.00 | 2.00 | 4.50 | 4.10 |
| 31.00 | Nesttun | 5.00 | 5.10 | 15.80 | 330600.00 | 3.40 | 5.80 | 1.30 | 9.00 | 3.20 | 6.10 | 6.70 |
| 42.00 | Nordre Fyllingen | 4.60 | 3.80 | 22.40 | 311100.00 | 4.40 | 8.50 | 1.00 | 8.00 | 4.50 | 7.40 | 8.00 |
| 1.00 | Nyborg | 4.70 | 4.40 | 20.70 | 315700.00 | 7.70 | 6.70 | 1.80 | 8.00 | 3.20 | 7.10 | 6.20 |
| 18.00 | Nygårdsh./Møhlenpris | 4.70 | 11.00 | 14.20 | 323100.00 | 14.70 | 11.40 | 6.10 | 11.00 | 1.90 | 4.40 | 10.30 |
| 34.00 | Olsvik | 4.80 | 8.20 | 27.60 | 310600.00 | 7.40 | 7.20 | 3.60 | 9.00 | 5.70 | 8.00 | 6.70 |
| 28.00 | Paradis | 2.40 | 2.90 | 9.60 | 366800.00 | 5.50 | 6.50 | 1.30 | 9.00 | 2.00 | 4.80 | 4.20 |
| 51.00 | Rolland | 3.70 | 1.70 | 17.10 | 338900.00 | 3.80 | 3.40 | 0.70 | 9.00 | 2.60 | 6.10 | 4.90 |
| 47.00 | Rå | 2.10 | 2.40 | 9.90 | 381600.00 | 2.60 | 5.70 | 0.80 | 6.00 | 1.70 | 5.10 | 4.60 |
| 46.00 | Sandsli | 3.00 | 3.80 | 13.90 | 362500.00 | 3.70 | 4.70 | 3.40 | 10.00 | 2.30 | 5.20 | 8.20 |
| 14.00 | Sandviken | 4.80 | 3.20 | 15.00 | 328400.00 | 8.10 | 7.90 | 2.80 | 11.00 | 2.20 | 5.30 | 8.10 |
| 19.00 | Sentrum | 5.50 | 7.10 | 14.00 | 304000.00 | 13.90 | 19.00 | 1.20 | 15.00 | 1.40 | 4.80 | 7.40 |
| 30.00 | Skjold | 3.00 | 4.20 | 13.10 | 349300.00 | 5.00 | 7.10 | 2.40 | 9.00 | 2.50 | 5.10 | 5.50 |
| 25.00 | Slettebakken | 9.40 | 9.90 | 19.90 | 293200.00 | 23.00 | 12.90 | 9.70 | 12.00 | 3.40 | 5.80 | 6.50 |
| 32.00 | Smørås | 2.90 | 3.50 | 14.40 | 357300.00 | 3.30 | 4.70 | 0.20 | 6.00 | 2.50 | 6.00 | 4.80 |
| 20.00 | Solheim nord | 10.60 | 10.40 | 27.30 | 258400.00 | 18.90 | 20.40 | 12.40 | 18.00 | 3.50 | 4.90 | 9.40 |
| 21.00 | Solheim sør | 10.60 | 6.40 | 19.00 | 290200.00 | 15.10 | 24.20 | 5.60 | 17.00 | 1.80 | 6.50 | 7.80 |
| 26.00 | Sædalen | 3.80 | 2.80 | 12.10 | 364700.00 | 4.40 | 6.40 | 1.90 | 8.00 | 2.20 | 5.20 | 5.30 |
| 43.00 | Søndre Fyllingen | 3.10 | 3.40 | 20.40 | 315700.00 | 4.00 | 4.70 | 1.90 | 10.00 | 4.30 | 7.50 | 5.90 |
| 17.00 | Vågen | 5.80 | 5.80 | 13.90 | 311700.00 | 13.80 | 9.90 | 1.00 | 13.00 | 1.30 | 4.40 | 6.90 |
| 5.00 | Ytre Arna | 9.00 | 4.30 | 24.90 | 288500.00 | 4.10 | 4.10 | 2.60 | 11.00 | 3.00 | 6.60 | 6.30 |
| 49.00 | Ytrebygda | 2.20 | 2.50 | 15.40 | 351000.00 | 4.20 | 3.60 | 0.00 | 7.00 | 2.30 | 6.10 | 6.40 |
| 41.00 | Øvre Fyllingen | 3.50 | 2.60 | 17.70 | 347500.00 | 2.80 | 4.00 | 0.20 | 10.00 | 4.40 | 6.20 | 9.10 |
pairs(scattersub, cex.labels = 1.1,
lower.panel=panel.smooth,
diag.panel=panel.hist,
upper.panel=panel.cor,
labels=scatterlabels)
Plottet er en scattermatrise med histogram på diagnoalen, korrelasjoner i øvre halvdel og parvise scatterplot med smoother på nedre halvdel. For å lage plottet er følgende funksjoner definert (og endret) fra standardfunksjonenen i pairs
# Function panel.hist. Changed colour.
panel.hist <- function(x, ...)
{
usr <- par("usr"); on.exit(par(usr))
par(usr = c(usr[1:2], 0, 1.5) )
h <- hist(x, plot = FALSE)
breaks <- h$breaks; nB <- length(breaks)
y <- h$counts; y <- y/max(y)
rect(breaks[-nB], 0, breaks[-1], y, col="grey80", ...) # Endret standarfarge
}
# Function panel.cor. Changed colour.
panel.cor <- function(x, y, digits=2, prefix="", cex.cor, ...)
{
usr <- par("usr"); on.exit(par(usr))
par(usr = c(0, 1, 0, 1))
r <- abs(cor(x, y))
txt <- format(c(r, 0.123456789), digits=digits)[1]
txt <- paste(prefix, txt, sep="")
if(missing(cex.cor)) cex.cor <- 0.8/strwidth(txt)
text(0.5, 0.5, txt, cex = 1.5) # Fjernet fontstørrelse utfra korrelasjonsstørrelse
}
# Function panel.smooth. Changed colour.
panel.smooth <- function (x, y, col = par("col"), bg = NA, pch = par("pch"),
cex = 1, col.smooth = "blue", span = 2/3, iter = 3, ...) # Endret standarfarge
{
points(x, y, pch = pch, col = col, bg = bg, cex = cex)
ok <- is.finite(x) & is.finite(y)
if (any(ok))
lines(stats::lowess(x[ok], y[ok], f = span, iter = iter),
col = col.smooth, ...)
}
Lager først en hjelpefunksjon, lånt fra denne siden.
# Helper function for making correlation table with significance indicator
corstarsl <- function(x) {
require(Hmisc)
x <- as.matrix(x)
R <- rcorr(x)$r
p <- rcorr(x)$P
## define notions for significance levels; spacing is important.
mystars <- ifelse(p < 0.001, "***", ifelse(p < 0.01, "** ", ifelse(p < 0.05,
"* ", " ")))
## trunctuate the matrix that holds the correlations to two decimal
R <- format(round(cbind(rep(-1.11, ncol(x)), R), 2))[, -1]
## build a new matrix that includes the correlations with their apropriate
## stars
Rnew <- matrix(paste(R, mystars, sep = ""), ncol = ncol(x))
diag(Rnew) <- paste(diag(R), " ", sep = "")
rownames(Rnew) <- colnames(x)
colnames(Rnew) <- paste(colnames(x), "", sep = "")
## remove upper triangle
Rnew <- as.matrix(Rnew)
Rnew[upper.tri(Rnew, diag = TRUE)] <- ""
Rnew <- as.data.frame(Rnew)
## remove last column and return the matrix (which is now a data frame)
Rnew <- cbind(Rnew[1:length(Rnew) - 1])
return(Rnew)
}
print(xtable(corstarsl(income)), type="html")
| Median bruttoinntekt | Sosialhjelp til unge | Barnevernstilfeller | Barnefattigdom | Barneflytting | Kommunale boliger | Kriminalitet | |
|---|---|---|---|---|---|---|---|
| Median bruttoinntekt | |||||||
| Sosialhjelp til unge | -0.66*** | ||||||
| Barnevernstilfeller | -0.61*** | 0.57*** | |||||
| Barnefattigdom | -0.64*** | 0.62*** | 0.80*** | ||||
| Barneflytting | -0.57*** | 0.42** | 0.52*** | 0.74*** | |||
| Kommunale boliger | -0.54*** | 0.66*** | 0.74*** | 0.81*** | 0.54*** | ||
| Kriminalitet | -0.49*** | 0.68*** | 0.61*** | 0.62*** | 0.46*** | 0.60*** | |
| Dødelighet | -0.47*** | 0.25 | 0.55*** | 0.50*** | 0.45*** | 0.44** | 0.41** |
print(xtable(corstarsl(education)), type="html")
| Lav utdanning | Sosialhjelp til unge | Barnevernstilfeller | Barnefattigdom | Barneflytting | Kommunale boliger | Kriminalitet | |
|---|---|---|---|---|---|---|---|
| Lav utdanning | |||||||
| Sosialhjelp til unge | 0.47*** | ||||||
| Barnevernstilfeller | 0.47*** | 0.57*** | |||||
| Barnefattigdom | 0.23 | 0.62*** | 0.80*** | ||||
| Barneflytting | 0.03 | 0.42** | 0.52*** | 0.74*** | |||
| Kommunale boliger | 0.26 | 0.66*** | 0.74*** | 0.81*** | 0.54*** | ||
| Kriminalitet | 0.34* | 0.68*** | 0.61*** | 0.62*** | 0.46*** | 0.60*** | |
| Dødelighet | 0.32* | 0.25 | 0.55*** | 0.50*** | 0.45*** | 0.44** | 0.41** |
ggplot2 pakken.# krim-index
ikrim <- data.frame(levekar$sone, levekar$ikriminalitet) # create dataframe with interesting variables
names(ikrim) <- c("sone", "ikrim") # adding names to dataframe
ikrim <- ikrim[with(ikrim, order(ikrim)), ] # ordering by ascending crimelevels
ikrim.s <- transform(ikrim, sone = reorder(sone, -ikrim)) # dataframe for plot, sorting descending on crimelevel
# krim-prosentskåre
krim <- data.frame(levekar$sone, levekar$kriminalitet) # create dataframe with interesting variables
names(krim) <- c("sone", "krim") # adding names to dataframe
krim <- krim[with(krim, order(krim)), ] # ordering by ascending crimelevels
krim.s <- transform(krim, sone = reorder(sone, -krim)) # dataframe for plot, sorting descending on crimelevel
qplot(sone, ikrim, data=ikrim.s, geom="bar") + # making baseplot
geom_hline(yintercept=mean(ikrim.s$ikrim)) + # adding a vertical line at mean
theme (axis.text.x = element_text(angle = 0), # rotating axis text
axis.text.y = element_text(angle = 0, hjust=0)) + # rotating axis text and adjusting labels
coord_flip() # flipping coordinates to get plot sideways
qplot(sone, krim, data=krim.s, geom="bar") + # making baseplot
geom_hline(yintercept=mean(krim.s$krim)) + # adding a vertical line at mean
theme (axis.text.x = element_text(angle = 0), # rotating axis text
axis.text.y = element_text(angle = 0, hjust=0)) + # rotating axis text and adjusting labels
coord_flip()