데이터 인사이트 스터디 내용을 관리하는 블로그 입니다.

Data Insight Study Blog

  • Join Us on Facebook!
  • Follow Us on Twitter!
  • LinkedIn
  • Subcribe to Our RSS Feed

2. Reading and Preparing Data > Preparing the Data > Adding Neighborhoods

지역 찾기(Finding neighborhoods)

마지막 부분에서 우리는 Manhattan에 대한 shapefile을 mht_shapefile이라는 객체에 저장했습니다. 이 객체는 Manhattan 지역의 지도를 그리는 데 사용되었습니다. 이제 우리는 동일한 shapefile을 over 함수(sp 패키지의 일부)와 함께 사용하여 각각의 운행에 대하여 승차 및 하차 지역을 찾는 방법을 살펴 보겠습니다. 이전에 만들어 두었던 NYC 택시 데이터의 샘플을 사용하여 data.frame을 사용하여 이를 수행 할 수있는 방법을 보여주고, 코드를 변환 함수로 감싸고(wrap), 이를 XDF 데이터에 적용하기 위한 연습으로 남겨 둘 것입니다.

승차 지역 컬럼을 nyc_sample_df에 추가하려면 다음의 작업을 수행해야 합니다. pickup_latitude 및 pickup_longitude의 NA 값들을 0으로 바꿔야 하며, 바꾸지 않을 경우 오류가 발생합니다. coordinates 함수를 사용하여 위의 두 열이 데이터의 지리적 좌표를 나타내도록 지정합니다. over 함수를 사용하여 위에 지정된 좌표를 기반으로 한 지역 정보를 얻어서 지역 정보가 포함된 data.frame을 반환하게 합니다. 관련된 열 이름을 얻어낸 후, cbind를 사용하여 결과를 원래 데이터에 연결 시킵니다.

# 좌표 컬럼을 가져와서, NA를 0으로 치환함
data_coords <- transmute(nyc_sample_df,
  long = ifelse(is.na(pickup_longitude), 0, pickup_longitude),
  lat = ifelse(is.na(pickup_latitude), 0, pickup_latitude)
)
# 좌표에 해당하는 컬럼명을 지정함
coordinates(data_coords) <- c('long', 'lat')
# 좌표에 기반한 지역 정보를 반환
nhoods <- over(data_coords, mht_shapefile)
# nhoods의 열이름 바꿈
names(nhoods) <- paste('pickup', tolower(names(nhoods)), sep = '_')
# 원래 데이터에 지역정보를 추가함
nyc_sample_df <- cbind(nyc_sample_df, nhoods[, grep('name|city', names(nhoods))]) head(nyc_sample_df)
  VendorID tpep_pickup_datetime tpep_dropoff_datetime passenger_count
1        2  2016-01-01 00:00:00   2016-01-01 00:00:00               2
2        2  2016-01-01 00:00:00   2016-01-01 00:00:00               5
3        2  2016-01-01 00:00:00   2016-01-01 00:00:00               1
4        2  2016-01-01 00:00:00   2016-01-01 00:00:00               1
5        2  2016-01-01 00:00:00   2016-01-01 00:00:00               3
6        2  2016-01-01 00:00:00   2016-01-01 00:18:30               2
  trip_distance pickup_longitude pickup_latitude RatecodeID store_and_fwd_flag
1          1.10        -73.99037        40.73470          1                  N
2          4.90        -73.98078        40.72991          1                  N
3         10.54        -73.98455        40.67957          1                  N
4          4.75        -73.99347        40.71899          1                  N
5          1.76        -73.96062        40.78133          1                  N
6          5.52        -73.98012        40.74305          1                  N
  dropoff_longitude dropoff_latitude payment_type fare_amount extra mta_tax
1         -73.98184         40.73241            2         7.5   0.5     0.5
2         -73.94447         40.71668            1        18.0   0.5     0.5
3         -73.95027         40.78893            1        33.0   0.5     0.5
4         -73.96224         40.65733            2        16.5   0.0     0.5
5         -73.97726         40.75851            2         8.0   0.0     0.5
6         -73.91349         40.76314            2        19.0   0.5     0.5
  tip_amount tolls_amount improvement_surcharge total_amount
1          0            0                   0.3          8.8
2          0            0                   0.3         19.3
3          0            0                   0.3         34.3
4          0            0                   0.3         17.3
5          0            0                   0.3          8.8
6          0            0                   0.3         20.3
              pickup_city       pickup_name
