[ R ] 004

이하나·2022년 9월 5일

R

목록 보기
4/4

[ 0 ] 데이터 시각화

1) 이산 변수 -> 막대, 점, 원형차트 >> ex) 이항분포...

barplot, pie
보통 정수 값의 데이터

2) 연속 변수 -> 상자 박스, 히스토그램, 산점도 >> ex) 정규분포, 균등분포 ...

boxplot, hist, plot
이산변수에 비해 실수 값의 데이터

[ 1 ] 이산변수 시각화

1) 세로 막대 그래프

chart_data <- c(222, 512, 845, 685, 375, 654, 854, 754)
# 예시용 데이터

names(chart_data) <- c("2011년", "2012년", "2013년", "2014년", "2015년","2016년","2017년","2018년")
                                              # 칼럼명 지정
str(chart_data)                               # 자료구조 확인
barplot(chart_data)                           # 세로막대그래프
barplot(chart_data, ylim = c(0, 1000))        # ylim = c(최소, 최대) -> 세로축 범위 설정
barplot(chart_data, col = rainbow(8))         # col = 색상 -> rainbow(n)은 n가지의 무지개색으로 설정
barplot(chart_data, main = "년도별 현황 비교")  # main = 제목 -> 차트 제목 지정
barplot(chart_data, ylab = "단위: 만원", xlab = "년도별 현황")
                                              # ylab = 세로축 제목, xlab = 가로축 제목

2) 가로 막대 그래프

barplot(chart_data, horiz = T)                  # 가로막대그래프 -> horiz = T
barplot(chart_data, horiz = T, xlim = c(0, 1000))     
                                                # xlim = c(최소, 최대) -> 가로축 범위 설정

3) 누적 막대 차트

data(VADeaths)                                  # 샘플 데이터 가져오기
VADeaths

str(VADeaths)
dim(VADeaths)

par(mfrow = c(1,2))                             # 1행에 2개의 그래프를 볼 수 있도록 한다.

barplot(VADeaths, beside = T, col = rainbow(5)) # 옆으로 나뉜다. (개별 차트) beside = T
legend(19, 71, c("50", "55", "60", "65", "70"), fill = rainbow(5))
barplot(VADeaths, beside = F, col = rainbow(5)) # 한줄로 쌓인다. (누적 차트) beside = F
legend(3.8, 200, c("50", "55", "60", "65", "70"), fill = rainbow(5))
                                                # legend는 범례를 표시해주는 함수
                                                # x좌표, y좌표, 문자열로 이루어진 범례명, 색구분

par(mfrow = c(1,2))                             # 1행에 2개의 그래프를 볼 수 있도록 한다.

barplot(VADeaths, beside = T, col = rainbow(5), ylim = c(0, 90))
legend("top", c("50", "55", "60", "65", "70"), ncol = 5, fill = rainbow(5))
barplot(VADeaths, beside = F, col = rainbow(5)) # legend에 ncol을 지정해주면 가로로 범례가 나온다.
legend("topright", c("50", "55", "60", "65", "70"), fill = rainbow(5))
                                                # 위치이름, 문자열로 이루어진 범례명, 색구분
                       # top, bottom, left, right, topright, topleft, bottomright, bottomleft
title(main = "지역별 사망 빈도", font.main = 4)
                                                # title 함수로도 차트 제목 설정 가능, 폰트도 설정 가능

4) 점 차트 그래프

chart_data <- c(222, 512, 845, 685, 375, 654, 854, 754)
names(chart_data) <- c("2011년", "2012년", "2013년", "2014년", "2015년","2016년","2017년","2018년")

dotchart(chart_data)                            # 점차트그래프

dotchart(chart_data, color = c("blue"))         # 세로축 레이블과 점 색 지정
dotchart(chart_data, lcolor = c("red"))         # 구분선 색 지정
dotchart(chart_data, labels = names(chart_data))
                                                # 이름이 지어지지 않은 데이터일 경우 레이블 이름 지정 가능
dotchart(chart_data, pch = 1:5)                 # 점 모양 지정 가능, 1:5 -> 1번부터 5번까지의 모양
                                                # 열 별로 번갈아가면서 모양 지정
dotchart(chart_data, xlab = "매출액", ylab = "분기별 현황")
                                                # 세로축과 가로축의 제목 지정
dotchart(chart_data, cex = 1.2)                 # 확대 배율

5) 원형 차트 그래프

chart_data <- c(222, 512, 845, 685, 375, 654, 854, 754)
names(chart_data) <- c("2011년", "2012년", "2013년", "2014년", "2015년","2016년","2017년","2018년")

pie(chart_data)                                 # 원형차트그래프

pie(chart_data, col = rainbow(9), cex = 0.8, labels = names(chart_data), main = "분기별 매출 현황")

