본문 바로가기
PYTHON

20200406 - R 파싱하여 데이터 가져오기, 웹 페이지 크롤링, 트리맵, 워드클라우드, 차트

by 낫싱 2020. 4. 6.
728x90
반응형

20200406.R
0.01MB
20200406-2.R
0.00MB
20200406-3.R
0.00MB
20200406-4.R
0.01MB
20200406-5.R
0.00MB
Data6_prj.zip
0.24MB

R 파싱하여 데이터 가져오기

 

##########################################

# 웹에서 문자열 가져오기

##########################################

# revest 패키지의 read_html("url");

 

# html 파싱

# 특정 노드의 데이터 가져오기

 

# 문자열에서 html_nodes(태그 또는 클래스 또는 아이디)를 이용하면 매개변수에 해당하는 모든 데이터를 가져온다.

# 마지막 데이터까지 가져온 경우 html_text() 메소드나 html_attr(속성명)을 이용해서

# 문자열로 가져오는 것이 가능.

 

##########################################

# 네이버(http://www.naver.com)

##########################################

install.packages("rvest")

library(rvest)

 

naver <- read_html("http://www.nvaer.com")

naver

 

# 테이블의 내용은 html_table() 메소드로 테이블의 데이터를 프레임으로 바로 변환해 준다.

# %>% 은 메소드의 연산결과를 가지고 다음 메소드를 호출할 때 사용하는 chain operation 연산자이다.

 

#########################################

# 네이버 팟 캐스트 크롤링

#########################################

 

# 크롤링을 할 때 가장 중요한 것은

# 원하는 부분을 구분할 수 있는 태그나 클래스 또는 아이디를 찾아내는 일이다.

 

# 고려해야 할 또 하나의 부분은 현재 페이지에 원하는 데이터가 있는지 아니면 링크만 존재하는지 확인하는 것.

 

# 1. 웹에서 데이터를 가져오기 위한 패키지 설치

install.packages("rvest")

 

# 2. 패키지 메모리 로드

library(rvest)

 

# 3. 문자열을 가지고 올 주소를 생성

url <- 'http://tv.naver.com/r/category/drama'

이미지 썸네일 삭제

Top100 : 네이버TV

동영상을 감상하는 가장 쉽고 빠른 방법

tv.naver.com

 

# 4. 문자열 다운로드

cast <- read_html(url)

 

# 5. 문자열 확인

cast

 

# 6. span 안에 내용들이 출력 ( 태그명 혹은 클래스명 등 크롤링해 올 부분을 확인해야 한다. )

craw <- cast %>% html_nodes(".tit") %>% html_nodes('span')

craw

 

# 7. tit 클래스 안에 있는 span 안에 내용 가져오기

craw <- cast %>% html_nodes(".tit") %>% html_nodes('span') %>% html_text()

craw

 

# 8. tooltip 태그 안의 내용 가져오기

craw <- cast %>% html_nodes("tooltip") %>% html_text()

craw

 

#########################

# 한겨레 신문에서 데이터를 검색한 후

# 검색 결과를 가지고 워드 클라우드 만들기

 

# 한겨레 신문사에서 지진으로 뉴스 검색하는 경우

# url

# http://search.hani.co.kr/Search?command=query&keyword=%EC%A7%80%EC%A7%84&sort=d&period=all&media=news

# http://search.hani.co.kr/Search?: Search 가 URL 패턴명 지정(서블릿에서 어노테이션 같은 역할)

# command, keyword, sort, period, media 는 파라미터명(수정 불가 값들)

# command=query& : query와 같이 형식이 정해진 애들은 수정할 수 없다.

# keyword=%EC%A7%80%EC%A7%84& : 검색어는 한글이 깨져서 들어갔기 때문에 원하는 검색어를 입력하면 된다.

# sort=d&

# period=all&

# media=news

# --> 검색한 기사를 가져올 경우, 실제 기사 원본 내부의 글자들이 필요하기 때문에 링크들에 관련된 주소를 다 뽑아와야 한다.

 

# http://search.hani.co.kr/Search?command=query&keyword="검색어입력부분"&sort=d&period=all&media=news

 

# 기사 검색이나 SNS 검색을 하는 경우

# 검색어를 가지고 검색하면 그 결과는 검색어를 가진 URL의 모임이다

# 기사나 SNS 글이 아니다

 

# ★ 검색결과에서 URL을 추출해서 그 URL의 기사 내용을 다시 가져와야 함(링크를 모두추출해서 링크에 다시 접속한 후 해당 기사 내용을 하나씩 모두 읽어온다.)

# ★ dt 태그안에 있는 a태그의 href 속성의 값이 실제 기사의 링크이다.

 

# 실제 기사에서 클래스가 text 안에 있는 내용이 기사 내용이다.

 

# 1. 기존의 변수를 모두 제거

rm(list=ls()) # R 스튜디오에 있는 모든 변수를 제거하는 함수 remove 함수

 

# 2. 필요한 패키지 설치

install.packages("stringr")

install.packages("wordcloud")

install.packages("KoNLP")

