1) Oracle 정형 데이터 처리 

 

단계1 : 사용자 로그인과 테이블 생성
- sqlplus 명령문으로 접속 후 다음의 데이터 생성 

 

단계2 : 레코드 추가와 조회하기 

 

단계3 : transaction 처리 - commit; 

 

● Oracle 연동을 위한 R 패키지 설치

 

① 패키지 설치

install.packages("rJava")
install.packages("DBI")
install.packages("RJDBC")

- RJDBC 패키지 사용하기 위해서는 java를 설치해야 합니다(내부가 java로 되어 있음)

 

 

② 패키지 로딩

Sys.setenv(JAVA_HOME='C:/Program Files/Java/jre1.8.0_221') # java 위치 명시 
library(DBI)
library(rJava) 
library(RJDBC) # rJava에 의존적이다(rJava 먼저 로딩)

 

 

③ Oracle 연동 (주의 : 버전에 따라 다름)

 

- Oracle 11g Ex.  - driver

drv <- JDBC("oracle.jdbc.driver.OracleDriver",
            "C:/oraclexe/app/oracle/product/11.2.0/server/jdbc/lib/ojdbc6.jar")

oracle 사이트 또는 구글링을 통해서 찾으면 됩니다. 

 

 

- db 연동 (driver, url, id, pwd)

conn <- dbConnect(drv, "jdbc:oracle:thin:@//localhost:1521/xe", "scott", "tiger")

 

④ 모든 레코드 검색

query <- "select * from test_table"
dbGetQuery(conn, query)

 

 

⑤ 조건 검생 - 나이가 30살 이상인 레코드 조회

query <- "select * from test_table where age >= 30"
result <- dbGetQuery(conn, query)
result 

 

 

⑥ 정렬 조회 - 나이 컬럼을 기준으로 내림차순 정렬

query <- "select * from test_table order by age desc"
dbGetQuery(conn, query)

 

 

⑦ 레코드 삽입

query <- "insert into test_table values('kang', '123', '강감찬', 35)"
dbSendUpdate(conn,query)

query <- "select * from test_table"
dbGetQuery(conn, query)

 

 

레코드 수정 : 데이터 '강감찬'의 나이를 35 -> 40 으로 수정 

query <- "update test_table set age=40 where name='강감찬'"
dbSendUpdate(conn,query) # RJDBC


query <- "select * from test_table"
dbGetQuery(conn, query) # DBI 

'강감찬' - 문자열 안에 있기 때문에 작은 따옴표로 감싸야 합니다.

 

 

레코드 삭제 - 데이터 '홍길동' 레코드 삭제 

query <- "delete from test_table where name = '홍길동'"
dbSendUpdate(conn,query)

query <- "select * from test_table"
dbGetQuery(conn, query)

 

 

db 연결 종료 

dbDisconnect(conn) # DBI

 

 

 

ggplot2(기하학적 기법 시각화)

: 그래프를 만들 때 사용하는 패키지로 'layer' 구조로 되어 있습니다. 
(layer 구조 - 기본 + 옵션1 + 옵션2 ) 방식으로 쌓아올리는 형식입니다. 

- 기본(x,y축 설정) + 옵션1(그래프 유형선택 - 점, 선, 막대) +  옵션2 (색상, 표식 등등)

 

 

ggplot2  패키지 특징


- 기하학적 객체들(점,선,막대등)에 미적특성(색상, 모양,크기)을 맵핑하여 플로팅한다.
- 그래픽 생성 기능과 통계 변환을 포함할 수 있다.
- ggplot2의 기본함수 qplot()-aesthetics(크기,모양,색상)과 geoms(점,선등) 으로 구성

 

qplot() : 옵션을 상세하게 지정하지 않아도 basic plot 보다 예쁘게 시각화 하고 싶을 때 사용 

 


1) 패키지 설치와 실습 데이터 셋 가져오기

install.packages("ggplot2")
library(ggplot2)

 

mpg 데이터

더보기

mpg 데이터 셋 ggplot2에서 제공하는 데이터 셋으로, 1999년부터 2008년 사이의 가장 대중적인 모델 38개 자동차에 대한 연비 효율을 기록한 데이터 셋으로 전체 관측 234개와 11개의 변수로 구성되어 있다.

주요 변수: 

manufacturer(제조사)

model(모델)

displ(엔진 크기)

year(연식)
cyl(실린더 수)

trans(변속기)

drv(구동 방식 : 사륜(4), 전륜(f), 후륜(r))
cty(gallon당 도시 주행 마일 수)

hwy(gallon당 고속 도로 주행 마일 수)

 

mpg데이터를 활용하도록 하겠습니다. 

 

 

2) gplot()

gplot(x, y, data)함수 이용 플로팅

 

① 세로 막대 그래프 (default 값) 

qplot(data = mpg, x = hwy)

                           고속도로 연비에 대한 분포도 

 

 

fill 속성 : hwy 변수를 대상으로 drv(구동 방식 : 사륜(4), 전륜(f), 후륜(r) 변수에 채우기(누적 막대 그래프)

qplot(hwy, data=mpg, fill=drv) # fill 옵션 적용

fill : 막대 그래프 상에서 색상으로 구별하여 시각화 - 변수에 대한 특징이 가시적으로 확인 가능 

 

                            연비에 따른 구동방식의 분포도

 

분석 결과 :  4륜 - 연비가 좋지 못함, 전륜 - 연비가 좋음 , 후륜 - 개체가 많지 않음

 

 

③ binwidth 속성 : 막대 폭 지정 옵션

qplot(hwy, data = mpg, fill = drv, binwidth=2)

binwidth : 막대의 폭 크기 지정

 

 

④ facets 속성 : drv 변수 값으로 컬럼단위와 행단위로 패널 생성(분리)

 

- 열 단위로 패널 생성

qplot(hwy, data = mpg, fill = drv, facets = .~drv , binwidth=2)

 

 

- 행 단위로 패널 생성

qplot(hwy, data = mpg, fill = drv, facets = drv~. , binwidth=2)

 

 

⑤ - 1 두 개 변수 대상 qplot() 함수 적용

 

qplot( x축 , y축 , data) = 산점도 형태로 출력 

qplot(displ, hwy, data=mpg)

mpg 데이터 셋의 displ 과 hwy 변수 이용 (산점도)

 

⑤ - 2 두 개 변수 대상 qplot() 함수 적용

- displ, hwy 대상으로 drv 변수값으로 생상 적용 산점도 그래프 

qplot(displ, hwy, data=mpg, color = drv) 

 

⑤ - 3 두 개 변수 대상 qplot() 함수 적용

- displ 과 hwy 변수와 관계를 drv로 구분 

qplot(displ, hwy, data=mpg, color = drv, facets = .~drv) 

 

 

3) 미적 요소 맵핑(mapping)

