본문 바로가기
R 과 데이터분석/기초 문법 ~ 머신러닝

[R 데이터분석] 8장. 고급시각화

by JoyfulS 2019. 9. 13.

# chap08_VisualizationAnalysis

 

# 고급시각화

# 1. lattice

# 2. ggplot2

# 3. ggmap 패키지  

 

 


# 1. lattice
# - 격자 형태의 그래프 제공 

install.packages("lattice")
library(lattice)

install.packages("mlmRev")
library(mlmRev) # Chem97 데이터 제공 

Chem97
str(Chem97)
# 'data.frame': 31022 obs. of  8 variables:
# score : 화학점수 
# gender : 성별(M,F)
# gcsescore : 입학점수 
head(Chem97)
table(Chem97$score)

# 1) histogram
# histogram(~x, data)
histogram(~gcsescore, data=Chem97)

# 연속변수(실수) vs 이산변수(정수)
histogram(~gcsescore | factor(score), data=Chem97)


# 2) densityplot(~x, data) 
# 연속변수, 이산변수, 범주형변수 
densityplot(~gcsescore | factor(score), groups = gender, 
            auto.key=T, data = Chem97)

# | factor(변수) : 범주만큼 격자 생성 
# groups = 변수 : 한 격자 내에서 그룹 표현 
# auto.key=T : 범례 


# 3) xyplot(x, y | 집단변수, data)
str(quakes)
# 'data.frame': 1000 obs. of  5 variables:
# lat : 위도 
# long : 경도 
# depth : 수심 깊이 
# mag : 규모 

xyplot(lat ~ long, data = quakes)  # y ~ x

# depth 범위 
range(quakes$depth) # 40 680
summary(quakes$depth)

# 연속형 -> 범주형 
# 1 : min ~ 1st
# 2 : 1st ~ Mean
# 3 : Mean ~ max

quakes$depth2[quakes$depth >= 4.0 & quakes$depth <= 99.0] <- "d1"
quakes$depth2[quakes$depth > 99.0 & quakes$depth <= 311.4] <- "d2"
quakes$depth2[quakes$depth > 311.4 ] <- "d3"

table(quakes$depth2)
# d1  d2  d3 
#251 305 444

xyplot(lat ~ long | depth2, data = quakes, layout = c(3,1))
# layout = c(3,1) : 격자 배열 


# 2. ggplot2
library(ggplot2) # function + dataset
data("mpg")
str(mpg)

# 1) qplot(x, y, data)

# (1) 변수 1개(연속형) : hist 
qplot(hwy, data = mpg) # bins : 계급 or 막대 수 

# 연속형 vs 범주형 
table(mpg$drv) # 4   f   r 

qplot(hwy, fill = drv, data = mpg)

# (2) 변수 2개(연속형 vs 연속형) : 산점도 
qplot(displ, hwy, data = mpg)
# 연속형 vs 연속형 vs 범주형 
qplot(displ, hwy, color = drv, data = mpg)


# (3) 색상, 크기, 모양 적용 
data("mtcars") # datasets 제공 
str(mtcars)

qplot(wt, mpg, color=factor(gear), size=factor(gear), data = mtcars)


# 2) ggplot(data, aes(x,y,color))
data("diamonds") # ggplot3 제공 dataset
str(diamonds)
# 'data.frame': 53940 obs. of  10 variables:


aes <- ggplot(data=diamonds, aes(carat, price, color=cut))
aes + geom_point() # 미적 객체 + 차트 유형 

# 객체 재사용 
aes + geom_line()
aes + geom_step()


table(diamonds$clarity)

aes <- ggplot(data=diamonds, aes(clarity)) # 범주형 
aes + geom_bar(aes(fill=cut), position="fill")

# 3) ggsave()
setwd("d:/sunmoon/2_Rwork/output")
ggsave("diamonds_cut.png")


# 3. ggmap 패키지 
# - 지도 공간 시각화 

install.packages("ggmap")
library(ggmap) # get_stemenmap()


# 서울 위도(126.992), 경도(37.551) : google 지도 
seoul <- c(left=126.85, bottom=37.35, 
           right=127.25, top=37.65)
# 지도 이미지 
map <- get_stamenmap(seoul, zoom=12, maptype='terrain')
# 지도 이미지 view
ggmap(map)

# 대구 위도(128.5700), 경도(35.8293)
# 대구 중심으로 남한 대륙 
deagu <- c(left=123.4423, bottom=32.8529306,
           right=131.6015, top=38.3714354)
map <- get_stamenmap(deagu, zoom = 7, maptype="terrain")
ggmap(map)

# 2015년 6월 인구수 
pop <- read.csv(file.choose())
pop

library(stringr)

region <- pop$지역명
log <- pop$LON # 위도 
lan <- pop$LAT # 경도 
tot_pop <- as.numeric(str_replace_all(pop$총인구수, ",", ""))

df <- data.frame(region, log, lan, tot_pop)
df

# 지도 정보 생성 
map <- get_stamenmap(deagu, zoom=7, maptype="watercolor")


# 레이어1 : 지도 플로팅 
layer1 <- ggmap(map)
layer1

# 레이어2 : 포인트 추가 
library(ggplot2) # geom_point(), geom_text(),ggsave()
layer2 <- layer1 + geom_point(data = df, 
                              aes(x=log, y=lan,
                                  color=factor(tot_pop),
                                  size = factor(tot_pop)))
layer2

# 레이어3 : 텍스트(지역명) 추가 
layer3 <- layer2 + geom_text(data = df,
                             aes(x=log+0.01, y=lan+0.18,
                                 label=region), size=3)
layer3


# file save
getwd()
ggsave("pop201506.png", width = 10.24, height = 7.68)


댓글