페이지

2018년 1월 15일 월요일

제3절 결측값 처리와 이상값 검색

데이터를 다루다 보면 결측값이나 이상값이 존재한다. 이러한 경우에 효율적인 방법으로 처리하여 데이터의 정보가 손실되거나 왜곡되는 것을 피해야 한다.

1. 데이터 탐색
데이터를 본격 분석하기 전에 대략의 데이터의 특성을 파악하고, 데이터에 대한 통찰을 얻기 위해 다각도로 접근하도록 한다.

가. 데이터 기초 통계
summary 함수를 통해 연속형 변수의 경우 4분위수, 최소값, 최대값, 중앙값, 평균 등을 출력하고 범주형 변수의 경우 각 범부에 대한 빈도수를 출력하여 데이터의 분포를 파악한다. 연속형 변수의 경우 cov와 cor함수를 통해 공분산행렬과 상관계수행렬을 출력하여 변수 간의 선형 상관관계의 강도를 확인한다.

2. 결측값 처리
결측값(Missing data) 처리를 위해 시간을 많이 쓰는 것은 비효율적이다. 가능하면 결측값은 제외하고 처리하는 게 적합하지만 결측값 자체가 의미가 있는 경유도 있다. 결측값을 어떻게 처리하느냐는 전체 작업속도에 많은 영향을 주기 때문에 이 부분을 자동화 하면 업무 효율성이 매우 향상돈다. R에서 결측값 처리 관련 패키지는 Amelia 2, Mice, mistools 등 여러 가지가 있는데, 여기서는 Amelia 패키지를 사용했다.
우선 결측값을 확인하는 방법과 제외하는 간단한 방법부터 알아보자. R에서는 결측값을 NA(not avaliable)로 처리한다. 불가능한 값(예를 들면 dividing by zero)은 NaN(not a number)으로 처리된다.
결측값을 입력하는 방법은 NA를 이용하면 되고, is.na를 이용해 결측값인지 여부를 확인할 수 있다.

3. 이상값 검색
이상값(Outlier) 검색은 분석에서 전처리를 어떻게 할지를 결정할 때와 부정사용방지 시스템(Fraud Detection System, FDS)에서 규칙을 발견하는 데 사용할 수 있다. 이상값은 의도하지 않게 잘못 입력한 경우(a1), 의도하지 않게 입력됐으나 분석 목적에 부합되지 않아 제거해야 하는 경우(a2), 의도되지 않은 현상이지만 부석에 포함해야 하는 경우(a3)가 있다. 그리고 의도된 이상값(b1)인 경우가 있는데, b1의 경우는 대부분 사기(fraud)이다. 특히 a1, a2는 bad data라고 할 수 있고 a3, b1이 이상값이라고 할 수 있다.
관련 알고리즘으로는 ESD(Extreme Studentized Deviation), MADM등이 있는데 ESD가 가장 잘 알려져 있다. 평균으로부터 k*표준편차만큼 떨어져 있는 값들을 이상값으로 판단하고 일반적으로 k는 3으로 한다.
그러나 이 방법조차도 이상값으로부터 매우 민감한 단점이 있다.
실전에서 이상값을 찾기 위해 너무 많은 시간을  쓰는것은 추천하지 않느다. 변수들에 대해 summary 정도로 평균과 중위수 값을 파악해 제 1 사분위수 (Q1)와 제 3 사분위수 (Q3)을 보면 1차 판단을 하고, 좀 더 ㅅ간이 된다면 주요 변수(dimension)별로 플롯해보면서 특성을 파악할 수 있다. 단 부정사용방지 프로젝트(fraud detection project)에서는 많은 시간을 여기에 할당해야 한다.
a2 경우의 대표전인 경우로 POS 데이터에서 수작업으로 일정 시간에 일괄적으로 거래정보를 입력하는 경우 시간대별 매출 분석에서는 제외해야 되고, 고객 행동분석에서는 a3에 해당돼 포함해서 분석을 해야한다. 그러나 이러한 경우의 조합이 다양해져 변수가 많아지면 표준 데이터를 기준으로 작업하지 못하고 경우에 따라 데이터가 달라지므로 의사결정을 해야 한다.
또 다른 대표적인 경우로 불량이나 분실로 발생된 상품을 별도 고객명으로 가상 입력하는 경우이다. 특정 고객이 매우 많은 상품을 구매한 것으로 잘못 처리돼 전체 분석에 영향을 미치는 경우도 있다. 미리 상세하게 담당자에게 문의하지 않으면 알 수 없는 다양한 비즈니스 규칙도 있고, 물어도 고의로 대답을 안 하거나 모르는 경우가 크게 영향을 미칠 수 있다. 결국 일정 시간을 할애 분석 기준을 수립하고, 해당 기준에 의거해 드러나지 않는 것은 무시하고 진행해야 된다. 그렇지 않으면 분석 데이터와 결과 자체가 모두 엉망이 돼 관리가 불가능해진다.


2018년 1월 14일 일요일

CHAPTER 1 소개(파이센 라이브러를 활요한 머신러닝)

머신러닝은 데이터에서 지식을 추출하는 작업.

1.1 왜 머신러닝인가?

직접 규칙 생성시 두가지 커다란 단점.(규칙 기반 전물가 시스템, 3세대 인공지능)

- 결정에 필요한 로직은 한 분야나 작업에 국한.(작업이 조금만 변경되더라도 전체 시스템을 다시 개발해야 할 수 있음)
- 규칙을 설계하려면 그 분야 전문가들이 내리른 결정 방식 참조

1.1.1 머신러닝으로 풀 수 있는 문제
지도학습 알고리즘 : 이미 알려진 사례를 바탕으로 일반화된 모델을 만들어 의사 결정 프로세스를 자동화하는 것

비지도학습 알고리즘 : 입력은 주어지지만 출력은 제공되니 않음.

샘플(sample) 또는 데이터포인트(data point): 하나의 개체 혹은 행
특성: 샘플의 속성

1.1.2 문제와 데이터 이해하기
머신러닝 프로세스에서 가장 중요한 과정은 사용할 데이터를 이해하고 그 데이터가 해결해야 할 문제가 어떤 관련이 있는지를 이해하는 일.

1.2 왜 파이썬인가?
범용 프로그램 언어로서 파이썬은 복잡한 그래픽 사용자 인터페이스(GUI)나 웹 서비스도 만들 수 있고 기존 시스템과 통합하기도 쉽다.


