본문 바로가기
R

[R] D3js 와 js를 활용한 시각화

by 빵으니 2020. 7. 9.
Chpa04-3

시각화

보고를 위한 그래프 그리기

D3.js와 그 외 JS 그래프

  • D3.js 는 html, javascirpt 로 만들 수 있는 그래프
  • R에서는 rCharts 를 이용 html, js를 몰라도 사용 가능
  • rChart : JS 라이브러리를 R 에서 직접 사용하게 해주는 패키지
  • D3.js 는 인터랙티브 그래프
In [1]:
# rChart 설치 - Github
install.packages('devtools')
also installing the dependencies 'ini', 'gh', 'rematch2', 'rex', 'crosstalk', 'xopen', 'brew', 'usethis', 'covr', 'DT', 'git2r', 'memoise', 'rcmdcheck', 'remotes', 'roxygen2', 'rversions', 'sessioninfo'


package 'ini' successfully unpacked and MD5 sums checked
package 'gh' successfully unpacked and MD5 sums checked
package 'rematch2' successfully unpacked and MD5 sums checked
package 'rex' successfully unpacked and MD5 sums checked
package 'crosstalk' successfully unpacked and MD5 sums checked
package 'xopen' successfully unpacked and MD5 sums checked
package 'brew' successfully unpacked and MD5 sums checked
package 'usethis' successfully unpacked and MD5 sums checked
package 'covr' successfully unpacked and MD5 sums checked
package 'DT' successfully unpacked and MD5 sums checked
package 'git2r' successfully unpacked and MD5 sums checked
package 'memoise' successfully unpacked and MD5 sums checked
package 'rcmdcheck' successfully unpacked and MD5 sums checked
package 'remotes' successfully unpacked and MD5 sums checked
package 'roxygen2' successfully unpacked and MD5 sums checked
package 'rversions' successfully unpacked and MD5 sums checked
package 'sessioninfo' successfully unpacked and MD5 sums checked
package 'devtools' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\205\AppData\Local\Temp\RtmpIFVq4p\downloaded_packages
In [4]:
# https://github.com/saurfang/rCharts
install_github('saurfang/rCharts', ref='utf8-writelines')
Downloading GitHub repo saurfang/rCharts@utf8-writelines

RCurl   (NA -> 1.98-1.2) [CRAN]
RJSONIO (NA -> 1.3-1.4 ) [CRAN]
bitops  (NA -> 1.0-6   ) [CRAN]
Installing 3 packages: RCurl, RJSONIO, bitops

package 'RCurl' successfully unpacked and MD5 sums checked
package 'RJSONIO' successfully unpacked and MD5 sums checked
package 'bitops' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\205\AppData\Local\Temp\RtmpIFVq4p\downloaded_packages
  checking for file 'C:\Users\205\AppData\Local\Temp\RtmpIFVq4p\remotese404c974580\saurfang-rCharts-e0106ed/DESCRIPTION' (615ms)
-  preparing 'rCharts': (5.6s)
  checking DESCRIPTION meta-information
-  checking for LF line-endings in source and make files and shell scripts
-  checking for empty or unneeded directories
-  building 'rCharts_0.4.5.tar.gz'
   

In [3]:
library('devtools')
In [ ]:
# Rcpp 오류시 conda consol에서 설치
conda install -c conda-forge r-rcpp
In [5]:
# 개발자 제공 기본 예제 해보기
library('rCharts')
In [6]:
hair_eye_male <- subset(as.data.frame(HairEyeColor), Sex == 'Male')
n1 <- nPlot(Freq ~ Hair, group='Eye', data=hair_eye_male, type='multiBarChart')
n1

nPlot() : D3.js의 NVD3 라이브러리 기반

