안녕하세요

모두를 위한 R 데이터 분석 입문 연습문제 8장 본문

Study_exam/모두를 위한 R 데이터 분석 입문 연습문제

모두를 위한 R 데이터 분석 입문 연습문제 8장

godxxy1229 2023. 6. 15. 06:15

01 다음과 같이 데이터셋 us를 생성한 후 물음에 답하시오. 여기서 state.x77은 미국 50개 주의 통계 정보가, state.division은 미국 50개 주의 지역 구분(예: 북부, 중부, 남부....) 정보가 저장된 데이터셋이다.

us <- data.frame(state.x77, state.division)

 

(1) 미국 50개주에 대해 각각의 주들이 지역구분별로 묶인 트리맵을 작성하시오. 또한, 타일의 면적은 Population (인구수), 타일의 색은 Income (소득)으로 나타내고, 각각의 타일에는 주의 이름을 표시하시오. 마지막으로 이 트리맵에서 관찰할 수 있는 것이 무엇인지 설명하시오.
(2) 미국 50개 주에 대해 각각의 주들이 지역구분별로 묶인 트리맵을 작성하시오. 또한, 타일의 면적은 HS.Grad(고등학교 졸업률), 타일의 색은 Murder (범죄률)로 나타내고, 각각의 타일에는 주의 이름을 표시하시오. 마지막으로 이 트리맵에서 관찰할 수 있는 것이 무엇인지 설명하시오.
(3) us 데이터셋에 대해 x축은 Income (소득), y축은 Illiteracy (문맹률), 원의 크기는 Population(인구수), 원의 색은 green(초록색), 원 내부에는 주의 이름을 표시한 버블차트를 작성하시오. 또한 이 버블차트에서 관찰할 수 있는 것이 무엇인지 설명하시오.
(4) us 데이터셋에 대해 x축은 Illiteracy(문맹률), y축은 Murder (범죄률), 원의 크기는 Area(면적), 원의 색은 green(초록색), 원 내부에는 주의 이름을 표시한 버블차트를 작성하시오. 또한 이 버블차트에서 관찰할 수 있는 것이 무엇인지 설명하시오.

 

us <- data.frame(state.x77, state.division)
head(us)
#(1)
library(treemap)
us <- data.frame(us, usname = rownames(us))
treemap(us, vSize = "Population", vColor = "Income", 
 							index = c("state.division", "usname"))
# Atlantic, Pacific 쪽의 인구가 많고 Mountain 지역의 인구가 적다.
#(2)
treemap(us, vSize = "HS.Grad", vColor = "Murder", index = c("state.division", "usname") )
# 위의 treemap과 비교하자면 Mountain의 경우 인구가 가장 적지만
# 고등학교 졸업률이 가장 높다. 즉, 교육율이 가장 높은 지역이라는 의미이다.
# 이전의 트리맵과 비교했을때 전체적으로 인구와 고등학교 진학률은 반비례 하는 것처럼 보인다.
#(3)
symbols(x = us$Income, y = us$Illiteracy, circles = us$Population, 
 					       bg = "green", xlab = "Income", ylab = "Illiteracy" )
text(x = us$Income, y = us$Illiteracy, labels = rownames(us), cex = 0.7, col = "purple")
# 전체적인 위치는 인컴이 높을수록 문맹률이 낮은, 반비례의 관계를 보이는 위치로
# 원들이 분포되어있다. 주로 West South Cental 지역이 낮은 임금과 높은 문맹률을
# 가지고 있는 것으로 보인다.
#(4)
symbols(x = us$Illiteracy, y = us$Murder, circles = us$Area, 
       					 bg = "green", xlab = "Income", ylab = "Illiteracy" )
text(x = us$Illiteracy, y = us$Murder, labels = rownames(us), cex = 0.7, col = "purple")
# 대체로 수익과 문맹률 둘다 낮은 주들이 많다. 
# 그리고 주의 크기와 문맹률 또는 수입은 상관이 없어 보인다.


02 R에서 제공하는 swiss 데이터셋은 스위스 48개 주에 대한 통계 정보를 담고 있다. 다음의 문제를 해결하시오.
(1) 스위스 48개 주에 대해 타일의 면적은 Fertility, 타일의 색은 Agriculture인 트리맵을 작성하시오. 또한, 48개 주는 Education에 의해 그룹별로 묶어서 출력하시오 (Education<=6 : LOW, Education>=13 : HIGH, 나머지: MID).
(2) 스위스 48개 주에 대해 타일의 면적은 Catholic, 타일의 색은 Examination인 트리맵을 작성하시오.

 

