You are on page 1of 31

Mastering

Python for Data Science

Table of Contents
Introduction 0
원천 데이터로 시작하기 1
추론 통계 2

2
Mastering Python for Data Science

My Awesome Book
This file file serves as your book's preface, a great place to describe your book's
content and ideas.

Introduction 3
Mastering Python for Data Science

원천 데이터로 시작하기
데이터 과학의 세계에서 원천 데이터는 다양한 형식과 크기기로 되어 있다. 원천 데이터
에는 추출할 수 있는 많은 정보들이 들어 있다. 예를 들자면, 아마존에서는 사용자들이
웹사이트에서 클릭한 내용들을 모두 저장하고 있다. 이 데이터를 통해서 사용자가 가격
에 민감한지 인기 상품을 더 좋아하는지 파악할 수 있다. 아마존에서 추천 상품을 통지
받은 적이 있을텐데 그것이 바로 이런 데이터에서 나온다.

데이터 분석의 시작은 원천 데이터를 해석하는 것에서 시작한다. 데이터 해석은 다음 단


계를 거친다.

데이터 추출: 데이터는 Exel, CSV, JSON, Database 등등의 다양한 양식으로 되
어 있다. 이 장에서 소개할 파이썬의 유용한 패키지를 이용하면 아주 쉽게 다양한
출처의 데이터를 읽을 수 있다.
데이터 정제: 분석에 활용하기 위해서는 적합하게 데이터를 정리할 필요가 있다. 한
학급 학생들에 대한 데이터셋을 가지고 있다고 생각해 보자. 그 데이터셋에는 키,
몸무게 및 다양한 특징들에 대한 상세 데이터가 있다. 그 중에 키나 몸무게가 빠져
있는 행도 있을 수 있다. 분석을 수행하기 위해서는 이런 열들의 값을 무시하거나
평균값으로 대체하는 방법을 사용할 수 있다.

이 장에서 다룰 내용은 다음과 같다.

NumPy의 배열
pandas로 데이터 다루기
다양한 포맷의 데이터 읽고 쓰기
손실된 데이터 다루기
데이터 처리하기

NumPy의 배열
파이썬에는 List와 같은 데이터 구조가 있어서 배열 연산을 하는데 사용할 있지만, 복잡
한 수학 연산에 최적화 되어 있지 않기 때문에 이를 처리하기에는 부족한 점이 있다.

NumPy는 Travis Oliphant가 기본적으로 과학분야 컴퓨팅에 사용하기 위해서 만든 놀


라운 패키지이다. 다차원 배열과 행렬을 다룰수 있게 해주고, 고차원 수학 함수를 제공
한다.

원천 데이터로 시작하기 4
Mastering Python for Data Science

NumPy의 배열은 파이썬의 리스트에 비해서 더 적은 메모리를 사용해서 더 빠르게 읽고


쓸수 있다.

배열 생성하기
NumPy 배열 객체를 생성하기 위해서는 array 함수에 숫자 리스트를 넣어주면 된다.

>>> import numpy as np


>>> n_array = np.array([[0, 1, 2, 3],
[4, 5, 6, 7],
[8, 9, 10, 11]])

NumPy 배열 객체는 배열의 정보를 제공해 주는 많은 속성을 가지고 있다. 중요한 속성


들은 다음과 같은 것들이 있다.

ndim: 배열이 몇 차원인지 알려준다. 다음은 배열이 2차원인 것을 보여주고 있다.

>>> n_array.ndim
2

n_array는 2차원 배열이다.

shape: 배열의 각 차원의 크기를 알려준다.

>>> n_array.shape
(3, 4)

n_array의 첫번째 차원의 크기는 3이고 두번째 차원의 크기는 4이다. 이것은 3행
과 4열로 표현될 수 있다.

size: 요소의 개수를 알려준다.

>>> n_array.size
12

n_array안에 있는 요소의 전체 개수는 12이다.


dtype: 배열에 있는 요소의 데이터 타입을 알려준다.

원천 데이터로 시작하기 5
Mastering Python for Data Science

>>> n_array.dtype.name
int64

n_array안에는 int64 형식의 숫자가 저장된다.

수학 연산
배열 데이터가 있을때 이에 대한 수학 연산을 하고자 할 것이다. 다음 섹션에서 몇가지
중요한 연산에 대해서 논의하도록 하자.

배열 뺄셈
다음 명령은 배열 a에서 배열 b를 빼서 결과 값인 배열 c를 얻는 것이다. 뺄셈은 요소별
로 이루어 진다.

