목차
1) numpy 기초
2) pandas DataFrame의 구조와 기능
파이썬 문법을 배우던 데이터 다루기 강의가 끝나고, 데이터 다듬기로 넘어왔다.
데이터 다듬기부터는 실제 데이터테이블(보통 수백 개 이상의 데이터가 있다.)을 다루게 되며,
이를 다루기 위해 정보처리 라이브러리 numpy와 pandas, 시각화 라이브러리 matplotlib과 seaborn을 쓴다.
오늘은 numpy의 배열(array)과 pandas의 Series, DataFrame에 대해 배우고,
이를 다루기 위해 DataFrame의 속성과 pandas 함수에 대해 알아보자.
numpy 기초
numpy는 본질적으로 수학적 처리를 위한 라이브러리이다.
강사님께서는 데이터분석 측면에서 기반이 된다는 정도만 알고 있으면 된다셨다.
데이터 분석 플로우에서 우리는 필연적으로 배열, 즉 array 객체를 만난다.
이 array가 numpy 라이브러리에 포함되어 있다.
일단 기초적인 import문부터.
# numpy 라이브러리를 별칭 np로 호출
import numpy as np
# pandas 라이브러리를 별칭 pd로 호출
import pandas as pd
# matplotlib.pyplot 라이브러리를 별칭 plt로 호출
import matplotlib.pyplot as plt
# seaborn 라이브러리를 별칭 sns로 호출
import seaborn as sns
import와 as 색처리가 마음에 안 든다.
저 별칭들은 일종의 국룰인듯 하다.
numpy랑 pandas는 데이터 탐색과 분석에 쓰이는 라이브러리이고,
matplotlib.pyplot과 seaborn은 시각화, 즉 데이터로 그래프를 그릴 때 쓰는 라이브러리이다.
이 네 개는 고정적으로 사용되니 이왕 할 떄 다 import 해버리는게 좋다시더라.
사족
맨 처음 공부 시작할때는 라이브러리가 뭔지도 몰랐다.
라이브러리, 패키지 둘 다 혼용되어 쓰이는 것 같은데, 단순히 말하자면 자원의 모임이다.
이 '자원'은 함수일 수도 있고, 자료형, 메서드일 수도 있다.
import 문에서 라이브러리를 별칭으로 저장했기 때문에, '별칭.함수'의 형태로 함수를 쓸 수 있다.
같은 .을 쓴다는 점에서 메서드와 헷갈릴 수도 있는 방법인데,
예전 포스트에서도 보았듯 메서드는 동작 그 자체, 함수는 일정하게 동작하는 도구나 틀이다.
따라서 자기가 동작을 해야 하는 객체는 '.메서드' ex) list.append()
창고에서 도구를 꺼내 오는 라이브러리는 '.함수' ex) pd.read_csv()
나는 이렇게 이해했다.
아무튼, 우리가 numpy를 다루는 이유는 첫째도 둘째도 셋째도 배열(array)에 있다. 아닐수도 있다.
배열은 원소들이 연속적인 형태로 구성된 자료형으로 그 형태에 따라 차원(dimension)이 다르다.
여기서 축(axit) 개념을 알아야 하는데, 특히 주의할 것은 2차원 배열과 3차원 배열의 축 차이다.
- 2차원 배열의 axis
난 이걸 그림으로, 가로 세로 따지면 그렇게 헷갈리더라.
그래서... 어차피 axis는 키워드 인수로 줘야 하는 녀석이니까 이렇게 하기로 했다.
동작이 행을 대상으로 하면 0, 열을 대상으로 하면 1!
예를 들어 sum(axis=0)은 행을 모조리 더한다.
drop(axis=1)은 column(열)을 탈락시킨다.
이거 그림으로 보면 둘 다 세로로 작용하는 것 같아서 머리아프다.
- 3차원 배열의 axis
0 행 1 열 기억법이 여긴 안 통한다.
0이 깊이(depth)거든(...)
자연스레 행이 1, 열이 2가 된다.
뭐, 일단 데이터프레임은 2차원이니까....! 라고 위안을 가져 본다.
numpy에서는 (1)인덱싱/슬라이싱을 통해, (2) 조건 조회(boolean operation)을 통해 조회가 가능하다.
# 인덱싱
# 첫 번째 행, 두 번째 열 요소 조회
print(a[0, 1])
# 첫 번째, 두 번째, 세 번째 행 조회
# print(a[[0, 1, 2], :])
print(a[[0, 1, 2], :]) ## 또는 a[:,:]
# 두 번째 행 두 번째 열의 요소 조회
print(a[[1], [1]])
# 슬라이싱
# 첫 번째 ~ 두 번째 행 조회
# print(a[0:2, :])
print(a[0:2])
# 첫 번째 ~ 세 번째 행, 두 번째 ~ 세 번째 열 조회
print(a[0:3, 1:3])
# 두 번째 ~ 끝 행, 두 번째 ~ 끝 열 조회
print(a[1:, 1:])
# 조건 조회 ## 조건에 대해 True인 것만 가져온다.
# 요소 중에서 90 이상인 것만 조회
print(score[score >= 90])
# 모든 요소 중에서 90 이상 95 미만인 것만 조회
print(score[(score >= 90) & (score < 95)])
인덱싱이나 슬라이싱을 자주 쓰겠지만, 조금만 복잡해져도 조건 조회가 편해 보인다.
pandas DataFrame의 구조와 기능
pandas에는 Series와 DataFrame이라는 두 가지 자료형이 있다.
내가 이해하기로는,
DataFrame은 엑셀같은 tabular 데이터, Series는 그 테이블의 한 열만 떼놓은 것
일단 시리즈에 대한 의문은 뒤로하고, 데이터프레임을 살펴본다.
일단 정보를 죽 나열해 보자.
- DataFrame의 구성요소와 속성 : 호출할 떄 괄호 없이 쓴다. ex) df.columns
row | 행, record라고도 한다. |
columns | 열, 다양한 dtype을 가질 수 있다 |
index | 각 row를 구분시켜주는 이름표. 주로 번호지만 날짜 등을 쓰기도 한다. |
values | 값. 같은 column에 있다면 같은 dtype이다. |
shape | 데이터프레임의 크기 (rows, columns) 형태의 튜플로 반환된다. |
- DataFrame 객체의 메서드 : 괄호가 필요하다. ex) df.heads()
head() | 첫번째부터 n개의 row를 반환한다. 기본은 5개. (= [:5]) |
|
tail() | 마지막부터 n개의 row를 반환한다. 기본은 5개. (= [-5:]) |
|
info() | 각 열의 dtypes / non-null의 수를 보여준다. | |
describe() | count, mean, std, min, max, 4분위수 등을 보여준다. 파라미터 설정에 따라 범주형 데이터의 최빈수 등도 볼 수 있다. |
int, float 에 유효 |
unique() | 지정한 column의 고유값들을 나열해 준다. 배열 형태로 반환한다. |
object에 유효 |
value_counts() | 지정한 column의 고유값뿐만 아니라 그 개수도 보여 준다. 시리즈 형태로 반환한다. |
object에 유효 |
sort_values() | 특정 column을 기준으로 정렬시킨다. | by= 'column' 인수 사용 ascending= bool |
sum() | 축에 따른 합을 반환한다. | axis=0이 기본 |
mean() | 평균을 반환한다. | |
max()/min() | 최댓값, 최솟값을 반환한다. | |
median() | 중앙값을 반환한다. | |
set_index() | 지정한 column을 인덱스로 만든다. | df.set_index('column') |
reset_index() | set_index를 되돌린다. | drop=bool |
rename() | column의 이름을 바꾼다. | columns = {old : new} 인수 사용 |
이건 외워야 한다. 그래도 직관적인 이름들이라 다행.
사족
대부분의 메서드가 반환만을 하고 데이터프레임을 변형시키지는 않는다.
애초에 탐색을 위한 것이라 여러번 들여다보게 되는데,
그때마다 원본 데이터프레임이 변형되면 당연히 미칠 노릇이겠지.
반영 사항을 적용하고 싶다면 반환하는 바가 있다는 점을 이용해 재선언하거나,
inplace 인수를 True로 주면 된다.
오늘은 복잡한 코딩보다는 개념과 함수들을 우수수 배운 날이었다.
원래 시작은 암기인 법이지. 근의 공식이든 곱셈 공식이든. 비유가 맞나