크롤링(crawling) 혹은 스크래핑(scraping) 웹 페이지를 그대로 가져와서 거기서 데이터를 추출해 내는 행위로, 크롤링하는 소프트웨어는 크롤러(crawler)라고 부릅니다. 

 

무수히 많은 컴퓨터에 분산 저장되어 있는 문서를 수집하여 검색 대상의 색인으로 포함시키는 기술. 어느 부류의 기술을 얼마나 빨리 검색 대상에 포함시키냐 하는 것이 우위를 결정하는 요소로서 최근 웹 검색의 중요성에 따라 발전되고 있습니다. 

 

 

관련 용어

 

(1) 웹크롤링(web crawling)


- 웹을 탐색하는 컴퓨터 프로그램(크롤러)를 이용하여 여러 인터넷 사이트의 웹 페이지 자료를 수집해서 분류하는 과정. 
- 또한 크롤러(crawler)란 자동화된 방법으로 월드와일드웹(www)을 탐색하는 컴퓨터 프로그램을 의미. 

 

(2) 스크래핑(scarping)


- 웹사이트의 내용을 가져와 원하는 형태로 가공하는 기술
- 즉 웹사이트의 데이터를 수집하는 모든 작업을 의미  
- 결국, 크롤링도 스크래핑 기술의 일종
- 크롤링과 스크래핑을 구분하는 것은 큰 의미가 없음

 

(3) 파싱(parsing)


- 어떤 페이지(문서, HTML등) 에서 시용자가 원하는 데이터를 특정 패턴이나 순서로 추출하여 정보를 가공하는 것.  
- 예를들면 HTML 소스를 문자열로 수집한 후 실제 HTML태그로 인식할 수 있도록 문자열을 의미있는 단위로 분해하고,    계층적인 트리 구조를 만드는 과정.

 

 

(1) 패키지 설치 및 준비 

install.packages("tidyverse")
install.packages("rvest") # html 추출

library(tidyverse) 
library(rvest)

 

 

 

 

 


start라는 값으로 페이지의 차이를 보입니다. 

1 page : https://search.naver.com/search.naver?
&where=news&query=%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0&sm=tab_pge&sort=0&photo=0
&field=0&reporter_article=&pd=0&ds=&de=&docid=&nso=so:r,p:all,a:all&
mynews=0&cluster_rank=55&start=1&refresh_start=0

2 page : https://search.naver.com/search.naver?
&where=news&query=%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0&sm=tab_pge&sort=0&photo=0
&field=0&reporter_article=&pd=0&ds=&de=&docid=&nso=so:r,p:all,a:all&
mynews=0&cluster_rank=31&start=11&refresh_start=0

 

 

(2) url 요청

base_url <- "https://search.naver.com/search.naver?
             &where=news&query=%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0&sm=tab_pge&
             sort=0&photo=0&field=0&reporter_article=&pd=0&ds=&de=&docid=&nso=so:r,p:all,a:all&
             mynews=0&cluster_rank=55&refresh_start=0&start="
             # url의 순서는 중요하지 않고, 내용에 무엇이 담겨있는지가 중요. 
             # &start=1 값을 뒤로 보내고 1 값을 지움 
             # 1페이지 1, 2페이지 11, 3페이지 21 ... 
            
            
             

 

- url  가져오기 

urls <- NULL

for(x in 0:9){ #0~9까지 10개의 순차적인 값 출력(10번 반복)
  urls <- c(urls, paste(base_url,x*10+1,sep= ''))
}

urls

paste() : 여러 문자열을 연결시켜주는 함수. 

 

 

 

(3) R에서 HTML 불러오기 

html <- read_html(urls[1])
html

 

 

(4) HTML 에서 필요한 부분 뽑아오기 

htmlnode <- html_nodes(html,'ul.type01 > li > dl > dd > a') # 첫페이지 네이버 뉴스 링크 
# ( . ) 클래스 선택자 , ( > )  자식 선택자 

htmlnode
html_attr(htmlnode,'href') # href : url 주소만 읽어 옴 

 

 

혹은 위의 (3) ~ (4) 과정을 파이프 연상자를 이용해서 한번에 수행 

urls[1] %>% 
  read_html() %>% 
  html_nodes('ul.type01 > li > dl > dd > a') %>%
  html_attr('href')

 

 

(5) 뉴스 기사 url 뽑아내기 

news_links <- NULL 

for(url  in urls){
  html <- read_html(url)
  news_links <- c(news_links,html %>% 
                    html_nodes('ul.type01 > li > dl > dd > a') %>% 
                    html_attr('href')
                  )
}

news_links

 

 

(6) 뉴스 본문/제목 추출하기 

contents <- NULL
title <- NULL

# news_links - 59개의 링크 

for(link in news_links){
  html <- read_html(link)
  
  # 본문
  contents <- c(contents, html %>% 
                          html_nodes('._article_body_contents') %>%   
                          html_text()) 
    
  
  # 제목 
  title <- c(title, html %>% 
                    html_nodes('#articleTitle') %>%
                    html_text())
}

