라이브러리 호출
install.packages("quantmod")
library(quantmod)
quantmod library를 사용하면 yahoo의 finance 웹사이트에서 주가데이터와 환율데이터를 다운로드해서 가져올 수 있습니다.
해당 데이터로 실습을 합니다.
sec <- getSymbols(Symbols = "005930.KS", from = "2021-10-01", to = "2021-12-31", auto.assign=FALSE )
str(sec)
getSymbols 함수를 사용해서 데이터를 불러오고
Symbols자리에 종목코드를 집어넣으면 해당 주식의 날짜별 데이터를 가져올 수 있습니다.
출력
> str(sec)
An 'xts' object on 2021-10-01/2021-12-30 containing:
Data: num [1:63, 1:6] 73900 73000 72600 71600 72300 70700 68700 69000 70200 70200 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:6] "005930.KS.Open" "005930.KS.High" "005930.KS.Low" "005930.KS.Close" ...
Indexed by objects of class: [Date] TZ: UTC
xts Attributes:
List of 2
$ src : chr "yahoo"
$ updated: POSIXct[1:1], format: "2022-05-04 20:27:01"
해당 데이터가 list 형으로 되어있어서 dataframe으로 수정합니다.
sec <- as.data.frame(sec)
cbind 함수를 사용해서 sec데이터의 005930.KS.Close와 005930.KS.Volume 2개의 컬럼만 따로 추출하여 날짜를 기준으로 결합하겠습니다.
head(sec[c("005930.KS.Close", "005930.KS.Volume")])
sec <- cbind(date = rownames(sec), symbol = "005930.KS",
sec[c("005930.KS.Close", "005930.KS.Volume")])
head(sec)
출력
> head(sec)
date symbol 005930.KS.Close 005930.KS.Volume
2021-10-01 2021-10-01 005930.KS 73200 15803395
2021-10-05 2021-10-05 005930.KS 72200 24013921
2021-10-06 2021-10-06 005930.KS 71300 18956962
2021-10-07 2021-10-07 005930.KS 71600 13683532
2021-10-08 2021-10-08 005930.KS 71500 14043287
2021-10-12 2021-10-12 005930.KS 69000 31001484
위 cbind에서 date를 rownames(sec)로 따로 만들어줘서
행 이름과 date가 겹치기 때문에 행 이름은 제거를 해줘야 합니다.
행 이름 제거 & close, volume으로 컬럼이름 수정
rownames(sec) <- NULL
colnames(hmc)[c(3, 4)] <- c("close", "volume")
출력
# 기존 변경 전
> head(sec)
date symbol 005930.KS.Close 005930.KS.Volume
1 2021-10-01 005930.KS 73200 15803395
2 2021-10-05 005930.KS 72200 24013921
3 2021-10-06 005930.KS 71300 18956962
4 2021-10-07 005930.KS 71600 13683532
5 2021-10-08 005930.KS 71500 14043287
6 2021-10-12 005930.KS 69000 31001484
# 변경 후
# 행 이름 제거, # 컬럼 이름 변경
> rownames(sec) <- NULL
> colnames(sec)[c(3, 4)] <- c("close", "volume")
> head(sec)
date symbol close volume
1 2021-10-01 005930.KS 73200 15803395
2 2021-10-05 005930.KS 72200 24013921
3 2021-10-06 005930.KS 71300 18956962
4 2021-10-07 005930.KS 71600 13683532
5 2021-10-08 005930.KS 71500 14043287
6 2021-10-12 005930.KS 69000 31001484
행 이름 정상적으로 제거되었고, 컬럼 명이 변경되었음을 확인할 수 있습니다.
rbind를 하기 위해서 예시데이터를 똑같이 하나 더 만들어 줍니다.
위에서 똑같은 방법으로 설명은 생략
hmc <- getSymbols(Symbols = "005387.KS", from = "2021-10-01", to = "2021-12-31", auto.assign=FALSE )
hmc <- as.data.frame(hmc)
head(hmc)
head(hmc[c("005387.KS.Close", "005387.KS.Volume")])
hmc <- cbind(date = rownames(hmc), symbol = "005387.KS",
hmc[c("005387.KS.Close", "005387.KS.Volume")] )
rownames(hmc) <- NULL
colnames(hmc)[c(3, 4)] <- c("close", "volume")
head(hmc)
sec와 hmc 2개의 데이터가 생성되었습니다.
> head(hmc)
date symbol close volume
1 2021-10-01 005387.KS 92800 108008
2 2021-10-05 005387.KS 91500 142854
3 2021-10-06 005387.KS 93100 85533
4 2021-10-07 005387.KS 95800 65835
5 2021-10-08 005387.KS 96100 80350
6 2021-10-12 005387.KS 95700 52477
> head(sec)
date symbol close volume
1 2021-10-01 005930.KS 73200 15803395
2 2021-10-05 005930.KS 72200 24013921
3 2021-10-06 005930.KS 71300 18956962
4 2021-10-07 005930.KS 71600 13683532
5 2021-10-08 005930.KS 71500 14043287
6 2021-10-12 005930.KS 69000 31001484
데이터는 다르지만 똑같은 형태인 데이터셋을 2개 만들었습니다.
곧바로 rbind함수를 실행해보겠습니다.
stock <- rbind(sec, hmc)
head(stock)
종목 코드 열인 symbol을 보면 알 수 있습니다.
1 ~ 63까지가 삼성전자의 데이터이고,
64 ~ 126까지가 현대자동차의 데이터입니다.
이렇게 2개의 다른 데이터셋을 결합할 수 있습니다.
> stock
date symbol close volume
1 2021-10-01 005930.KS 73200 15803395 # 삼성전자 데이터
2 2021-10-05 005930.KS 72200 24013921
3 2021-10-06 005930.KS 71300 18956962
4 2021-10-07 005930.KS 71600 13683532
5 2021-10-08 005930.KS 71500 14043287
6 2021-10-12 005930.KS 69000 31001484
7 2021-10-13 005930.KS 68800 24172015
8 2021-10-14 005930.KS 69400 19520641
9 2021-10-15 005930.KS 70100 18051612
10 2021-10-18 005930.KS 70200 13486391
11 2021-10-19 005930.KS 70600 9507991
12 2021-10-20 005930.KS 70300 10151638
13 2021-10-21 005930.KS 70200 10891094
14 2021-10-22 005930.KS 70400 8395448
15 2021-10-25 005930.KS 70200 10029621
16 2021-10-26 005930.KS 71100 10528252
17 2021-10-27 005930.KS 70100 10295316
18 2021-10-28 005930.KS 70700 20644902
19 2021-10-29 005930.KS 69800 17016151
20 2021-11-01 005930.KS 69900 11503729
21 2021-11-02 005930.KS 71500 16812570
22 2021-11-03 005930.KS 70400 12770428
23 2021-11-04 005930.KS 70600 11818987
24 2021-11-05 005930.KS 70200 12667743
25 2021-11-08 005930.KS 70600 11121981
26 2021-11-09 005930.KS 70500 11159589
27 2021-11-10 005930.KS 70200 9422009
28 2021-11-11 005930.KS 69900 11489122
29 2021-11-12 005930.KS 70600 10087450
30 2021-11-15 005930.KS 71400 12420710
31 2021-11-16 005930.KS 71300 10919239
32 2021-11-17 005930.KS 70700 11027606
33 2021-11-18 005930.KS 70200 10144957
34 2021-11-19 005930.KS 71200 11954728
35 2021-11-22 005930.KS 74900 27506623
36 2021-11-23 005930.KS 75300 22029195
37 2021-11-24 005930.KS 74800 15652305
38 2021-11-25 005930.KS 73700 12559258
39 2021-11-26 005930.KS 72300 13002242
40 2021-11-29 005930.KS 72300 16682559
41 2021-11-30 005930.KS 71300 30364841
42 2021-12-01 005930.KS 74400 21954856
43 2021-12-02 005930.KS 75800 23652940
44 2021-12-03 005930.KS 75600 18330240
45 2021-12-06 005930.KS 76300 16391250
46 2021-12-07 005930.KS 77400 19232453
47 2021-12-08 005930.KS 77400 21558340
48 2021-12-09 005930.KS 78200 21604528
49 2021-12-10 005930.KS 76900 9155219
50 2021-12-13 005930.KS 76800 15038750
51 2021-12-14 005930.KS 77000 10976660
52 2021-12-15 005930.KS 77600 9584939
53 2021-12-16 005930.KS 77800 11996128
54 2021-12-17 005930.KS 78000 13108479
55 2021-12-20 005930.KS 77100 11264375
56 2021-12-21 005930.KS 78100 14245298
57 2021-12-22 005930.KS 79400 17105892
58 2021-12-23 005930.KS 79900 13577498
59 2021-12-24 005930.KS 80500 12086380
60 2021-12-27 005930.KS 80200 10783368
61 2021-12-28 005930.KS 80300 18226325
62 2021-12-29 005930.KS 78800 19794795
63 2021-12-30 005930.KS 78300 14236700
64 2021-10-01 005387.KS 92800 108008 # 여기서부터 현대자동차 데이터
65 2021-10-05 005387.KS 91500 142854
66 2021-10-06 005387.KS 93100 85533
67 2021-10-07 005387.KS 95800 65835
68 2021-10-08 005387.KS 96100 80350
69 2021-10-12 005387.KS 95700 52477
70 2021-10-13 005387.KS 98500 98226
71 2021-10-14 005387.KS 99100 75945
72 2021-10-15 005387.KS 99700 109056
73 2021-10-18 005387.KS 100000 43648
74 2021-10-19 005387.KS 99800 38447
75 2021-10-20 005387.KS 99100 52920
76 2021-10-21 005387.KS 98500 28210
77 2021-10-22 005387.KS 98000 53776
78 2021-10-25 005387.KS 98600 30712
79 2021-10-26 005387.KS 100000 49703
80 2021-10-27 005387.KS 99800 46890
81 2021-10-28 005387.KS 99600 65956
82 2021-10-29 005387.KS 97900 190494
83 2021-11-01 005387.KS 97300 38263
84 2021-11-02 005387.KS 99000 52010
85 2021-11-03 005387.KS 98600 52784
86 2021-11-04 005387.KS 101000 102459
87 2021-11-05 005387.KS 102000 50635
88 2021-11-08 005387.KS 102000 45959
89 2021-11-09 005387.KS 100500 43161
90 2021-11-10 005387.KS 99800 61779
91 2021-11-11 005387.KS 99000 62718
92 2021-11-12 005387.KS 100500 77660
93 2021-11-15 005387.KS 101500 50184
94 2021-11-16 005387.KS 100000 81583
95 2021-11-17 005387.KS 99700 99969
96 2021-11-18 005387.KS 99300 62083
97 2021-11-19 005387.KS 101000 93428
98 2021-11-22 005387.KS 103000 115000
99 2021-11-23 005387.KS 101000 49487
100 2021-11-24 005387.KS 100500 46581
101 2021-11-25 005387.KS 99000 44285
102 2021-11-26 005387.KS 96800 59202
103 2021-11-29 005387.KS 95000 64425
104 2021-11-30 005387.KS 92700 126889
105 2021-12-01 005387.KS 95200 57573
106 2021-12-02 005387.KS 98600 97508
107 2021-12-03 005387.KS 98700 58303
108 2021-12-06 005387.KS 99600 37288
109 2021-12-07 005387.KS 100000 74364
110 2021-12-08 005387.KS 99800 68506
111 2021-12-09 005387.KS 99500 73889
112 2021-12-10 005387.KS 100000 36045
113 2021-12-13 005387.KS 101500 74162
114 2021-12-14 005387.KS 102500 51064
115 2021-12-15 005387.KS 101500 54096
116 2021-12-16 005387.KS 102000 40362
117 2021-12-17 005387.KS 101500 82656
118 2021-12-20 005387.KS 99800 57000
119 2021-12-21 005387.KS 100500 49408
120 2021-12-22 005387.KS 102000 48258
121 2021-12-23 005387.KS 102000 42262
122 2021-12-24 005387.KS 105000 78738
123 2021-12-27 005387.KS 104500 69957
124 2021-12-28 005387.KS 105000 82228
125 2021-12-29 005387.KS 101000 88034
126 2021-12-30 005387.KS 101000 45697
이번에는 merge함수를 사용해서 열을 추가해보도록 하겠습니다.
아까와 같은 방식이지만, 다른 데이터인 달러 환율 데이터를 가져오겠습니다.
fx <- getSymbols(Symbols = "KRW=X", from = "2021-10-01", to = "2021-12-31", auto.assign=FALSE )
fx <- as.data.frame(fx)
head(fx[c("KRW=X.Close")])
fx <- cbind(date = rownames(fx), fx[c("KRW=X.Close")])
head(fx)
> head(fx)
date KRW=X.Close
2021-10-01 2021-10-01 1183.72
2021-10-04 2021-10-04 1180.00
2021-10-05 2021-10-05 1183.78
2021-10-06 2021-10-06 1187.17
2021-10-07 2021-10-07 1191.38
2021-10-08 2021-10-08 1191.15
똑같이 행 이름은 없애지만, 이번에는 KRW=X.Close 한 열만 가져오겠습니다.
이후에 해당 열을 close로 열 이름을 변경해줍니다.
rownames(fx) <- NULL
colnames(fx)[c(2)] <- c("close")
head(fx)
출력
> head(fx)
date close
1 2021-10-01 1183.72
2 2021-10-04 1180.00
3 2021-10-05 1183.78
4 2021-10-06 1187.17
5 2021-10-07 1191.38
6 2021-10-08 1191.15
date 열과 close 열이 있음을 확인했습니다.
그렇다면, sec 데이터에 fx 데이터와 같은 열이 있는지 확인해야 합니다.
이 조건을 확인하기 위해서 intersect함수를 사용하면 같은 열이 있는지 알 수 있습니다.
> # 공통열이 뭐가 있는지 확인
> intersect(names(sec), names(fx))
[1] "date" "close"
두 데이터셋에 date, close의 2개의 열이 동시에 있음을 확인할 수 있습니다.
우리는 date인 날짜를 기준으로 열에 추가해보겠습니다.
# 날짜를 기준으로해서 데이터를 결합
report <- merge(sec, fx, by = "date")
head(report)
결과
> head(report)
date symbol close.x volume close.y
1 2021-10-01 005930.KS 73200 15803395 1183.72
2 2021-10-05 005930.KS 72200 24013921 1183.78
3 2021-10-06 005930.KS 71300 18956962 1187.17
4 2021-10-07 005930.KS 71600 13683532 1191.38
5 2021-10-08 005930.KS 71500 14043287 1191.15
6 2021-10-12 005930.KS 69000 31001484 1195.80
date를 기준으로 결합해서 date는 하나로 모두 축소되었고,
close는 2개의 데이터가 겹치므로 컬럼이름이 변경된 것을 확인할 수 있습니다.
기존에 있던 sec의 close는 close.x가 되었고,
fx의 close는 close.y가 되었습니다.
이번에는 mtcars의 데이터를 가지고 진행해보겠습니다.
head(mtcars)
car <- mtcars
차 이름인 행 이름을 name컬럼을 생성해서 삽입
car$name <- rownames(car)
rownames(car) <- NULL
head(car)
출력
> head(car)
mpg cyl disp hp drat wt qsec vs am gear carb name
1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4
2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 Mazda RX4 Wag
3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 Datsun 710
4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 Hornet 4 Drive
5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 Hornet Sportabout
6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 Valiant
행 이름이 name컬럼이 만들어져서 옮겨간 모습입니다.
그럼 이번에는 2개의 조건으로 데이터를 분리해서 2개의 데이터셋을 만들어보겠습니다
hp가 145 초과인 차량wt가 3.2 미만인 차량# 1. 145hp 초과의 자동차
highhp.car <- car[car$hp > 145,]
# 2. 3200 파운드 미만의 자동차
lightwt.car <- car[car$wt < 3.2,]
출력
> head(highhp.car)
mpg cyl disp hp drat wt qsec vs am gear carb name
5 18.7 8 360.0 175 3.15 3.44 17.02 0 0 3 2 Hornet Sportabout
7 14.3 8 360.0 245 3.21 3.57 15.84 0 0 3 4 Duster 360
12 16.4 8 275.8 180 3.07 4.07 17.40 0 0 3 3 Merc 450SE
13 17.3 8 275.8 180 3.07 3.73 17.60 0 0 3 3 Merc 450SL
14 15.2 8 275.8 180 3.07 3.78 18.00 0 0 3 3 Merc 450SLC
15 10.4 8 472.0 205 2.93 5.25 17.98 0 0 3 4 Cadillac Fleetwood
> head(lightwt.car)
mpg cyl disp hp drat wt qsec vs am gear carb name
1 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4
2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 Mazda RX4 Wag
3 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 Datsun 710
8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 Merc 240D
9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 Merc 230
18 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1 Fiat 128
이제 %in% 연산자를 통해서 둘의 겹치는 자동차 이름을 한번 출력해보겠습니다.
index <- match(highhp.car$name, lightwt.car$name)
index
match함수를 통해서 두 데이터셋의 겹치는 부분의 index값을 알아낼수 있습니다.
만약 겹치지 않는다면, NA를 반환하고 일치하는 부분은 index값을 반환합니다.
match() 함수에서 두번째 인자를 기준으로 겹치는 값을 찾습니다.
여기서는 lightwt에서 highhp와 겹치는 값이 있는지 찾습니다.
출력
> index
[1] NA NA NA NA NA NA NA NA NA NA NA NA 13 14 NA
결과를 보면
13, 14 index가 겹치는 값이라는 것을 알 수 있습니다.
이제 마지막으로 해당 인덱스의 값만 추출해보겠습니다
lightwt.car[na.omit(index), ]
출력
> lightwt.car[na.omit(index), ]
mpg cyl disp hp drat wt qsec vs am gear carb name
29 15.8 8 351 264 4.22 3.17 14.5 0 1 5 4 Ford Pantera L
30 19.7 6 145 175 3.62 2.77 15.5 0 1 5 6 Ferrari Dino
index에 해당하는 열에서 na.omit으로 NA값은 모두 지우고, 출력하면
깔끔한 데이터를 얻을 수 있습니다.