본문 바로가기

머신러닝&딥러닝

Numpy 와 Pandas는 다르다.

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