안녕하세요. 내용이 길어질것 같아 제 블로그로 초대했습니다. 혹시 출처 삭제 원하시면 알려주세요. 지워드립니다. 제가 html이 아직 익숙치 않아서 배경화면이 살짝 달라지네요. 이 점 양해 부탁드립니다. 


 1) (list로 받아진걸) 행렬로 저장하는 xxx가 뭔지 궁금합니다.

a <- read.csv(file="c:\\order4.csv", header=TRUE, sep=","); 

typeof(a); 

xxx(a);


2) 가령 5열의 1행부터 4행까지 공란을  숫자 zero (0)으로 채워넣으려고 합니다. / 물론 원파일은 매우 크고 이런 공란은 여러군데에서 생기지요 / 공란생긴거 모두 0 으로 바꾸는게 가능한가요?

[출처] [급질] read.csv 와 list가 잘 않됩니다. (통계 R 프로그래밍) |작성자 곰에이


파일이 한글파일인가요? 엑셀파일 열면 글씨가 깨져서 임의로 다른 파일 사용했습니다. csv파일에서 제가 AREA의 숫자를 일부러 몇개 지워서 저장했고요. 얘를 R로 불러왔습니다. 아래 데이터 보면 NA가 되어있죠. 아마 공란이 되어있을수도 있고 NA처럼 되어있을수도 있어요. 

