'IT/R (데이터전처리대전 따라하기)'에 해당되는 글 13건

  1. 2020.03.26 R 날짜, 시간 계산
  2. 2020.02.03 R null 값을 평균값으로 보완
  3. 2020.02.02 R null 값 찾기, 제거, 치환(nvl)
  4. 2020.01.18 R 조건에 따라 조인할 마스터 테이블 변경하기
  5. 2020.01.12 R 조인
  6. 2020.01.09 R 순위 구하기
  7. 2020.01.08 R 최빈값 구하기 1
  8. 2020.01.08 R 분산, 표준편차 구하기
  9. 2020.01.08 R 데이터 요약하기
  10. 2020.01.07 R 데이터샘플링

 

timestamp와 date형으로 변환

 

 

   R에서 날짜 및 시간 관련 자료형은 timestamp와 datetime이 있음

   

   R은 timestamp 타입에 POSIXct형과 POSIXlt 형이 있고, 날짜형에 Date형이 있음

   

   POSIXct형은 1970-01-01 부터의 초를 가짐

      - 일시형 끼리 비교하거나 시간 차를 계산 할 때 유용

 

   POSIXlt형은 년,월,일,시,분,초 각각을 리스트 형태로 가짐

      - 년, 월 등 특정 일시 요소를 다룰 때 유용

 

library(tidyverse)

library(lubridate)


# data read

reserve <- read_csv('data/reserve.csv')



# POSIXct형은 1970-01-01 부터의 초를 가진다며??
# POSIXct형 변환

as.POSIXct(reserve$reserve_datetime, format='%Y-%m-%d %H:%M:%S')
as.POSIXct(paste(reserve$checkin_date,reserve$checkin_time), format='%Y-%m-%d %H:%M:%S')


#POSIXct형 변환(첫번째 파라미터가 character vector여야 함)


parse_date_time2(reserve$reserve_datetime, orders = '%Y-%m-%d %H:%M:%S')
parse_date_time2(paste(reserve$checkin_date,reserve$checkin_time), orders = '%Y-%m-%d %H:%M:%S')



#POSIXlt형 변환


as.POSIXlt(reserve$reserve_datetime, format='%Y-%m-%d %H:%M:%S')
as.POSIXlt(paste(reserve$checkin_date,reserve$checkin_time), format='%Y-%m-%d %H:%M:%S')



#POSIXlt형 변환(첫번째 파라미터가 character vector여야 함)


fast_strptime(reserve$reserve_datetime,format='%Y-%m-%d %H:%M:%S')
fast_strptime(paste(reserve$checkin_date,reserve$checkin_time), format='%Y-%m-%d %H:%M:%S')


#Date형으로 변환


as.Date(reserve$reserve_datetime, format='%Y-%m-%d')
as.Date(paste(reserve$checkin_date,reserve$checkin_time), format='%Y-%m-%d')

 

 

 

년, 월, 일, 시, 분, 초, 요일 추출

 

 

 

#reserve_datetime을 POSIXct형으로 변환

reserve$reserve_datetime_ct <- as.POSIXct(reserve$reserve_datetime, orders = '%Y-%m-%d %H:%M:%S')

 

 

#reserve_Datetime을 POSIXlt형으로 변환

reserve$reserve_datetime_lt <- as.POSIXlt(reserve$reserve_datetime, orders = '%Y-%m-%d %H:%M:%S')

 



#POSIXct형과 Date형은 함수로 특정 일시 요소를 얻는다
#(내부에 일시 요소를 추려내기 위한 계산을 실행한다)
#POSIXlt형은 직접 특정 일시 요소를 추려낼 수 있다

 


#년도 추출

year(reserve$reserve_datetime_ct)
year(reserve$reserve_datetime_lt)
reserve$reserve_datetime_lt$year


#월 추출

month(reserve$reserve_datetime_ct)
month(reserve$reserve_datetime_lt)
reserve$reserve_datetime_lt$mon



#일 추출

days_in_month(reserve$reserve_datetime_ct)
days_in_month(reserve$reserve_datetime_lt)
reserve$reserve_datetime_lt$mday


#요일 추출

weekdays(reserve$reserve_datetime_ct)
weekdays(reserve$reserve_datetime_lt)

 


#시간을 얻는다

