R에서 NA를 이해하는 신박한 방법

다음은  blog.revolutionanalytics.com에 실린 ‘The trick to understanding NAs (missing values) in R‘이라는 글을 옮긴 것입니다.

R에서 NA값을 어떻게 다루는 지를 보여주는 간단한 퍼즐이 하나 있다.

R에서  NA^0은 얼마일까?

다음과 같이 입력하여 쉽게 답을 구할 수 있다.

> NA^0
[1] 1

왜 1이지? 하는 호기심이 생긴다. 대부분의 사람들은 NA가 될 거라고 생각할 지도 모르겠다. 왜냐면 NA가 들어간 코드가 그랬으니까. 이것을 이해하기 위한 팁을 소개하고자 한다. NA를 숫자가 아니라, 숫자가 있어야 할 자리(placeholder)로 생각하자(숫자가 무엇인지는 중요하지 않다)

모든 숫자가 NA^0에서 NA를 대신할 수 있다. 양수라면 0승은 1이다. 음수도 마찬가지이다. 심지어는 0조차 수학적으로 1이다. NA^0에서 NA자리를 차지할 숫자가 무엇이든 답은 1이다. 그래서 R은 1이라는 결과를 돌려주는 것이다. NA가 아닌 결과를 돌려주는 몇 가지 다른 예를 보자.

> NA || TRUE
[1] TRUE

여기서 NA는 논리값의 자리를 차지하고 있으며 TRUE 또는 FALSE 값을 대신하고 있다. 참이든 거짓이든 답은 같을 것이다.

> TRUE || TRUE
[1] TRUE
> FALSE || TRUE
[1] TRUE

x가 최소 한 개 이상의 TRUE를 가지고 있다면 논리벡터에 NA가 포함되어 있어도 TRUE를 돌려줄 수 있다.  마찬가지로 NA && FALSE 는 항상 FALSE이다. 물론 여러 다른 예들이 있다. 그러나 R 에서 NA가 포함된 연산으로 혼란스럽다면 이것을 항상 기억해두길 바란다. R이 NA를 어떻게 다루는 지 더 자세히 알고 싶다면 R Language Definition 을 찾아 보길 바란다.

 

R을 이용한 시계열분석(2.시계열 시각화)

일단 시계열데이터를 R로 읽어들인후다음단계는 plot.ts()함수를사용하여시각화하는것이다.

ts()함수의 문법은 다음과 같다.

## S3 method for class ‘ts’
plot(x, y = NULL, plot.type = c(“multiple”, “single”),
       xy.labels, xy.lines, panel = lines, nc, yax.flip = FALSE,
       mar.multi = c(0, 5.1, 0, if(yax.flip) 5.1 else 2.1),
       oma.multi = c(6, 0, 5, 0), axes = TRUE, …)

다음은 영국의 42명의 왕들의 사망 당시 나이를 그린 것이다.

>plot.ts(kingstimeseries)

> plot.ts(birthstimeseries)

위의 시계열에서는 월간 출생자수에 계절적 변동이 있어 보인다. 여름에는 높아지고 겨울에는 낮아지는 특징이 있다. 계절적 변동과 랜덤한 변동은 시간에 대해 일정한 규칙성을 보인다.  마찬가지로 아래의 기념품 월간매출도 비슷하다.

> plot.ts(souvenirtimeseries)

> logsouvenirtimeseries

> plot.ts(logsouvenirtimeseries)


위의 그림에서 우리는 로그변환된 시계열에서 계절적인 변화와 랜덤한 변화의 크기가 대략 일정함고 시계열의 크기에 종속적이지 않다는 것을 알 수 있다. 가법모형을 사용하면 로그변환 시계열을 표현할 수 있다.

R을 이용한 시계열분석(1.시계열 데이터 읽어 들이기)

다음 글은 Using R for Time Series Analysis을 번역해 놓은 것이다.

시계열 데이터 읽어 들이기
시계열 데이터를 분석하기 위한 첫 단계는 데이터를 R로 읽어 들이는 것이다. 그리고 시계열 데이터를 그려보는 것이다. 데이터를 R로 읽어 오기 위한 기초적인 함수는 scan()함수이다. Scan()함수의 구문은 다음과 같다.

Scan()함수는 한 개의 컬럼을 가진 단순한 텍스트 형태의 연속적인 시계열 데이터를 가정한다. 가령 다음과 같은 형태의 데이터이다.

첫 세 개의 행은 데이터에 대한 설명을 담고 있는데, 데이터는 네 번쨰 행부터 시작하므로 읽어 들일 때 첫 세 개의 행은 무시해야 한다. Scan()함수의 skip 매개변수에 무시할 행의 갯수(첫 행부터)를 지정한다.

