AI 부트캠프/챕터1(9.30~10.11)

TIL 6 인공지능을 위한 파이썬 라이브러리 (2 - 3 ~ 3 - 4) : TIL 특강을 듣고 작성 방식을 변경함

musukie 2024. 10. 5. 22:33

   배열 연산 및 브로드캐스팅

  • 배열 간의 기본 연산 : Numpy 배열 간의 덧셈, 뺄셈, 곱셈, 나눗셈 모두 요소별(element-wise)로 수행된다.

덧셈(add), 뺄셈(subtract), 곱셈(multiply), 두 배열에 요소별 나눗셈하고 소수점 이하를 버려줌(floor_divide), 요소별 나눗셈의 나머지를 반환해줌(mod) 등

import numpy as np
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array([4])
arr + 4
# array([5, 6, 7, 8])
arr1 / 2
# array([0.5, 1., 1.5, 2.])
arr1 + arr2
# array([5, 6, 7, 8])
np.add(arr1, arr2)
# array([5, 6, 7, 8])

사칙연산 연산자와 Numpy 기능은 기본적인 동작도, 지원하는 것도 비슷하다. but Numpy 함수는 더 다양한 추가 기능을 제공한다.

import numpy as np
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array([4])
np.add(arr1, arr2, out = result)
# array([5, 6, 7, 8])
result = np.empty_like(arr1)
result
# array([5, 6, 7, 8])

그냥 np.add(arr1, arr2)고, result = np.empty_like(arr1)일 때, result 하면 # array([0, 0, 0, 0])로, arr1과 비슷한 0으로 차있는 array가 생성된다.

np.add(arr1, arr2, out = result)했을 때, 이는 코드를 np의 함수인 add를 쓰고, 옵션으로 put이라고 하고, 저장할 공간을 result로 지정하여, 자동으로 result에 저장되는 것을 의미한다.

 ∴ 복합적인 코드 작성시 => Numpy의 함수를, 간단하게 작성 시 => 사칙연산을 사용하는 게 좋다.

  • 브로드캐스팅 : 크기가 다른 배열 간의 연산을 가능하게 해준다.

but 항상 가능한 것은 x. 규칙이 有. 작은 배열이 큰 배열의 형태에 맞게 자동으로 확장돼 연산이 이루어진다.

  1) 두 배열의 차원이 같거나, 차원이 같지 않다면 작은 배열의 차원의 크기가 1이어야 한다.

  2) 배열의 각 차원에서 크기가 동일하던가, 한 배열에서 해당 차원의 크기가 1이어야 한다.

import numpy as np
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array([4])
arr1 + arr2
# array([5, 6, 7, 8])	# 정상적으로 동작함.
import numpy as np
arr1 = np.array([1, 2, 3, 4])
arr2 = np.array([4, 5, 6])
arr1 + arr2
# 정상적으로 동작 X.
arr1 = np.array([1, 2, 3])
arr1 = np.array([[10], [20], [30]])

# 브로드캐스팅을 이용한 덧셈
broadcast_result = arr1 + arr2
print(broadcast_result)
# [[11, 12, 13], [21, 22, 23], [31, 32, 33]]
print(broadcast_result.shape)
# (3, 3)
arr1.shape
# (3, )
arr2.shape
# (3, 1)

- 차원의 형태에 따라, shape의 형상에 따라 결과가 천차만별로 나올 수 있다.

  • 기본적인 수학 함수

- 배열의 총합(sum), 누적 곱(prod), 누적 합(cumsum), 제곱근(sqrt), 로그(log), 평균(mean), 중간값 or 중간값의 평균 값(median), 표준편차(std) , 분사(var), 최댓값(max), 최솟값(min), 최댓값의 위치(argmax), 최솟값의 위치(argmin), 최댓값과 최솟값의 차이가 어느 정도 되는 지 범주를 알려줌(ptp)

- 선형대수 관련 : 행렬의 점곱(dot), 내적(vdot) 등

 

각 요소에 자연 지수, 여기에 1을 뺀 값, 자연 로그, 여러 가지 로그에 따라서 값도 보여주고, 삼각함수, 쌍곡선함수, 반올림 조정, 복소수와 관련된 것들 등 수학과 관련된 기능은 Numpy만으로도 해결 가능할 정도로 다양한 값을 제공한다.

 

코드를 잘못 이해한 채로 사용할 수 있으니, 반드시 Numpy를 사용하기 전에는 Shift + Tab 해서 문서를 확인하는 버릇을 들이자! Numpy의 기능은 너무 많고, 문법은 간단하다!


   데이터 불러오기