apple<- read.csv("/Users/XX/Desktop/apple.csv", header = TRUE)[1:20,1:9]
apple
##     CROP AREA      DATATIME Tavg  Tmax  Tmin Rain    RH  Wet
## 1  apple    1 08-03-01 0:00 1.84  9.92 -6.08 0.00 46.66 0.00
## 2  apple    1 08-03-02 0:00 2.06 11.36 -5.40 0.00 52.88 0.00
## 3  apple    1 08-03-03 0:00 2.80  8.32 -2.58 0.00 62.32 0.00
## 4  apple   NA 08-03-04 0:00 0.20  3.72 -2.76 2.62 84.14 0.56
## 5  apple    1 08-03-05 0:00 1.10  9.26 -3.66 0.00 71.56 0.30
## 6  apple    1 08-03-06 0:00 1.10  9.30 -7.00 0.00 65.38 0.20
## 7  apple    1 08-03-07 0:00 2.08  8.72 -3.62 0.00 63.36 0.00
## 8  apple    1 08-03-08 0:00 1.94 12.90 -7.98 0.00 54.76 0.20
## 9  apple    1 08-03-09 0:00 4.54 15.02 -3.18 0.00 48.44 0.00
## 10 apple    1 08-03-10 0:00 4.40 14.82 -4.30 0.00 57.50 0.00
## 11 apple    1 08-03-11 0:00 6.26 17.36 -3.20 0.00 65.16 0.12
## 12 apple    1 08-03-12 0:00 7.58 18.04 -0.98 0.00 67.28 0.20
## 13 apple    1 08-03-13 0:00 7.18 14.82  0.74 0.58 69.62 0.10
## 14 apple   NA 08-03-14 0:00 7.90 14.80  0.44 0.00 69.38 0.40
## 15 apple    1 08-03-15 0:00 8.60 16.76 -0.20 0.00 57.06 0.00
## 16 apple    1 08-03-16 0:00 8.26 15.22  0.48 0.00 45.22 0.00
## 17 apple    1 08-03-17 0:00 6.18 17.84 -4.56 0.00 47.38 0.00
## 18 apple    1 08-03-18 0:00 8.80 18.28 -0.36 0.00 60.98 0.10
## 19 apple   NA 08-03-19 0:00 8.00 14.54 -0.42 0.00 66.42 0.00
## 20 apple    1 08-03-20 0:00 5.10 15.66 -5.60 0.00 54.50 0.12
typeof(apple)   - TYPE보면 LIST라고 되어있죠? 
## [1] "list"
class(apple)    - CLASS 보면 data.frame으로 되어있습니다. typeof와 class의 차이가 뭐냐라고 하면 컴퓨터적인 얘기이지만 object를 컴퓨터의 메모리에 어떻게 저장하느냐, 표현형식이 뭐냐인데요. 이건 주 내용이 아니니까 패스합니다. 
## [1] "data.frame"
apple <-as.matrix(apple)  -matrix 형식으로 바꾸고 싶으면 as.matrix(데이터이름) 하면 됩니다. 그러면
typeof(apple)    - typeof는 캐릭터형식으로 메모리에 저장된다고 하고요. 제가 여기엔 안적었지만 class가 어떤지 물어보면 matrix라고 뜹니다. 
## [1] "character"
is.character(apple[,2]) - 두번째 열이 문자형이냐고 물어봤더니 맞다네요. 제가 문자형으로 바꿔준 이유는 NA를 다른 수로 바꾸고 싶어서예요. 
## [1] TRUE
apple[is.na(apple)] <-0   - 명령어보면 apple데이터안에 is.na 즉 na가 있냐라고 물어본거고 있으면 0을 넣어라..라는 의미입니다. 아래 결과값 보면 0 잘 들어갔죠? 
apple
##    CROP    AREA DATATIME        Tavg   Tmax    Tmin    Rain   RH     
## 1  "apple" " 1" "08-03-01 0:00" "1.84" " 9.92" "-6.08" "0.00" "46.66"
## 2  "apple" " 1" "08-03-02 0:00" "2.06" "11.36" "-5.40" "0.00" "52.88"
## 3  "apple" " 1" "08-03-03 0:00" "2.80" " 8.32" "-2.58" "0.00" "62.32"
## 4  "apple" "0"  "08-03-04 0:00" "0.20" " 3.72" "-2.76" "2.62" "84.14"
## 5  "apple" " 1" "08-03-05 0:00" "1.10" " 9.26" "-3.66" "0.00" "71.56"
## 6  "apple" " 1" "08-03-06 0:00" "1.10" " 9.30" "-7.00" "0.00" "65.38"
## 7  "apple" " 1" "08-03-07 0:00" "2.08" " 8.72" "-3.62" "0.00" "63.36"
## 8  "apple" " 1" "08-03-08 0:00" "1.94" "12.90" "-7.98" "0.00" "54.76"
## 9  "apple" " 1" "08-03-09 0:00" "4.54" "15.02" "-3.18" "0.00" "48.44"
## 10 "apple" " 1" "08-03-10 0:00" "4.40" "14.82" "-4.30" "0.00" "57.50"
## 11 "apple" " 1" "08-03-11 0:00" "6.26" "17.36" "-3.20" "0.00" "65.16"
## 12 "apple" " 1" "08-03-12 0:00" "7.58" "18.04" "-0.98" "0.00" "67.28"
## 13 "apple" " 1" "08-03-13 0:00" "7.18" "14.82" " 0.74" "0.58" "69.62"
## 14 "apple" "0"  "08-03-14 0:00" "7.90" "14.80" " 0.44" "0.00" "69.38"
## 15 "apple" " 1" "08-03-15 0:00" "8.60" "16.76" "-0.20" "0.00" "57.06"
## 16 "apple" " 1" "08-03-16 0:00" "8.26" "15.22" " 0.48" "0.00" "45.22"
## 17 "apple" " 1" "08-03-17 0:00" "6.18" "17.84" "-4.56" "0.00" "47.38"
## 18 "apple" " 1" "08-03-18 0:00" "8.80" "18.28" "-0.36" "0.00" "60.98"
## 19 "apple" "0"  "08-03-19 0:00" "8.00" "14.54" "-0.42" "0.00" "66.42"
## 20 "apple" " 1" "08-03-20 0:00" "5.10" "15.66" "-5.60" "0.00" "54.50"


csv파일에서 빈 셀이 있는데 얘를 R로 불러오면 na로 뜨는데요. 만약 NA가 없이 빈 공간으로 되어있자면 

데이터이름$열이름[데이터이름$열이름 == ""] <- "NA" 라고 하면 됩니다. 

반응형
Box Plot 그리기