> kings kings
[1] 60 43 67 50 56 42 50 65 68 43 65 34 47 34 49 41 13 35 53 56 16 43 69 59 48
[26] 59 86 55 68 51 33 49 67 77 81 67 71 81 68 70 77 56

42명의 영국왕들의 사망 당시의 나이를 읽어 들여 kings 변수에 저장한다. 읽어들인 후 다음 단계는 데이터를 시계열 개체로 저장하는 것이다. 데이터를 시계열 개체로 저장하려면 ts()함수를 사용한다.

때때로 데이터를 일정 간격(월간,분기별등등)으로 수집한 경우 ts()함수의 frequency 매개변수를 이용하여. 주기를 설정한다. 월간 데이터의 경우 frequency=12, 분기 데이터의 경우 frequency=4 이다. 또한 start 매개변수를 사용하여 데이터가 수집된 첫 해와 첫 간격을 지정한다. 또한 start 매개변수를 사용하여 첫 데이터의 시작 점을 지정할 수 있다. 예를 들어 데이터가 1986년 2분기부터 분기별로 수집된 경우라면 frequency=4, start=c(1986, 2) 로 지정할 수 있다. 다음은 1946년 1월부터 1959년 12월 까지 매월 뉴욕시의 출생아 수 데이터이다. 월간 데이터이므로 frequency=12이고 첫 데이터가 1946년 1월이므로 start=c(1946, 1)이다. 읽어들인 데이터는 births 변수에 저장되고 이는 다시 ts()함수를 통해 birthstimeseries 시계열 개체로 만들어 진다.

다음은 1987년 1월부터 1993년 12월까지 오스트레일리아 퀀즈랜드의 어느 해변 리조트내 기념품 가게의 월간 매출액이다.

데이터정리

구조가 엉망이면 데이터를 사용할 수 없다. 데이터가 정리되지 않으면 데이터를 분해하고 모델을 만들고 데이터를 분석하여 결과를 보는 것조차 힘들 수 있다. 그래서 데이터를 수집하는 사람들은 이를 위해 노가다를 마다하지 않는다. 서브라임텍스트와 같은 텍스 에디터, 엑셀, R 등을 사용하여 지저분한 데이터를 유용한 상태로 바꿀 수 있다.

호수위의 백조처럼 우아하게 호수를 미끄러지듯 움직이는 것처럼 분석가가 하는 일이 멋지고 능력있어 보이지만 사실 짧은 다리로 열심히 물질하듯이 데이터 청소에 더 많은 시간을 보낼 수 있다. 분석가가 분석을 위해 받은 데이터는 완벽히 조직화된 상태로 전달되지 않는 경우가 많다. 그래서 힘든 텍스트 조작을 수행하여 분석에 필요한 형식으로 변환한다.

실무에서 데이터 정리시 원본 데이터 복사본을 가지고 시작한다. 중간 중간 단계마다 다른 이름으로 저장한다. 필요한 데이터의 모습에 맞춰 정돈되지 않는 않은 것에서 패턴을 찾는다. 반복적인 패턴을 활용하여 데이터를 정리하고 재구성하는 루틴이 반복되며 원하는 데이터를 얻는다.

 

 

웹스크래핑 패키지, rvest

rvest는 파이썬의 BeautifulSoup과 같은 류의 웹스크랩핑 패키지이다. html 뿐만 아니라 xml 자료에서 원하는 부분을 가져와 처리할 수 있다. 다음은 R에서 기본 제공되는 아이리스(붓꽃)에 대한 데이터이다. 아이리스는 통계학자, 유전학자, 진화생물학자 Fisher 가 소개한 데이터로, 붓꽃의 3가지 종(setosa, versicolor, virginica)에 대해 꽃받침(sepal)과 꽃잎(petal)의 길이를 정리한 데이터다. 이 데이터는 R에 기본으로 내장되어 있고, 이해하기 쉬우며 크기가 작아 R뿐만 아니라 다른 데이터 분석에서 자주 사용되고 있다. 이 포스팅의 아래 데이터를 스크랩핑하는 예이다.

