전체 글 (321)

반응형

titanic.csv


SAS - (4) PROC FREQ 빈도 분석


PROC FREQ는 빈도분석을 할 때 쓰인다. 


데이터 읽고 솔팅하기


FILENAME REFFILE '/folders/myfolders/titanic.csv';

PROC IMPORT DATAFILE=REFFILE
    DBMS=CSV
    OUT=WORK.titanic;
    GETNAMES=YES;
RUN;

proc sort data = titanic;
    by sex;
run;



PROC FREQ


문법은 아래와 같다.


PROC FREQ DATA = Dataset ;
TABLES Variable_1 ;
BY Variable_2 ;



예제 


proc FREQ data=titanic;
    tables survived; 
    by sex;
run;


결과


FREQ 프로시저

Survived빈도백분율누적
빈도
누적
백분율
08125.808125.80
123374.20314100.00

FREQ 프로시저

Survived빈도백분율누적
빈도
누적
백분율
046881.1146881.11
110918.89577100.00


참고


https://www.tutorialspoint.com/sas/sas_frequency_distributions.htm

반응형
반응형

Relative Risk 와 Odds Ratio의 정의


 

 disease

non-disease 

 

 smoker 

20 (a)

80 (b)

100 

 non-smoker 

5 (c)

95 (d)

100 

 

25 

175 

200 


 

Relative Risk는 Risk Ratio 라고도 부르며 줄여서 RR 이라고 부르기도 합니다. 이름에서 알 수 있듯 RR은 Risk의 '비' 를 뜻합니다. 예를 들어, 위 표에서 smoker의 disease에 대한 Risk는 20/100 = 0.2 입니다. 즉 smoker인 경우 질병에 걸릴 확률이 0.2라는 것입니다. 반면 non-smoker의 disease에 대한 Risk는 5/100 = 0.05 입니다. 따라서 smoking의 disease에 대한 Relative Risk는 0.2/0.05 = 4 라고 할 수 있습니다. 이를 식으로 표현하면 (a/a+b)/(c/c+d) 입니다. Relative Risk는 직관적입니다. 담배를 폈을 경우 4배 더 질병에 걸릴 확률이 높다. 라고 직관적으로 해석할 수 있습니다. 


odds ratio는 OR 이라고 부르며 odds의 '비율' 입니다. 따라서 odds ratio를 알기 전에 우선 odds가 무엇인지 알아야합니다. odds는 실패와 성공의 비입니다. 위의 경우에는 smoker의 질병에 대한 odds는  20/80 = 0.25 이고 non-smoker의 질병에 대한 odds는 5/95 = 0.052 입니다. 따라서 odds ratio는 0.25/0.052 는 약 4.8입니다. 이를 수식으로 표현하면 (a/b)/(c/d) = 4.8 입니다. 값을 구하는건 구하는 건데 odds ratio는 직관적으로 해석하기 어렵습니다.



왜 Odds Ratio를 쓸까?


위와 같은 상황 (어떠한 처리군들 간에 질병에 대한 비교를 할 경우) RR을 써도 OR을 써도 상관없습니다. 하지만 중요한 것은 case-control study에서는 relative risk를 쓸 수 없습니다. 즉, case-control study에서는 OR만 씁니다.



Case Control Study란 무엇인가?


Case Control Study는 사례대조연구라고 하는데 우선 네이버 백과에서 정의를 살펴보겠습니다.


연구대상군의 특성을 명확히 하고 그 기본적 구조를 명백히 하기 위해 몇가지 요인을 조절한 대상 control을 골라 제각기 거기에 대해서 동일내용 및 방법으로 조사ㆍ연구를 하는 일종의 비교연구 법이다. [네이버 백과]


말이 어렵게 되어있는데 예를 들어 다음과 같은 상황입니다. 위에서는 smoker 100명, non-smoker 100명을 뽑아서 이들간에 질병의 발생률을 비교했죠. 하지만 아래와 같은 경우에는 병에 걸린사람 100명, 병에 걸리지 않은 사람 100명을 뽑았습니다.  (위에서 병에 걸린 사람의 smoker와 non-smoker의 비가 4:1으므로 여기서도 4:1 정도일 것입니다.) 이렇게 환자군과 대조군을 뽑아서 비교하는 것을 case-control study라고 합니다. 질병의 발생률이 매우 낮은 경우에는 이러한 study가 위와 같은 코호트 연구보다 좋습니다. 


 

 disease

non-disease 

 

 smoker 

80 (a)

