<jupyter_start><jupyter_text>New York City Taxi Trip Duration 01 - EDA  ※ 프로젝트 개요       ● 뉴욕시 의 택시 주행 시간을 예측하는 모델 만들기 ● 픽업 시간, 지리적 좌표, 승객 수 등의 변수가 포함된 NYC 택시 리무진 위원회에서 만든 데이터를 가공해서 사용     목표 : 데이터에 대한 EDA(탐색적 데이터 분석)을 수행        1. 데이터 불러오기<jupyter_code>import pandas as pd<jupyter_output><empty_output><jupyter_text>train 데이터<jupyter_code>train = pd.read_csv("train.csv", parse_dates = ['pickup_datetime', 'dropoff_datetime'])
print(train.shape)
train.head()<jupyter_output>(1458644, 11)<jupyter_text>test 데이터<jupyter_code>test = pd.read_csv("test.csv", parse_dates = ['pickup_datetime'])
print(test.shape)
test.head()<jupyter_output>(625134, 9)<jupyter_text>제출양식<jupyter_code>predictions = pd.read_csv("sample_submission.csv")
print(predictions.shape)
predictions.head()<jupyter_output>(625134, 2)<jupyter_text>2. 데이터 탐색  1) 변수 확인<jupyter_code>train.columns
test.columns<jupyter_output><empty_output><jupyter_text>id - 각 운행의 고유 식별자 vendor_id - 여행 기록과 연결된 공급자를 나타내는 코드 pickup_datetime - 미터기가 사용 된 날짜와 시간 dropoff_datetime - 미터가 분리 된 날짜와 시간 passenger_count - 차량에 탑승 한 승객 수 (운전자가 입력 한 값) pickup_longitude - 미터가 사용 된 경도 pickup_latitude - 미터가 사용 된 위도 dropoff_longitude - 미터가 분리 된 경도 dropoff_latitude - 미터가 분리 된 위도 store_and_fwd_flag -이 플래그는 자동차가 서버에 연결되어 있지 않아서 출장 기록이 차량 메모리에 보관되었는지 여부를 나타냅니다. - Y = 저장 및 전달; N = 상점 및 전방 여행 불가 trip_duration - 여행 기간 (초)  목표는 id별 'trip_duration' ※ test데이터에는 'dropoff_datetime'이 존재하지 않음. 이유는 "dropoff_datetime"이 있으면  'trip_duration'을 구할 수 있기 때문  2) factor형 변수 확인<jupyter_code>pd.unique(train['vendor_id'])<jupyter_output><empty_output><jupyter_text>'vendor_id'는 단 두 가지만 존재한다. 뉴욕시의 택시가 'Green Cabs'과 'Yellow Cabs' 두 가지가 있는 데 이에 대한 정보 같다.  factor형 변수이다.<jupyter_code>pd.unique(train['passenger_count'])<jupyter_output><empty_output><jupyter_text>승객수를 '0~9'명으로 표시하고 있다. 보통 택시가 승용차라서 5명 이상 승객은 잘못된 데이터일 수도 있다. 물론 벤 형태의 택시가 있을 수 있다.  factor형 변수<jupyter_code>pd.unique(train['pickup_longitude'])
pd.unique(train['dropoff_latitude'])<jupyter_output><empty_output><jupyter_text>위도(latitude) 경도(longitude)는 당연히 factor형 변수가 아니다.<jupyter_code>pd.unique(train['store_and_fwd_flag'])<jupyter_output><empty_output><jupyter_text>출장기록 여부는 'Yes'와 'NO'인 factor형 변수이다  3) 빈도수 확인<jupyter_code>train['vendor_id'].value_counts()
train['pickup_datetime'].value_counts()
train['passenger_count'].value_counts()
train['store_and_fwd_flag'].value_counts()
train.columns<jupyter_output><empty_output><jupyter_text>datetime으로 파생변수 만든 이후 빈도수 확인<jupyter_code>train['pickup_month'].value_counts()
train['dropoff_month'].value_counts()<jupyter_output><empty_output><jupyter_text>dropoff에 7월이 있는 것으로 보아 6월 30일에 택시를 타고 다음날 7월에 내린 경우가 127건<jupyter_code>month_7 = train.loc[(train['dropoff_month'] == 7)]
month_7.head()<jupyter_output><empty_output><jupyter_text>head함수로 앞부분만 봐도 밤에 출발에 새벽에 도착한 기록도 있으나 24시간 가까이 운영한 기록도 보인다.<jupyter_code>train['pickup_dayofweek'].value_counts()
train['dropoff_dayofweek'].value_counts()<jupyter_output><empty_output><jupyter_text>단순 택시 이용횟수는 금요일, 토요일 주말이 가장 많고 그 다음이 목요일이다. 월요일이 가장 적다  4) 결측치 확인<jupyter_code>train.isnull().sum()
test.isnull().sum()<jupyter_output><empty_output><jupyter_text>결측치는 보이지 않는다. 이를 missingno 패키지를 활용하여 시각화하여 다시 살펴본다.<jupyter_code>import missingno as msno
msno.matrix(df = train, figsize = (20, 14), color = (0.3, 0.4, 0.8))
msno.matrix(df = train, figsize = (20, 14))<jupyter_output><empty_output><jupyter_text>데이터에 결측치는 없다  4) 상관관계 확인  상관관계 매트릭스 가져오기 pandas 패키지의  corr() 함수 사용 heatmap : 다양한 정보를 일정 이미지 위에 열분포 형태의 비쥬얼한 그래픽으로 출력<jupyter_code>import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
cor_matrix = train.corr().round(2)
fig = plt.figure(figsize = (20, 20));
sns.heatmap(cor_matrix, annot = True, center = 0,
            cmap = sns.diverging_palette(250, 250, as_cmap = True),
            ax = plt.subplot(111));