contents_df <- as.data.frame(contents)
title_df <- as.data.frame(title)

news<- cbind(title_df,contents_df) # 열중심으로 결함 
View(news)

( # ) id 선택자 , ( . ) class 선택자 
본문 = class 이름으로 선택해야 전체 바디 영역이 선택됩니다.  

 

 

 본문 ('._article_body_contents')

 

 

제목 ('#articleTitle')

 

 

(7) 수집한 자료 전처리 

-  gsub("패턴", "교체문자",자료) 

contents_pre <- gsub("[\r\n\t]",' ',contents) # 이스케이프 문자 제거 
contents_pre <- gsub("[[:punct:]]",' ',contents_pre) # 문장 부호 제거
contents_pre <- gsub("[[:cntrl:]]",' ',contents_pre) # 특수 문자 제거
contents_pre <- gsub("\\d+",' ',contents_pre) # 숫자 제거
contents_pre <- gsub("[a-z]",' ',contents_pre) # 영문 소문자 제거 
contents_pre <- gsub("[A-Z]",' ',contents_pre) # 영문 대문자 제거 
contents_pre <- gsub("\\s+",' ',contents_pre) # 2개 이상 공백 교체 

contents_pre[1]

통계 분석 절차

 

 

0. 가설 설정 이전의 연구 조사 

 1) 연구문제 선정 

     : 선정기준 : 연구의 독창성. 검증 가능성, 결과의 실용성, 구체성, 경제성(소용비용, 노력)

 

 2) 예비소사 

     : 연구문제에 대한 사진 지식 획득, 변수 규명, 가설 도출 등을 위해 실시하는 조사 

     -> 사전조사 : 설문지를 작성 후 본 조사 전에 실시한다. 

 

 3) 연구모형

     : 연구문제에 개념과 변수를 식별하는 과정으로 독립변수와 종속변수 형태로 기술한다.  

  

 

1. 가설 설정

 

- 통계적 가설 검정 통계적 추측의 하나로서, 모집단 실제의 값이 얼마가 된다는 주장과 관련해, 표본의 정보를 사용해서 가설의 합당성 여부를 판정하는 과정을 의미합니다. 간단히 가설 검정이라고 부르는 경우가 많습니다.

 

 

- 가설(Hypothesis)의 설정 : 가설은 검정하고자 하는 모집단의 모수(조사하고자 하는 자료의 평균, 분산, 표준편차, 상관계수)에 대하여 항상 다음의 둘로 설정 합니다.

 

1. 귀무가설 :[영(0)가설:null hypothesis] Ho :  두 모수(예: 두 평균)에 대한 값이 같다고 놓을때, 기각(reject) 또는 채택(accept)하려고 세운 검정의 대상이 되는 가설이며 H0로 나타냅니다. 귀무(영)가설은 수식 표현대로 “두 모수는 같다”와 같이 설정하는 것입니다.


- 효과가 없다라는 가정에서 시작(변수간에 관계, 차이 없음)

 

2. 연구가설 :  [연구가설:alternative hypothesis]H1: 귀무(영)가설이 채택되지 않을 때, 즉 두 모수에 대한 값이 다를 때 가설입니다. 여기에는 다음과 같이구분하는 두 가지 검정방법이 존재한다

① 양측검정 : 두 모수는 같지 않다.

② 단측 검증 : 두 모수중 하나는 다른 것 보다 크다 또는 작다.

효과가 있다라는 가정에서 시작(변수간에 관계, 차이 존재)

 

- 주장하고 싶은 바 : 연구가설 , 반대 개념을 : 귀무가설 사용

설정한 기준에 의해서 채택하고 싶은 기준을 유의 수준의 값을 통해서 결정합니다. .

 

 

※ 논문에서 연구가설 제시, 귀무가설을 통해서 가설 검정

 

먼저 연구 가설 내용을 통계적 가설로 바꾸어 줌으로써 가설 검정(hypothesis test)이 시작됩니다.

 

H1 = „싞약A는 A암 치료에 효과가 있다.‟
H0 = „싞약A는 A암 치료에 효과가 없다.‟

 

석결과 : 생쥐 100마리를 대상으로 신약A를 투약한 결과 검정통계량의 유의확률(P=0.03)이 나왔습니다. – 이때 귀무가설은 기각되는가?


사회과학분야 임계값 : α=0.05(p<0.05(5%미만))
적어도 96마리 이상 효과


의.생명분야 임계값 : α=0.01(99% 싞뢰도 보장)
 적어도 99마리 이상 효과

 

 

 

2. 유의수준 결정 

 

유의수준(Significant level)

- 1종 오류를 범할 수 있는 최대 호용 한계입니다.

1) 1종 오류 : 귀무가설이 참인데 기각한 경우

2) 2종 오류 : 귀무가설이 거짓인데 기각하지 않은 경우

 

통계학적으로 유의수준은 보통 0.05, 0.01, 0.001중 하나 (5%, 1,%, 0.1%)를 채택합니다.

