티스토리 뷰

반응형

막대 그래프 그리기



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 캠퍼스 머신러닝기반의 빅데이터분석 양성과정


반응형
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday