0. 개요


지난 시간에 다뤘던 [Python 강의] Dataset 조작하기 (1/2)에 이어서 이번에도 데이터-셋을 가지고 장난을 쳐보자. 이전에 사용했던 뉴욕시 택시정보에 대한 축약된 데이터-셋을 이용할 요량이니, 데이터를 삭제하거나 다운로드 받지 않았다면 링크된 이전 강의를 참고하면 되겠다.



1. 준비


일단 데이터를 만지작(?)하기 전에 필요한 라이브러리를 import하고, 데이터를 읽어서 변수에 할당해놓은 작업을 선행하자.



이번에도 마찬가지로 빠른 연산을 도와주는 numpy와 데이터 처리에 필요한 pandas, 그리고 가시적인 그래프로 데이터를 표현해줄 matplotlib를 import 시켰다. 또한 변수 data, fare에 각각 파일을 읽어서 할당해주었다. 현재 필요한 라이브러리는 모두 추가했다. 진행 중에 추가적으로 다른 라이브러리가 필요할 경우 그 때 삽입해줘도 괜찮으니 진행해보자.



2. 원하는 데이터만 뽑아서 보기


변수 data, fare에 저장된 데이터-셋은 꽤 크기가 크고 14개의 열을 가지고 있기 때문에 한 눈에 파악하기도 힘들 뿐더러, 필요없는 정보를 많이 포함하고 있다. 이번에는 택시를 이용한 승객이 이동한 거리 및 이동시간에 초점을 맞춰 데이터를 각색해보자.



데이터의 특정 열만 추려서 보고 싶다면 data[['trip_distance', 'trip_time_in_secs']]처럼 대괄호 안에 원하는 열의 이름을 기재하면 된다. 첫 번째로 승객의 이동 거리와 이동시간만 추려서 최초의 3개의 열을 보여주고 있다. 다음은 레코드의 정보를 자세히 보고 싶을 경우 loc 명령어를 통해 해당 레코드의 정보를 볼 수 있다. 자세히 살펴보면 data.loc[0]의 결과와 data.head(1)의 출력의 형태만 가로/세로로 다를 뿐이지 내용은 동일한 것을 알아챌 수 있다.



3. 인터렉티브하게 데이터 조작하기


이전 강의인 [Python 강의] Jupyter/IPython의 유용한 기능에서 다뤘던 Interactive Widgets를 이용하여 실시간으로 반영되도록 데이터를 조작할 수 있다. 앞서 import 했던 라이브러리와 별개로 새로운 라이브러리가 필요하므로 다시 import 해주자.



위에서 선언한 함수는 데이터-셋의 이동거리가 기준값(distance_threshold)보다 큰 레코드의 개수를 반환한다. 생성된 위젯을 마우스로 이리저리 옮겨보면, 그에 따라서 기준값이 변하고 덩달아 조건을 만족하는 레코드의 수가 변하는 것을 확인할 수 있다.



4. 새로운 열 추가 및 숫자 연산


데이터-셋에 기존에 없던 열을 새로이 추가할 수 있다. 또한 그 추가한 열에 기존의 데이터를 가공하여 채워줄 수 있는데 다음 코드를 보자.

data['trip_time_in_mins'] = data.trip_time_in_secs / 60.0


이 코드를 보면 'trip_time_in_mins'로 이동에 걸린 시간을 분 단위로 표현하는 열을 추가하고 있다. 이 열을 채워넣기 위해 기존에 있던 'trip_time_in_secs'를 60으로 나눗셈하고 있다. 아래의 화면은 전체 데이터 중에서 trip_time_in_secs, trip_time_in_mins만 추려서 최초 3개의 레코드만 출력하여 결과를 확인하고 있다.



또한 데이터를 열 단위 뿐만아니라 행 단위로도 추려서 볼 수 있다. 아래의 화면은 특정 열의 특정 행만 출력하고 있다. 즉 행과 열로 모두 축약되었다.



데이터-셋의 열 중에서 [이동 거리]열의 [0부터 5까지]의 행을 변수 a에 할당하고 있으며, [이동 거리]열의 [2부터 6까지]의 행을 변수 b에 할당하고 있다. 재밌는 점은 이렇게 추출한 데이터도 순서를 유지하고 있기 떄문에 덧셈(+) 연산의 결과 공통된 행끼리는 가능하지만 동일한 행이 아닐 경우에는 NaN(Not a Number)로 표기되는 것을 확인할 수 있다.



5. 각종 함수


이밖에도 데이터-셋을 조작하는데 기본적으로 제공되는 함수 몇 가지를 정리해보자. 우선 dayofweek는 datetime 형식의 데이터를 받아서 해당 날짜의 요일을 반환해준다. 변수 data에 할당된 데이터의 'pickup_datetime'열을 이용하여 승객이 탑승한 요일을 알아보면 다음과 같다.



[ : : 200000]으로 범위를 지정해줘서 200,000 번 간격으로 레코드를 출력하게 했다. 이렇게 처리하지 않으면 처음 데이터는 모두 결과가 1로 출력된다. (같은 날의 데이터들이 앞쪽에 몰려있기 때문이다.) 보면 0부터 6까지 총 7개의 숫자로 요일을 표기하고 있다.


다음은 'pickup_datetime'과 'dropoff_datetime'의 날짜만 비교(시간은 무시하고) 해보자. 이를 통해서 저녁 늦게 택시를 타서 다음 날이 되서야 내린 승객을 파악할 수 있다. 아니면 정말 택시를 오래타서 다음 날 하차한 승객일수도있다. 


코드의 아웃풋 최초 10개를 출력해보면 실제로 승차한 날은 1월 1일인데, 하차일은 모두 1월 2일임을 알 수 있다. 이처럼 기본적으로 제공하는 함수를 이용하면 기존의 데이터-셋을 가지고 다양한 정보를 추출해낼 수 있다.



6. 마치며...


[Python 강의] Dataset 조작하기 (1/2)에 이어서 두 번째로 데이터 처리에 관한 글을 게시했다. 이전에 글은 그래프를 그리면서 가시적으로 결과물을 보기에 흥미로웠던 부분이 있었다면, 이번 강의는 보다 실용적인 부분에 초점이 맞춰진 것 같다. 어떻게 생각하면, 데이터를 시각화하는 것은 데이터가 정립된 이후의 작업이기 때문에 이번 포스팅에서 다뤘던 내용을 선행한 후에 이전 강의를 다루는 편이 더 나을것 같다.