R에서 행렬(matrix)와 배열(array)를 쓰는 이유는 연산 속도의 사유로 많이 사용하게 된다. dataframe으로 된 데이터 셋을 연산하게 되면 속도가 매우 느린 현상이 발생 하게 된다. R에서 멀티코어 코딩을 하려면, 반드시 알고 넘어가야 하는 것이 행렬(matrix)와 배열(array)이다.
집합 union(합집합), intersect(교집합), setdiff(차집합) 계산
R에서 vector union(합집합), intersect(교집합), setdiff(차집합)은 실무에서는 데이터 기준을 세우고 돌릴때, 사용이 많이 된다. 벡터를 추가 하거나, 필요한 것만 불러 올 경우에는 집합 계산을 할 수 있다.
포아송(Poisson) 분포 이론 및 R 예제
일반적으로 매우 회귀하여 일어날 확률이 아주 작은 경우에 포아송(Poisson) 분포를 사용한다. 예를 들어 고속도로 상에서 하루동안 발생하는 교통사고에 의한 사망자수, 어느 집에 한 시간 동안 걸려 오는 전화 통화수, 1주일간 어떤 동사무소에 접수되는 사망신고수, 하루동안 정전되는 횟수 등과 같이 회귀한 사건의 수를 확률 변수로 할때 이다.
구체적으로 포아송 분포가 적용되기 위해서는 다음의 가정을 만족하여야 한다.
- 독립성 : 한 단위 시간이나 공간에서 출현하는 성공횟수와 중복되지 않는 다른 단위 시간이나 공간에서 출현하는 성공횟수는 서로 독립이다.
- 비집략성 : 극히 작은 시간이나 공간에서 둘 또는 그 이상의 성공이 같이 일어날 확률은 매우 작으며 0으로 간주된다.
- 비례성 : 단위 시간이나 공간에서 성공의 평균출현횟수는 일정하며, 이는 시간이나 공간에 따라 변하지 않는다.
확률 분포 X가 위의 세가지 조건을 만족 할때, 성공의 평균출현 횟수를 m이라고 하고 하면 X의 확률 분포는 다음의 포아송 분포를 따른다.
unique와 duplicated의 차이 이해
실무에서는 unique와 duplicated는 많이 사용하는 데이터 이다. 예를 들어 부동산의 구별로 평당 가격 추세를 그리는 데이터셋을 정리하기 위한 함수를 그릴때, unique를 이용하고, duplicated는 데이터를 취합 할때, 중복이 없는지 확인 한다. 실무에서 데이터 전처리 하거라 모델을 사용할때 많이 사용하므로, R을 진입 할때는 반드시 알고 넘어가야 한다.
R(Rstudio) 에서 정렬, 순위, 순서, 정하기
정렬, 순위, 순서 중 실무에서 가장 많이 하는 것이 정렬이다. R에서는 데이터의 성격을 미리 보자고 할 때, 사용을 한다. 주식의 시세의 차이를 계산 하다든지 증감율을 계산을 하고 싶다면 반드시 해야하는 것이 정렬이다.
house 데이터 셋은 아래 링크와 같이 있다.
https://drive.google.com/file/d/17bjJDtn8r8SazhUCE5N_WwKPZosuvm3m/view?usp=sharing
그룹 요약 통계집계함수 aggregate, tapply 병렬 최소최대값 pmin,pmax 2020년 , 2021년 20 대 대기업 연봉 변동
그룹 요약 집계 함수는 대부분 dplyr의 group_by(변수명), summarise() 연산 할 수 있다. 하지만, 우리가 데이터를 분석하기 전에, 미리 간단하게 내용을 보고자 할 때는, Rbase 함수가 보다 간단하게 쓰일 경우가 있다. 20대 대기업 연봉 변동도, 아래 예제와 같이 aggregate, tapply 함수 ggplot2 그래프롤 그리면, 여러가지 인사이트를 얻을 수 있다.
tapply function 함수로 평균 합계 구하기 , ggplot2로 시계열 그래프 예제
apply family는 원래 R에서 처음 사용자에게는 넘기 힘든 벽이나, 마찮가지 이다. 하지만, 데이터의 형태를 쉽게 알기 위해 tapply를 만들었는데, 객체지향 프로그램을 잘 다루어 본 사람을 잘 아는데, 그렇지 않은 사람은 이해하기 어려울 수 있다.
참고로 아래 분석에 사용하는 데이터 셋은 아래와 같다.
aggregate 집계 함수 사용법
네이버 지식인에서 아래와 같은 질문이 왔다.
반별 점수 합계 |
반 국어점수
1 4 339
2 5 297
콤마(comma) 달린 문자형(character) 날짜형(Date) type 으로 바꾸기
네이버 지식인에서 아래와 같이 질문이 왔다. 날짜 변환은 현업 수기 입력 데이터를 받았을때, 많이 보는 데이터이다. 실무에서는 많이 겪어보는 문제이다.
이건은 아래와 정규화 표현식으로 간단하게 풀 수 있다. gsub() 함수는 문자열을 변경 할때 주로 사용한다.
하지만, 콤마는 다른 것과 다르게, gsub(변경전, 변경후, 데이터)에서 변경전 데이터를 입력 할때, 다른것과는 다르게 "\\."을 입력 하여야 한다.
그리고, 날짜로 변환 하려면, as.Date 함수를 사용하여야 한다. 이것은 R의 기본 내장 함수가 있으므로 별도의 패키지가 필요하지 않다.
벡터 함수, max,min,sum,mean,median,cor,colSoms,rowSoms
벡터 함수는 기초적으로 알아야 하는 함수이다. 모델을 돌리기 전, 데이터 탐색을 할 때, 벡터 함수를 미리 돌려 보고, 데이터가 맞는지 검증을 하게 된다. 물론 집계할 수 있는 colSomes, rowSums와 같은 함수도 있다. 이 것에 대한 내용을 알게 되면, 향후 dplyr 에서 summarise나 mutate 에서 자유로이 계산 할 수 있는 장점을 가지고 있다.
3.8 벡터 함수
R의 큰 장점중 하나는 반복문과 첨자 없이 전체 벡터에 대한 함수를 연산할 수 있다는 접입니다. 주요 벡터 함수는 아래 표와 같습니다. 다음 숫자 벡터를 사용해 해당 함수를 실행해 보십시오.
y<-c(8,3,5,7,6,6,8,9,2,3,9,4,10,4,11)
일부 벡터 함수는 1개의 값 만을 출력 하기도 합니다.
mean(y)
## [1] 6.333333
연산 | 의미 |
max(x) | x의 최대값 |
min(x) | x의 최소값 |
sum(x) | 모든 x값의 합 |
mean(x) | x의 산술평균 |
median(x) | x의 중위수 |
range(x) | x의 최소값과 최대값의 차이 |
var(x) | x의 표본분산 |
cor(x,y) | 벡터 x와 y 와 상관관계 |
sort(x) | x 값의 정렬 |
rank(x) | x값을 순위 벡터 |
order(x) | 오름차순으로 x를 정렬하는 순열을 포함한 정수 벡터 |
quantile(x) | x 값의 사분위수를 나타내는 벡터 |
cumsum(x) | 설정된 지점까지 모든 요소의 합을 포함하는 벡터 |
cumprod(x) | 설정된 지점까지 모든 요소의 합을 포함하는 벡터 |
colMeans(x) | 데이터 프레임 또는 행렬 x의 열 평균 |
colMeans(x) | 데이터 프레임 또는 행렬 x의 열 평균 |
colSums(x) | 데이터 프레임 또는 행렬 x의 열 합계 |
rowMeans(x) | 데이터 프레임 또는 행렬 x의 행 평균 |
rowSums(x) | 데이터 프레임 또는 행렬 x의 행 합 |
2 개의 값을 생성하는 벡터 함수도 있으며 예제의 실행 결과는 최소값 2와 최대값 11일 입니다.
range(y)
## [1] 2 11
R에서 가장 유용한 벡터 함수는 table 입니다. 이 함수가 얼마나 유용한지는 실제로 사용해봐야 압니다.
아래는 벡터 counts는 10,000개의 음이항 분포를 따르는 임의의 정수 입니다.
이 값을 10,000개의 잎에 남아 있는 곰팡이 병변의 수라고 가정 합니다.
counts <- rnbinom(10000, mu=0.92, size = 1.1)
counts 벡터의 첫 30개 값은 다음과 같습니다.
counts[1:30]
## [1] 0 0 2 1 0 0 3 0 0 0 3 1 0 0 3 4 1 0 0 0 0 0 0 1 1 2 0 0 2 1
10,000 개의 숫자로 구성된 벡터에서 각 숫자는 몇 개인가? 이 작업은 상당한 연산이 필요하지만 R을 사용하면 쉽게 계산 할 수 있습니다.
table(counts)
## counts
## 0 1 2 3 4 5 6 7 8 9 10 12 18
## 5163 2510 1246 587 262 131 48 24 19 4 4 1 1
0은 5천개 정도 있고 , 1은 2천 개 정도가 있습니다. 데이터를 돌리때 마다 숫자는 바뀝니다.
예제 1
아래는 각 도/연도별(2001~2020) 출생 인원을 예시로 나타낸 표입니다. 출생 년도별 총 인원을 구하시고, 시/도별 2001~2020년까지 총 출생 인원과 평균인원을 구하십시오.
행정구역 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 |
서울특별시 | 114,764 | 102,008 | 101,227 | 99,828 | 90,468 | 93,922 |
부산광역시 | 35,848 | 30,767 | 30,117 | 28,231 | 25,681 | 25,881 |
대구광역시 | 28,111 | 24,260 | 24,513 | 23,259 | 20,804 | 20,360 |
인천광역시 | 30,494 | 26,775 | 26,832 | 25,092 | 23,026 | 23,711 |
광주광역시 | 18,198 | 16,036 | 15,954 | 14,729 | 13,327 | 13,679 |
대전광역시 | 17,290 | 15,631 | 15,712 | 15,024 | 13,950 | 14,489 |
울산광역시 | 13,600 | 11,666 | 11,720 | 11,151 | 10,469 | 10,740 |
경기도 | 126,264 | 116,854 | 120,433 | 117,812 | 109,533 | 115,111 |
강원도 | 16,873 | 15,314 | 14,349 | 13,776 | 12,657 | 12,455 |
충청북도 | 17,322 | 15,329 | 14,650 | 14,331 | 13,164 | 13,366 |
충청남도 | 21,962 | 19,059 | 18,627 | 18,640 | 17,521 | 18,625 |
전라북도 | 22,192 | 19,215 | 18,437 | 17,257 | 15,745 | 15,571 |
전라남도 | 22,588 | 19,242 | 18,333 | 17,256 | 15,818 | 15,905 |
경상북도 | 30,500 | 26,022 | 25,447 | 23,553 | 22,339 | 22,567 |
경상남도 | 36,475 | 32,203 | 32,102 | 30,922 | 28,471 | 29,524 |
제주특별자치도 | 7,453 | 6,530 | 6,583 | 6,097 | 5,734 | 5,853 |
아래와 링크와 같이 데이터 셋을 받고, 데이터를 로딩 합니다.
library(readxl)
born <- read_excel("born.xlsx")
str(born)
## tibble [16 × 21] (S3: tbl_df/tbl/data.frame)
## $ 행정구역: chr [1:16] "서울특별시" "부산광역시" "대구광역시" "인천광역시" ...
## $ 2001 : num [1:16] 114764 35848 28111 30494 18198 ...
## $ 2002 : num [1:16] 102008 30767 24260 26775 16036 ...
## $ 2003 : num [1:16] 101227 30117 24513 26832 15954 ...
## $ 2004 : num [1:16] 99828 28231 23259 25092 14729 ...
## $ 2005 : num [1:16] 90468 25681 20804 23026 13327 ...
## $ 2006 : num [1:16] 93922 25881 20360 23711 13679 ...
## $ 2007 : num [1:16] 101249 28426 22295 26712 14810 ...
## $ 2008 : num [1:16] 94736 26670 20562 25365 13890 ...
## $ 2009 : num [1:16] 89594 25110 19399 24379 13101 ...
## $ 2010 : num [1:16] 93266 27415 20557 25752 13979 ...
## $ 2011 : num [1:16] 91526 27759 20758 26118 13916 ...
## $ 2012 : num [1:16] 93914 28673 21472 27781 14392 ...
## $ 2013 : num [1:16] 84066 25831 19340 25560 12729 ...
## $ 2014 : num [1:16] 83711 26190 19361 25786 12729 ...
## $ 2015 : num [1:16] 83005 26645 19438 25491 12441 ...
## $ 2016 : num [1:16] 75536 24906 18298 23609 11580 ...
## $ 2017 : num [1:16] 65389 21480 15946 20445 10120 ...
## $ 2018 : num [1:16] 58074 19152 14400 20087 9105 ...
## $ 2019 : num [1:16] 53673 17049 13233 18522 8364 ...
## $ 2020 : num [1:16] 47445 15058 11193 16040 7318 ...
데이터 셋을 보면 1번 컬럼은 character Type이고, 나머지는 numbering 타입입니다.
따라서 데이터를 데이터를 계산 할때는 1번 컬럼을 빼고 계산 해야 합니다. 빼는 방법은 대괄호 치고 원하는 컬럼 번호를 선택 born[2:21]
하는 것입니다.
# 데이터 매트릭스로 바꾸어서 계산
temp <- data.frame(t(data.matrix(c("합계", colSums(born[2:21])))))
# rbind를 하기 위한 데이터 대치
colnames(temp) <- colnames(born)
# rbind를 총합 한 데이터 추가
born <- rbind(born,temp)
데이터 계산을 할때, data.matrix에 첫번째 컬럼을 character로 넣고, 나머지는 컬럼을 계산 합니다. 그리고, 데이터가 세로로 만들어 지기 때문에, 이것을 가로로 만들어야 합니다. 이것을 계산할때 전치행렬 t(transpose)
를 해야 합니다.data.matrix를 계산하고나면 컬럼 이름이 원래 이름과 다르기 때문에, born 데이터 프레임의 이름을 가져와서, data.matrix로 바꾼 것에다 다시 컬럼 명을 넣어 주어야 합니다.
데이터 계산이 끝나면, 계산한 데이터가 charater로 바뀌었기 때문에, 데이터 타입을 integer로 바꾸어야 합니다.
library(dplyr)
# 데이터 타입을 바꾸기
born <- born %>% mutate_at(c(2:21), as.integer)
데이터 타입을 바꾸고 나면 rowSums()
열을 계산합니다. 열은 dplyr 패키지로 아주 간단하게 계산이 됩니다.
# 지역별 출산 합계
born <- born %>%
mutate(출산합계 = rowSums(born[2:21]))
# 지역별 출산 평균
born <- born %>%
mutate(출산평균 = rowMeans(born[2:21]))
head(born)
## # A tibble: 6 × 23
## 행정구역 `2001` `2002` `2003` `2004` `2005` `2006` `2007` `2008` `2009` `2010`
## <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
## 1 서울특… 114764 102008 101227 99828 90468 93922 101249 94736 89594 93266
## 2 부산광… 35848 30767 30117 28231 25681 25881 28426 26670 25110 27415
## 3 대구광… 28111 24260 24513 23259 20804 20360 22295 20562 19399 20557
## 4 인천광… 30494 26775 26832 25092 23026 23711 26712 25365 24379 25752
## 5 광주광… 18198 16036 15954 14729 13327 13679 14810 13890 13101 13979
## 6 대전광… 17290 15631 15712 15024 13950 14489 15780 14856 13915 14314
## # … with 12 more variables: `2011` <int>, `2012` <int>, `2013` <int>,
## # `2014` <int>, `2015` <int>, `2016` <int>, `2017` <int>, `2018` <int>,
## # `2019` <int>, `2020` <int>, 출산합계 <dbl>, 출산평균 <dbl>
벡터(vector) 와 첨자(subscript) , 벡터에서 위치(which) 및 연산 (max, min)
벡터의 첨자 즉 괄호 계산은 처음 코딩 할때나 배울때, 어디에 쓰는지 알 수 없다. 하지만, 이것에 대한 기본을 알게 되면, 데이터 분석이나, 데이터를 정리 할때, 매우 유용하다. R 프로그램 코딩 5년이 되어 가지만, 이것에 대한 사용을 알고 나서 앞으로 코딩 할때, 많은 도움이 되리라는 생각 이든다.
결측치 무한대, infinite, NA,iflese 계산 하기
일반적인 교육용 데이터는 infinite, NA 값이 거의 나오지 않는다. 이미 모형을 설명하기 위해 모든 데이터는 잘 정리되어 있기 때문이다. 하지만, 현업에서 실무 할때는 이런 값들이 많이 나타 나게 된다.
즉 사람이 데이터 입력을 잘못 시켰거나, 데이터를 입력 하지 않은 건, 즉 데이터를 다룰때 문제가 되는 데이터는 전체의 1~3%의 가 나타난다. 이것도 사람마다 다르고, 상황 마다 다르다. 하지만 R에서 모형을 잘 다루기 위해서는 이 부분에 대해서 잘 다루어야 한다.
멤버십: R에서 테스팅과 강제 형변환 as.charater, as.factor, as.integer
DB에서 데이터를 받든 엑셀로 데이터를 받으면, 데이터의 성질을 본다. 데이터 성질 본다음에 나는 as.charater, as.factor, as.integer 등 문자, 숫자, 범주형 데이터로 바꾼다. 나중에 머신러닝을 하던 데이터 취합을 하든, 데이터의 성질을 잘 파악하고, 형 변환을 잘해야, 향후 데이터 관리 상의 혼란이 없다.
R 수열 ( seq, rep, 요인) 수준 생성
R의 가장 기초적인 부분은 seq(수열), req(반복)을 주로 다루겠다.
R실무 할 때, 상상 외로, 기초 부분을 많이 다룬다. 하지만, 대부분의 사람들을 기초를 배우는데도 불구하고, 실무에서는 어디에 사용하는지 모르고, 접근 하는 경우가 매우 많다. 아래는 기초적인 내용과, 실무 사례의 예를 들어서 설명 할 예정 이다.
논리연산자 AND, OR R , if 문 과 for 문 사용법과 dplyr 사용법 비교
논리연산자 AND,OR는 실무에서 많이 쓰이는 방법이다. R을 처음 시작 하는 컴퓨터 프로그래머는 for문을 많이 사용한다. 하지만 R에서 for문은 속도 측면에서 최악이다. 그리고 AND, OR, IF 문도 for문을 돌리지 않고 dplyr에서 간단하게 사용할 수 있다.
R 변수, 정수, 요인 범주형 변수 머신러닝 범주형 예측셋 구성
R에서 변수, 정수, 요인(범주형) 변수를 안다는 것은 회귀분석이나, 머신러닝 실행 할때, 어떻게 구성 해야 하는지 아는 것과 같다. 실무에서는 예측셋(Predictive value :Categorical variable)인 경우가 많이 있으므로, 특히 이 부분을 잘 알고 넘어가면 앞으로 분석하는 데이터셋 만드는데, 도움이 많이 된다.
아래는 데이터 셋 링크 이다.
R 언어의 기초 계산 sqrt, sin, exp 지수 및 반올림 등 일반적인 함수 계산
3장. R 언어의 기초
R의 Package가 CRAN 아카이브 네트워크에 등록된 CRAN available packages가 18,994 건에 이룰 정도로 많이 있습니다. 하지만 많은 만큼 자신에게 필요로 하는 법을 찾는 것입니다. 사람마다 배우고 싶어 하는 부분이 다르기 때문에 R을 학습하기 위해 정해진 순서는 없습니다. 여러가지 계산법 중에서 자주 사용하는 기능만 별도로 정했습니다.
Rstudio 사용법 및 기본세팅 방법
Rstudio는 2009년에 개발 되었고, 처음 안 것은 2017년도 되었다. 어찌 되었던 학부에서 통계학을 배우고 있을 때는 2000년대 였으니, 콘솔을 사용한 R을 사용하였는데, 데이터 읽어 오는데, 많이 고생한 기억이 난다. Rstudio의 R의 통합 개발 툴이 나오면서, 개발의 편리성을 가져다 주었다.
R기초 R의 공헌자 및 함수 그리고, 함수 예제 보기
이건은 R을 처음 시작 하는 사람을 위한 것이고, 가장 기초적인 것을 나타낸다. 하지만, R은 기초가 조금 어려운 부분이 있다. 기초 적인 부분이 잘 정리 되면, R은 쉽게 접근 할 수 있다.
R에서 날짜 간격을 구하는 법
R에서 날짜 간격을 구하는 일은 아주 많은데, 구하는 방법은 잘 알려져 있지 않다. 그래서 아래와 같이 날짜 간격을 구하고자 한다.
만약에 "2022-03-01"과 "2021-12-03"의 날짜 간격을 구하고자 할 때 주/일/시간은 구하기 어렵지 않다.
css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소
앞에서는 html의 간단한 sheet를 소개 하였습니다. html은 주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다. 아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다. body 부분의 css 코딩 ...
-
통계학에서 베이블 분포(Weibull distribution)는 연속확률 분포로써 고장 확률에 대한 예측에 대하여 많이 쓰인다. 신뢰도를 측정하는데 많이 쓰이는데, 시스템 혹은 부품이 작동을 시작하여 그 시점까지 고장 나지 않고 여전히...
-
칼만 필터 Kalman filter는 충분히 성숙한 방법이다. 시계열로 부터 새로운 정보를 결합하는 데 사용되고 과거에 알려진 내부 상태 추정 정보를 지능적으로 결합해 준다. 칼만 필터의 최초 사용 사례로는 아폴로 11호 apollo 11 mis...
-
KoLNP 로딩하면 아래와 같은 메시지가 나올 경우가 있다. warning message: in i.p(...) : 패키지 ‘c:/users/rdmkyg/appdata/local/temp/rtmps6vlku/file23e45dd83537/konlp...
-
Rstudio 4.1.1 버전하고 Rstudio 2021.09.0의 계정 이름이 한글 일 때 아래와 같은 오류가 발생 한다. package ‘devtools’ successfully unpacked and MD5 sums checked The do...
-
predict를 이용한 예측은 현업 실무 할 때 매우 중요하다. 모델을 만들었는데, 그것을 예측하여, 결과값을 만들어 전사 DB에 업데이트 하였다. 회귀분석 Predict Observation trees 데이터 셋에 대해 다음의 문제를 해...
-
논리연산자 AND,OR는 실무에서 많이 쓰이는 방법이다. R을 처음 시작 하는 컴퓨터 프로그래머는 for문을 많이 사용한다. 하지만 R에서 for문은 속도 측면에서 최악이다. 그리고 AND, OR, IF 문도 for문을 돌리지 않고 dpl...
-
필자가 근무하고 있는 부서는 보전(maintenance Dept') 부서이다. 생존분석이 매우 중요하다. 고장확률은 아래와 같다. 고장확률 = 1 - 생존확를 센서에서 고장에 대한 Event 알람 신호를 받아,...
-
1. devtools 가 필요한 이유
-
현업에 있으면, 직면하는 데이터는 항상 범주형(카테고리) 데이터 셋이다. 다른 모델로 하였을 경우 범주형 데이터는 항상 원-핫 인코딩을 하여 계산 하여야 만 했다. 하지만, 원-핫 인코딩을 하지 않고, 범주형 데이터를 이용하는 것에 대...
-
딥러닝 손실 함수 사용할때, 약방의 감초처럼 나오는 엔트로피 함수, 이것을 모르면, 일단 딥러닝을 모른 다 할 정도로 엔트로피 함수는 중요 하다. 딥러닝에서는 손실값을 구할때 사용하는 것으로, 사실상 손실 값을 계산 하지 않으면, 실...