귀무가설이 참이라고 가정했을 때 내가 구한 자료가 맞을 가능성이 유의수준 이하라면, 그 귀무가설은 기각하고 대립가설을 채택합니다.

 

가설 채택 또는 기각 기준  / 분석 결과 유의수준 이내 -> 가설 채택(그렇지 않으면 기각)

 

일반 사회과학분야 : α=0.05(p<0.05 ) / 95%  

의생명분야 : 0.01 / 99%(1% 오차 허용, 99% 신뢰도 확보)

 

유의확률(p) : 귀무가설이 참인데도 불구하고 이를 기각할 확률 (잘못된 의사결정을 할 확률)

 

유의수준이 0.05라 할때, p가 0.05보다 적게 나와야 귀무가설을 기각하고 대립가설을 채택할 수 있습니다.

즉, 가설검정을 할 때 p값과 유의수준을 비교하여 귀무가설과 대립가설 둘 중 하나를 채택합니다.

 

 

3. 측정도구 선정

- 가설에 나오는 변수를 무엇으로 측정할 것인가를 결정하는 단계
- 가설에 나오는 변수(변인) 추출
- 변수의 척도를 고려 측정도구 선정

 

4. 데이터 수집(설문지, 웹, SNS)

데이터 수집이란?

 

계측기를 통해 들어오는 측정 자료들을 컴퓨터를 이용하여 처리하고 결과를 얻어내는 것. 중앙에 연결된 컴퓨터와 원격지의 단말기를 통해 자료를 수집하고 처리하는 것을 말하기도 하며 크게 외부의 센서(sensor)에 의해 자료를 모으는 것을 말합니다.

 

+)

– 선정된 측정도구를 이용하여 설문 문항 작성 단계
– 조사응답자 대상 설문 실시 & 회수
– 정형/비정형 데이터 수집(DB, WEB, SNS 등)
– 본 단계까지 완료된 경우 
- 연구목적과 배경, 연구모형, 연구가설까지 끝난 상태
 = 논문 50% 이상 완성

 

5. 데이터 코딩/ 프로그래밍 

- 코딩과 프로그래밍의 차이

코디은 프로그래밍과 같은 뜻으로 널리 사용됩니다. 하지만 좀더 구체적으로 살펴보면, 코딩은 명령을 컴퓨터가 이해할 수 있는 C언어, 자바, 파이선 등의 프로그래밍 언어로 입력하는 과정 뜻하고 프로그래밍프로그래밍 언어를 사용해 프로그램을 만드는 일을 뜻합니다.

 

– 통계분석 프로그램(Excel, R, SPSS, SAS,) 데이터 입력
– 데이터 전처리(미 응답자, 잘못된 데이터 처리)

 

6. 통계분석 수행 (R,SPSS, SAS)

- 전문 통계분석 프로그램(R, SPSS, SAS) 분석 단계

 

- 통계 분석 기법

   1) 빈도 분석

      : 측정하여 얻은 데이터가 사람 수, 횟수 등의 빈도인 경우에 사용합니다. 이 방법은 집단 간 빈도 차를 비교합니다.

 

   2) 평균 분석

      : 측정하여 얻은 데이터가 점수고 비교해야할 집단이 두 개만 존재할 때, 두 개 집단의 평균 등을 비교하여 가설을  

        검증합니다.

  

   3) 변량분석

      : 측정하여 얻은 데이터가 점수, 3개 이상 집단을 비교할 때 사용합니다. 가장 많이 사용되는 검증 방법으로써,

       영어로 ANOVA(analysis of variance)로 표현합니다.

 

   4) 상관분석

      : 두 변수간 관계성이 얼마나 큰가를 분석할 때 사용합니다. 상관분석에서는 변수들 간 상관성 유무만 확인하고,

        인과관계는 분석하지 않습니다. 상관분석의 핵심은 상관계수(r)를 구하는 것입니다.

 

   5) 회귀분석

      : 독립변수가 종속변수에 영향을 미치는지 분석할 때 사용합니다. 회귀분석은 인과관계를 분석합니다.

        관측된 사건들을 정량화해서 여러 독립변수와 종속변수의 관계를 함수식으로 설명합니다.

  

- 통계분석 방법을 계획하지 않고 데이터를 수집할 경우 실패 확률 높음

7. 결과분석 (논문/ 보고서) 

– 연구목적과 연구가설에 대핚 분석 및 검증 단계
– 인구통계학적 특성 반영
– 주요 변인에 대한 기술통계량 제시
– 연구가설에 대한 통계량 검정 및 해석
– 연구자 의견 기술(논문/보고서 작성)

 

연관어 분석(단어 연관성) 

: 연관 알고리즘을 통해서 단어 사이의 관계를 파악해서 시각화 하는 분석 방법입니다. 

- 연관 분선은 대표적인 비지도 학습의 알고리즘으로 구성되어 있습니다. 

 

지도 학습 : 데이터와 결과를 알려주면서 학습 시키는 방법

※ 비지도 학습 : 데이터는 주지만 결과를 주지 않고 스스로 학습 하도록 만드는 방법 

 