45 (b)

 125

 non-smoker 

20 (c)

55 (d)

 75

 

100

100

200


이 경우 smoker의 risk를 구해보면 80/125입니다. 그대로 해석하면 약 65%의 환자가 흡연자가 병에 걸린다는 것입니다. 이는 모순입니다. 왜냐하면 병에 걸린 사람 100명, 병에 걸리지 않은 사람을 100명을 대상으로 RR을 계산한 것이니 병에 걸릴 위험율이 높게 나올 수 밖에 없겠죠. 실제로 RR을 구하면 (80/125) / (20/75) = 2.4 입니다. 샘플이 바뀌면, RR도 바뀐다는 것을 알 수 있습니다. 따라서 이러한 경우에는 RR을 쓸 수 없습니다. 하지만 case-control study에서 OR은 유효합니다. (80/45)/(20/55) = 약 4.91이 나옵니다. 따라서 OR이 RR 보다 더욱 범용적이라고 할 수 있습니다. 


또한 OR은 RR의 근사치로 사용되기도 합니다. OR = (a/b)/(c/d)이고 RR = (a/(a+b))/(c/(c+d)) 입니다. 따라서 a, c가 매우 작은 값이라면 OR을 RR에 근사시킬 수 있습니다. 그러므로 이러한 근사를 사용하면 위와 같은 case-control study에서도 OR을 근사해 RR을 알아볼 수 있는 것입니다.



반응형
반응형

/*

(3) Standard Deviation 구하기

날짜 : 2017.3.8

*/



데이터 읽기


FILENAME REFFILE '/folders/myfolders/titanic.csv';

PROC IMPORT DATAFILE=REFFILE
    DBMS=CSV
    OUT=WORK.titanic;
    GETNAMES=YES;
RUN;



표준편차 구하기


표준편차도 PROC MEANS 프로시져로 구할 수 있다. 옵션으로 STD를 주면 되며, 산술 평균 구하는 것과 마찬가지로 그루핑 할 수도 있다.

 

PROC MEANS data=work.titanic STD MAXDEC=2;
RUN;



MEANS 프로시저

변수표준편차
PassengerId
Survived
Pclass
Age
Parch
Fare
257.35
0.49
0.84
13.00
0.81
49.69

SORTING


우선 SEX로 그루핑하여 AGE의 Standard Deviation을 구하기에 앞서 SORTING을 먼저한다. 


proc sort data=work.titanic;
    by sex;
run;




PROC SUVEYMEANS


조금 더 Advanced 된 것으로 PROC SURVEYMEANS 프로시져가 있다. 아래는 SEX로 Grouping하여 age의 Standard Deviation을 구하는 예제이다. ods output을 통해 결과를 table로 내보낼 수 있다.


proc surveymeans data=work.titanic STD;
var age;
BY sex; /* 이 때 sex로 sorting이 되어 있어야 한다. */
ods output statistics=rectangle;
run;

proc print data=rectangle;
run;


The SURVEYMEANS Procedure

Data Summary
Number of Observations314
Statistics
VariableStd Error
of Sum
Age228.303304

The SURVEYMEANS Procedure

Distribution of Age

The SURVEYMEANS Procedure

Data Summary
Number of Observations577
Statistics
VariableStd Error
of Sum
Age312.416021

The SURVEYMEANS Procedure

Distribution of Age

OBSSexVarNameStdDev
1femaleAge228.303304
2maleAge312.416021



참고


https://www.tutorialspoint.com/sas/sas_standard_deviation.htm

반응형
반응형

/*

개발환경 : SAS University Edition

날짜 : 2017. 3. 8

*/



(2) PROC SQL로 새로운 테이블 만들기


FILENAME REFFILE '/folders/myfolders/titanic.csv';

PROC IMPORT DATAFILE=REFFILE
    DBMS=CSV
    OUT=WORK.titanic;
    GETNAMES=YES;
RUN;

PROC SQL;
create table titanic_male as
    SELECT *
     FROM 
        work.titanic
            WHERE sex = 'male'
;
RUN;



PROC SQL 입력후 SQL 문으로 새로운 테이블을 생성하는 문장을 넣으면 된다. 위처럼 입력하면 타이타닉 예제에서 sex가 male인 row들만 모아서 새로운 테이블을 만든다. 컬럼을 선택하려면 SELECT column1, column2 처럼 넣으면 된다. 위 스크립트를 실행 후에 work 라이브러리에 가보면 titanic_male이라는 이름의 테이블이 새로 생성되었음을 확인할 수 있다.



