Pandas 기초와 데이터 멍잉 (Data Munging)
스프레드 시트 프로그램이 업무에 많이 활용되는 이유는 GUI 환경의 간편함에 있다. 편리하게 마우스로 데이터를 조작하고 사용자가 원하는 방향으로 쉽게 편집이 가능하다. 고도로 복잡한 작업에 대해서 효율이 떨어지는 단점이 있지만, 이러한 부분도 사실 함수나 스크립트를 통해서 해결 가능하다.
그럼에도 불구하고 Python을 통해서 데이터를 다뤄야 하는 이유는 데이터의 편집 이후 과정이다. EXCEL에서도 다양한 분석 기법을 제공하지만 사용자가 원하는 방식의 데이터 분석을 진행하기 위해서는 스프레드 시트로는 다소 부족하다. GUI 환경이 오히려 제한 환경을 만든 것이다. (하지만 의외로 EXCEL이 강력한 것은 EXCEL로도 충분히 머신러닝을 구현할 수 있다.)
하지만 파이썬을 처음부터 배우고, 다루려면 시간이 걸린다. 기초 문법, 컴퓨팅적인 사고 등을 배양하고 실제 분석까지 가려면 그 긴 시간을 견뎌야 한다. 물론 모든 내용을 학습하는 것은 최고의 선택이지만 시간이 바쁜 직장인, 간단한 분석을 원하는 연구자 등을 위해 뺄 거 다 빼고 최대한 간략한 설명으로 데이터 분석을 이야기하려고 한다. 기초적인 개발 환경 구축이나 중간의 문법적인 내용들은 아마 구글을 통해 충분히 찾을 수 있으리라 생각하고, 코드와 사례 중심으로 서술한다.
Pandas는 파이썬의 데이터 관련 라이브러리(기능의 집합)로 데이터를 조작하는 것이 간편하고 특히 시계열 분석에 큰 장점을 가진다. 예를 들자면 일반적인 엑셀의 기능을 모두 포함하고 있다고 생각하면 된다. 최근에는 엑셀을 열기보다는 Pandas로 데이터를 가공하는 일이 대부분이다.
Pandas의 자료 구조는 Series와 Data Frame으로 구성되어 있다.
- Serise는 1차원 형태의 배열구조이다.
- 복수의 행으로 이루어진 하나의 열이다. (행/열이 바뀌어도 상관없음. 단 1차원만 가능)
- INDEX는 해당 자료의 위치를 나타내는 값이다.
- Data Frame은 여러의 열을 가진 형태이다.
- 엑셀과 같은 스프레드 시트를 의미하며, 흔히 우리 머릿속에 있는 '표'를 떠올리면 된다.
import numpy as np
import pandas as pd
import datetime
from datetime import datetime, date
pd.set_option('display.notebook_repr_html', False)
pd.set_option('display.max_columns', 8)
pd.set_option('display.max_rows', 10)
pd.set_option('display.width', 80)
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
numpy 라이브러리를 추가하며, 앞으로 np라는 이름으로 호출한다.
import pandas as pd
pandas 라이브러리를 추가하며, 앞으로 pd라는 이름으로 호출한다.
import는 라이브러리를 추가하는 명령이다.
numpy는 데이터 분석용 라이브러리이다. 주로 행렬, 다차원 배열의 구조, 수치계산에 많이 쓰인다.
np, pd는 사용자 편의에 맞게 변경해도 무방하다.
numpy, pandas라는 라이브러리 이름이 길기 때문에 자주 사용하는 만큼 편리한 이름으로 사용자가 사전에 정의하는 것이다.
import datetime from datetime import datetime, date
앞서 Pandas가 시계열 분석에 유용하다고 말한 것처럼 시계열 분석을 위한 '날짜 형식'을 사용하기 위하여 추가하는 라이브러리이며, datetime의 라이브러리의 datetime과 date 기능을 추가하는 것이다.
pd.set_option('display.notebook_repr_html', False)
pd.set_option('display.max_columns', 8)
pd.set_option('display.max_rows', 10)
pd.set_option('display.width', 80)
Pandas 관련 세팅 옵션들이다. 코드와 같이 순서대로 아래의 의미를 지닌다.
- 결과를 html 형식이 아닌 text 형식으로 받는다.
- 출력되는 최대 Columns(열)의 수는 8로 제한한다.
- 출력되는 최대 rosw(행)의 수는 10으로 제한한다.
- 출력되는 최대 단어의 기를 80자로 제한한다.
상기 옵션들은 결과를 보다 보기 쉽게 받기 위하여 설정하는 값이다.
import matplotlib.pyplot as plt
%matplotlib inline
시각화(차트, 그래프)를 위한 라이브러리를 추가한다.
s = pd.Series([1,2,3,4])
s라는 변수에 1,2,3,4의 값을 가진 Series 자료형을 대입한다.
두 줄의 출력 값이 나오는데, 앞의 숫자는 'INDEX'로 실제 대입한 1,2,3,4라는 값이 각 0,1,2,3의 위치에 저장되어있음을 의미한다. index는 주소를 의미하는데 이 주소로 값을 호출할 수 있다.
s[1]
1번 위치에 있는 값을 출력하는 명령이다. 1이라는 주소에는 2라는 값이 저장되어 있음을 확인할 수 있다.
s[[1,2]]
1번과 2번에 위치한 값을 호출하는 명력이다. 여러 값을 호출할 때는 [[,]] 형태로 작성한다.
ss = pd.Series([1,2,3,4], index = ['a','b','c','d'])
ss[['a','b']]
INDEX값은 사용자 임의로 주소의 이름을 변경할 수 있다. 주소의 이름을 a, b, c, d로 변경한 경우 a, b를 호출하여 값을 확인할 수 있다.
예를 들자면 어떤 한 학급에서 과학시험의 점수를 저장한 데이터를 Series 형태로 저장한다고 가정하자. 그러면, IDNEX를 학생의 이름으로 저장한다면 학생의 이름을 바탕으로 시험 점수를 호출할 수 있는 것이다.
dates = pd.date_range('2019-09-01','2019-09-06')
dates
2019년 9월 1일부터 6일까지의 날짜를 생성한다. datetime64[ns] 형태로 생성된다.
Pandas의 date_range 함수는 '시작', '종료'이며 시작일자와 종료일자 사이의 날짜를 순서대로 생성한다.
이를 통해서 실제 시계열 Series 자료를 만들어보자.
temp = pd.Series([80, 82, 85, 90, 83, 87], index = dates)
temp
날짜 값을 index로 지정하면 시계열 형태의 자료가 만들어진다. 각 날짜에 해당 값이 저장된 것을 확인할 수 있다.
temp['2019-09-02']
시계열 자료는 INDEX가 날짜 형태이므로, 날짜를 지정하며 값을 호출할 수 있다.
Pandas를 활용한 기초적인 데이터 생성 방법에 대해서 다뤘다. 다음 편에서는 데이터 프레임 형식의 자료를 다루는 방법, 외부 파일을 불러오는 방법과 간단한 시계열 그래프 그리기를 소개하고자 한다.