Box Plot 그리는 방법에 대해 짧게 정리해보겠습니다. 네이버 카페 보다가 자료가 있어서 가져왔고요. 문제가 있으면 데이터 삭제하겠습니다.


ozone.csv


New York City 에 대해 오존 레벨 데이터 입니다. 통계 프로그래밍인 R을 이용해서 박스플롯 (Box Plot)을 그리려고 하는데요. 그럼 R로 데이터를 불러와야겠죠. 


데이터 불러오는건 간단합니다. 엑셀파일의 데이타라서 read.csv를 이용하면 되고요 그 뒤에 경로를 입력하면 됩니다. 제가 xx는 제이름부분이라서~ 저렇게 표시되었습니다. 이렇게 파일을 불러오면 str을 이용해서 각 변수별로 어떤 타입을 가지고 있는지 확인하는게 중요해요. str(ozone)을 해보니, 2개의 변수 Yonkers, Stamford 가 있고, 거기엔 각 숫자형식의 데이터가 있는데 총 131개의 observations이 있네요. 

ozone<- read.csv("/Users/XX/Desktop/ozone.csv", header = TRUE)
str(ozone)
## 'data.frame':    131 obs. of  2 variables:##  $ Yonkers : int  37 45 52 51 22 27 25 55 72 132 ...
##  $ Stamford: int  52 49 64 68 26 86 52 75 87 188 ...

전 head도 확인하는데요. 즉 데이터의 상위 몇개정도의 데이타만 보여달란 뜻입니다. 간단한 데이터는 확인할 필요까지는 없지만 변수의 갯수가 많을 경우, 이렇게 확인하는게 좋습니다. 

head(ozone)
##   Yonkers Stamford
## 1      37       52
## 2      45       49
## 3      52       64
## 4      51       68
## 5      22       26
## 6      27       86

이제 Boxplot을 그려볼까요. 가장 간단한 방법은 boxplot(데이터이름) 이고요. 제목이 있으면 더 좋겠죠. 그래서 main부분에 제목을 넣어줍니다. 그러면 아래 그림처럼 boxplot이 떠요. 

boxplot(ozone, main="New York Ozone Levels")
summary(ozone)



위 그림 살펴보면 Yonkers와 Stamford도시간의 ozone level이 어떻게 다른지 확인할 수 있고요. 

Box plot을 보면 맨 아래 라인은 minimum value 그리고 박스 안에서는 Lower Quintile, median, Upper quantile 그리고 마지막 라인은 maximum value입니다. 그 위에 점들은 outliers 을 말하고요.  


각 값들은 summary라는 명령어를 통해 알 수 있습니다. 서로 값이 많이 다른게 보이네요. 

##     Yonkers          Stamford     ##  Min.   :  9.00   Min.   : 14.00  
##  1st Qu.: 33.50   1st Qu.: 50.00  
##  Median : 49.00   Median : 80.00  
##  Mean   : 54.96   Mean   : 90.05  
##  3rd Qu.: 74.50   3rd Qu.:120.50  
##  Max.   :132.00   Max.   :240.00


위에 방법은 가장 간단한 방법이고요. 다른 패키지를 이용하면 더 예쁘게 그릴 수있습니다. 

ggplot2도 좋고 요샌 plotly에 빠져있어서 이걸로 그려볼게요. 계정을 만들면 화면에서도 마우스 오버하면 숫자 나오고 이렇게 해야하는데요. 계정을 만들어서 R에 세팅해야하는지라 귀찮아서 걍 건너뜁니다. 실제로 코드 따라하면 마우스 오버했을때 숫치가 나타나고 그래요. 진짜 예쁩니다ㅎㅎ 


먼저 plotly라는 라이브러리를 불러오고요. 없으면 install.packages(plotly)하면 되겠죠. 


library(plotly)

box_plots <- plot_ly(y=ozone$Yonkers, type="box") %>% add_trace(y=ozone$Stamford)

box_plots


간단하죠? 이러면 아래처럼 그림이 plot이 그려집니다. 


따로따로 그릴수도 있는데요. 데이터포인트와 거기에 따른 박스플랏도 그릴 수 있어요. 