sepal lengthsepal widthpetal lengthpetal widthiris
5.13.51.40.2Iris-setosa
4.931.40.2Iris-setosa
4.73.21.30.2Iris-setosa
4.63.11.50.2Iris-setosa
53.61.40.2Iris-setosa
5.43.91.70.4Iris-setosa
4.63.41.40.3Iris-setosa
53.41.50.2Iris-setosa
4.42.91.40.2Iris-setosa
4.93.11.50.1Iris-setosa
5.43.71.50.2Iris-setosa
4.83.41.60.2Iris-setosa
4.831.40.1Iris-setosa
4.331.10.1Iris-setosa
5.841.20.2Iris-setosa
5.74.41.50.4Iris-setosa
5.43.91.30.4Iris-setosa
5.13.51.40.3Iris-setosa
5.73.81.70.3Iris-setosa
5.13.81.50.3Iris-setosa
5.43.41.70.2Iris-setosa
5.13.71.50.4Iris-setosa
4.63.610.2Iris-setosa
5.13.31.70.5Iris-setosa
4.83.41.90.2Iris-setosa
531.60.2Iris-setosa
53.41.60.4Iris-setosa
5.23.51.50.2Iris-setosa
5.23.41.40.2Iris-setosa
4.73.21.60.2Iris-setosa
4.83.11.60.2Iris-setosa
5.43.41.50.4Iris-setosa
5.24.11.50.1Iris-setosa
5.54.21.40.2Iris-setosa
4.93.11.50.1Iris-setosa
53.21.20.2Iris-setosa
5.53.51.30.2Iris-setosa
4.93.11.50.1Iris-setosa
4.431.30.2Iris-setosa
5.13.41.50.2Iris-setosa
53.51.30.3Iris-setosa
4.52.31.30.3Iris-setosa
4.43.21.30.2Iris-setosa
53.51.60.6Iris-setosa
5.13.81.90.4Iris-setosa
4.831.40.3Iris-setosa
5.13.81.60.2Iris-setosa
4.63.21.40.2Iris-setosa
5.33.71.50.2Iris-setosa
53.31.40.2Iris-setosa
73.24.71.4Iris-versicolor
6.43.24.51.5Iris-versicolor
6.93.14.91.5Iris-versicolor
5.52.341.3Iris-versicolor
6.52.84.61.5Iris-versicolor
5.72.84.51.3Iris-versicolor
6.33.34.71.6Iris-versicolor
4.92.43.31Iris-versicolor
6.62.94.61.3Iris-versicolor
5.22.73.91.4Iris-versicolor
523.51Iris-versicolor
5.934.21.5Iris-versicolor
62.241Iris-versicolor
6.12.94.71.4Iris-versicolor
5.62.93.61.3Iris-versicolor
6.73.14.41.4Iris-versicolor
5.634.51.5Iris-versicolor
5.82.74.11Iris-versicolor
6.22.24.51.5Iris-versicolor
5.62.53.91.1Iris-versicolor
5.93.24.81.8Iris-versicolor
6.12.841.3Iris-versicolor
6.32.54.91.5Iris-versicolor
6.12.84.71.2Iris-versicolor
6.42.94.31.3Iris-versicolor
6.634.41.4Iris-versicolor
6.82.84.81.4Iris-versicolor
6.7351.7Iris-versicolor
62.94.51.5Iris-versicolor
5.72.63.51Iris-versicolor
5.52.43.81.1Iris-versicolor
5.52.43.71Iris-versicolor
5.82.73.91.2Iris-versicolor
62.75.11.6Iris-versicolor
5.434.51.5Iris-versicolor
63.44.51.6Iris-versicolor
6.73.14.71.5Iris-versicolor
6.32.34.41.3Iris-versicolor
5.634.11.3Iris-versicolor
5.52.541.3Iris-versicolor
5.52.64.41.2Iris-versicolor
6.134.61.4Iris-versicolor
5.82.641.2Iris-versicolor
52.33.31Iris-versicolor
5.62.74.21.3Iris-versicolor
5.734.21.2Iris-versicolor
5.72.94.21.3Iris-versicolor
6.22.94.31.3Iris-versicolor
5.12.531.1Iris-versicolor
5.72.84.11.3Iris-versicolor
6.33.362.5Iris-virginica
5.82.75.11.9Iris-virginica
7.135.92.1Iris-virginica
6.32.95.61.8Iris-virginica
6.535.82.2Iris-virginica
7.636.62.1Iris-virginica
4.92.54.51.7Iris-virginica
7.32.96.31.8Iris-virginica
6.72.55.81.8Iris-virginica
7.23.66.12.5Iris-virginica
6.53.25.12Iris-virginica
6.42.75.31.9Iris-virginica
6.835.52.1Iris-virginica
5.72.552Iris-virginica
5.82.85.12.4Iris-virginica
6.43.25.32.3Iris-virginica
6.535.51.8Iris-virginica
7.73.86.72.2Iris-virginica
7.72.66.92.3Iris-virginica
62.251.5Iris-virginica
6.93.25.72.3Iris-virginica
5.62.84.92Iris-virginica
7.72.86.72Iris-virginica
6.32.74.91.8Iris-virginica
6.73.35.72.1Iris-virginica
7.23.261.8Iris-virginica
6.22.84.81.8Iris-virginica
6.134.91.8Iris-virginica
6.42.85.62.1Iris-virginica
7.235.81.6Iris-virginica
7.42.86.11.9Iris-virginica
7.93.86.42Iris-virginica
6.42.85.62.2Iris-virginica
6.32.85.11.5Iris-virginica
6.12.65.61.4Iris-virginica
7.736.12.3Iris-virginica
6.33.45.62.4Iris-virginica
6.43.15.51.8Iris-virginica
634.81.8Iris-virginica
6.93.15.42.1Iris-virginica
6.73.15.62.4Iris-virginica
6.93.15.12.3Iris-virginica
5.82.75.11.9Iris-virginica
6.83.25.92.3Iris-virginica
6.73.35.72.5Iris-virginica
6.735.22.3Iris-virginica
6.32.551.9Iris-virginica
6.535.22Iris-virginica
6.23.45.42.3Iris-virginica
5.935.11.8Iris-virginica

 