: qplot() 함수 제공하는 색상, 크기, 모양 등의 미적 요소를 데이터에 연결하여 그래프에 적용

 

mtcars 

더보기

mtcars 데이터 셋
ggplot2 패키지에서 제공하는 데이터 셋으로, 자동차 모델에 관한 사양이 기록된 데이터 프레임이다. 전체 관측 32개와 11개의 변수로 구성되어 있다.

주요 변수: mpg(연비)

cyl(실린더 수)

displ(엔진 크기)

hp(마력)

wt(중량)
am(변속기:0=오토,1=수동)

gear(앞쪽 기어 수)

carb(카뷰레터 수)

qsec(1사분위의 거리(마일)까지 주행 시간) 

mtcars 을 활용하여 특징을 살펴보겠습니다. 

 

 

- wt(무게), mpg(연비) 그래프 그리기  

qplot(wt,mpg, data=mtcars)

 

- wt(무게), mpg(연비) 그래프 그리기  + color(색상)

qplot(wt,mpg, data=mtcars, color=factor(carb)) # 색상 적용

 

           색상 + carb(카뷰레터 수) 특징 시각화  

 

 

- wt(무게), mpg(연비) 그래프 그리기  + size(크기)

qplot(wt,mpg, data=mtcars, color=factor(carb), size=qsec) # 크기 적용

크기 + qsec(1사분위의 거리(마일)까지 주행 시간) 특징 시각화 

※ 거리는 일정한데 시간이 많이 걸리면 연비가 좋지 않음.

 

 

- wt(무게), mpg(연비) 그래프 그리기  + shape(모양)

qplot(wt,mpg, data=mtcars, color=factor(carb), size=qsec, shape=factor(cyl)) 

              모양 + cyl(실린더 수) 특징 시각화 

 

 

 

4) 기하학적 객체 적용

 

diamonds

더보기

diamonds 데이터 셋
ggplot2 패키지에서 제공하는 데이터 셋으로, 약 5만4천개의 다이아몬드에 관한 속성을 기록한 데이터 셋으로 53,940개의 관측치와 10개의 변수로 구성되어 있다. 

주요 변수

price : 다이아몬드 가격($326 ~ $18,823)
carat : 다이아몬드 무게(0.2 ~ 5.01)
cut : 컷의 품질(Fair, Good, Very Good, Premium, Ideal)
color : 색상(J : 가장 나쁨 ~ D : 가장 좋음)
clarity : 선명도(I1 : 가장 나쁨, SI1, SI2, VS1, VS2, VVS1, VVS2, IF : 가장 좋음)
x : 길이(0~10.74mm), y : 폭(0~58.9mm), z : 깊이(0~31.8mm),
depth : 깊이 비율 = z / mean(x, y)

diamonds 활용하여 특징을 살펴보겠습니다. 

 

 

 

 

 geom = "bar" (속성으로 막대그래프 그리기)
-  clarity 변수 대상 cut 변수로 채우기 

 

clarity 빈도수 막대 그래프 + fill=cut, geom = "bar" (색 채우기) 

qplot(clarity, data=diamonds, fill=cut, geom = "bar") # 레이아웃에 색 채우기  

 

 

 

clarity 빈도수 막대 그래프 + color=cut, geom = "bar" (테두리 적용)

qplot(clarity, data=diamonds, color=cut, geom = "bar")

 

 

②  geom = "point" (산점도)

 

cyl 변수의 요인으로 point 크기 적용

qplot(wt,mpg, data=mtcars, color=factor(carb), geom = "point")

 

 

cyl 변수의 요인으로 point 크기 적용, carb변수의 요인으로 포인트 색 적용

qplot(wt,mpg, data=mtcars, color=factor(carb), size=factor(cyl), geom = "point")

 

 

qesc 변수로 포인트 크기 적용, cyl 변수의 요인으로 point 적용 

qplot(wt,mpg,data=mtcars, size=qsec, color=factor(carb), shape=factor(cyl),geom = "point")

 

③  geom = "smooth" (분포도에 대한 평균치)

 

분포도 출력

qplot(wt,mpg,data=mtcars,geom = "smooth")

 

기하학의 2가지 사용(smooth + point) 

qplot(wt,mpg,data=mtcars,geom = c("point", "smooth")) 

 

cyl 변수의 요인으로 point, smooth 크기 적용

qplot(wt,mpg,data=mtcars,color=factor(cyl), geom = c("point", "smooth"))

 

④ geom = "line" (선으로 순차적인 분포도) 

 

qplot(wt,mpg,data=mtcars,geom = "line") 

 

기하학의 2가지 사용(point + line) 

qplot(wt,mpg,data=mtcars,color=factor(cyl), geom = c("point","line")) 

 

geom="freqpoly"

 

 

 

5) ggplot() 함수

 

단계 1(layer1) : 배경 설정하기
- x축은 displ, y축은 hwy로 지정해 배경 생성

ggplot(data=mpg, aes(x=displ, y=hwy)) #aesthetics(미학)

# aesthetics(미학)

 

단계 2(layer 2): 그래프 추가하기 
- 배경에 산점도 추가 

ggplot(data=mpg, aes(x=displ, y=hwy)) + geom_point()

                       x축 0~7 / y축 0~40 <default>

 

 

단계 3(layer 3) : 축범위 조정하는 설정 추가하기(축에 대한 가변적 설정)
- x축 범위값을 3~6으로 지정

ggplot(data=mpg, aes(x=displ, y=hwy)) + geom_point() + xlim(3,6) + ylim(10,30)

 

xlim() : x축의 범위 설정 
ylim() : y축의 범위 설정

 

● 미적 요소 맵핑 

aes(x, y, color)