1.3 scikit-learn(http://scikit-learn.org/stable/user_guide.html  , http://sckikit-learn.org/stable/modules/classes.html)
오픈소스인 skikit-learn은 자유롭게 사용 및 배포
산업 현장이나 하계에도 널리 사용
많은 튜토리얼과 예제코드를 쉽게 접할 수 있음.

1.3.1 scikit-learn 설치

Anaconda (http://www.continuum.io/annaconda-overview)
대용량 데이터 처리, 예측 분석, 과학 계산용 파이썬 배포판

Enthought coanopy(http://www.ehthought.com/products/canopy/)
무료버젼에는 scujut-learn이 비 포함, 학생과 학위 수여가 되는 기관 종사자는 Enthought Canopy의 유료 버젼을 무료로 받을수 있음.

Python(x,y) (http://python-xy.github.io/)
원도우 환경을 위한 과학 계산용 무료 파이씬 배포판

1.4 필수 라이브러리와 도구들
scikit-learn: 파이썬 과학 라이브러리
NumPy, SciPy, matplotib

1.4.1 주피터 노트북

1.4.2 NumPy
NumPy(http://numpy.org/): 과학 계산을 필요한 패키지. 다차원 배열을 위한 기능과 선형 대수 연산과 푸리에 변환 같은 고수준 수학 함수와 유사 난수 생성기를 포함.

1.4.3 SciPy(http://www.scipy.org/scipylib)
SciPy는 과학 계산용 함수를 모아놓은 파이썬 패키지

2. sqldf를 이용한 데이터 분석

R에서 sqldf는 표준 SQL에서 사용되는 문장이 모두 가능하고, 데이터 이름에 "."같은 특수문자가 들어간 경우 ''로 묶어주면 테이블처럼 간단히 처리할 수 있다.

3. plyr
plyr은 데이터를 분리하고처리한 다음, 다시 결합하는 등 가장 필수적인 데이터 처리기능을 제공한다.
apply 함수와 muti-core 사용 함수를 이용하면 for loop를 사용하지 않고 매우 간단하고 빠르게 처리할 수 있다. plyr은 apply 함수에 기반해 데이터와 출력변수를 동시에 배열로 치환하여 처리하는 패키지이다. 예를 들어 ddply 함수는 데이터 프레임 데이터를 가공해 데이터 프레임으로 돌려준다. 데이터별 plyr함수들은 아래와 같다.
- d = 데이터 프레임 (data.frame)
- a = 배열 (array)
- l = 리스트 (list)
따라서 ddply는 데이터 프레임을 입력 받아서, 그것을 분리(split)하거나 그 외 어떤 처리를 한 후 데이터 프레임으로 출력하게 한다. 일반적으로 데이터 프레임을 많이 다루기 때문에 ddply를 많이 쓴다. 마찬가지로 ldply는 리스트를 입력받아서 어떤 처리를 한 후에 데이터 프레임으로 출력하게 한다. 이러한 관계를 다음표로 요약할 수 있다. 여기에서 열(column)은 입력되는 데이터 형태를 말하며, 행(row)는 출력되는 데이터 형태를 말한다.

입력되는 데이터 형태
                                                       데이터 프레임                         리스트                 배열
                                                       (data.frame)                           (list)                 (array)
데이터 프레임(data.frame)                   ddply                                  ldply                 adply
리스트 (list)                                         dlply                                   llply                   alply
배열 (array)                                         daply                                  laply                  aaply

4. 데이터 테이블
데이터 테이블(data.table)은 데이터 프레임과 유사하지만 보다 빠른 그룹화(grouping)와 순서화 (ordering), 짧은 문장 지원 측면에서 데이터 프레임보다 매력적이다. 하지만 무조건 빠른 것이 아니므로 특성에 맞게 사용해야 한다. 특히 64비트 환경에서 RAM이 충분히 많을 때는 효율적이다.


1. R reshape를 활용한 데이터 마트 개발

데이터 마트란 데이터의 한 부분으로서 특정 사용자가 관심을 갖는 데이터들을 담은 비교적 작은 규모의 데이터 웨어하우스이다. 즉, 일반적인 데이터베이스 형태로 갖고 있는 다양한 정보를 사용자의 요구 항목에 따라 체계적으로 분석하여 기업의 경영 활동을 돕기 위한 시스템
데이터 마트는 전체적인 데이터 웨어하우스에 있는 일부 데이터를 가지고 특정 사용자를 대상으로 한다.
데이터 웨어하우스와 데이터 마트의 구분은 사용자의 기능 및 제공 범위를 기준으로 한다.

데이터 마트 개발에 대해 논하기에 앞서 데이터의 reshape에 대해서 간단하게 설명하고자 한다. 어떤 데이터는 여러 개층 또는 수준으로 그룹화를 시킬 수 있거나 다양한 관점에서 살펴볼 필요가 있다. 예를 들면 같은 데이터를 반복 측정한 경우 수집된 데이터를 관측하고자 하는 변수 기준으로 살펴볼 수도 있고 매 회의 반복을 기준으로 살펴볼 수도 있는 것과 같은 원리이다. 이런 방식의 데이터 탐색을 용일하게 수행하기 위해서는 데이터 셋에 대한 일종의 변형이 필요하다. 어떤 변형을 어떻게 수행해야 할 것인지 정확하게 정의 내리긴 어려울지 몰라도 분석에 임하는 사람들이라면 기존의 데이터 셋과는 다른 새로운 무언가가 필요하다고 직관적으로 느낄 것이다. resphape는 이와 같이 데이터 재정렬을 위한 기법의 하나이다. reshape와 비견될 수 있는 개념 중 하나는 밀집화(aggregation)인데 reshape보다는 밀집화가 우리에게 좀 더 친숙하고 쉽게 수행되고 있는 방법이다. 밀집화 기법을 이용하면 복잡한 데이터를 더 단순하고 사용하기 편리한 상태로 축소하거나 재정렬 할 수 있다. 가장 대표적으로 사용되는 밀집화 기법의 하나가 Excel의 Pivot Table 기능이다. 그러나 이런 밀집화 기법을 사용하면 데이터가 간단명료하게 표시되기는 하지만 기존 데이터가 가지고 있던 더 많은 정보들을 손실하게 된다. 이와 달리 reshape는 데이터 재정렬을 수행하되, 원래 데이터가 가지고 있는 모든 정보들을 그대로 유지한다는 것이 차이점이다. R에는 다양한 방식으로 reshape를 수행할 수 있는 명령어들이 여럿 존재하지만, 적재적소에 올바른 명령어를 사용하기에 어려움이 많았다. 'reshape' 패키지는 이러한 문제를 극복한 reshape방법의 하나로서 이 장에서는 데이터 마트 개발에 바로 이 'reshape'패키지를 이용해보고자 한다. 한편, 여기에서 설치한 reshape패키지는 R에 미리 내재되어 있는 명령문 reshape(Resahpe Grouped Data)와는 다르다는 것을 유념하길 바란다.

- reshape
reshape패키지는 단지 melt와 cast만을 사용하여 데이터를 재구성하거나 밀집화된 데이터를 유연하게 생성해준다. reshape는 기존 데이터 구조를 column-wise하게 전환하는데, 크게 melt와 cast 단계로 구분된다.


2018년 1월 13일 토요일

2, 기본 사용법

가. R과 R Studio의 구성
1) R의 구성
2) R Studiio의 구성

나. R 패키지 설치하기
R은 오픈 소스 프로그램이므로 다양한 개인들이 자신들만의 함수로 여러 기능을 제작하여 누구나 설치할 수 있는 패키지의 형태로 배포하고 있다. 이를 통해 최신 통계 이론을 적용한 패키지를 설치하여 분석을 실시할 수도 있고 각종 복잡한 그래프 설정에 대해 미리 정의해둔 패키지를 설치하면 복잡한 그림들을 손쉽게 그릴 수도 있다. 또한 기본 프로그램인 R(base)에서 지원하지 않는 명령어나 함수를 사용할 수 있으며 유용한 데이터셋이 내장되어 있는 패키지를 이용할 수도 있다.

R 패키지를 설치하기 위해 상단 메뉴바의 패키지툴을 클릭하고 패키지(를 ) 철치하기... 를 클릭한다. CRAN 미러사이트가 설정되어있지 않다면 CRAN 미러사이트를 지정하는 창이 뜬다. 미러사이트 설정되면 현재 설치할 수 있는 모든 패키지들의 목록이 알파벳순서로 나열된다. 설치하고자 하는 패키지를 찾아 선택하고 OK 버튼을 클릭하면 자동적으로 패키지 설치가 진행된다.

R Studio를 이용하면 패키지 설치도 간편하게 진행할 수 있다. 우측 하단 인터페이스의 Packages 탭을 클릭한 후 Install을 클릭하면 창이 새로 나타난다. 이 창에 패키지 이름을 입력하면 설치가 진행된다. 패키지 이름은 대소문자를 구별한다는 점에 유의하자.
또한 아래와 같은 명령어를 사용해서 패키지를 설치할 수도 있다. 이 경우 명령어를 실행하면 위와 마찬가지로 CRAN 미러사이트를 지정해주는 창이 나오고 선택된 미러사이트에서 패키지를 다운로드 받아 설치한다.
패키지의 이름을 정확하게 알고 있는 경우 이 코드를 직접 실행시키는 방법이 가장 빠르고 간편하게 패키지를 설치할 수 있는 방법이다.
>install.packages("패키지 이름"

패키지를 설치한 후에는 패키지를 R 콘솔에 불러와야 패키지에 포함된 함수나 데이터셋을 사용할 수 있다. 설치된 패키지는 다음 명령어를 이용하여 R 콘솔로 불러온다.
>library(패키지 이름)

패키지를 설치하는 명령어와 패키지를 불러오는 명령어에 따옴표 사용 유무가 다르므로 잘 확인하여야 한다. R Studio의 경우 패키지를 설치한 이후 우측 하단의 Package 탭의 목록 중에 불러오고자 하는 패키지의 이름 앞에 있는 체크박스를 클릭하면 자동적으로 위 코드를 실행시키며 패키지를 불러온다.

다. R 도움말(help)

라. R 언어와 문법
R 언어는 S 언어와 유사하며 C 언어와도 유사하기 때문에 다른 언어를 통한 프로그래밍에 익숙한 사람이라면 여러 가지 명령어를 직관적으로 적용할 수 있어 쉽게 사용이 가능하다. 그러나 프로그래밍을 처음 접해 보는 사람이라면 익숙해지기까지 시간이 필요할 것이다.

1) R의 데이터 구조
R은 다양한 형태의 데이터 구조를 다룰 수 있다. Transaction, Rules, Logical 등 다양항 형태의 데이터 구조가 존재하지만 그 중에서도 R에서 가장 주로 사용되는 데이터 구조인 벡터, 행렬, 데이터 프레임에 대해 살펴보자.

(1) 벡터
벡터 데이터 구조는 하나의 스칼라값, 혹은 하나 이상의 스칼라 원소들을 갖는 단순한 형태의 집합을 의미한다. 이 때 벡터 데이터 내에 들어갈 수 있는 원소는 숫자, 문자, 논리 연사자 등이 될 수 있다. 숫자로 이루어진 벡터는 숫자 벡터가 되고 문자로 이루어진 벡터는 문자 벡터가 된다. R에서 다루는 데이터 구조 중 가장 단순한 형태이며 명령어 c를 이용해 선언할 수 있다. 이때, 'c'는 concentration(연결)을 의미한다.
>x = c(1, 10, 24, 40)
>y = c("사과", "바나나", "오렌지")
>z = c(TRUE, FALSE, TRUE)

이 경우 x는 숫자형 벡터, y 는 문자형 벡터, z는 논리 연산자 벡터가 된다. 논리 연산자 벡터를 숫자형 벡터처럼 사용하는 경우 자동적으로 "TRUE"는  1의 값을 할당 받으며 "FALSE"는 0의 값을 할당받는다. R은 대문자와 소문자를 구분하여 인식하기 때문에 논리 연산자를 입력할 때는 반드시 모든 글자를 대문자로 기입하여야 논리연산자로 인식한다는 점에 유의하자. 등호 '='의 경우 우측의 값을 죄측의 변수에 할당한다는 의미로서 조금 더 직관적인 형태로 '<- p="">>x <- 10="" 24="" 40="" c="" p="">>y <- c="" p="">>z <- c="" false="" p="" true="">
또한 다음과 같이 c 명령어를 이요하여 벡터와 벡터를 결합하여 새로운 벡터를 형성할 수도 있다. 벡터를 결합하여 행렬을 이루도록 하는 방법도 존재하는데, 이에 대해서는 다른 절에서 다루도록 한다. 형식이 같은 벡터를 합치면 합쳐진 벡터의 형식도 이전과 동일한 형식을 따르지만, 합치는 벡터에 문자형 벡터가 포함되면 합쳐지는 벡터는 문자형 벡터가 된다. 아래 코드의 예에서 숫자형 벡터인 x와 문자형 벡터인 y를   xy라고 벡터로 전환되었기 때문에 이 값들을 숫자가 아닌 문자 데이터로 인식하게 된다.
> x <- 10="" 24="" 40="" c="" p="">> y <- c="" p="">> xy <- c="" p="" x="" y="">> xy
[1] "1"   "10"   "24"   "40"  "사과"  "바나나"  "오렌지"

(2)행렬
행렬은 행과 열을 갖는 m x n 형태의 직사각형에 데이터를 나열한 데이터 구조이다. 행렬의 선언을 위해 명령어 matrix 를 사용한다. matrix 명령어의 첫 번째 인수는 행렬에 들어가는 데이터들을 묶어놓은 벡터가 할당되며 ncol 옵션으로 열(column)의 수르 정하거나 nrow 옵션으로 행(row)의 수를 정해 행렬의 크기를 사용자가 원하는 대로 지정할 수 있다. 기본적으로 값들은 열을 우선 채우는 방향으로 입력된다 (즉, 1행 1열, 2행 1열, 3행 1열....1행2열, 2행2열...의 순서). 아래 코드를 살펴보면 행렬형 변수 'mx'는 1,2,3,4,5,6이라는 여섯 개의 원소를 갖는 행렬이 되며 ncol=2 옵션을 통해 2열짜리 (원소가 총 6개이므로 열의 개수가 2개인 것이 정해지면 행의 수도 3개로 자동적으로 정해진다) 행렬이 만들어 진다. 결과를 살펴보면 다음과 같다. 3행 2열이 만들어 졌으며 1, 2, 3, 4, 5, 6의 값이 열을 우선 채우는 방향으로 채워 넣어졌다. 만약 행을 우선 채우는 방향을 원하면, byrow=T 옵션을 추가하면 된다.

> mx = matrix(c(1, 2, 3, 4, 5, 6), ncol=2)
> mx

         [,1]     [,2]
[1,]       1       4
[2,]       2       5
[3,]       3       6

명령어 rbind와 cbind를 사용해 이미 만들어져있는 벡터를 서로 합쳐 행렬을 만들 수도 있다. rbind의 'r'은 'row'를 의미하는데 기존의 행렬에 행을 추가하는 형태로 데이터를 결합시킨다. cbind의 'c'는 'column'을 의미하는데 기존의 행렬에 열을 추가하는 형태로 데이터를 결합시킨다. 다음 예제 코드를 살펴보자. 우선 rbind 명령어를이용하여 이미 생성된 3행 2열의 행렬 'mx'에 1행 2열의  r1벡터를 추가하여 4행 2열의 행렬을 생성한다. 또한 cbind 명령어을 이용하여 기존의 행렬 'mx'에 3행 1열의 c1벡터를 추가하여 3행 3열의 행열을 생성한다.

> mx

         [,1]     [,2]
[1,]       1       4
[2,]       2       5
[3,]       3       6

> r1 = c(10, 10)
> c1 = c(20, 20, 20)
> rbind(mx, r1)

         [,1]     [,2]
[1,]       1       4
[2,]       2       5
[3,]       3       6
 r1       10     10
> cbind(mx, c1)

         [,1]     [,2]    c1
[1,]       1       4     20
[2,]       2       5     20
[3,]       3       6     20

행렬과 벡터 뿐 아니라 벡터와 벡터 역시 동일한 방법으로 합쳐 새로운 행렬을 형성할 수 있다. 이 때 합쳐지는 벡터들의 행의 수와 열의 수를 잘 파악하여 명령어를 적절하게 사용해야 한다. 또한  rbind 와 cbind  명령어는 기본적으로 같은 데이터 타입의 벡터들은 행렬의 형태로 합쳐주지만, 이 명령어들을 이용해 다음에 소개한 데이터 프레임을 서로 합치는 경우에는 그대로 데이터 프레임의 형태로 데이터를 합쳐준다.

(3) 데이터 프레임
데이터 프레임은 행렬과 유사한 2차원 목록 데이터 구조이다. 다루기가 쉽고 한번에 많은 정보를 담을 수 있어 R에서 가장 널리 사용된다. 행렬과는 다르게 각 열이 서로 다른 데이터 타입을 가질 수 있기 때문에 데이터의 크기가 커져도 사용자가 다루기 수월하다. 명령어 data.frame을 이용하면 여러 개의 벡터를 하나의 데이터 프레임으로 합쳐 입력할 수 있다.
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">> income = c(100, 200, 150, 300, 900)
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">> car = c("kia", "hyudai", "kia", "toyota", "lexus")
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">> marriage =  c(FALSE, FALSE, FALSE, TRUE, TRUE)
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">>mydat = data.frame(income, car, marriage)
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">
위 코드에서 선언되는 income 벡터는 숫자형 벡터이다. car 벡터는 "kia", "hyundai", "toyota", "lexus"의 값을 원소르 갖는 문자형 벡터이며 marriage는 논리 연산자 벡터이다. data.frame 명령어를 이용해 세 벡터를 합쳐 하나의 데이터 프레임인 mydat을 생성했다. 생성된 데이터 프레임인 mydat의 출력 형태는 다음과 같다. 각 행이 하나의 곽측치를 의미하고 각 열이 하나의 변수라고 가정하면 데이터 프레임은 분석자에게 상당히 친숙한 형태를 띠고 있음을 알 수 있다.

> mydat

                 income              car              marriage
1                     100            kia                FALSE
2                    200            hyundai        FALSE
3                    150             kia                FALSE
4                    300            toyota          TRUE
5                    900            lexus            TRUE

2) 외부 데이터 불러오기
데이터를 저장하는 파일 형식은 다양하다. R은 다양한 형태의 외부 데이터를 불러올 수 있다. 데이터 저장을 위해 주로 많이 사용되는 csv파일, txt파일, 엑셀의 xls/xlsx파일을 R로 불러오는 방법에 대해서 알아보자.

(1) csv파일 불러오기
명령어 read.table을 이용하면 csv파일을 R에 데이터 프레임 형태로 불러올 수 있다. csv파일의 구성에 따라 다양한 옵션을 이용하면 데이터가 작성된 형태 그래로 불러올 수 있다. header=T 옵션을 이용하면 csv파일의 첫 줄을 변수명으로 지정할 수 있다. 또한 sep=','옵션을 통해 데이터가 쉼표로 구분된 데이터 파일 (즉, csv파일)임을 지정해준다. read.table 명령어를 이용할 때는 파일 경로에 \ 대신 \\를 사용함에 유의한다. 혹은 \\ 대신 /을 사용해도 무관하다. 아래 코드를 통해 data1이라는 데이터 프레임이 생성되며 해당 경로의 csv파일을 그대로 불러오게 된다.
data1 <- example.csv="" header="T," p="" read.table="" sep=",">
혹은 유사한 명령어인 read.csv를 이용할 수도 있다. 사용법은 read.table과 비슷하지만 sep=","를 통해 구분자를 명시할 필요가 없다.

(2) txt파일 불러오기
명령어 read.table을 이용하여 txt파일 역시 데이터 프레임의 형태로 불러올 수 있다. 이 경우 sep=','옵션을 사용하지 않으면 csv파일이 아닌 일반 txt파일을 불러올 수 있다. txt파일을 데이터셋의 형태로 불러올 때는 txt파일이 구분자나 형식 등을 잘 지켜서 작성되어 있어야 한다. 아래 코드에서 선언되는 data2라는 데이터 프레임은 해당 경로의 텍스트 파일을 불러온다.
data2 <- example.txt="" p="" read.table="">
(3) 엑셀 파일 (xls/xlsx) 불러오기
엑셀 파일을 불러오는 방법은 크게 두 가지이다. 첫번째 방법은 엑셀 파일을 엑셀로 실행시킨 뒤 csv파일 형식으로 저장하여 앞의 csv파일 불러오기 방법으로 불러오는 방법이다. 엑셀을 사용할 수 없거나 이 방법이 번거롭다면 두 번째 방법으로 R에서 지원하는 패키지를 설치하여 엑셀 파일을 직접 불러올 수도 있다. 아래의 방법은 RODBC라는 패키지를 이용해 불러오는 방법이지만 이 외에도 엑셀 파일을 불어올 수 있도록 만들어 주는 패키지는 다양하다. 경로에 저장되어 있는 mydata.xls 파일을 불러오는 코드는 다음과 같다.
> library(RODBC) #패키지 열기
> new <- c:="" data="" mydata="" odbcconnectexcel="" p="">> yourdata <- heet1="" new="" p="" sheet="" sqlfetch="">> close(new)

library 명령어를 통해 RODBC 패키지를 연다. 이후 odbcConnectExcel 명령어와 sqlFetch 명령어를 이용하여 엑셀 파일의 워크시트를 설정하여 불러올 수 있다. 엑셀 파일의 경로를 입력하는 경우 확장자를 생략하고 작성해야 하는 점에 유의한다. 또한 엑셀 파일의 워크시트 이름은 대소문자를 구분하므로 정확하게 작성해야 한다. R의 패키지와 라이브러리를 설치하는 방법에 대해서는 뒤의 "라. R 패키지 설치하기" 에서 설명할 것이다.

3) R의 기초 함수
R에는 다양한 함수들이 존재하며 이 함수들을 적절하게 이용해 자신이 구현하고자 하는 통계적 기법이나 데이터 처리를 진행 할 수 있다. 여러 가지 함수들 중 가장 기본이 되는 몇 가지 함수들을 살펴보자. 이러한 기초 함수들은 복잡한 함수나 프로그램을 젝작하는데 있어 볼트와 너트처럼 어디에나 사용되므로 잘 익혀둘 필요가 있다.

(1) 수열 생성하기
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">복잡한 계산이나 알고리즘의 구현을 위해서는 다양한 형태의 숫자들을 반복적으로 생성해주는 수영 생성 함수들을 알아두어야 한다. rep 함수는 기본적으로 두 개의 인수를 갖는데, 첫 번째 인수를 두 번째 인수만큼 반복하는 숫자 벡터를 생성한다.
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> rep (1, 3)
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 1  1  1
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">seq 함수 역시 기본적으로 두 개의 인수를 갖는데, 첫 인수부터 두 번째 인수까지 1씩 증가하는 수열의 숫자 벡터를 생성한다.
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> seq (1, 3)
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 1  2  3
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">seq (1, 3)은 간단하게 1:3과 같은 형태로 사용할 수도 있다. a:b 라는 함수는 seq 함수의 첫 번째 인수가 a이고 두 번째 인수가 b인 경우와 가은 결과를 생성한다.
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> 1: 3
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 1  2  3
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
seq 함수에 by=n 옵션을 추가하여 1씩 증가하는 수열이 아닌 n씩 증가하는 수열을 생성할 수 있다.
> seq ( 1, 11, by=2)
[1] 1  3  5  7  9  11
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">seq 함수에 length=m 옵션을 추가하면 전체 수열의 개수가 m개가 되도록 자동적으로 증가하는 수열을 생성할 수 있다.
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">>seq (1, 11, length=6)
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 1  3  5  7  9  11
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">>seq (1, 11, length=8)
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 1.000000   2.428571   3,857143  5.285714  6.714286  8.142857  9.571429  11.000000
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">req 함수에 연속 증가하는 seq 함수의 형태를 인수로 사용하여 다음과 같은 수열을 생성할 수 있다. 이경우 수열 2:5, 즉 2, 3, 4, 5가 3번 반복된다는 것을 알 수 있다.
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> rep(2:5, 3)
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1] 2 3 4 5 2 3 4 5 2 3 4 5
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">(2) 기초적인 수치 계산
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">R에는 행렬 계산을 비롯해 다양한 형태의 수치 계산을 위한 함수와 명령어가 준비되어있다. 간단한 형태의 벡터와 행렬을 생성하여 여러 수치 계산 기능들에 대해 살펴보도록 하자. 아래 코드를 통해 기본적인 사칙연산이 수행되는 원리를 알 수 있을 것이다. 기본적으로 벡터와 벡터의 사칙연산을 수행하는 경우 연산되는 벡터들의 길이가 같아야 한다.
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> a = 1: 10
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> a 
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch=""> [1]  1  2  3  4  5  6   7   8   9   10
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> a + a
 [1]  2  4  6  8  10  12  14  16  18  20
> a - a
 [1]  0  0  0  0  0  0  0  0  0  0
> a * a
 [1] 1  4  3  16  25  36  49  64  81  100
> a / a
 [1]   1  1  1  1  1  1  1  1  1  1

R에서 벡터를 생성할 때는 기본적으로 열벡터가 만들어진다.. 아래 코드에서는 3행 1열의 열벡터 행렬을 생성하고, 이 행렬의 전치행렬 t(a), 즉 1행 3열의 행벡터 행렬을 생성한 후 두 행렬에 대해 서로 행렬곱을 실히해 3행 3열의 행렬을 만들어 보도록 한다. t 명령어를 통해 주어진 행렬의 전치행렬(transpose matrix)을 구할 수 있고 %*%를  통해 두 행렬 사이의 행렬곱을 실시할 수 있다.

> a = c(2, 7, 3)
> a
 [1]  2  7  3
>t(a)
        [, 1]  [, 2]  [,3]
[1,]     2       7     3
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> A = a%*t(a)
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">> A
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">        [, 1]  [, 2]  [, 3]
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[1 ,]    4      14     6
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[2 ,]  14     49    21
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">[3 ,]   6      21     9
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">행렬 A에 대해서 *를 통해 연산을 실시하면 단순한 스칼라 곱의 결과를 얻을 수 있다. 또한 solve 명령어를 통해 주어진 행렬의 역행렬(inverse matrix)을 계산할 수 있다.
> mx = matrix(c(23, 41, 12, 35, 67, 1, 24, 7, 53), nrow = 3)
>mx

        [, 1]  [, 2]  [, 3]
[1 ,]    23    35     24
[2 ,]   41     67       7
[3 ,]   12       1      53

> 5 * mx
         [, 1]      [, 2]      [, 3]
[1 ,]    115       175        120
[2 ,]   205     335         35
[3 ,]    60          5        265

>solve(mx)
                       [, 1]                  [, 2]                   [, 3]
[1 ,]  -0.35743822     0.18466969       0.13746848
[2 ,]   0.21069087   -0.09389813     -0.08300555
[3 ,]   0.07695411    -0.04004034    -0.01069087


R에서는 짧은 명령어를 이용해 기초적인 기술통계량들을 간편하게 계산할 수 있다. a라는 벡터를 다음과 같이 생성하고 이 벡터에 대하 기초 통계량들과 통계 계산에서 주로 사용되는 연산들에 대한 계산법을 살펴보자.
> a = 1: 10
> a
  [1]  1  2  3  4  5  6  7   8  9  10

mean,  var, sd 함수는 각각 입력한 벡터의 평균, 분산, 표준편차를 계산해 준다.
> mean(a)
  [1]  5.5
> var(a)
  [1]  9.166667
> sd(a)
  [1]  3.02765

sum, median, log 함수를 이용해서 각각 입력한 벡터들의 합, 중앙값, 자연로그값을 계산 할 수 있다.

> sum(a)
 [1] 55

> median(a)
 [1] 5.5

>log(a)
 [1]  0.000000   0.6931472   1.0986123   1.3862944   1.7917595   1.9459101
 [8]   2.0794415   2.1972246   2.3025851

서로 다른 두 벡터에 대해서는 cov, cor 함수를 사용해 공분산과 상관계수를 구할 수 있다.
> b=log(a)
> cov(a,b)
[1] 2.112062
> cor(a,b)
[1] 0.9516624

또한 summary 함수를 이용하면 주어진 벡터에 대해 각 사분위수와 최소값, 최대값, 중앙값, 평균을 계산 할 수 있다. summary 함수는 숫자 벡터에 사용하면 단순히 사분위수를 계산하는 기능을 하지만 다른 형태의 데이터 타입에도 사용할 수 있다. 이 때 summary 함수는 해당 대상에 대한 정보를 요약해주는 기능을 한다.
>summary(a)
         Min.            1st Qu,             Median            Mean          3rd Qu.            Max.
        1.00              3.25                5.50                5.50           7.75                 10.00

4) R 데이터 핸들링
R은 객체지향의 언어이기 때문에 변수(객체)를 불러오거나 변수 내의 요소들을 참조하는 것이 직관적이고 간단하다. 이를 이용하면 분석 기법을 적용하기 위한 빅데이터도 직관적으로 핸들링 하는 것이 가능하다.
여러 종류의 변수에 대해 기본적인 핸들링 방법을 살펴보자.