>>> a = np.array( [11, 12, 13, 14])


>>> b = np.array( [ 1, 2, 3, 4])
>>> c = a - b
>>> c
Array[10 10 10 10]

두 배열을 뺄셈을 하면 그 결과는 동일한 차원임을 알아두자자

배열 제곱
다음 명령은 각 항목에 대해서 2 제곱한 결과를 가져온다.

>>> b**2
[1 4 9 16]

배열 삼각함수
다음 명령은 배열 b의 각 값에 대해서 코사인한 결과를 보여준다.

>>> np.cos(b)
[ 0.54030231 -0.41614684 -0.9899925 -0.65364362]

원천 데이터로 시작하기 6
Mastering Python for Data Science

조건 연산
다음 명령은 배열 b의 각 항목에 대해서 Boolean 값을 얻기 위한 조건 연산을 적용한 결
과를 보여준다.

>>> b<2
[ True False False False]

수열 곱셈
두개 수열은 요소 대 요소나 점곱을 통해서 곱하기 할 수 있다. 다음 명령은 요소 대 요소
곱셈을 보여준다.

>>> A1 = np.array([[1, 1],


[0, 1]])
>>> A2 = np.array([[2, 0],
[3, 4]])
>>> A1 * A2
[[2 0]
[0 4]]

점곱은 다음 명령으로 수행할 수 있다.

>>> np.dot(A1, A2)


[[5 4]
[3 4]]

인덱싱과 자르기
배열의 특정 요소를 선택하고자 한다면 인덱스를 사용하면 된다.

>>> n_array[0,1]
1

위의 명령은 첫번째 배열을 선택하고 그 안의 2번째 값을 선택한다. 그것은 첫번째 행과


두번째 열의 교차점을 보여주는 것이기도 하다.

원천 데이터로 시작하기 7
Mastering Python for Data Science

행의 여러 값들의 범위를 선택하고자 하면 다음 명령을 사용하면 된다.

>>> n_array[ 0 , 0:3 ]


[0 1 2]

0:3 값은 첫번째 행의 첫 3개의 숫자를 선택한다.

행의 전체값을 선택하는 것은 다음과 같이 하면 된다.

>>> n_array[ 0 , : ]
[0 1 2 3]

다음 명령을 사용하면 열 전체값을 선택할 수 있다.

>>> n_array[ : , 1 ]
[1 5 9]

모양 조작
배열이 생성된 이후에 모양을 변경할 수 있다. 다음 명령을 통해서 배열을 평평하게 할
수 있다.

>>> n_array.ravel()
[ 0 1 2 3 4 5 6 7 8 9 10 11]

다음 명령은 배열을 4개 행과 2개 열 형태로 변경시킨다. 모양을 변경시킬때 새로운 모


양의 배열은 이전과 동일한 개수의 요소를 가진다.

>>> n_array.shape = (6,2)


>>> n_array
[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]
[ 8 9]
[10 11]]

원천 데이터로 시작하기 8
Mastering Python for Data Science

배열을 이항(transpose)할 수도 있다.

>>> n_array.transpose()
[[ 0 2 4 6 8 10]
[ 1 3 5 7 9 11]]

pandas로 데이터 분석 향상시키기


pandas 라이브러리는 Wes McKinny가 AQR Capital Management에서 일할때 만들
었다. 그는 금융 데이터에 대한 정량적 분석을 유연하게 할 수 있는 도구를 원했다. 후에
Chang She가 합류하여 이 패키지가 발전하는데 도움을 주었다.

pandas 라이브러리는 데이터 분석석을 위한 오픈소스 파이썬 라이브러리이다. 이것은


NumPy를 기반으로 했고 데이터를 쉽게 다룰 수 있도록 한다. NumPy는 수열을 잘 다
룰 수 있게 해주는 상당히 로우 레벨의 도구이다.

pandas 라이브러리는 데이터를 다루는데 있어서 파이썬 세계에 R의 풍부함을 가져왔


다. 이것은 데이터를 처리하고 빠르게 조인을 수행하고 다양한 소스로부터 데이터를 읽
기에 효율적인 데이터 구조를 가지고 있다.

pandas의 데이터 구조
pandas 라이브러리는 기본적으로 세가지 데이터 구조를 가지고 있다.

1. Series
2. DataFrame
3. Panel

Series
Series는 1차원 배열이다. 이것은 정수, 실수, 문자열, 파이썬 객체 등등 모든 데이터 타
입을 저장할 수 있다. 시리즈는 다음과 같이 생성할 수 있다.