install.packages("dplyr")

install.packages("RColorBrewer")

install.packages("rvest")

 

#3. 필요한 패키지 로드

library(stringr) # 문자열 조작하는 전문 패키지

library(wordcloud) # 시각화작업 시 필요한 패키지

library(KoNLP) # 명사 추출과 같은 작업을 위한 사전을 포함하고 있는 패키지

library(dplyr) # 데이터프레임을 수정하거나 합하거나 하는 데이터프레임에 관련된 함수를 가진 패키지

library(RColorBrewer) # 색상과 관련된 패키지, 시각화작업에서 필요하다.

library(memoise) # mf <- 메모(f)는 f의 메모 사본인 mf를 작성한다.

# 메모된 복사본은 기본적으로 같은 기능의 더 게으른 버전이다.

# 즉, 새로운 호출의 답을 저장하고, 오래된 호출의 답을 다시 사용한다.

# 적절한 상황에서, 이것은 정말 멋진 속력을 낼 수 있다.

 

 

 

# 4. 웹에서 문자열을 가져와서 html 파싱을 하기 위한 패키지 로드

library(rvest) # 웹 페이지 크롤링 시 가장 기본적인 패키지

 

 

# 5. 기사 검색을 위한 url 생성

url <- 'http://search.hani.co.kr/Search?command=query&keyword=%EC%A7%80%EC%A7%84&sort=d&period=all&media=news'

# &media=news

# &media=magazine

# &media=common

 

# 6. url에 해당하는 데이터 가져오기

k <- read_html(url, encoding="utf-8") # url 에 있는 값을 UTF-8 방식으로 읽어와서 k변수에 저장

k

 

# 7. dt 태그 안에 있는 a 태그 들의 href 속성의 값을 가져오기

k <- k %>% # href 가 a태그 안에 있고, 기사 제목들에 관련된 a태그는 dt태그

html_nodes("dt") %>% # 내부에 있기 때문에 전체 페이지에서 %>% dt 시작태그와 닫는 태그를 모두 찾아온다.

html_nodes("a") %>% # 그 결과값을 다시 html_nodes 함수에 전달하면 dt 태그 사이에서 a 태그만 다시 추출

html_attr("href")

k

 

전송중...

사진 설명을 입력하세요.

# 8. k에 저장된 모든 URL 에 해당하는 데이터의 클래스가 text인 데이터를 읽어서 파일에 저장

# for(임시변수 in 컬렉션이름){}

# ★ 중요(페이지 내 기사 크롤링하는 방법)

for(addr in k){# 첫 번째 URL(k)을 꺼내서 addr 에 할당

temp <- read_html(addr) %>% html_nodes(".text") %>% # 그래서 그 주소로 다시 읽어들인다.(첫 번째 기사를 읽음) %>%

# 그 결과를 .text에 넘기면 클래스 속성값이 text인 것만 읽음

html_text()# 시작/끝태그가 text인 것만 읽어서 temp 에 저장

cat(temp, file="temp.txt", append=TRUE)# temp가 갖고있는 값을 temp.txt에다가 계속 추가하겠다.

}

# 다시 두번째를 읽어서 반복하고 temp.txt에 append 덧붙여서 쓰여진다. 그래서 계속 추가 추가 추가 반복

 

# 9. 파일의 모든 내용 가져오기

txt <- readLines("temp.txt")

head(txt)

 

# 10. 명사만 추출

useNIADic() # 세종사전보다 많은 단어 포함

nouns <- extractNoun(txt)# 명사들만 추출

nouns

 

전송중...

사진 설명을 입력하세요.

# 11. 빈도수 만들기 - 각 단어가 몇 번씩 나왔는지

wordcount <- table(unlist(nouns)) # 리스트를 풀어주는 함수 unlist

wordcount

class(wordcount) # table

 

# 12. 데이터프레임으로 변환

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

df_word

 

전송중...

사진 설명을 입력하세요.

class(df_word)# data.frame

 

# 13. 필터링

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

 

# 14. 워드클라우드 색상 판 생성

pal <- brewer.pal(8, "Dark2")

 

전송중...

사진 설명을 입력하세요.

# 15. 시드 설정

set.seed(1234)

 

# 16. 워드 클라우드 생성

wordcloud(words=df_word$Var1,

freq=df_word$Freq,

min.freq = 2, max.words = 200,

random.order= F,

rot.per = .1, scale=c(4,0.3),

colors=pal)

 

전송중...

검색어가 '지진'인 경우

 

전송중...

'코로나19'를키워드로 해서 추출한 결과


#######################################################동아일보 태그

# http://news.donga.com/search?p=1&query=코로나19&check_news=1&more=1&sorting=1&search_date=1&v1=&v2=&range=1

# http://news.donga.com/search?

# p=1&

# query=코로나19&

# check_news=1&

# more=1&

# sorting=1&

# search_date=1&

# v1=&

# v2=&

# range=1

 

url <- 'http://news.donga.com/search?p=1&query=코로나19&check_news=1&more=1&sorting=1&search_date=1&v1=&v2=&range=1'

 