[ 2 ] 연속변수의 시각화

1) 상자 그래프

데이터의 분포를 나타내는데 많이 사용.
summary 함수의 내용을 시각화 한다고 생각하면 된다.

data(VADeaths)                                  # 샘플 데이터 가져오기
VADeaths

boxplot(VADeaths)                               # 상자그래프

boxplot(VADeaths, range = 0)                    # range = 0 은 최소값과 최대값을 점선으로 연결
                                                # 0이 디폴트
abline(h = 37, lty = 3, col = "green")          # 37 높이에 초록색으로 하여 스타일 3의 기준선을 그린다.

chart_data <- quakes$mag                        # 샘플 데이터 가져오기

boxplot(chart_data, col = "red", main = "지진강도 데이터 분포", ylim = c(3.8, 6.7))
                                                # 동떨어진 데이터는 o 로 표시

2) 히스토그램

계급별 분포를 알아보는데 많이 사용.
ex) 성적별 학생 분포

data(iris)                                     # 샘플 데이터 가져오기
names(iris)
iris

str(iris)

hist(iris$Sepal.Length)                       # 히스토그램
                                              # 벡터형식의 숫자로만 이루어진 데이터여야한다.

hist(iris$Sepal.Length, col = "mistyrose", xlim = c(4.3, 7.9), main = "iris sepal length")

hist(iris$Sepal.Width, col = rainbow(20), xlim = c(2.0, 4.5), main = "iris sepal width")
hist(iris$Petal.Length, col = rainbow(30), ylim = c(0, 45), xlab = "petal length")
legend("topright",c("1 - 2","2 - 3","3 - 4","4 - 5","5 - 6","6 - 7"),ncol = 6, fill = rainbow(14))

hist(iris$Sepal.Width, col = rainbow(20), freq = F, main = "iris sepal width")
                                              # freq = F 를 설정하면 확률 밀도에 의해서 그려진다.
lines(density(iris$Sepal.Width), col = "black")
                                              # 밀도를 기준으로한 선을 추가

par(mfrow = c(1,2))

hist(iris$Petal.Length,freq = F, col = rainbow(30), ylim = c(0,1.2), main = "꽃잎 길이 확률 밀도")
lines(density(iris$Petal.Length))
                                              # 정규분포 추정곡선 추가하기
x <- seq(1, 7, 0.01)                          # seq(시작,끝,간격) -> 시작부터 끝 범위까지 간격만큼의 모든 원소를 반환
curve(dnorm( x, mean = mean(iris$Petal.Length), sd = sd(iris$Petal.Length)), col = "blue", add = T)

hist(iris$Petal.Width, freq = F, col = rainbow(30), ylim = c(0,1.2), xlim = c(0, 3), main = "꽃잎 너비 확률 밀도")
lines(density(iris$Petal.Width))

x <- seq(0, 3, 0.01)                          # x에 적용할 그래프의 범위 까지의 일정 변량이 담길  있도록 해주고
curve(dnorm( x, mean = mean(iris$Petal.Width), sd = sd(iris$Petal.Width)), col = "blue", add = T)
                                              # 정규분포 난수 생성함수를 사용하여 얻은 난수를 curve 함수를 통해 선으로.
                                              # (평균과 표준편차는 그래프 데이터의 평균과 표준편차 사용)
                                              # curve 함수 add 속성을 이용해 해당 그래프에 추가 표시해준다.

x <- quakes$mag
hist(x, ylim = c(0, 120), breaks = seq(4.0, 6.5, 0.1))
                                              # break = seq(시작, 끝, 간격) -> seq를 통해 나온 수 들을 x 지표로 사용.

3) 산점도 그래프

x <- runif(100, min = 0, max = 100)           # 난수 발생 함수를 통해 샘플데이터 받기
plot(x, col = "blue")                         # 산점도 그래프

par(new = T)                                  # 차트 추가
line_chart <- c(1:100)                        # 산점도 그래프의 대각선을 추가하기 위한 데이터
plot(line_chart, type = "l", ann = F, axes = F)
                                              # type = "l" -> 실선으로,
                                              # ann, axes = F -> 레이블이나 지표 표시 F
text(70, 80, "대각선 추가", col = "red")      # 해당 좌표에 해당 텍스트 표시

par(mfrow = c(2, 2))

plot(x, type = "l", col = "red")              # 실선으로 표시
plot(x, type = "o", col = "orange")           # 실선으로 표시, 지점마다 o 표시
plot(x, type = "h", col = "blue")             # 수직선으로 표시
plot(x, type = "s", col = "purple")           # 꺽은선으로 표시

plot(x, type = "o", pch = 5)                  # pch -> 지점 도형을 최대 30가지로 바꿈
plot(x, type = "o", col = "orange", pch = 20, lwd = 2)
                                              # lwd -> 선 굵기