ozone_Yonkers <- plot_ly(y=ozone$Yonkers, type = "box", boxpoints="all", jitter = 0.3)

ozone_Stamford <- plot_ly(y=ozone$Stamford, type = "box", boxpoints="all", jitter = 0.3)

ozone_Yonkers

ozone_Stamford


역시나 코드는 간단합니다. 첫번째 데이터는 Yonkers고요 그 다음은 Stamford 도시에 대한 boxplot이예요. 


두 데이터의 median, mean 값이 다른데 값을 log로 변환해주면 서로 어떻게 다른지 비교가 더 눈에 확 보이겠죠. 이건 다른 내용이라서 box plot에 대한 내용은 여기서 마치겠습니다. 


반응형

먼저 $R^2$와 adjusted $R^2$ 에 대해 간단히 설명해보겠습니다. 


상황파악을 위해서 아래 이미지를 가져왔는데요. 출처의 내용과는 다르게 일단 상황을 이렇게 생각해봐요. 


점들이 관측치, 그러니까 temperatrue와 Revenue에 관한 데이터고요. Revenue(수익)라는 response variable 그러니까 관측치가 있고요. explanatory variable은 온도라고 둡시다. 온도가 올라갈수록 revenue 도 올라가는군요. 


이미지 출처: http://docs.statwing.com/interpreting-residual-plots-to-improve-your-regression/ 




이 데이터를 잘 설명할 수 있는 모델, 즉 linear line, 또는 regression equation을 만들었습니다. 그렇다면 이 모델이 얼마나 데이터를 잘 설명할 수 있는지 알아봐야할텐데요그게 $R^2$ 값 입니다. 즉 한마디로 $R^2$는 explanatory variable (변수)와 response variable 의 linear relationship을 나타내는 값이라고도 할 수 있어요.  


$R^2$ = 1 - SSE/SSTO 인데요. 이때 SSTO = SSE + SSR 입니다. revenue값을 예측하기 위해 다른 변수들을 더 넣어보려고 합니다. 온도도 알아보고, 습도도 알아보고 변수들을 계속 추가한다고 했을때 SSR의 값은 증가할까요? 아니면 감소할까요? 대답이 힘들면 SSTO, SSE, SSR에 대해 리뷰하는게 필요하겠네요. 


SSR값은 증가합니다. 간략히 설명하면 SSTO는 고정된 값이라서 변수(explanatory variable)이 추가할수록 SSE는 줄어들게되고 SSR은 증가하게 됩니다. 


그렇다면 adjusted $R^2$에 대해 살펴보죠. 왜 adjusted가 나왔냐면!! 당연히 변수가 많아질수록 모델이 데이터값을 잘 설명하게 되어요. 하지만 우리는 변수 많은 모델을 원하는게 아니예요. 왜냐하면 나중에 데이터를 수집할때 그 많은 변수의 데이터를 취득하는것도 어렵고 비용문제도 그렇고요. 그래서 간단 (즉, 변수가 많지 않으면서도) 하면서도 데이터를 잘 설명할 수 있는 모델이 필요한거죠. 변수가 많아지만 이 모델이 데이터를 잘 설명하겠지만 우리가 원하는 방향은 아니기에 penalize를 한다고 해요. penalize가 벌칙을 과하다란 영어뜻인데요. adjusted $R^2$은 다음과 같아요. 


$R^2_{adj} = 1 - \left [ \frac{ (1-R^2)(n-1)}{n-k-1} \right ]$ 


이때 n은 총 데이터의 갯수고요. k는 변수의 갯수입니다. 

저 위의 식을 뚫어져라 쳐다보면서 n이 늘어난다고 생각해봐요. 그 말은 데이터 포인트가 늘어나게 되는겁니다. 데이터가 많으면 많을수록 [ ] 안에 수는 점점 0 으로 다가가겠죠. 그래서 adj $R^2$ 값은 1로 가까워 지겠네요. 


n의 갯수와 k의 갯수가 고정되어있다고 생각해보면, adjusted $R^2$ 값은 항상 $R^2$값과 같거나 작은 수를 갖게 됩니다. 

