0. 준비


파이썬에서 기본적으로 데이터를 처리(읽거나 저장하거나 다른 형태로 재배열하는 등...)하는 프로세스는 대부분 Pandas를 이용한다. 쉽게 생각하면 Pandas로 읽어들인 데이터들을 빠르게 연산하기 위해 numpy를 사용한다고 보면 된다. 이번 시간에는 Pandas를 이용해서 '뉴욕시 택시'에 관련된 데이터-셋을 직접 다뤄볼 예정이다. 진행에 앞서 가볍게 데이터-셋를 다운받도록 하자. 실제적인 데이터는 17GB에 육박하지만 실습을 위해서는 테스트용으로 축소 제작된 80MB 정도의 작은 데이터-셋를 이용한다. 리눅스나 맥OS 환경에서 데이터-셋을 다운로드 하기위해서 명령어를 이용하면 되지만, 윈도우 환경에서는 불가하므로 웹 브라우저의 URL에 아래를 입력하도록 하자.

https://raw.githubusercontent.com/ipython-books/minibook-2nd-data/master/nyc_taxi.zip


다운로드가 완료되면 적당한 위치에 압축을 해제하고, 쥬피터 환경에서 새 파이썬 문서를 생성해주자.



1. Data read


먼저 데이터를 읽어오자. 데이터를 처리하기 위해서는 해당 데이터를 읽어서 변수에 저장하는 것이 선행되어야 한다. 데이터를 정상적으로 읽어오기 위해서는 자신이 압축을 해제했던 위치를 기억해두는 것이 좋다. 아래의 화면을 보면서 중요한 내용들을 짚어보자.



일단 기본적으로 numpy와 pandas를 사용하기 위해서 import 해주도록 하자. 또한 추후에 사용할 파이썬 내에서 그래프를 그려주기 위해서 matplotlib 역시 import 해주고, 문서 내에서 아웃풋을 확인하기 위해서 inline으로 설정해준다. 그리고 각각 변수 data_filename과 fare_filename에 읽어올 데이터의 위치를 입력하고, pandas에서제공하는 함수 read_csv를 통해 csv 문서를 data, fare 변수에 저장하도록 한다. 정상적으로 저장되었는지 확인을 위해서 data.head() 함수를 통해 처음 다섯 개의 레코드만 출력해보자.



2. 데이터 조작


조작이라고 하니 뭔가 부정적인 느낌이 들지만, 그냥 있는 데이터가지고 만지작해보자는 얘기다. 긍정적으로는 기존의 데이터를 토대로 의미있는 데이터를 추출해볼 수도 있다. 먼저, 변수 data에 저장된 데이터-셋의 열을 출력해보면 다음과 같은 열을 가지고 있는 것을 알 수 있다.



위의 열들을 각각 따로 저장하고, 일정 수식처리를 하는 함수를 제작했다. 함수 내부에 있는 연산은 [탑승 위치의 경도/위도]와 [하차 위치의 경도/위도]를 통해 이동한 거리를 계산한 것이 아닌가 예상해본다.



함수의 리턴값은 튜플인데 파이썬에서는 튜플을 한 번에 두 개의 변수에 할당할 수 있다. px, py에 동시에 할당한 후 정상적으로 할당되었는지 px를 출력해보자. 아래와 같은 화면이 나온다면 px에 데이터-셋의 일부가 제대로 할당되었음을 알 수 있다.




3. 데이터 시각화


pandas를 가지고 처리한 데이터를 그래프를 통해서 시각해보자. 이를 위해서 필요한 것이 위에서 import했던 matplotlib다. 일단 matplotlib가 제공하는 간단한 함수를 통해서 데이터-셋의 산포도를 확인해보자.

plt.scatter(px, py)



위에서 조작했던 데이터를 할당받은 px, py를 인수로 넣었더니 아래와 같은 산포도를 제공해준다. 왼쪽 상단의 점들이 집중된 점을 자세히 보기 위해서 아래의 조건으로 다시 산포도를 그려보자.



각 라인에서 크기, 점의 크기 및 투명도, 축의 이름, x축의 범위, y축의 범위, 축을 제거하고 있다. 이처럼 축소해서 보면 데이터가 나타내는 정보를 보다 명확하게 이해할 수 있다. 재미있는 점은 위의 그래프가 우리가 조작했던 데이터를 통해 얻은 산포도 그래프인데 이것이 뉴욕의 특정 지역의 지도와 유사한 것을 볼 수 있다.


위의 그래프와 구글 지도의 뉴욕시티를 비교해보면 가운데 분홍색으로 표시된 지역인 맨하튼에 지형과 거의 일치하는 것을 알 수 있다. 이를 통해서 대부분 택시 이용이 맨하튼에서 이뤄지는 것을 알 수 있는 것이다. 간단한 예지만 이처럼 데이터-셋을 통해서는 알 수 없었던 정보를 새롭게 추출할 수 있다는 점이 흥미롭다.


이밖에도 기본적인 함수를 통해서 데이터가 가지고 있는 특징들을 추려낼 수 있다. count, min, max, mean, median 등의 함수들은 전체 데이터-셋에서 레코드의 수, 최대/최소 등의 정보를 반환해준다. 이번에는 조작한 데이터를 토대로 히스토그램을 제작해보자. 먼저 보다 깔끔한 그래프를 그리기 위해서 seaborn을 설치하자. 설치하지 않아도 히스토그램을 출력할 수 있지만 설치하는 편이 가독성이 눈에 띄게 좋다.



seaborn 설치 후 아래의 명령어를 입력하면 px에 대한 히스토그램을 출력해준다. 필자는 이미 seaborn을 설치하고 import한 상태에서 진행해서 아래와 같은 그래프를 얻었다. seaborn을 import하기 이전에도 히스토그램은 생성이 가능하니, 보다 구린(?) 히스토그램을 이용하길 원한다면 seaborn을 이용하지 않으면 된다.

data.trip_distance.hist(bins=np.linspace(0., 10., 100))




4. 마치며...


pandas를 이용하여 csv 형식의 데이터를 읽어오고, numpy를 이용하여 데이터를 조작하고, matplotlib을 이용하여 조작된 데이터를 토대로 그래프를 생성했다. 또한 seaborn을 이용하여 생성한 데이터 그래프의 가독성을 높여줄 수 있었다. 이 모든 과정이 하나의 파이썬 문서 내에서 진행됐다는 점이 쥬피터 환경의 돋보이는 장점이자 흥미로운 점이다.