Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

BASEMENT

R프로그래밍 3주차 본문

Programming/R

R프로그래밍 3주차

2_34 2020. 7. 5. 14:29

 

apply 계열 함수

  • 벡터, 행렬 또는 데이터 프레임에 임의의 함수를 적용한 결과를 얻기 위한 함수
  • 데이터 전체에 함수를 한 번에 적용하는 벡터 연산을 수행함으로 속도가 빠름

 

1. apply

 

배열 또는 행렬에 주어진 함수를 적용한 뒤 그 결과를 벡터, 배열 또는 리스트로 반환

apply(iris[1:4], 2, sum) 
                #1 : 행 
                #2 : 열 

colSums(iris[1:4]) # 열 합계 방법1 
apply(iris[1:4],2,sum) # 열 합계 방법2 

colMeans(iris[1:4]) # 열 평균 방법1 
apply(iris[1:4],2,mean) # 열 평균 방법2 

rowSums(iris[-5]) # 행 합계 방법1 
apply(iris[-5],1,sum) # 행 합계 방법2 

rowMeans(iris[-5]) # 행 평균 방법1 
apply(iris[-5],1,mean) # 행 평균 방법2

 

 

2. lapply

 

벡터, 리스트 또는 표현식에 함수를 적용하여 그 결과를 리스트로 반환

result <- lapply(1:3, function(x){x*2}) 
result[[1]]

 

 

3. sapply

 

lapply와 유사하지만 결과가 벡터/행렬/배열

ab <- sapply(iris[,1:4], mean) 
str(ab) 
abc <- as.data.frame(ab) 
str(abc)

 

 

4. tapply

 

벡터에 있는 데이터를 특정 기준에 따라 그룹으로 묶은 뒤, 각 그룹마다 주어진 함수를 적용하고 그 결과를 반환함

attach(iris)
tapply(Sepal.Lnegth,Species,sum)  # 종별 꽃받침길이 합
tapply(Sepal.Length,Species,mean)   # 종별 꽃받침길이 평균
tapply(Sepal.Length,Species,sd)   # 종별 꽃받침길이 표준편차
temp <- tapply(Sepal.Length,Species,sd) 
barplot(temp)   # 막대그래프로 확인

 

 

5. mapply

 

리스트의 각 요소를 계산 후 결과에 반영함

mapply(rnorm, c(1,2,3), C(0,10,100), c(1,1,1))

cf) rnorm : 평균n, 표준편차sd인 정규 분포를 따르는 난수를 n개 발생함

   평균0, 표준편차1인 난수 1개

   평균10, 표준편차 1인 난수 2개

   평균100, 표준편차1인 난수 3개

 

 

 

데이터 전처리 패키지

 

1. plyr 패키지

 

  • 데이터 분할, 특정 함수 적용, 재조합하는 함수 제공
  • adply : 배열 함수 > 데이터 프레임
  • ddply : 데이터 프레임 > 데이터 프레임

 

1) ddply 기본 함수

 

  • mutate : 열을 추가하거나 기존 열 수정
  • summarise : 데이터 요약
  • arrange : 데이터 정렬
  • filter : 조건에 맞는 데이터 추출
  • select : 열 추출
install.packages("plyr") 
library(plyr)

ddply(iris,"Sepal.Length", summarise, sum=sum(Sepal.Length))  # sepal.length 기준 으로 합계구함
ddply(iris, .(Species), function(sub){data.frame(sepal.width.mean=mean(sub$Sepal.Width))})
# 종별 sepal.width의 평균 -> 범주형 데이터명, 기준되는 컬럼, 데이터프레임, 알아보고싶은 컬럼의 평균/합계 등

 

ddply와 subset 활용

ddply - transform, mutate, summarise

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

data(diamonds,package="ggplot2") 
head(diamonds)

ddply(diamonds, "color", subset,carat==min(carat))     # color를 기준으로 carat이 최소인 데이터들
ddply(diamonds, "color", subset,carat>quantile(carat,0.99)) # color를 기준으로 carat이 0.99 초과인 데이터들
ddply(diamonds, "color", subset,price==max(price))     # color를 기준으로 가격이 높은 데이터들