1 New York City-Manhattan Greenwich Village
2 New York City-Manhattan      East Village
3                    <NA>              <NA>
4 New York City-Manhattan   Lower East Side
5 New York City-Manhattan   Upper East Side
6 New York City-Manhattan          Gramercy

전체 데이터에 대하여 위의 변환을 실행하려면, 위 코드를 transfromFunc 인수를 통해 rxDataStep에 ���달할 수 있도록 변환 함수로 래핑해야 합니다. 우리는 변환 함수 find_nhoods를 호출하는 것입니다. 우리가 작성한 변환 함수는 탑승 지역과 구역 그리고 하차 지역과 구역을 모두 추가합니다.

find_nhoods <- function(data) {
  
  # 승차 위도와 경도를 추출하고, 해당 지역 정보를 조회함
  pickup_longitude <- ifelse(is.na(data$pickup_longitude), 0, data$pickup_longitude)
  pickup_latitude <- ifelse(is.na(data$pickup_latitude), 0, data$pickup_latitude)
  data_coords <- data.frame(long = pickup_longitude, lat = pickup_latitude)
  coordinates(data_coords) <- c('long', 'lat')
  nhoods <- over(data_coords, shapefile)
  
  ## 데이터에 승차 지역 및 도시 컬럼 추가
  data$pickup_nhood <- nhoods$NAME
  data$pickup_borough <- nhoods$CITY
  
  # 하차 위도와 경도를 추출하고, 해당 지역 정보를 조회함
dropoff_longitude <- ifelse(is.na(data$dropoff_longitude), 0, data$dropoff_longitude) dropoff_latitude <- ifelse(is.na(data$dropoff_latitude), 0, data$dropoff_latitude) data_coords <- data.frame(long = dropoff_longitude, lat = dropoff_latitude) coordinates(data_coords) <- c('long', 'lat') nhoods <- over(data_coords, shapefile) ## 데이터에 하차 지역 및 도시 컬럼 추가 data$dropoff_nhood <- nhoods$NAME data$dropoff_borough <- nhoods$CITY ## 새 컬럼이 추가된 데이터 반환
data }

이제 우리는 함수를 만들었으므로, 테스트를 진행할 차례입니다. 샘플 데이터 nyc_sample_df에서 rxDataStep을 실행하여 테스트를 수행합니다. 이러한 방식은, 큰 XDF 파일 nyc_xdf에서 변환을 실행하기에 앞서 변환이 제대로 작동하는지 확인하는 데 있어서 매우 좋은 방법입니다. data.frame에 변환을 적용하면서 얻는 오류 메시지는, 때로는 XDF에서 보다 더 많은 정보를 제공하기 때문에, 오류를 추적하고 디버깅하는 것이 더 쉽습니다. 이제 rxDataStep을 사용하여 nyc_sample_df(outFile 인수 없음)를 대상으로 변환 함수 find_nhoods를 적용한 이후 데이터가 어떻게 보이는지를 살펴봅시다.

# rxDataStep을 사용하여 data.frame에 변환 함수 테스트
head(rxDataStep(nyc_sample_df, transformFunc = find_nhoods, transformPackages = c("sp", "maptools"), 
                transformObjects = list(shapefile = mht_shapefile)))
  VendorID tpep_pickup_datetime tpep_dropoff_datetime passenger_count trip_distance
1        2  2016-01-01 00:00:00   2016-01-01 00:00:00               2          1.10
2        2  2016-01-01 00:00:00   2016-01-01 00:00:00               5          4.90
3        2  2016-01-01 00:00:00   2016-01-01 00:00:00               1         10.54
4        2  2016-01-01 00:00:00   2016-01-01 00:00:00               1          4.75
5        2  2016-01-01 00:00:00   2016-01-01 00:00:00               3          1.76
6        2  2016-01-01 00:00:00   2016-01-01 00:18:30               2          5.52
  pickup_longitude pickup_latitude RatecodeID store_and_fwd_flag dropoff_longitude
1        -73.99037        40.73470          1                  N         -73.98184
2        -73.98078        40.72991          1                  N         -73.94447
3        -73.98455        40.67957          1                  N         -73.95027
4        -73.99347        40.71899          1                  N         -73.96224
5        -73.96062        40.78133          1                  N         -73.97726
6        -73.98012        40.74305          1                  N         -73.91349
  dropoff_latitude payment_type fare_amount extra mta_tax tip_amount tolls_amount