#(1)
edu <- c()
for(i in 1:nrow(swiss)){
  if( swiss[i, "Education"] <= 6){
    edu[i] = "LOW"
  }else if( swiss[i, "Education"] >= 13){
    edu[i] = "HIGH"
  }else{
    edu[i] = "MID"
  }
  i <- i+1
}
myds <- data.frame(swiss, edu = edu, name = rownames(swiss))
treemap(dtf = myds, vSize = "Fertility", vColor = "Agriculture", index = c("edu", "name"))
#(2)
treemap(dtf = myds, vSize = "Catholic", vColor = "Examination", index = "name")

 

03 R에서 제공하는 swiss 데이터셋에 대해 x축은 Fertility. y축은 Agriculture, 원의 크기는 Education, 원의 색은 green(초록색)인 버블차트를 작성하시오. 또한, 원 위에 주의 이름을 표시하시오.

 

symbols(x = swiss$Fertility, y = swiss$Agriculture, circles = swiss$Education, 
        					bg = "green", xlab = "Fertility", ylab = "Agriculture" )
text(x = swiss$Fertility, y = swiss$Agriculture, 
 					labels = rownames(swiss), cex = 0.7, col = "purple")


04 R에서 제공하는 trees 데이터셋에 대해 x축은 Girth, y축은 Height, 원의 크기는 Volume, 원의 색은 blue(파랑색)인 버블차트를 작성하시오. 원 안에는 행(row)의 번호를 표시하시오.

 

symbols(x = trees$Girth, y = trees$Height, circles = trees$Volume, 
 						       bg = "blue", xlab = "Girth", ylab = "Height" )
text(x = trees$Girth, y = trees$Height, labels = rownames(trees), cex = 0.7, col = "red")


05 HairEyeColor 데이터셋에 대해 모자이크 플롯을 작성하고, 이 모자이크 플롯에서 관찰할 수 있는것이 무엇인지 설명하시오.

 

mosaicplot(x = HairEyeColor)
# 금발의 머리색을 가진 사람들은 남성보다 여성이 많고 나머지는 전부 비슷하다.
# 검은 머리색을 가진 사람들은 갈색 눈동자를 가진 경우가 많다.
# 금발의 경우 파란색이 그러하다.


06 다음의 santa 데이터에 대해 모자이크 플롯을 작성하고, 여기서 관찰할 수 있는 정보가 무엇인지 설명하시오. 또한, x축에 belief, y축에 sibling을 표시하고, sibling은 그룹에 따라 색을 다르게 하시오.(이 데이터는 어린이들에 대해 sibling(손위 형제 여부)과 belief(산타를 믿는지 여부)를 조사한 것이다.)

santa <- data.frame(belief=c('no belief','no belief','no belief','no belief','belief', 'belief', 'belief', 'belief','belief', 'belief','no belief','no belief','belief', 'belief','no belief','no belief'),sibling=c('older brother', 'older brother','older brother', 'older sister','no older sibling', 'no older sibling','no older sibling', 'older sister','older brother', 'older sister','older brother', 'older sister','no older sibling', 'older sister', 'older brother','no older sibling'))

 

santa <- data.frame(belief = c("no belief", "no belief", "no belief", "no belief",
 			                             "belief", "belief", "belief", "belief",
                              			     "belief", "belief", "no belief", "no belief",
  			                            "belief", "belief", "no belief", "no belief"),
                    siblings = c("older brother", "older brother", "older brother", "older sister",
                                 "no older sibling", "no older sibling", "no older sibling", "older sister",
                                 "older brother", "older sister", "older brother", "older sister",
                               "no older sibling", "older sister", "older brother", "no older sibling" ))
mosaicplot(siblings ~ belief, data = santa, color = c("red", "orange"))
# 자신보다 나이가 많은 남자 형제를 가진 사람은 산타를 안믿을 가능성이 현저히 높다.
# 반면에 윗형제를 가지지 않는 경우 산타를 믿을 가능성이 매우 높다.

 

07 R에서 제공하는 mtcars 데이터셋에서 gear(기어의 수)에 대해 ggplot으로 막대그래프를 작성하시오. 단, 제목과 x축 레이블은 '기어의 수', y축 레이블은 '빈도수'로 나타내시오.

 

library(ggplot2)
table(mtcars[,"gear"])
ggplot(data = mtcars, aes(gear)) + 
geom_bar( width = 0.7, fill = "steelblue")


08 R에서 제공하는 mtcars 데이터셋에서 cyl(실린더의 수)에 대해 막대 색이 초록색인 막대그래프를 ggplot으로 작성하시오.

 

ggplot( data = mtcars, aes(cyl) ) + 
 geom_bar ( fill = "green") + xlim(2.5, 9.5)


09 R에서 제공하는 mtcars 데이터셋에서 mpg(연비)에 대해 구간 간격이 5.0인 히스토그램을 ggplot으로 작성하시오.

 

ggplot( data = mtcars, aes(mpg)) + 
  geom_histogram(binwidth = 0.5)