원천 데이터로 시작하기 9
Mastering Python for Data Science

>>> import pandas as pd


>>> pd.Series(np.random.randn(5))
0 0.733810
1 -1.274658
2 -1.602298
3 0.460944
4 -0.632756
dtype: float64

random.randn 매개변수는 NumPy 패키지에서 제공하는 임의의 숫자를 생성하는 기능


이다. series 함수는 인덱스를 가지고 있는 pandas series를 만들어 준다. 화면에 출력
된 첫번째 열이 인덱스이고 두번째 열은 임의로 생성된 숫자이다. 마지막 줄은 시리즈의
데이터 타입이다.

시리즈의 인덱스는 다음처럼 변경을 할 수 있다.

>>> pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])


a -0.929494
b -0.571423
c -1.197866
d 0.081107
e -0.035091
dtype: float64

시리즈는 파이썬의 dict로부터 만들 수도 있다.

>>> d = {'A': 10, 'B': 20, 'C': 30}


>>> pd.Series(d)
A 10
B 20
C 30
dtype: int64

DataFrame

원천 데이터로 시작하기 10
Mastering Python for Data Science

DataFrame은 여러가지 데이터 타입이 가능한 열을 가지는 2차원 데이터 구조이다. 이


것은 테이블처럼 보인다. DataFrame은 다음 데이터 구조들로 부터 만들 수 있다.

NumPy 배열
Lists
Dicts
Series
2차원 NumPy 배열열

DataFrame은 Series의 dict로부터 만들 수 있다.

>>> d = {'c1': pd.Series(['A', 'B', 'C']),


'c2': pd.Series([1, 2., 3., 4.])}
>>> df = pd.DataFrame(d)
>>> df
c1 c2
0 A 1
1 B 2
2 C 3
3 NaN 4

DataFrame은 list의 dict로 만들 수도 있다.

>>> d = {'c1': ['A', 'B', 'C', 'D'],


'c2': [1, 2.0, 3.0, 4.0]}
>>> df = pd.DataFrame(d)
>>> print df
c1 c2
0 A 1
1 B 2
2 C 3
3 D 4

Panel
Panel은 3차원 데이터를 다루는 데이터 구조이다. 다음은 panel 데이터를 다루는 예제
이다.

원천 데이터로 시작하기 11
Mastering Python for Data Science

>>> d = {'Item1': pd.DataFrame(np.random.randn(4, 3)),


'Item2': pd.DataFrame(np.random.randn(4, 2))}
>>> pd.Panel(d)

<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 4 (major_axis) x 3 (minor_axis)
Items axis: Item1 to Item2
Major_axis axis: 0 to 3
Minor_axis axis: 0 to 2

앞의 명령어는 2개의 아이템에 DataFrame이 들어 있는 것을 나타내고 있다. 4개의 행


을 표현하는 주축과 3개의 열을 표현하는 보조축이 있다.

데이터 넣기 / 내보내기
데이터는 CSV, TSV, 데이터베이스 등 다양한 형태로 저장된다. pandas 라이브러는 이
런 다양한 형태로부터 데이터를 편리하게 읽어들이거나 내보낼 수 있게 해준다. 우리는
미국 학생의 몸무게 통계 정보가 들어 있는 데이터셋을 사용할 것이다.

파일은 다음 구조로 되어 있다.

원천 데이터로 시작하기 12
Mastering Python for Data Science

컬럼 설명
LOCATION CODE 지역 코드
COUNTRY 학교가 속한 주
AREA NAME 학교가 속한 지역
REGION 학교가 속한 구
SCHOOL YEARS 년도
NO. OVERWEIGHT 과체중 학생 수
PCT OVERWEIGHT 과체중 학생 퍼센트
NO. OBESE 비만 학생 수
PCT OBESE 비만 학생 퍼센트
NO. OVERWEIGHT OR OBESE 과체중이거나 비만인 학생 수
PCT OVERWEIGHT OR OBESE 과체중이거나 비만인 학생 퍼센트
GRADE LEVEL 초등학교, 고등학교 구분
AREA TYPE 지역 타입
STREET ADDRESS 학교 주소
CITY 학교가 속한 도시
STATE 학교가 속한 주
ZIP CODE 학교 우편번호
Location 1 경도, 위도 주소

CSV
csv 파일에서 데이터를 읽기 위해서는 다음과 같이 read_csv 함수를 사용한다.

원천 데이터로 시작하기 13
Mastering Python for Data Science