(1)벡터형 변수
예제로 'b'라는 문자형 벡터를 다음과 같이 생성하여 이 벡터에 대해 각 요소들을 핸들링 하는 방법을 살펴본다. 문자형 벡터 b에는 "a", "b", "c", "d", "e" 다섯 개의 문자 값이 포함되어 있다.

>b = c ("a", "b", "c", "d", "e")
>b
 [1]   "a"  "b"  "c"  "d"  "e"

b[n]과 같이 벡터 뒤에 대괄호 []를 붙여 숫자를 지정해 주면 b벡터 내에서 n번째 원소에 해당하는 값을 불러온다. b[-n]과 같이 대괄호 안에 -를 붙이고숫자를 지정해주면 n번째 원소에 해당하는 값만을 제외하고 b벡터를 불러온다. 대괄호 안에는 하나의 숫자뿐 아니라 여러 개의 원소를 불러오고자 할 때는 c 명령어를 사용하여 해당 원소값이 있는 위치를 나열해 주면 된다.
>b [ 2 ]
 [1]  "b"
>b [ -4 ]
 [1] "a"  "b"  "c "  "e"
>b [ c(2,3) ] #벡터의 2, 3번째 위치 값을 선택한다.
  [1]  "b"  "c"

(2) 행렬/데이터 프레임 형태의 변수
형렬형 변수나 데이터 프레임 형태의 변수에 대해서도 대괄호를 통한 특정 원소/요소의 참조가 가능하다. 먼저 다음과 같이 mydat이라는 데이터 프레임을 생성한다.
> income = c(100, 200, 150, 300, 900)
> car = c("kia", "hyundai", "kia", "toyota", "lexus")
> marriage = c(FALSE, FALSE, FALSE, TRUE, TRUE)
> mydat = data.frame(income, car, marriage)
> mydat
                income             car             marriage