k <- read_html(url, encoding="utf-8") # url 에 있는 값을 UTF-8 방식으로 읽어와서 k변수에 저장

k

 

# 7. dt 태그 안에 있는 a 태그 들의 href 속성의 값을 가져오기

k <- k %>% # href 가 a태그 안에 있고, 기사 제목들에 관련된 a태그는 dt태그

html_nodes(".txt") %>% # 내부에 있기 때문에 전체 페이지에서 %>% dt 시작태그와 닫는 태그를 모두 찾아온다.

html_nodes("a") %>% # 그 결과값을 다시 html_nodes 함수에 전달하면 dt 태그 사이에서 a 태그만 다시 추출

html_attr("href")

k

 

# 8. k에 저장된 모든 URL 에 해당하는 데이터의 클래스가 text인 데이터를 읽어서 파일에 저장

# for(임시변수 in 컬렉션이름){}

# ★ 중요(페이지 내 기사 크롤링하는 방법)

for(addr in k){

temp <- read_html(addr) %>% html_nodes(".article_txt") %>%

html_text()

cat(temp, file="temp2.txt", append=TRUE)

}

# 다시 두번째를 읽어서 반복하고 temp.txt에 append 덧붙여서 쓰여진다. 그래서 계속 추가 추가 추가 반복

 

# 9. 파일의 모든 내용 가져오기

txt <- readLines("temp2.txt")

head(txt)

 

# 10. 명사만 추출

useNIADic() # 세종사전보다 많은 단어 포함

nouns <- extractNoun(txt) # 명사들만 추출

nouns

 

# 11. 빈도수 만들기 - 각 단어가 몇 번씩 나왔는지

wordcount <- table(unlist(nouns)) # 리스트를 풀어주는 함수 unlist

wordcount

class(wordcount) # table

 

# 12. 데이터프레임으로 변환

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

df_word

class(df_word) # data.frame

 

# 13. 필터링

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

 

# 14. 워드클라우드 색상 판 생성

pal <- brewer.pal(8, "Dark2")

 

# 15. 시드 설정

set.seed(1234)

 

# 16. 워드 클라우드 생성

wordcloud(words=df_word$Var1,

freq=df_word$Freq,

min.freq = 2, max.words = 200,

random.order= F,

rot.per = .1,

scale=c(4,0.3),

colors=pal)

 

전송중...

쓸데없는 태그들 제거 필요

#########################################

# R 키보드를 이용한 데이터 입력

 

# c() 함수를 이용한 데이터 입력

# x <- c(10.4, 5, 6, 3.1, 6.4, 21.7)

# x

# [1] 10.4, 5.6, 3.1, 6.4, 21.7

 

# scan() 함수는 외부의 텍스트파일을 불러올 때 외에도 키보드 입력에도 이용할 수 있는 함수이며, 일반적으로 R Console 에서 프롬프트가

# [1]과 같이 보여지나, scan() 함수를 실행할 경우는 '1:'과 같은 형태로 출력된다.

 

# scan() 함수 이용

x <- scan()

 

# console 에서 입력

 

전송중...

사진 설명을 입력하세요.

x <- scan(what=" ")

# console에서 입력

 

전송중...

사진 설명을 입력하세요.

 

전송중...

사진 설명을 입력하세요.

# edit() 함수는 데이터 편집기 창을 직접 띄워

# 데이터를 직접 입력하는 방식으로

# 편집기는 셀의 형식을 띄고 있으며,

# 각 셀에 데이터를 입력한 후 수정할 경우는

# 메뉴에서 <편집> - <데이터 편집기>를 선택하여 수정할 수 있다.

 

# edit() 함수를 이용하여 데이터 입력기를 호출한 후 데이터를 입력한다.

 

age = data.frame()

age = edit(age)

 

전송중...

사진 설명을 입력하세요.

age

 

전송중...

사진 설명을 입력하세요.

library(KoNLP)

library(wordcloud)

library(stringr)

 

useSejongDic()

 

전송중...

사진 설명을 입력하세요.

########################################정규표현식################################

[[:digit:]] 숫자 패턴 0,1,2,3,4,5,6,7,8,9 ( [0-9] 와 \d 동일 )

[[^0-9]] 숫자가 아닌 패턴 (\D 와 동일)

[[:lower:]] 영문 소문자 패턴

[[:upper:]] 영문 대문자 패턴

[[:alpha:]] 영문 패턴 (소 대 문자 구분X)

[^[:alpha:]] 영문이 아닌 패턴

[[:alnum:]] 영문&숫자 패턴 (* [[:alpha:][:digit:]] 대괄호로 감싸서 두 패턴 함께 이용 가능)

[[:blank:]] 간격 문자열 패턴(space & tab)

[[:space:]] 공백 문자열 패턴

[[:punct:]] 구두점 문자열 패턴 ! " # $ % & ’ ( ) * + , - . / : ; < = > ? @ [ ] ^ _ ` { | } ~.

[[:cntrl:]] \n \r 등의 제어 문자열 패턴