a <- ddply(diamonds, "color", transform,price=scale(price));head(a)
# field 변환 
# color기준으로 price 를 scale(price)한 값으로 변환
b <- ddply(diamonds,"color",mutate,price2=scale(price));head(b) 
# field 추가 
# color기준으로 원래 price값 유지 + price를 scale(price)한 값 price2추가
c <- ddply(diamonds,"color",summarise,mean_price=mean(price));head(c) 
# 데이터 요약

 

 

2. reshape 패키지

install.packages("reshape") 
library(reshape)

data(tips)

ddply(tips, "day", summarise, sum=sum(tip))   # day를 기준으로 tip의 합계 요약
ddply(tips, "day", summarise, mean=mean(tip))   # day를 기준으로 tip의 평균 요약
ddply(tips, "sex", summarise, mean=mean(tip))   # sex를 기준으로 tip의 평균 요약
ddply(tips, c("sex","smoker"), summarise, mean=mean(tip))   ## 조건 여러개 -> c( ) 벡터로 묶기
ddply(tips, c("sex","smoker"), summarise, mean=mean(tip), sum=sum(tip))   ## 합계, 평균 여러개 가능

 

 

3. reshape2 패키지

 

데이터의 모양을 바꾸거나 그룹별 요약 값을 계산하는 함수들을 담고 있는 패키지

 

 

1) melt

 

식별자(id), 측정 변수(variable), 측정치(value) 형태로 데이터를 재구성하는 함수

reshape2::melt.data.frame(
    data,                # melt할 데이터
    id.vars,             # 식별자 컬럼들
    measure.vars,    # 측정치 컬럼들. 
                         #이 값이 생략되면 id.vars에 해당하지 않는 모든 컬럼이 측정치 컬럼으로 취급됨
    na.rm=FALSE    # NA인 행을 결과에 포함시킬지 여부. FALSE는 포함하지 않음
)
data(iris)

iris2 <- melt(iris,id="Species")
# id="Species" 고정, variable로 sepal.length, vaule로 sepal.length의 값이 정렬됨

 

 

2) cast

 

melt() 된 데이터를 다시 여러 컬럼으로 변환

cast(iris2,Species~variable,mean)    # Species기준으로 변수별 평균 보기
cast(iris2,Species~variable,length)    # Species기준으로 변수별 개수 보기

 

melt, cast 예제

data("airquality") 
str(airquality) 
summary(airquality)           # NA's : 값이 비어있음 --> na.rm=T로 처리해줘야 함
names(airquality) <- tolower(names(airquality))      # tolower : 소문자로 변환
head(airquality)

airquality2 <- melt(airquality,id=c("month","day"))    # month, day 기준
cast(airquality2,month~variable,mean) # 월별 평균 보기
airq_mean <- cast(airquality2, month~variable, mean, na.rm=T)   # 월별 변수들의 평균
                                                               ## na.rm=T --> na값을 제거 (T는 True)
airq_sd <- cast(airquality2, month~variable, sd, na.rm=T)       # 월별 변수들의 표준편차

 

 

4. dplyr 패키지

 

  • 데이터 분할, 특정함수 적용, 재조합하는 함수 제공
  • Group by를 추가로 이용하면 그룹별로 다양한 집계 가능
  • filter, select, mutate, arrange, summarise
install.packages("dplyr") 
install.packages("hflights")

library(dplyr) 
library(hflights) 
dim(hflights);head(hflights,3) 
str(hflights)

filter(hflights, Month==1, DayOfWeek==1)      # 1월 첫째주 데이터만 추출
aa <- arrange(hflights, DayofMonth, Month, Year)      #dayofmonth, month, year 기준정렬
bb <- arrange(hflights, desc(ArrDelay))        # 도착딜레이 내림차순 정렬
cc <- select(hflights, Year, Month, DayOfWeek)      # Year, Month, DayOfWeek 만 추출
dd <- mutate(hflights, gain=ArrDelay-DepDelay, speed=Distance/AirTime*60)      # gain, speed 열추가
ee <- summarize(hflights, delay=mean(DepDelay,na.rm=T))      # 출발딜레이 평균 데이터 요약

 

 

