교차 분석 

: 범주형 자료의 두 개 이상 변수들 사이의 "관련성"을 알아보기 위한 분석입니다. 

 

 

특징 

 

1) 범주형 자료(명목척도 또는 서열척도)를 대상으로 두 개 이상의 변수들에 대핚 관련성 체크 
2) 결합분포를 나타내는 교차분핛표를 작성.
3) 변수 상호간의 관랸성 여부를 분석하는 방법.

4) 빈도분석의 특성별 차이를 분석하기 위해 수행하는 분석 방법.
5) 빈도분석결과에 대핚 보충자료를 제시하는 데 효과적.
6) 빈도분석과 함께 고급 통계 분석의 기초 정보를 제공

 

 

교차 분석시 고려사항


교차 분석에 사용되는 변수는 값이 10 미만인 범주형 변수여야 함

비율척도인 경우는 코딩변경(리코딩)을 통해서 범주형 자료로 변환하여 적용 가능

 

- ex) 나이: 10~19세는 1, 20~29세는 2, 30~39세는 3 ...

 

 

 

위의 데이터를 사용하여 살펴보도록 하겠습니다. 

 

- 데이터 가져오기 

data <- read.csv("C:/workspaces/R/data/cleanDescriptive.csv", header = T)

head(data) # 변수 확인

 

- 변수 리코딩

x <- data$level2 # 리코딩 변수 이용(학력수준) 
y <- data$pass2  # 리코딩 변수 이용(합격/불합격)
x; y  # 부모학력수준(x) -> 자녀대학진학여부(y)

 

- 데이터프레임 생성

result <- data.frame(Level=x, Pass=y) # 데이터 프레임 생성 - 데이터 묶음
dim(result) 출력값 : 248 2 

head(result)

- 출력값 - 
  Level Pass
1  고졸 실패
2  대졸 실패
3  대졸 합격
4  <NA> 합격
5  고졸 합격
6  대졸 <NA>

 

부모님의 최종학력이 자식에 영향이 미치는가? 

 

- 교차 분학표 작성

table(result) # 빈도보기

-출력값-
              Pass
Level      실패 합격
  고졸       40   49
  대졸       27   55
  대학원졸   23   31

 

- 교차분할표 생성을 위한 패키지 설치

install.packages("gmodels")
library(gmodels)

 

- 패키지를 이용한 교차 분할표 생성 

CrossTable(x, y)

 

- 교차테이블에 카이검정 적용

CrossTable(x, y, chisq = T)

 

척도

- 측정을 목적으로 일정한 규칙에 따라 질적인 측정 대상에 적용할 수 있도록 만들어진 계량적 도구. 즉 측정 도구.

- 변수에 값을 부여하는 방법
- 변수 측정 단위(응답자가 선택핛 수 있는 질문 항목)

 

 

 연속형 변수 : 양적인 크기를 가지는 변수  (키) - > 등간척도, 비율척도 
 범주형 변수 : 크기를 가지지 않는 변수 (성별) -> 명목척도, 서열 척도

 

 

- 데이터 가져오기 

data <-read.csv("C:/workspaces/R/data/descriptive.csv",header = T)
View(data)

 

위 데이터를 사용하여 살펴보도록 하겠습니다. 

 

 

- 데이터 정보 확인 

dim(data) 출력값 :  300   8 - 차원보기

length(data) 출력값 :  8 (컬럼 수)

length(data$survey) 출력값 : 300(데이터 수)

str(data) 출력값 : 'data.frame':	300 obs. of  8 variables: + 컬럼의 이름 + 자료형 출력

str(data$survey) 출력값  int [1:300] 1 2 1 4 3 3 NA NA NA 1 ...

 

 

1. 명목 척도

: 단순히 속성을 분류핛 목적으로 명목상 숫자를 부여하는 척도, 연산 불가능한 변수

length(data$gender) 출력값 300

summary(data$gender)

- 출력값 - 
Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
0.00    1.00    1.00    1.42    2.00    5.00 