반응형

    Chapter 4 Combining Tables Vertically Using PROC SQL

    데이터 테이블을 아래 그림처럼 수직으로 합칠때에 관한 내용입니다. PROC SQL을 이용해서 수직으로 데이터를 합칠때, 연산자를 사용해서 어떤 방법으로 합칠지 select 과 select 사이에 정해줘야하는데요. 이때 4개의 연산자로는 EXCEPT, INTERSECT, UNION, OUTER UNION이렇게 있습니다. 




    아래 그림을 보면 어떤 내용인지 딱 감이 옵니다. 


    Except는 ~ 제외하고 라는 뜻을 가지고 있죠. 테이블 1의 행 중에서 테이블 2에서 나오는걸 제외한 행만 보여줍니다.

    Intersect는 교집합이란 뜻을 가지고 있는데, 테이블 1과 2에서 동시에 나오는것만 보여주고요. 

    Union은 합집합이란 뜻을 가지고 있어서 테이블 1과 2에 나오는 모든 행을 나오게 하고요. 이때 특정 열(column)이 데이터 테이블 1, 2에 모두 나올때 말합니다. 

    Outer Union은 합집합인데 서로 겹치는 열이 없을때 사용하는거죠. 



그럼 하나하나 살펴보도록 하죠. 

EXCEPT Operator 

Except 연산자는 첫번째 데이터 테이블에서는 Unique한 행만 선택되고, 그리고 두번째 테이블에서 있지 않은 행만 보여지게 됩니다. 그리고 합치려는 데이터에서 X라는 열이 중복으로 나타나야겠죠. 위에 그림보면 더 이해가 빠르겠죠? 


아래 예제보면 X라는 변수가 공통적으로 나타나죠. ne이라는 데이터테이블에 1과 a 라는 변수값이 중복되어 나타납니다. 그래서 박스 안에 결과값보면 중복되는 값 중 하나는 삭제되어 나타나게 됩니다. 


그래서 결과값으로 나올때의 과정을 살펴보면 첫번째 데이터 테이블에서 중복된 값이 있는지 확인하고요. 그런 다음에 두번째 데이터 테이블의 값과 매칭되는게 있는지 살펴보게 됩니다. 그래서 매칭이되면 지워지게 되는거죠. 



except 함수에 all 을 넣으면 One 데이터 테이블에 중복 행들이 제거되지 않고 다 같이 보여지게 됩니다. 


반면 except 함수에 corr (corresponding) 을 넣으면 one과 two라는 데이터테이블에서 서로 같은 이름을 가진 변수 중 두번째 데이터 테이블에서 보여지지 않은 값만 나오게 됩니다. 



물론 all 과 corr 다 같이 사용할 수도 있습니다. 데이터 테이블 중 공통적으로 나오는 변수에서, 두번쨰 데이터 테이블에서 나타나지 않는 것만 보여지게 됩니다. 중복된 값이 제거되지 않은채로요. 


UNION Operator 

Union operator같은 경우 종복된 값은 제거되고요. 두개의 데이터 테이블이 수직적으로 합치게 되는데, 결과값은 첫번째 불러오는 데이터를 기준으로 변수이름 값을 가지게 되죠. 결과값 보면 B라는 변수이름이 아니라 A라고 되어있죠. 



아래 이미지는 union all, union corr, union all corr 이라고 선택했을때의 결과값입니다.  쉬운내용이니 설명은 생략할게요. 



OUTER UNION Operator 

Outer Union에 대한 예제이고요. 아래 이미지 보면 금방 이해가니 이것도 설명 생략합니다.


#SAS advanced programming, SAS proc sql, 자격증, prep guide

반응형

Chapter 3. Combining Tables Horizontally Using PROC SQL - (3) - USING OUTER JOINS

Outer Joins에 대해 정리해보겠습니다. outer join은 inner join에다가 서로 매치되지 않은 행까지 추가된거라고 생각하면 되어요. 이때 서로 매치되지않은 행을 어느 기준으로 두느냐에 따라 Left & Right & Full 세 종류가 있고요, syntax는 다음과 같습니다. 



