• R-7 2020.09.05
  • R-5 2020.09.05
반응형

#구글 스프레드시트 ->개인에서 누러기->내용추가->파일->업로드->
잴위에 x라는 열이름이 생긴다.

open map
install.packages("ggmap")
library(ggmap)
library(ggplot2)
library(dplyr)
library(rvest)#read_html

html.airports <- read_html("https://en.wikipedia.org/wiki/List_of_busiest_airports_by_passenger_traffic")
html.airports
df <- html_table(html_nodes(html.airports, "table")[[1]],fill= T) #[[]]list중에서 첫번째것 
#html_table 표 가지로 가는 것 
#html_nodes 노드 가지로 가는 것 

head(df)
head(df$Airport)
colnames(df)
colnames(df)[6] <- "total" #있으면 보여주고 없으면 만들어준다.
df$total
df$total <- gsub(',','',df$total)#정규표현식 할떄 나오는 것 g는 global하는 것 
#전부다 대체 하는 것이다. ,를 찾아서 ''으로 대체 한다.
df$total <- as.numeric(df$total)#character->숫자로 바꾸는 것 
df$total
#df$total <- as.double(df$total,5)
#df$total
typeof(df$total)

df <- head(df,10)
df
write.csv(df$Airport,file="geoname.csv")#공항이름으로 구글에 들어가는 방법을 진행하고 있습니다.
#geoname.csv읽어오면 캐리터는 글자로 일지 않고 글자는 범주로 읽어온다.

숫자를 글자로 인식하고 ->범주로 인식한다.
string ->factor로 받아들인다.
그래서 factor->as.character->numeric으로 바꾼다.

#구글 스프레드시트 ->개인에서 누러기->내용추가
geo <- read.csv("geoname - geoname.csv",stringsAsFactors = F)#문자를 factor로 하는 것이 아니라 chr로 읽어 온다.
geo
geo <- na.omit(geo) 
str(geo)

#아래 방법을 사용하는게 좋다.
library(readr)
geo <- read_csv("geoname - geoname.csv")
str(geo)

getwd()

#구글 스프레드시트 ->개인에서 누러기->내용추가
geo <- read.csv("geoname - geoname.csv")
geo
geo <- na.omit(geo) # geo <- geo[-1,]
geo

df <- cbind(df, lat = geo$Latitude, lot = geo$Longitude)
install.packages("maps")
library(maps)
world <- map_data("world")
world
#install.packages("reprex")
#library(reprex)

str(df)
dplyr::glimpse(df)
str(df)
#소수점 빼기 -1
df$lot <- as.numeric(as.character(df$lot))# Factor범주형이기때문에 
df$lat <- as.numeric(as.character(df$lat))
#소수점 빼기 -2 #안됨 숫자만 가능함 
#round(df$lat, digits = 5) 
df

as.numeric(df$lot)#1,2,3,4,5 이런식으로 나온다.
df$lot
as.double(df$lot,-5)
head(world,6)
head(df)
format(round(df$lot, 5), nsmall = 5)
str(world)

ggplot(df, aes(x = lot, y = lat))+
  geom_polygon(data = world, aes(x = long, y =lat, group = group ), fill="grey75", color="grey70")+
  geom_point(data = df, color = rainbow(10), alpha = .25, aes(size= total))+
  geom_point(data = df, color = rainbow(10), alpha = .75, shape = 1, aes(size = total))+
  geom_segment(data = df, aes(x =lot, y = lat,xend = lot, yend = lat, colour = Airport ))

 

numeric->하면 아래 너무 많이 짜른다.

#twitter
----------------------------twitee----------
load("Obama.rda")
load("Trump.rda")

save(tweets_Obama,file="Obama.rda")
save(tweets_Trump,file="Trump.rda")
tweets_Obama
tweets_Trump
View(tweets_Trump)
library(twitteR)

#tweets_Trump <- searchTwitter("Obama",lang="en",n =1000)
tweets_Obama <- twListToDF(tweets_Obama)#dataframe으로 바꿔주는 
Obama_text <- tweets_Obama$text#트위트 내용만 가져오기
Obama_text
head(Obama_text)
names(tweets_Obama)

tweets_Obama$text#이 열만 가져와서 하기 

Obama_text <- gsub("\\W"," ",Obama_text)#빈칸으로 바꿨습니다.W대문자 특수문자 바꾸는 것 
Obama_df <- as.data.frame(Obama_text)#다루기 편한 ggplot할때 는 dataframe의 형태로 바꿨다.
length(Obama_df)
length(Obama_text)

#Trump
#tweets_Trump <- searchTwitter("Trump,lang="en",n =1000)
tweets_Trump <- twListToDF(tweets_Trump)
Trump_text <- tweets_Trump$text
head(Trump_text)
names(tweets_Trump)

tweets_Trump$text

Trump_text <- gsum("\\W"," ", Trump_text)
Trump_df <- as.data.frame(Trump_text)

#단위를 뽑아서 사전을 만들었다.
#긍정적이면 3점 아니면 2점 
#hu.liu.pos = readLines('https://www.dropbox.com/sh/3xctszdxx4n00xq/AAA_Go_Y3kJxQACFaVBem__ea/positive-words.txt?dl=1');
#hu.liu.neg = readLines('https://www.dropbox.com/sh/3xctszdxx4n00xq/AABTGWHitlRZcddq1pPXOSqca/negative-words.txt?dl=1');


