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

[R 데이터분석] 5장. 데이터 시각화

by JoyfulS 2019. 9. 13.

# chap05_DataVisualization

 

# 데이터 시각화

# 1. 이산변수 시각화  (막대차트, 점차트, 파이차트)

# 2. 연속변수 시각화  (상자그래프, 히스토그램, 산점도) 

# 3. 변수간의 비교 시각화  

# 4. 3차원 산점도

# 5. 차트 파일 저장  

 


# 1. 이산변수 시각화
# - 정수형 변수(예:자녀수, 자동차 수)
# - 막대차트, 점차트, 파이차트 

# 차트 데이터 생성
chart_data <- c(305,450, 320, 460, 330, 480, 380, 520) 
names(chart_data) <- c("2016 1분기","2017 1분기","2016 2분기","2017 2분기","2016 3분기","2017 3분기","2016 4분기","2017 4분기")
str(chart_data)
chart_data

max(chart_data) # 520
length(chart_data) # 8

# 1) 막대차트 

# (1) 세로막대차트 
barplot(chart_data, ylim = c(0,600),
        col = rainbow(8), 
        main = "2016년도 vs 2017년도 분기별 매출현황")
?barplot

# (2) 가로막대차트 
barplot(chart_data, xlim = c(0,600),
        col = rainbow(8), horiz = TRUE,
        main = "2016년도 vs 2017년도 분기별 매출현황")

barplot(chart_data, xlim = c(0,600),
        ylab = "년도별 현황",
        xlab = "매출액(단위 : 만원)",
        col = rainbow(8), horiz = TRUE,
        main = "2016년도 vs 2017년도 분기별 매출현황")


# 2) 점차트
?dotchart

dotchart(chart_data, color = c("green", "red"),
         lcolor = "black", pch=1:2,
         labels = names(chart_data), xlab = "매출액",
         main = "2016년도 vs 2017년도 분기별 매출현황",
         cex=1.2)

# pch : pointer 모양 
# cex : 확대/축소 

# 3) 파이 차트 
?pie

par(mfrow=c(2,2)) # 2행2열 

pie(chart_data, labels = names(chart_data),
    border = 'blue', col = rainbow(8),
    cex=1.2)

pie(table(iris$Species))


# 2. 연속변수 시각화 
# - 시간, 길이, 몸무게 등과 같은 연속성을 갖는 변수 
# - 실수형 변수   
# - boxplot, hist, plot

par(mfrow=c(1,1)) # 1행1열

# 1) 상자 그래프 시각화 
VADeaths
str(VADeaths) # num [1:5, 1:4] : 2차원 
str(chart_data) # num [1:8] : 1차원 

summary(VADeaths) # 요약통계량 
boxplot(VADeaths) # 요약통계량 시각화 


# 2) 히스토그램 시각화 
data("iris") # dataset memory loading
iris
str(iris)
# 'data.frame': 150 obs. of  5 variables:
#$ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
#$ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#$ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
#$ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#$ Species     : Factor w/ 3 levels "setosa","versicolor",..:

mean(iris$Sepal.Length)
summary(iris$Sepal.Length)

hist(iris$Sepal.Length, xlab = "꽃받침 길이",
     col = "green", main ="iris Sepal.Length",
     xlim = c(4.3, 7.9))

summary(iris$Sepal.Width) # 2.000  ~ 4.400
hist(iris$Sepal.Width, xlab = "꽃받침 넓이",
     col = "blue", main ="iris Sepal.Width",
     xlim = c(2.0, 4.4))

# 밀도분포곡선, 정규분포곡선 
hist(iris$Sepal.Width, xlab = "꽃받침 넓이",
     col = "yellow", freq = FALSE, 
     main ="iris Sepal.Width",
     xlim = c(2.0, 4.5))

# 밀도분포곡선 추가 : 밀도 기준 line
lines(density(iris$Sepal.Width), col="red")

# 정규분포곡선 : 대칭성 확인 
x <- seq(2.0, 4.5, 0.1)
x
curve(dnorm(x, mean=mean(iris$Sepal.Width), 
            sd=sd(iris$Sepal.Width)), col="blue", add=T)