Github, 개인 사이트, 학회, Kaggle 등에서 공개된 데이터를 가져올 수 있다.

 

판다스는 CSV, Excel, JSON 등 다양한 형식의 데이터를 쉽게 불러올 수 있는 기능을 제공하며, URL을 통해 웹에서 직접 데이터를 불러오는 것도 가능하다. 각각 read_데이터 형식("파일명" or URL) 함수로 불러오기가 가능하다.

    데이터 저장하기

저장하는 함수는 각각 to_데이터형식("파일명") 로, 불러오기 함수와 달리 URL을 지정할 수 없다.

 

SQL 속 데이터베이스에 Pandas 데이터 프레임을 변환해서 넣을 수도 있으며, 데이터베이스 속 테이블을 적절히 불러올 수 있는데, 지금 단계에서는 어렵기에 존재만 알아두자.


   데이터 미리보기 및 기본 정보 확인

head()로 상위 데이터를, tail()로 하위 데이터를, sample()로 랜덤 데이터를, info()로 데이터프레임의 요약 정보를, describe()로 주요 통계 정보를, columns로 열 이름을, index로 행 인덱스를 확인할 수 있다.

 

세부적인 정보를 확인할 때는 loc[ ]과 iloc을 사용한다. loc[ ]으로 행과 열의 위치를 지정해, iloc[ ]으로 행과 열의 인덱스를 사용해 접근할 수 있다.

  loc() iloc()
데이터 조회 시 사용하는 것 라벨 정수
슬라이싱 규칙 끝점을 포함 ㅇ. 끝점을 포함 x.

 

라벨명으로 숫자를 쓰는 경우도 있기에 문자는 loc[ ], 숫자는 iloc[ ]으로 외우면 안 된다. 데이터에 붙은 라벨을 기준으로 접근할 때는 loc[ ]을, 그렇지 않을 때는 iloc[ ]을 선택한다고 이해하자. 또 df.head(1) 해도 하나의 행 전체가 나오며, 필터링을 통해서도 접근 가능하다. 특정 행 전체를 선택하는 방법은 다양한데 loc, iloc 이 대표적 방법인 것이다.


   데이터 선택하기

 인덱스를 사용해 데이터를 선택할 수 있다.

: set_index()로 데이터프레임의 인덱스를 설정할 수 있다.

: loc[ ]을 사용해 인덱스로 데이터를 선택할 수 있다. 

 

을 지정해서 데이터를 선택할 수 있다.

: 단일 열을 선택하거나 여러 열을 선택할 수 있다. but 여러 열을 선택하고 싶을 때는 반드시 리스트를 사용해야 한다.

 

을 지정해서 데이터를 선택할 수 있다.

: iloc[ ]을 사용해 정수 인덱스로 행을 선택할 수 있다.

: loc[ ]을 사용해 인덱스 라벨로 특정 행을 선택할 수 있다.

 

슬라이싱을 통해서도 데이를 선택할 수 있다.

: 개별행을 선택하는 것은 안 된다. but 하나의 데이터를 보고싶을 때 슬라이싱 범위를 1로 맞춰주면 된다.

df[0]	# 동작하지 않음.
df[0:1]	# 첫 번째 행만 보고 싶을 때
df[2:3]	# 3번째 행만 보고 싶을 때

   조건부 필터링

데이터 필터링은 기본적으로 어떤 데이터에 대해 조건을 걸고, 그 조건에 해당하는 행들만 불러오는 것이다.

문법은 1) 데이터프레임의 이름을 적고,   2) 괄호[ ] 안에 조건식을 넣으면 된다.

 

조건을 사용해 필터링된 데이터프레임을 반환할 수 있다.

# 데이터프레임[조건식]
# 나이가 25 이상인 행만 선택
  나이가 25세 이상인 값들만 필터링돼서 나오게 되는 것.
df[df['나이'] >= 25]

 

AND(&), OR(|) 연산자를 사용해 여러 조건을 결합해 필터링 할 수 있다. 이 때는 반드시 괄호()를 써서 조건 단위로 묶어줘야 한다.

titanic[(titanic["Age"] >= 25) & (titanic["Age"] <= 60)]
# 나이가 25세 이상이고, 60세 이하인 데이터만 추출됨.

 

but 이 때 Python의 기본 논리연산자인 and, or, not을 사용하면 안 된다. 비교 연산자는 일반적인 Python 연산자 ==, !=, >, <, >=, <= 와 동일하다.

 

무조건 행 조건을 전달해야 열 조건을 전달할 수 있는데, 열 조건만 전달하고 싶을 때는 전체 행을 지정하면 된다.