p <- ggplot(diamonds, aes(carat,price,color=cut)) # (x= , y=) 생략 가능
p + geom_point()

 

① 기하학적 객체(geometric object:점/선/막대) 적용

p <- ggplot(mtcars, aes(mpg,wt,color=factor(cyl)))
p + geom_line()

기하학적 객체(geometric object:점/선/막대) 적용

p <- ggplot(mtcars, aes(mpg,wt,color=factor(cyl)))
p + geom_point()

 

미적 요소 맵핑과 기하학적 객체 적용 

 

stat_bin() : (aes():미적요소) + ('geom=')) : 기하적 요소 + 기능 동시 적용 

p <- ggplot(diamonds, aes(price))
p + stat_bin(aes(fill=cut), geom = 'bar')

 

 

미적 요소 맵핑과 기하학적 객체 적용 

p <- ggplot(diamonds, aes(price))
p + stat_bin(aes(fill=cut), geom = "area")

 

 

 ③ 미적 요소 맵핑과 기하학적 객체 적용 

p <- ggplot(diamonds, aes(price))
p + stat_bin(aes(color=cut, size = ..density..),geom = "point")

 

● 테마(Thema) 적용

p <- ggplot(diamonds, aes(carat,price, color=cut))
p <- p + geom_point() + ggtitle("다이아몬드 무게와 가격의 상관관계")
p

 

● ① 테마(Thema) 적용 + 추가 

p + theme(title=element_text(color = "blue", size =25))

 

● ②  테마(Thema) 적용 + 추가 

p + theme(
    title=element_text(color = "blue", size =25), # 축제목
    axis.title = element_text(size = 14,face = "bold"), # 축제목
    axis.title.x=element_text(color = "green"), # x축제목
    axis.title.y=element_text(color = "red")) # y축제목

 

● ③ 테마(Thema) 적용 + 추가 

p + theme(
    title=element_text(color = "blue", size =25), # 축제목
    axis.title = element_text(size = 14,face = "bold"), # 축제목
    axis.title.x=element_text(color = "green"), # x축제목
    axis.title.y=element_text(color = "red"), # y축제목
    axis.text=element_text(size = "14"), # 축이름(0~5) 
    axis.text.x=element_text(color="orange"), # x축이름(0~5) 
    axis.text.y=element_text(color="yellow"), # y축이름(0~5) 
    legend.title = element_text(size = 20, face = "bold", color = "red"), # 범례 세팅
    legend.position = "bottom", 
    legend.direction = "horizontal" # 수평형태로 재배치 
    )

 

 

 

6)  ggsave()

 

p <- ggplot(diamonds, aes(carat, price, color=cut))
p +  geom_point()

 

- 가장 최근 그래프 저장

ggsave(file="C:/workspaces/R/output/diamond_price.pdf")

ggsave(file="C:/workspaces/R/output/diamond_price.jpg", dpi = 72)

 

 

 

ggsave(file="C:/workspaces/R/output/diamond_price.png",plot = p, width = 10, height = 5)

 

 

7) 지도 공간 기법 시각화 

 

stamen Maps API 이용
- 지도 관련 패키지 설치 

library(ggplot2)
install.packages("ggmap")
library(ggmap)

 

● 위도와 경도 중심으로 지도 시각화 
 - 서울을 중심으로 지도 시각화 하기 

seoul <- c(left=126.77, bottom = 37.40, right = 127.17, top = 37.70)

map <- get_stamenmap(seoul, zoom = 12, maptype = 'terrain')
ggmap(map)

 

 

 

'빅데이터 > R' 카테고리의 다른 글

[R] 텍스트 마이닝 분석 - 개요, 토픽 분석 설치 및 환경설정  (0) 2020.07.09
[R] 정형 데이터 처리(DB 연결)  (0) 2020.07.08
[R] lattice 패키지  (0) 2020.07.06
[R] 코딩 변경  (0) 2020.07.06
[R] 이상치(극단치)  (0) 2020.07.06

Lattice

: 래티스 시스템은 직교형태의 그래픽(Trellis graphic)을 생성하는 코드를 포함하고 있습니다. 여기서 말하는 기능은 R의 기본그래픽 시스템와는 다른 독립적인 것입니다. 주어지는 데이터 셋을 하나의 특징만 보여주는 것이 아니라 조건을 걸어서 조건별 데이터를 추가적으로 살펴볼 수 있도록 제공합니다. 

 

 

Lattice Plotting System 특징


- 다차원 데이터를 사용할 경우, 한번에 여러개의 plot 생성 가능
- 높은 밀도의 plot를 효과적으로 그림
- 직교형태의 그래픽(Trellis graphic) 생성

 

 

R 고급 시각화 도구 

- 제공 패키지 - graphics / lattice / ggplot2 등...

 

1) 패키지 설치와 실습 데이터 셋 가져오기 

install.packages("lattice")
library(lattice)

 

 

Chem97 - mlmRev패키지 에 저장되어 있습니다. 

더보기

Chem97 데이터 셋에 관한 설명
mlmRev 패키지에서 제공되는 데이터 셋으로 1997 년 영국 2,280 개 학교 31,022 명 학생을 대상으로 A 레벨 대학시험 화학점수를 기록한 데이터 셋이다. 전체 31,022 개의 관측치와 8 개의 변수로 구성되어 있다.

주요 변수 

- mlmRev패키지에서제공
- 1997년영국2,280개학교31,022명을대상으로A레벨(대학시험) 화학점수
- lea : Local Education Authority(지방교육청:1~131)

- school : 학교 id(범위 : 1~2,280)

- student : 학생 id(범위 : 1~31,022)
- score  : A레벨 화학점수(범위 : 0,2,4,6,8,10)
- gender : 성별 (범위 : M, F)
- age : 18.5세기준월수(범위: -6~+5)

- gcsescore : GCSE 개인평균성적 (범위 : 0 ~ 8 사이 실수)
- GCSE : General Certificate of Secondary Education)는 고등학교 재학 중에 치루는 수학능력인증시험을 의미한다

Chem97 의 데이터를 활용하여 Lattice()의 히스토그램과 밀도 그래프를 보도록 하겠습니다. 

 

 

str(Chem97) 
출력값 :  data.frame':	31022 obs. of  8 variables:

table(Chem97$score)
-출력값-
  0    2    4    6    8   10 