출처


https://www.tutorialspoint.com/sas/sas_standard_deviation.htm

반응형
반응형

/*

개발 환경 : SAS University Edition

날짜 : 2017/3/8

*/


titanic.csv



SAS 에서 데이터의 산술 평균은 PROC MEANS 를 통해 구할 수 있다. 예제 데이터셋으로는 titanic 데이터셋을 사용하였다. 



데이터 읽기


/* 소스 파일: titanic.csv */
/* 소스 경로: /folders/myfolders */
/* 코드 생성일: 17. 3. 7. 오후 3:35 */
FILENAME REFFILE '/folders/myfolders/titanic.csv';

PROC IMPORT DATAFILE=REFFILE
    DBMS=CSV
    OUT=WORK.titanic;
    GETNAMES=YES;
RUN;



모든 변수의 평균 구하기


/* 모든 변수의 평균, 합 출력 */
PROC MEANS DATA = WORK.titanic Mean SUM MAXDEC=2;
RUN;



위와 같이 하면 모든 변수의 Mean과 Sum을 구한다. MAXDEC는 Max Decimal의 약자로 소숫점 둘째자리까지 출력하라는 의미이다.



MEANS 프로시저

변수평균합계
PassengerId
Survived
Pclass
Age
Parch
Fare
446.00
0.38
2.31
29.76
0.38
32.20
397386.00
342.00
2057.00
26515.17
340.00
28693.95


특정 변수의 평균 구하기


특정 변수의 평균만 구하고 싶을 때는 VAR 키워드에 지정해준다.


/* 특정 변수의 평균, 합 출력 */
PROC MEANS DATA = WORK.titanic Mean SUM MAXDEC=2;
VAR age;
RUN;


MEANS 프로시저

분석 변수 : Age
평균합계
29.7626515.17

그룹별로 평균 구하기


그룹별로 평균을 구하고 싶을 때는 CLASS 키워드에 지정해준다.

/* 특정 변수의 평균, 합 출력 */

PROC MEANS DATA = WORK.titanic Mean SUM MAXDEC=2; VAR age; CLASS sex; RUN;



MEANS 프로시저

분석 변수 : Age
Sex관측값 수평균합계
female31428.278876.00
male57730.5717639.17

참고



https://www.tutorialspoint.com/sas/sas_arithmetic_mean.htm

반응형

Tools/R

R - (10) 리스트(List)

2017. 3. 4. 01:49
반응형

(10) 리스트 (List)


List 만들기


List와 Vector의 차이점은 Vector는 한 가지 타입의 원소만 담을 수 있지만, List는 어떤 타입이든 담을 수 있다는 것이다.  List는 위와 같이 list() 키워드를 통해 만들 수 있다.


# Create a list containing strings, numbers, vectors and a logical values.
list_data <- list("Red", "Green", c(21,32,11), TRUE, 51.23, 119.1)
print(list_data)



[[1]]
[1] "Red"

[[2]]
[1] "Green"

[[3]]
[1] 21 32 11

[[4]]
[1] TRUE

[[5]]
[1] 51.23

[[6]]
[1] 119.1


출력해보면 위와 같이 첫 번째 원소는 String, 세 번째 원소는 Vector, 네 번째 원소는 진릿값인 것을 알 수 있다.



List에 이름 붙이기 


# Create a list containing a vector, a matrix and a list.
list_data <- list(c("Jan","Feb","Mar"), matrix(c(3,9,5,1,-2,8), nrow = 2),
   list("green",12.3))

# Give names to the elements in the list.
names(list_data) <- c("1st Quarter", "A_Matrix", "A Inner list")

# Show the list.
print(list_data)


$`1st Quarter`
[1] "Jan" "Feb" "Mar"

$A_Matrix
     [,1] [,2] [,3]
[1,]    3    5   -2
[2,]    9    1    8

$`A Inner list`
$`A Inner list`[[1]]
[1] "green"

$`A Inner list`[[2]]
[1] 12.3



위와 같은 문법을 통해 List의 각각의 원소에 이름을 붙일 수 있다. 



리스트 원소 접근


리스트에는 기본적으로 index를 통해 접근할 수 있고, 이름이 붙어져 있으면 이름으로도 접근할 수 있다. 이름으로 접근할 때는 $키워드를 통해 리스트의 이름을 명시해주면 된다.


# Create a list containing a vector, a matrix and a list.
list_data <- list(c("Jan","Feb","Mar"), matrix(c(3,9,5,1,-2,8), nrow = 2),
   list("green",12.3))

