BASEMENT
R프로그래밍 3주차 본문
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 |