3688 3627 4619 5739 6668 6681 

range(Chem97$gcsescore)
출력값 :  [1] 0 8 / 0~8 

range(Chem97$age) 
출력값 :  [1] -6  5 / -6(1월생)~5(12월생) , 0(7월생)

 

 

2) 히스토그램 

 

histogram(y축컬럼~ x축 컬럼|조건, data...) 

- graphics의 hist와 유사 

histogram(~gcsescore, data = Chem97)

   점수의 분포도 확인 -  gcsescore 변수를 대상으로 적용 히스토그램

 

 

 

graphics의 hist와의 차이점 + 추가기능  

score 변수를 조건으로 지정. 
histogram(~gcsescore|score, data = Chem97) # score 단위 

score 점수(주황색 표시)를 기준으로 수능점수를 격자형으로 분리해서 분포를 보여줍니다. 

 

 

factor 활용

- 가시적 효과 상승 

factor 활용
histogram(~gcsescore|factor(score), data = Chem97)

 factor : 범주 값을 반환 (score - 범주 출력 : 0 ~ 10)

요인(factor) 수준은 그래픽 출력에 영향을 미칩니다. 예를 들면, score를 x축에 대입할 경우 score가 출력 되지만, factor로 변환 된 score를 x축에 대입 하면, 요인 수준이 순서로 적용 됩니다. (0,2,4,6,8,10)

 

 

3) 밀도 그래프

 

densityplot(~축커럼|조건, data, groups = 변수)

 

- 선으로 그어서 값을 계산하는 형태(밀도)로 표현 (graphics의 line 과 유사)

- 분포도를 빠르게 이해하는데 많이 사용

- 성별 변수를 그룹으로 지정하여 GCSE 점수를 score 단위로 밀도그램프를 프롤팅

densityplot(~gcsescore|factor(score), data = Chem97, 
                                      groups = gender, 
                                      plot.points=F, 
                                      auto.key = T)

plot.points = F : 밀도 점 표시 여부, auto.key = T : 범례 표시 여부

 

성별을 기준으로 그룹핑을 통한 데이터의 분포도를 확인할 수 있습니다.

(성별로 GCSE 점수를 score 단위로 밀도 플로팅)

 

 

 

4) 막대 그래프

 

barchart(y축 컬럼~x축 컬럼|조건, data, layout)

(graphics의 barplot( ) 업그에드 버전으로 볼 수 있습니다)

 

VADeaths

더보기

VADeaths 데이터 셋에 관한 설명
R 에서 기본으로 제공되는 데이터 셋으로 1940 년 미국 버지니아주의 하위계층 사망비율을 기록한 데이터 셋이다. 전체 5 행 4 열의 numeric 자료형의 matrix 자료구조를 갖고 있다 . 

변수 구성

- Rural Male( 시골출신 남자 )

- Urban Male( 도시출신 남자 )
- Rural Female( 시골출신 여자 )

- Urban Female( 도시출신 여자 )

VADeaths 활용 하여 진행하도록 하겠습니다.

 

 

① 데이터 셋 구조보기 

데이터셋 구조보기

mode(VADeaths) 
출력값 : "numeric"

class(VADeaths)
출력값 : "matrix"

데이터 형식 변경 = matrix -> dataframe 변환

df <- as.data.frame(VADeaths)
str(df)
출력값 : 'data.frame':	5 obs. of  4 variables:

class(df)
출력값 : "data.frame"

 

② 데이터 형식 변경(matrix 형식을 table 형식으로 변경)

dfs <- as.data.frame.table(VADeaths)

str(dfs) 
출력값: 20 obs. of  3 variables:

class(dfs)
출력값: "data.frame"

dfs  
출력값 : Var1 Var2 Freq -> 1열 기준으로 data.table 생성

 

5행 4열의 데이터 셋 

                       ↓

20행 3열 데이터 셋 

as.data.frame.table( ) : metrix -> table 

 

넓은 형식(5행 4열) -> 긴 형식(20행 3열) 변환

= 행(나이)을 기준으로 열 항목을 반복하면서 빈도수를 출력 ( melt형식과 동일 ) 

 

 

※ 변형을 통해서 데이터셋의 의미를 분석, 특징을 직관적으로 파악하기 위함인데, 지금의 형태 변형을 통해서

   막대그래프로 사용하기 위함입니다. 

 

 

 

③ - 1 막대그래프 그리기 

barchart(Var1~Freq|Var2, data=dfs)

y축 나이, x축 빈도수 

 

 

 

③ - 2 막대그래프 그리기 

layout 활용

: 시각화의 효과를 조정할 수 있도록 합니다.

(4,1) = 4개를 1행에 출력

barchart(Var1~Freq|Var2, data=dfs, layout=c(4,1))

Var2변수 값을 기준으로 가로 막대차트 플로팅

 

Var2 변수 단위(그룹화:시골과 도시 출신의 남녀)로 x축 Freq(사망비율),  y축 - Var1(사망연령대)으로 막대차트 프롤팅layout=c(4,1) 속성은 4개의 패널을 1행에  나타내주는 역할을 제공합니다. 

 

 

③ - 3 막대그래프 그리기 

barchart(Var1~Freq|Var2, data=dfs, layout=c(4,1), origin = 0)

origin : x축의 구간을 0부터 표시해주는 역할

 

 

 

5) 점 그래프

 

dotplot(y축컬럼 ~ x축컬럼|조건, data, layout

 

① - 1점 그래프 그리기  

layout 속성 생략시 기본 : 2행 2열 구조의 패널

dotplot(Var1~Freq|Var2, dfs)

① - 2 점 그래프 그리기

layout = c(4,1) : 1행 4열 출력  

dotplot(Var1~Freq|Var2, dfs,layout = c(4,1)) 

 

① - 3 점 그래프 그리기

Var2 변수 단위로 그룹화하여 점을 연결하여 프로팅 (그룹화:시골과 도시 출신의 남녀)

dotplot(Var1 ~ Freq, data=dfs, groups=Var2, type="o",
                     auto.key=list(space="right", points=T, lines=T))

산점도 타입 : type="o" : 점(point) 타입으로 실선이 통과하는 유형으로 그래프의 타입 지정

범례 : auto.key = list (배치위치, 점 추가, 선 추가) : 범례를 나타내는 속성으로 위치를 그래프에서 나타내고, 점과 선을 추가. 

 

 

 

 

6) 산점도 그래프