5. sqldf 패키지

install.packages("sqldf") 
library(sqldf)

new_df <- sqldf("select Year,Month from hflights")   
# sqldf 패키지를 사용하여 hflights패키지의 Year, Month만 셀렉트
head(new_df)

 

 

6. lubridate 패키지 - 시간 표현 데이터

install.packages("lubridate") 
library(lubridate)                   

today()                   # 오늘 날짜
now()                     # 오늘날짜, 현재시간
wday(today())           # 1:일요일 ~ 7:토요일
library(lubridate)       # lubridate : 시간 처리 데이터
hflights %>% 
    select(Year, Month) %>%           # 필드 선택
    mutate(departure=make_date(Year,Month))      # departure 새로운 필드 추가

* ctrl + shift + m %>% (함수와 함수 연결기호)

* proc.time() : 계산시간 계산 함수

 

 

 

텍스트 마이닝

 

  • 텍스트로부터 유의미한 정보를 추출
  • 단어의 출현 빈도와 단어 간의 관계성 등을 파악
  • 과정 : define&text data -> proprocess&transform the data -> selet/extract features -> algorithm learning&evaluation

 

  • library(string) :전처리
  • library(tm) : 전처리
  •  library(topicmodels) : 토픽모델링 전처리
  •  library(igraph) : sns 그래프 전처리

 

 

형태소 분석

 

# Load the data

load("INS.RData")    # 논문데이터 (title, year, abstract)

#1. to lower cast : 대문자 -> 소문자 (대부분 소문자로 맞춤)  strt_trans_tolower 

#2. removePunctuation : 마침표, 특수기호 삭제 (선택사항:형태소)

#3. remove numbers : 숫자 제거

#4. remove stopwords (en stopwords list) : 불용어 제거. findfrequence() 를 해서 키워드 확인해서 임의로 삭제

#5. stemming (한글은 불필요한 과정)

#6. remove stopwords (after stemming) : 원하는 제거 키워드 추가

#7. Document-Term matrix (최소 글자수 선정) : 문서당 단어의 들어가는 횟수 선정, 행렬로 -> 문서 임베딩으로 대체

 

# LDA with Gibbs Sampling : Gibbs를 이용한 토픽모델링. 문서 트렌드 파악을 위해 토픽모델링 함

  NTopic <- 30   # 토픽수

# Hot & Cold Topics : 최근 뜨는/지는 키워드 시계열 분석

 

 

 

공간 자료

 

 

1. 공간 자료

 

  • 과거 : 종이 지도로 출발지,도착지,통행경로 등 2차원 파악
  • 현재 : 디지털 맵으로 최적경로, 교통상황 등 3차원 파악
  • 평면에 투영하는 방법에 따라 다양한 좌표계 적용
  •  UTM : 위경도를 km,m 단위로 바꿔줌

* UTM 포맷

ll <- data.frame(longitude=lo, latitude=la)

cs <- CRS("+proj=longlat + datum=WGS84")      # WGS84 : 세계적 적용

ll.sp <- SpatialPoints(II, proj4string=cs)

 

 

 

2. 공간 자료의 구조

 

  • 벡터 형식 : 공간에서의 기하구조를 점(Point), 선(Line), 면(Polygon) 으로 표현
  • 래스터 형식 : 공간상에서 기하 구조를 Grid Data(or Data)로 불리는 격자형 Cell로 표현
  •  도면이나 지도와 같은 도형적 요소의 유형, 위치, 크기, 다른 지형요소와의 공간적 위상 관계를 나타내는 도형 정보와 지형 요소에 관련된 서술적 특성을 나타내는 속성 정보로 구분

 

 

3. 공간 자료 예제

 

 

1) 점 기반의 벡터형식 분석

install.packages("sp") 
library(sp)