[가-핳] 한글 문자열 패턴

 

 

grep(pattern, text, value=F)

R 내장 함수이며 문자열 원소를 갖는 vector를 다루는데 사용하며

이는 특정 pattern을 갖는 원소를 vector가 리턴.

value=T 일때는 그 문자열이 리턴되며

FALSE 일때는 해당 문자열의 벡터 내 인덱스가 리턴.

 

 

gsub(pattern, replacement, text)

grep가 특정 패턴을 지닌 원소를 찾는 함수라면

gsub은 벡터 내에 존재하는 원소에서 패턴을 찾아내고

그 패턴을 replacement인자에 전달한 문자로 변환해 주는 역할을 하는 함수.

 

 

 

예)

 

text<-c("phone: 010-1234-5678","home: 02-123-1234","이름: 홍길동")

 

grep("[[:digit:]]", text, value=T)

[1] "phone: 010-1234-5678" "home: 02-123-1234"

 

gsub("[[:digit:]]", "x", text)

[1] "phone: xxx-xxxx-xxxx" "home: xx-xxx-xxxx"

[3] "이름: 홍길동"

 

# 한글 문자열분석에서 매우 중요한 정규표현식.

grep("[가-핳]", text, value=T)

[1] "이름: 홍길동"

 

grep("[[:lower:]]", text, value=T)

[1] "phone: 010-1234-5678" "home: 02-123-1234"

 

 

gsub("^[1-9][0-9]*$",

" ",

c("08","1","19 189","78"))

#---------------------------------------

# [1] "08" " " "19 189" " "

 

 

gsub("^[0-9]+(\\.[0-9]{1,2})?$",

"zz",

c("123","123.17","123.456","123.","12.79"))

#-------------------------------------------------

# [1] "zz" "zz" "123.456" "123." "zz"

 

gsub("^(0|[1-9][0-9]*)$",

"qwe"

,c("123","0123","789789789","0"))

#-------------------------------------------------

# [1] "qwe" "0123" "qwe" "qwe"

################################################################################

#정규표현식 예

text <- c("phone:010-1234-5678",

"home:02-123-1234",

"이름:홍길동")

 

전송중...

사진 설명을 입력하세요.

 

grep("[[:digit:]]",text, value=T) # ■ 텍스트라는 변수가 가진 것 중 숫자들이 포함된것들만 추출해달라 : grep 함수

 

전송중...

사진 설명을 입력하세요.

 

gsub("[[:digit:]]","x",text) # 숫자부분을 x 표시로 바꿔달라고 요청

 

전송중...

사진 설명을 입력하세요.

# ★한글 문자열분석에서 매우 중요한 정규표현식.★ 한글만 크롤링

grep("[가-힣]", text, value=T)

 

전송중...

사진 설명을 입력하세요.

 

# 영문 소문자가 포함된 것들만 출력 요청

grep("[[:lower:]]", text, value=T)

 

전송중...

사진 설명을 입력하세요.

 

# 정수로 쓴 표현만 인식

# 1~9로 시작하는 숫자로 되어있는 애들을 " "로 교체하라는 의미

gsub("^[1-9][0-9]*$", " ", c("08","1","19 189", "78"))

 

전송중...

사진 설명을 입력하세요.

# 소수점 넣는 방법

gsub("^[0-9]+(\\.[0-9]{1,2})?$",

"zz",

c("123","123.17","123.456","123.","12.79"))

 

전송중...

사진 설명을 입력하세요.

 

# 블로거들이 추천하는 서울 명소 분석하기

# "seoul_go.txt" 파일을 사용하여 블로거들이 추천하는 서울 명소들을 워드 클라우드로 생성

# (서울 명소추가: 서울명소merge.txt)

# (제거단어 : 서울명소gsub.txt)

 

# setwd("c:\\r_temp")

# 필요 패키지를 설치하는데 이미 설치가 되어 있어서 경고가 나오니 무시하세요.

install.packages("KoNLP")

install.packages("wordcloud")

install.packages("stringr")

 

 

library(KoNLP)

library(wordcloud)

library(stringr)

 

useSejongDic()

 

# 사전에 추가시키려면 반드시 데이터프레임으로 되어있어야 한다.

# ncn은 형태소를 보면 위치값 key들이 다 들어 있다.(일반명사 들어가는 위치값, 고유명사 들어가는 위치값 등)

mergeUserDic(data.frame(readLines("./Data6_prj/서울명소merge.txt"),"ncn"))

txt <- readLines("./Data6_prj/seoul_go.txt")

 

place <- sapply(txt,extractNoun,USE.NAMES = F)

 

head(place,10)

 

전송중...

사진 설명을 입력하세요.

head(unlist(place),30)

 

전송중...

사진 설명을 입력하세요.

 

c <- unlist(place)

 

전송중...

사진 설명을 입력하세요.

res <- str_replace_all(c, "[^[:alpha:]", "")#알파벳으로 된 것들을 공백없는것으로 바꿔치기

 

전송중...

사진 설명을 입력하세요.

 