#1. url에서 가져오는 것 
hu.liu.pos = readLines('https://www.dropbox.com/sh/3xctszdxx4n00xq/AAA_Go_Y3kJxQACFaVBem__ea/positive-words.txt?dl=1');
hu.liu.neg = readLines('https://www.dropbox.com/sh/3xctszdxx4n00xq/AABTGWHitlRZcddq1pPXOSqca/negative-words.txt?dl=1');

sample=c("You're awesome and I love you","I hate and hate and hate. So angry. Die!","Impressed and amazed: you are peerless in your achievement of unparalleled mediocrity.")
result=score.sentiment(sample,hu.liu.pos,hu.liu.neg)
result

#2. 파일로 가져오는 것 
pos.word <- scan("positive-words.txt",what ="character",comment.char = ";")#scan으로 이파일을 읽는다.
neg.word <- scan("negative-words.txt",what ="character",comment.char = ";")
pos.word
neg.word

score.sentiment = function(sentences, pos.words, neg.words, .progress='none')
{
  require(plyr);
  require(stringr);
  scores = laply(sentences, function(sentence, pos.words, neg.words) {
    sentence = gsub('[^A-z ]','', sentence)
    sentence = tolower(sentence);
    word.list = str_split(sentence, '\\s+');
    words = unlist(word.list);
    pos.matches = match(words, pos.words);
    neg.matches = match(words, neg.words);
    pos.matches = !is.na(pos.matches);
    neg.matches = !is.na(neg.matches);
    score = sum(pos.matches) - sum(neg.matches);
    return(score);
  }, pos.words, neg.words, .progress=.progress );
  scores.df = data.frame(score=scores, text=sentences);
  return(scores.df);
}

Obama_scores <- score.sentiment(Obama_text, pos.word, neg.word, .progress = "text")
str(Obama_scores)
Obama_scores$score
hist(Obama_scores$score)

Trump_scores <- score.sentiment(Trump_text,pos.word, neg.word, .progress = "text")
Trump_scores$score
hist(Trump_scores$score)

#margin설정
#par(mar=c(2,4,2,2))#여백주는 함수

a <- dim(Obama_scores)[1]
b <- dim(Trump_scores)[1]

alls <- rbind(as.data.frame(cbind(type= rep("Obama",a), score = Obama_scores[,1])),
             as.data.frame(cbind(type= rep("Trupm",a), score = Trump_scores[,1])))
str(alls)
alls$score <- strtoi(alls$score)

library(ggplot2)
ggplot(alls, aes(x = score, color = type))+geom_density(size = 1)


nrow(Obama_scores)
nrow(Trump_scores)

#rbind #row로 묶어주는것 type열과 score이라는 열을 묶어준다.
#Obama 를 a= 1000번 복제하세요  score이라는 열을 잡아서 Obama_scores첫번째 열을 꺼내서 하는 것 
#str(Obama_scores)
#text가 범주형 
library(dplyr)
Obama_scores[,1]
str(alls)
distinct(alls$type)
str(as.character(alls$type))
n_distinct(as.character(alls$type))
distinct(as.character(alls$type))#오류 난다. 클래스 "character"의 객체에 적용된 'distinct_'에 사용할수 있는 메소드가 없습니다

4. 동적 시각화 
“plotly”는  Interactive 그래프를 그려주는 패키지 ggplot2로 완성된 그래프를 단순히 ggplotly( ) 에  넣으면 된다. 
https://plot.ly/r/

rCharts 는  자바스크립트 기반인 D3, Highcharts 를  R에서 그려주는 패키지. 
require(devtools) ; install_github('rCharts', 'ramnathv') 
googleVis google 에서 만든 Interactive 그래프를 그려주는 라이브러리 
https://plot.ly/->dash->dash

https://plot.ly/r/

 

Plotly R Graphing Library

Plotly's R graphing library makes interactive, publication-quality graphs. Examples of how to make line plots, scatter plots, area charts, bar charts, error bars, box plots, histograms, heatmaps, subplots, multiple-axes, and 3D (WebGL based) charts.

plotly.com

#-------------------------plotly-----------------

mpg
ggplot(data = mpg, aes(x = displ , y = cty, color = drv))+
  geom_point()+xlim(3,5)+ylim(10,25)#2차원 산점도
   
ggplot(data = mpg, aes(x = displ , y = cty, color = drv))+
  geom_point()

install.packages("plotly")
library(plotly)
p1 <- ggplot(data = mpg, aes(x = displ , y = cty, color = drv))+
  geom_point()
ggplotly(p1)

p2 <- ggplot(mpg, aes(x= class, fill= drv))+geom_bar()
ggplotly(p2)

p2 <- ggplot(mpg, aes(x= class, fill= drv))+geom_bar(position="dodge")#bar를 옆으로 펼쳐지는 것 position="dodge"
ggplotly(p2)

#google
#rCharts
install.packages("devtools")
library(devtools)

library(ggplot2)
install_github('ramnathv/rCharts')
install_github('saurfang/rCharts',ref= 'utf8-writelines')
library(rCharts)
hair_eye_male <- subset(as.data.frame(HairEyeColor),Sex =="Male")
nPlot(Freq ~ Hair , group ="Eye" ,data = hair_eye_male, type ="multiBarChart")
rPlot(mpg ~ wt | am + vs, data = mtcars, type ="point", color ="gear")#4개로 쪼개서 보기 좋게 보여준다.


