Vector와 미묘하게 용도가 다르다 싶어서 한번 정리를 해야겠다고 마음먹던 차에..
Factor 자료형에 관해서 발표할 일이 있어서 주말간 정리해본 자료를 공유합니다.

Factor는 linear modeling을 위해 특별히 고안된 자료형인데, Levels 덕분에 분석작업시에
명목변수별로 데이터를 볼 수 있다는 장점이 있습니다. 아래의 자료를 참고해주세요 :D



[다운로드]


Factor.pdf


*대단한 자료는 아니지만, 가져가실 때 출처 밝혀주시는 센스! 부탁드립니다.




[코드]


factor(c("no", "yes") )


factor(c("yes", "no", "yes"), levels = c("yes", "no"))


factor(c("yes", "no", "yes"), levels = c("yes", "no") , ordered = T)


x <- factor(c("yes", "no", "yes", "yeah"), levels = c("yes", "no", "yeah"), ordered = T , nmax = 2)

x


?factor


x <- factor(c("yes", "no", "yes", "yeah"), levels = c("yes", "no", "yeah") , ordered = T, exclude =  "yeah")

x


levels(x)[1:2] <- "yes"

levels(x)



addNA(x, ifany = FALSE)


?addNA


d <- c(rep(1,5), rep(2,6), rep(3,8), rep(4,6))

d









hsb2 <- read.csv("https://stats.idre.ucla.edu/stat/data/hsb2.csv")


## race 컬럼에 factor 미적용시

summary(lm(write ~ race, data = hsb2))


# 팩터 변수 생성 후 race 컬럼에 적용한 결과

hsb2$race.f <- factor(hsb2$race)

is.factor(hsb2$race.f)

hsb2$race.f[1:15]

summary(lm(write ~ race.f, data = hsb2))


## 팩터변수를 외부에서 생성하기 싫은 경우 내부에 사용도 가능

hsb2 <- read.csv("https://stats.idre.ucla.edu/stat/data/hsb2.csv")

summary(lm(write ~ factor(race), data = hsb2))



## 확인시켜주는 함수, is. 시리즈

is.factor(x)

is.ordered(x) 


## 아예 변환시켜주는, as. 시리즈

as.factor(x)

as.ordered(x)


## levels만 뽑아보고 싶어 levels(), levels 가 몇개야? nlevels()

levels(x)

nlevels(x)


## 이 팩터변수 정보좀 가져와~ table(), 팩터형 좀 해제 시켜봐, unclass()

table(x)

unclass(x)



 

[참고 서적]


1. R을 활용한 머신러닝 - 브레트 란츠

2. R Programming - Coursera (2017년 강의)


반응형
Posted by JoeSung
,


[결과물]


1


2




[코드]



## 1 igraph 패키지 사용

install.packages("igraph")

library(igraph)


emp <- read.csv("emp.csv")

a <- merge(emp, emp, by.x="mgr", by.y="empno")[ , c("ename.x", "ename.y")]

a

b <- graph.data.frame(a, directed = T)

plot(b)



## 2 - googleVis 패키지 사용


install.packages("googleVis")
library(googleVis)


a <- merge(emp,emp, by.x="empno",by.y="mgr", all.y=T)


org <- gvisOrgChart(a, idvar="ename.y",parentvar="ename.x",
     options=list(width=600, height=250, size='middle',allowCollapse=T))


plot(org)


반응형
Posted by JoeSung
,

R을 잘 활용하기 위한 방법이라고 한다면.
R을 사용한다는 건 데이터를 분석을 한다는 것과 동일한 의미를 가진다. 데이터 분석을 위해서는 툴에 대한 이해도 필요하고 동시에 데이터의 언어인 통계에 대한 이해가 필수다. 통계는 자신의 가설이 일반화가 가능한지 평가를 할 수 있는 도구이다.

R은 상당한 러닝커브를 가진 언어 중에 하나이다. 따라서 잘 쓰기 위해서는 어느 정도의 시간 투자가 반드시 필요하다. 다행히 최근 많은 국내 서적이 출시되어 많은 이들이 언어를 배우기가 예전보다는 쉬워졌는데 환영할 만한 상황임에는 분명하다.