- 시각화: 연관어 네트워크 시각화와 근접 중심성

 

 

 

ⓘ 한글 처리를 위한 패키지 설치 (토픽 분석과 동일)

install.packages("KoKLP") # package ‘KoKNP’ is not available (for R version 4.0.1)

install.packages("https://cran.rstudio.com/bin/windows/contrib/3.4/KoNLP_0.80.1.zip",repos = NULL)

# repos = NULL : 버전은 다운한 3.6버전에 설치한다든 옵션 

# Sejong 설치 : KoNLP 와 의존성 있는 현재 버전의 한글 사전 
# Sejong 패키지 설치
install.packages("Sejong")

install.packages(c("hash","tau","RSQLite","rJava","devtools"))

library(Sejong)
library(hash)
library(tau)
library(RSQLite)

Sys.setenv(JAVA_HOME='C:/Program Files/Java/jre1.8.0_221')
library(rJava) # rJava를 올리기 전에 java의 위치를 지정해줘햔다. 
library(devtools)

library(KoNLP)

 

 

market.txt 를 활용하여 살펴보도록 하겠습니다.

 

② 텍스트 파일 가져오기와 단어 추출하기 

marketing <- file("C:/workspaces/R/data/marketing.txt", encoding = "UTF-8")

marketing2 <- readLines(marketing) # 줄 단위 데이터 생성

marketing2[1]

 

③ 줄 단위 단어 추출

lword <- Map(extractNoun, marketing2) # Map(extractNoun,변수) :변수에서 명사단위로 추출 
length(lword) 출력값:  [1] 472 : 라인별로 472개를 가지고 있다.

lword <- unique(lword) #  빈 block 필터링 
length(lword) 출력값 :  [1] 353 : 중복 단어를 제거 이후, 353개를 가지고 있다. 


str(lword) # List of 353

- 출력값 -  
 $ : chr [1:20] "본고" "목적" "비판이론" "토대" ...
 $ : chr [1:19] "전통" "적" "마케팅" "욕구충족" ...


head(lword)
- 출력값 - 

 

 

④ 단어 필터링 함수 정의

 - 길이가 2개 이상 4개 이하 사이의 문자 길이로 구성된 단어

filter1 <- function(x){
    nchar(x) >= 2 && nchar(x) <=4 && is.hangul(x)
} # 자동적으로 영어가 필터링

filter2 <- function(x){
  Filter(filter1, x) 
}

 

⑤ 줄 단위로 추출된 단어 전처리 

lword <- sapply(lword, filter2) # 단어 길이 1이하 또는 5이상인 단어 제거

head(lword)

 

2 ~ 4사이의 단어출력 ( 1이하 또는 5이상 단어 제거(한글 외 언어 제거)) 

 

 

⑥ 트랜잭션 생성
- 트랜잭션 : 연관분석에서 사용되는 처리 단위. 
- 연관분석을 위해서는 추출된 단어를 대상으로 트랜잭션 형식을 자료구조 변환. 

- 토픽 분석 Corpus() : 단어 처리의 단위

 

 - 연관분석을 위한 패키지 설치 

install.packages("arules")
library(arules)

 

- 트랜잭션 생성

wordtran <- as(lword, "transactions")

wordtran

- 출력값 - 
 transactions in sparse format with
 353 transactions (rows) and
 2423 items (columns)

as() 를 통해서 transactions 를 넣으면 내부에서 효율적으로 처리되도록 트랜잭션으로 변환해줍니다.

 

 

⑦ 교차평 작성 : crossTable() -> 교차테이블 함수를 이용

wordtable <- crossTable(wordtran)
wordtable

유사 단어들이 함께 있는 형태로 출력(transaction) 

 

 

⑧ 단어 간 연관 규칙 산출

transrlues <- apriori(wordtran, parameter = list(support=0.25,conf =0.05)) 

출력값 : writing ... [59 rule(s)] done [0.00s]. (59개의 규칙을 찾았다.)

apriori() : 연관분석 기능 적용(규칙성을 찾음) , 자료구조의 형태는 transaction 일때 정상적으로 실행 

support = 지지도 : 수치형의 값(상관도) = 퍼센트 값으로 최대값 1, 최소값 0
전체 거래에서 특정 물품 A와 B가 동시에 거래되는 비중으로,해당 규칙이 얼마나 의미가 있는 규칙인지를 보여줍니다. 지지도 = P(A∩B)  :  A와 B가 동시에 일어난 횟수 / 전체 거래 횟수

 

conf = 신뢰도 
A를 포함하는 거래 중 A와 B가 동시에 거래되는 비중으로, A라는 사건이 발생했을 때 B가 발생할 확률이 얼마나 높은지를 말해줍니다.
신뢰도 =  P(A∩B) / P(A)  :  A와 B가 동시에 일어난 횟수 / A가 일어난 횟수

 

 

⑨ 연관 규칙 생성 결과 보기 

inspect(transrlues)

 

 

⑩ 연관어 시각화 

 

- 연관 단어 시각화를 위해서 자료 구조 변경