hour(reserve$reserve_datetime_ct)
hour(reserve$reserve_datetime_lt)
reserve$reserve_datetime_lt$hour

 


#분을 얻는다

minute(reserve$reserve_datetime_ct)
minute(reserve$reserve_datetime_lt)
reserve$reserve_datetime_lt$min

 


#초를 얻는다

second(reserve$reserve_datetime_ct)
second(reserve$reserve_datetime_lt)
reserve$reserve_datetime_lt$sec

 


#지정한 포맷의 문자열로 변환한다

format(reserve$reserve_datetime_ct, '%Y%m%d %H%M%S')
format(reserve$reserve_datetime_lt, '%Y%m%d %H%M%S')

 

 

 

시간차 계산

 

 

POSIXct 형끼리는 단순 계산(-)하면 초단위로 값을 return

Date형 끼리의 계산은 일단위로 값을 return

 

 

#checkin_datetime 과 reserve_datetime 간 시간차 계산

 

reserve$checkin_datetime <- as.POSIXct(paste(reserve$checkin_date, reserve$checkin_time), format='%Y-%m-%d %H:%M:%S')


#년도 차이를 계산(월 이하의 날짜 요소는 고려하지 않음)

year(reserve$checkin_datetime) - year(reserve$reserve_datetime_ct)


#월 차이를 계산(일 이하의 날짜 요소는 고려하지 않음)

(year(reserve$checkin_datetime) * 12 + month(reserve$checkin_datetime)) - 
(year(reserve$reserve_datetime_ct) * 12 + month(reserve$reserve_datetime_ct))

# difftime 함수는 시간차를 계산하는 함수이며

# 1,2번 파라미터에 일시형 데이터를 지정하며 POSIXct, POSIXlt 형 모두 지정 가능

# units 파라미터는 시간 계산 단위
# units 종류 : auto, secs, mins, hours, days, weeks
#일 단위로 계산

difftime(reserve$checkin_datetime, reserve$reserve_datetime_ct, units = 'days')


#시간단위 계산

difftime(reserve$checkin_datetime, reserve$reserve_datetime, units = 'hours')


#분단위 계산

difftime(reserve$checkin_datetime, reserve$reserve_datetime, units = 'mins')


#초단위 계산

difftime(reserve$checkin_datetime, reserve$reserve_datetime, units = 'secs')

 

 

 

일시형의 증감

 

 

R에서 일시형 데이터는 POSIXct형, Date 형에 직접 수치를 증감 시킴

 

POSIXct형은 초단위 Date형은 일단위로 수치를 증감시킴

 

lubridate 패키지의  weeks, days, hours, minutes, seconds 함수를 통해

 

원래 데이터형에 상관없이 시간 단위를 지정 할 수 있음

 

 


library(lubridate)


#reserve_datetime을 date type으로 변경

reserve$reserve_date <- as.Date(reserve$reserve_datetime, orders = '%Y-%m-%d %H:%M:%S')


#reserve_datetime, reserve_date 에 1일을 더한다

reserve$reserve_datetime_ct + days(1)

reserve$reserve_date + days(1)


#reserve_datetime에 1시간을 더한다

reserve$reserve_datetime_ct + hours(1)


#reserve_datetime에 1분을 더한다

reserve$reserve_datetime_ct + minutes(1)


#reserve_datetime에 1초를 더한다

reserve$reserve_datetime_ct + seconds(1)

 

 

 

 

 

 

 

Posted by 소율소희아빠

# 데이터 읽기
null_test <- read.csv('data/null_test.csv',fileEncoding='UTF-8',header=TRUE, stringsAsFactors=FALSE)

# 데이터 확인
null_test

   a    b    c
1 EE   NA   NA
2 DD  312   45
3 EE   NA  456
4 BB  567 5678
5 CC  345  456
6 AA  678   NA
7 KK 7465   23
8 AA   NA  456
9 EE 4523  435

#null 값을 평균값으로 보완
#na.rm = TRUE는 NA를 제외한 평균 값을 계산, FALSE로 할 경우 null 값이 평균값 계산에 포함되어 null 반환
b_mean <- mean(null_test$b, na.rm=TRUE)
c_mean <- mean(null_test$c, na.rm=TRUE)

