티스토리 뷰
막대 그래프 그리기
Barplot(vector or matrix, 옵션) : 막대 그래프 그리기
# beside = T 옵션 : 그룹으로 묶어서 출력. 매트릭스 형태의 데이터만 가능(데이터 프레임 전달 불가)
# beside = F (default) 는 하나의 막대로 묶음
# column끼리 묶어서 row끼리 비교 => 그룹별 비교를 위해 교차 테이블로 변환 필요
x <- c(1,3,5,6,9)
m <- matrix(c(4,6,7,3),nrow = 2)
par(mfrow=c(2,3))
barplot(x) # 1.기본(세로로)
barplot(m, names = c('a','b'), beside = T, col = c(2,3)) # 2. (세로) 그룹으로 묶어서
barplot(m, names = c('a','b'), col = c(2,3)) # 3. (세로)하나의 막대로
barplot(x, horiz = T) # 4. 가로로
barplot(m, names = c('a','b'), beside = T, col = c(2,3), horiz = T) # 5. (가로) 그룹으로 묶어서 가로 출력
barplot(m, names = c('a','b'),col = c(2,3), horiz = T) # 6. (가로) 합쳐서
Q1.
### delivery_02.csv 파일을 읽고
> del <- read.csv('delivery_02.csv', stringsAsFactors = F)
> str(del)
> head(del)
일자 시간대 업종 시도 시군구 읍면동 통화건수
1 20180201 0 음식점-족발/보쌈전문 서울특별시 강남구 논현동 5
2 20180201 0 음식점-족발/보쌈전문 서울특별시 강남구 역삼동 5
3 20180201 0 음식점-족발/보쌈전문 서울특별시 강서구 내발산동 5
############################################################
### 1) 일자별 총 통화건수와 전일대비 증감률 출력 = (오늘 - 이전) / 이전 * 100
# (연산은 행 별로 수행하므로, 연산하고자하는 값이 같은 행에 있어야 함)
> library(plyr)
> df2 <- ddply(del, .(일자), summarise, sum = sum(통화건수))
> df2
일자 sum
1 20180201 39653
2 20180202 46081
3 20180203 54124
...
# sol 1) 사용자 정의 함수 생성 방법
# 전 행 값을 저장하는 사용자 함수
> f_shift <- function(x) {
v_before <- c()
for(i in 1:length(x)){
v_before <- c(v_before, x[max(i-1,1)]) # i가 1일 경우 max(0,1) 이므로 i가 1이면 1번째 값을 리턴
}
return(v_before)
}
> df2$bf <- f_shift(df2$sum)
> round((df2$sum - df2$bf) / df2$bf * 100, 2) # 증감값 출력
[1] 0.00 16.21 17.45 -7.02 -30.40 10.29 1.92 1.99 22.32 ...
# sol 2) data.table::shift()
> install.packages('data.table')
> library(data.table)
shift(x, # 벡터(원본 데이터)
n=1L, # 몇 번째 이전(이후)값을 가져올지 지정
fill=NA, # 채울 값이 없을 경우 default값 설정
type=c("lag", "lead"), # 이전 값을 가져올지 이후 값을 가져올지
give.names=FALSE) # 값 이름 지정
> df2$bf <- shift(df2$sum, fill = df2$sum[1]) # 이전 값 가져오기
> round((df2$sum - df2$bf) / df2$bf * 100, 2) # 증감값 출력
[1] 0.00 16.21 17.45 -7.02 -30.40 10.29 1.92 1.99 22.32 ...
############################################################
### 2) 시간대별로 가장 인기있는 음식업종을 출력
> df3 <- ddply(del, .(시간대, 업종), summarise, sum = sum(통화건수))
> ddply(df3, .(시간대), subset, sum == max(sum))
시간대 업종 sum
1 0 치킨 10750
2 1 치킨 4859
3 2 음식점-중국음식 2908
4 3 음식점-중국음식 2490
5 4 음식점-중국음식 2175
...
21 20 치킨 60824
22 21 치킨 55213
23 22 치킨 47807
24 23 치킨 28257
############################################################
### 3) 요일별 업종의 통화건수의 총합을 비교하기 위한 막대그래프 출력
# 요일 추출
> del$요일 <- as.character(as.Date(as.character(del$일자), '%Y%m%d'),'%A')
> library(reshape2)
> result <- dcast(del, 업종 ~ 요일, fun.aggregate = sum, value.var = '통화건수')
> result
업종 금요일 목요일 수요일 월요일 일요일 토요일 화요일
1 음식점-족발/보쌈전문 12811 12123 14320 11285 13788 15424 12440
2 음식점-중국음식 52633 58258 68307 58788 70507 64889 65071
3 치킨 72591 57815 69168 51656 79446 85512 58737
4 피자 24002 22120 24562 20428 32355 30604 22296
# 그래프 그리기
> barplot(as.matrix(result[,c(5,8,4,3,2,7,6)]/10000), beside = T, col = rainbow(nrow(result)), ylim = c(0,10)) # 만 단위
> legend(1, 10, result$업종, fill = rainbow(nrow(result)), cex = 0.8)
Q2.
### 3. 영화이용현황.csv 파일을 읽고
> movie <- read.csv('영화이용현황.csv', stringsAsFactors = F)
> head(movie)
년 월 일 지역.시도 지역.시군구 지역.읍면동 성별 연령대 이용_비율...
1 2018 5 1 강원도 강릉시 금학동 남 34 0.00231
2 2018 5 1 강원도 강릉시 금학동 남 58 0.00077
3 2018 5 1 강원도 강릉시 금학동 여 23 0.00092
4 2018 5 1 강원도 강릉시 금학동 여 30 0.00123
...
### 요일별(컬럼) 연령대(행)별 극장이용율의 평균을 막대그래프로 출력 (같은 요일 내 연령대별 비교)
# 요일 년/월/일 결합
> v_date <- paste(movie$년, movie$월, movie$일, sep = '/') # paste함수는 벡터 연산 가능
== mapply(paste, movie$년, movie$월, movie$일, sep = '/') # 인자의 반복 전달
# 요일 추출
> movie$day <- as.character(as.Date(v_date, '%Y/%m/%d'), '%A')
# 나이를 연령대로 가공
> movie$연령대2 <- paste(substr(movie$연령대,1,1), '0대', sep = '')
== mapply(paste, substr(movie$연령대,1,1), '0대', sep = '')
# 교차 테이블 생성
> result <- dcast(movie, 연령대2 ~ day, mean, value.var = '이용_비율...')
> result
연령대2 금요일 목요일 수요일 월요일 일요일 토요일 화요일
1 10대 0.0005561747 0.0004034701 0.0004005455 0.0004243347 0.0005570264 0.0006100501 0.0005042570
2 20대 0.0019069306 0.0015105536 0.0015886903 0.0015911271 0.0024861755 0.0028122545 0.0019038536
3 30대 0.0020794534 0.0015080338 0.0015580970 0.0018760910 0.0027885145 0.0030711096 0.0020792371
...
# 그래프 생성
> barplot(as.matrix(result[,c('월요일', '화요일','수요일','목요일','금요일','토요일','일요일')]),
beside = T, col = rainbow(nrow(result))
)
> legend(1, 0.0030, result$연령대2, fill = rainbow(nrow(result)))
Q3.
### kimchi_test.csv 파일을 읽고,
> kimchi <- read.csv('kimchi_test.csv', stringsAsFactors = F)
### 1) 각 년도별 제품별 판매량과 판매금액의 평균을 구하고
> library(plyr)
> data <- ddply(kimchi, .(판매년도, 제품), summarise,
m1 = mean(수량),
m2 = mean(판매금액))
> data
판매년도 제품 m1 m2
1 2013 무김치 11687.50 105809275
2 2013 열무김치 11640.14 94894942
3 2013 총각김치 13437.08 116299698
> library(reshape2)
> result <- dcast(kimchi, 판매년도 ~ 제품, sum, value.var = '수량')
> result
판매년도 무김치 열무김치 총각김치
1 2013 420750 419045 483735
2 2014 447768 489359 551613
3 2015 540809 601661 742150
4 2016 733437 637934 634155
### 년도별 각 제품의 판매량의 증가추이를 plot 그래프로 표현
# 그래프 그리기,
> plot(result[,2]/10000, type = 'o', col = 1, ann = F, axes = F, ylim = c(0,80)) # 만 단위
> lines(result[,3]/10000, type = 'o', col = 2)
> lines(result[,4]/10000, type = 'o', col = 3)
> axis(1, at = 1:4, labels = result[,1]) # x축 눈금
> axis(2, ylim = c(0,800000)) # y축 눈금
# 눈금이름
> title(main = '년도별 제품의 판매량액', xlab = '년도', ylab = '판매량(단위 : 만)')
# 범례
> legend(1, 80, colnames(result)[-1],
+ col = 1:3,
+ lty = 1,
+ cex = 1)
### 2) 각 년도별로 제품의 판매량을 비교할수 있도록 막대그래프로 표현
> rownames(result) <- result$판매년도
> t(result[,-1])
2013 2014 2015 2016
무김치 420750 447768 540809 733437
열무김치 419045 489359 601661 637934
총각김치 483735 551613 742150 634155
> barplot(as.matrix(t(result[,-1]/10000)), beside = T, col = rainbow(3), ylim = c(0,80))
> legend(1, 80, colnames(result)[-1], fill = rainbow(3), cex = 1)
> title(main = '년도별 제품의 판매량액', xlab = '년도', ylab = '판매량(단위 : 만)')
Q4. 조건에 따른 그래프
### 1. crime.csv 파일을 읽고
> crime <- read.csv('crime.csv', stringsAsFactors = F)
> head(crime)
구 년도 CCTV수 발생 검거 검거율
1 종로구 2002 0 4962 4159 83.81701
2 중구 2002 0 6227 5631 90.42878
3 성북구 2002 0 6609 6982 105.64382
4 은평구 2002 0 7909 6662 84.23315
...
> data <- crime[crime$년도 %in% 2010:2014,] # 2010년 부터 2014년 까지의 데이터만 추출
> library(plyr)
> result <- ddply(data, .(구), summarise, avg = mean(검거율)) # 검거율 평균 연산
> result
구 avg
1 강남구 58.51592
2 강동구 64.67834
3 강북구 70.81694
4 강서구 62.66422
5 관악구 58.12718
...
### 2010~2014년의 각 구별 검거율의 평균을 막대그래프로 표현
> barplot(as.matrix(result$avg),beside = T, ylim = c(0,120), names.arg = result$구)
> title(main = '각 구별 검거율 평균', xlab = '구', ylab = '검거율')
par(oma=c(4,3,0,0)) # 그래프 여백 조절(하,좌,상,우)
par(mgp=c(3,0,0)) # 그래프 내 축 여백 조절(축 제목, 눈금, 지표선)
barplot(as.matrix(result$avg), beside = T, axes = F, ylim = c(0,120))
axis(1, at = 1:length(result$구), labels = result$구, las = 2) # las = 축의 lotate
axis(2, las = 1) 0: 축에 평행(default)
1: 수평
2: 축과 직각으로
3: 수직
title(main = '각 구별 검거율 평균', xlab = '구', ylab = '검거율')
### 검거율이 50% 이하면 빨강, 50~70% 노랑, 그이상은 녹색으로 출력
> colors <- c()
> for(i in 1: length(result$avg)) {
if(result$avg[i] <= 50) {
colors <- c(colors,'red')
} else if(result$avg[i] < 70) {
colors <- c(colors,'yellow')
} else {
colors <- c(colors,'green')
}
}
> barplot(matrix(result$avg), beside = T,
main = '각 구별 검거율 평균', xlab = '구', ylab = '검거율',
names.arg = result$구,
col = colors, ylim = c(0,120))
par(oma=c(4,3,0,0)) # (하,좌,상,우)
par(mgp=c(3,0.5,0)) # (축 제목, 눈금, 지표선)
barplot(matrix(result$avg), beside = T,
main = '각 구별 검거율 평균', xlab = '구', ylab = '검거율',
col = colors, ylim = c(0,120), axes = F)
axis(1, at = 1:length(result$구), labels = result$구, las = 2)
axis(2, las = 1)
참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정
'R > Visualize' 카테고리의 다른 글
[R 시각화] 파이, 3D파이 그래프 그리기 - pie, pie3D plot (0) | 2019.01.12 |
---|---|
[R 시각화] 히스토그램 그래프 그리기 - histogram plot (0) | 2019.01.12 |
[R 시각화] 선 그래프 그리기 - Line Plot (2) | 2019.01.10 |