plot(quakes$mag, type = "s")

4) 중첩 자료 그래프

2차원 산점도 그래프에서 중복 데이터가 있을때.

x <- c(1, 2, 3, 4, 2)
y <- rep(2, 5)

table(x,y)
plot(x, y)                                    # 결과 -> (2, 2)가 2번 나오기때문에 중첩되서 점 4개만 나옴

xy <- as.data.frame(table(x,y))               # 중복 없는 x의 데이터가 x 열, y는 y 열, 중복 갯수가 Freq 
xy

plot( x, y, col = rainbow(10), cex = 2 * xy$Freq)
                                              # xy$Freq, 즉, 중복되는 원소일수록  확대되도록.
                                              # 그래프에서 중복되는 값을 알아보기 쉽다.
library(UsingR)
data(galton)                                  # 샘플 데이터 가져오기

str(galton)
summary(galton)

galtonData <- as.data.frame(table(galton$child, galton$parent))
                                              # 교차 테이블로 만들기 -> 중복되는 수는 Freq로 나온다.
galtonData

child <- as.numeric(galtonData$Var1)
parent <- as.numeric(galtonData$Var2)

plot(child, parent, col = rainbow(1000), cex = 0.2 * galtonData$Freq)
                                              # 중복되는 수가 많은 데이터 일수록 더 크게 확대되어 잘 보이게 된다.

5) 변수 간 비교 그래프

변수와 변수 사이의 관계를 시각화

iris                                          # 샘플 데이터 가져오기

virginica <- iris[ iris$Species == "virginica", 1:4 ]      
setosa <- iris[ iris$Species == "setosa", 1:4 ]
versicolor <- iris[ iris$Species == "versicolor", 1:4 ]
                                              # Species가 virginica인 변수만 1열부터 4열까지 출력
pairs(virginica)                              # 각 열이 서로 어떠한 관계인지 시각화
pairs(setosa)
pairs(versicolor)

# 3차원 산점도 그래프

library(scatterplot3d)

d3 <- scatterplot3d(iris$Petal.Length, iris$Sepal.Length, iris$Sepal.Width, type = 'n')
                                              # 뼈대 생성 -> type ='n' 을 사용하면 산점도 표시 하지 않고 뼈대만 생성 가능
d3$points3d(virginica$Petal.Length, virginica$Sepal.Length, virginica$Sepal.Width, bg = "orange", pch = 21)
d3$points3d(setosa$Petal.Length, setosa$Sepal.Length, setosa$Sepal.Width, bg = "green", pch = 23)
d3$points3d(versicolor$Petal.Length, versicolor$Sepal.Length, versicolor$Sepal.Width, bg = "purple", pch = 25)
                                              # 각자 모양, 색을 다르게 해서 구별이 가도록 한다.

[ 3 ] 데이터 조작

1) dplyr 패키지

library(dplyr)                    # dplyr 불러오기 -> 데이터 처리에 적합
library(hflights)                 # 샘플 데이터 불러오기

# 파이프 연산자
# %>%
# 함수1의 처리 결과가 바로 함수2의 입력으로 들어간다.


iris %>% head()                   # == head(iris)

# filter 처리

hf <- tbl_df(hflights)            # 그리드 형식으로 저장
hf                                # 데이터 처리를 위해서 그리드 형식으로

dim(hf)

filter(hf, Month == 12 & DayofMonth == 25)
                                  # filter(테이블 형식의 데이터 프레임, 조건1, 조건2)
                                  # 데이터에서 조건에 맞는 데이터만 추출하여 표시해준다.

hf %>% filter(Month == 1 & DayofMonth == 1)
                                  # == filter(hf, Month == 1 & DayofMonth == 1)
                                  # & == AND == 그리고
filter(hf, DayofMonth == 1 | DayofMonth == 20)
                                  # | == OR == 혹은

# arrange 정렬

arrange(hf, Year, Month, DayofMonth, DepTime, ArrTime)
                                  # 정렬 우선 순위 , 기본적으로 오름차순
                                  # arrange(dataframe, 열1, 열2, 열3 ...)
                                  # desc(열) 을 넣으면 내림차순

# select 조회

select(hf, Year, Month, DayofMonth, FlightNum)
                                  # 원하는 열만 조회
                                  # select(dataframe, 열1, 열2, ...)
select(hf, Year:TailNum)
                                  # select(dataframe, 열1:열5)
                                  # 열1, 열2, 열3, 열4, 열5
                                  # -(열) 을 넣으면 그 열 제외 나머지 조회

# mutate 특정 열 추가