#평균값 확인
b_mean
c_mean

> b_mean
[1] 2315
> c_mean
[1] 1078.429

#null_test dataframe의 b,c값 중 null 값은 b_mean, c_mean 으로 보완
null_test %>%
  replace_na(list(b = b_mean, c = c_mean))

   a    b        c
1 EE 2315 1078.429
2 DD  312   45.000
3 EE 2315  456.000
4 BB  567 5678.000
5 CC  345  456.000
6 AA  678 1078.429
7 KK 7465   23.000
8 AA 2315  456.000
9 EE 4523  435.000

'IT > R (데이터전처리대전 따라하기)' 카테고리의 다른 글

R 날짜, 시간 계산  (0) 2020.03.26
R null 값 찾기, 제거, 치환(nvl)  (0) 2020.02.02
R 조건에 따라 조인할 마스터 테이블 변경하기  (0) 2020.01.18
R 조인  (0) 2020.01.12
R 순위 구하기  (0) 2020.01.09
Posted by 소율소희아빠

# 데이터 읽기
null_test <- read.csv('data/null_test.csv',fileEncoding='UTF-8',header=TRUE, stringsAsFactors=FALSE)

# 전체 데이터 확인
null_test

   a    b    c
1 EE   NA   NA
2 DD  312   45
3 EE   NA  456
4 BB  567 5678
5 CC  345  456
6 AA  678   NA
7 KK 7465   23
8 AA   NA  456
9 EE 4523  435

# b,c열 null 데이터 확인 (1,3,6,8행)
null_test %>%
  filter(is.na(b) | is.na(c))

   a   b   c
1 EE  NA   NA 
2 EE  NA  456
3 AA 678  NA  
4 AA  NA  456


#drop_na 함수로 b 가 null인 레코드를 제거한다 (1,3,8행)
null_test %>%
  drop_na(b)

   a    b    c
2 DD  312   45
4 BB  567 5678
5 CC  345  456
6 AA  678   NA
7 KK 7465   23
9 EE 4523  435



#drop_na 함수로 null_test 데이터 프레임에 있는 모든 열 중 null 값 있는 행을 모두 제거한다
null_test %>%
  drop_na()

  a    b    c
2 DD  312   45
4 BB  567 5678
5 CC  345  456
7 KK 7465   23
9 EE 4523  435

#na.omit 함수로 null_test 데이터 프레임에 있는 모든 열 중 null 값 있는 행을 모두 제거한다
na.omit(null_test)

  a    b    c
2 DD  312   45
4 BB  567 5678
5 CC  345  456
7 KK 7465   23
9 EE 4523  435

 

#replace_na 함수로 null 값을 지정한 값으로 치환하는 함수
null_test %>%
  replace_na(list(b='AAAAAAAAA',c='LLLLLLL'))

a         b       c
1 EE AAAAAAAAA LLLLLLL
2 DD       312      45
3 EE AAAAAAAAA     456
4 BB       567    5678
5 CC       345     456
6 AA       678 LLLLLLL
7 KK      7465      23
8 AA AAAAAAAAA     456
9 EE      4523     435

 

'IT > R (데이터전처리대전 따라하기)' 카테고리의 다른 글

R 날짜, 시간 계산  (0) 2020.03.26
R null 값을 평균값으로 보완  (0) 2020.02.03
R 조건에 따라 조인할 마스터 테이블 변경하기  (0) 2020.01.18
R 조인  (0) 2020.01.12
R 순위 구하기  (0) 2020.01.09
Posted by 소율소희아빠

##호텔에 있는 모든 호텔에 추천 후보 호텔을 연결한 데이터를 작성합시다.
##같은 소규모 지역 단위(small_area_name)에 추천 후보 수가 20건 이상이면 같은 소규모 지역 단위의 호텔을 후보로하고
##같은 소규모 지역 단위의 호텔 건수가 20건 미만이면 대규모 지역단위의 호텔을 추천후보로 함


#small_area_name별로 호텔 수를 카운팅

small_area_mst <- hotel_table %>%
  group_by(big_area_name,small_area_name) %>%
  summarise(hotel_cnt=n() - 1) %>%

  #집약 처리 후 그룹화를 해제한다
  ##왜하는거지??
  ungroup() %>%

  # 열 붙이기
  mutate(join_area_id=
           if_else(hotel_cnt >= 20, small_area_name, big_area_name)) %>%
  select(small_area_name,join_area_id,hotel_cnt)


