얼레벌레

[py] 데이터 유형과 numpy 본문

취업/KT AIVLE SCHOOL

[py] 데이터 유형과 numpy

__Lucie__ 2022. 8. 7. 14:47

데이터의 유형과 보는 방법

데이터 분석/모델링을 위해 다룰 수 있는 데이터 2가지 - 숫자형 / 범주형

범주형

집단으로 묶을 수 있는, 질적 데이터 (정성적 데이터)

  1. 명목형 데이터 (모일 수 있는)
    ex) 성별, 시/도, 흡연 여부, 음주 여부
  2. 순서형 데이터(원래 숫자인데, 숫자를 범주로 나타낸 것)
    ex) 연령대, 매출 등급

수치형

양적 데이터 (정량적 데이터)

  1. 이산형(countable) 데이터 (딱 떨어지는 숫자)
    ex) 판매량, 매출액, 나이
  2. 연속형 데이터 (딱 떨어지지 않는)
    ex) 온도, 몸무게

범주형, 수치형 판별 법 : 예를 들어 3월과 1월이 있을 때 3월의 3이 1월의 1의 3배를 의미하는가? 아님, 아니면 범주형이다.

 

이렇게 분석할 수 있는 데이터는, 데이터를 모을 때 2차원 구조(표/테이블) 형태로 모은다.

기본이 2차원이라는 것임.

  1. 열(column): 변수, 요인, features, x, input, 독립 변수
  2. 행(row) : 분석 단위, 샘플, 관측치, 데이터

강사님이 '행이 분석단위이다.' 라는 말을 굉장히 강조하셨다. (실제 실무에 들어가면 이 분석단위를 정하는 게 굉장히 어렵다고 함)

 

Mnist 같은 경우, 이미지 1장이 하나의 분석 단위이다.

이 하나의 분석 단위 여러개가 모여 dataset이 되는데, 2차원이 여러개 있으면 dataset은 3차원이다.

+ 마찬가지로, 만약 분석 단위가 3차원이라면 dataset은 4차원

 

Numpy

사용법

import numpy as np
a = np.array([1, 2, 3, 4, 5])

# 특정 함수만 가져오기
from numpy import array
a = array([1, 2, 3, 4, 5])

 

Numpy 배열

용어 정리

axis : 배열의 축 (axis 0이 열 방향-세로, axis 1이 행 방향-가로)

rank : 축의 개수 (ndim과 비슷)

shape: 축의 길이, 배열의 크기

 

ex) 3*4 배열의 경우
axis0과 axis1을 갖는 2차원 배열,

rank는 2, shape은 (3, 4)

 

reshape - shape 바꾸기

shape을 굳이 바꿔주는 이유는? 딥러닝에서는 데이터의 구조를 맞춰주는 것이 중요하기 때문!

# 2*3 배열
a = np.array([1, 2, 3],
	[4, 5, 6])
            
b = np.reshape(a, (6, 1)) 
c = a.reshape(3, 2)

a.reshape(3, -1) #행은 3으로 맞추고 싶은데 열은 아무렇게나 해줘
a.reshape(-1, 2) #열은 2로 맞추고 싶은데 행은 아무렇게나 해줘

+ 만약 1차원을 2차원으로 바꾼다면 행으로 들어간다.

 

인덱싱

a = np.array([1, 2, 3], [4, 5, 6], [7, 8, 9]) 를 통해

1 2 3
4 5 6
7 8 9

이렇게 생긴 numpy 배열을 만들었다고 생각해보자.

  1. 첫번째 행, 두번째 열에 있는 요소 조회하기.
    a[0, 1] 혹은 a[[0], [1]]
    첫번째 방법의 경우 단일 값 (스칼라) 형태로 나온다. => 2
    두번째 방법은 목록으로 가져와 1차원 값으로 나타난다. => [2]
  2. 첫번째, 두번째 행 조회하기.
    a[[0, 1]] 혹은 a[[0, 1], :
    이렇게 여러개 행을 조회하고 싶을 때 리스트 형태로 조회함.
  3. 첫번째, 두번째 열 조회하기.
    a[:, [0, 1]]
    마찬가지로 여러개 열을 조회하고 싶을 때 리스트 형태로 조회함, 
    열을 조회할 때 행 인덱스 자리의 :는 생략이 안됨.
  4. 첫번째행 첫번째열, 두번째행 두번째열 조회
    a[[0, 1], [0, 1]]
    앞 뒤를 조합해서 a[0, 0]과 a[1, 1]을 가져온다. => [1 5]

 

슬라이싱

마찬가지로 위의 a 배열로 예시를 들어보자.

  1. 첫번째 ~ 두번째 행 조회
    a[0:2, :] 혹은 a[0:2]
  2. 첫번째 행의, 첫번째~두번째 열 조회
    a[0, 0:1]
  3. 첫번째~세번째 행, 두번째~세번째 열 조회
    a[0:3, 1:3]
  4. 두번째 ~ 마지막 행, 두번째 ~ 마지막 열 조회
    a[1:, 1:]

 

조건 조회

조건에 맞는 요소를 선택하는 방식 '불리안 방식'

조회 결과는 1차원 배열

#예시 코드
score = np.array([[78, 91, 84, 89, 93, 65],
	[82, 87, 96, 79, 91, 73]])

score >= 90
#결과 
# array([[False, True, False, False, True, False],
#	[False, False, True, False, True, False]])

score[score>=90]
#결과
#[91 93 96 91]

여러 조건을 &나 |로 묶어서 조회 가능,

조건을 여러 개 엮을 때는 각 조건을 괄호()로 묶어서 조회해야 한다.

 

배열 연산

  1. 배열 더하기
    + 또는 np.add() 함수 사용
    ex) print(x+y) 또는 print(np.add(x, y))
  2. 배열 빼기
    - 또는 np.subtract() 함수
    ex) x-y 또는 np.subtract(x, y)
  3. 배열 곱하기
    * 또는 np.multiply() 함수
  4. 배열 나누기
    / 또는 np.divide() 함수
  5. 배열 제곱
    ** 또는 np.power() 함수

배열 집계

np.sum() 또는 array.sum() 이용

axis=0 이면 열 기준 집계, axis=1 이면 행 기준 집계

np.max(), np.min(), np.mean(), np.std() 도 마찬가지로 사용

a = np.array([[1, 5, 7], [2, 3, 8]])

np.sum(a) #전체 => 26
np.sum(a, axis=0) # 열 기준 => [3 8 15]
np.sum(a, axis=1) # 행 기준 => [13 13]

where, linspace

  • np.where( 조건문, 참일 때 값, 거짓일 때 값)
    • a = np.array([1, 3, 2, 7])
      print(np.where(a>2, 1, 0))
    • 결과: [0 1 0 1]
  • np.linspace(시작값, 끝값, 사이값 개수) : 시작값~끝값, 사이값개수 만큼의 값을 만들기
    • list(range(1, 10, 2))
      => [1, 3, 5, 7, 9]
    • np.linsapce(0.1, 10, 100)
      => array ([0.1, 0.2, 0.3, ... 9.9, 10. ])