# 3) 산점도(plot)
# plot(x, y)
x <- runif(5, min=0, max=1)
y <- runif(5, min=1.5, max=2.5)
x; y
plot(x, y)

# plot(y)
y <- 1:5
y
plot(y) # x : index

# 산점도 주요 속성 
price <- runif(n=10, min=2, max=8)
price
par(mfrow=c(2,2))
plot(price, type = "l") # 실선
plot(price, type = "o") # 타원과 실선 
plot(price, type = "h") # 직선 
plot(price, type = "s") # step

# pch = 1 ~ 30
plot(price, type = "o", pch=5) # 빈 마름모
plot(price, type = "o", pch=15) # 사각형 
plot(price, type = "o", pch=20) # 원형 
plot(price, type = "o", pch=25) # 삼각형

# 만능 차트 
WWWusage # Time Series:
plot(WWWusage) # 시계열 data시각화 

methods(plot)

# 회귀분석 model 
install.packages("psych")
library(psych) # galton dataset

data("galton") # dataset loading
galton
str(galton)
# 'data.frame': 928 obs. of  2 variables:
# $ parent: num 
# $ child : num
head(galton)

# x : parent(독립변수) ~ y : child(종속변수)
model <- lm(formula=child ~ parent, data = galton)
model 
plot(model)
  

# 3. 변수간의 비교 시각화 
# - 산점도 매트릭스(scatter matrix)
head(iris)

pairs(iris[1:4]) # 5번 칼럼 제외 
  
  
# 4.  3차원 산점도 

install.packages('scatterplot3d')
library(scatterplot3d)

# 꽃의 종류별 분류 
iris_setosa = iris[iris$Species == 'setosa',]
iris_versicolor = iris[iris$Species == 'versicolor',]
iris_virginica = iris[iris$Species == 'virginica',]

# scatterplot3d(밑변, 오른쪽변, 왼쪽변, type='n') # type='n' : 기본 산점도 제외 
d3 <- scatterplot3d(iris$Petal.Length, iris$Sepal.Length, iris$Sepal.Width, type='n')

d3$points3d(iris_setosa$Petal.Length, iris_setosa$Sepal.Length,
            iris_setosa$Sepal.Width, bg='orange', pch=21)

d3$points3d(iris_versicolor$Petal.Length, iris_versicolor$Sepal.Length,
            iris_versicolor$Sepal.Width, bg='blue', pch=23)

d3$points3d(iris_virginica$Petal.Length, iris_virginica$SSepal.Length,
            iris_virginica$Sepal.Width, bg='green', pch=25)

table(iris$Species)  
#setosa versicolor virginica 
#    50         50        50    
  

# 5. 차트 파일 저장 
setwd("c:/2_Rwork/output")

jpeg("galton.jpg", width = 750, height = 480)
plot(galton$child, galton$parent, col = "green")
title("galton dataset plotting")
dev.off() # 장치 종료 

 


#######################
### train/test 과적합 
#######################

str(galton)
# 'data.frame': 928 obs. of  2 variables:

nrow(galton)*0.7 # 649.6

idx <- sample(x=nrow(galton), size=nrow(galton)*0.7, 
              replace = FALSE)
# x : 관측치 길이
# size : sample size
# replace = FALSE : 비복원 추출 
length(idx) # 649
idx # 행 번호 

train <- galton[idx, ] # 70%
test <- galton[-idx, ] # 30%

dim(train) # 649   2
dim(test) # 279   2

# 회귀model - train
model <- lm(child ~ parent, data = train)
pred <- model$fitted.values # 예측치(자녀 키)
pred

# 회귀model - test
model2 <- lm(child ~ parent, data = test)
pred2 <- model2$fitted.values # 예측치(자녀 키)
pred2

plot(x=pred, y=train$parent, col="blue", pch=18)
points(pred2, test$parent, col="red", pch=19)

# 범례 
legend("topleft", legend = c("train", "test"),
       col = c("blue", "red"), pch = c(18, 19))


댓글