#호텔 테이블에 small_area_mst 테이블을 조인하여 호텔별 join_area_id를 붙인다 
base_hotel_mst <-
  inner_join(hotel_table,small_area_mst,by='small_area_name') %>%
  select(hotel_id,join_area_id)

recommend_hotel_mst <-
#bind_rows : sql의 UNION 같은존재
  bind_rows(
    hotel_table %>%
      rename(rec_hotel_id=hotel_id,join_area_id=big_area_name) %>%
      select(join_area_id,rec_hotel_id),
    
    hotel_table %>%
      rename(rec_hotel_id=hotel_id,join_area_id=small_area_name) %>%
      select(join_area_id,rec_hotel_id)
  )

#base_hotel_mst와 recommend_hotel_mst를 조인하여 추천 후보 데이터를 붙인다
inner_join(base_hotel_mst, recommend_hotel_mst,by='join_area_id') %>%
#추천 호텔에서 자신 제외
  filter(hotel_id != rec_hotel_id) %>%
  select(hotel_id,rec_hotel_id)

'IT > R (데이터전처리대전 따라하기)' 카테고리의 다른 글

R null 값을 평균값으로 보완  (0) 2020.02.03
R null 값 찾기, 제거, 치환(nvl)  (0) 2020.02.02
R 조인  (0) 2020.01.12
R 순위 구하기  (0) 2020.01.09
R 최빈값 구하기  (1) 2020.01.08
Posted by 소율소희아빠

#R조인은 결합할 테이블의 크기를 가능한 한 작게 하여 메모리를 적게 사용해야 한다.
#불필요한 데이터 까지 조인 처리의 대상이 되기 때문에 결합처리를 하기 전에 데이터를 필터링 하는것이 좋음

# 데이터셋은 예약 테이블과 호텔 테이블을 결합해 
# 숙박인원수가 한 명인 비즈니스 호텔의 예약레코드를 추출해야한다.

library(tidyverse)

reserve_table <- read.csv('data/reserve.csv',fileEncoding='UTF-8',header = TRUE)
hotel_table <- read.csv('data/hotel.csv',fileEncoding='UTF-8',header = TRUE)

##대상 데이터들을 필터링해서 줄여 준 뒤 조인
inner_join(reserve_table %>% filter(people_num ==1 ),
           hotel_table %>% filter(is_business=='True'),
           by='hotel_id')

Posted by 소율소희아빠

순위구하기1 : row_number

#row_number() 함수로 정렬하기 위해서 자료형 변경
reserve_table$reserve_datetime <- as.POSIXct(reserve_table$reserve_datetime, format='%Y-%m-%d %H:%M:%S')

reserve_table %>%
  
  #customer_id 별로 
  group_by(customer_id) %>%
  
  #mutate 함수로 log_no 컬럼 추가
  #row_number() 함수로 customer_id 별 reserve_datetime 으로 순위지정
  mutate(log_no=row_number(reserve_datetime))

 

#순위구하기2 : rank, min_rank, dense_rank


hotel_res_rank <- reserve_table %>%
  #hotel_id 별로
  group_by(hotel_id) %>%
  #예약건수를 카운트
  summarise(rsv_cnt=n()) %>%
  #예약건수 내림차순으로 호텔별 순위구하기 
  transmute(hotel_id, rsv_cnt
            ,rsv_cnt_min_rank=min_rank(desc(rsv_cnt))
            ,rsv_cnt_dense_rank=dense_rank(desc(rsv_cnt))
            ,rsv_cnt_rank=rank(desc(rsv_cnt)))


#데이터 확인
hotel_res_rank %>%
  arrange(desc(rsv_cnt))

'IT > R (데이터전처리대전 따라하기)' 카테고리의 다른 글

R 조건에 따라 조인할 마스터 테이블 변경하기  (0) 2020.01.18
R 조인  (0) 2020.01.12
R 최빈값 구하기  (1) 2020.01.08
R 분산, 표준편차 구하기  (0) 2020.01.08
R 데이터 요약하기  (0) 2020.01.08
Posted by 소율소희아빠

