본문 바로가기
Add,/KT 에이블스쿨

AI Python 라이브러리 (넘파이 / 판다스)

by 싱브이 2023. 10. 10.
728x90
반응형

리스트는 값의 집합이다. 또한 다른 타입의 데이터도 한번에 저장이 가능하다. 그리고 요소를 변경하고, 추가하고 그리고 제거하는 것이 용이하다. 그러나 데이터 분석은 단순히 값들의 집합 개념을 넘어서서 수학적이 계산과 대량의 데이터를 처리하는 데 속도가 빠른 라이브러리가 필요하다.


넘파이(Numerical Python, Numpy)

 

  넘파이는 수치 연산을 위해 배열을 생성하고 다루는 패키지이다.

 

- 배열 만들기
(행, 열)을 의미한다. 

3차원 배열은 (개수, 행, 열)을 의미한다. 예를들어 (2, 3, 3)은 (3, 3) 크기의 2차원 배열이 2개 있다는 뜻이다. 

import numpy as np

# 1차원 리스트 형태의 배열 
a = np.array([1, 2, 3, 4, 5])
print(a)    #[1 2 3 4 5]
print(type(a))     # <class 'numpy.ndarray'>
print(a.ndim)     # 1 <-- 차원
print(a.shape)     # (5, ) <-- 모양
print(a.dtype)     @ int32  <-- 데이터 형식
print(a[0], a[1], a[2]) # 1 2 3

# 2차원 리스트 형태의 배열
b = np.array([1.5, 2.5, 3.2],
			[4.2, 5.7, 6.4])
print(b)     #[[1.5, 2.5, 3.2], [4.2, 5.7, 6.4]]
print(b.ndim)     # 2
print(b.shape)     # (2, 3)
print(b.dtype)     #float64

# 3차원 리스트 형태의 배열 
c = np.array([[[1, 3, 1],
				[4, 7, 5],
                [8, 3, 4]],
               [[6, 2, 4],
               [8, 1, 5],
               [3, 5, 9]]])
print(c.ndim)     # 3
print(c.shape)     # (2, 3, 3)
print(c.dtype)     # int64

리스트튜플은 직접 배열로 변환이 가능하지만, 문자열딕셔너리 그리고 집합은 아래와 같이 다른 자료형으로 변환 후 배열로 변환 가능하다. 

# 문자열 -> 자료형 변환 -> 2차원배열
a = np.array([list('문자열'), list('문자열')])

# 딕셔너리 -> 키, 값 분해 -> 자료형 변환 -> 2차원배열
dic = {'a':1, 'b':2, 'c'3}
a = np.array([list(dic.keys()), list(dic.values())])

# 집합 -> 자료형 변환 -> 2차원배열
st = {1, 2, 3}
a = np.array([list(st), list(st)])

* Axis 0 의 의미
  분석 단위를 구성한다. 예를들어, 2차원 데이터가 (1000, 10)이라면 분석 대상이 1000건, 그리고 각 대상은 10개의 정보로 구성되어있다는 뜻이다. 즉, 10개의 변수(열)로 구성된 데이터 1000건이 존재한다는 뜻이다.

3차원 데이터에선 (2500, 28, 28)이라면 (28, 28) 크기의 2차원 데이터가 2500개 있다는 뜻이다. 

 

- Reshape
배열 요소가 사라지지 않는 형태라면 변환 가능하다. 

# 2 * 3 형태의 2차원 배열 만들기
a = np.array([[1, 2, 3],
				[4, 5, 6]])

# 함수를 사용해 6 * 1 형태의 배열로 reshape
b = np.reshape(a, (6, 1))

# 메소드를 사용해 3 * 2 형태의 2차원 배열로 reshape
c = a.reshape(3, 2)

# 0으로 채워진 배열 : np.zeros()
a = np.zeros((2, 2))
print(a).    #[[0 0], [0 0]]

# 1로 채워진 배열 : np.ones()
b = np.ones((1, 2))
print(b).    #[[1 1]]

# 특정 값으로 채워진 배열 : np.full()
c = np.full((2, 2), 7)
print(c).    #[[7 7], [7 7]]