mutate(hf, gain = ArrDelay - DepDelay, time = ArrTime - DepTime) %>% select(gain, time)
                                  # 열끼리 연산하여 새로운 열 추가 가능
                                  # mutate(dataframe, 열1 = 수식1, 열2 = 수식2, ...)
                                  # 파이프 연산자로 새로운 열을 넣은 데이터 값을 select 에 넣어 gain열과 time열 조회

# Summarise 요약통계

summarise(hf, avgAirTime = mean(AirTime, na.rm = T))
                                  # AirTime의 평균을 avgAirTime으로
                                  # summarise(dataframe, 추가 열1 = 함수(계산할 열1), ...)
summarise(hf, sdAirTime = sd(AirTime, na.rm = T), varAirTime = var(AirTime, na.rm = T))
                                  # sd == 표준편차 , var == 분산

# 집단변수 대상 그룹화
# group_by(dataframe, 집단변수)

species <- group_by(iris, Species)
                                  # 종을 기준으로 그룹화
str(species)

# inner_join(df1, df2, by = 'x')
# 1,2 모두 x열이 존재하는 관측치만 병합

df1 <- data.frame(x = 1:100, y = rnorm(100))
df2 <- data.frame(x = 51:60, z = rnorm(10))

inner_join(df1, df2, by = 'x')
inner_join(df2, df1, by = 'x')
                                  # 기준이 되는 x열이 1열, 왼쪽 df의 열이 2열, 오른쪽 df의 열이 3열
                                  # x열 중 공통적이지 않은 행은 버린다.

# left_join(df1, df2, by = 'x')
# 왼쪽 데이터의 x열 기준으로 병합

left_join(df1, df2, by = 'x')
left_join(df2, df1, by = 'x')
                                  # 왼쪽 df에 오른쪽 df가 합쳐진다.
                                  # 왼쪽 df 열, 오른쪽 df 열 순서로 병합.
                                  # 합쳐진 열 중 공통적이지 않은 행의 없는 값들은 결측치, NA로 기록된다.
                                  # 왼쪽 df 행 수보다 오른쪽 df 행의 수가 더 많으면 넘치는 행들은 버린다.

# right_join(df1, df2, by = 'x')
# 오른쪽 데이터의 x열 기준으로 병합

right_join(df1, df2, by = 'x')
right_join(df2, df1, by = 'x')
                                  # 오른쪽 df에 왼쪽 df가 합쳐진다.
                                  # 오른쪽 df 열, 왼쪽 df 열 순서로 병합.
                                  # 합쳐진 열 중 공통적이지 않은 행의 없는 값들은 결측치, NA로 기록된다.
                                  # 오른쪽 df 행 수보다 왼쪽 df 행의 수가 더 많으면 넘치는 행들은 버린다.

# full_join(df1, df2, by = 'x')
# 1,2 중에서 x열이 있으면 모두 병합

full_join(df1, df2, by = 'x')
full_join(df2, df1, by = 'x')
                                  # 모든 df의 데이터를 병합.
                                  # 왼쪽 df 열, 오른쪽 df 열 순서로 병합.
                                  # 합쳐진 열 중 공통적이지 않은 행의 없는 값들은 결측치, NA로 기록된다.

# bind_rows(df1, df2)
# 데이터프레임들을 행 기준으로 합친다.

df1 <- data.frame(x = 1:5, y = rnorm(5))
df2 <- data.frame(x = 6:10, z = rnorm(5))

bind_rows(df1, df2)               #  공통적인 열은 df1 / 없는 열의 행은 결측치로 기록.
                                  #                df2                  df2


# bind_cols(df1, df2)
# 데이터프레임들을 열 기준으로 합친다.

bind_cols(df1, df2)               #  공통적인 열은 자동으로 열 이름이 바뀌어서 df1 df2 순서로 합쳐진다.

# rename(df1, x1_re = x1)
# 데이터 프레임의 특정 열의 이름을 새로 짓는다.

rename(df1, z = y) %>% bind_rows(df2)

숙제
iris에서의 3품종을 각각 df1, df2, df3에 저장한 후,
df_all 라는 이름으로 행단위 병합하기 (virg -> vers -> set 순서로)

# 1

summary(iris)

t_iris <- tbl_df(iris)

df1 <- filter(t_iris, Species == "virginica")
df2 <- filter(t_iris, Species == "versicolor")
df3 <- filter(t_iris, Species == "setosa")

df_all<- bind_rows(df1, df2) %>% bind_rows(df3)

head(df_all)
tail(df_all)

# 2

df1 <- iris[iris$Species == "virginica", ]
df2 <- iris[iris$Species == "versicolor", ]
df3 <- iris[iris$Species == "setosa", ]

df_all <- rbind(df1, df2) %>% rbind(df3)

head(df_all)
tail(df_all)
profile
코딩을 배우는 비전공자 코린이!

0개의 댓글