본문 바로가기

택시데이터분석

(빅데이터 처리 분석)뉴욕 택시 데이터를 수집해보자 2탄

반응형

부릉

 

 

전편 못 보신 분들 이 링크로 전편을 확인해 주세요..!

https://sky-develop.tistory.com/23

 

(빅데이터 처리 분석)뉴욕 택시 데이터를 수집해보자 1탄

미국 택시데이터를 분석하여 코로나 전 후 택시 유동량을 관찰 분석하는 조그마한 프로젝트를 진행하려고 한다.! 일단 데이터를 다운로드 사이트는 요기 있다.. https://www.nyc.gov/site/tlc/about/tlc-trip

sky-develop.tistory.com

 

 

데이터 수집 이후 

데이터의 칼럼을 먼저 해석을 해보았다 그래야 무엇을 분석해 볼지 명확지니깐!

칼럼의 내용은 다음과 같았다 총 컬럼 개수는 24개였으며 내용은 다음과 같다 약간의 스크롤 압박이 있으니 양해 부탁드립니다. 

  1. 'hvfhs_license_num' :  해당 택시의 라이선스를 번호로 나누었으며 해당 번호는 다음 표에 있는 것으로 지칭한다 (2019년 기준 
  2. 'dispatching_base_num' :  기본 라이센스 번호 
  3. 'originating_base_num' : 여행 요청을 받은 베이스 기본 번호 
  4. 'request_datetime' : 승객 픽업 요청 시각 
  5. 'on_scene_datetime' : 운전자가 픽업 장소에 도착한 시각 
  6. 'pickup_datetime' : 픽업 날짜 및 시간 
  7. 'dropoff_datetime' : 하차 날짜 및 시간 
  8. 'PULocationID' : 출발 지역
  9. 'DOLocationID' : 하차 지역 
  10. 'trip_miles' : 총 마일 
  11. 'trip_time' : 총 운행한 시각 
  12. 'base_passenger_fare' : 통행료, 팁, 세금 및 수수료 기본 승객 요금 
  13. 'tolls' : 운행에서 지불한 모든 통행료 금액 
  14. 'bcf' : 블랙 카드를 이용해서 
  15. 'sales_tax' : NYS 판매세를 위해 여행 중에 징수된 금액 
  16. 'congestion_surcharge' : 혼잡 요금 
  17. 'airport_fee' : 공항 요금 2.5달러 고정 
  18. 'tips' : 승객으로부터 팁
  19. 'driver_pay' : 총 운전자 급여( 팁 통행료 차액 등등 제외) 
  20. 'shared_request_flag' : 승객이 일치하는지 여부에 관계없이 승차 동의 
  21. 'shared_match_flag'  : 승객이 여행 중 얹든지 별도로 예약한 다른 승객과 차량 바꿈 
  22. 'access_a_ride_flag': 메트로폴리탄을 대신하여 관리된 여행
  23. 'wav_request_flag' : 승객이 휠체어로 접근할 수 있는 차량(WAV)을 요청했는지 ( Y/N)
  24. 'wav_match_flag' : 휠체어로 접근 가능한 차량(WAV)에서 트립이 발생했는지  (Y/N)

 

많은 칼럼이 있어서 일단 간단하게

각 월당 픽업 날짜를 종합해서 카운터를 매겨 시각화를 해보는 방향으로 선택했다

생각해보았다..

 

 

가즈아!!!!

 

 

나는 spark sql를 이용하여 데이터 처리 분석을 진행했다 

from pyspark.sql import SparkSession
from typing import Generator, List
import matplotlib.pyplot as plt 
import seaborn as sns 
import pandas as pd 
import os 

spark = SparkSession.builder.master("local").appName("year-taxi").getOrCreate()

일단 spark를 config 설정을 해주고 

 

directory: str = f"{os.getcwd()}/data/2020"
trip1: str = "fhvhv_tripdata_2020-01.parquet"

trip_data1 = spark.read.parquet(f"file:///{directory}/{trip1}")
trip_data1.createOrReplaceTempView('month2021_data')
해당 데이터셋은 parquet으로  저장되어 있기 때문에 read 해주었고
모든 데이터를 한꺼번에 분석하기에는 감당하지 못할 수 있어 

2020년 1월 데이터로 1차 목적으로 하는 분석을 진행을 해보았다. 
천리길도 한걸음이다..!

 

 

qs = """
SELECT 
    pickup_datetime
FROM
    month2021_data
"""
df_pan = spark.sql(qs).show()


######  다음과같은 형식에서 split을 추가 ########3

qs = """
SELECT 
    split(pickup_datetime, " ")[0] as pickup
FROM
    month2021_data
GROUP BY 
    pickup 
"""
df_pan = spark.sql(qs).show()
spark.sql(qs).createOrReplaceTempView("week_trip")

내가 필요한 항목만 추출하여 확인하여 나온 결괏값은 다음과 같은 형식으로 나왔다 

 

여기서 나는 pickup date 시간이 아닌 해당 날짜에 얼마나 사람이 택시는 탔는지가

중요했기 때문에 스플릿으로 나누어서 데이터를 정제하는 방향을 선택했다 

전 ----------- 후

 

이 상태에서 각 일별로 카운터를 하면 된다..! GROUP BY을 이용하자! 방금 만들 저 테이블은 다른 TABEL로 (week_trip)으로 선언해 주고 GROUP BY와 ORDER BY를 돌렸다.

qs = """
SELECT 
    pickup, COUNT(*) as trip
FROM 
    week_trip
GROUP BY 
    pickup
ORDER BY
    pickup 
"""
spark.sql(qs).show()

결과 는 깔끔했다

 

 

이젠 시각화를 해보자 spark는 toPandas라는 함수로  pandas의 기능을 같이 사용할 수 있다

해당 쿼리 셋에

df_pan = spark.sql(qs). toPandas()  

이러한 형식으로 진행하면 pandas의 기능을 수행할 수 있다.

import matplotlib.pyplot as plt 
import seaborn as sns 

df_pan = spark.sql(qs).toPandas()

fig, ax = plt.subplots(figsize=(16, 5))
sns.lineplot(x="pickup", y="trip", data=df_pan)
plt.xticks(rotation=45)
plt.title("NYC Texi 2020-01-01 ~ 2020-02-01")
plt.show()

 

짠!

짜잔
희열

 

해당 데이터가 규칙적으로 솟아있는 걸 확인하고 뭔지는 모르겠지만..
2020-02-01에 갑자기 급감한 걸 확인할 수 있었다..!

흠....

 

저 봉우리.. 뭔가 수상하다...

일단 저 봉우리를 한번 조사해보자..  일단 일별로 어떤 요일인지 추출하는것이 우선이다..!

qs = """
SELECT
    DATE_FORMAT(pickup, "EEEE") as week, trip
FROM 
    week_trip
"""
data = spark.sql(qs).show()

DATA_FORMAT 을 이용해서 각 월일 날짜를 요일로 변경하였다

물론 spark sql에 미리 정해져 있는 함수로 사용가능하지만

udf로 내가 정의후 나만의 커스텀 함수를 register 해서 사용할 수 있다..!

뽑혔다..

시각화를 해보자....!

 

fig, ax = plt.subplots(2, 1, figsize=(16, 9), constrained_layout=True)
sns.barplot(x="week", y="trip", data=data, ax=ax[0])
sns.lineplot(x="pickup", y="trip", data=df_pan)
plt.xticks(rotation=45)
plt.title("NYC Texi 2020-01-01 ~ 2020-02-01")
plt.show()

패턴이 보였다..!

일요일날 절정을찍고 다시 내려오고 올라가는 패턴을 발견할 수 있었다..!! 
그렇다는건.. 저 꼭대기 봉우리가 일요일 이라고 볼 수 있다..

오옷솟소!!!!

 

시각화를 합쳐서 가시성을 좋게 만들었다..!

훨씬더 보기 좋아보인다

 

지금까지 pickup date 로 2020년 1월 의 택시 유동량을 분석 처리 해보았다. 
spark의 가장 큰 장점인 추상화가  잘되어 있고 sql를 지원한다는점에서 어렵지 않게 대용량 처리를 할 수 있었다.

 

 

데이터 엔지니어의 매력이 더 빠져든다.. 현기증날꺼같아요...

데이터 엔지니어 너무 재미있다.. 

데이터 엔지니어 너무 재미있다..

 

 

 

 

다음편에 계속 ... 

하트 부탁해요 힣

 

반응형