라이브러리 호출
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값은 모두 지우고, 출력하면
깔끔한 데이터를 얻을 수 있습니다.