table(data$gender) ==  각 성별 빈도 수 - outlier(이상치) -> 0,5 
- 출력값 - 
0   1   2   5 
2 173 124   1 

 

- 이상치 제거

data <- subset(data, data$gender==1 | data$gender ==2) # 성별 outlier 제거
x<- table(data$gender) # 성별에 대한 빈도수 저장 
x

- 출력값 - 
 1   2 
 173 124 

 

- 시각화 + 구성비율 계산 

구성비율 계산 
prop.table(x) # 비율계산 : 0 < x < 1 사이의 값 
-출력값- 
     1         2 
 0.5824916 0.4175084 

y <- prop.table(x)
round(y*100,2) # 백분율 적용(소수점 2자리)
-출력값-
  1     2 
58.25 41.75 


barplot(x) # 범주형(명목/서열 척도) 시각화 -> 막대 차트 

 

 

 

2. 서열 척도 

: 순서관계를 밝혀주는 척도(연산 불가능핚 변수) - 설문의 종류에 따라서 달라짐 (선호도)

 

- 데이터 정보 

length(data$level) 출력값 : [1] 297  --  학력수준 - 서열 (크기적인 개념 포함)

summary(data$level) # 명목척도와 함께 의미 없음 

table(data$level) # 빈도분석 - 의미있음 
- 출력값 - 
 1   2   3 
 115  99  70

 

- 구성비율 계산 + 시각화 

 

구성비율 계산

x1 <- table(data$level) # 각 학력수준에 빈도수 저장. 

y <- prop.table(x1)

round(y*100,2) # 백분율 적용(소주점 2자리)
- 출력값 -
  1     2     3 
40.49 34.86 24.65 

학력 수준(level) 변수의 빈도 수 시각화
barplot(x1) # 명목/ 서열 척도 -> 막대차트

 

 

 

3. 등간척도 

 : 측정대상의 속성에 대한 각 수준 간의 간격이 동일한 척도, 균일한 분포를 가지면서 연산이 가능

  (수치로서의 개념 존재)

 

- 만족도(survey) 변수

survey <- data$survey
survey

summary(survey)  - 만족도(5점척도)인 경우 의미 있음 -> 평균간 : 2.605
- 출력값 - 
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
1.000   2.000   3.000   2.605   3.000   5.000     112 

NA의 값이 112개나 되기 때문에 배제해 버리면 sample의 데이터가 많이 사라지므로 결과가 이상하게 출력될 수 있습니다. 

 

- 빈도수 + 시각화 

x1 <- table(survey) # 빈도수 
x1
- 출력값 - 
1  2  3  4  5 
20 72 61 25  7 

hist(survey) # 등간척도 시각화(연속형 변수)  
pie(x1) # 분포도 특징 시각화

- hsit

 

- pie

 

 

 

4. 비율척도

 :  척도의 수가 등간 , 사측 연산 가능 

 

등간척도와 비율척도의 차이는 절대 원점(0)의 의미 입니다. 
- 등간척도는 절대원점(0)을 가지고 있지 않음(의미 없음) 
- 비율척도는 절대원점(0)을 가지고 있는 척도(0을 기준으로 한 수치)

 

 

생황비(cost) 변수 대상 요약 통계량 구하기 

length(data$cost) # 297 (레코드 개수)
summary(data$cost) # 요약통계량 - 의미 있음(mean) / Mean = 8.784 , Median = 5.4

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

plot(data$cost) # 분포도 확인 

데이터 정제(이상치 제거)

data <- subset(data, data$cost>=2 & data$cost <= 10) # 총점기준 

plot(data$cost)
x <- data$cost
mean(x) 출력값 :  5.354032

평균이 극단치에 영향을 받는 경우 = 중위수(median) 대체 
median(x) 출력값 : 5.4
  

 

 

대표값 구하기 

 

생활비(cost) 변수 대상 대표값 구하기 

mean(x) 출력값 :  5.354032

median(x) 중위값 : 5.4

sort(x) # 오름차순(default) = decreasing = F

sort(x, decreasing = T) # 내림차순

 

 

생활비(cost) 변수 대상 사분위수 구하기