1. Using a Left Outer join 

위에 밴다이어그램 확인해보면 이해가 더 빠를텐데요. 두개의 데이터 테이블이 있어서 이걸 합치려고 하는데, 왼쪽 테이블을 기준으로 만들고, 두 테이블의 공통적인 값을 보여주려고 합니다. 


One과 Two라는 두개의 테이블을 Left Outer 방법으로 합치려고 합니다. 왼쪽이 기준이고요~ 행(row) 중에서 공통적으로 나오는 값을 보려고 합니다. 코드는 아래와 같고요. select * 라고 되어있어서 One, Two라는 열 이름이 다 보여지게 됩니다. 

 그래서 결과값의 왼쪽 두 열이 One에서 온 데이터테이블이고요. 오른쪽 두 열이 Two에서 온 데이터테이블입니다.  



결과 아웃풋 보면 X라는 열이 중복되어 나오는데요. One 데이터테이블의 X라는 열을 기준을 세우고 싶으면, select one.X, a, b 라고 따로 정해주면 됩니다. 


2. Using a Right Outer join 

두개의 데이터 테이블이 있어서 이걸 합치려고 하는데요, 서로 매칭되지 않은 행은 오른쪽 테이들에서 오게 됩니다. 이것 역시 바로 예제보면 이해 되실꺼예요. One과 Two라는 데이터가 있고요. 이때 Two의 데이터 테이블에서의 X 변수값이 3, 5가 One이라는 데이터 테이블과 매칭되지 않죠. 오른쪽 데이터 테이블에서 매칭되지 않은 파일을 가져와야하니까 결과값은 아래와 같습니다. 


3. Using a Full Outer join 

One이라는 데이터 테이블과 Two라는 데이터 테이블의 모든 행을 합칠때 쓰는 방법입니다. full join 이라고 명령어를 쓰면 되고요. 지금 X변수의 2 값이 겹치게 되고 나머지 들은 겹치지 않네요? 변수 X가  One이라는 데이터 테이블에도, Two라는 데이터 테이블에도 있어서 두번 나오게 됩니다. 


4. Comparing SQL Joins and DATA Step Match-Merges  

Proc SQL 방법을 써서 데이터를 합치는 방법이 있고요, 아니면 DATA STEP MERGE방법을 이용해서 데이터를 합칠 수도 있습니다. 지금 아래 두개의 테이블, One, Two가 있다고 해요. 보면 X라는 변수의 변수값이 모두 같네요. 이때 두 테이블을 X변수 기준으로 합쳐봅시다. 그럼 코드는 아래와 같아요. 


두 방법의 차이점은 많지만, 일단 Data Step Match-Merge방법은 run으로 끝내고 proc print방법을 이용해서 데이터를 불러와야합니다. Proc sql은 run으로 끝낼 필요가 없어요.





만약 합치려는 데이터의 X라는 변수의 변수값들이 다르다면 어떻게 될까요? 아래 Three라는 데이터 테이블과 Four라는 데이터 테이블의 X라는 변수의 변수값이 모두 일치하진 않네요. 이때 Data Step방법과 Proc SQL방법을 이용해서 데이터를 합쳤을때 결과값은 다음과 같아요. 


Proc SQL은 Full outer join 방법을 이용하는데요. 문제는 X라는 변수로 데이터를 합칠때 missing data 즉 결측값때문에 원하는 아웃풋이 안나올수도 있다는겁니다. 아래 그림의 data step과 proc sql의 아웃풋을 비교하면 어떤건지 아시겠죠. 



왜냐하면 coalesce 함수를 이용하지 않았기 때문입니다. 이 함수는 inner join에도 사용할 수 있습니다. 


SELECT COALESCE (테이블이름.변수이름, 테이블이름,변수이름) 

as 변수이름, 변수이름, 변수이름 


이렇게 적으면 됩니다. 



# sas 자격증, sas advanced programming, sas proc sql, prep guide 설명

반응형

+ Recent posts