1                  100               kia                 FALSE
2                 200       hyundai                 FALSE
3                 150                kia                 FALSE
4                300           toyota                 TRUE
5                900             lexus                  TRUE

기본적인 방식은 벡터형 변수를 다룰 때와 동일하다. 그러나 행렬형/데이터 프레임형 변수의 경우 대괄호 안에 [m,n]의 형식으로 두 개의 숫자를 사용하여 불러오고자 아는 자료의 행과 열을 지정해주어야 한다.
아래 예제를 참고하자. 이 경우에도 마찬가지로 [-m,   ] 또는 [  ,  -n]의 형태로 대괄호 안의 숫자에 - 를 붙여 해당 행이나 열만을 제외하고 데이터를 불러올 수도 있지만, [-m,  -n]처럼 행과 열을 모두 지정하여 하나의 원소만을 제외할 수는 없다. 또한 대괄호 안에 하나의 숫자뿐 아니라 여러 개의 숫자(숫자형 벡터)도 적용시킬 수 있다.

5) 반복 구문과 조건문
R의 함수 작성에 있어서 특정 조건 하에서 비슷한 작업을 반복하게 하는 구문, 또는 일정한 조건이 만족되면 다른 작업을 수행하도록 만들어주는 구문들을 활용하면 복잡한 계산이나 작업을 용이하게 처리할 수 있는 함수를 만들 수 있다. 다양한 반복 구문과 조건문이 존재하며 상황에 맞게 적절한 구문을 사용하면 프로그램이 작동되는 시간을 줄여 효율적인 프로그래밍이 가능해진다.