#최빈값 구하기1


##1000단위 반올림
##table 함수로 금액별 예약건수 구하기
##which.max 함수로 예약건수가 최대인 벡터 요소 구하기
##names함수로 예약건수가 최대인 벡터 요소의 속성 정보를 구하기


names(which.max(table(round(reserve_table$total_price,-3))))


#최빈값 구하기2


##table함수로 금액별 예약건수를 구한 벡터를 데이터 프레임으로 변환


as.data.frame(table(round(reserve_table$total_price,-3))) %>%

 

  ##예약건수인 Freq 컬럼으로 정렬 후 맨마지막 값 확인(1만원,2만원,4만원대가 58개로 공동1위임)


  arrange(Freq)

 

VAR1      Freq

'IT > R (데이터전처리대전 따라하기)' 카테고리의 다른 글

R 조인  (0) 2020.01.12
R 순위 구하기  (0) 2020.01.09
R 분산, 표준편차 구하기  (0) 2020.01.08
R 데이터 요약하기  (0) 2020.01.08
R 데이터샘플링  (0) 2020.01.07
Posted by 소율소희아빠

#분산, 표준편차 구하기

 

#hotel_id별 분산,표준편차 구하기


reserve_table %>%
  group_by(hotel_id) %>%


  #hotel_id별 데이터 건수가 1건이면 분산과 표준편차가 NA기 때문에 0으로 변환


  summarise(price_var=coalesce(var(total_price),0)
           ,price_sd=coalesce(sd(total_price),0)
           )

 

'IT > R (데이터전처리대전 따라하기)' 카테고리의 다른 글

R 순위 구하기  (0) 2020.01.09
R 최빈값 구하기  (1) 2020.01.08
R 데이터 요약하기  (0) 2020.01.08
R 데이터샘플링  (0) 2020.01.07
R 조건(where절)에 따른 데이터 추출  (0) 2020.01.07
Posted by 소율소희아빠

그룹별 Summary 데이터 구하기1

#호텔id 별 Summary 데이터구하기1

reserve_table %>%
  
  #hotel_id로 group by
  group_by(hotel_id) %>%
  
  #예약건수(단순count), 고객수(count(distinct customer_id)) ..
  summarise(rsv_cnt=n()
           ,cus_cnt=n_distinct(customer_id)
           ,price_sum=sum(total_price)
           ,max_price=max(total_price)
           ,min_price=min(total_price)
           ,mean_price=mean(total_price)
           ,median_price=median(total_price)
           ,quantile_price=quantile(total_price,0.25)
           )

 

#데이터프레임의 요약 데이터 구하기


reserve_table %>%

  #summary 함수를 통해 그룹별 평균, 분산,4분위 등.. 대표값을 자동으로 출력함
  summary()

Posted by 소율소희아빠

#랜덤샘플링


## 첫번째 파라미터 : 대상 dataframe
## 두번째 파라미터 : 추출 비율
sample_frac(reserve_table,0.5)


#비율이 아닌 건수로 랜덤 샘플링 할 때
sample_n(reserve_table,100)

 

 

 

#랜덤샘플링2

#고객 단위의 분석에서 예약 데이터 기준으로 샘플링을 할 경우 문제가 발생함
##해결책1 : 예약레코드를 고객 단위로 요약한 후 샘플링(단점 : 제외될 데이터도 일단 요약하는 절차가 필요함)
##해결책2 : 예약 테이블의 고객ID 기준으로 랜덤 샘플링 후 샘플링한 고객ID만 예약데이터에서 추출

#reserve_table에서 고객ID만 뽑아서 중복 제거하여 벡터를 만듬
all_id <- unique(reserve_table$customer_id)

reserve_table %>%
  #sample함수를 이용하여 고객ID에서 50% 샘플링해 추출대상 ID를 얻는다

  #추출 대상 ID와 일치하는 행을 filter 함수로 추출한다
  filter(customer_id %in% sample(all_id, size=length(all_id) * 0.5))

Posted by 소율소희아빠
이전버튼 1 2 이전버튼

블로그 이미지
소율소희아빠

공지사항

Yesterday
Today
Total

달력

 « |  » 2025.5
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

최근에 올라온 글

최근에 달린 댓글

글 보관함