rules <- labels(transrlue, ruleSep = " ") # 연관규칙 레이블을 " "으로 분리 
head(rules,20)

 

- 문자열로 묶인 연관 단어를 행렬 구조 변경

rules <- sapply(rules, strsplit, " ", USE.NAMES = F)
rules
class(rules) # [1] "character" -> [1] "list"

 

- 행 단위로 묶어서 matrix로 반환 (do.call)

rulemat <- do.call("rbind", rules)
rulemat
class(rulemat) # [1] "matrix"

 

 

- 연관어 시각화를 위한 igraph 패키지 설치

install.packages("igraph")
library(igraph)

 

 

- edgelist 보기 - 연관 단어를 정점(vertex) 형태의 목록 제공 (matrix 형태의 자료형을 전달 받게 되어 있음)

relueg <- graph.edgelist(rulemat[c(12:59),],directed = F) # [c(1:11)] - "{}" 제외 
relueg

 

- edgelist 시각화 

plot.igraph(relueg)

- edgelist 시각화 part_2

plot.igraph(relueg,vertex.label=V(relueg)$name, vertex.label.cex=1.2,vertex.label.color='black',
            vertex.size=20, vertex.color='green',vertex.frame.color = 'blue') 

해석 : 거리가 가까울수록 높은 연관성을 가지고 있음을 보여줍니다. 

        경영과 마케팅과의 연관성 

 

 

 

# - 참조(unique())

c1 <- rep(1:10 , each=2) # rep : vector 객체 생성
c1 출력값 :  [1]  1  1  2  2  3  3  4  4  5  5  6  6  7  7  8  8  9  9 10 10

c2 <- rep(c(1,3,5,7,9),each=4) # 1,3,5,7,9 반복 vector 객체 생성 
c2 출력값 : [1] 1 1 1 1 3 3 3 3 5 5 5 5 7 7 7 7 9 9 9 9 

c3 <- c(1,1,1,1,3,3,3,3,5,5,6,6,7,7,8,8,9,10,11,12)
c3 출력값 :  [1]  1  1  1  1  3  3  3  3  5  5  6  6  7  7  8  8  9 10 11 12

c123_df <- data.frame(cbind(c1,c2,c3))
c123_df
# cbind : 열 단위로 묶어서 데이터 프레임으로 만듬 

str(c123_df) # 'data.frame':	20 obs. of  3 variables:

c12_unique <- unique(c123_df[,c("c1", "c2")]) # 행을 지정하지 않으면 20개 전체가 출력 
c12_unique
# 중복(입력하는 대상이 두개 다 같을 때) 되는 값은 제거하고 출력

c123_unique <- unique(c123_df[,c("c1", "c2","c3")]) # 행을 지정하지 않으면 20개 전체가 출력 
c123_unique
# 나중에 등장하는 값이 제거 되는 것이 default 값

c123_unique <- unique(c123_df[,c("c1", "c2","c3")],fromLast=T) # 행을 지정하지 않으면 20개 전체가 출력 
c123_unique
# fromLast= F(default) : 뒤에 나오는 값이 제거 , fromLast= T : 앞에 나오는 값 제거 

 

- c123_df

- c12_unique

- c123_unique

- c123_unique(+fromLast =T) 

토픽 분석 ( 빈도 분석 ) 

: 텍스트 데이터를 대상을 단어를 추출하고, 이를 단어 사전과 비교하여 단어의 출현 빈도수를 분석하는 텍스팅 마이닝 분석 과정을 의미  

+ 또한 단어구름(word cloud) 패키지를 적용하여 분석 결과를 시각화 하는 과정도 포함 

 

 

1. 텍스트 자료 가져오기 

facebook <- file("C:/workspaces/R/data/facebook_bigdata.txt",encoding = "UTF-8")

facebook_data <- readLines(facebook)

file( ) : 텅키로 파일을 읽어 옴

readLines( ) : 줄 단위 데이터 생성

 

facebook 

 

facebook_data 의 데이터 내용, 종류 

str(facebook_data) 출력값 : chr [1:76] // 76줄

head(facebook_data) # 앞부분 6줄 보기 - 줄 단위 데이터 생성

 

 

2. 세종 사전에 신규 단어 추가 

userDic <- data.frame(term=c("R 프로그래밍", "페이스북", "소셜네트워크", "얼죽아"), tag='ncn') 

term( ) :추가 단어 저장 

tag( ) :저장된 문자의 형태 저장
('ncn') : 명사 

 

 

- 신규 단어 사정 추가 함수 

buildDictionary(ext_dic = 'sejong', user_dic = userDic) 

buildDictionary (ext_dic = '저장할 사전 이름', user_dic = 변수 이름 )

 

 

3. 단어 추출 위한 사용자 정의 함수 

 

- R 제공 함수로 단어 추출하기 - Sejong 사전에 등록된 신규 단어 테스트 

