ch0nny_log

[빅데이터분석] R _ 46. R 자료구조 팩터 /데이터를 로드 방법 본문

빅데이터 분석(with 아이티윌)/R

[빅데이터분석] R _ 46. R 자료구조 팩터 /데이터를 로드 방법

chonny 2024. 7. 8. 17:13

* R의 자료구조의 종류 

 팩터(factor) 란?

1.  범주 변수나 순위 변수를 나타내는 특별한 종류의 벡터입니다.

머신러닝을 할 때, 기계에게 학습 데이터를 제공할 때는 반드시 팩터 형태로 제공해야 합니다.
이는 기계가 학습할 때 범주 형태의 데이터를 기대하기 때문입니다.

2. 일반 벡터(vector)에 범주의 수준(level) 정보가 추가된 형태입니다.

기계를 학습시킬 때는 데이터와 그에 대응하는 정답을 함께 제공하여 학습시켜야 합니다.
예를 들어, 암환자 데이터를 사용하여 암 판정을 기계에게 학습시키고자 할 때,
우리는 암을 1로, 정상환자를 0으로 지정한 종속 변수(타깃 변수)를 팩터 형태로 제공해야 합니다.

 

 

 

문법 1. R을 활용한 머신러닝 책 p83~84

a <- c("middle", "low", "high")
a
typeof(a)   # 문자형 벡터 입니다.  
str(a)

a2 <- factor(a)  # a 벡터를 팩터로 변환합니다.
a2​


※ 문자형 벡터를 팩터로 변환하게 되면 기본 순서는 알파벳 순서로 부여됨

a3 <- factor(a, order =TRUE , level = c('low','middle','high'))
a3


설명: 기계에게 데이터를 줄 때는 정답 데이터를 반드시 팩터로 제공해 줘야 정답 데이터에 대한 순서를 기계가 이해할 수 있습니다. 안 그러며 기계학습이 안됨.

문제 1. 아래의 벡터를 팩터로 생성하는데 순서를 부여해서 생성하시오.
b <- c('large',',mideium','small')
b
b2 <- factor(b, order =TRUE , level = c('small',',mideium','large'))
b2​

 

 

팩터 데이터 유형을 사용하는 이유?

1. 기계에게 정답을 줄 때는 반드시 순서를 부여한 벡터를 제공해야 하기 때문
2. 현재 데이터에는 없는데 전체 데이터의 종류를 알려주기 위해

예: 학습데이터에는 a, ab, o 형 밖에 없는데 실제로는 a, b, o, ab 형이 있다는 것을 학습시켜야 됨

blood <-  factor( c("O", "AB", "A"), levels=c("A", "B", "AB","O"))
blood   

table(blood)
문제 2. 위 혈액형에 RH +와 RH- 도 추가해서 팩터 변수를 완성하시오.
blood <-  factor( c("O", "AB", "A"), levels=c("A", "B", "AB","O", " RH+"," RH-"))
blood   

table(blood)​


R에서 데이터를 로드하는 4가지 방법

목차
1. csv 파일을 R로 불러오는 방법 
2. xlsx 파일을 R 로 불러오는 방법 
3. txt 파일을 R 로 불러오는 방법
4. 오라클 database와 연동해서 테이블을 R로 불러오는 방법 (현업에서 필수 사용 기술)

 

 1. csv 파일을 R로 불러오는 방법

예: 건강보험 심사 평가원에 database에는 환자들의 폐사진 데이터가 숫자로 변환되어서 테이블에 들어있음. 질 폐사진을 기계학습 활용 홈페이지에 올리면 어느 질병인지 알려줌

유방암 데이터 설명 : 위스콘신 유방암 진단 데이터셋이며 이 데이터는 569개의 암조직 검사예시가 들어있으며, 각 예시는 32개의 특징을 갖는다. 그 특징은 디지털 이미지에 존재하는 세포핵의 특성을 나타냅니다.

wisc_bc_data.csv
0.12MB





 독립변수                                           종속변수
1. 반지름                                           diagnosis :  양성(B), 악성(M)
2. 질감
3. 둘레
4. 넓이
5. 매끄러움
6. 조밀성
7. 오목함
8. 오목점
9. 대칭성
10. 프랙털 차원

setwd('c:\\data')
wisc <- read.csv('c:\\data\\wisc_bc_data.csv',header =T, stringsAsFactors = TRUE) 
head(wisc)
str(wisc)