천단위마다 컴마(,)붙이기

엑셀에서 흔히 하는 일중 하나가 천단위마다 컴마를 표시하는 것인데,  파이썬으로 하려면 아래와 같이 따로 만드는 수밖에 없죠

Django와 Apache 연동

  1. wsgi.py – 장고와 웹서버를 연결. 여기에는 WSGI규격에 따라 호출가능한 애플리케이션객체를 정의. 객체명은 application이어야 하며 자동으로 만들어짐.
  2. application개체는 http.conf설정파일에서 WSGIScriptAlias 지시자를 통해 지정. 웹서버는 이 application객체를 호출하여 장고의 애플리케이션을 실행. 다만 실행전 현재의 프로젝트 및 프로젝트내 모든 애플리케이션 설정정보를 로딩하는 작업이 필요.
  3. 설정정보는 Apache는 wsgi.py에서 지정해주고 있음
  4. settings모듈의 DEBUG설정값은 False로 하여 디버깅정보누출방지
  5. CSRF공격을 막기 위해 ALLOWED_HOSTS항목 변경
  6. 개발서버와 달리 상용모드에선 이미지,자바스크립트,CSS 등 정적파일 위치를 알려줘야 함. settings모듈의 STATIC_ROOT항목은 장고의 collection명령 실행시(python manage.py collectstatic) 정적파일들을 한 곳에 모아둔 디렉토리. 아파치설정파일에서도 Alias /static설정 필요
  7. collection명령 실행시 주의할 점은 settings모듈의 STATICFILES_DIRS항목에 STATIC_ROOT항목에서 정의한 디렉토리가 포함되면 안된다.
  8. 사용모드에서는 웹서버프로세스의 권한자인 apache사용자권한으로 데이터베이스파일이나 로그파일에 액세스해야 한다. 이를 위해 settings모듈의 DATABASE항목에서 NAME속성값의 경로를 db/dbsqlite3로 변경하고
  9. 해당 디렉토리 및 파일의 액세스권한을 아래처럼 변경. SQLite파일 위치를 옮기고 SQLite가 있는 디렉토리 및 파일에 apache 사용자가 접근/읽기/쓰기 가능하도록 설정
  10. settings모듈의 LOGGING항목에 로깅관련사항이 정의되어 있고 여기에 로그파일의 위치가 설정되어 있음. 로그파일에 apache 사용자가 읽기/쓰기 가능하도록 설정

모두의 파이썬 : 20일 만에 배우는 프로그래밍 기초

더북(https://thebook.io/)은 (주)도서출판 길벗에서 제공하는 IT 도서 열람 서비스입니다. 모든 책을 아니지만 현재 판매중인 책을 공개하고 있다는 사실이 매우 놀라운 일입니다. 아는 분이 있어 ‘왜 이런 서비스를 하느냐? 매출에 영향이 있을 텐데..’ 물었더니, 오히려 책 판매에도 도움이 되기도 한다고 합니다. 사실 모니터로 글을 읽는 것도 좋치만 정말 내게 필요한 책이고 살 만한 가치가 있다면 기꺼이 돈을 내고 종이책을 사고 싶습니다. 최근에 ‘모두의 파이썬 : 20일 만에 배우는 프로그래밍 기초’이라는 파이썬 입문서를 하나 공개하였습니다.

everyonespython모두의 파이썬 : 20일 만에 배우는 프로그래밍 기초
프로그래밍을 한 번도 해본 적이 없어도 괜찮다!
파이썬이 무엇인지 몰라도 상관 없다!
『모두의 파이썬』은 어려운 개념과 복잡한 이론 설명은 최대한 줄이고, 초보자가 프로그래밍을 쉽게 배울 수 있도록 짧고 간단한 예제로 내용을 구성했다. 처음부터 모든 것을 다 이해하지 못해도 괜찮다. 프로그램을 따라서 입력하고, 실행 결과를 확인하며, 책에서 알려주는 대로 에러를 수정해 보자. 어느새 파이썬 프로그램으로 멋진 그림을 그리고, 계산을 하고, 간단한 게임을 만들고, 수학 문제를 푸는 자신을 발견하게 될 것이다. 『모두의 파이썬』으로 남녀노소 누구나 즐겁게 프로그래밍을 시작해 보자!