# Give names to the elements in the list.
names(list_data) <- c("1st Quarter", "A_Matrix", "A Inner list")

# Access the first element of the list.
print(list_data[1])

# Access the thrid element. As it is also a list, all its elements will be printed.
print(list_data[3])

# Access the list element using the name of the element.
print(list_data$A_Matrix)


$`1st Quarter`
[1] "Jan" "Feb" "Mar"

$`A Inner list`
$`A Inner list`[[1]]
[1] "green"

$`A Inner list`[[2]]
[1] 12.3


     [,1] [,2] [,3]
[1,]    3    5   -2
[2,]    9    1    8



리스트 원소 조작하기 (Manipulating)


리스트 원소 조작은 아래와 같이 <- 키워드를 통해 새로운 값을 넣어주면 된다.


# Create a list containing a vector, a matrix and a list.
list_data <- list(c("Jan","Feb","Mar"), matrix(c(3,9,5,1,-2,8), nrow = 2),
   list("green",12.3))

# Give names to the elements in the list.
names(list_data) <- c("1st Quarter", "A_Matrix", "A Inner list")

# Add element at the end of the list.
list_data[4] <- "New element"
print(list_data[4])

# Remove the last element.
list_data[4] <- NULL

# Print the 4th Element.
print(list_data[4])

# Update the 3rd Element.
list_data[3] <- "updated element"
print(list_data[3])

[[1]]
[1] "New element"

$<NA>
NULL

$`A Inner list`
[1] "updated element"


리스트 합치기


아래와 같이 c() 키워드를 통해 리스트를 합칠 수 있다. 


# Create two lists.
list1 <- list(1,2,3)
list2 <- list("Sun","Mon","Tue")

# Merge the two lists.
merged.list <- c(list1,list2)

# Print the merged list.
print(merged.list)


[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] "Sun"

[[5]]
[1] "Mon"

[[6]]
[1] "Tue"


리스트를 벡터로 변환하기


List 상태에서는 벡터 상태에서 보다 조작의 자유도가 떨어진다. 예를 들어 산술 연산을 한다거나 할 수 없다. 다양한 조작을 위해 리스트를 벡터로 변환할 때는 아래와 같이 unlist() 키워드를 이용하면 된다. 


# Create lists.
list1 <- list(1:5)
print(list1)

list2 <-list(10:14)
print(list2)

# Convert the lists to vectors.
v1 <- unlist(list1)
v2 <- unlist(list2)

print(v1)
print(v2)

# Now add the vectors
result <- v1+v2
print(result)


[[1]]
[1] 1 2 3 4 5

[[1]]
[1] 10 11 12 13 14

[1] 1 2 3 4 5
[1] 10 11 12 13 14
[1] 11 13 15 17 19



아래 튜토리얼을 참고한 포스팅입니다.


https://www.tutorialspoint.com/r/r_lists.htm

반응형
반응형



기술적 특이점이란 무엇인가?


레이 커즈와일이 2006년에 「특이점이 온다」 라는 책을 출간했을 때 많은 사람들이 그의 말도 안되는 예측을 비웃었습니다. 하지만 되돌아보면 커즈와일은 iPhone이 등장하기 1년전에 iPhone과 같은 기계가 나올 것을 예측하였습니다. 그리고 그는 가까운 미래에 인간과 컴퓨터가 본질적으로 융합하여 공상 과학 영화에 나올법한 엄청난 능력을 가질 수 있다고 말했습니다. 시간이 지날 수록 그가 예측했던 많은것들이 현실에서 실제로 일어나고 있습니다.


커즈와일이 주장하는 것은 사실 매우 간단합니다. 바로 "기술의 발전 속도는 지수적" 이라는 것입니다. (책에서는 "수확 체증의 법칙" 이라고도 말합니다.) 그리고 기술의 발전속도가 나중에는 거의 무한대에 가까워지게 되는데 이를 "특이점" (Singularity) 이라고 합니다. 그는 특별히 미래에 컴퓨터 기술이 엄청난 속도로 발전해 특히 3가지 분야와 융합하여 엄청난 가치를 창출할 것이라고 예측합니다. 그 3가지 분야는 바로 유전체학 (genomics), 나노기술(nanotechnology), 로보틱스(robotics) 분야입니다.