기본서적을 통해 어느 정도 문법을 익힌 이후에는 직접 데이터 분석 주제를 잡아서 분석업무를 R을 기반으로 해보길 권유한다. 그래프도 직접 그려보고 데이터 전처리도 직접해보면 왜 R이 데이터 분석 언어인지 피부로 느끼게 된다.

이 과정에서 SAS나 SPSS, 그리고 엑셀로 쓰면 되지 왜 고생을 하지라는 고민을 한다. 이 고비만 넘긴다면 엑셀보다 편해지는 시점이 오고 초보에서 중반 정도 넘어가는 수준으로 도약하게 된다.

이후엔 다른 사람들의 분석 코드라든지 패키지 코드를 보면서 최적화된 코드를 많이 보는 게 큰 도움이 되며 이 과정을 거치게 되면 R이 어떤 방식으로 동작하게 되는지 알게 된다.

실제 다른 언어에서 데이터 분석은 전처리와 시각화 하는 패턴이 있다. 그 패턴을 매번 가져가기 위해 포문이나 언어로 구현해서 전처리를 하다보면 이게 분석 작업인지 코딩 작업인지 분간이 안 될 때가 있다. 반면 R은 그 패턴을 정형화해서 프레임워크나 평션을 활용할 수 있게 특정 패키지와 함수로 전처리를 쓸 수 있다. 즉 R은 수십 라인 코드로 만든 일반적인 프로그래밍 부분을 한 라인의 코드로 만들 수 있는 만큼 편리함은 물론이고 정확하게 동작할 수 있게 해주는 등 효율적이라고 할 수 있다.

이 때쯤이라면 R로 모든 것을 하려고 하는 중독 현상이 일어난다. 한 외국 사람이 흡사 담배를 배우는 과정과 닮아 있다고 표현하는 것에 매우 공감했다. 담배를 처음 접할 때는 기침도 나고 목도 아프지만 어느 정도 익숙해지면 중독되는 것과 같이 R 역시 초반에 다른 언어에 비해서 배워야하는 부분이 많고 높지만 어느 정도 익숙해지면 모든 작업을 R을 기반으로 하는 중독이 일어난다. 이후 R로 모든 것을 하려고 한다. 그러나 모든 영역에 R을 적용할 수 없다. R의 통계에 특화된 언어로 언어적인 성능은 다른 언어에 비해서 낮다. 만약 R로 모든 영역을 적용하려고 한다면 굉장히 느린 프로세싱 결과를 얻게 되는 것이다. 이는 중독에 대한 부작용이다.

이런 부작용을 벗어나기 위해 최적화 방법론을 찾게 된다. R을 C++과 결합한다든지 느린 부분은 빠른 패키지로 대체하는 식으로 진행하다 보면 빠른 프로세스로 복귀를 하게 되는 것이다. 이 정도면 데이터 분석가라고 불리기엔 충분할 것이다.

마지막으로 통계학에 대한 학사 정도의 지식이 필요하다. R의 매뉴얼 페이지나 심지어 함수의 파라미터 명까지도 통계학에서 따온 용어를 쓰고 있는 만큼 기본 개념을 이해하지 않고서는 R을 제대로 쓴다고 할 수 없을 것이다.



[출처]

[데이터사이언티스트를 찾아서] “개발자와 통계학자 영역 자유롭게 왕복해야”

전희원 SK 텔레콤 매니져

http://m.comworld.co.kr/news/articleView.html?idxno=47869

반응형
Posted by JoeSung
,

> barplot(x)

Error in plot.new() : figure margins too large


문제 :

margin 기본 설정이 너무 좁게 설정 되어 있음


해결 :

아래 코드로 마진을 다시 설정 후 결과 확인


par("mar")

par(mar=c(1,1,1,1))


혹은

윈도우창을 최대로 늘린 뒤 결과 다시 확인




## Stack Over flow 참조

https://stackoverflow.com/questions/23050928/error-in-plot-new-figure-margins-too-large-scatter-plot