>>> d = pd.read_csv('Data/Student_Weight_Status_Category_
Reporting_Results__Beginning_2010.csv')
>>> d[0:5]['AREA NAME']
0 1 2 3 4
RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT
RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT
RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT
COHOES CITY SCHOOL DISTRICT
COHOES CITY SCHOOL DISTRICT

read_csv 함수는 csv 파일 경로를 받아서 데이터를 읽는다. 데이터의 처음 5행의


Location 컬럼 내용을 출력하고 있다.

csv 파일에 데이터를 쓰기 위해서는 to_csv 함수를 사용한다.

>>> d = {'c1': pd.Series(['A', 'B', 'C']),


'c2': pd.Series([1, 2., 3., 4.])}
>>> df = pd.DataFrame(d)
>>> df.to_csv('sample_data.csv')

DataFrame의 내용을 to_csv 메서드를 통해서 csv 파일에 기록했다. 저장할 파일의 경
로를 넘겨주어야 한다.

XLS
엑셀 파일에서 데이터를 읽기 위해서는 xlrd 패키지를 추가로 설치해야 한다.

>>> d=pd.read_excel('Data/Student_Weight_Status_Category
_Reporting_Results__Beginning_2010.xls')

CSV 읽을때의 명령어와 유사하다. 엑셀 파일에 쓰기 위해서는 xlwt 패키지를 추가로 설


치해야 한다.

>>> df.to_excel('sample_data.xls')

JSON

원천 데이터로 시작하기 14
Mastering Python for Data Science

JSON 파일에서 데이터를 읽기 위해서는 파이썬의 기본 패키지인 json을 사용한다. 파


일을 읽는 명령어는 다음과 같다.

>>> import json


>>> json_data = open('Data/Student_Weight_Status_Category
_Reporting_Results__Beginning_2010.json')
>>> data = json.load(json_data)
>>> json_data.close()

open() 함수는 파일에 대한 연결을 연다. json.load() 함수는 데이터를 읽어 들인다.


json_data.close() 함수는 파일에 대한 연결을 닫는다.

pandas 라이브러리에는 JSON 파일을 읽는 함수도 제공한다. pd.read_json()을 사용


해서 읽어 들일 수 있다.

Database
데이터베이스로부터 데이터를 읽기 위해서는 다음 함수를 사용한다.

>>> pd.read_sql_table(table_name, con)

앞의 명령어를 통해서 DataFrame을 생성한다. 테이블명과 SQLAlchemy 엔진이 주어


지면 DataFrame을 반환한다. 이 함수는 DBAPI 연결을 지원하지 않는다. 매개변수의
의미는 다음과 같다.

table_name : 데이터베이스의 테이블 이름을 가르킨다.


con : SQLAlchemy 엔진을 가르킨다.

다음 명령어는 SQL 쿼리 결과를 DataFrame으로 읽어 들인다.

>>> pd.read_sql_query(sql, con)

매개변수의 의미는 다음과 같다.

sql : 실행할 SQL 쿼리문을 가르킨다.


con : SQLAlchemy 엔진을 가르킨다.

원천 데이터로 시작하기 15
Mastering Python for Data Science

데이터 정제
원천 데이터는 일반적으로 분석을 하거나 대시보드를 만들기 위해서 정제하는 작업이
필요하다. 데이터에 이슈가 생기는 여러가지 이유가 있다. 예를 들자면, 판매점의 POS
시스템이 오작동을 하거나 값들이 누락된 상태로 입력이 되기도 한다. 이런 데이터를 어
떻게 다뤄야 할지에 대해서 살펴보도록 하자.

누락된 데이터 점검하기


일반적으로 대부분의 데이터는 누락된 값들을 가지고 있다. 여기에는 다양한 이유가 있
을 수 있다. 데이터를 수집하는 시스템이 값들을 수집하지 않거나 값 자체가 존재하지
않기도 한다. 데이터를 읽어들인 후 누락된 항목을 점검하는 것은 필수이다. 이런 요건
에 맞추어 누락된 데이터는 처리될 필요가 있다. 누락된 값은 제거하거나 특정값으로 대
체하는 방법으로 처리할 수 있다.

학생 몸무게 데이터에서 location 컬럼에서 누락된 값이 있는지를 점검하기 위해서 다음


과 같은 명령어를 수행한다.

>>> d['Location 1'].isnull()


0 False
1 False
2 False
3 False
4 False
5 False
6 False

notnull() 메서드는 각 행에 대해서 TRUE나 FALSE 값을 출력한다. False이면 누락된


값이 있다는 것을 의미한다. 누락된 값의 갯수를 알기 위해 에 대해서 총계를 낼 수 있다.

>>> d['Location 1'].isnull().value_counts()


False 3246
True 24
dtype: int64

원천 데이터로 시작하기 16
Mastering Python for Data Science

Location 1 컬럼에는 24개의 누락된 값이 존재한다는 것을 보여주고 있다. 누락된 값에


대해서는 해당 행을 제거하거나 값을 대체하는 방법으로 처리할 수 있다. 행을 제거하기
위해서는 다음 명령을 실행한다.

>>> d = d['Location 1'].dropna()

어떤 컬럼이라도 누락된 값이 있는 행을 제거하려면 다음 명령어를 수행한다.

>>> d = d.dropna(how='any')

누락된 데이터 채우기


작업에 사용할 DataFrame을 준비하자.

>>> df = pd.DataFrame(np.random.randn(5, 3), index=['a0', 'a10',


'a20', 'a30', 'a40'],
columns=['X', 'Y', 'Z'])
>>> df
X Y Z
a0 -0.854269 0.117540 1.515373
a10 -0.483923 -0.379934 0.484155
a20 -0.038317 0.196770 -0.564176
a30 0.752686 1.329661 -0.056649
a40 -1.383379 0.632615 1.274481

null 값을 가지는 행을 추가한다.

원천 데이터로 시작하기 17
Mastering Python for Data Science

>>> df2 = df.reindex(['a0', 'a1', 'a10', 'a11', 'a20', 'a21',


'a30', 'a31', 'a40', 'a41'])
>>> df2
X Y Z
a0 -1.193371 0.912654 -0.780461
a1 NaN NaN NaN
a10 1.413044 0.615997 0.947334
a11 NaN NaN NaN
a20 1.583516 1.388921 0.458771
a21 NaN NaN NaN
a30 0.479579 1.427625 1.407924
a31 NaN NaN NaN
a40 0.455510 -0.880937 1.375555
a41 NaN NaN NaN

df2에 있는 null 값을 0으로 채우고 싶을때는 다음을 수행하면 된다.

>>> df2.fillna(0)
X Y Z
a0 -1.193371 0.912654 -0.780461
a1 0.000000 0.000000 0.000000
a10 1.413044 0.615997 0.947334
a11 0.000000 0.000000 0.000000
a20 1.583516 1.388921 0.458771
a21 0.000000 0.000000 0.000000
a30 0.479579 1.427625 1.407924
a31 0.000000 0.000000 0.000000
a40 0.455510 -0.880937 1.375555
a41 0.000000 0.000000 0.000000

null 값을 가지는 컬럼의 이전 값을 사용하는 방법인 전방 전파(forward propagation)로


채우기 위해서는 다음 명령을 수행한다.

원천 데이터로 시작하기 18
Mastering Python for Data Science

>>> df2.fillna(method='pad') #filling with forward propagation


X Y Z
a0 -1.193371 0.912654 -0.780461
a1 -1.193371 0.912654 -0.780461
a10 1.413044 0.615997 0.947334
a11 1.413044 0.615997 0.947334
a20 1.583516 1.388921 0.458771
a21 1.583516 1.388921 0.458771
a30 0.479579 1.427625 1.407924
a31 0.479579 1.427625 1.407924
a40 0.455510 -0.880937 1.375555
a41 0.455510 -0.880937 1.375555

컬럼의 평균값으로 null 값을 채우기 위해서는 다음 명령을 수행한다.

>>> df2.fillna(df2.mean())
X Y Z
a0 -1.193371 0.912654 -0.780461
a1 0.547655 0.692852 0.681825
a10 1.413044 0.615997 0.947334
a11 0.547655 0.692852 0.681825
a20 1.583516 1.388921 0.458771
a21 0.547655 0.692852 0.681825
a30 0.479579 1.427625 1.407924
a31 0.547655 0.692852 0.681825
a40 0.455510 -0.880937 1.375555
a41 0.547655 0.692852 0.681825

문자열 처리
데이터에서 문자열 컬럼을 수정하고 싶을때 다음 문자열 처리 명령을 사용할 수 있다.

substring : 데이터 수정에 예제로 사용하기 위해서 AREA NAME 컬럼을 처음 5


개 행만 가져오도록 하자.

원천 데이터로 시작하기 19
Mastering Python for Data Science

>>> df = pd.read_csv('Data/Student_Weight_Status_Category_
Reporting_Results__Beginning_2010.csv')
>>> df['AREA NAME'][0:5]

0 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT


1 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT
2 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT
3 COHOES CITY SCHOOL DISTRICT
4 COHOES CITY SCHOOL DISTRICT
Name: AREA NAME, dtype: object

Area Name 컬럼의 첫번째 단어만 추출하기 위해서 extract 함수를 사용한다.

>>> df['AREA NAME'][0:5].str.extract('(\w+)')

0 RAVENA
1 RAVENA
2 RAVENA
3 COHOES
4 COHOES
Name: AREA NAME, dtype: object

앞의 예제에서 시리즈의 str 속성이 사용되었다. str 클래스는 extract 메서드를 가지고
있다. 이 메서드는 정규식을 지원한다. 두번째 단어를 별도의 컬럼으로 추출하는 것도
가능하다.

>>> df['AREA NAME'][0:5].str.extract('(\w+)\s(\w+)')


0 1
0 RAVENA COEYMANS
1 RAVENA COEYMANS
2 RAVENA COEYMANS
3 COHOES CITY
4 COHOES CITY

데이터를 별도의 컬럼으로 추출하기 위해서는 정규식에서 둥근 괄호를 각각 사용하면


된다.

원천 데이터로 시작하기 20
Mastering Python for Data Science

filtering : 데이터가 ELEMENTARY인 것만 걸러내기 위해서는 다음과 같이 사용


한다.

>>> df[df['GRADE LEVEL'] == 'ELEMENTARY']

Uppercase : 대문자로 값을 변경하기 위해서는 다음 명령을 사용한다.

>>> df['AREA NAME'][0:5].str.upper()


0 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT
1 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT
2 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT
3 COHOES CITY SCHOOL DISTRICT
4 COHOES CITY SCHOOL DISTRICT
Name: AREA NAME, dtype: object

데이터가 원래 대문자로 되어 있기 때문에 별다른 차이가 없다.

Lowercase : 소문자로 값을 변경하기 위해서는 다음 명령을 사용한다.

>>> df['AREA NAME'][0:5].str.lower()


0 ravena coeymans selkirk central school district
1 ravena coeymans selkirk central school district
2 ravena coeymans selkirk central school district
3 cohoes city school district
4 cohoes city school district
Name: AREA NAME, dtype: object

Length : Area Name 컬럼의 값의 길이를 알기 위해서는 다음 명령을 사용한다.

>>> df['AREA NAME'][0:5].str.len()


0 47
1 47
2 47
3 27
4 27
Name: AREA NAME, dtype: int64

원천 데이터로 시작하기 21
Mastering Python for Data Science

Split : 공백문자를 기준으로 Area Name을 나누기 위해서는 다음 명령을 사용한


다.

>>> df['AREA NAME'][0:5].str.split(' ')


0 [RAVENA, COEYMANS, SELKIRK, CENTRAL, SCHOOL, D...
1 [RAVENA, COEYMANS, SELKIRK, CENTRAL, SCHOOL, D...
2 [RAVENA, COEYMANS, SELKIRK, CENTRAL, SCHOOL, D...
3 [COHOES, CITY, SCHOOL, DISTRICT]
4 [COHOES, CITY, SCHOOL, DISTRICT]
Name: AREA NAME, dtype: object

Replace : 끝에 나오는 DISTRICT를 DIST로 바꾸는 명령은 다음과 같다.

>>> df['AREA NAME'][0:5].str.replace('DISTRICT$', 'DIST')


0 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DIST
1 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DIST
2 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DIST
3 COHOES CITY SCHOOL DIST
4 COHOES CITY SCHOOL DIST
Name: AREA NAME, dtype: object

첫번째 매개변수는 찾을 문자열 형식에 대한 정규식이다. 그리고 두번째 매개변수는 대


체할 값이다.

데이터 병합
데이터를 합치기 위해서는 pandas에 있는 concat를 활용하면 된다. Area Name과
Country 컬럼을 첫 5줄을 가져오자.

>>> d[['AREA NAME', 'COUNTY']][0:5]


AREA NAME COUNTY
0 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
1 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
2 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
3 COHOES CITY SCHOOL DISTRICT ALBANY
4 COHOES CITY SCHOOL DISTRICT ALBANY

원천 데이터로 시작하기 22
Mastering Python for Data Science

데이터를 다음으로 나눌 수 있다.

We can divide the data as follows:


>>> p1 = d[['AREA NAME', 'COUNTY']][0:2]
>>> p2 = d[['AREA NAME', 'COUNTY']][2:5]

첫 두줄은 p1, 나머지 세줄은 p2에 있다. 이 조각들을 concat() 함수를 이용해서 합칠 수
있다.

>>> pd.concat([p1,p2])
AREA NAME COUNTY
0 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
1 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
2 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
3 COHOES CITY SCHOOL DISTRICT ALBANY
4 COHOES CITY SCHOOL DISTRICT ALBANY

합쳐진 조각들을 특정하기 위해서 key를 지정할 수 있다.

>>> concatenated = pd.concat([p1,p2], keys = ['p1','p2'])


>>> concatenated
AREA NAME COUNTY
p1 0 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
1 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
p2 2 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
3 COHOES CITY SCHOOL DISTRICT ALBANY
4 COHOES CITY SCHOOL DISTRICT ALBANY

key를 이용해서 합쳐진 데이터에서 조각을 다시 추출할 수 있다.

>>> concatenated.ix['p1']
AREA NAME COUNTY
0 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY
1 RAVENA COEYMANS SELKIRK CENTRAL SCHOOL DISTRICT ALBANY

데이터 연산

원천 데이터로 시작하기 23
Mastering Python for Data Science

누락된 데이터를 처리한 다음에 데이터에 다양한 연산을 수행할 수 있다.

집합 연산
수치 필드에 대하서 수행할 수 있는 평균, 합계 등의 다양한 집합 연산들이 있다. 이를 수
행하기 위한 메서드는 다음과 같다.

평균 : ELEMENTARY 레벨의 학교에서 비만인 학생 수의 평균을 구하기 위해서


우선 다음 명령을 통해서 ELEMENTARY 레벨의 데이터만 걸러낸다.

>>> data = d[d['GRADE LEVEL'] == 'ELEMENTARY']

다음 명령어로 비만학생 수의 평균을 구한다.

>>> data['NO. OBESE'].mean()


213.41593780369291

ELEMENTARY 등급 데이터가 data 객체에 들어있다. 비만 학생수를 가지고 있는


NO. OBESE 컬럼을 선택해서 mean() 메서드를 사용했다. 결과로 평균값이 나온
다.
합계 : 전체 학교에 대해서 전체 비만 학생수를 얻기 위해서 다음 명령어를 사용한
다.

>>> data['NO. OBESE'].sum()


219605.0

최대값 : 비만 학생수의 최대값을 구하기 위해서는 다음 명령어를 사용한다.

>>> data['NO. OBESE'].max()


48843.0

최소값 : 비만 학생수의 최소값을 구하기 위해서는 다음 명령어를 사용한다.

>>> data['NO. OBESE'].min()


5.0

표준편차 : 비만 학생수의 표준편차를 구하기 위해서는 다음 명령어를 사용한다.

원천 데이터로 시작하기 24
Mastering Python for Data Science

>>> data['NO. OBESE'].std()


1690.3831128098113

갯수 : ELEMENTARY 등급의 DELAWARE에 있는 학교 갯수를 구하기 위해서는


다음 명령을 사용한다.

>>> data = df[(d['GRADE LEVEL'] == 'ELEMENTARY') & (d['COUNTY'] ==


>>> data['COUNTY'].count()
19

테이블은 ELEMENTARY 등급급과 DELAWARE 지역으로 필터되었다. 조건들은


원괄호로 둘러싸여 있는 것을 주목하라. 이로 인해서 각각의 조건들이 평가된 것이
다. 만약에 원괄호가 없다면 에러가 발생한다.

Joins
pandas를 이용해서 DataFrame에 SQL과 같은 join를 수행할 수 있다. 각 등급에 레벨
을 지정하기 위해서 lookup DataFrame을 다음과 같이 정의하자.

>>> grade_lookup = {'GRADE LEVEL': pd.Series(['ELEMENTARY',


'MIDDLE/HIGH', 'MISC']),
'LEVEL': pd.Series([1, 2, 3])}
>>> grade_lookup = pd.DataFrame(grade_lookup)

join을 수행할 예제로서 GRADE 컬럼에 대해서 첫 5줄을 가져온다.

>>> df[['GRADE LEVEL']][0:5]


GRADE LEVEL
0 DISTRICT TOTAL
1 ELEMENTARY
2 MIDDLE/HIGH
3 DISTRICT TOTAL
4 ELEMENTARY

inner join

원천 데이터로 시작하기 25
Mastering Python for Data Science

다음 그림이 inner join을 의미한다.

inner join은 다음 명령으로 수행한다.

>>> d_sub = df[0:5].join(grade_lookup.set_index(['GRADE LEVEL']),


on=['GRADE LEVEL'], how='inner')
>>> d_sub[['GRADE LEVEL', 'LEVEL']]
GRADE LEVEL LEVEL
1 ELEMENTARY 1
4 ELEMENTARY 1
2 MIDDLE/HIGH 2

join() 메서드의 첫번째 매개변수는 lookup할 DataFrame이 들어온다. grade_lookup


DataFrame의 인덱스를 set_index() 메서드로 지정한 것을 주목하자. 이것은 join을 위
해서는 필수적인 것이다. 이것이 없다면 join 메서드는 DataFrame의 어떤 컬럼에 join
을 해야 하는지 알수 없다.

두번째 매개변수는 join할 df DataFrame의 컬럼이다. 세번째 매개변수는 inner join임


을 결정한다.

left outer join

다음 그림이 left outer join을 의미한다.

원천 데이터로 시작하기 26
Mastering Python for Data Science

left outer join은 다음 명령으로 수행한다.

>>> d_sub = df[0:5].join(grade_lookup.set_index(['GRADE LEVEL']),


on=['GRADE LEVEL'], how='left')
>>> d_sub[['GRADE LEVEL', 'LEVEL']]

GRADE LEVEL LEVEL


0 DISTRICT TOTAL NaN
1 ELEMENTARY 1
2 MIDDLE/HIGH 2
3 DISTRICT TOTAL NaN
4 ELEMENTARY 1

DISTRICT TOTAL은 LEVEL 값이 없는 것을 볼 수 있다. lookup DataFrame이


DISTRICT TOTAL을 가지고 있지 않기 때문이다.

full outer join

다음 그림이 full outer join을 의미한다.

원천 데이터로 시작하기 27
Mastering Python for Data Science

full outer join은 다음 명령으로 수행한다.

>>> d_sub = df[0:5].join(grade_lookup.set_index(['GRADE LEVEL']),


on=['GRADE LEVEL'], how='outer')
>>> d_sub[['GRADE LEVEL', 'LEVEL']]

GRADE LEVEL LEVEL


0 DISTRICT TOTAL NaN
3 DISTRICT TOTAL NaN
1 ELEMENTARY 1
4 ELEMENTARY 1
2 MIDDLE/HIGH 2
4 MISC 3

groupby 함수
pandas에서 SQL과 같은 group by 연산을 하는 것은 매우 쉽다. 각 등급별 비만자수 합
계를 구하기 위해서는 다음과 같이 하면 된다.

원천 데이터로 시작하기 28
Mastering Python for Data Science

>>> df['NO. OBESE'].groupby(df['GRADE LEVEL']).sum()

GRADE LEVEL
DISTRICT TOTAL 127101
ELEMENTARY 72880
MIDDLE/HIGH 53089

먼저 비만 학생수 컬럼을 선택하고, 등급별로 그룹을 만들고 마지막으로 sum 메서드로


합계를 구한다. 다음으로 똑같은 처리를 할 수 있다.

>>> df['NO. OBESE'].groupby(df['GRADE LEVEL']).aggregate(sum)

여기에서는 aggregate 메서드를 사용했다. 결과값을 얻기 위해서 sum 함수를 매개변


수로 넘겼다.

여러 종류의 집합 연산을 같은 형식으로 처리할 수 있다.

>>> df['NO. OBESE'].groupby(d['GRADE LEVEL']).aggregate([sum, mean,


std])

sum mean std


GRADE LEVEL
DISTRICT TOTAL 127101 128.384848 158.933263
ELEMENTARY 72880 76.958817 100.289578
MIDDLE/HIGH 53089 59.251116 65.905591

정리
이 장에서 NumPy와 pandas 패키지에 익숙해지는 시간을 가졌다. pandas의 데이터 타
입의 차이와 어떻게 사용하는지에 대해서 이해했다. 누락된 데이터를 다루고 문자열 연
산을 수행하는 데이터 정제와 처리 방법에 대해서 배웠다. 여기에서는 데이터 과학의 기
초만을 다뤘다. NumPy와 pandas에 대해서 더 자세히 알고자 한다면 다음을 참고하자.

NumPy 문서 : http://docs.scipy.org/doc/
Pandas 문서 : http://pandas.pydata.org/

원천 데이터로 시작하기 29
Mastering Python for Data Science

다음 장에서는 추론통계에 대해서 살펴보자.

원천 데이터로 시작하기 30
Mastering Python for Data Science

추론 통계
추론 통계를 이해하기 전에 기술 통계에 대해서 살펴보도록 하자.

기술 통계는

추론 통계 31

You might also like