txt <- readLines("./Data6_prj/서울명소gsub.txt")

txt

 

전송중...

사진 설명을 입력하세요.

cnt_txt <- length(txt)

cnt_txt

 

전송중...

사진 설명을 입력하세요.

for( i in 1:cnt_txt){

res <- gsub((txt[i]),"",res)

}

 

전송중...

사진 설명을 입력하세요.

 

res2 <- Filter(function(x) {nchar(x)>=2},res)

nrow(res2)

 

write(res2, "./result_files/seoul_go2.txt")

 

전송중...

사진 설명을 입력하세요.

 

res3 <- read.table("./result_files/seoul_go2.txt")

 

wordcount <- table(res3)

 

전송중...

사진 설명을 입력하세요.

head(sort(wordcount, decreasing = T),30)

 

전송중...

사진 설명을 입력하세요.

library(RColorBrewer)

palete <- brewer.pal(8,"Set2")

 

wordcloud(names(wordcount),

freq=wordcount,

scale=c(3,1),

rot.per = 0.25,

min.freq = 5,

random.order= F,

random.color= T,

colors = palete)

 

 

전송중...

사진 설명을 입력하세요.

 

legend(0.3,

1,

"블로거 추천 서울 명소 분석",

cex=0.6,

fill=NA,

border=NA,

bg="white",

text.col="red",

text.font=2,

box.col="red")

 

전송중...

위에 숨음(제목 다는 방법)


###############################################################

# "제주도 여행코스 추천" 검색어 결과를 그래프로 표시

###############################################################

# 단어 추가(제주도여행지.txt)를 읽어들인 후, dataframe 으로 변경하여 기존 사전에 추가.

# 데이터 읽어오기 (jeju.txt)

# 한글 외 삭제, 영어

# 읽어들인 데이터로부터 제거할 단어 리스트 읽어오기(제주도 여행코스gsub.txt)

# 두 글자 이상인 단어만 추출

# 현재까지의 작업 파일을 파일로 저장 후, 저장된 파일 읽기

# 단어 빈도 수 구한 후, 워드 클라우드 작업

###############################################################

# 가장 추천 수가 많은 상위 10개를 골라서

# 1. pie 그래프로 출력

# 2. bar 형태의 그래프로 표시하기

# 3. 옆으로 누운 바 그래프 그리기

# 4. 3D Pie Chart 로 표현(plotrix 라는 패키지가 추가로 필요)

 

rm(list=ls()) # R 스튜디오에 있는 모든 변수를 제거하는 함수 remove 함수

 

# 필요 패키지를 설치하는데 이미 설치가 되어 있어서 경고가 나오니 무시하세요.

install.packages("KoNLP")

install.packages("wordcloud")

install.packages("stringr")

 

library(KoNLP)

library(wordcloud)

library(stringr)

 

useSejongDic()

 

# 사전에 추가시키려면 반드시 데이터프레임으로 되어있어야 한다.

# ncn은 형태소를 보면 위치값 key들이 다 들어 있다.(일반명사 들어가는 위치값, 고유명사 들어가는 위치값 등)

mergeUserDic(data.frame(readLines("./Data6_prj/제주도여행지.txt"),"ncn"))

 

txt <- readLines("./Data6_prj/jeju.txt")

head(txt)

 

c <- unlist(place)

res <- str_replace_all(c, "[^[:alpha:]]", "") #알파벳으로 된 것들을 공백없는것으로 바꿔치기

 

place <- sapply(txt,extractNoun,USE.NAMES = F)

place <- gsub(" ","", place)

 

txt <- readLines("./Data6_prj/제주도여행코스gsub.txt")

txt

cnt_txt <- length(txt)

cnt_txt

 

for( i in 1:cnt_txt){

res <- gsub((txt[i]),"",res)

}

 

res2 <- Filter(function(x) {nchar(x)>=2},res)

nrow(res2)

 

write(res2, "./result_files/jeju2.txt")

 

res3 <- read.table("./result_files/jeju2.txt")

 

wordcount <- table(res3)

head(sort(wordcount, decreasing = T),30)

 

library(RColorBrewer)

palete <- brewer.pal(8,"Set2")

 

wordcloud(names(wordcount),

freq=wordcount,

scale=c(3,1),

rot.per = 0.25,

min.freq = 5,

random.order= F,

random.color= T,

colors = palete)

 

#####################차트그리기

# head(상위 10개 추출) 여행지 탑텐 저장(df)

top10 <- head(sort(wordcount, decreasing = T),10)

 

pie(top10, col=rainbow(10), radius=1, init.angle = 90, main = "여행 추천지 top 10")

 

전송중...

사진 설명을 입력하세요.

# 수치값을 함께 출력하기

# 출력값 계산

pct <- round(top10/sum(top10) *100, 1)

names(top10)

 

# 지명과 계산 결과를 합하기

lab <- paste(names(top10), "\n", pct, "%")

# 퍼센트 값 붙은 파이차트 출력하기

pie(top10, col=rainbow(10), cex=0.8, labels=lab, init.angle = 90, main = "여행 추천지 top 10")

 