최근 일어나는 일들을 보면 커즈와일이 했던 예측이 그렇게 허황된 것이 아니라는 것을 알 수 있습니다. 얼마전 Deep mind의 Alphago가 바둑 챔피언 이세돌을 꺾었고, IBM Watson은 의학, 금융, 심지어 요리 분야에까지 점점 발을 넓혀가고 있습니다. 자율주행차는 2020년에 도로에 나올 것으로 예측되고 있습니다. 커즈와일의 예측대로 현재 기술의 발전 속도는 그 어느 때와도 비교할 수 없을 정도로 빠릅니다.



왜 특이점이 오는가?


1. 컴퓨터 연산 속도의 기하급수적 증가


최근 50년간 기술 산업은 "무어의 법칙" (Moore's Law)이라는 유명한 법칙에 의해 견인되어 왔습니다. 인텔의 공동 창업자 고든 무어의 예측인 무어의 법칙은 마이크로칩에 있는 트랜지스터의 숫자가 18개월에 2배씩 증가한다는 법칙입니다. 이러한 기술적 발전으로 초창기의 냉장고만한 컴퓨터를 점점 소형화시켜 현재의 손바닥만한 크기로 만들 수 있었던 것입니다. 


하지만 무어의 법칙은 이론적인 한계가 있죠. 아무리 작아져도 원자만큼 작아질 수는 없습니다. 무어의 법칙이 자연을 거스를 수는 없을 것입니다. 그래서 최근에는 무어의 법칙의 진행속도가 점점 느려지고 있습니다. 무어의 법칙은 2020년쯤에 멈출 것이라고 예상되고 있습니다. 


하지만 커즈와일은 마이크로프로세서가 정보처리의 새로운 패러다임이라고 말하며 진공관, 트랜지스터 등의 옛기술을 대체하고 있다고 말합니다. 즉, 정보처리 속도를 결정하는 것이 트랜지스터의 수 뿐만이 아니라는 것입니다. 양자 컴퓨팅(quantum computing), 뉴로모픽 칩(neuromorphic chips), 3D Stacking 과 같은 새로운 기술이 연산 속도를 빠르게 하고 있습니다. 커즈와일에 따르면 연산 속도(MIPS)는 실제로 기하급수적으로 증가해왔으며, 2045년 경에는 컴퓨터의 연산 속도가 모든 인간의 뇌의 연산 속도를 합친 속도보다 빨라질 것으로 예측됩니다.


2. 로봇 기술의 발전


1962년 GM 생산공정에 산업용 로봇 Unimate 가 등장한 이후, 자동화는 우리의 일상으로 침투해왔습니다. 1970년대의 ATM기계 2000년도의 자동 청소 로봇 등. 로봇은 점점 인간의 일을 대신 해왔습니다. 최근에는 "단순 반복 작업" 뿐만 아니라 인간만이 할 수 있다 믿었던 "창의적인 영역" 까지 침범하고 있습니다. 로봇에 의해 쓰여진 한 책은 얼마 전 일본의 Hoshi Shinichi Literary Award 에 정식으로 제출되었고 accept 되기까지 했습니다.


앞으로는 이러한 로봇의 발전은 더욱 가속화될 것입니다. 미국 국방부는 군인의 머리에 삽입하는 칩을 실험하고 있고, 일론 머스크는 이와 비슷한 기술을 상업화 하겠다고 말했습니다. 기술력이 기하급수적으로 증가함에 따라 기술력은 향후 20년간 수천배 이상 증가할 것으로 예상되고 로봇은 점점 더 많은 일을 해나갈 것입니다.



3. 유전자 공학의 발전

 

2003년, 과학자들이 인간 유전자의 전체 염기서열을 해독하였습니다. 비로소 생명체의 언어인 DNA를 분석할 수 있는 시대가 열린 것입니다. 이제 인간은 유전자가 DNA 상에 어디에 위치해있는지 알 수 있었고 그것의 기능을 추적할 수 있었습니다.  그로부터 2년 뒤, 과학자들은 CRISPR 라는 유전자를 싸고 쉽게 수정할 수 있는 기술을 만들었습니다. 이 기술을 통해 인간은 DNA를 수정하여 바이러스를 비활성화 시킨다거나, 유전자 변형 작물을 만들어낼 수 있었습니다.


미래에는 DNA의 수정을 통해 태어나기 전부터 아기의 지능, 외모, 눈 색깔을 변형시킬 수 있을 것입니다. 물론 이러한 것들에 대한 윤리적인 논쟁은 있겠지만요. 이렇게 공상영화에서나 볼법한 것들이 특이점에서는 "현실"이 될 것입니다. 커즈와일은 컴퓨터 기술과 유전자 기술이 발전함에 따라 인간은 영생을 누릴 수 있다고 말합니다. 심지어 불의의 사고로 죽어도 업로드한 기억을 복원하여 인간을 "소생" 시킬 수 있다고 합니다.



끝으로 


특이점이라는 개념은 흥미롭기도 무섭기도 합니다. 과연 현재 기술력보다 수천배 이상 발전한 시대는 어떤 모습일까요? 우리는 이러한 세상을 과연 상상할 수 있을까요? 우리는 얼마만큼 로봇을 '용인' 해야할 것이며, 어떤 유전자 조작을 허용하거나 막아야할까요? 특이점은 우리에게 어마어마한 가능성을 열어두고 있습니다. 하지만 한 가지 중요한 사실은 기술은 인간에 의해 창조되었고 소유된다는 것입니다. 특이점의 시대에 인간이 기술을 어떻게 활용하느냐에 따라 디스토피아가 될 수도 유토피아가 될 수도 있을 것입니다.



참고


반응형
반응형


R 통계분석 Mean, Median, Mode


R을 통한 통계분석은 많은 in-built 함수들을 통해 이루어진다. 이러한 함수들은 대부분 R base package에 속해있고, vector들을 다른 argument들과 함께 input으로 받아 결과를 출력해준다. 이번 포스팅에 다룰 내용은 mean, median, mode 함수이다. 



1. Mean 


문법 


mean(x, trim = 0, na.rm = FALSE, ...)


  • x : input vector
  • trim : 정렬된 vector에서 양 극단에서의 일정 부분을 뺄 때 사용함
  • na.rm : missing value를 제거하고 계산할 때 사용

예제

# Create a vector. 
x <- c(12,7,3,4.2,18,2,54,-21,8,-5)

# Find Mean.
result.mean <- mean(x)
print(result.mean)


[1] 8.22



Trim Option 사용하기


# Create a vector.
x <- c(12,7,3,4.2,18,2,54,-21,8,-5)

# Find Mean.
result.mean <-  mean(x,trim = 0.3)
print(result.mean)


Trim을 사용하면 양 극단에서 일정부분을 빼고 계산한다. 0.3일 경우 양 끝에서 전체 데이터의 0.3 만큼을 제외한다. 이 경우에 전체데이터가 10개이므로 양 끝에서 3개씩을 뺀다. 즉 정렬된 벡터 (−21, −5, 2, 3, 4.2, 7, 8, 12, 18, 54) 에서 (−21,−5,2) (12,18,54) 을 뺀 평균을 계산한다. 



NA 옵션 적용하기


# Create a vector. 
x <- c(12,7,3,4.2,18,2,54,-21,8,-5,NA)

# Find mean.
result.mean <-  mean(x)
print(result.mean)

# Find mean dropping NA values.
result.mean <-  mean(x,na.rm = TRUE)
print(result.mean)


[1] NA
[1] 8.22


원래는 오류가 날 것을 na.rm=TRUE 를 통해 NA 값을 제거하고 평균을 구할 수 있다.



2. Median


Median(중위수)는 전체 데이터에서 중앙에 있는 값을 뜻한다. Median() 함수는 이 값을 구하기 위해 사용된다.


문법 


median(x, na.rm = FALSE)



# Create the vector.
x <- c(12,7,3,4.2,18,2,54,-21,8,-5)

# Find the median.
median.result <- median(x)
print(median.result)



3. Mode 


Mode(최빈값)은 데이터에서 가장 많이 등장한 값이다. 안타깝게도 R에는 Mode를 구하는 in-built function이 없다. 직접 정의한 getmode() 함수를 통해 Mode를 구해보자.


# Create the function.
getmode <- function(v) {
   uniqv <- unique(v)
   uniqv[which.max(tabulate(match(v, uniqv)))]
}

# Create the vector with numbers.
v <- c(2,1,2,3,1,2,3,4,1,5,5,3,2,3)

# Calculate the mode using the user function.
result <- getmode(v)
print(result)

# Create the vector with characters.
charv <- c("o","it","the","it","it")

# Calculate the mode using the user function.
result <- getmode(charv)
print(result)


[1] 2
[1] "it"



이렇게 정의된 getmode 함수는 위처럼 문자열에도 적용할 수 있다.



아래 튜토리얼을 참고한 포스팅입니다.

https://www.tutorialspoint.com/r/r_mean_median_mode.htm

반응형

'Tools > R' 카테고리의 다른 글

R - 단순회귀분석  (0) 2017.05.21
R - (10) 리스트(List)  (0) 2017.03.04
R - (9) 벡터  (0) 2017.02.23
R - (8) 문자열 (Strings)  (0) 2017.02.23
R을 통한 2017년 대선 주자들 페이스북 분석  (5) 2017.02.21

Tools/R

R - (9) 벡터

2017. 2. 23. 16:37
반응형

(9) 벡터 (Vectors)


벡터는 가장 기본적인 R의 Data Object이다. 우선 기본적으로 6개의 atomic vector들을 알아야할 필요가 있다.  이 6개의 atomic vectors는 이전 포스팅 에도 소개하였지만, logical, integer, double, complex, character, raw이다. 아래의 예를 통해 복습하자.


# Atomic vector of type character.
print("abc");

# Atomic vector of type double.
print(12.5)

# Atomic vector of type integer.
print(63L)

# Atomic vector of type logical.
print(TRUE)

# Atomic vector of type complex.
print(2+3i)

# Atomic vector of type raw.
print(charToRaw('hello'))


1. 벡터의 원소에 접근하기


벡터의 원소에는 인덱스를 통해 접근할 수 있다. [](brackets) 이 인덱싱을 위해 필요하다. 인덱싱은 다른 프로그래밍 언어와는 다르게 1부터 시작한다.  또한 - 인덱싱은 해당 엘리먼트를 결과값에서 제외한다는 뜻이다. TRUE, FALSE, 0, 1도 인덱싱을 위해 사용될 수 있다. 아래의 예를 보자.


# Accessing vector elements using position.
t <- c("Sun","Mon","Tue","Wed","Thurs","Fri","Sat")
u <- t[c(2,3,6)]
print(u)

# Accessing vector elements using logical indexing.
v <- t[c(TRUE,FALSE,FALSE,FALSE,FALSE,TRUE,FALSE)]
print(v)

# Accessing vector elements using negative indexing.
x <- t[c(-2,-5)]
print(x)

# Accessing vector elements using 0/1 indexing.
y <- t[c(0,0,0,0,0,0,1)]
print(y)


[1] "Mon" "Tue" "Fri"
[1] "Sun" "Fri"
[1] "Sun" "Tue" "Wed" "Fri" "Sat"
[1] "Sun"



2. 벡터 조작하기


(1) 벡터 연산


길이가 같은 벡터들은 더하고, 빼고, 곱하고, 나누고 할 수 있다.


# Create two vectors.
v1 <- c(3,8,4,5,0,11)
v2 <- c(4,11,0,8,1,2)

# Vector addition.
add.result <- v1+v2
print(add.result)

# Vector substraction.
sub.result <- v1-v2
print(sub.result)

# Vector multiplication.
multi.result <- v1*v2
print(multi.result)

# Vector division.
divi.result <- v1/v2
print(divi.result)



[1]  7 19  4 13  1 13
[1] -1 -3  4 -3 -1  9
[1] 12 88  0 40  0 22
[1] 0.7500000 0.7272727       Inf 0.6250000 0.0000000 5.5000000



(2) 벡터 엘리먼트 재사용


만약 두 개의 벡터를 연산하려는데 길이가 다르면, 짧은 쪽의 벡터의 원소가 재사용된다.


v1 <- c(3,8,4,5,0,11)
v2 <- c(4,11)
# V2 becomes c(4,11,4,11,4,11)

add.result <- v1+v2
print(add.result)

sub.result <- v1-v2
print(sub.result)


[1]  7 19  8 16  4 22
[1] -1 -3  0 -6 -4  0

위의 결과를 보면 v2가 (4,11) 에서 (4,11,4,11,4,11)로 바뀌었음을 알 수 있다. 연산을 하기 위해 (4,11)이 재사용된 것이다.



(3) 벡터 엘리먼트 정렬


벡터들의 엘리먼트는 sort() 함수를 통해 정렬될 수 있다.


v <- c(3,8,4,5,0,11, -9, 304)

# Sort the elements of the vector.
sort.result <- sort(v)
print(sort.result)

# Sort the elements in the reverse order.
revsort.result <- sort(v, decreasing = TRUE)
print(revsort.result)

# Sorting character vectors.
v <- c("Red","Blue","yellow","violet")
sort.result <- sort(v)
print(sort.result)

# Sorting character vectors in reverse order.
revsort.result <- sort(v, decreasing = TRUE)
print(revsort.result)


[1]  -9   0   3   4   5   8  11 304
[1] 304  11   8   5   4   3   0  -9
[1] "Blue"   "Red"    "violet" "yellow"
[1] "yellow" "violet" "Red"    "Blue"  




반응형
반응형
(8) 문자열 (Strings)


R에서 쌍따옴표나 작은 따옴표로 둘러쌓인것은 문자열로 취급된다. 


문자열을 만들 때 주의할점

  • 문자열은 만들 때, 쌍따옴표 혹은 작은따옴표만을 사용하여야한다. 두개를 혼합하여 사용하면 안된다.
  • 쌍따옴표는 작은따옴표 사이에 들어갈 수 잇다.
  • 작은 따옴표는 쌍따옴표 사이에 들어갈 수 있다.
  • 쌍따옴표는 쌍따옴표 사이에 들어갈 수 없다.
  • 작은따옴표는 작은따옴표 사이에 들어갈 수 없다.

적절한 문자열들의 예

a <- 'Start and end with single quote'
print(a)

b <- "Start and end with double quotes"
print(b)

c <- "single quote ' in between double quotes"
print(c)

d <- 'Double quotes " in between single quote'
print(d)


[1] "Start and end with single quote"
[1] "Start and end with double quotes"
[1] "single quote ' in between double quotes"
[1] "Double quotes \" in between single quote"


부적절한 문자열들의 예

e <- 'Mixed quotes" 
print(e)

f <- 'Single quote ' inside single quote'
print(f)

g <- "Double quotes " inside double quotes"
print(g)


문자열 조작(manipulation)

1. paste()

설명 : 두 개의 문자열을 연결(Concatenating)할 때 사용한다.
문법 : paste(..., sep = " ", collapse = NULL)

예 : 

a <- "Hello"
b <- 'How'
c <- "are you? "

print(paste(a,b,c))

print(paste(a,b,c, sep = "-"))

print(paste(a,b,c, sep = "", collapse = ""))

[1] "Hello How are you? "
[1] "Hello-How-are you? "
[1] "HelloHoware you? "

2. format()

설명 : 문자나 숫자를 원하는 포맷으로 변경한다.

문법 : format(x, digits, nsmall, scientific, width, justify = c("left", "right", "centre", "none"))

  • x : 벡터 input
  • digits : 출력할 총 자릿수
  • nsmall : 소숫점 우측의 최소 자릿수
  • scientific : TRUE이면 scientific notation을 함
  • width : 최소 width (왼쪽에 blank를 넣어 width를 맞춘다.)
  • justify : 정렬할 위치 (좌측정렬, 가운데 정렬, 우측정렬)

# Total number of digits displayed. Last digit rounded off.
result <- format(23.123456789, digits = 9)
print(result)

# Display numbers in scientific notation.
result <- format(c(6, 13.14521), scientific = TRUE)
print(result)

# The minimum number of digits to the right of the decimal point.
result <- format(23.47, nsmall = 5)
print(result)

# Format treats everything as a string.
result <- format(6)
print(result)

# Numbers are padded with blank in the beginning for width.
result <- format(13.7, width = 6)
print(result)

# Left justify strings.
result <- format("Hello", width = 8, justify = "l")
print(result)

# Justfy string with center.
result <- format("Hello", width = 8, justify = "c")
print(result)

[1] "23.1234568"
[1] "6.000000e+00" "1.314521e+01"
[1] "23.47000"
[1] "6"
[1] "  13.7"
[1] "Hello   "
[1] " Hello  "

3. nchar()

설명 : 문자의 갯수를 세준다. (공백도 포함한다.)
예 :

result <- nchar("Count the number of characters")
print(result)

[1] 30


4. toupper(), tolower()

설명 : 문자열을 대문자로 바꾼다 / 문자열을 모두 소문자로 바꾼다.

생략 

5. substring()

설명 : 문자열의 일부를 추출한다.
문법 : substring(x,first,last)
예 : 

# Extract characters from 5th to 7th position.
result <- substring("Extract", 5, 7)
print(result)

[1] "act"

아래 튜토리얼을 참고한 포스팅입니다. 

https://www.tutorialspoint.com/r/r_operators.htm 



반응형

'Tools > R' 카테고리의 다른 글

R 통계 분석 - 평균, 중앙값, 최빈값 (Mean, Median, Mode)  (0) 2017.02.23
R - (9) 벡터  (0) 2017.02.23
R을 통한 2017년 대선 주자들 페이스북 분석  (5) 2017.02.21
R - (7) 함수  (0) 2017.02.19
R - (6) 반복문  (0) 2017.02.17
반응형