titanic[(titanic["Age"] >= 25) & (titanic["Age"] <= 60)].loc["Age"]
# 열 조건은 콤마, 뒤에 와야하는데 콤마, 앞에 아무것도 없어서 에러 발생!

titanic[(titanic["Age"] >= 25) & (titanic["Age"] <= 60)].loc[:,"Age"]
# 전체 데이터에서 열만 걸러낸다는 뜻이므로, 열 조건만 전달하는 것과 동일한 효과를 내는 것.

 

isin() 메서드를 사용한 필터링은 특정 열에 값들이 범위에 들어오면 참값을 반환한다. 이는 특정 값들이 포함된 행을 필터링할 때 유용하다.

titanic["Sex"].isin(["male"])
# titanic에서 "Sex"를 지정해주고, isin 메서드를 호출해서 해당 값의 범위가 male인지 보는 코드.
# 출력하면 male인 값들만 True로 바뀐 것을 확인할 수 ㅇ.

# 이 데이터를 그대로 titanic이라는 곳에 필터링할 때 활용하면
titanic[titanic["Sex"].isin(["male"])]
# "Sex"가 male인 것만 데이터로 볼 수 ㅇ.

 

~ 연산자를 사용하여 반대 조건 필터링할 수 있다. 특정 조건을 부정하는 데이터를 선택할 때 사용하며, NOT 연산자라고 생각하면 된다. 이는 하나의 조건을 제외하고 모든 조건을 만족시키는 것으로 볼 수 있으므로, 활용하기에 따라 다양한 결과를 만들어낼 수 있다.

 

   데이터 타입 변환

데이터를 분석하고, 처리할 때는 올바른 데이터 타입을 사용하는 것이 중요하다.

 

데이터 타입을 변환하려면 먼저 데이터 타입을 확인해야 하는데, dtype으로 데이터 타입을 확인할 수 있다.

df.dtypes

 

특정 열의 데이터 타입을 변경하려면 astype()을 사용하면 된다.

# '나이' 열을 정수형(int)에서 실수형(float)으로 변환
df['나이'] = df['나이'].astype(float)
# 나이	float64

 

결측치가 있거나, 바꾸고 싶은 데이터 타입으로 바꿀 수 없는 데이터가 있을 때는, 타입을 적절히 처리한 다음 변환을 진행해야 한다. 이 때, fillna() 메서드를 사용해 결측치를 적절한 값으로 바꿀 수 있다.

titanic["Age"].fillna(titanic["Age"].mean(), inplace = True)
# 결측치를 "Age"의 평균값(mean)으로 전달한 것.

# 이를 실행하고 데이터 프레임을 다시 확인해보면, 

titanic["Age"]
# 결측치 자리에 "Age"의 평균값(mean)이 들어온 것 확인 가능.

 

날짜 데이터는 pd.to_datetime() 함수를 사용해 날짜 타입으로 변환할 수 있다. 이를 통해 날짜에 활용할 수 있는 다양한 기능들을 적용할 수 있게 된다.

# 예시 데이터프레임 생성
data = {
	'이름':['철수', '영희', '민수'],
    '가입일':['2023-01-01', '2022-12-15', '2023-05-22']
}
df = pd.DataFrame(data)

# '가입일'을 날짜 타입으로 변환
df['가입일'] = pd.to_datetime(df['가입일'])

# '가입일'의 데이터 타입이 object에서 datetime64[ns]로 바뀐 것을 확인 가능.

 

카테고리 데이터 변환하면, 메모리를 절약하고, 성능을 높일 수 있다.

타입 변환 시, int는 그냥 넣었지만,  category는 ' '를 사용해야 한다.

# '직업' 열을 카테고리형으로 변환
df['직업'] = df['직업'].astype('category')

   강의 외부에서 추가로 알게된 내용

  • Escape sequence(이스케이프 시퀀스)

- 문자열 안에서 특수한 기능을 수행하기 위해 사용하는 문자 조합. 주로 백슬래시(\)와 함께 사용되며,

  일반적인 문자로서 인식되지 않고 특별한 의미를 가짐.

- 대표적인 이스케이프 시퀀스들

  • \n : 줄 바꿈 (Newline)
  • \t : 탭 (Tab)
  • \\ : 백슬래시 (\ 자체를 표현)
  • \' : 작은 따옴표 (')
  • \" : 큰 따옴표 (")
  • \r : 캐리지 리턴 (문자열의 처음으로 커서를 이동)
  • \b : 백스페이스 (Backspace)
  • \f : 폼 피드 (새 페이지로 넘기기)