In [11]:
# 데이터 적재
df <- read.csv('R-ggagi-data/example_studentlist2.csv')
attach(df)
In [12]:
# 산포도 그리기 type='scatterChart'
n1 <- nPlot(data=df, height~weight, group='sex', type='scatterChart')
n1
In [14]:
# 파이 차트 그리기
n2 <- nPlot(data=df, ~bloodtype, type='pieChart')
n2
In [16]:
# 파이 차트 -> 도넛 차트
n2$chart(donut=T)
n2
In [35]:
# 멀티 막대 그래프
# 도수를 자동으로 처리해주지 않음
library('dplyr')

df2 <- df %>%
    group_by(bloodtype, sex) %>% 
        summarise(n=n())
`summarise()` regrouping output by 'bloodtype' (override with `.groups` argument)

In [36]:
n4 <- nPlot(data=df2, n~bloodtype, group='sex', type='multiBarChart')
n4
In [37]:
# 라인차트
ts <- read.csv('R-ggagi-data/example_ts2.csv')
In [43]:
ts$time <- as.Date(ts$time) # 날짜형으로 변환
ts$time
In [45]:
# filter 조건에 맞게 뽑아오기
ts2 <- ts %>% filter(year == 2014)
head(ts2)
A data.frame: 6 × 3
timesalesyear
<date><int><int>
12014-01-0145102014
22014-01-0850632014
32014-01-1536942014
42014-01-2237682014
52014-01-2938502014
62014-02-0543002014
In [54]:
n5 <- nPlot(data=ts2, sales~time, type='lineChart')
n5