(1)for  반복 구문
> a = c( )  #아무런 값도 포함되지 않는 a 벡터 선언
>for (i in 1:9){
+ a[i] = i * i
+ }
>a
 [1]   1  4  9  16  25  36  49   64  81

> isum=0
> for ( i in 1:100) {
+ isum = isum + i
+ }
>cat("1부터 100까지의 합=", isum, "입니다.", "\n")
1부터 100까지의 합= 5050입니다.

(2)while 반복 구문
> x=1
> whilie (x <5 p="">+ x = x +1
+ print( x )
+ }
[1]  2
[1]  3
[1]  4
[1]  5

(3)if ~ else 조건문
> StatScore = c(88, 90, 78, 84, 76, 68, 50, 48, 66, 88, 96, 79, 65, 27, 88, 96,
33, 64, 48, 77, 64, 88, 95, 79, 88, 49, 30, 29, 10, 49, 88)
>over70 = rep(0,40) #1
>for(i in 1:40){
+ if ( StatScore[ i ] >= 70) over70[ i ] = i #2
+ else over70[ i ] = 0 }
> over70
[1] 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0
[29] 1 0 1 1 1 1 0 0 0 0 1
>sum(over70)
[1] 18

6) 사용자 정의 함수
function 명령어를 이용하면 기존에 존재하는 함수 외에도 사용자가 직접 복잡한 함수를 구성하여 사용할 수 있다. '함수 이름 = function(x, y, z)'의 형식으로 선언하며 이 때 괄호 안의 x, y, z는 함수 구문에서 인수(argument)로 사용된다. 간단한 사용자 정의 함수 코드를 살펴보자. 이 코드는 입력한 인수a 까지의 합을 계산해 주는 함수 addto를 선언한다.