xyplot(y축컬럼 ~ x축컬럼 | 조건변수,  data = data.frame or list, layout)

(graphics의 plot( )과 유사)

 

airquality

더보기

airquality 데이터 셋
airquality 데이터 셋은 R에서 기본으로 제공되는 데이터 셋으로 New York시의 대기에 대한 질을 측정한 데이터 셋이다. 전체 153개의 관측치와 6개의 변수로 구성되어 있다. (153일 데이터 - 단위(일))

주요 변수: 

Ozone(오존 수치)

Solar.R(태양열)

Wind(바람)

Temp(온도),
Month(측정 월: 5~9)

Day(측정 날짜: 1~31일)

airquality 데이터를 활용하여 설명하도록 하겠습니다. 

 

 

airquality 데이터 형태 

head(airquality) # Ozone Solar.R Wind Temp Month Day

- 출력값 - 
   Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6

 

 

① - 1 산점도 그래프 그리기 

xyplot(Ozone ~ Wind, data = airquality)

분석 결과 : 바람이 강해질수록 오존의 수치가 낮아진다. 

 

 

① - 2 산점도 그래프 그리기 

월별로 데이터의 분포도 확인하기 (layout=c(5, 1):5개의 패널을 1행으로 , factor(Month) : 범주값으로 출력)

xyplot(Ozone ~ Wind | factor(Month), data = airquality, layout=c(5, 1)) 

 

분석 결과 : 월별로 봤을 때, 바람이 강해질수록 오존의 수치가 낮아진다고 이야기 하기 어렵다. 

               더울수록 오존이 수치가 높은건 아닐까? 

 

 

②  airquality 데이터셋의 Month 타입 변경(factor)

convert <- transform(airquality, Month=factor(Month))

str(convert)  
출력값:  $ Month : Factor w/ 5 levels "5","6","7","8",..:

head(convert)

- 출력값 - 
   Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6

xyplot(Ozone ~ Wind | Month, data = convert, layout=c(5, 1))

 

transform : 컬럼 항목을 추가해주는 기능

 

 

quakes 

더보기

quakes 데이터 셋
R에서 제공하는 기본 데이터 셋으로, 1964년 이후 피지(태평양) 섬 근처에서 발생한 지진 사건에 관한 기록으로 전체 1,000개의 관측치와 5개의 변수로 구성되어 있다.


주요
변수 : lat(위도), long(경도), depth(수심 : km), mag(리히터 규모), stations(관
측소)

quakes를 활용하여 출력 결과를 보여드리겠습니다. 

 

 

quakes 데이터 형태 

head(quakes)
 lat   long depth mag stations depth2
1 -20.42 181.62   562 4.8       41      6
2 -20.62 181.03   650 4.2       15      6
3 -26.00 184.10    42 5.4       43      1
4 -17.97 181.66   626 4.1       19      6
5 -20.42 181.96   649 4.0       11      6
6 -19.68 184.31   195 4.0       12      2

str(quakes)  
'data.frame':	1000 obs. of  5 variables:

range(quakes$stations) 
10~132(관측소)

 

① 지진 발생 위치(위도와 경도) 그리기 

xyplot(lat~long, data=quakes, pch="o")

 

② 그래프 변수에 저장, 제목 추가

tplot <- xyplot(lat~long, data=quakes, pch=".")
tplot2 <- update(tplot, main="1964년 이후 태평양에서 발생한 지진위치")
tplot2

update( ) : 제목을 추가 

pch( ) :  점(point) 타입 속성 

③ 산점도 그래프 그리기

 

③ -1  depth 이산형 변수 범위 확인

range(quakes$depth) 
출력값 : 40 680 <= depth # depth 범위 

 

③ - 2  depth 변수 리코딩 : 6개의 범주(100단위)로 코딩 변경

quakes$depth2[quakes$depth >= 40 & quakes$depth <= 150] <- 1
quakes$depth2[quakes$depth >= 151 & quakes$depth <= 250] <- 2
quakes$depth2[quakes$depth >= 251 & quakes$depth <= 350] <- 3
quakes$depth2[quakes$depth >= 351 & quakes$depth <= 450] <- 4
quakes$depth2[quakes$depth >= 451 & quakes$depth <= 550] <- 5
quakes$depth2[quakes$depth >= 551 & quakes$depth <= 680] <- 6

 

 

③ - 3  리코딩 변수(depth2)를 조건으로 산점도 그래프 그리기

convert <- transform(quakes, depth2 = factor(depth2))
xyplot(lat~long | depth2, data=convert)

수심, 경도, 위도 세가지의 형태를 가지고 비교할 수 있습니다. 

 

 

 

7) 데이터 범주화

 

equal.count(변수, number=n, overlap=n)

: 변수값을 대상으로 지정한 영역 만큼 수량 카운터(균등)

 

① 1~150을 대상으로 겹쳐치지 않게 4개 영역으로 범주화

numgroup <- equal.count(1:150, number=4, overlap=0) 
numgroup  

 

 

② 지진의 깊이를 5개 영역으로 범주화, 산점도 그래프 그리기

depthgroup <- equal.count(quakes$depth, number=5, overlap=0)

xyplot(lat~long | depthgroup, data = quakes,
       main="Fiji Earthquakes(depthgroup)",
       ylab="위도", xlab="경도",pch="@", col="red")

 

③  수심과 리히터규모(강도) 변수를 동시에 적용하여 산점도 그래프 그리기 

magnitudegroup <- equal.count(quakes$mag, number=2, overlap=0)

xyplot(lat~long | magnitudegroup, data = quakes,
       main="Fiji Earthquakes(magnitude)",
       ylab = "latitude", xlab = "longitude",
       pch="@", col="blue")

④ 수심과 리히터 규모를 동시에 표현(2행 5열 패널 구조) 

- ( * ) 를 사용하여 연결

xyplot(lat~long | depthgroup*magnitudegroup, data=quakes,
       main="Fiji Earthquakes",
       ylab = "latitude", xlab = "longitude",
       pch="@", col=c("red", "blue"))

 