전송중...

사진 설명을 입력하세요.

# bar 형태의 그래프 표시하기

bchart <- head(sort(wordcount, decreasing = T),10)

bchart

 

전송중...

사진 설명을 입력하세요.

bp <- barplot(

bchart,

main="제주도 추천 여행 코스 TOP 10",

col = rainbow(10),

cex.names=0.7,

las=2, # las : 라벨을 옆으로 눕혀주는 아이

ylim=c(0,25)

)

 

전송중...

사진 설명을 입력하세요.

# 출력값 계산

pct <- round(bchart/sum(bchart)*100, 1) # 1은 첫 번째 자리수 까지 출력

 

# 수치값 출력하기(%)

text(x = bp,

y = bchart * 1.05,

labels = paste("(",pct,"%",")"),

col = "black",

cex = 0.7)

 

전송중...

사진 설명을 입력하세요.

# 수치값 출력하기 (건)

text(x = bp,

y = bchart*0.95,

labels = paste(bchart, "건"),

col = "black",

cex = 0.7)

 

전송중...

사진 설명을 입력하세요.

# 가로로 누워진 bchart

barplot(bchart,

main="제주도 추천 여행 코스 TOP10",

col = rainbow(10),

xlim=c(0,25),

cex.name=0.7,

las=1,

horiz=T)

 

전송중...

사진 설명을 입력하세요.

# 수치값 출력하기 (%)

text(y = bp,

x = bchart*1.15,

labels = paste("(",pct,"%",")"),

col="black",

cex=0.7)

 

전송중...

사진 설명을 입력하세요.

# 수치값 출력하기(건)

text(y = bp,

x = bchart*0.9,

labels = paste(bchart,"건"),

col="black",

cex=0.7)

 

전송중...

사진 설명을 입력하세요.

# 3D Pie Chart 로 표현(plotrix 라는 패키지가 추가로 필요)

#

install.packages("plotrix")

library(plotrix)

#-----------------------------

# 수치값을 함께 출력하기

# 출력값 계산

th_pct <- round(bchart/sum(bchart)*100,1)

 

# 지명과 계산 결과를 합치기

th_names <- names(bchart)

th_labels <- paste(th_names,"\n","(", th_pct,")")

 

pie3D(bchart,

main="제주도 추천 여행 코스 TOP 10",

col=rainbow(10),

cex=0.3,

labels=th_labels,

explode=0.05)

 

전송중...

사진 설명을 입력하세요.


######################################################################

# 서대문구에 치킨집이 많은 동은?

# 동별 치킨집 분포를 한눈에 파악할 수 있도록

# 트리 맵을 사용하여 시각화

 

######################################################################

# 1. 업종별 데이터 다운로드 및 기초 가공

 

# LOCALDATA 웹 사이트

# http://www.localdata.kr

# 지방자치단체에서 인허가한 업종별 데이터를 제공

# 문화, 체육, 관광, 식품 등 11가지 분야의 다양한 데이터 검색 가능.

######################################################################

 

#---------------------------------------------------------------------

# 불필요한 데이터 제거.

#---------------------------------------------------------------------

# 1. "6110000_서울특별시_07_24_04_P_일반음식점.xlsx" 파일

# 2. 서대문구 치킨집 데이터 확인.

# 3. 주소 : 서대문구, 업태 : 호프/통닭인 데이터만 남기기

 

######################################################################

# 2. 데이터 가공 및 트리 맵 표현

 

# 동별 분포를 확인하기 위해 소재지 전체 주소열에서

# 동별 업소 개수를 확인 후,

# Rstudio 에서 추가로 가공하여 트리 맵을 이용한 시각화

######################################################################

 

#==================================

# 소재지 전체 주소 가공하기.

#==================================

# 우선 전체 주소를 가공하여 동을 파악.

 

#---------------------------------------------------------------------

# 1. readxl 패키지를 로드하여 xlsx 파일 읽어오기

# setwd("c:/rStudy")

 

# install.packages("readxl")

library(readxl)

 

ck <- read_xlsx("./Data6_prj/치킨집_가공.xlsx")

head(ck)

 

전송중...

사진 설명을 입력하세요.

 

#---------------------------------------------------------------------

# 2. '소재지 전체주소' 열에서 'XXX동'만 남기고

# 이후 상세 주소 삭제 ...

 

# substr(데이터, 시작위치, 끝위치)

# substr() 함수를 사용하여

# '서울특별시 서대문구' 다음 글자인 12번째 글자부터

# 'XXX동' 까지 포함되도록 15번째 글자 까지를 잘라내기

# 예) 남가좌동

 

names(ck) # "소재지전체주소" "사업장명"

 

# '소재지전체주소' 열에서 12번째 글자부터 16번째 앞 글자까지를 추출

addr <- substr(ck$소재지전체주소,12,16)

 

head(addr)

 

#---------------------------------------------------------------------

# 3. 동 이름이 3글자와 4글자 인 경우가 있어

# 3글자인 경우"창천동 5"와 같이 숫자가 포함.

 