mp3 <- Leaflet$new()
map3$setView(c(51.505, -0.09), zoom = 13)
map3$marker(c(51.5, -0.09),bindPopup ="<p> I am a popup </p>")#영국 
map3$marker(c(51.495, -0.083),bindPopup="<p> Hi~ </p>")
library(dplyr)
mp3 <- Leaflet$new()
mp3
map3$setView(c(37.532600, 127.024612), zoom = 13)
map3$marker(c(37.5, 127.0),bindPopup ="<p> I am a popup </p>")#영국 
map3$marker(c(51.495, -0.083),bindPopup="<p> Hi~ </p>")

m1 <- mPlot(x ="date" , y =c("psavert","uempmed"), type ="Line", data =economics)
m1$set(pointSize = 0, linewidth = 1)
m1


map3 <- Leaflet$new() 
map3$setView(c(51.505, -0.09), zoom = 13) 
map3$marker(c(51.5, -0.09), bindPopup = "<p> I am a popup </p>") 
map3$marker(c(51.495, -0.083), bindPopup = "<p> Hi~ </p>") 
map3
https://www.youtube.com/results?search_query=cs231n
https://www.youtube.com/results?search_query=cs230
https://www.youtube.com/results?search_query=3blue1brown

Google Map Api 활용한 지도 시각화
ggmap패키지2.7 버전설치하고인증키등록하기 
get_map() 함수 
◉ location 
- 불러올 지역의 중심을 ‘지역명’, ‘주소’, 또는 c(lon = 경도, lat = 위도) 처럼 위경도 좌표로 지정 
- Windows 사용자들은 ‘지역명’이나 ‘주소’를 한글로 지정하려면 반드시 enc2utf8() 함수를 이용하여 한글의 인코딩 방식을 UTF-8으로 변경 
◉ zoom 
- 2 ~ 21 사이의 정수를 입력. 숫자가 커질수록 확대된 지도가 출력. 예를 들어 3은 대륙(Continent), 10은 도시(City), 21은 건물 (Building) 크기
get_map() 함수 
◉ maptype 
- ‘terrain’, ‘terrain-background’, ‘satellite’, ‘roadmap’, ‘hybrid’, ‘toner’, ‘watercolor’ 중에서 하나를 지정 
◉ source 
- ‘google’, ‘osm’, ‘stamen’, ‘cloudmade’ 중 하나를 선택
get_map
myLocation->위성으로 
#leaflet은 인터랙티브한 지도를 구현할 수 있게 해주는 오픈소스 자바스크립트 라이브러리이다 
#R의 leaflet 패키지는 R에서 데이터를 가지고 쉽게 Leaflet 지도를 생성할 수 있게 해준 다 

 

install.packages("leaflet")
library(leaflet)
library(dplyr)
library(readxl)
library(stringx)

#http://www.weather.go.kr 접속한다.

1. [지진ㆍ화산] → 2. [국내지진 목록]
1. 날짜 지정(2009.01.01~2019.12.03) → 2. [검색하기] → 3. [엑셀 다운로드]
#다운받은 파일을 엑셀을 실행시켜 sheet가 몇 개인지 확인한다 
#워킹디렉토리에 넣은 후 불러오기한다 

eq <- read_xlsx('국내지진.xlsx')
View(eq)
# 북한을 제외한다
eq01 <- eq[grep("북한",eq$위치,invert = T),]
#eq01 <- eq[grep("북한",eq$위치,invert = F),]
#정규표현식 grep ("단어", 위치 , )
#invert = T북한행을 빼고 보여주는 것 
#invert = F북한행만 보여주는 것 
eq[grep("북한",eq$위치,invert = T),]
eq[grep("북한",eq$위치,invert = F),]
View(eq01)
# 위도, 경도 뒤의 불필요한 문자를 삭제한 후 숫자형으로 바꾸어 준다 
eq01$위도 <- str_replace(eq01$위도 , ' N','')#불필요한 부분 빼야 한다. 공백하고 N을 아무것도 없이 바꾼다.
eq01$위도 <- as.numeric(eq01$위도)#character을 numeric으로 바꾼다.
eq01$경도 <- str_replace(eq01$경도,' E','')
eq01$경도 <- as.numeric(eq01$경도)

str(eq01)

leaflet() %>% addTiles() %>% addMarkers(lng=eq01$경도, lat=eq01$위도, popup=paste0("발생시각 : ", eq01$발생시각, "<br/>위치: ", eq01$위치, "<br/>규모 : ", eq01$규모))

Kormaps2014 package
devtools::install_github("cardiomoon/kormaps2014") 
devtools::install_github("cardiomoon/moonBook2")
library(kormaps2014) 
library(moonBook2)

# http://www.localdata.kr 접속한다
# 1. 식품 → 2. 음식점 아이콘 아래의 [바로가기]
# 창 아래쪽으로 이동하여 [EXCEL] 클릭하여 파일을 다운로드한다