⑤ 이산형 변수로 리코딩한 뒤에 factor형으로 변환하여 산점도 그래프 그리기 

depth 변수 리코딩분 
 
quakes$depth3[quakes$depth >= 39.5 & quakes$depth <= 80.5] <- 'd1'
quakes$depth3[quakes$depth >= 79.5 & quakes$depth <= 186.5] <- 'd2'
quakes$depth3[quakes$depth >= 185.5 & quakes$depth <= 397.5] <- 'd3'
quakes$depth3[quakes$depth >= 396.5 & quakes$depth <= 562.5] <- 'd4'
quakes$depth3[quakes$depth >= 562.5 & quakes$depth <= 680.5] <- 'd5'

mag(지진의 강도) 변수 리코딩 
quakes$mag3[quakes$mag >= 3.95 & quakes$mag <= 4.65] <- 'm1'
quakes$mag3[quakes$mag >= 4.55 & quakes$mag <= 6.45] <- 'm2'
View(quakes)


convert <- transform(quakes, depth3=factor(depth3), mag3=factor(mag3))

xyplot(lat ~ long | depth3*mag3, data=convert,
       main="Fiji Earthquakes",
       ylab = "latitude", xlab = "longitude",
       pch="@", col=c("red", "blue"))

 

 

 

8) 3차원 산점도 그래프 

cloud - 3차원(z ~ y * x) 산점도 그래프 플로팅 = depth ~ lat * long : depth(z축), lat(y축) * long(x축) 

 

① 위도, 경도, 깊이를 이용하여 3차원 산점도 그래프 그리기 

cloud(depth ~ lat * long, data = quakes,
      zlim = rev(range(quakes$depth)),
      xlab = "경도", ylab = "위도", zlab = "깊이")

zlim=rev(range(quakes$depth)) : z축값 범위 지정

panel.aspect=0.75 : 테두리 사이즈 

screen=list(z=105,x=-70) : z, x축회전
xlab="Longitude“ : x축이름
ylab="Latitude“ : y축이름
zlab="Depth" : z축이름

② 테두리와 회전 속성을 추가하여 3차원 산점도 그래프 그리기 

cloud(depth ~ lat * long, data = quakes,
      zlim = rev(range(quakes$depth)),
      panel.aspect=0.9,
      screen=list(z=45, x=-25),
      xlab = "경도", ylab = "위도", zlab = "깊이")

panel.aspect : 테두리 사이즈

screen : 회전각 

 

'빅데이터 > R' 카테고리의 다른 글

[R] 정형 데이터 처리(DB 연결)  (0) 2020.07.08
[R] 기하학적 기법 시각화 - ggplot2 패키지  (0) 2020.07.07
[R] 코딩 변경  (0) 2020.07.06
[R] 이상치(극단치)  (0) 2020.07.06
[R] 결측치(NA) 처리  (0) 2020.07.06

위의 데이터를 토대로 설명하겠습니다.

 

 

1) 가독성을 위한 코딩 변경

 

① resident 컬럼을 대상으로 코딩 변경하기

table(dataset2$resident)

- 출력값 - 
 1   2   3   4   5   (거주지)
111  47  27  15  34  (빈도수)


# 거주의 값이 n일 때, n. ~시 저장
dataset2$resident2[dataset2$resident == 1] <- '1. 서울 특별시' 
dataset2$resident2[dataset2$resident == 2] <- '2. 인천 광역시'
dataset2$resident2[dataset2$resident == 3] <- '3. 대구 광역시'
dataset2$resident2[dataset2$resident == 4] <- '4. 광주 광역시'
dataset2$resident2[dataset2$resident == 5] <- '5. 부산 광역시'

 

② job 컬럼을 대상으로 코딩 변경하기 

dataset2$job2[dataset2$job == 1] <- '공무원'
dataset2$job2[dataset2$job == 2] <- '회사원'
dataset2$job2[dataset2$job == 3] <- '개인사업'

 

 

 

 

2) 척도 변경을 위한 코딩 변경

- 나이(age) 변수를 청년층, 중년층 , 장년층 으로 코딩 변경하기 

dataset2$age2[dataset2$age <= 30] <- "청년층"
dataset2$age2[dataset2$age > 30 & dataset2$age <=55] <- "중년층"
dataset2$age2[dataset2$age > 55] <- "장년층 "

 

 

 

 

3) 역코딩을 위한 코딩 변경 (survey) 활용.

- survey 에서 가장 만족한 것이 1 , 가장 불만족이 5이므로 평균을 내면 문제가 생기므로 변경해줍니다. 

survey <- dataset2$survey

rsurvey <- 6-survey # 역코딩 (5까지의 숫자이므로 6-n)

dataset2$survey2 <- rsurvey
mean(dataset2$survey2, na.rm = T) 
출력값 : 3.358566 

 

'빅데이터 > R' 카테고리의 다른 글

[R] 기하학적 기법 시각화 - ggplot2 패키지  (0) 2020.07.07
[R] lattice 패키지  (0) 2020.07.06
[R] 이상치(극단치)  (0) 2020.07.06
[R] 결측치(NA) 처리  (0) 2020.07.06
[R] 데이터 셋 보기  (0) 2020.07.06

 이상치(극단치)

이상치(Outlier)란 관측된 데이터의 범위에서 많이 벗어나 아주 작은 값이나 아주 큰 값을 말합니다.

 

- 이상치의 유무는 데이터 분석에서 중요하게 작용하기 때문에 데이터 전처리에서 이상치를 찾는 것은 중요한 작업 중      하나입니다.

 

- 보통 이상치는 제거하는 것이 일반적이지만 분석 목적에 따라 이상치만 따로 모아서 케이스 분석을 실시하는 경우도      있습니다.

 

- 이상치 찾는 방법은 일반적으로 데이터 분포도를 이용하지만 분석분야(특히, 공장 및 제조)에 따라 관리범위로 찾는

  경우도 많이 존재합니다.

 

 

* 밑의 데이터를 활용하여 설명하겠습니다.

 

1) 범주형 변수 극다치 처리 - 이산변수 (정수형 변수)

 

table(dataset$gender)

- 출력값 - 
0   1   2   5  (요인-범주) / 1,2 = 여자, 남자 / 0,5 = 이상치 결과
2  173 124  1  (빈도수)