- quantile() : 분위별 결과 출력 

quantile(x, 1/4) # 1분위
-출력값- 
25% 
4.6 

quantile(x, 2/4) # 2분위
-출력값- 
50% 
5.4 

quantile(x, 3/4) # 3분위
-출력값- 
75% 
6.2 

quantile(x, 4/4) # 4분위
-출력값-
100% 
7.9 

 

 

 

 

산포도 구하기

 

생활비(cost) 변수 대상 산포도 구하기

var(x) # 분산
출력값: [1] 1.296826

sd(x)  # 표준편차
출력값 [1] 1.138783

# 분산 -> 표준편차
sqrt(var(x)) : 출력값 : [1] 110.3872

# 표준편차 -> 분산 
sd(x) ** 2 : 출력값 : [1] 12185.33

 

 

 

●  빈도 분석 

 

생활비(cost) 변수의 빈도분석과 시각화 

table(data$cost)

hist(data$cost) # 히스토그램 시각화
plot(data$cost) # 산점도 시각화 

hist(data$cost)

 

plot(data$cost)

 

 

연속형 변수 범주화 

data$cost2[data$cost >= 2 & data$cost < 4] <- 1
data$cost2[data$cost >= 4 & data$cost < 7] <- 2
data$cost2[data$cost >= 7] <- 3

x <- table(data$cost2)
barplot(x)
pie(x)

barplot(x)

pie(x)

 

 

 

5. 비대칭도 구하기 

 

- pakage 설치 및 데이터 정리

install.packages("moments")
library(moments)
cost <- data$cost
cost

 

왜도 - 평균을 중심으로 기울어진 정도. < skewness() >

skewness(cost) 출력값 :  [1] -0.297234

 

첨도 - 표준 정규 분포와 비교하여 얼마나 뽀족한가 측정 지표 < kurtosis()

kurtosis(cost) 출력값 : [1] 2.674163

 

hist(cost) - 기본 히스토그램

 

hist(cost, freq = F) - 히스토그램 확률밀도/표준 정규 분포 곡선

 

lines(density(cost), col='blue') - 히스토그램 확률밀도/표준 정규 분포 곡선

표준정규분포 곡선

x <- seq(0, 8, 0.1)
curve(dnorm(x, mean(cost), sd(cost)), col='red', add = T)

 

6. 패키지 기술 이용 통계량 구하기 

 

위 데이터를 활용하여 살펴보겠습니다. 

 

 

① Hmisc 패키지 이용 

 

 - Hmisc 패키지 설치

install.packages("Hmisc")
library(Hmisc)

 

전체 변수 대상 기술통계량 제공 - 빈도와 비율 데이터 일괄 수행(각 컬럼별로 계산해서 결과값을 출력)

describe(data) 

 

개별 변수 기술 통계량

describe(data$gender) # 특정 변수(명목) 기술통계량-범주/빈도수/비율 제공.

 

describe(data$age) # 특정 변수(비율) 기술통계량 - lowest / highest

 

 

② prettyR 패키지 이용 

 

- prettyR 패키지

install.packages("prettyR")
library(prettyR)

 

- 전체 변수 대상 

freq(data) # 각 변수별 : 빈도, 결측치, 백분율, 특징-소수점 제공 

 

- 개별 변수 대상

freq(data$gender) # 빈도, 결측치, 백분율

 

기술 통계


- 대표값 : 평균(Mean), 합계(Sum), 중위수(Median), 최빈수(mode), 사분위수(quartile) 등.
- 산포도 : 분산(Variance), 표준편차(Standard Deviation), 최소값(Minimum), 최대값(Maximum), 범위(Range) 등 
- 비대칭도 : 왜도(Skewness), 첨도(Kurtosis)

 

평균과 분산 그리고 표준변차 

 

평균 ( all/n : mean) 

score1 <- c(85, 90, 93, 86, 82)
score2 <- c(85, 90, 93, 46, 42)
score3 <- c(100, 100, 54, 50, 52)