# gsub("어떤 글자를", "무엇으로", "어디에 있는")

# gsub() 함수를 이용하여 공백과 숫자를 제거.

#

 

# 숫자 제거

addr_num <- gsub("[0-9]", "", addr)

addr_num

 

전송중...

사진 설명을 입력하세요.

# 공백 제거

addr_trim <- gsub(" ", "", addr_num)

head(addr_trim)

 

전송중...

사진 설명을 입력하세요.

#==================================

# 동별 업소 개수 확인.

#==================================

# 동별 개수를 확인하여 트리맵으로 표현할 준비 작업.

 

# table() : 변수 개수를 확인하기 위한 함수

# 사용 형식 : table(데이터 셋1, 데이터 셋2)

# 데이터의 옵션 값이 1개면 도수분포도를 만들고,

# 2개면 교차표를 생성.

 

# 도수분포표 : 항목별 개수를 나타낸 것.(동별 개수를 파악)

# 교차표 : 2가지 변수에서 항목간 빈도를 파악할 수 있도록 작성한 표

 

 

#---------------------------------------------------------------------

# 1. table()함수를 사용하여 도수분포도를 생성.

# 2. 이를 dplyr 패키지의 %>% 연산자로 연결

# 3. data.frame() 하수를 이용하여 데이터 프레임으로 반환.

 

# install.packages("dplyr")

library(dplyr)

 

# table() 함수를 이용해서 숫자 세기.

# 변수가 한개일 때 도수분포표를 만들어줌

 

# addr_trim이 table로 가서 factor 가 만들어지고 data.frame으로 가서 df로 변환

addr_count <- addr_trim %>% table() %>% data.frame()

head(addr_count)

 

전송중...

사진 설명을 입력하세요.

 

# 트리맵으로 표현

#==================================

# treemap 패키지에 있는

# treemap() 함수를 이용하여 시각화.

#

# 사용 형식 :

# treemap(데이터 셋, index=구분 열,

# vSize = 분포열,

# vColor = 색상, title=제목)

 

# treemap(데이터 셋, index=인덱스 표시 열 제목,

# vSize=크기를 이용할 열 제목,

# vColor=컬러, title=제목)

 

 

#---------------------------------------------------------------------

# 1. "treemap" 패키지 설치 및 로드

install.packages("treemap")

library(treemap)

 

#------------------------------------------------------------------

# 2. 동이름 열(.)과 치킨집 개수열(Freq)로 트리맵 시각화.

treemap(addr_count,

index=".",

vSize="Freq",

title="서대문구 동별 치킨집 분포")

 

전송중...

사진 설명을 입력하세요.

# https://learnr.wordpress.com/: R 배우기 사이트 (원하는 시각화 자료 설명 및 찾기 등등등등등등등)


 

############################################################

# 서울시 주요 구의 의원 현황을 한꺼번에 보여주기

# 건강보험 심사평가원 홈페이지에서 다운로드 받은

# "2013년_서울_주요구별_병원현황.csv"파일을 사용해서

# 서울시 주요 구의 의원 현황을 아래 예시와 같이 각 구별로 나누어서 출력

 

data1 <- read.csv("./Data6_prj/2013년_서울_주요구별_병원현황.csv", header=T)

 

data1

 

전송중...

사진 설명을 입력하세요.

# 새로운 출력 디바이스 생성

dev.new() # 그려진 차트는 이제 여기에 생성

 

전송중...

사진 설명을 입력하세요.

# 필요한 데이터를 각각의 변수에 할당

v1 <- data1[1:9, 2] * 0.1 #강남구 값

v2 <- data1[1:9, 3] * 0.1 #강동구 값

v3 <- data1[1:9, 4] * 0.1 #강서구 값

v4 <- data1[1:9, 5] * 0.1 #관악구 값

v5 <- data1[1:9, 6] * 0.1 #구로구 값

v6 <- data1[1:9, 7] * 0.1 #도봉구 값

v7 <- data1[1:9, 8] * 0.1 #동대문구 값

v8 <- data1[1:9, 9] * 0.1 #동작구 값

v9 <- data1[1:9, 10] * 0.1 #마포구 값

v10 <- data1[1:9, 11] * 0.1 #서대문구 값

 

# 2행 5열로 그래프 배치하기

# 실제 그래프는 표현 안됨.

par(mfrow=c(2,5))

 

name <- data1$표시과목

name

 

전송중...

사진 설명을 입력하세요.

 

#강남구 그래프 그리기

gangnam <- barplot(as.matrix(v1),

main="강남구 병원 현황",

beside=T,

axes=F,

ylab="병원수(단위:10개)",

xlab="",

cex.names=0.85,

las=2,

ylim=c(0,40),

col=rainbow(8),

border="white",

names.arg=name)

 

axis(2,ylim=seq(0,35,10)) #y축 생성

abline(h=seq(0,35,5),lty=2) # base line 생성

 

#강동구 그래프 그리기