# x축 time 값이 이상함 (변경 필요)
In [55]:
# x출 time 값 변환 xAxis()
n5$xAxis(tickFormat = "#!
    function(d) {
        return d3.time.format('%Y-%m-%d')
            (new Date(d*1000*3600*24));
    } !#", rotateLabels = -45)

n5
In [56]:
# 누적 영역 차트
ts3 <- read.csv('R-ggagi-data/example_ts3.csv')
head(ts3$time)
  1. '2014-01-01'
  2. '2014-01-08'
  3. '2014-01-15'
  4. '2014-01-22'
  5. '2014-01-29'
  6. '2014-02-05'
In [58]:
ts3$time <- as.Date(ts3$time)
head(ts3$time)
n6 <- nPlot(data=ts3, sales~time, group='product', type='stackedAreaChart')
n6
# x 축 time값 변환 필요
In [59]:
# x축 time 값 변환 xAxis()
n6$xAxis(tickFormat = "#!
    function(d) {
        return d3.time.format('%Y-%m-%d')
            (new Date(d*1000*3600*24));
    } !#", rotateLabels = -45)
n6
In [60]:
# 라인포커스 - 2개 그래프, 아래 그래프는 네비게이터
n7 <- nPlot(data=ts3, sales~time, group='product', type='lineWithFocusChart')
n7

# x 축 time값 변환 필요
In [62]:
# x축 time 값 변환 xAxis()
n7$xAxis(tickFormat = "#!
    function(d) {
        return d3.time.format('%Y-%m-%d')
            (new Date(d*1000*3600*24));
    } !#", rotateLabels = -15)
n7
In [63]:
head(ts3)
A data.frame: 6 × 3
timesalesproduct
<date><int><chr>
12014-01-014716product1
22014-01-084875product1
32014-01-154570product1
42014-01-223798product1
52014-01-293987product1
62014-02-053571product1

Sankey Diagram 으로 예산 한눈에 보기

  • 러시아로 출발한 나폴레옹 병력 수 변화 그래프로 유명
  • 흐름(Flow) 다이어그램의 한 종류로, 화살표의 너비로 흐름의 양을 비율적으로 표현

설치

In [64]:
# library load
library('dplyr')
library('rCharts')
In [70]:
# data load - 2015년 예산안
DF <- read.csv('R-ggagi-data/example_2015_expenditure.csv')
str(DF)
'data.frame':	62 obs. of  6 variables:
 $ 소관명     : chr  "A부서" "A부서" "A부서" "A부서" ...
 $ 회계명     : chr  "과학관관련" "과학관관련" "과학관관련" "과학관" ...
 $ 분야명     : chr  "기술" "기술" "기술" "기술" ...
 $ 부문명     : chr  "기술일반" "기술일반" "기술일반" "기술일반" ...
 $ 프로그램명 : chr  "계정간거래" "과학관관련운영" "회계기금간거래" "계정간거래" ...
 $ sum.확정안.: num  1301000 25336500 486000 1501000 31113145 ...
In [71]:
# 원본 복사 (raw data 이므로)
DF2 <- DF
In [72]:
# sum.확정안 변수 이름 및 단위 변경( 원 => 천원)
colnames(DF2)[6] <- 'value'

# 단위 변경
DF2['value'] <- round(DF2['value']/1000) 
head(DF2)
A data.frame: 6 × 6
소관명회계명분야명부문명프로그램명value
<chr><chr><chr><chr><chr><dbl>
1A부서과학관관련기술기술일반계정간거래 1301
2A부서과학관관련기술기술일반과학관관련운영25336
3A부서과학관관련기술기술일반회계기금간거래 486
4A부서과학관 기술기술일반계정간거래 1501
5A부서과학관 기술기술일반과학관운영 31113
6A부서과학관 기술기술일반회계기금간거래 419
In [74]:
# 데이터 전처리를 위해 자료 복사
DF3 <- DF2
In [82]:
# Sankey Diagram은 모든 노드 1차원, 각각은 sum으로 합산되어 있어야 함
# 소관명 노드 => 회계명 노드 => 분야명 노드 => 부문명 노드 => 프로그램명 노드 순으로 group_by
sum1 <- DF3 %>% group_by(소관명, 회계명) %>% summarise(sum(value))
sum2 <- DF3 %>% group_by(회계명, 분야명) %>% summarise(sum(value))
sum3 <- DF3 %>% group_by(분야명, 부문명) %>% summarise(sum(value))
sum4 <- DF3 %>% group_by(부문명, 프로그램명) %>% summarise(sum(value))
`summarise()` regrouping output by '소관명' (override with `.groups` argument)

`summarise()` regrouping output by '회계명' (override with `.groups` argument)

`summarise()` regrouping output by '분야명' (override with `.groups` argument)

`summarise()` regrouping output by '부문명' (override with `.groups` argument)

In [83]:
sum1
A grouped_df: 8 × 3
소관명회계명sum(value)
<chr><chr><dbl>
A부서과학관 33033
A부서과학관관련 27123
A부서발전균형특별회계 3499882
A부서보험특별회계 609665
A부서사업특별회계 1110638
A부서에너지및자원사업특별회계 579411
A부서예금특별회계 1115288
A부서일반회계 6763710
In [84]:
sum2
A grouped_df: 16 × 3
회계명분야명sum(value)
<chr><chr><dbl>
과학관 기술 33033
과학관관련 기술 27123
발전균형특별회계 교육 240160
발전균형특별회계 기술 238347
발전균형특별회계 산업·중소기업및에너지3017375
발전균형특별회계 통신 4000
보험특별회계 통신 609665
사업특별회계 통신 1110638
에너지및자원사업특별회계기술 579411
예금특별회계 통신 1115288
일반회계 교육 217799
일반회계 기술 6063845
일반회계 문화및관광 73747
일반회계 산업·중소기업및에너지 172057
일반회계 일반·지방행정 97114
일반회계 통신 139148
In [85]:
sum3
A grouped_df: 13 × 3
분야명부문명sum(value)
<chr><chr><dbl>
교육 고등교육 410585
교육 교육일반 2800
교육 평생·직업교육 44574
기술 기술개발 3211448
기술 기술연구지원 3534898
기술 기술일반 195413
문화및관광 문화및관광일반 45497
문화및관광 문화예술 28250
산업·중소기업및에너지산업진흥·고도화3189432
일반·지방행정 국정운영 2118
일반·지방행정 정부자원관리 94996
통신 방송통신 143148
통신 정운사업 2835591
In [86]:
sum4
A grouped_df: 44 × 3
부문명프로그램명sum(value)
<chr><chr><dbl>
고등교육 기술인력양성 410585
교육일반 A부서운영지원 2800
국정운영 A부서운영지원 2118
기술개발 기초연구진흥 2103589
기술개발 미래유망원천기술개발 586878
기술개발 우주개발진흥 371891
기술개발 원자력진흥 149090
기술연구지원 과학문화창달 64200
기술연구지원 기술국제협력 87980
기술연구지원 기술기반조성 188280
기술연구지원 기술연구지원_ 12900
기술연구지원 기술인력양성 2338
기술연구지원 연구공동체활성화 8036
기술연구지원 출연연구기관지원 3171164
기술일반 A부서운영지원 36858
기술일반 계정간거래 2802
기술일반 과학관관련운영 25336
기술일반 과학관운영 31113
기술일반 기술국제협력 1600
기술일반 기술종합조정 38657
기술일반 회계간거래 52258
기술일반 회계기금간거래 6789
문화및관광일반 A부서운영지원 45497
문화예술 콘텐츠방송산업육성 28250
방송통신 A부서운영지원 60061
방송통신 방송기반조성 34611
방송통신 방송산업진흥 16006
방송통신 정보보호강화 25234
방송통신 회계간거래 7236
산업진흥·고도화SW산업활성화 172057
산업진흥·고도화지역경제활성화 3017375
정부자원관리 국가사회정보화 94996
정운사업 계정간거래 127684
정운사업 보험내실화 199220
정운사업 정운사업경영지원 76922
정운사업 정운사업행정지원 384617
정운사업 지속가능경영 314414
정운사업 함께하는서비스 385279
정운사업 회계간거래 108173
정운사업 회계간거래(전출금) 978939
정운사업 회계기금간거래 234343
정운사업 회계기금간거래(전출금) 26000
평생·직업교육 연구공동체활성화 26600
평생·직업교육 평생직업교육체제구축 17974
In [93]:
# Sankey Diagram은 'source', 'target', 'value' 구성되어야 함
colnames(sum1) <- c("source", "target", "value")
colnames(sum2) <- c("source", "target", "value")
colnames(sum3) <- c("source", "target", "value")
colnames(sum4) <- c("source", "target", "value")
In [99]:
head(sum1)
A data.frame: 6 × 3
sourcetargetvalue
<chr><chr><dbl>
1A부서과학관 33033
2A부서과학관관련 27123
3A부서발전균형특별회계 3499882
4A부서보험특별회계 609665
5A부서사업특별회계 1110638
6A부서에너지및자원사업특별회계 579411
In [94]:
# 하나의 객체로 bind
sum1 <- as.data.frame(sum1)
sum2 <- as.data.frame(sum2)
sum3 <- as.data.frame(sum3)
sum4 <- as.data.frame(sum4)

DF4 <- rbind(sum1, sum2, sum3, sum4)
In [98]:
head(DF4)
tail(DF4)
A data.frame: 6 × 3
sourcetargetvalue
<chr><chr><dbl>
1A부서과학관 33033
2A부서과학관관련 27123
3A부서발전균형특별회계 3499882
4A부서보험특별회계 609665
5A부서사업특별회계 1110638
6A부서에너지및자원사업특별회계 579411
A data.frame: 6 × 3
sourcetargetvalue
<chr><chr><dbl>
76정운사업 회계간거래 108173
77정운사업 회계간거래(전출금) 978939
78정운사업 회계기금간거래 234343
79정운사업 회계기금간거래(전출금) 26000
80평생·직업교육연구공동체활성화 26600
81평생·직업교육평생직업교육체제구축 17974
In [106]:
# library load
sankeyPlot <- rCharts$new() # rChart 객체 생성
sankeyPlot$setLib('libraries//rCharts_d3_sankey-gh-pages') # rChart 속성 지정
sankeyPlot$setTemplate(script = 'libraries//rCharts_d3_sankey-gh-pages/layouts/chart.html')
In [107]:
# 그래프 속성 지정 
sankeyPlot$set(
  data = DF4,
  nodeWidth = 15,
  nodePadding = 13,
  layout = 300,
  width = 900,
  height = 600,
  units = "천원",
  title = "Sankey Diagram"
)
In [108]:
# 그래프 실행 - 라인두께가 예산 금액
# 예산이 어디로 흘러가는 지 한눈에 알 수 있음
sankeyPlot

작년에 구입한 아파트는 올랐을까?

서울 - 구 단위 아파트 가격 변화

  • DataSet : 국토교통부 실거래가 공개 시스템 데이터 2006~2014
In [109]:
# library load
library(readxl)
library(dplyr)
library(stringr)
library(rCharts)
sprintf() : 데이터 포맷 변경 함수
In [140]:
# data load -sprintf()
files <- sprintf("%4d년_%02d월_전국_실거래가_아파트(매매).xls",
                rep(2006:2014, each = 12), 1:12)
In [141]:
files
  1. '2006년_01월_전국_실거래가_아파트(매매).xls'
  2. '2006년_02월_전국_실거래가_아파트(매매).xls'
  3. '2006년_03월_전국_실거래가_아파트(매매).xls'
  4. '2006년_04월_전국_실거래가_아파트(매매).xls'
  5. '2006년_05월_전국_실거래가_아파트(매매).xls'
  6. '2006년_06월_전국_실거래가_아파트(매매).xls'
  7. '2006년_07월_전국_실거래가_아파트(매매).xls'
  8. '2006년_08월_전국_실거래가_아파트(매매).xls'
  9. '2006년_09월_전국_실거래가_아파트(매매).xls'
  10. '2006년_10월_전국_실거래가_아파트(매매).xls'
  11. '2006년_11월_전국_실거래가_아파트(매매).xls'
  12. '2006년_12월_전국_실거래가_아파트(매매).xls'
  13. '2007년_01월_전국_실거래가_아파트(매매).xls'
  14. '2007년_02월_전국_실거래가_아파트(매매).xls'
  15. '2007년_03월_전국_실거래가_아파트(매매).xls'
  16. '2007년_04월_전국_실거래가_아파트(매매).xls'
  17. '2007년_05월_전국_실거래가_아파트(매매).xls'
  18. '2007년_06월_전국_실거래가_아파트(매매).xls'
  19. '2007년_07월_전국_실거래가_아파트(매매).xls'
  20. '2007년_08월_전국_실거래가_아파트(매매).xls'
  21. '2007년_09월_전국_실거래가_아파트(매매).xls'
  22. '2007년_10월_전국_실거래가_아파트(매매).xls'
  23. '2007년_11월_전국_실거래가_아파트(매매).xls'
  24. '2007년_12월_전국_실거래가_아파트(매매).xls'
  25. '2008년_01월_전국_실거래가_아파트(매매).xls'
  26. '2008년_02월_전국_실거래가_아파트(매매).xls'
  27. '2008년_03월_전국_실거래가_아파트(매매).xls'
  28. '2008년_04월_전국_실거래가_아파트(매매).xls'
  29. '2008년_05월_전국_실거래가_아파트(매매).xls'
  30. '2008년_06월_전국_실거래가_아파트(매매).xls'
  31. '2008년_07월_전국_실거래가_아파트(매매).xls'
  32. '2008년_08월_전국_실거래가_아파트(매매).xls'
  33. '2008년_09월_전국_실거래가_아파트(매매).xls'
  34. '2008년_10월_전국_실거래가_아파트(매매).xls'
  35. '2008년_11월_전국_실거래가_아파트(매매).xls'
  36. '2008년_12월_전국_실거래가_아파트(매매).xls'
  37. '2009년_01월_전국_실거래가_아파트(매매).xls'
  38. '2009년_02월_전국_실거래가_아파트(매매).xls'
  39. '2009년_03월_전국_실거래가_아파트(매매).xls'
  40. '2009년_04월_전국_실거래가_아파트(매매).xls'
  41. '2009년_05월_전국_실거래가_아파트(매매).xls'
  42. '2009년_06월_전국_실거래가_아파트(매매).xls'
  43. '2009년_07월_전국_실거래가_아파트(매매).xls'
  44. '2009년_08월_전국_실거래가_아파트(매매).xls'
  45. '2009년_09월_전국_실거래가_아파트(매매).xls'
  46. '2009년_10월_전국_실거래가_아파트(매매).xls'
  47. '2009년_11월_전국_실거래가_아파트(매매).xls'
  48. '2009년_12월_전국_실거래가_아파트(매매).xls'
  49. '2010년_01월_전국_실거래가_아파트(매매).xls'
  50. '2010년_02월_전국_실거래가_아파트(매매).xls'
  51. '2010년_03월_전국_실거래가_아파트(매매).xls'
  52. '2010년_04월_전국_실거래가_아파트(매매).xls'
  53. '2010년_05월_전국_실거래가_아파트(매매).xls'
  54. '2010년_06월_전국_실거래가_아파트(매매).xls'
  55. '2010년_07월_전국_실거래가_아파트(매매).xls'
  56. '2010년_08월_전국_실거래가_아파트(매매).xls'
  57. '2010년_09월_전국_실거래가_아파트(매매).xls'
  58. '2010년_10월_전국_실거래가_아파트(매매).xls'
  59. '2010년_11월_전국_실거래가_아파트(매매).xls'
  60. '2010년_12월_전국_실거래가_아파트(매매).xls'
  61. '2011년_01월_전국_실거래가_아파트(매매).xls'
  62. '2011년_02월_전국_실거래가_아파트(매매).xls'
  63. '2011년_03월_전국_실거래가_아파트(매매).xls'
  64. '2011년_04월_전국_실거래가_아파트(매매).xls'
  65. '2011년_05월_전국_실거래가_아파트(매매).xls'
  66. '2011년_06월_전국_실거래가_아파트(매매).xls'
  67. '2011년_07월_전국_실거래가_아파트(매매).xls'
  68. '2011년_08월_전국_실거래가_아파트(매매).xls'
  69. '2011년_09월_전국_실거래가_아파트(매매).xls'
  70. '2011년_10월_전국_실거래가_아파트(매매).xls'
  71. '2011년_11월_전국_실거래가_아파트(매매).xls'
  72. '2011년_12월_전국_실거래가_아파트(매매).xls'
  73. '2012년_01월_전국_실거래가_아파트(매매).xls'
  74. '2012년_02월_전국_실거래가_아파트(매매).xls'
  75. '2012년_03월_전국_실거래가_아파트(매매).xls'
  76. '2012년_04월_전국_실거래가_아파트(매매).xls'
  77. '2012년_05월_전국_실거래가_아파트(매매).xls'
  78. '2012년_06월_전국_실거래가_아파트(매매).xls'
  79. '2012년_07월_전국_실거래가_아파트(매매).xls'
  80. '2012년_08월_전국_실거래가_아파트(매매).xls'
  81. '2012년_09월_전국_실거래가_아파트(매매).xls'
  82. '2012년_10월_전국_실거래가_아파트(매매).xls'
  83. '2012년_11월_전국_실거래가_아파트(매매).xls'
  84. '2012년_12월_전국_실거래가_아파트(매매).xls'
  85. '2013년_01월_전국_실거래가_아파트(매매).xls'
  86. '2013년_02월_전국_실거래가_아파트(매매).xls'
  87. '2013년_03월_전국_실거래가_아파트(매매).xls'
  88. '2013년_04월_전국_실거래가_아파트(매매).xls'
  89. '2013년_05월_전국_실거래가_아파트(매매).xls'
  90. '2013년_06월_전국_실거래가_아파트(매매).xls'
  91. '2013년_07월_전국_실거래가_아파트(매매).xls'
  92. '2013년_08월_전국_실거래가_아파트(매매).xls'
  93. '2013년_09월_전국_실거래가_아파트(매매).xls'
  94. '2013년_10월_전국_실거래가_아파트(매매).xls'
  95. '2013년_11월_전국_실거래가_아파트(매매).xls'
  96. '2013년_12월_전국_실거래가_아파트(매매).xls'
  97. '2014년_01월_전국_실거래가_아파트(매매).xls'
  98. '2014년_02월_전국_실거래가_아파트(매매).xls'
  99. '2014년_03월_전국_실거래가_아파트(매매).xls'
  100. '2014년_04월_전국_실거래가_아파트(매매).xls'
  101. '2014년_05월_전국_실거래가_아파트(매매).xls'
  102. '2014년_06월_전국_실거래가_아파트(매매).xls'
  103. '2014년_07월_전국_실거래가_아파트(매매).xls'
  104. '2014년_08월_전국_실거래가_아파트(매매).xls'
  105. '2014년_09월_전국_실거래가_아파트(매매).xls'
  106. '2014년_10월_전국_실거래가_아파트(매매).xls'
  107. '2014년_11월_전국_실거래가_아파트(매매).xls'
  108. '2014년_12월_전국_실거래가_아파트(매매).xls'
In [142]:
DF <- NULL
In [143]:
# paste0 : 문자열 열결

for(i in 1:length(files)){
    t <- read_excel(path=paste0("R-ggagi-data//rawdata/", files[i]), sheet=1, col_names=T)
    t <- mutate(t, date=paste0(substr(files[i], 1,4), "-", month=substr(files[i], 7,8), "-10"))
    DF <- rbind(DF, t)
}
In [144]:
head(DF)
A tibble: 6 × 11
시군구본번부번단지명전용면적(m2)계약일거래금액(만원)건축년도도로명주소date
<chr><dbl><dbl><chr><dbl><chr><chr><chr><dbl><chr><chr>
서울특별시 강남구 개포동120대청39.5321~3122,300151992개포로109길2006-01-10
서울특별시 강남구 개포동120대청39.531~10 24,8005 1992개포로109길2006-01-10
서울특별시 강남구 개포동120대청39.5311~2023,720151992개포로109길2006-01-10
서울특별시 강남구 개포동120대청51.1211~2033,7008 1992개포로109길2006-01-10
서울특별시 강남구 개포동120대청60.0011~2044,000141992개포로109길2006-01-10
서울특별시 강남구 개포동120대청60.0011~2044,0007 1992개포로109길2006-01-10
In [157]:
# 변수명 변경 - 한글 변수명 깨진 경우만
DF2 <- DF #안전하게 새로운 객체에 복사
colnames(DF2) <- c("시군구", "본번", "부번", "단지명", "전용면적", "계약일", 
                   "거래금액", "층", "건축년도", "도로명주소", "date")
In [158]:
# 필요한 데이터 불러오기
DF3 <- data.frame(date=DF2$date, addr=DF2$시군구, val=DF2$거래금액)

head(DF3)
str(DF3)
A data.frame: 6 × 3
dateaddrval
<chr><chr><chr>
12006-01-10서울특별시 강남구 개포동22,300
22006-01-10서울특별시 강남구 개포동24,800
32006-01-10서울특별시 강남구 개포동23,720
42006-01-10서울특별시 강남구 개포동33,700
52006-01-10서울특별시 강남구 개포동44,000
62006-01-10서울특별시 강남구 개포동44,000
'data.frame':	588766 obs. of  3 variables:
 $ date: chr  "2006-01-10" "2006-01-10" "2006-01-10" "2006-01-10" ...
 $ addr: chr  "서울특별시 강남구 개포동" "서울특별시 강남구 개포동" "서울특별시 강남구 개포동" "서울특별시 강남구 개포동" ...
 $ val : chr  "22,300" "24,800" "23,720" "33,700" ...
gsub() : 모든 매치부분을 치환
In [164]:
# 데이터 형 변환 전 작업
# chr->int (value값만) 로 바꾸기 전에 val 값에 있는 , 제거해주기 : gsub

DF3$val <- gsub(',','',DF3$val)
In [165]:
head(DF3)
A data.frame: 6 × 3
dateaddrval
<chr><chr><chr>
12006-01-10서울특별시 강남구 개포동22300
22006-01-10서울특별시 강남구 개포동24800
32006-01-10서울특별시 강남구 개포동23720
42006-01-10서울특별시 강남구 개포동33700
52006-01-10서울특별시 강남구 개포동44000
62006-01-10서울특별시 강남구 개포동44000
In [166]:
# 데이터 형 변환
# chr->int (value값만)
DF3[['val']] <- as.integer(DF3[['val']])
In [167]:
head(DF3)
A data.frame: 6 × 3
dateaddrval
<chr><chr><int>
12006-01-10서울특별시 강남구 개포동22300
22006-01-10서울특별시 강남구 개포동24800
32006-01-10서울특별시 강남구 개포동23720
42006-01-10서울특별시 강남구 개포동33700
52006-01-10서울특별시 강남구 개포동44000
62006-01-10서울특별시 강남구 개포동44000
In [176]:
# 주소 변환 : 서울특별시 강남구 개포동 -> 강남구

# 서울특별시 강남구 개포동을 나눠서 구만 뽑아오기 - str_split_fixed
City <- str_split_fixed(DF3[,2], " ", 3)
City <- data.frame(City)
head(City)
A data.frame: 6 × 3
X1X2X3
<chr><chr><chr>
1서울특별시강남구개포동
2서울특별시강남구개포동
3서울특별시강남구개포동
4서울특별시강남구개포동
5서울특별시강남구개포동
6서울특별시강남구개포동
In [178]:
# 구만 가져와서 세 데이터프레임 생성
DF4 <- data.frame(date=DF3[,1], addr=City[,2], val=DF3[,3])
head(DF4)
A data.frame: 6 × 3
dateaddrval
<chr><chr><int>
12006-01-10강남구22300
22006-01-10강남구24800
32006-01-10강남구23720
42006-01-10강남구33700
52006-01-10강남구44000
62006-01-10강남구44000
In [181]:
# 구별 평균 구하기 - 중앙값, 또는 면적별 평균 등 다양하게
DF5 <- DF4 %>% group_by(date, addr) %>% summarise(mean(val))
head(DF5)
`summarise()` regrouping output by 'date' (override with `.groups` argument)

A grouped_df: 6 × 3
dateaddrmean(val)
<chr><chr><dbl>
2006-01-10강남구76892.96
2006-01-10강동구39031.67
2006-01-10강북구18964.91
2006-01-10강서구25348.86
2006-01-10관악구24570.44
2006-01-10광진구37802.83
In [182]:
# 최종데이터 정리
colnames(DF5)[3] <- "val"
head(DF5)
A grouped_df: 6 × 3
dateaddrval
<chr><chr><dbl>
2006-01-10강남구76892.96
2006-01-10강동구39031.67
2006-01-10강북구18964.91
2006-01-10강서구25348.86
2006-01-10관악구24570.44
2006-01-10광진구37802.83
In [183]:
# 그래프 그리기
g2 <- rCharts$new()
In [188]:
g2$setLib('R-ggagi-data//libraries/nyt_home')
g2$setTemplate(script = 'R-ggagi-data//libraries/nyt_home/layouts/nyt_home.html')
In [189]:
g2$set(
    description = "This data comes from the 'rt.molit.go.kr' dataset",
    data = DF5,
    groups = "addr"
)
In [190]:
g2
In [192]:
# html로 출력
# cat(g2$html())
In [ ]:

'R' 카테고리의 다른 글

[R] 확률 실전예제--------주피터파일---------  (0) 2020.07.13
[R] 확률  (0) 2020.07.10
[R] R 필수 패키지 설치 및 기초  (0) 2020.07.08
[R] 데이터 시각화 및 EDA  (0) 2020.07.08
[R] 데이터 시각화  (0) 2020.07.08

댓글