plt.show()<jupyter_output><empty_output><jupyter_text>탑승 위치 경도와 하차 위치 경도가 0.78로 상관관계가 매우 높다 탑승 위치 위도와 하차 위치 위도는 0.49의 상관관계를 갖는다. 여행기록 코드와 탑승 승객 수가 0.29의 상관관계를 갖는다. 그러나 목표값인 'trip_duration'과 큰 상관관계가 있는 변수는 보이지 않는다.        3 데이터 변환  1) 파생변수 만들기 : 'pickup_datetime' -  연,월,일,시,분,초, 요일 나누기<jupyter_code>train['pickup_datetime'].head()
train['dropoff_datetime'].head()<jupyter_output><empty_output><jupyter_text>'pickup_datetime'<jupyter_code>train['pickup_year'] = train['pickup_datetime'].dt.year  
train['pickup_month'] = train['pickup_datetime'].dt.month
train['pickup_day'] = train['pickup_datetime'].dt.day
train['pickup_hour'] = train['pickup_datetime'].dt.hour
train['pickup_minute'] = train['pickup_datetime'].dt.minute
train['pickup_second'] = train['pickup_datetime'].dt.second
train["pickup_dayofweek"] = train["pickup_datetime"].dt.dayofweek 

train[['pickup_year','pickup_month', 'pickup_day','pickup_hour','pickup_minute','pickup_second', 'pickup_dayofweek']].head()
pd.unique(train['pickup_year'])
pd.unique(train['pickup_month'])`
test['pickup_year'] = test['pickup_datetime'].dt.year  
test['pickup_month'] = test['pickup_datetime'].dt.month
test['pickup_day'] = test['pickup_datetime'].dt.day
test['pickup_hour'] = test['pickup_datetime'].dt.hour
test['pickup_minute'] = test['pickup_datetime'].dt.minute
test['pickup_second'] = test['pickup_datetime'].dt.second
test["pickup_dayofweek"] = test["pickup_datetime"].dt.dayofweek 

test[['pickup_year','pickup_month', 'pickup_day','pickup_hour','pickup_minute','pickup_second', 'pickup_dayofweek']].head()<jupyter_output><empty_output><jupyter_text>'dropoff_datetime' - test 데이터에는 없음  ※ Test 데이터에는 없지만 분석을 위해 'dropoff_datetime' 도 연,월,일,시,분,초, 요일로 나눈다.<jupyter_code>train['dropoff_year'] = train['dropoff_datetime'].dt.year  
train['dropoff_month'] = train['dropoff_datetime'].dt.month
train['dropoff_day'] = train['dropoff_datetime'].dt.day
train['dropoff_hour'] = train['dropoff_datetime'].dt.hour
train['dropoff_minute'] = train['dropoff_datetime'].dt.minute
train['dropoff_second'] = train['dropoff_datetime'].dt.second
train["dropoff_dayofweek"] = train["dropoff_datetime"].dt.dayofweek 

train[['dropoff_year','dropoff_month', 'dropoff_day','dropoff_hour','dropoff_minute','dropoff_second', 'dropoff_dayofweek']].head()<jupyter_output><empty_output><jupyter_text>2) 원핫인코딩(One-hot encoding)   (1) store_and_fwd_flag - Y(Yes)와 N(No)을 string으로 인식하기에 원핫인코딩이 필요<jupyter_code>train['store_and_fwd_flag_Y'] = train['store_and_fwd_flag'] == 'Y'
train['store_and_fwd_flag_N'] = train['store_and_fwd_flag'] == 'N'

train[['store_and_fwd_flag', 'store_and_fwd_flag_Y', 'store_and_fwd_flag_N' ]].head()
test['store_and_fwd_flag_Y'] = test['store_and_fwd_flag'] == 'Y'
test['store_and_fwd_flag_N'] = test['store_and_fwd_flag'] == 'N'

test[['store_and_fwd_flag', 'store_and_fwd_flag_Y', 'store_and_fwd_flag_N']].head()<jupyter_output><empty_output><jupyter_text>(2) vendor_id<jupyter_code>train['vendor_1'] = train['vendor_id'] == 1
train['vendor_2'] = train['vendor_id'] == 2

train[['vendor_id', 'vendor_1', 'vendor_2']].head()
test['vendor_1'] = test['vendor_id'] == 1
test['vendor_2'] = test['vendor_id'] == 2

test[['vendor_id', 'vendor_1', 'vendor_2']].head()<jupyter_output><empty_output><jupyter_text>(3) passenger_count<jupyter_code>train['passenger_0'] = train['passenger_count'] == 0
train['passenger_1'] = train['passenger_count'] == 1
train['passenger_2'] = train['passenger_count'] == 2
train['passenger_3'] = train['passenger_count'] == 3
train['passenger_4'] = train['passenger_count'] == 4
train['passenger_5'] = train['passenger_count'] == 5
train['passenger_6'] = train['passenger_count'] == 6
train['passenger_7'] = train['passenger_count'] == 7
train['passenger_8'] = train['passenger_count'] == 8
train['passenger_9'] = train['passenger_count'] == 9

train[['passenger_count', 'passenger_0', 'passenger_1', 'passenger_2', 'passenger_3', 
       'passenger_4', 'passenger_5', 'passenger_6', 'passenger_7', 'passenger_8', 'passenger_9']].head()
test['passenger_0'] = test['passenger_count'] == 0
test['passenger_1'] = test['passenger_count'] == 1
test['passenger_2'] = test['passenger_count'] == 2
test['passenger_3'] = test['passenger_count'] == 3
test['passenger_4'] = test['passenger_count'] == 4
test['passenger_5'] = test['passenger_count'] == 5
test['passenger_6'] = test['passenger_count'] == 6
test['passenger_7'] = test['passenger_count'] == 7
test['passenger_8'] = test['passenger_count'] == 8
test['passenger_9'] = test['passenger_count'] == 9

test[['passenger_0', 'passenger_1', 'passenger_2', 'passenger_3', 'passenger_4', 
       'passenger_5', 'passenger_6', 'passenger_7', 'passenger_8', 'passenger_9']].head()<jupyter_output><empty_output><jupyter_text>3) 데이터 형태 확인<jupyter_code>train.info()<jupyter_output><class 'pandas.core.frame.DataFrame'>
Index: 1458644 entries, id2875421 to id1209952
Data columns (total 38 columns):
vendor_id               1458644 non-null int64
pickup_datetime         1458644 non-null datetime64[ns]
dropoff_datetime        1458644 non-null datetime64[ns]
passenger_count         1458644 non-null int64
pickup_longitude        1458644 non-null float64
pickup_latitude         1458644 non-null float64
dropoff_longitude       1458644 non-null float64
dropoff_latitude        1458644 non-null float64
store_and_fwd_flag      1458644 non-null object
trip_duration           1458644 non-null int64
pickup_year             1458644 non-null int64
pickup_month            1458644 non-null int64
pickup_day              1458644 non-null int64
pickup_hour             1458644 non-null int64
pickup_minute           1458644 non-null int64
pickup_second           1458644 non-null int64
pickup_dayofweek        1458644 non-null int64
dropoff_year            1458644 non-null int64
dropoff_m[...]<jupyter_text>4. 시각화  1) pickup월, 일, 시, 분, 초 별 'trip_duration'  연도는 2016년 뿐이니 제외<jupyter_code>import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

figure, ((ax1, ax2, ax3), (ax4, ax5, ax6)) = plt.subplots(nrows = 2, ncols = 3)
figure.set_size_inches(20,10)

sns.barplot(data = train, x = 'pickup_month', y = 'trip_duration', ax = ax1)
sns.barplot(data = train, x = 'pickup_day', y = 'trip_duration', ax = ax2)
sns.barplot(data = train, x = 'pickup_hour', y = 'trip_duration', ax = ax3)
sns.barplot(data = train, x = 'pickup_minute', y = 'trip_duration', ax = ax4)
sns.barplot(data = train, x = 'pickup_second', y = 'trip_duration', ax = ax5)
sns.barplot(data = train, x = 'pickup_dayofweek', y = 'trip_duration', ax = ax6)<jupyter_output><empty_output><jupyter_text>1월부터 6월까지 평균 trip_duration이 조금씩 증가하고 있다. 5일과 13일에서 평균 trip_duration이 1000이 넘는다. 적은 날은 7일과 30일 즈음이다. 시간대는 오전 5~7시에 낮고, 10시부터 15시까지는 계속 증가하다 다시 낮아진다. 22시에는 평균 trip_duration이 근처 시간대에서 높다. 분과 초는 크게 차이나지 않는다. 요일로 살펴보면 월요일(0)이 가장 짧고, 주중엔 비슷했다가 목요일에 피크를 찍고 토요일까지 계속 감소한다.<jupyter_code>%matplotlib inline

figure, ((ax1, ax2, ax3), (ax4, ax5, ax6)) = plt.subplots(nrows = 2, ncols = 3)
figure.set_size_inches(20,10)

sns.barplot(data = train, x = 'dropoff_month', y = 'trip_duration', ax = ax1)
sns.barplot(data = train, x = 'dropoff_day', y = 'trip_duration', ax = ax2)
sns.barplot(data = train, x = 'dropoff_hour', y = 'trip_duration', ax = ax3)
sns.barplot(data = train, x = 'dropoff_minute', y = 'trip_duration', ax = ax4)
sns.barplot(data = train, x = 'dropoff_second', y = 'trip_duration', ax = ax5)
sns.barplot(data = train, x = 'dropoff_dayofweek', y = 'trip_duration', ax = ax6)<jupyter_output><empty_output><jupyter_text>하루를 넘기는 7월 하차에 해당하는 평균 trip_duration 이 월등이 높다. 25일의 평균 trip_duration이 높고, 30일이 가장 낮다.  시간 별 평균 trip_duration의 경우 새벽 시간인 12시가 높고, 줄어들다 3시에 살짝 늘어났다 6시에 최저를 기록했다. 오후 3시까지 다시 증가하다가 20시부터 23시까지는 균등했다. 분과 초는 0분 0초가 가장 높았다. 요일별로 봤을 때 토요일이 가장 적다.   2) 운행기록 id, 승객 수, 메모리 저장 여부 별 'trip_duration'<jupyter_code>figure, (ax1, ax2, ax3) = plt.subplots(nrows = 1, ncols =3)
figure.set_size_inches(20,10)

sns.barplot(data = train, x = 'vendor_id', y = 'trip_duration', ax = ax1)
sns.barplot(data = train, x = 'passenger_count', y = 'trip_duration', ax = ax2)
sns.barplot(data = train, x = 'store_and_fwd_flag', y = 'trip_duration', ax = ax3)<jupyter_output><empty_output><jupyter_text>id 2의 평균 trip_duration이 높다. 승객이 0명일 때 운행 시간이 매우 높고, 1명부터 5명까지는 6명 까지는 증가하는 추세다. 7명의 경우 극도로 적으며 9명도 많은 편이다. 메모리 저장되었을 경우 trip_duration이 높다.  3) passenger_count별 vendor_id의 trip_duration<jupyter_code>sns.barplot(data = train, x = 'passenger_count', y = 'trip_duration', hue = 'vendor_id')<jupyter_output><empty_output><jupyter_text>승객수가 7명 이상은 id 2에만 해당한다. 전체적으로 id 2의 평균 trip_duration이 id 1보다 더 높다<jupyter_code>sns.barplot(data = train, x = 'vendor_id', y = 'store_and_fwd_flag', hue = 'trip_duration')<jupyter_output><empty_output><jupyter_text>임시<jupyter_code>import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
import pandas as pd

train = pd.read_csv("train.csv", parse_dates = ['pickup_datetime', 'dropoff_datetime'], index_col = "id")
test = pd.read_csv("test.csv", parse_dates = ['pickup_datetime'], index_col = "id")

train['pickup_year'] = train['pickup_datetime'].dt.year  
train['pickup_month'] = train['pickup_datetime'].dt.month
train['pickup_day'] = train['pickup_datetime'].dt.day
train['pickup_hour'] = train['pickup_datetime'].dt.hour
train['pickup_minute'] = train['pickup_datetime'].dt.minute
train['pickup_second'] = train['pickup_datetime'].dt.second
train["pickup_dayofweek"] = train["pickup_datetime"].dt.dayofweek 

test['pickup_year'] = test['pickup_datetime'].dt.year  
test['pickup_month'] = test['pickup_datetime'].dt.month
test['pickup_day'] = test['pickup_datetime'].dt.day
test['pickup_hour'] = test['pickup_datetime'].dt.hour
test['pickup_minute'] = test['pickup_datetime'].dt.minute
test['pickup_second'] = test['pickup_datetime'].dt.second
test["pickup_dayofweek"] = test["pickup_datetime"].dt.dayofweek 

train['dropoff_year'] = train['dropoff_datetime'].dt.year  
train['dropoff_month'] = train['dropoff_datetime'].dt.month
train['dropoff_day'] = train['dropoff_datetime'].dt.day
train['dropoff_hour'] = train['dropoff_datetime'].dt.hour
train['dropoff_minute'] = train['dropoff_datetime'].dt.minute
train['dropoff_second'] = train['dropoff_datetime'].dt.second
train["dropoff_dayofweek"] = train["dropoff_datetime"].dt.dayofweek 



train['store_and_fwd_flag_Y'] = train['store_and_fwd_flag'] == 'Y'
train['store_and_fwd_flag_N'] = train['store_and_fwd_flag'] == 'N'

test['store_and_fwd_flag_Y'] = test['store_and_fwd_flag'] == 'Y'
test['store_and_fwd_flag_N'] = test['store_and_fwd_flag'] == 'N'

train['vendor_1'] = train['vendor_id'] == 1
train['vendor_2'] = train['vendor_id'] == 2

test['vendor_1'] = test['vendor_id'] == 1
test['vendor_2'] = test['vendor_id'] == 2

train['passenger_0'] = train['passenger_count'] == 0
train['passenger_1'] = train['passenger_count'] == 1
train['passenger_2'] = train['passenger_count'] == 2
train['passenger_3'] = train['passenger_count'] == 3
train['passenger_4'] = train['passenger_count'] == 4
train['passenger_5'] = train['passenger_count'] == 5
train['passenger_6'] = train['passenger_count'] == 6
train['passenger_7'] = train['passenger_count'] == 7
train['passenger_8'] = train['passenger_count'] == 8
train['passenger_9'] = train['passenger_count'] == 9

test['passenger_0'] = test['passenger_count'] == 0
test['passenger_1'] = test['passenger_count'] == 1
test['passenger_2'] = test['passenger_count'] == 2
test['passenger_3'] = test['passenger_count'] == 3
test['passenger_4'] = test['passenger_count'] == 4
test['passenger_5'] = test['passenger_count'] == 5
test['passenger_6'] = test['passenger_count'] == 6
test['passenger_7'] = test['passenger_count'] == 7
test['passenger_8'] = test['passenger_count'] == 8
test['passenger_9'] = test['passenger_count'] == 9<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1523302092694826, 'fraction_numerical': 0.032096546411606114, 'mean_word_length': 6.689536031589339, 'pattern_counts': {'":': 0, '<': 114, '<?xml version=': 0, '>': 114, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '29', 'dir': 'jupyter-structured-clean-dedup', 'id': '100055', 'license': 'Apache-2.0', 'n_tokens_mistral': 7363, 'n_tokens_neox': 7874, 'n_words': 1197, 'path': 'New York City Taxi Trip Duration/New York City Taxi Trip Duration 01 -  EDA .ipynb', 'repo_name': 'todagi/DataScience_with_Kaggle', 'size': '15578'}