xa <- round(runif(10), 2)      # 난수 10개 발생(소수점 둘째자리까지)
xy <- round(runif(10), 2)      # runif : 난수 발생 / round : 소수점 함수
xy <- cbind(xa,ya)              # cbind로 묶음
xy.sp <- SpatialPoints(xy)     # 공간 자료(점) 으로 형태 바꿈
plot(xy.sp, axes=T, pch=2)    # axes=T : xy축 그려라 / pch: 포인트 세모모양

 

2) 선 기반의 벡터형식 분석

install.packages("sp") 
library(sp)

x1 <- c(1,2,3,3) 
y1 <- c(4,3,3,4)
l11 <- cbind(x1,y1) 
l12 <- cbind(l11[,1]+.05,l11[,2]+.05) 
l12 <- cbind(c(1,2,3,1.5),c(2,3,2,3)) 
sl11 <- Line(l11) 
sl12 <- Line(l12)
s1 <- Lines(list(sl11, sl12), ID="a")       # line을 리스트 형태로 변환
s2 <- Lines(list(sl12), ID="b")

sl <- SpatialLines(list(s1,s2))               # 공간자료(선) 으로 형태 변화
plot(sl, axes=T, col=c("red", "blue"), lty=c(1,2), lwd=2)

 

3) 면 기반의 벡터형식 분석

install.packages("sp") 
library(sp)

Sr1 <- Polygon(cbind(c(1,3,3,1,1),c(1,1,2,2,1))) 
Sr2 <- Polygon(cbind(c(1,3,2,1),c(2,2,3,2))) 
Sr3 <- Polygon(cbind(c(3,3,2,4,6,6,3),c(1,2,3,4,3,1,1))) 
Sr4 <- Polygon(cbind(c(4,4,5,5,4),c(2,3,3,2,2)), hole=TRUE)

Srs1 <- Polygons(list(Sr1),"s1")                           # list 형태로 변환
Srs2 <- Polygons(list(Sr2),"s2") 
Srs3 <- Polygons(list(Sr3,Sr4),"s3/4")

SP <- SpatialPolygons(list(Srs1,Srs2,Srs3),1:3)        # 공간자료(면)으로 형태 변화
plot(SP, col=1:3,pbg="white",axes=T)
title("Spatial Polygon Plot")                              # 제목 붙여줌

 

 

그 외

 

앞에서 배운 내용 복습 예제

install.packages("MASS") 
library(MASS)

data(Cars93) 

mycar <- Cars93[,-c(15:17)]              #15~17열 빼고 열추출하여 객체에 담기
mycar <- mycar[c(mycar$Manufacturer=="Honda" & mycar$Price>15),] 
# 제조사 혼다이면서 가격이 15이상 데이터를 객체에 담기 
## ' , '앞에가 행, 뒤가 열
===> subset 이용해서 해보기
mycar2 <- subset(Cars93, select=(-15:-17)) 
mycar2 <- subset(mycar2, Manufacturer=="Honda" & Price>15)

all.equal(mycar,mycar2)          # 비교하고자 하는 두 개의 객체가 동일한지 확인

table(Cars93$Manufacturer) 
hyundai <- Cars93[(Cars93$Manufacturer=="Hyundai"),]     # 현대자동차만 추출

range(Cars93$Price) 
mycar4 <- Cars93[rev(order(Cars93$Price)),]              # 최고가 차량 추출

expensive <- arrange(Cars93,desc(Price))             # 최고가 가격 내림차순 정렬 
top3 <- head(expensive,3)                               # 최고가 3개 차량 추출
top3

cy14<-Cars93[Cars93$Cylinders=="4",]               # 4기통 차량을 살펴보고 
range(cy14$MPG.city)                                     # 도시 연비 확인 후 
cy14 <- cy14[cy14$Cylinders=="4" & cy14$MPG.city>=42,] # 4기통 차량이면서 도시연비가 최대인 데이터 추출

 

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

R 프로그래밍 - 7주차  (0) 2020.08.11
R 프로그래밍 6주차  (0) 2020.07.20
R 프로그래밍 5주차  (0) 2020.07.18
R프로그래밍 4주차  (0) 2020.07.06
R 프로그래밍 2주차  (0) 2020.07.05
Comments