paste(extractNoun("홍길동은 얼죽아를 최애로 생각하는, 빅데이터에 최대 관심을 가지고 있으면서, 
                   페이스북이나 소셜네트워크로부터 생성 수집되어진 빅데이터 분석에 많은 관심을 
                   가지고 있어요."),collapse=" ")
                   
출력값:
[1] "홍길동은 얼죽아 최애로 생각 빅데이터에 최대 관심 페이스북 
     소셜네트워크 생성 수집 빅데이터 분석 관심"

paste( ) : 나열된 원소 사이에 공백을 두고 결과값을 출력
extractNoun( ) : 명사를 추출 
collapse=" " : 찾은 단어 사이 ( )넣기

 

 

4. 단어 추출을 위한 사용자 정의 함수 정의하기

 

(1) 사용자 정의 함수 작성

[문자형 변환] -> [명사 단어 추출] -> [" "으로 데이터 연결하여 하나의 문자열로 출력] 

exNouns <- function(x){ 
  paste(extractNoun(as.character(x)), collapse = " ")  
}

- 텍스트 마이닝에서 기본적인 전처리 과정으로 많이 사용되는 형태. 

 

 

(2) exNouns 함수 이용 단어 추출

facebook_nouns <- sapply(facebook_data, exNouns) # 명사 단어 추출 
facebook_nouns[1] # 단어가 추출된 첫 줄 보기 

 

위의 문장을 밑의 문장으로 처리 된 결과를 출력해줍니다(명사형) 

 

sapply(list, function)
sapply 는 list 대신 행렬 or 벡터로 반환

Apply

함수는 행렬의 행 또는 열 방향으로 특정 함수를 적용
apply(matrix, 1 or 2, 함수) - 1: 행, 2: 열

lapply
apply 함수의 단점은 input 으로 array 만 입력할 수 있다는 것

일반적으로 vector 를 input 넣는 경우가 많은데, 이를 위해 lapply 가 존재
입력으로 vector 또는 list 를 받아 list 를 반환

 

 

5.  추출된 단어 대상 전처리 

 

①  추출된 단어 이용 말뭉치(Corpus) 생성

myCorpus <- Corpus(VectorSource(facebook_nouns))
myCorpus

출력값 

 <<SimpleCorpus>>
 Metadata:  corpus specific: 1, document level (indexed): 0
 Content:  documents: 76
 
 - 76개의 말뭉치 단위로 포장

Corpus() : 단어 처리의 단위
VectorSource() : vector 형으로 변환 

 

 

② 데이터 전처리 

myCorpusPrepro <- tm_map(myCorpus,removePunctuation) # 문장부호 제거 
# - myCorpus 안에 들어있는 문장 부호를 삭제 한다. 

myCorpusPrepro <-tm_map(myCorpusPrepro, removeNumbers) # 수치 제거
# - myCorpusPrepro 안에 들어있는 숫자 삭제 한다.

myCorpusPrepro <-tm_map(myCorpusPrepro, tolower) #영문자 소문자 변경
# - myCorpusPrepro 안에 들어있는 영문자 소문자 변경.

myCorpusPrepro <-tm_map(myCorpusPrepro, removeWords,stopwords('english')) 
# 불용어(for, very, and, of, are...)제거 

 tm_map() : Corpus로 처리된 데이터를 받아서 필터링을 해준다.
 removePunctuation() : 문장부호 삭제 
 removeNumbers() : 수치 제거 
 tolower() : 영문자 소문자 변경 
 removeWords , stopwords('english') :  불용어(for, very, and, of, are...)제거 

 

 

③  전처리 결과 확인

inspect(myCorpusPrepro[1])

 

 

6. 단어 선별 

- 단어 2음절 ~ 8음절 사이 단어 선택하기 

- Corpus 객체를 대상으로 TermDocumentMatrix() 함수를 이용하여 분석에 필용한 단어 선별하고 단어/문서 행렬을 

   만듭니다. 
- 한글 1음절은 2byte에 저장(2음절 = 4byte , 8음절 = 16byte)

myCorpusPrepro_term <- TermDocumentMatrix(myCorpusPrepro,control=list(wordLengths=c(4,16)))

myCorpusPrepro_term

- 출력값- 
 <<TermDocumentMatrix (terms: 696, documents: 76)>>
   Non-/sparse entries: 1256/51640
 Sparsity           : 98%
 Maximal term length: 12
 Weighting          : term frequency (tf)

- 텍스트를 숫자로 표현하는 대표적인 방법 

 

- matrix 자료구조를 data.frame 자료 구조로 변경

myTerm_df <- as.data.frame(as.matrix(myCorpusPrepro_term))
dim(myTerm_df) 출력값: [1] 696  76

 

 

7. 단어 출현 빈도수 구하기

- - 빈도수 높은 순서대로 내림차순 정렬

wordResult <- sort(rowSums(myTerm_df), decreasing = T)

wordResult[1:10]

- 출력값 -
데이터  분석   빅데이터   처리     사용     수집   시스템     저장     결과     노드 
91      41       33      31        29      27      23       16       14       13 

빈도수로 내림차순 정렬
decreasing = T : 내림차순 정렬

 

사용이 빅데이터와 관련 없는 단어가 출력될 수 있습니다.

 

 

8. 불필요한 용어 제거 시작 

 

① 데이터 전처리

myCorpusPrepro <- tm_map(myCorpus,removePunctuation) # 문장부호 제거 
# - myCorpus 안에 들어있는 문장 부호를 삭제 한다. 

myCorpusPrepro <-tm_map(myCorpusPrepro, removeNumbers) # 수치 제거
# - myCorpusPrepro 안에 들어있는 숫자 삭제 한다.

myCorpusPrepro <-tm_map(myCorpusPrepro, tolower) #영문자 소문자 변경
# - myCorpusPrepro 안에 들어있는 영문자 소문자 변경.

myCorpusPrepro <-tm_map(myCorpusPrepro, removeWords,stopwords('english')) 
# 불용어(for, very, and, of, are...)제거 

myStopwords <- c(stopwords('english'),"사용","하기")

myCorpusPrepro <-tm_map(myCorpusPrepro, removeWords,myStopwords) # 불용어 제거 

inspect(myCorpusPrepro[1:5]) # 데이터 전처리 결과 확인 

 

②  단어 선별 - 단어 길이 2 ~ 8 개 이상 단어 선별.

myCorpusPrepro_term <- TermDocumentMatrix(myCorpusPrepro,control=list(wordLengths=c(4,16)))

myTerm_df <- as.data.frame(as.matrix(myCorpusPrepro_term))
dim(myTerm_df) # 출력값 : [1] 696  76

wordResult <- sort(rowSums(myTerm_df), decreasing = T)

wordResult[1:10]

 - 출력값 -
 
 데이터   분석   빅데이터    처리     수집    시스템     저장     결과     노드     얘기 
   91      41      33        31       27       23       16       14       13       13 

 

 

9. 단어 구름(wordcloud) 시각화 

 

디자인 적용전 

myName <- names(wordResult) # 단어 이름 축출
wordcloud(myName, wordResult) # 단어 구름 시각화 

 

단어 구름에 디자인 적용 (빅도수, 색상, 위치, 회전등)

1) 단어 이름과 빈도수로 data.frame 생성

word.df <- data.frame(word=myName, freq=wordResult)
str(word.df)

-출력값-
 'data.frame':	694 obs. of  2 variables:
 $ word: Factor w/ 694 levels "‘똑똑한","‘삶",..: 197 283 297 546 359 374 495 103 169 399 ...
 $ freq: num  91 41 33 31 27 23 16 14 13 13 ...

 

2) 단어 색상과 글꼴 지정