> addto = function(a){
+ isum =0
+ for ( i in 1:a) {
+ isum = isum + i
+ }
+ print (isum)
}
>addto(10)
[1] 5050
>addto(50)
[1] 1275

7) 기타 유용한 기능들
R에는 이 외에도 많은 기능들이 존재하기 때문에 도움말이나 관련 교재를 참고한다면 분석자가 생각하는 알고리즘을 R로 구현하는 데는 큰 어려움이 없을 것으로 보인다. 마지막 절에는 아직 소개하지 않은 다양한 기능들 중에서도 특히, 프로그래밍 코드 중간에 사용되어 아주 복잡할 것 같은 프로그래밍을 간단하고 가능하게 해주는 유용한 기능들에 대해 소개하고자 한다. 이러한 기능들을 적재적소에 유용하게 사용하면 고급 프로그래머로서 더빠르고 효율적으로 작동하는 프로그램을 설계할 수 있을 것이다.

(1)paste
paste 명령어는 입력받은 문자열들을 하나로 붙여준다. 'sep=' 옵션을 통해 붙이고자 하는 문자열들 사이에 구분자(separator)를 삽입시킬 수 있다. 이 명령어를 이용하면 복잡한 알고리즘을 통해 생산되는 결과물들을 더 알기 쉽고 보기 좋게 출력하도록 할 수 있다.

>number=1:10
>alphabet=c("a", "b", "c")
>paste(number, alphabet)
 [1] "1 a" "2 b" "3 c" " 4 a" "5 b" "6 c" "7 a" "8 b" "9 c" "10 a"
>paste(number, alphabet, seq=" to the ")
 [1] "1 to the a" "2 to the b" "3 to the c" "4 to the a" "5 to the b" ......

(2)substr
주어진 문자열에서 특정 문자열을 추출
>substr("BigDataAnalysis", 1, 4)
 [1] "BigD"

>country=c("Korea", "Japan", "China", "Singapore", "Russia")
>substr(country, 1,3)
 [1] "Kor" "Jap"  "Chi"  "Sin"  "Rus"

(3) 자료형 데이터 구조 변환
R에서의 객체는 다양한 형태를 가질 수 있다. 예를 들어 문자형 변수, 실수형 변수, 논리 연산자, Factor, 데이터 프레임 등이 있다. 주어진 객체의 데이터 구조를 다른 구조로 바꾸자 할 때 다음과 같은 함수들을 사용해 변환할 수 있다.
- as.data.frame(x): 데이터 프레임 형식으로 변환한다.
- as.list(x): 리스트 형시으로 변환한다.
- as.matrix(x): 행렬 형식으로 변환한다.
- as.vector(x):벡터 형식으로 변환한다.
- as.factor(x):팩터(factor) 형식으로 변환한다.


> as.integer(3.14)
 [1] 3
> as.numeric("foo")
 [1] NA
경고메시지:
강제형벼환에 의해 생성된 NA입니다.

> as.character(101)
 [1] "101"
> as.numberic(FALSE)
 [1] 0
> as.logical(0.45)
 [1] TRUE

다음과 같이 as.matrix함수를 이용해 데이터 프레임을 행렬로 변환할 수도 있다. 문자형 데이터만이 저장되는 행렬로 변환되었으므로 데이터 프레임에서 숫자형 값으로 인식되던 변수들도 문자형으로 강제 전환된다. 다음 예제에서 데이터 프레임을 구성하고 있는 세 개의 백터에서 income열은 숫자형 벡터, car열은 문자형 벡트, marrage 열은 논리형 벡터의 형태로 구성되어 있지만, as.matrix 함수를 이용해 행렬로 변환된 이후에는 income열과 marriage 열의 데이터들도 모두 문자형 데이터로 변환되었다.
>mydat
      income              car            marriage
1          100              kia                 FALSE
2         200      hyundai                 FALSE
3         150               kia                 FALSE
4         300        toyota                  TRUE
5         900           lexus                 TRUE

>as.matrix(mydat)
              income              car           marriage
[1, ]            "100"            "kia"           "FALSE"
[2, ]           "200"   "hyundai"            "FALSE"
[3, ]           "150"             "kia"           "FALSE"
[4, ]           "300"       "toyota"           "TRUE"
[5, ]           "900"         "lexus"            "TRUE"

(4)문자열을 날짜로 변환
"2015-01-13"처럼 문자열 표현으로된 날짜 데이터를 실제 날짜의의미를 지니는 Date 객체로 변환해보자.
Date 객체를 통해 입력된 날짜 데이터는 시계열 부석이나 시간 요소를 포함하고 있는 그림을 그릴 때 유용하게 사용될 수 있다. 앞서 본 다른 변환들과 유사하게 as.Date 라는 함수를 통해 이 기능을 할 수 있지만, 그 전에 입력되는 문자열의 형식에 대해 알아야 한다. as.Date는 기본 문자열이 yyyy-mm-dd일 거라고 가정한다. 그 외의 다른 형식을 처리하려면 'format=' 옵션을 통해 입력되는 날짜의 형식을 지정해 주어야한다. 예를 들어 날짜가 미국에서 주로 사용하는 mm/dd/yy 형태로 구성되어 있다면 다음과 같이 옵션 'format="%m/%d/%Y"를 사용해야 한다.

- Sys.Date(): 현재 날짜를 반환한다.
- as.Date(): 날짜 객체로 변환한다.

> as.Date("2014-01-13")
 [1] "2015-01-13"