반응형
Posted by JoeSung
,



원인

-R의 bit(32, 64)와 java의 bit가 다르기 때문에 rJava 오류가 발생합니다.


해결 :


1.

R의 bit를 확인합니다. 보통 R 콘솔(R studio가 아닌)을 실행했을 때 맨 첫 화면에 나타납니다.



[이런식으로, 맨 첫화면에 Platform 부분에 bit 버전이 뜹니다. 요 체크]


2.

JAVA 페이지에 접속해서 해당 Bit에 맞는 파일로 다시 다운받아 설치합니다.

이 때, '설치 경로'를 캡쳐해두거나 복사하여 적어둡니다.


https://www.java.com/en/download/manual.jsp

JAVA 다운로드는 이곳에서 가능



3.

r_studio 환경에서 아래와 같은 명령어를 수행합니다.

다만 JAVA HOME에 들어갈 경로에 아까 확인한 설치경로에 맞게 다시 작성해 줍니다.


Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre1.8.0_151')



4.

rJava 에러가 해결되는지 확인




##참고 

http://egloos.zum.com/greentec/v/4176464






반응형
Posted by JoeSung
,


---0. 소개 



 PL/SQL을 통해서 엔트로피를 구하는 프로시져입니다. 보통 의사결정나무(Decision Tree)를 구현할 때에 엔트로피를 구할일이 종종 생기는데 윈도우의 cmd 환경에서 정보획득량을 엔트로피 계산을 통해 구할 때 쓸 수 있는 패키지 입니다. 


 보통 R 언어의 통계패키지에서 회귀분석은 lm()으로 굉장히 간단하게 구할 수 있고 이러한 정보획득량을 구할 때 쓸 수있는 패키지 또한 많기 때문에 저처럼 피치못할(?) 사정으로 PL/SQL을 쓰시는 분들이나 연습하시는 분들이 참고용으로 보시면 좋을 것 같습니다.






---1. 테이블 생성 스크립트 및 패키지 명세 작성


--- 테이블 생성 스크립트


drop table  entropy_test2;


create  table  entropy_test2
( cust_name  varchar2(20),
  card_yn     varchar2(10),
  review_yn   varchar2(10),
  before_buy_yn  varchar2(10),
  buy_yn   varchar2(10) );


insert  into entropy_test2 values ('SCOTT','Y','Y','Y','Y');
insert  into entropy_test2 values ('SMITH','Y','Y','Y','Y');
insert  into entropy_test2 values ('ALLEN','N','N','Y','N');
insert  into entropy_test2 values ('JONES','Y','N','N','Y');
insert  into entropy_test2 values ('WARD','Y','Y','Y','Y');


commit;



--- 패키지 명세

create or replace package entropy

is

procedure aft_entropy ( p_table in varchar2,

  p_col_1 in varchar2 ) ;


end entropy;

/



패키지 안에 프로시져 한개만 넣을거면 도대체 왜 패키지화를 시키느냐.. 하면 할말은 없지만 언젠가 패키지에 프로시져를 가득 담을 날을 그리며 한번씩 실행해봅시다.






---2. 패키지 바디 작성


Create or replace package body entropy

is

procedure aft_entropy 

( p_table in varchar2,

  p_col_1 in varchar2 )

Is 


v_stmt varchar2(2000) ;

v_col  varchar2(20)   ;

cnt1 number(10, 7)  ;

buy number(10, 7)  ;

no_buy number(10, 7)  ;

temp number(10, 7) := 0 ;

v_all number(10, 7) := 0 ;

res number(10, 7) := 0;

v_change_name varchar2(100) ;


type refcursor is ref cursor ;

emp_cv  refcursor ;


cursor emp_cursor is

  select column_name

        from cols

where table_name = upper(p_table)

and column_name not in ('CUST_NAME', upper(p_col_1));



begin


for emp_record in emp_cursor loop