10 R에서 제공하는 trees 데이터셋의 Girth (나무 둘레)에 대해 ggplot으로 히스토그램을 작성하시오. 여기에서는 히스토그램의 제목, x축 레이블, y축 레이블을 한글로 표시하시오. (구간 간격은 3.0. 막대의 색은 steelblue로 한다.)

 

ggplot( data = trees, aes(Girth)) + 
  geom_histogram(binwidth = 3.0, fill = 'steelblue') + 
  xlab("두께") + ylab("빈도")


11 R에서 제공하는 mtcars 데이터셋에서 mpg(연비)를 x축으로 하고, wt(중량)를 y축으로 하는 산점도를 ggplot으로 작성하시오.(단, 점의 색은 gear의 수에 따라 다르게 표시한다.)

 

ggplot (data = mtcars, aes(x = mpg, y = wt)) + 
  geom_point(color = gear) + ylab("weight")


12 R에서 제공하는 mtcars 데이터셋에서 mpg(연비)에 대해 ggplot으로 상자그림을 작성하되, cyl(실린더수)에 따라 그룹을 나누어 작성하시오.

 

ggplot( data = mtcars, aes(y = mpg)) + 
  geom_boxplot() + facet_wrap(~cyl)
# aes의 fill을 사용해서는 그룹이 나누어지지 않기 때문에
# ggplot2 의 facet_wrap을 사용했습니다.


13 다음은 2015년부터 2026년도까지의 예상 인구수 추계 자료이다. 연도를 x축으로 하여 ggplot으로 선그래프를 작성하시오.

 

years <- 2015:2026
populations <- c(51014, 51245, 51446, 51635, 51811, 51973, 
 			                52123, 52261, 52388, 52504, 52609, 52704)
myds <- data.frame(Year = years, Population = populations)
ggplot(data = myds, aes(x = Year, y = Population)) + 
  geom_line(col = "blue") + xlim(2014.5, 2027.5)
# xlim은 보기좋으라고 추가했습니다.

 

14 다음은 2014년 4분기부터 2017년 3분기까지 남녀 경제활동참가율을 나타낸 통계자료이다. ggplot을 이용하여 연도를 x축으로 하고 남녀를 각각 다른 선과 색으로 표시하는 선그래프를 작성하시오. (2014년 4분기는 20144, 2015년 1분기는 20151과 같은 형식으로 입력한다.)

 

years <- c( 20144, 20151, 20152, 20153, 20154, 20161, 
 				          20162, 20163, 20164, 20171, 20172, 20173 )
male <- c(73.9, 73.1, 74.4, 74.2, 73.5, 73, 74.2, 74.5, 73.8, 73.1, 74.5, 74.2)  
female <- c(51.4, 50.5, 52.4, 52.4, 51.9, 50.9, 52.6, 52.7, 52.2, 51.5, 53.2, 53.1)
myds <- data.frame(Year = years, Male = male, Female = female)
ggplot(data = myds) + 
  geom_line(aes(y = Male, x = Year), col = "blue") + 
  geom_line(aes(y = Female, x = Year), col = "red") + ylab("LFPR")
# LFPR = Labor Force Participation Rate - 경제활동참가율

 

15 R에서 제공하는 state.x77 데이터셋을 차원 축소하여 2차원 산점도와 3차원 산점도를 작성하시오. (statex77은 매트릭스 타입이기 때문에 데이터프레임으로 변환하여 실습한다.)

 

library(Rtsne)
library(ggplot2)
library("car")
library("rgl")
library("mgcv")
# scatter3d 함수를 처음 사용하시는거라면
# install.packages(c("rgl", "car")) 실행해주세요
myds <- data.frame(state.x77)
tsne <- Rtsne(myds, dims = 2, perplexity = 16)
# nrow(state.x77) 이 50이므로 1/3보다 작은 16으로 했습니다
df.tsne <- data.frame(tsne$Y)
ggplot(df.tsne, aes(x=X1, y=X2)) + 
  geom_point(size = 2)
tsne <- Rtsne(myds, dims = 3, perplexity = 16)
df.tsne <- data.frame(tsne$Y)
scatter3d(x = df.tsne$X1, y = df.tsne$X2, z = df.tsne$X3, surface = TRUE)


16 R에서 제공하는 swiss 데이터셋을 차원축소하여 2차원 산점도와 3차원 산점도를 작성하시오.

library(Rtsne)
library(ggplot2)
library("car")
library("rgl")
library("mgcv")
tsne <- Rtsne(swiss, dims = 2, perplexity = 15)
df.tsne <- data.frame(tsne$Y)
ggplot(df.tsne, aes(x=X1, y=X2)) + 
  geom_point(size = 2)

tsne <- Rtsne(myds, dims = 3, perplexity = 15)
df.tsne <- data.frame(tsne$Y)
scatter3d(x = df.tsne$X1, y = df.tsne$X2, z = df.tsne$X3, surface = TRUE)