# 정방향 행렬 : np.eye()
 d = np.eye(2)
 print(d).    #[[1 0] [0 1]]
 
# 랜덤 값으로 채운 배열 : np.random.random()
e = np.random.random((2, 2))

 

- 배열 데이터 조회

arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]     # (4, 3)

# 단일값 인덱스 : arr[ , ]
print(arr[0, 2])     # 3
print(arr[0][2])     # 3
print(arr[1])     # 4 5 6
print(arr[:, 2])     # 3 6 9 12

# 리스트 형태, 범위(슬라이싱) : arr[[], []]
print(arr[[0, 2]])     # 3
print(arr[[0, 2], [1, 2]])     # 2 9
print(arr[0:2, 1: ])     # [2, 3], [5, 6]
print(arr[0:2, 1:2])     # [2], [5]

 

# boolean (불리안) 방식 조건 배열 인덱싱

#1차원 배열
Score = np.array([78, 91, 84, 89, 93, 65])
Score[Score >= 90]     #array([91, 93])

#2차원 배열
Score2 = np.array([[78, 91, 84, 89, 93, 65],
					[82, 87, 96, 79, 91, 73]])
Score2[0][Score2[0] >= 90]     #array([91, 93])
Score2[1][Score2[1] >= 90]     #array([96, 91])

 

- 배열 변환과 연산

기본연산

np.add (+) : 더하기
np.subtract (-) : 빼기
np.multiply (* ) : 곱하기
np.divide (/) : 나누기
np.power (**) : 제곱
np.sqrt : 제곱근

np.dot : 행렬 곱 연산

array.T : 전치 행렬
    *전치 행렬 : 두 대각선을 축으로 하는 반사 대칭 행렬 

 

배열 내 집계 함수
   np.sum(), np.mean(), np.std()

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

# 전체 합계
print(np.sum(a))

# 열 기준 합계
print(np.sum(a, axis = 0))

# 행 기준 합계
print(np.sum(a, axis = 1))

 

조건에 따라 다른 값 지정하기 : np.where (조건문, 참일 때 값, 거짓일 때 값)

a = np.array([1, 3, 2, 7])
np.where(a>2, 1, 0)     # 0 1 0 1

 

가장 큰(작은) 값의 인덱스 반환 : np.argmax(), np.argmin()

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

