Numpy와 Pandas의 API가 서로 상호작용이 가능하고, 대부분 우리가 Numpy를 다룰 때 1차원이나 2차원의 데이터를 보며 주로 handling 하기 때문에 종종 Pandas와 차이를 느끼지 못할 때가 많다.
물론 이는 그 데이터의 형태나 구조적인 측면이 서로 공통점이 있기 때문에 종종 그렇게도 사용되고 있으나
본래 둘은 서로 다르다.
그 이유를 결론부터 얘기하면 그 기반이 다르다.
Numpy는 선형대수 기반의 배열로 작성되며 빠른 연산을 강점으로 딥러닝 주요 알고리즘에서 사용되고 있다.
Pandas는 numpy기반으로 만들어진 RDMS(관계형데이터베이스)_Table 형태의 데이타셋이다. 2차원 Table 형태로 다양한 칼럼(차원)을 관리할 수 있도록 만들어졌다.
Numpy와 Pandas 데이터셋을 비교해 보겠다.
Numpy | Pandas | |
행 | 벡터s | 각 데이터(관측치) |
열 | 스칼라(값)s | 데이터의 속성(차원) |
가로(axis=0) | 2차원이 넘아가면 가로 세로 개념이 아니라 axis=0 ~ n 의 n차원. 개념적으로 인식할 수 밖에 없다 |
모든 데이터 개체 |
세로(axis=1) | 데이터 차원 |
Numpy
배열이다. -> 각 배열은 벡터로 볼 수 있으므로 선형대수 연산을 따른다.
위 그림에서, [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ndarray객체를 먼저 살펴보자
- 1차원 벡터(배열)을 묶기 위해 2차원으로 묶어 주었다.
- 1차원 각 벡터는 3개로 묶였다.
- 각 배열은 3개의 값으로 구성되어 있다. *원칙 : 각 배열의 스칼라값 구성 갯수가 다르면 안된다.
즉,
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] ndarray 객체를 3*3 으로 표현할 수 있으며
1차원 벡터가 3개가 있고 값이 3개가 있기 때문에 2차원 데이터를 말하는 것이다.
2차원까지는 우리가 바로 눈으로 인식할 있기 때문에 파악하기 쉽고 이렇게 교육을 받았었다.
그러나 더 넓은 차원으로 확장하기 위해 시각을 조금 바꿔보자.
이제는 일반화를 위해
3*3 이라는 shape만 보면서 사고를 넓혀보자.
* : 1번 묶였다 = 2차원
3 : 2차원에서는 3개 값(스칼라) 단위로 데이터셋이 형성된다.
3 : 1차원에서는 3개 스칼라로 된 3개 벡터 단위로 데이터셋이 형성된다.
(응용)
더 높은 차원에서의 일반화를 위해 3차원에서 이 개념을 응용시켜보자.
array4=np.array([
[[1,2,3,4,5],
[4,5,6,7,8],
[7,8,9,10,11]],
[[1,2,3,4,5],
[4,5,6,7,8],
[7,8,9,10,11]]
])
print(array4,f"shape is {array4.shape}") # shape is (2,3,5)
2*3*5
*x2 = 3차원이다.
5 : 3차원에서는 각 5개의 스칼라값 단위로 구성되어 있으며
3 : 2차원 데이터는 3개의 벡터로 단위로 묶였으며
1: 1차원 데이터는 2개의 2차원 데이터 단위로 묶였다.
규칙이 보인다.
처음에는 스칼라 값을 카운팅하고 그 다음에는 2차원 데이터로 구성시키기 위한 벡터의 수를 카운팅한다.
그 다음에는 이제 2차원을 묶기 개념적인 확장이 일어난다. 2차원을 묶기 위해 3차원이 구성되고
그 다음에서는 3차원을 묶기 위해 4원이 되고 그런 식 이다.
이제 일반화를 위해 4차원에 적용해보자.
2*4*6*8
4차원이다.
8 : 4차원에서는 8개 값[스칼라] 단위로 구성된다.
6 : 3차원 데이터는 8개의 값이 6개의 [벡터] 단위로 이루어져있다. > (6*8행렬)_2차원 데이터셋
4 : 2차원에서는 6*8[행렬]이 4개 존재한다 > 3차원 데이터셋
2 : 1차원에서는 4*6*8의 3차원 데이터가 2개 존재한다. >4차원 데이터셋
'역순으로 볼땐 하나씩 조립하여 행렬을 구성시킨 뒤에 그 행렬을 묶어나간다' 라고 생각하면 된다.
역순으로 생각하는 이유는 사람은 작은 것을 쌓아 큰 걸 만드는 방식에 적응되어 있기 때문이고
굳이 행렬을 최대 데이터셋으로 하는 이유는_사람이 수를 잘 표현할 수 있는 최대한의 차원이 2차원이기 때문이다.
그러나 사실 주의할 점은 (순차적인 관점)
저차원에서 형성된 단위는 이미 존재하되, 지금 차원에 맞는 단위에 따라 데이터가 추가적으로 구성되는 형식인 점을 놓치지 말자. .
*다차원 인덱싱은 이러한 접근을 따라가면 된다.
마지막으로, 자주 사용되는 3차원 데이터셋을 위 개념으로 정리해보자
axis=2 : 스칼라 수
axis=1 : 벡터 수
axis=0 : 2차원 데이터 수
Pandas
판다스는 데이터를 관리하는 Table 구조이다. 선형대수의 벡터 배열과는 다르다.
즉 위 그림을 동일하게 볼 때
첫 번째 Row : [ 1, 2, 3 ]은 하나의 관측치를 말하고 1, ,2, 3은 그 관측치의 각각의 속성을 말한다.
예를 들면 첫 번째 Row 자체를 김미선이라고 볼 수 있고
김미선의 특징으로 집 보유 갯수 1채, 자녀 수 2명, 친구관계 만족도 3 으로 생각해 볼 수 도 있겠다.
따라서 관측치(김미선)에 대한 3가지 특성을 담았으므로 3차원 데이터로 볼 수 있으며
전체 데이터로 종합하면
3차원 데이터를 2차원 Table에 담은 형태라고 볼 수 있겠다.
사실 Pandas는 numpy기반으로 만들어졌기 때문에 비슷한 점이 많다.
Pandas에서는
(행,axis=0) 에서 벡터는 관측치, (열,axis=1)에서 벡터는 하나의 속성으로 개념적으로 나뉜다.
여기서 관측치 기준으로 볼 때 우리는 서로 다른 데이터타입이 공존할 수 있다는 점을 생각해볼 수 있다.
그러나 이것은 사실 개념적인 것으로 구동적인 측면에서는 numpy배열은 Pandas에도 그대로 적용된다.
(행,axis=0) 관측치 데이터로 추출할 때는 [ 2 , 171, '남자' ] 로 데이터타입이 서로 다를 수 있으나
그것은 사실 우리가 2차원 데이터를 바라볼 때의 입장이다.
pandas는 칼럼 단위(열,axis=1)를 가장 기반으로 인덱싱하게끔 설계되어 있다.
*키 칼럼을 기준으로 관측치 몇개를 불러오는 식
단, 차이점은 분명히 있다.
Pandas는 각 차원별 Index개념이 데이터와 함께 가시적으로 구성된다.
이것은 판다스의 배열 Series 뿐 아니라, 2차원 DataFrame도 마찬가지이다.
(DataFrame : axis=1 방향을 출발점으로 인덱스가 구성된다.)
*numpy는 메모리구조상에서 암묵적으로 구성되어 있다.
Numy 와 Pandas의 상호작용
서로 다른 구조지만, 동일한 형태로서 그 의미 갖게 조정하면 마법과 같은 일이 펼쳐진다.
대용량의 데이터를 바탕으로한 머신러닝/딥러닝의 기계학습 연산을 매우 효과적으로 또 빠르게 할 수 있다.
고차원의 데이터 연산을 인간이 직관적으로 이해할 수 있다는 점도 매우 흥미롭다.
행렬과 행렬의 내적을 통한 예시로 이를 이해해보자.
정리
Numpy는 배열이다. 머신러닝/딥러닝 알고리즘에서 연산의 강점을 갖는다.
Pandas는 Data_Table 구조이다. 데이터 관리에서 강점을 갖는다.
행렬 내적은 마법이다.
'머신러닝&딥러닝' 카테고리의 다른 글
Numpy 기본 함수/연산자 (0) | 2021.02.14 |
---|---|
파라미터 vs 하이퍼파라미터 (0) | 2021.01.19 |
Feature Selection (0) | 2021.01.17 |
노이즈 데이터 (Nosiy Data) (0) | 2021.01.17 |