Tips
# 다운받은 파일을 열어보고 자료의 속성과 구조를 파악한다 
# 운영체제나 프로그램에 따라 한글인코딩 방식이 달라지므로 항상 유의한다(csv, txt 파일) 
# 객체를 생성할 때 가급적 간단하게 식별가능하게 정의 한다 
# 기존의 성공한 데이터를 이용하여 가공하도록 한다 
# 항상 데이터의 속성과 구조에 유의하여 가공을 하도록 한다 
# 데이터 가공할 때에 효율적으로 사용해야 한다(시간과 노력의 비용 염두) 
# 다양한 관점과 시각으로 접근하여 효율성을 높인다 
# 필요한 패키지가 설치되고 로드되어 있는지 확인한다 
엑셀은 sheet확인하기
2008년도 관악구 정보 확인해야 한다.

https://rpubs.com/cardiomoon/222145

 

devtools::install_github("cardiomoon/kormaps2014") 
devtools::install_github("cardiomoon/moonBook2")
library(kormaps2014) 
library(moonBook2)
areacode
korpop2 <- kormaps2014::korpop2
kormap1 <- kormaps2014::kormap1

korpop2
str(kormap1)#시 도 
str(kormap2)#구단위
str(kormap3)#동단위
str(korpop1)#invalid multibyte string, element 3
str(korpop2)#invalid multibyte string, element 3
str(korpop3)#invalid multibyte string, element 3
korpop2 <- changeCode(korpop2)#
korpop1 <- changeCode(korpop1)

library(ggplot2)
install.packages("mapproj")
library(mapproj)
library(dplyr)
theme_set(theme_gray(base_family = "NanumGothic"))
#https://wikidocs.net/41145
#2015년 인구총조사 중 “총인구_명”으로 단계구분도를 그리려면 다음과 같이 합니다.
kormap1
kormap1$lat
kormap1$long
str(kormap1)
ggplot(korpop1,aes(map_id= code, fill =총인구_명))+
  geom_map(map = kormap1, colour="black",size=0.1)+
  expand_limits(x= kormap1$long,y = kormap1$lat)+
  scale_fill_gradientn(colours = c('white','orange','red'))+
  ggtitle('2015년도 시도별 인구분포도')+coord_map()

#moonBook2패키지에 있는 ggChoropleth()함수를 이용하면
#훨씬 간편하게 단계구분도를 그릴 수 있습니다.
#다음은 시군구별, 읍면동별 단계구분도의 예제입니다.
#korpop2->kormap2로 하면서 남자_명으로 한다.
ggChoropleth(korpop2,kormap2,fillvar = "남자_명")

kormap3 <- kormaps2014::kormap3
korpop3 <- kormaps2014::korpop3
str(kormap3)
str(korpop3)
korpop3 <- changeCode(korpop3)
ggChoropleth(korpop3,kormap3,fillvar="주택_계_호")

area2code
str(korpop3)
str(kormap3)

areacode <- changeCode(areacode)
str(areacode)
ggChoropleth(korpop3,kormap3,fillvar="총인구_명",subarea=c("전라","광주"))

rm(list = ls())

remove.packages(c("ggiraphExtra", "tibble", "ggplot2"))
install.packages(c("ggiraphExtra", "tibble", "ggplot2"))
install.packages("devtools")
remove.packages(c("moonBook2"))
remove.packages(c("kormaps2014"))
library(kormaps2014) 
library(moonBook2)

ggChoropleth(korpop2,kormap2,fillvar="남자_명",interactive=TRUE)
ggChoropleth(korpop3, kormap3, fillvar = "남자_명",interactive= T,subarea=c("전라","광주"),tooltip="행정구역별_읍면동")

summary(tbc)
tbc1= tbc[tbc$year %in% c(2001,2005,2010,2015),]
ggChoropleth(tbc1,kormap1,fillvar="NewPts",facetvar="year",tooltip="name",interactive=T)

areacode

# 1. 식품 → 2. 음식점 아이콘 아래의 [바로가기]
# 창 아래쪽으로 이동하여 [EXCEL] 클릭하여 파일을 다운로드한다
install.packages('rlang') library(rlang) library(readxl) library(dplyr)
# 서울특별시 일반음식점 엑셀파일을 불러오기한다. 
seoulres<- read_excel("6110000_서울특별시_07_24_04_P_일반음식점.xlsx") View(seoulres)