pal <- brewer.pal(12,"Paired") # 12가지 생상 pal
windowsFonts(malgun=windowsFont("맑은 고딕"))
brewer.pal(색상의 수)

 

3) 단어 구름 시각화 

x11() # 별도의 창을 띄우는 함수 
wordcloud(word.df$word, word.df$freq, scale = c(5,1), min.freq = 3, random.order = F,  
          rot.per = .1, colors = pal, famliy = "malgun")
          
random.order = F : 가장 큰 크기를 가운데 고정 

 

 

 

# 예제) 

hiphop.txt 을 이용하겠습니다. 

 

① 데이터 불러오기 

txt <- readLines("C:/workspaces/R/data/hiphop.txt")
head(txt)

- 출력값 - 
[1] "\"보고 싶다"                  "이렇게 말하니까 더 보고 싶다" "너희 사진을 보고 있어도"     
[4] "보고 싶다"                    "너무 야속한 시간"             "나는 우리가 밉다"   

 

 

② 특수문자 제거 

txt1 <- str_replace_all(txt, "\\W", " ")

head(txt1)
- 출력값 - 
[1] " 보고 싶다"                   "이렇게 말하니까 더 보고 싶다" "너희 사진을 보고 있어도"     
[4] "보고 싶다"                    "너무 야속한 시간"             "나는 우리가 밉다"            

\W(대문자) : 특수 문자 선택 

\w(소문자) : 특수 문자 제외 선택 

str_replace_all(변수, 변경 전 문자, 변경 후 문자) : 문자 변경 

 

 

 

③ 가사에서 명사 추출

nouns <- extractNoun(txt1)
head(nouns)

- 출력값 - 
[[1]]
[1] "싶"

[[2]]
[1] "말" "싶"

[[3]]
[1] "너희" "사진" "도"  

[[4]]
[1] "싶"

[[5]]
[1] "야속" "한"   "시"   "간"  

[[6]]
[1] "나"   "우리" "밉"  

 

 

④ 추출한 명사 list를 문자열 벡터로 변환, 단어별 빈도표 생성

wordcount <- table(unlist(nouns)) # unlist( ) : list -> vector 
head(wordcount);tail(wordcount) # 상위 6개 출력 ; 하위 6개 출력 


- 출력값 - 
         1  100 168  17 
12   2   8   3   1   1 


히   히트     힘   힘겹 힘내잔   힙합 
8      1      10     1      1      1 

 

⑤ 데이터 프레임으로 변환

df_word<-as.data.frame(wordcount,stringsAsFactors = F) 