> as.Date("01/13/2015")
다음에 오류가 있습니다charToDate(x) : 문자열이 표준서식을 따르지 않습니다.
> as.Date("01/13/2015", format="%m/5d/%Y)
 [1] "2015-01-13"

(5) 날짜를 문자열로 변환
문자열을 날짜로 변환하여 사용할 수 있는 것처럼 날짜를 나타내는 Date객체 또한 문자열로 변환하여 사용할 수 있다. 분석의 결과물을 출력할 때 분석이 실시된 날짜를 기입하거나 날짜별로 데이터셋을 관리하는 등 다양한 응용법이 있을 수 있다. format 명령어를 통해 날짜 외에도 다양한 데이터의 포맷을 변경할 수 있다. format이 가진 기능은 아주 다양하지만 이해하기에 그다지 어렵지 않으며 자주 사용되는 기능은 아니기 때문에 이와 관련된 설명은 R 도움말을 통해 각자 살펴보도록 하자.

- format(데이터, 포맷)
- as.character()

> as.Date("08/13/2013", format="%m/%d/%y")
 [1] "2015-01-13"
> format(Sys.Date())
 [1] "2015-01-13"
> as.character(Sys.Date())
 [1] "2015-01-13"
> format(Sys.Date(), format="%m/%d/%Y")
 [1] "01/13/2015"

> format(Sys.Date(), '%a')  #'%a'는 요일을 출력한다.
 [1] "화"
> format(Sys.Date(), '%b')  #'%b'는 월을 출력한다.
 [1] "1"
> format(Sys.Date(), '%m')  #'%m'은 두자리 숫자로 월을 출력한다.
 [1] "01"
> format(Sys.Date(), '%d')   #'%d'는 두 자리 숫자로 일을 출력한다.
 [1] "13"
> format(Sys.Date(), '%y')   #'%y'는 두자리 숫자로 연도를 출력한다.
 [1] "15"
> format(Sys.Date(), '%Y')   # '%Y'는 네자리 숫자로 연도를 출력한다.
 [1] "2015"

마. R 그래픽 기능
R은 다른 통계 분석 프로그램들에 비해 그래픽 기능이 다양하고 자유자재로 그림을 그릴 수 있다는 장점이 있다. 다양한 종류의 그래프들을 그릴 수 있으며 이렇게 다양한 그래프에 대해 아주 세세한 부분까지 설정할 수 있다. 또한 전문적으로 그래프 그리기에 특화된 패키지를 설치하여 사용하면 상용 프로그램 수준의 그래프를 그릴 수도 있다. 축을 설정하고 기본적인 선을 긋거나 색을 변경하는 등의 낮은 단계(Low Level) 그래픽 함수들과 이를 이용하여 하나의 완성된 그래프를 구현할 수 있는 높은 단계 (High Level) 그래픽 함수가 있다. 높은 단계의 그래픽 함수들은 그 사용법이 매우 복잡하여 해당 함수를 지원하는 각각의 패키지에 이에 따른 전문적인 설명이 포함되어 있으므로 이 장에서는 다루지 않고, 간단한 몇 개의 그래픽 함수들을 살펴본다. 일반적으로 명령어를 이용해 그림을 새로 그려내는 경우 R에서는 별도의 창이 생성되어 그림이 나타나고 R Studio에서는 생성되는 모든 그림들을 우측 하단 Plot탭에서 볼 수 있다.

1) 산점도 그래프
plot(x, y) 함수는 x에 대한 y의 그래프를 그려준다. plot(y~x)라는 형태로도 마찬가지의그래프를 그릴수 있다.

> height = c(170,168,174,175,188,165,165 ,190,173,168,159,170,184,155,165)
> weight = c(68, 65, 74, 77, 92, 63, 67, 95, 72, 69, 60, 69, 73, 56, 55)
> plot(height, weight)

2) 산점도 행렬
여러 가지 변수들에 대해서 각각의 산점도를 한눈에 살펴볼 수 있도록 확장된 산점도 행렬이다. 여러 변수들을 한 공간에 표현하기 위해서는 4차원, 5차원의 공간이 도입되어야 하므로이를 극복하기 위해 도입된 그래프이다. 산점도 행렬은 pairs명령어를 이용해 바로 그릴 수 있으며 아래 코드에서는 좀 더 보기 좋은 그림을 위해 다양한 옵션이 사용되었다. "main=' 옵션은 그래프의 최상단에 제목을 표기해 준다. 'pch='옵션은 그래프 상에 찍히는 점의 모양을 변경해준다. 'bg=' 옵션을 이용해 iris 데이터의 Species에 따라 서로 다른 색상을 부여했다.
<5 p="">> pairs(iris[1:4], main = "Anderson's Iris Data -- 3 species",
<5 p="">+  pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)])
<5 p="">
<5 p="">이러한 그래프의 형태는 옵션에 따라 원하는 모양을 다양하게 만들어낼 수 있다. 또한 특정한 패키지를 설치해 이미 준비된 형태의 완성도 높은 그림을 손쉽게 그려낼 수도 있다.
<5 p="">
<5 p="">3) 히스토그램과 상자그림
<5 p="">탐색적 자료 분석에서 자료의 분포를 손쉽게 확인하는 방법으로히스토그램을 그려보거나 상자 그림을 그려보는 방법이 있다. 히스토그램과 상자 그림은 간편한 코드를 이용하여 손쉽게 그려볼 수 있다. 그림을 그리는 것 자체는 아주 단순하지만 사용자의 입맛에 맞게 축을 조절하거나 간격을 조절하고 색을 입히는 것은 해당 함수의 옵션을 통해 가능하다. 히스토그램과 상자 그림을 위한 기본적인 코드는 다음과 같다.
<5 p="">> StatScore = c(88, 90, 78, 84, 76, 68, 50, 48, 33, 70, 48, 66, 88, 96, 79, 65, 27, 88, 96,
<5 p=""> 33, 64, 48, 77, 18, 26, 44, 48, 68, 77, 64, 88, 95, 79, 88, 49, 30, 29, 10, 49, 88)
<5 p="">> hist( StatScore, prob=T)
<5 p="">> boxplot( StatScore )
<5 p="">
<5 p="">hist 함수는 히스토그램을 그려주는 함수이며 기본적으로 세로축(Y축)에 도수를 표기한다. prob=T 옵션을 통해 상대도수를 표시하도록 변경할 수 있다. boxplot 함수는 상자 그림을 그려준다. 
<5 p="">
<5 p="">

   




<- example.csv="" header="T," p="" read.table="" sep=","><- example.txt="" p="" read.table=""><- c:="" data="" mydata="" odbcconnectexcel="" p=""><- heet1="" new="" p="" sheet="" sqlfetch="">
<- p=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" false="" p="" true=""><- 10="" 24="" 40="" c="" p=""><- c="" p=""><- c="" p="" x="" y="">

2018년 1월 9일 화요일

1. 분석 화경의 이해

가. 통계 패키지 R
R은 통계 분석 과정에서 수행되는 복잡한 계산이나 시각화 기법을 쉽게 사용할 수 있도록 설계된 무료 소프트웨어이다. 통계학자나 데이터 분석 전문가들이 주로 사용하며 행렬 계산을 위한 도구로서도 사용될 수 있는데 이 경우 계산 성능 측면에서는 우수한 결과를 보여준다. R은 무료로 사용할 수 있는 오픈소스 소프트웨어라는 장점과 기본으로 제공되는 기능 외에도 사용자들이 직접 제작한 패키지를 이용하여 무수히 많은 기능들을 사용할 수 있도록 확장되는 점, 사용 소프트웨어나 출력물에 견주어도 뒤쳐지지 않는 정도의 강력한 시각화 요소를 갖추고 있다는 점을 무기로 최근 들어 그 인기가 점차 증가하고 있다.