# 엑셀프로그램으로 해당 파일을 열어 시트가 여러개인지 확인해야 한다
# 시트가 여러개일때 따로 따로 불러서 데이터를 합쳐야 한다 # 다시 시트별로 각각 불러 모은다 
seoulres01<- read_excel("6110000_서울특별시_07_24_04_P_일반음식점.xlsx", sheet = '일반음식점_1') 
seoulres02<- read_excel("6110000_서울특별시_07_24_04_P_일반음식점.xlsx", sheet = '일반음식점_2’)
# 두개의 데이터를 병합한다 seoulres03 <- rbind(seoulres01, seoulres02)
View(seoulres03)

str(seoulres03)

# 필요한 부분을 축출한다 
seoulch <- seoulres03 %>% filter(상세영업상태명 == '영업' & 위생업태명 %in% c('호프/통닭','통닭(치킨)'))
View(seoulch)

#열을 뽑는다.
# 어떤 변수를 활용할 것인가? 결측치가 적은 것을 택하자 
sum(is.na(seoulch$소재지우편번호))
sum(is.na(seoulch$소재지전체주소))

#1. 소재지전체주소 변수를 선택할 경우 해당변수의 결측치 제거 
seoulch01 <- na.omit(seoulch$소재지전체주소)
View(seoulch01)

# 문자열 함수 패키지를 로드한다. 
library(stringr)

# 정규식을 사용해서 '소재지전체주소'에서 '구명'만 추출한다. 
seoulch02 <- substr(seoulch01, 7, 10)#서울특별시 구로구 
#7->10자리 까지 뽑는다.
# 공백제거seoulch03 <- gsub(" ", "", seoulch02) 
seoulch02
seoulch03 <- gsub(" ","",seoulch02)#공백을 없앤다.
View(seoulch03)
unique(seoulch03)

# 필요없는 문자 제거 
seoulch04 <- str_replace_all( seoulch03, "[을충신필명중오인남다수북흥회쌍입광정저순만황초서장태주무산]","")
View(seoulch04)
str(seoulch03)
names(seoulch03)

#중구행만을 따로 떼고 가공한 후 다시 새로 붙여보자 
# 중구행만을 축출하자
seoulchch <- seoulch03[276:616]
View(seoulchch)
unique(seoulchch)

# 중구 뒤에 나오는 글자를 삭제하자 
seoulchch01 <- substr(seoulchch, 1,2)
View(seoulchch01)
unique(seoulchch01)

# 중구행을 삭제하여 새로 가공된 중구행을 결합할 준비를 하자
seoulch05 <- seoulch03[-(276:616)]
View(seoulch05)
unique(seoulch05)

# 가공된 중구행을 붙인다 
seoulch06 <- c(seoulchch01,seoulch05)
View(seoulch06)
unique(seoulch06)

# 구별로 빈도수를 구한다 
seoulch06 <- table(seoulch06)
View(seoulch06)
seoulch06
nrow(seoulch06)

# 2. 소재지우편번호(구우편번호)를 이용하는 방법 
seoulch07 <- na.omit(seoulch$소재지우편번호) 
View(seoulch07)

# 우편번호 앞 세자리를 추출한다 ->구로 구분한다.
seoulch08 <- substr(seoulch07, 1,3) 
View(seoulch08)

# 구별로 합산한다 
seoulch09 <- table(seoulch08)
View(seoulch09)
unique(seoulch08)

# 구명 객체를 생성하여 데이터를 만들 준비를 하자 
# 공통 키로 해서 
gu<- c("중구", "종로구", "서대문구", "마포구", "은평구", "동대문구", "중랑구", "도봉구","성동구", "강동구", "강남구", "성북구", "서초구", "송파구", "노원구", "용산구", "강북구", "광진구", "영등포구", "관악구", "구로구", "금천구", "동작구", "강서구", "양천구")

# 구명 객체와 병합한다 
seoulch10 <- data.frame(gu, seoulch09) 
View(seoulch10)

# 트리맵 시각화 
install.packages("treemap")
library(treemap)
treemap(seoulch10, index = "gu", vSize ="Freq", title = "서울시 구별 치킨집수")
#많은 것 부터 

# 패키지에 내장되어있는 기존의 데이터를 가공한다 
ch <- korpop2[1:25,] #1행부터 25까지 행을 보여준다.
ch 

# 필요한 변수를 추출한다 
ch01 <- select(ch, c("행정구역별_읍면동",'code'))
str(ch01)

# 한글 인코딩을 바꾸어준다 
ch01
ch02 <- changeCode(ch01)
View(ch02)
ch02

#각각의 변수의 속성을 문자로 바꾸어 주어 데이터 병합을 준비하자
ch02$행정구역별_읍면동
ch02$행정구역별_읍면동 <- as.character(ch02$행정구역별_읍면동) 
ch02$code <- as.character(ch02$code)

# 데이터 병합을 위해 정렬시킨다 
ch03 <- arrange(ch02, ch02$행정구역별_읍면동)

## gu 변수명을 '행정구역별_읍면동'으로 바꾸어준다
seoulch10
seoulch11 <- rename(seoulch10, '행정구역별_읍면동'='gu','치킨집수'=Freq)
View(seoulch11)
str(seoulch11)

# 마찬가지로 속성을 바꾸어 주어 병합을 준비한다 
#character속성으로 바꾸어준다.
seoulch11$행정구역별_읍면동 <- as.character(seoulch11$행정구역별_읍면동)
# 필요없는 부분을 삭제한다 
seoulch12 <- select(seoulch11, -seoulch08)
str(seoulch12)

# 정렬한다 
#정렬하여 오차없이 매칭해준다.
seoulch13 <- arrange(seoulch12, seoulch12$행정구역별_읍면동)
View(seoulch13)

# 데이터를 병합한다 
#korpop2 ->ch03 정렬되여 있는 것을 seoulch13정렬되여 있는 것과 합친다.
seoulch14 <- cbind(ch03,seoulch13)
seoulch14

# 정렬한다 
# 합친 seoulch14것을 마지막 하나를 뺀다.
seoulch15 <- seoulch14[,-1]
View(seoulch15)

# 시각화 
ggChoropleth(seoulch15,kormap2,fillvar="치킨집수",interactive=TRUE,subarea='서울',tooltip="행정구역별_읍면동",title='서울시 구별 치킨집수'  )

 

 

반응형

'Study > R' 카테고리의 다른 글

R-9  (0) 2020.09.05
R-8  (0) 2020.09.05
R-6  (0) 2020.09.05
R-5  (0) 2020.09.05
R-4  (0) 2020.09.05
반응형

이상치가 있으면 인지 하고 
지우는지 범위를 변경하는지 알수 있다.
boxplot
상자기준으로 
극단치
극단치 경계
윗수염: 하위 75 ~ 100%
3사분위(Q3) 하위 75%
2사분위(Q2) 하위 50% 중간값
1사분위(Q1) 하위 25%
아랫수염
극단치 경계

 

몇 %이상 들어가야만 사회가 안정적이다.
아니면 값이 이상치이다.
실제있는 데이터만 정확해서 수염의 길이를 표현하는 것있고 있는 것 값중에서 가장 작은 값을 표시한다.
있는데이터에서만 그려주니깐 

 

library(ggplot2)
boxplot(mpg$hwy)
mpg$hwy <- ifelse(mpg$hwy < 12 | mpg$hwy > 37, NA, mpg$hwy)
table(is.na(mpg$hwy))

library(dplyr)
outlier <- data.frame(sex= c(1,2,1,3,2,1) , score= c(5,4,3,4,2,26))
outlier

table(outlier$sex)
table(outlier$score)

outlier$sex <- ifelse(outlier$sex == 3, NA, outlier$sex)#3은 이상치보다 오류이다.
outlier

outlier$score <- ifelse(outlier$score>5 , NA, outlier$score)#16
outlier

outlier <- data.frame(sex= c(1,2,1,3,2,1) , score= c(5,4,3,4,2,26))
boxplot(outlier$score)

outlier %>% filter(!is.na(sex) & !is.na(score)) %>% 
  group_by(sex) %>% 
  summarise(mean_score = mean(score))

mpg

ggplot(mpg,aes(drv, hwy))+geom_boxplot()
ggplot(mpg,aes(y =hwy))+geom_boxplot()
ggplot(mpg,aes(,hwy))+geom_boxplot()
mpg$drv
boxplot(mpg$drv)#숫자가 아니여서 못 그린다.
ggplot(data = mpg, aes(drv))+ geom_bar()

ggplot(mpg,aes(x = manufacturer, y = displ,colour = manufacturer,fill= "fill")) + geom_boxplot()
ggplot(mpg,aes(x = displ, y = manufacturer,colour = displ,fill= "fill")) + geom_boxplot()
#y는 숫자이여야만 높으를 줄수 있다.

na.rm =  T으로 권장드린다.

tibble -> data.frame 기본적인 것 

 

3일차 분석사례실습 / 텍스트마이닝 
한국복지패널데이터 분석 
성별에 따른 월급 차이 
성별 직업 빈도 
종교 유무에 따른 이혼율 
한국복지패널  데이터 분석 
성별에 따른 월급 차이   
-“성별에 따라 월급이  얼마나  다른가?” 

 

install.packages("foreign")
library(foreign)#기본으로 깔려져있다.
library(dplyr)  
library(ggplot2) 
raw_welfare <- read.spss(file="Koweps_hpc10_2015_beta1.sav")
welfare <- as.data.frame(raw_welfare)#data를 편리하게 사용하려고 as.data.fram으로 나누었다.
str(welfare)#변수의 형태등 
glimpse(welfare)
head(welfare)
tail(welfare)
summary(welfare)

lit는 데이터 형에 아무른 변화가 없다.
파이썬  list는 vector에 가깝다.

 

raw_welfare <- read.spss(file="Koweps_hpc10_2015_beta1.sav")
welfare <- as.data.frame(raw_welfare)#data를 편리하게 사용하려고 as.data.fram으로 나누었다.
str(welfare)#변수의 형태등 
glimpse(welfare)
head(welfare)
tail(welfare)
summary(welfare)
#아래에 2가지 방법으로 가능하다.
#1.
welfare <- welfare %>% 
  rename( gender = h10_g3, birth = h10_g4,marriage = h10_g10, religion = h10_g11,
          income = p1002_8aq1, job = h10_eco9,
          region= h10_reg7) %>% 
  select(gender, birth, marriage, religion, income, job ,region)
welfare

#2.
welfare <- welfare %>% 
  select(gender = h10_g3, birth = h10_g4,marriage = h10_g10, religion = h10_g11,
         income = p1002_8aq1, job = h10_eco9,
         region= h10_reg7)
welfare
str(welfare)#numeric으로 변환한다.
summary(welfare)#gender이 이상하게 나온다.na값이 보여진다. 몇개있는지도 보여준다.
#숫자로
plot(welfare)#밑에와 위에 같은데 아래쪽 본다.
pairs(job ~ income+gender+region, data = welfare)
#줄로 된것은 1아니면 2밖에 없다. numeric이 아니라 범주형이다
#막대리 처럼 해지면 
boxplot(welfare)
#income을 따로 잡을수 있다.
sum(is.na(welfare))#21165
sum(welfare, na.rm = T)#38498929
colSums(is.na(welfare))#컬럼별로 sum을 한다.
summary(welfare$income)
mean(welfare$income)
mean(welfare$income,na.rm = T)#241.619
mean(is.na(welfare$income))#0.7219155

range(welfare$income)
range(welfare$income,na.rm = T)
welfare$income <- ifelse(welfare$income == 0 , NA, welfare$income)
#분석할때 소덕의 범위를 
#0이 아닌데 0으로 대답하는 분이 많다고 생각한다.
summary(welfare$income)
plot(welfare$income)#index가 row개수 

install.packages("psych")
library(psych)
describe(welfare)#descirbe 다른 관점에서 보여준다.
#다른 관점에서의 통계적 정보를 보여준다.

str(welfare)#16664
ggplot(data = welfare, aes(x= income))+geom_density()#밀도
#평균등으로 파악하기 힘든 집단이다.
#Removed 12044 rows containing non-finite values (stat_density). 
ggplot(data = welfare, aes(x = income))+geom_freqpoly()
#Removed 12044 rows containing non-finite values (stat_bin)

summary(welfare$gender)
welfare$gender <- ifelse(welfare$gender == 1, 'M','F')
summary(welfare$gender)#전에는 1,2 등으로 나왔는데 character로 바꿔졌다.
table(welfare$gender)#빈도수 세주는 것
ggplot(data = welfare, aes(x = gender))+geom_bar()
ggplot(data = welfare, aes(x = gender, colour = gender))+geom_bar()#테두리
ggplot(data = welfare, aes(x = gender,fill =gender))+geom_bar()#테두리
ggplot(data = welfare, aes(x = gender))+geom_bar(aes(fill =gender))#테두리
barplot(table(welfare$gender), xlab="gender" , ylab = "count",col=rainbow(3))  #barplot count를 한것으로 해야 한다. 그래서 table한 상태로 들어가야 한다.

welfare %>% select(gender, income) %>% group_by(gender) %>% summarise(평균= mean(income, na.rm = T))
welfare %>% filter( !is.na(income)) %>% group_by(gender) %>% summarise(평균= mean(income))
data_gender <- welfare %>% group_by(gender) %>% summarise(평균=mean(income,na.rm = T))
data_gender 
welfare %>% select(gender, income) %>% group_by(gender) %>% summarise(평균= mean(income, na.rm = T)) %>% 
  ggplot(aes(x= gender, y =평균,fill=gender))+geom_bar(stat = 'identity')
ggplot(data=data_gender, aes(x= gender, y =평균,fill = gender))+geom_bar(stat = 'identity')
#stat = 'identity'  이것 무조건 해줘야 한다. 아니면 오류난다.stat_count() must not be used with a y aesthetic

welfare %>% select(gender, income) %>% ggplot(aes(x= income, color =gender))+geom_density()

나이에 따른 소득 차이   
-“몇 살에 수입이 가장 많은가?” 

 

class(welfare$birth)
summary(welfare$birth)
qplot(welfare$birth)
#qplot을 쓰지 말라
boxplot(welfare$birth)#이상치를 확인하려면 boxplot을 보면 된다.
sum(is.na(welfare$birth))#결측치 확인 한 것
welfare$age <- 2015 - welfare$birth +1
#열이 없으면 새로 만든다.
summary(welfare$age)
plot(welfare$birth)
plot(table(welfare$birth))
barplot(welfare$birth)
welfare
#있던 데이터에서 정리한다. 나이별로 열을 하는 것을 만들었다.
age_income <- welfare %>% filter(!is.na(income)) %>% group_by(age) %>% summarise(mean_income= mean(income))
head(age_income)
ggplot(data=age_income, aes(x= age, y =mean_income))+geom_line()
ggplot(data = age_income ,aes(x= age,y=mean_income))+geom_point()
ggplot(data = age_income ,aes(x= age,y=mean_income))+geom_point(size=2, color= "blue")
ggplot(data = age_income ,aes(x= age,y=mean_income))+geom_point(size=2, color= "blue")+geom_line()
#layer익때문에 겹져진다.

연령대(세대)별  평균소득
#순서가 상관이 있다. 먼저 그리는 것에 겹쳐진다.

#세대별
install.packages("KoNLP")
library(KoNLP)#Checking user defined dictionary!

useSejongDic()

library(wordcloud2)
text1 = readLines("ahn.txt")
text1

#3: None
library(ggplot2)
library(dplyr)
welfare <- welfare %>% mutate(age_gen = ifelse(age <30,"young",ifelse(age<= 40,"g3",ifelse(age<=50 ,"g4",ifelse(age<= 60,"g5","old")))))
head(welfare,10)

table(welfare$age_gen)
qplot(welfare$age_gen)

age_gen_income <- welfare %>% group_by(age_gen) %>% summarise(mean_income = mean(income,na.rm = T))
age_gen_income

ggplot(data = age_gen_income,aes(x = age_gen, y = mean_income))+geom_col()
ggplot(data = age_gen_income, aes(x= age_gen, y = mean_income))+geom_bar(stat= "identity")
ggplot(data = age_gen_income, aes(x= age_gen, y = mean_income,fill=age_gen))+geom_bar(stat= "identity")
ggplot(data = age_gen_income, aes(x= age_gen, y = mean_income))+geom_bar(stat= "identity",aes(fill=age_gen))
ggplot(data = age_gen_income,aes(x= age_gen, y= mean_income))+geom_col(aes(fill=age_gen))+scale_x_discrete(limits= c("young","g3","g4","g5","old"))#순서대로  scale_x_discrete

나이와 성별에 따른 소득 차이   
-“소득은 나이와 성별에 따라 어떻게 다른가?” 


gender_income <- welfare %>% group_by(age_gen,gender) %>% 
  summarise(mean_income = mean(income,na.rm = T))
gender_income

ggplot(data = gender_income , aes(x = age_gen , y = mean_income, fill= gender))+geom_col()+scale_x_discrete(limits= c("young","g3","g4","g5","old"))
ggplot(data = gender_income , aes(x = age_gen , y = mean_income, fill= gender))+geom_col(position= "dodge")+scale_x_discrete(limits= c("young","g3","g4","g5","old"))#겹치지 않고 옆으로 진행 

신경망
require 좀더 좋다. 없으면 알려준다.

library
data(iris)
str(iris)#불꽃데이터 ->변수
#'data.frame':	150 obs. of  5 variables:
#$ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ... 꽃받침
#$ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
#$ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... 꽃잎
#$ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
#$ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 불꽃의 종류
temp <- c(sample(1:50, 30),sample(51:100,30),sample(101:150,30))
temp
iris.training <- iris[temp,]
iris.testing <- iris[-temp,]
library(nnet)
neuralNetResult <- nnet(Species~., data= iris.training, size = 3, decay =0 )#종을 맞추어봐라 나머지 너비,길이 맞춰보라 
neuralNetResult
summary(neuralNetResult)
#1번째 방법
library(devtools)
source_url('https://gist.githubusercontent.com/fawda123/7471137/raw/466c1474d0a505ff044412703516c34f1a4684a5/nnet_plot_update.r')
install.packages("reshape")
library(reshape)

#2번째 방법
library(clusterGeneration)
library(scales)
library(reshape)

plot.nnet(neuralNetResult)

pred <- predict(neuralNetResult, iris.testing, type = "class")
pred
real <- iris.testing$Species
table(real, pred)
summary(neuralNetResult)

iris 데이터를 잘 알아야 한다.

 

ggplot2::diamonds #diamonds는 ggplot2에 있는 것
datasets::iris#default 설치안해도 사용할 수 있는 것 

install.packages("ggplot2movies")
require(ggplot2movies)
movies
dim(movies)

첫번째 신경망을 로젠블랏의 퍼셉트론
퍼셉트론으 x이의 문제 가능하다.
처음에 들어간 데이터가 얼마인가 
비선형함수이다.
#손글자 

train <- read.csv("mnist_train.csv")
train[10,-1]#10번째 줄의 첫번째것 없에기
train[10,]#첫번때에 label이 있다.
train[10,1]#첫번때에 label이 있다.[1] 3
#3의 특징  예는 3이다.
train

dim(train)

#28* 28 PIXEL로 해서 783개로 해서 w값들이 바꾼다.
m = matrix(unlist(train[10, -1]), nrow = 28, byrow =T) #숫자가 RGB값이다.28라인 갈때마다 끊어진다.
#첫번째는 3이고 나머지는 rgb이다.
m

image(m, col = grey.colors(255))#image를 보고 싶을때 
write.csv(m,"mnist3.csv")

rotate <- function(x) t(apply(x, 2, rev))
par(mfrow = c(2,3))
lapply(1:6, function(x) image(
                      rotate(matrix(unlist(train[x,-1]),nrow = 28, byrow = TRUE)),
                      col= grey.colors(255),
                      xlab=train[x,1]
                      ))


par(mfrow = c(1,1))

#load caret library
install.packages("caret")
library (caret)

#createDataPartition( )은 데이터를 훈련 데이터와 테스트 데이터로 분할한다.
inTrain <- createDataPartition(train$label, p = 0.8, list=F)
#caret::createDataPartition(
#  y,          # 분류(또는 레이블)
#  times=1,    # 생성할 분할의 수
#  p=0.5,      # 훈련 데이터에서 사용할 데이터의 비율
#  list=TRUE,  # 결과를 리스트로 반환할지 여부. FALSE면 행렬을 반환한다.
#)
#0.8 곱해서 한다.
training<-train[inTrain,]#데이터를 저장한다.
testing<-train[-inTrain,]#데이터를 저장한다.
training
testing

write.csv(training, file ="train-data.csv", row.names = F)
write.csv(training, file ="test-data.csv", row.names = F)

install.packages("h2o")
library(h2o)
미부함수

local.h2o <- h2o.init(ip = "localhost", port = 54321, startH2O = TRUE, nthreads=-1)
training <- read.csv("train_data.csv")
testing <- read.csv("test_data.csv")
training
testing

training[,1] <- as.factor(training[,1])#범주형이다.

trData <- as.h2o(training)
trData[,1] <- as.factor(trData[,1])
tsData <- as.h2o(testing)
tsData[,1] <- as.factor(tsData[,1])

#unilx 시간 측정
start <- proc.time()
model.dl <- h2o.deeplearning(x = 2:785,
                             y = 1,
                             trData,
                             activation = "Tanh",#sigmoid등 으로 바꿀수 있다.
                             hidden=rep(160,5),
                             epochs = 20)
end <- proc.time()

diff=end-start
print(diff)

str(pred.dl.df)
pred.dl.df$predict 
pred.dl.df[1,1] 
table(test_labels[1,1],pred.dl.df[1,1]))
반응형

'Study > R' 카테고리의 다른 글

R-7  (0) 2020.09.05
R-6  (0) 2020.09.05
R-4  (0) 2020.09.05
R-3  (0) 2020.09.05
R -2  (0) 2020.09.05

+ Recent posts