설명: csv 파일 불러올 때 stringsAsFactors = TRUE를 쓰게 되면 데이터 프레임에서 문자열이 자동으로 팩터로 변환하게 됨.​

table(wisc$diagnosis)
a<- table(wisc$diagnosis)
prop.table(a) #비율 확인​

설명: 제일 좋은건 50%, 50% 씩 있는게 제일 좋은데 지금 보면 60%, 40% 로 구성되어있습니다. 이는 악성종양보다 양성 종양이 더 데이터 많으므로 양성 종양을 기계가 더 잘 공부하게 되는 상황이 됩니다. 

2. xlsx 파일을 R로 불러오는 방법

 install.packages("xlsx")
 library(xlsx)

 dept <- read.xlsx("c:\\data\\dept.xls",  1 )  
                                                     ↑
                                                  sheet 번호

 


3. txt 파일을 R 로 불러오는 방법

# 스티브 잡스 연설문을 R 로 로드 하시오 !

jobs <-  readLines("c:\\data\\jobs.txt")
jobs

4. 오라클 database와 연동해서 테이블을 R로 불러오는 방법

1. 먼저 오라클 db에 c##scott으로 접속이 되는지 확인 (명령프롬프트창에)

 

2. JDBC 드라이버를 사용하는 패키지 설치

install.packages('DBI')
install.packages('RJDBC')

library(DBI)
library(RJDBC)

3. 오라클과 R을 연동하려면 JDBC 드라이버를 다운로드하아야 됨

 1) 현재 내가 쓰고 있는 오라클의 버전을 확인하고 그 버전에 맞는 JDBC드라이버를 다운로드합니다,

  2) 21c 면 ojdbc8.jar을 다운로드하아야 됩니다.

https://www.oracle.com/database/technologies/appdev/jdbc-downloads.html

 

JDBC and UCP Downloads page

Oracle JDBC Driver Implements JDBC 4.2 spec and certified with JDK8, JDK11, JDK17, and JDK19 Oracle JDBC driver except classes for NLS support in Oracle Object and Collection types. (4,535,064 bytes) - (SHA1: f1789a271868d5d04d148db47161905dff2a25ea)

www.oracle.com

 

c 드라이브 data 파일에 다운받기

4. 오라클에 접속하기 위한 3가지 정보를 확인함.

   1) ip 주소  (건물 주소)   

   2) 포트번호 (그 건물의 층수)

   3) 서비스 이름 (회사이름)

lsnrctl status

 

5. 확인 후  명령 프롬프트 창에서 접속

sqlplus c##scott/tiger@127.0.0.1:1521/xe

 

6. R에서 오라클과 연동하기

Sys.setenv(JAVA_HOME='C:\\Program Files\\Java\\jre-1.8')

library(rJava)
library(DBI)
library(RJDBC)
library(DBI)
library(RJDBC)

driver <- JDBC('oracle.jdbc.driver.OracleDriver','c:\\data\\ojdbc8.jar')

oracle_db <- dbConnect(driver,'jdbc:oracle:thin:@127.0.0.1:1521/xe', 'c##scott','tiger')

emp_query <- 'select * from emp'

emp_data <- dbGetQuery(oracle_db, emp_query)

emp_data

문제 144. 아래의 SQL쿼리의 결과를 R에서 출력하시오!
 select e.ename, d.loc from emp e, dept d where e.deptno = d.deptno;​
답: 
library(rJava)
library(DBI)
library(RJDBC)

driver <- JDBC('oracle.jdbc.driver.OracleDriver', 'c:\\data\\ojdbc8.jar')

oracle_db <- dbConnect( driver, 'jdbc:oracle:thin:@127.0.0.1:1521/xe', 'c##scott','tiger')

emp_query <- 'select * from  emp'

emp_data <- dbGetQuery( oracle_db, emp_query)
emp_data​
문제 145. R의 데이터 프레임을 오라클의 테이블로 생성하시오.
library(rJava)
library(DBI)
library(RJDBC)

driver <- JDBC('oracle.jdbc.driver.OracleDriver', 'c:\\data\\ojdbc8.jar')

oracle_db <- dbConnect( driver, 'jdbc:oracle:thin:@127.0.0.1:1521/xe', 'c##scott','tiger')

wisc <- read.csv('c:\\data\\wisc_bc_data.csv')

dbWriteTable(oracle_db,name='wisc_table', value=wisc,row.names=FALUSE, overwrite =TRUE)​