나. R의 역사
R의 역사를 알기 위해서는 S라는 통계 프로그래밍 언어에 대한 이야기를 할 필요가 있다. 'S'는 1976년 AT&T의 Bell Labs Statistics Group에서 John Chamber, Rick Becker와 Allan Wilks가 "to turn ideas into software, quickly and faithfully."라는 목표로 자체 개발한 통계 프로그래밍 언어이다. 그 전까지 대부분의 통계 계산은 Fortran의 서브루틴을 통해 수행되었다. 1976년 최초 개발된 무명의 S는 "Statistical Computing System", "Statistical Analysis System"(그러나 이 이름은 지금의 "SAS System"이 이미 사용하고 있었다), "Interactive SCS" 등의 후보를 거쳐 'S'라는 이름으로 불리게 되었다.
이 'S'라는 이름은 Statistical computing의 머리글자이기도 했지만, 그 당시 같은 기관에서 설계하고 있던 또 다른 프로그래밍 언어와의 연관성을 강조하기 위해 한 글자의 알파벳으로 된 이름을 채택하고자 했기에 선택된 이름이기도 했다. 그 또 다른 프로그래밍 언어가 바로 C언어이다.
1988년 S의 문법 구조나 언어에 많은 변경이 있었으며 객체라는 개념이 도입되기 시작했다. "The New S Language"(Blue Book 출판)라는 책이 출간되어 함수에서 매크로까지 전반적인 기능들에 걸쳐 'New S' 에서 변경된 사항들을 소개했지만 사용자들이 이 'New S'로의 이주를 탐탁지 않게 생각했다. 많은 부분에 생겨난 변화 때문에 기존 사용자들이 사용하고 있던 대부분의 코드를 새로 작성해야 했기 때문이다. 그러던 중 R이 탄생한다.
R은 1993년 뉴질랜드 University of Auckland 에서 Ross Inaka와 Robert Gentleman에 의해 개발된 소프트웨어인데 'Scheme'이라는 언어로부터 렉시컬 스코드(정적 스코프)의 개념을 도입한 또 다른 S언어 프로그램이었다. 이 'R'이라는 이름은 두 개발자 Ross Inaka와 Robert Gentleman의 머리글자에서 따왔으며 S보다 한 단계 발전되었다는 의미에서 알파벳 S보다 앞선 R을 차용했다는 의미도 포함하고 있다. R이 발표되던 당시에도 S언어를 도입한 프로그램들은 계속 존재했었다. 1988년 TIBCO Software Inc. 에서 출시되어 계속 버전업을 거듭한 S-Plus라는 프로그램이 유명했고 최초의 S 역시도 S3, S4등의 후속 프로그램이 출시되었지만 이들은 모두 상용 프로그램이었다.
그런데 R이 처음 발표된지 2년째되던 해인 1995년, R은 자유 소프트웨어 재단(Free Software Foundation)의 GNU 일반 공중 사용 허가서 (GPL, GNU Public General License)로 인해 무료로 공개되었다. 또한 기존 프로그램을 사용하기 위해 대부분의 코드를 실행시킬 수 있었다. 이후로도 R은 대부분의 UNIX계열 플랫폼에 다채롭게 대응하도록 컴파일 되어 Windows는 물론 Linux나 Mac OS를 지원하며 저변을 넓혔다. 그리고 꾸준히 버젼업을 거듭하며 S4나 S-Plus를 체치고 현재는 S언어 기반 프로그램 중 가장 널리 사용되고 있으며 패키지를 통한 확장성 때문에 그 가능성 또한 높게 평가받고 있다. R은 사용자들이 직접 패키지를 계속 만들어서 새로운 기법들을 생성하고 있기 때문에 버전이 계속 갱신되고 있다.

다. R의 특징
R은 무료 소프트웨어이면서도 고차원적인 계산이 가능하며 통계 분석과 시각화에 최적화 된 환경을 통해 단순한 계산부터 복잡한 통계 기법까지 폭넓게 다룰 수 있다. R의 가장 강력한 특징들 몇 가지를 살펴보면 다음과 같다.

1) 그래픽 처리
R은 상용 소프트웨어에 버금가는 상당한 수준의 그래프와 그림을 그릴 수 있다. 기본적인 그래픽 관련 옵션들이 충실하게 갖춰져 있기 때문에 그림의 용도와 역할에 맞게 적절한 그래프를 언제든지 쉽게 생산할 수 있으며 매우 세부적인 부분까지 사용자가 직접 지정하여 섬세한 작업을 수행할 수 있다. 또한 출판물로 사용해도손색이 없을 정도의 고해상도 이미지를 생산함에도 그 처리 시간이 매우 빠르기 때문에 단순히 분석과정에서 뿐만 아니라 보고서 작성이나 발표 자료 작성 시에도 유용하게 사용할 수 있다.

2) 데이터 처리 및 계산 능력
R은 벡터(Vector), 행렬(Matrix), 배열(Array), 데이터 프레임(Data Frame), 리스트(List)등 다양한 형태의 데이터 구조를 지원하므로 다양한 형태의 분석에 대응하기 좋다. 또한 복잡한 구조 내의 개별 데이터에 접근하는 절차가 간단하므로 큰 데이터를 핸들링 하기도 간편하다.

3) 패키지
R에는 패키지라는 개념이 있어 사용자들이 스스로 개발하는 새로운 함수들을 패키지의 형태로 내려 받아 사용할 수 있다. 일반적으로 패키지는 하나의 목적을 가지고제작이 되는데 특정 분석 기법을 사용하기 위해 하나의 패키지를 설치하면 해당 분석에 필요한 과정들을 수행할 수 있는 함수가 패키지에 포함되어 있는 형식이다. 이러한 확장성 덕분에 다른 통계 프로그램에 비해 최신 이론이나 기법을 사용해보기가 더 쉽다. 연구자들이 자신의 기법을 패키지화 해서 올리기만 한다면 누구나 해당 패키지를 통해 그 기법을 사용해 볼 수 있기 때문이다. 또한 쉽게 사용할 수 없는 강력한 그래픽 처리를 원하는 경우에도 패키지의 형태를 적용하여 복잡하고 어려운 옵션이 적용된 고급 그래픽 기능들을 이요해 간편하게 처리할 수 있다.

라. R Studio
R Studio는 R을 사용하는 통합 개발 환경 (Integrated Development Environment; IDE)중의하나이다. IDE를 사용하면 R을 조금 더 간편하고확장된 기능을 가지는 환경에서 실행할 수 있다. 특히 R Studio는 메모리에 저장되어있는 변수의 정보에 바로 접근하여 변수 내에 저장된 값들을 살펴보거나 수정할 수 있으며 특별한 명령어 없이도 변수의 정보에 대해 바로 알 수 있다. 또한 스크립트를 관리하고 문서화하기가 수월해진다. R이 오픈 소스 프로그램이며 다양한 운영체제를 지원하는 것과 마찬가지로 R Studio 역시 무료로 사용할 수 있고 다양한 운영체제를 지원한다.

7. 분석 교육 및 변화관리

최근 구성원들에게 데이터 분석 교육을 받도록 독려하는 기업이 늘고 있다. 엔지니어가 입사하면 코드베이스나 개발 문화를 교육시키는 엔지니어 훈련(Engineering Bootcamp)프로그램을 운영하는 경우이다. 더 나아가 엔지니어뿐만 아니라 마케팅, 기획, 서비스, 관리 등 모든 부서의 구성원을 대상으로 데이터 분석 훈련 프로그램을 운영하기도 한다. 이런 배경에는 모든 구성원들이 직접 데이터를 보고, 분석하고 가설을 검증할 수 있는 능력을 갖춤으로써 데이터 활용을 통한 비즈니스 가치를 전사적으로 확대하기 위해서다.

예전에는 기업 내 데이터 분석가가 담당했던 일을 모든 구성원이 데이터를 분석하고 이를 바로 업무에 활용할 수 있도록 조직 전반에 분석 문화를 정착시키고 변화시키려는 시도로 볼 수 있다. 그림에서 보는 바와 같이 새로운 체계의 도입 시에는 저항 및 기존 형태로 되돌아가는 관성이 존재하기 때문에 분석의 가치를 극대화하고 내재화하는 안정적인 추진기로 접어들기 위해서는 분석에 관련된 교육 및 마인드 육성을 위한 적극적인 변화 관리가 필요하다.

빅데이터의 등장은 많은 비즈니스 영역에서 변화를 가져왔다. 이러한 변화에 보다 적극적으로 대응하기 위해서는 기업에 맞는 적합한 분석 업무를 도출하고 가치를 높여줄 수 있도록 분석 조직 및 인력에 대한 지속적인 교육과 훈련을 실시하여야 한다. 또한 경영층이 데이터에 기반 한 의사결정을 할 수 있는 기업문화를 정착시키려는 변화관리를 지속적으로 계획하고 수행하여야 한다.

분석 교육의 목표는 단순한 툴 교육이 아닌 분석 역량을 확보하고 강화하는 것에 초점을 맞추어 진행되어야 한다. 그림과 같이 분석 기획자에 대한 데이터 분석 큐레이션 교육, 분석 실무자에 대한 데이터 분석 기법 및 도구에 대한 교육, 업무 수행자에 대한 분석기회 발굴 및 시나리오 작성법 등 분석적인 사고를 업무에 적용할 수 있도록 다양한 교육을 통해 조직 구성원 모둥에게 분석기반의 업무를 정착시킬 수 있어야 한다. 이를 통해 데이터를 바라보는 관점, 데이터 분석과 활용 등이 기업문화로 자연스럽게 스며들게 확대 되어야 한다.