v_stmt := 'select ' || emp_record.column_name || ' , count(*) as cnt1,  

                  sum(decode(buy_yn, ''Y'', 1, 0)) as buy_cnt, 

                  sum(decode(buy_yn, ''Y'', 0 ,1)) as no_buy_cnt 

        from entropy_test2 

      group by ' || emp_record.column_name ;


open emp_cv for v_stmt ;

loop 

fetch emp_cv into v_col, cnt1, buy, no_buy ;

exit when emp_cv%notfound ;


  if v_col = 'Y' then 

             

              if buy != 0 then 

             

                temp := temp + ( (buy/-cnt1)*log(2,(buy/cnt1)) ) ; 

           end if; 

  

          if no_buy != 0 then 

                 temp := temp  + ( (no_buy/-cnt1)*log(2,(no_buy/cnt1)) ) ; 

  

            end if; 

  

            res := res + (cnt1/5) * temp;

temp := 0; 

  

          elsif v_col = 'N' then 

  

            if buy != 0 then 

                temp := temp + ( (-buy/cnt1)*log(2,(buy/cnt1)) ) ; 

            end if; 

  

            if no_buy != 0 then 

                temp := temp  + ( (-no_buy/cnt1)*log(2,(no_buy/cnt1)) ) ; 

            end if; 

  

            res := res + (cnt1/5) * temp;

temp := 0; 

  

            end if; 

end loop;


dbms_output.put_line ( emp_record.column_name || ' : ' || res );

res := 0;


end loop;

end aft_entropy;


end entropy;








---3. 실행



exec entropy.aft_entropy('ENTROPY_TEST2', 'BUY_YN');



exec : 패키지 혹은 프로시져 실행을 위한 명령어

entropy.aft_entropy : 패키지명.프로시져명 의 형태로 불러오게 됩니다.
('ENTROPY_TEST2', 'BUY_YN') : 내부에 ' '처리가 안되어있기 때문에 테이블명과 컬럼명을 넘기실 때 꼭 Single quotation으로 감싸주셔야 잘 실행이 됩니다.


구현된 코드로는 독립변수까지는 지정할 수 없고, 분석을 원하는 범주형 자료가 Y나 N으로 이뤄져있을 때만 쓸 수 있다는 한계가 있습니다.






---4. 결과



CARD_YN : 0

REVIEW_YN : 0.4

BEFORE_BUY_YN : 0.6490225










반응형
Posted by JoeSung
,

PL/SQL에서 테이블 생성시 ORA-01031 나올 때 해결방법


1.

sqlplus / as sysdba 

를 통해 관리자 모드 접속합니다.


2.

grant create table to '유져명';

유져명에 사용자 아이디를 넣고 테이블 생성 권한을 부여합니다.


3.

다시 관리자 모드를 빠져나와서 재접속후 시도 



반응형
Posted by JoeSung
,

lsnrctl status

반응형
Posted by JoeSung
,

Q. 이전에 수행했던 SQL 쿼리들의 히스토리를 어떻게 확인할까? (오라클 DB 기준)


A. Version_startscn을 통해서 확인할 수 있다.


1)  scn(system change number) 를 확인한다. 

          --db에서 발생하는 변경사항에 대한 번호

            Select current_scn from v$database; 

             

2) 시간도 확인

            Select systimestamp from dual; 

            --2017-09-28 15:10:16

            

3) 아래의 쿼리를 통해 where절에 확인하고 싶은 기준 시간을 넣어가며 확인

             select versions_startscn, versions_endscn, versions_operation, ename, sal, deptno

            from emp

              versions between scn minvalue and maxvalue

              where versions_startscn > 1379911;

반응형
Posted by JoeSung
,





## rvest를 통한 웹 스크래핑


install.packages("xml2")

library("xml2")

library("rvest")


url_tvcast = "http://tvcast.naver.com/jtbc.youth"

html_tvcast = read_html(url_tvcast, encoding = "UTF-8")


html_tvcast %>% html_nodes(".title a")

html_tvcast %>% html_nodes(".title a") %>% html_text()

tvcast_df = html_tvcast %>% html_nodes(".title a") %>% html_text() %>%

data.frame()


반응형
Posted by JoeSung
,