# 평균 
mean(score1)  출력값: [1] 87.2 : 평균값
mean(score2)  출력값: [1] 71.2 : 평균값
mean(score3)  출력값: [1] 71.2 : 평균값

평균의 단점 : 데이터에 대한 분포도를 파악할 수 없습니다. 

 

- 산술평균 : 모든 값을 더한 후 값의 개수만큼 나눈 후 나오는 값을 의미

 

- 상승평균 : 상승평균/기하평균 : %로 평균 비율을 구할 때 방법

  ex) 회사의 연매출 10억 인 회사가 작년에 10% 성장 후 올해 2% 감소했다면 2년 평균 성장률은 어떻게 될까요?

      ans) squart(1.1*0.98) = 1.04 : 4% 성장

 

- 제곱평균 : 각 값의 제곱의 평균을 구한 후 루트를 적용해서 구하는 평균.

 

- 조화 평균 : 주로 평균 속도를 구할 때 사용하는 방법

   ex) 서울에서 강원도로 휴가는 가는데 갈 때는 안 막혀서 시속 100km로 갔는데, 올 때는 너무 막혀서 

        시속 60km였다면 왕복 평균 속력은 얼마일까요?

        ans) 조화 평균의 식 : 2xy / (x+y) = 2(100*60) / (100+60)

 

 

중앙값(median:중위수)

- 모든 데이터를 크기 순서대로 정렬시킨 후 가운데 있는 값을 의미

- 전체 개수가 짝수 일때는 중앙값 두개를 더하고 2로 나눈 수가 출력

score3 <- c(100, 100, 54, 50, 52)

median(score3) 출력값 :  54

- 데이터의 개수가 짝수 일때 (m + (m+1) /2) 
num <- c(6, 6, 7, 8, 9, 10)
median(num) 출력값 : 7.5

- 중위수 :  전체에서 2/4 의 수

- 1사분위 : 전체에서 1/4 위추에 오는 수 

- 3사분위 : 전체에서 3/4 위치에 오는 수 

 

 

표준편차(Standard Deviation:SD)

- 분산 값에 루트를 적용해서 제곱을 제거한 값

- 평균의 단점인 분포도를 파악할 수 없다는 것을 편차를 통해서 해결함

 

 

제곱평균(평균제곱) 

- 편차 값을 제곱해서 마이너스 값을 플러스 값으로 바꾼 후 평균을 구하는 방법

score <- c(100, 100, 54, 50, 52)
mean(score) 결과값 : 71.2

((100-71.2)^2+(100-71.2)^2+(54-71.2)^2+(50-71.2)^2+(52-71.2)^2) / 5 
결과값 : 554.56

 

분산(Variance) : 편차 값을 제곱해서 나온 값

 score1 <- c(85, 90, 93, 86, 82)
 mean(score1) 출력값 : 87.2
 
((85-87.2)^2+(90-87.2)^2+(93-87.2)^2+(86-87.2)^2+(82-87.2)^2)/5 
출력값 :  14.9

 

 

표준편차(Standard Deviation:SD) : 분산 값에 루트를 적용해서 제곱을 제거한 값

 

 

자유도(degree of freedom)

: 표본의 분산과 표준편차를 계산할 때 나누는 분모의 수를 (모집단-1)개로 계산하여 주어진 데이터에서 표본을 자유롭게 뽑을수 있는 경우의수를 의미하며, 표본을 추출해서 표본의 분산과 표준 편차를 계산할 때는 항상 자유도를 분모로 사용합니다. 

score1 <- c(85, 90, 93, 86, 82)
mean(score1) 출력값 : 87.2 

((85-87.2)^2+(90-87.2)^2+(93-87.2)^2+(86-87.2)^2+(82-87.2)^2)/5 = 14.9

var(score1)    # [1] 18.7 (4로 나눈 값(자유도))

 

 

표준화와 표준값 


1) 표준화 : 모든 값들의 표준값을 정해서 그 값을 기준으로 차이를 구해서 비교하는 방법


2) 표준값 = (각데이터 - 평균) / 표준편차 


3) 편차값 = 표준값 * 10 + 50

 

 

크롤링(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)

+ Recent posts