dataset <-subset(dataset, gender==1 | gender==2) # 1,2 외의 값 필터링 

length(dataset$gender) 
출력값 :  [1] 297

pie(table(dataset$gender))

subset( ) : 조건에 맞는 데이터 선택 시, 유용

                               ↓

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2) 연속형 변수의 이상치 처리 

 

① 데이터 확인

1. dataset$price 

2. plot(dataset$price) # plot 차트 

summary(dataset$price)

- 출력값 -
   Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
-457.200    4.425    5.400    8.752    6.300  675.000       30 

1. dataset$price

 

2. plot

 

② price 변수의 데이터 정제와 시각화

dataset2 <- subset(dataset, price >=2 & price <= 8)

length(dataset2$price) 
출력값 : [1] 251 - 이상치 49개 

stem(dataset2$price) # 줄기와 잎 도표 보기 (n.n)

의미 : 2~8 사이의 값이 출력 (각 숫자별로 2개씩 / 2 - 2.1, 2.3 ,2.3) 

'빅데이터 > R' 카테고리의 다른 글

[R] lattice 패키지  (0) 2020.07.06
[R] 코딩 변경  (0) 2020.07.06
[R] 결측치(NA) 처리  (0) 2020.07.06
[R] 데이터 셋 보기  (0) 2020.07.06
[R] reshape2 패키지  (0) 2020.07.03

분석을 위한 데이터셋을 확보했다 하더라도 바로 분석을 할 수 없는 경우가 많습니다. 그 이유는 바로 결측값, 이상치, 오입력 등이 있습니다. 따라서 데이터 분석에 적합하도록 데이터셋을 정제해야 합니다.

바로 이것을 전처리(data preprocessing)라고 합니다. 

 

결측값(missing value)

결측값은 입력이 누락된 값을 의미합니다. 보통 NA로 출력됩니다. 결측값이 포함되면 산술 연산에 문제가 생깁니다. 대부분의 산술 연산 함수는 결측값을 제외할 수 있는 옵션을 제공합니다. 

 

 

밑의 데이터를 토대로 설명하겠습니다 .

 

 

1) 결측치 확인

summary(dataset$price)

- 출력값 -
   Min    1st Qu.    Median    Mean    3rd Qu.  Max.       NA's 
-457.200    4.425    5.400    8.752    6.300  675.000       30 

sum(dataset$price) 
# NA가 하나라도 담겨 있으면 결과값으로 [1] NA 를 반환한다. 

summary() : 다양한 결과 값 출력

 

 

2) 결측치 제거

 

① sum() 함수에서 제공되는 속성 이용

sum(dataset$price, na.rm = T) 
출력값 : [1] 2362.9

na.rm = T : NA값 제외

 

 

② 결측데이터 제거 함수 이용

price2 <- na.omit(dataset$price) 

sum(price2)
출력값 : [1] 2362.9

length(price2) 
출력값 : [1] 270

na.omit() : NA가 들어 있는 항복 삭제

-  NA 항목을 다 삭제 하기 때문에 NA가 담겨있는 같은 행의 다른 항목들의 데이터들도 삭제 될 수 있는 위험이 존재.
-  데이터가 적을수록 분석결과가 신뢰도가 예측도가 떨어짐. 

 

 

 

3) 결측치 대체 

- 결측치를 0으로 대체하기  

x <- dataset$price # price vector 생성

head(x)  
출력값 : [1] 5.1 4.2 4.7 3.5 5.0 5.4

dataset$price2 <- ifelse(is.na(x),0,x)
ifelse(!is.na(x),x,0)

sum(dataset$price3) 
출력값 : [1] 2625.4

 

dataset$price2 <- ifelse(isx.na(x),0,x) : true 일 때 0, false 일 때 x로 출력.  / $를 붙이고 컬럼 이름을 넣으면 추가 

 

NA -> 0 출력

 

 

4) 결측치를 평균으로 대체하기 

dataset$price3 <- ifelse(is.na(x),round(mean(x, na.rm = T),2),x) 

mean(dataset$price3)
출력값 : [1] 8.751333

sum(dataset$price3)  
출력값 : [1] 2625.4

is.na(x),round(mean(x,na.rm = T) , 2) ,x) : true 일 때 평균 : round(mean(x,na.rm = T) , 2) / false 일때 x로 출력. 

 

* $를 붙이고 컬럼 이름을 넣으면 추가 

 

- 넣어준 평균 안에 이상치가 존재할 수 있기 때문에 결과의 값의 오류가 생길 수 있습니다. 

 

'빅데이터 > R' 카테고리의 다른 글

[R] 코딩 변경  (0) 2020.07.06
[R] 이상치(극단치)  (0) 2020.07.06
[R] 데이터 셋 보기  (0) 2020.07.06
[R] reshape2 패키지  (0) 2020.07.03
[R] 파이프 연산자(pipe)  (0) 2020.07.03

위 데이터를 활용하여서 설명하도록 하겠습니다. 

 

 

 

1) 데이터 조회 

- 탐색적 데이터 분석을 위한 데이터 조회 

 

 

① 전체 데이터 보기

1. print(dataset) # 콘솔창 출력
2. View(dataset) # utils pakage, 뷰어창 출력

1. print()

 

2. View()

 

② 데이터의 앞부분과 뒷부분 보기 

head(dataset)

			- 출력값 -
      resident gender job age position price survey
1        1      1   1  26        2   5.1      1
2        2      1   2  54        5   4.2      2
3       NA      1   2  41        4   4.7      4
4        4      2  NA  45        4   3.5      2
5        5      1   3  62        5   5.0      1
6        3      1   2  57       NA   5.4      2


tail(dataset)

			- 출력값 -
      resident gender job age position price survey
295        2      1   1  20        1   3.5      5
296        1      5   2  26        1   7.1      2
297        3      1   3  24        1   6.1      2
298        4      1   3  59        5   5.5      2
299        3      0   1  45        4   5.1      2
300        1      1   3  27        2   4.4      2

head() : 앞으로 부터 6개 출력

tail() : 뒤로 부터 6개 출력 

 

 

 

 

2) 데이터 셋 구조 보기 

 

names(dataset)
출력값 : [1] "resident" "gender"   "job"      "age"      "position" "price"    "survey"  

attributes(dataset)

 