gangdong <- barplot(as.matrix(v2),

main="강동구 병원 현황",

beside=T,

axes=F,

ylab="병원수(단위:10개)",

xlab="",

cex.names=0.85,

las=2,

ylim=c(0,40),

col=rainbow(8),

border="white",

names.arg=name)

axis(2,ylim=seq(0,35,10)) #y축 생성

abline(h=seq(0,35,5),lty=2) # base line 생성

 

#강서구 그래프 그리기

gangseo <- barplot(as.matrix(v3),main="강서구 병원 현황",beside=T,axes=F,ylab="병원수(단위:10개)",xlab="",

cex.names=0.85,las=2,ylim=c(0,40),col=rainbow(8),border="white",names.arg=name)

axis(2,ylim=seq(0,35,10)) #y축 생성

abline(h=seq(0,35,5),lty=2) # base line 생성

 

#관악구 그래프 그리기

gwanak <- barplot(as.matrix(v4),main="관악구 병원 현황",beside=T,axes=F,ylab="병원수(단위:10개)",xlab="",

cex.names=0.85,las=2,ylim=c(0,40),col=rainbow(8),border="white",names.arg=name)

axis(2,ylim=seq(0,35,10)) #y축 생성

abline(h=seq(0,35,5),lty=2) # base line 생성

 

#구로구 그래프 그리기

guro <- barplot(as.matrix(v5),main="구로구 병원 현황",beside=T,axes=F,ylab="병원수(단위:10개)",xlab="",

cex.names=0.85,las=2,ylim=c(0,40),col=rainbow(8),border="white",names.arg=name)

axis(2,ylim=seq(0,35,10)) #y축 생성

abline(h=seq(0,35,5),lty=2) # base line 생성

 

#도봉구 그래프 그리기

dobong <- barplot(as.matrix(v6),main="도봉구 병원 현황",beside=T,axes=F,ylab="병원수(단위:10개)",xlab="",

cex.names=0.85,las=2,ylim=c(0,40),col=rainbow(8),border="white",names.arg=name)

axis(2,ylim=seq(0,35,10)) #y축 생성

abline(h=seq(0,35,5),lty=2) # base line 생성

 

#동대문구 그래프 그리기

dongdaemoon <- barplot(as.matrix(v7),main="동대문구 병원 현황",beside=T,axes=F,ylab="병원수(단위:10개)",xlab="",

cex.names=0.85,las=2,ylim=c(0,40),col=rainbow(8),border="white",names.arg=name)

axis(2,ylim=seq(0,35,10)) #y축 생성

abline(h=seq(0,35,5),lty=2) # base line 생성

 

#동작구 그래프 그리기

dongjak <- barplot(as.matrix(v8),main="동작구 병원 현황",beside=T,axes=F,ylab="병원수(단위:10개)",xlab="",

cex.names=0.85,las=2,ylim=c(0,40),col=rainbow(8),border="white",names.arg=name)

axis(2,ylim=seq(0,35,10)) #y축 생성

abline(h=seq(0,35,5),lty=2) # base line 생성

 

#마포구 그래프 그리기

mapo <- barplot(as.matrix(v9),main="마포구 병원 현황",beside=T,axes=F,ylab="병원수(단위:10개)",xlab="",

cex.names=0.85,las=2,ylim=c(0,40),col=rainbow(8),border="white",names.arg=name)

axis(2,ylim=seq(0,35,10)) #y축 생성

abline(h=seq(0,35,5),lty=2) # base line 생성

 

#서대문구 그래프 그리기

seodaemoon <- barplot(as.matrix(v10),main="서대문구 병원 현황",beside=T,axes=F,ylab="병원수(단위:10개)",xlab="",

cex.names=0.85,las=2,ylim=c(0,40),col=rainbow(8),border="white",names.arg=name)

axis(2,ylim=seq(0,35,10)) #y축 생성

abline(h=seq(0,35,5),lty=2) # base line 생성

 

###############################################################################

savePlot("./result_files/hospital2.png", type="png")

 

전송중...

사진 설명을 입력하세요.


library(KoNLP)

library(wordcloud)

library(stringr)

# 야구 선수별 연봉 대비 출루율 분석(밥값여부 계산)

# R을 활용한 데이터 시각화

kbo <- read.csv("./Data6_prj/야구성적.csv", header=T)

head(kbo)

View(kbo)

 

riceprice <- kbo[1:25,21]

View(riceprice)

name <- kbo$선수명

 

########

dev.new()

 

 

ricevalue <- barplot(as.matrix(riceprice),

main="밥값현황",

beside=T,

axes=F,

ylab="연봉대비출루율(%)",

xlab="",

cex.names=0.85,

las=2,

ylim=c(0,55),

col=rainbow(8),

border="white",

names.arg=name)

 

axis(2,ylim=seq(0,50,10)) #y축 생성

abline(h=seq(0,50,5),lty=2) # base line 생성

 

text(x = ricevalue,

y = riceprice * 1.05,

labels = paste("(",riceprice,"%",")"),

col = "black",

cex = 0.7)

 

전송중...

사진 설명을 입력하세요.

 

 

728x90
반응형

댓글