# 전체 중에서 가장 큰 값의 인덱스
print(np.argmax(a))     # 5
# 열 기준 큰 값의 인덱스
print(np.argmax(a, axis = 0)     # [1 0 1]
# 행 기준 큰 값의 인덱스
print(np.argmax(a, axis = 1)     # [2 2]

판다스(Pandas)

 

  데이터프레임(Dataframe)은 데이터 분석에서 가장 중요한 데이터 구조이다. 관계형 데이터베이스의 테이블 또는 엑셀 시트와 같은 형태이다. 데이터프레임의 행은 분석단위 = 관측치 = 샘플이고, 열은 정보 = 변수(feature, target)이다. 

  시리즈(Series)는 하나의 정보에 대한 데이터들의 집합이다. 즉, 데이터프레임에서 하나의 열을 떼어낸 것과 같다.

 

* CSV파일에서 데이터 읽어 오기

 pc.read_csv(파일경로 및 이름)

# 데이터 읽어오기
path = '데이터 경로'
data = pd.read_csv(path)

# 상위 5개만 확인
data.head(5)

 

- 데이터프레임 정보 확인

1. 앞쪽 데이터 확인 : head()

df.head(숫자)  #default 값은 5이다.

2. 뒤쪽 데이터 확인 : tail()

df.tail(숫자)   #default 값은 5이다.

3. 데이터프레임 형태 : shape()

df.shape     # (행수, 열수)형태

4. 열 확인 : columns, dtypes()

# 열 이름 정보 확인
df.columns
# 열 확인
df.dtypes()

5. 인덱스, 열, 값 개수, 데이터 형식 정보 등 확인 : info()

df.info()

6. 기초 통계 정보 확인 : describe()

df.describe()

7. 데이터 정렬 : sort_index(), sort_values()

     - ascending=True : 오름차순 정렬(기본값)

     - ascending=False : 내림차순 정렬

# 인덱스를 기준으로 정렬
tip.sort_index(ascending=False)

# 특정 열을 기준으로 정렬
tip.sort_values(by = 'total_bill', ascending=False)
tip_sort_values(by = ['total_bill', 'tip'], ascending=[False, Fasle])

8. 고유 값 확인 : unique(), value_counts()

# 고유 값 확인
tip['열 이름'].unique()

# 고유 값과 개수 확인 
# dropna=True 지정하거나 생략하면 NaN 값 제외
tip['열 이름'].value_counts()

 

- 데이터프레임 조회

1. 특정 열 조회

# 1차원(시리즈)으로 조회
Dataframe['coulmn']
Dataframe.column

# 2차원(데이터프레임)으로 조회
Datagrame[['column']]     # 칼럼명을 리스트로 입력

 

2. 조건으로 조회 : .loc[행 조건, 열 이름]

   행 조건은 조건문 형태이다. 그러나 열 이름은 생략이 가능하다. 열 이름이 1개일 경우 결과가 시리즈로 나오고, 여러 개일 경우 리스트로 나오게 되어 결과가 데이터프레임으로 나온

# tip 열 값이 6.0보다 큰 행 조회
array.loc[tip['tip'] > 6.0)

# 여러 조건을 만족하는 조회 : &, |
array.loc[(tip['tip'] > 6.0) & (tip['day'] == 'Sat')]
array.loc[(tip['tip'] > 6.0) | (tip['day'] == 'Sat')]

# 모든 행 : :
array.loc[ : ,  ['tip', 'size'] ]

# 특정 값 데이터만 조회(값 나열) : isin([값])
array.loc[tip['day'].isin(['Sat', 'Sun'])]

# 값1 ~ 값2 범위안의 데이터 조회(범위 지정) : between(값1, 값2)
array.loc[tip['size'].between(1, 3)]    # 리스트가 들어가면 안됨

 

- 데이터프레임 집계

1. groupby()

dataframe.groupby('집계기준변수', as_index = )['집계대상변수'].집계함수

집계기준변수 : '~별'에 해당되는 변수 혹은 리스트, 범주형 변수( 월 별, 지역 별 ..)
집계대상변수 : 집계함수로 집계할 변수 혹은 리스트(매출액 합계..)

  - as_index=True : 집계기준변수를 인덱스로 사용

  - as_index=False : 집계기준변수를 열로 사용

# day 별 tip 합계 -> 시리즈
tip.groupby('day', as_index=True)['tip'].sum()

# day 별 tip 합계 -> 데이터프레임
tip.groupby('day', as_index=False)['tip'].sum()

  -[['변수']].sum() : 결과가 데이터프레임

# day 별 tip 합계 -> 데이터프레임
tip.groupby('day', as_index=True)[['tip']].sum()

# day 별 tip 합계 데이터프레임 선언
tip_sum = tip.groupby('day', as_index=False)[['tip']].sum()

  - 집계 대상 열을 리스트로 지정

# day 별 total_bill, tip 합계 조회
tip.groupby('day', as_index=False)[['total_bill', 'tip']].sum()

  - 집계 대상 열 생략 (기준 열 이외의 모든 열에 대한 집계수행)

# day 별 나머지 열들 합계 조회
tip.groupby('day', as_index=False).sum()

  - 집계 기준 열을 여럿 설정 가능

# day + smoker 별 나머지 열들 합계 조회
tip.groupby(['day', 'smoker'], as_index=False).sum()

2. agg()

dataframe.groupby('집계기준변수', as_index = )['집계대상변수'].agg()
# day 별 tip 합계, 평균, 최댓값, 최솟값
tip.groupby('day')['tip'].agg(['sum', 'mean', 'max', 'min'])
# day 별 totall_bill, tip 합계, 평균
tip.groupby('day')[['totall_bill', 'tip']].agg(['sum', 'mean'])

# 딕셔너리 형태로 지정
tip.groupby('day', as_index=False).agg({'totall_bill':'mean', 'tip':'sum'})

agg()에서 as_index=False는 예외이다. False로 지정해도 '~별' 칼럼이 인덱스로 들어간다 !

 

728x90
반응형

댓글