1         40.73241            2         7.5   0.5     0.5          0            0
2         40.71668            1        18.0   0.5     0.5          0            0
3         40.78893            1        33.0   0.5     0.5          0            0
4         40.65733            2        16.5   0.0     0.5          0            0
5         40.75851            2         8.0   0.0     0.5          0            0
6         40.76314            2        19.0   0.5     0.5          0            0
  improvement_surcharge total_amount      pickup_nhood          pickup_borough
1                   0.3          8.8 Greenwich Village New York City-Manhattan
2                   0.3         19.3      East Village New York City-Manhattan
3                   0.3         34.3       Boerum Hill  New York City-Brooklyn
4                   0.3         17.3   Lower East Side New York City-Manhattan
5                   0.3          8.8   Upper East Side New York City-Manhattan
6                   0.3         20.3          Gramercy New York City-Manhattan
             dropoff_nhood         dropoff_borough
1                 Gramercy New York City-Manhattan
2                     <NA>                    <NA>
3                Yorkville New York City-Manhattan
4                     <NA>                    <NA>
5                  Midtown New York City-Manhattan
6 Astoria-Long Island City    New York City-Queens

데이터의 마지막 4개 열은 우리가 원하는 지역 정보 열에 해당합니다. 따라서 우리는 nyc_xdf에서 실행을 해도, 변환이 잘 작동할 것임을 확신할 수 있습니다.

st <- Sys.time()
rxDataStep(nyc_xdf, nyc_xdf, overwrite = TRUE, transformFunc = find_nhoods, transformPackages = c("sp", "maptools", "rgeos"), 
           transformObjects = list(shapefile = mht_shapefile))
Sys.time() - st
rxGetInfo(nyc_xdf, numRows = 5)
Time difference of 30.77251 mins

File name: C:\Data\NYC_taxi\yellow_tripdata_2016.xdf 
Number of observations: 69406520 
Number of variables: 29 
Number of blocks: 141 
Compression type: zlib 
Data (5 rows starting with row 1):
  VendorID tpep_pickup_datetime tpep_dropoff_datetime passenger_count trip_distance
1        2  2016-01-01 00:00:00   2016-01-01 00:00:00               2          1.10
2        2  2016-01-01 00:00:00   2016-01-01 00:00:00               5          4.90
3        2  2016-01-01 00:00:00   2016-01-01 00:00:00               1         10.54
4        2  2016-01-01 00:00:00   2016-01-01 00:00:00               1          4.75
5        2  2016-01-01 00:00:00   2016-01-01 00:00:00               3          1.76
  pickup_longitude pickup_latitude RatecodeID store_and_fwd_flag dropoff_longitude
1        -73.99037        40.73470          1                  N         -73.98184
2        -73.98078        40.72991          1                  N         -73.94447
3        -73.98455        40.67957          1                  N         -73.95027
4        -73.99347        40.71899          1                  N         -73.96224
5        -73.96062        40.78133          1                  N         -73.97726
  dropoff_latitude payment_type fare_amount extra mta_tax tip_amount tolls_amount
1         40.73241            2         7.5   0.5     0.5          0            0
2         40.71668            1        18.0   0.5     0.5          0            0
3         40.78893            1        33.0   0.5     0.5          0            0
4         40.65733            2        16.5   0.0     0.5          0            0
5         40.75851            2         8.0   0.0     0.5          0            0
  improvement_surcharge total_amount tip_percent pickup_hour pickup_dow
1                   0.3          8.8           0    10PM-1AM        Fri
2                   0.3         19.3           0    10PM-1AM        Fri
3                   0.3         34.3           0    10PM-1AM        Fri
4                   0.3         17.3           0    10PM-1AM        Fri
5                   0.3          8.8           0    10PM-1AM        Fri
  dropoff_hour dropoff_dow trip_duration      pickup_nhood          pickup_borough
1     10PM-1AM         Fri             0 Greenwich Village New York City-Manhattan
2     10PM-1AM         Fri             0      East Village New York City-Manhattan
3     10PM-1AM         Fri             0       Boerum Hill  New York City-Brooklyn
4     10PM-1AM         Fri             0   Lower East Side New York City-Manhattan
5     10PM-1AM         Fri             0   Upper East Side New York City-Manhattan
  dropoff_nhood         dropoff_borough
1      Gramercy New York City-Manhattan
2          <NA>                    <NA>
3     Yorkville New York City-Manhattan
4          <NA>                    <NA>
5       Midtown New York City-Manhattan
답글 기능이 비활성화되어 있습니다