attributes()

str()

names() : 변수명(컬럼) 출력

attributes() : names(컬럼명), class(데이터 구조) , row.names(행의 이름 - 이름이 없으면 숫자 default 값 출력) 

str() : 데이터 구조 보기 (자료구조/관측치(행),컬럼(열)/자료형)

 

 

 

 

3) 데이터 셋 조회

 

 

① 데이터 셋 접근 방법

1. dataset$age 

2. dataset$resident

3. length(dataset) 
출력값: [1] 7

4. length(dataset$age) 
출력값: [1] 300

<변수의 '$' 를 연결하여 컬럼의 데이터를 가져올 수 있습니다.>

 

1. dataset$age

 

2. dataset$resident

 

3. length(변수) :   컬럼의 개수  - 자료 구조에 따라서 정도의 inform 이 다릅니다. 

 

4. length(변수$컬럼) : 행(데아터)의 갯수 - 변수의 이름을 넣어주면 전체 데이터 개수를 알려줍니다. 

 

 

["컬럼명'] 형식으로 특정 변수 조회 

head(dataset["gender"]) # = head(dataset$gender)

 - 출력값 - 
> head(dataset["gender"])
  gender
1      1
2      1
3      1
4      2
5      1
6      1


head(dataset["price"])

 - 출력값 - 
> head(dataset["price"])
  price
1   5.1
2   4.2
3   4.7
4   3.5
5   5.0
6   5.4

 

 

[색인(index)] 형식으로 변수 조회 

 

head(dataset[6]) # 6행의 데이터 전체 중 상위 6개 출력 

- 출력값 -
  price
1   5.1
2   4.2
3   4.7
4   3.5
5   5.0
6   5.4


dataset[3,] # 3행의 데이터 전체 

출력값 : 
resident gender job age position price survey
  NA       1     2  41      4     4.7     4
    
    
head(dataset[,3])
출력값 : [1]  1  2  2 NA  3  2


head(dataset[,c(2:4)]) # 2~4 열 출력 (상위 6개)
 
 - 출력값 -
 gender job age
1      1   1  26
2      1   2  54
3      1   2  41
4      2  NA  45
5      1   3  62
6      1   2  57


dataset[c(2:4),] # 2~4  행 출력

    - 출력값 -
  resident gender job age position price survey
2        2      1   2  54        5   4.2      2
3       NA      1   2  41        4   4.7      4
4        4      2  NA  45        4   3.5      2


head(dataset[-c(1:100),])  # 1~100핵 제외, 101~300행까지 출력 (상위6개)

	 - 출력값 -
   resident gender job age position price survey
101        1      2   3  NA        3   6.3      4
102        2      1   3  63        5    NA      2
103        1      1  NA  47        4   7.1      2
104        5      2   3  45        4   5.0      2
105        1      2   1  44        4   6.5      2
106        5      1   3  NA        5    NA      3

 

 

'빅데이터 > R' 카테고리의 다른 글

[R] 이상치(극단치)  (0) 2020.07.06
[R] 결측치(NA) 처리  (0) 2020.07.06
[R] reshape2 패키지  (0) 2020.07.03
[R] 파이프 연산자(pipe)  (0) 2020.07.03
[R] dplyr 패키지  (2) 2020.07.03

reshape2 패키지

: 옆으로 컬럼이 많은 형태 ( Wide )를 세로로 긴 (Long) 형탤 변경해주고 반대로 세로로 긴 형태를 옆으로 넓게 바꿔주는 패키지입니다.

 

 

 

- 패키지 다운로드 

install.packages("reshape2")
library(reshape2)

 

 

위의 데이터를 활용하여 reshape2를 알아보겠습니다

 

 

① 예제

긴 형식 -> 넓은 형식으로 변경

 

dcast 함수를 이용한 넓은 형식 데이터 출력. 

wide <- dcast(data, Customer_ID ~ Date, sum)

 

① - 1 예제 

컬럼 이름 넣기 

colnames(wide) <- c('id','day1','day2','day3','day4','day5','day6','day7')
wide

 

 

 

② - 1예제 

넓은 형식을 긴 형식으로 변경

 

melt() 함수 이용 긴 형식으로 데이터 출력 

long <- melt(wide, id = 'id')
long

 

② - 2 예제 

컬럼명 수정

colnames(long) <- c("id", "Date", "Buy")
head(long)

 

 

 

 

 

- 3차원 배열 형식으로 변경 

 

airquality의 데이터를 활용하여 예제를 이어가보겟습니다. 

 

 <airquality>
데이터 셋은 R 에서 기본으로 제공되는 데이터 셋으로 New York의 대기에 대한 질을 측정한 데이터 셋이다 전체 153개의 관측치와 6 개의 변수로 구성되어 있으며 변수명은 모두 대문자로 되어있습니다. 


주요변수
Ozone(오존 수치), Solar.R(태양광) Wind(바람) Temp(온도)
Month(측정 월 5~9), Day(측정 날짜 1~31 일)

 

① 예제 

- 월과 일 컬럼으로 나머지 4개 컬럼을 묶어서 긴 형식 변경

 

acast 함수를 이용하여 3차원 배열 형식으로 데이터 출력 

air_melt <- melt(airquality, id = c("MONTH", "DAY"), na.rm = T)
head(air_melt)



        - 출력값 - 
  MONTH DAY variable value
    5    1    OZONE    41
    5    2    OZONE    36
    5    3    OZONE    12
    5    4    OZONE    18
    5    6    OZONE    28
    5    7    OZONE    23

 

② 예제 

월 단위 variable(대기과련 컬럼) 컬럼 합계

acast(air_melt, month~variable,sum)

          - 출력값 - 
   OZONE SOLAR.R  WIND TEMP
    614   4895   360.3 2032
    265   5705   308.0 2373
   1537   6711   277.2 2601
   1559   4812   272.6 2603
    912   5023   305.4 2307

'빅데이터 > R' 카테고리의 다른 글

[R] 결측치(NA) 처리  (0) 2020.07.06
[R] 데이터 셋 보기  (0) 2020.07.06
[R] 파이프 연산자(pipe)  (0) 2020.07.03
[R] dplyr 패키지  (2) 2020.07.03
[R] plyr 패키지  (0) 2020.07.02

+ Recent posts