tail(df_word)
- 출력값 - 
        Var1 Freq
 3078     히    8
 3079   히트    1
 3080     힘   10
 3081   힘겹    1
 3082 힘내잔    1
 3083   힙합    1

stringsAsFactors = F : 문자열 그대로 형변환 없이 출력

stringsAsFactors = T : factor 형으로 출력

 

 

⑥ 변수명 수정 

names(df_word) <- c('word', 'freq')

tail(df_word)
 
- 출력값 -
        word freq
 3078     히    8
 3079   히트    1
 3080     힘   10
 3081   힘겹    1
 3082 힘내잔    1
 3083   힙합    1

 

 

⑦ 상위 20개 내림차순으로 추출 

df_word <- filter(df_word,nchar(word) >= 2) 

top_20 <- df_word %>% arrange(desc(freq)) %>% head(20) # 내림차순으로 정렬(가장 많이 언급된 단어)
top_20

- 출력값 -
  word freq
1   you   89
2    my   86
3   YAH   80
4    on   76
5  하나   75
6  오늘   51
7   and   49
8  사랑   49
9  like   48
10 우리   48
11  the   43
12 시간   39
13 love   38
14   to   38
15   we   36
16   it   33
17   em   32
18  not   32
19 역사   31
20 flex   30

 nchar() :  length  제공 

 

 

⑧ 시각화 

pal <- brewer.pal(8,"Dark2") # Dark2 색상 목록에서 8개 색상 추출.

set.seed(1234)
wordcloud(word=df_word$word, freq = df_word$freq, min.freq = 2, max.words = 200, 
          random.order = F, rot.per = .1, scale = c(4,0.3), colors=pal) 

min.freq = 2 : 두번 이상 언급 된 것 출력 

max.words = 200 : 출력되는 단어 수 200개 까지만

random.order = F  : 가장 많이 언급된 단어 가운데 배치

rot.per = .1 :  단어의 회전각 0.1

scscale = c(4,0.3) : 텍스트 들의 비율 및 크기 

 

텍스트 마이닝(Text Mining) 분석

문자로 된 데이터에서 가치 있는 정보를 얻어 내는 분석 기법.

 

※ 데이터 마이닝 

-  많은 데이터 가운데 숨겨져 있는 유용한 상관관계를 발견하여, 미래에 실행 가능한 정보를 추출해 내고 의사 결정에

   이용하는 과정

-  데이터베이스로부터 과거에는 알지 못했지만 데이터 속에서 유도된 새로운 데이터 모델을 발견하여 미래에 실행

   가능한 정보를 추출해 내고 의사 결정에 이용하는 과정

 

마이닝

- 데이터로부터 통계적인 의미가 있는 개념이나 특성을 추출하고 이것들 간의 패턴이나 추세 등의 고품질의 정보를

  끌어내는 과정이다. 

 

정형 데이터를 이용한 마이닝을 데이터 마이닝(data mining),
비정형 데이터를 이용한 마이닝을 텍스트 마이닝(text mining)이라고 합니다. 

 

 

토픽 분석 ( 빈도 분석 ) 

: 텍스트 데이터를 대상을 단어를 추출하고, 이를 단어 사전과 비교하여 단어의 출현 빈도수를 분석하는 텍스팅 마이닝 분석 과정을 의미  

+ 또한 단어구름(word cloud) 패키지를 적용하여 분석 결과를 시각화 하는 과정도 포함 

 

 

1) 패키지 설치 및 준비 

 

4점대의 버전으로는 토픽 분석을 사용하는 패키지를 KoKNP을 지원하지 않기 때문에 그에 맞는 버전으로 변경 해야합니다. 

https://cloud.r-project.org/

 

The Comprehensive R Archive Network

 

cloud.r-project.org

3.6.3 버전으로 다운 받아서 사용.

default 값으로 설치 하시며 됩니다. 

 

R-studio 에서 Tools에 Global Options

 

 version 을 바꾼 이후 Apply 누르고 Ok를 누른 후 R-studio를 다시 껐다 키시면 됩니다.

- 4점대 version 에서 다운 받았던 pakage들은 적용 되지 않으므로 필요한 pakage는 다시 다운 받아야 합니다. 

 

 

https://cran.rstudio.com/bin/windows/contrib/

 

Index of /bin/windows/contrib

 

cran.rstudio.com

3.4/ 를 눌러서 들어갑니다. 

 

도메일 + 파일 명 , repos = NULL 을 넣어 설치합니다. 

 

추가적으로 한글을 지원하는 패키지를 설치합니다. 

 

+ 마지막으로 필요한 pakage 설치 

install.packages(c("hash","tau","RSQLite","rJava","devtools"))

 

다운 받은 pakage들을 library에 올려줍니다. 

위의 모든 패키지들이 올라가야지 KoNLP 가 올라가니 주의해주세요. 

 

시각화, 데이터 마이닝에 필요한 pakage설치 

install.packages(c("wordcloud", "tm"))
library(wordcloud)
library(tm)

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

+ Recent posts