‘처음이야? 파이썬 데이터 분석’ 1주차 스터디 후기: 구글 코랩과 NumPy 기초 정복

드디어 기다리고 기다리던 ‘처음이야? 파이썬 데이터 분석‘ 책이 도착하여 바로 4주간의 온라인 독학 스터디를 시작해 보려고 합니다. 이번 주는 그 첫 번째 주차 내용을 블로그에 정리해 봅니다. 이번 주에는 데이터 분석을 위한 환경 설정부터 파이썬 데이터 분석의 핵심 라이브러리인 NumPy의 기초를 다졌습니다.
1장 : 데이터 분석 시작하기
첫장 에서는 파이썬이나 VSCode와 같은 개발 환경을 직접 설치할 필요 없이, 구글에서 제공하는 무료 클라우드 기반 개발 환경인 ‘구글 코랩(Google Colab)’을 사용하는 방법을 학습하였습니다. 웹 브라우저만 있으면 언제 어디서든 코딩할 수 있다는 점이 매우 편리하였습니다.
특히, PC에 직접 설치하는 방식이 아니므로 CSV 파일과 같은 외부 데이터를 불러오거나 업로드하는 방법, 그리고 한글 깨짐 현상 해결법 및 matplotlib
라이브러리를 활용한 그래프 작성 기초까지 모두 살펴보았습니다. 데이터 분석의 첫 단추를 끼우는 의미 있는 시간이었습니다.
2장 : NumPy
드디어 파이썬 데이터 분석의 핵심 라이브러리인 NumPy를 접하게 되었습니다. NumPy는 파이썬 기본 리스트보다 훨씬 강력하고 빠른 배열(Array) 기능을 제공하여 데이터 분석에 필수적인 라이브러리라고 합니다. 이번 챕터에서는 NumPy 배열을 생성하고, 속성을 확인하며, 데이터를 다루는 기본기를 탄탄하게 다졌습니다.
2.1 NumPy 개요
NumPy는 파이썬에서 고성능 수치 계산을 지원하는 핵심 라이브러리로, 데이터 분석, 과학 계산, 통계 등의 분야에서 널리 사용됩니다. 특히 다차원 배열 객체인 ndarray
를 기반으로 하며, 벡터, 행렬과 같은 선형 대수 연산을 빠르고 효과적으로 처리할 수 있도록 설계되었습니다. NumPy의 상당 부분은 C언어로 구현되어 있어 파이썬 리스트에 비해 연산 속도가 매우 빠르고 메모리 효율성이 뛰어납니다. 이러한 장점 덕분에 데이터 과학, 머신러닝, 과학 계산 분야에서 광범위하게 활용됩니다.
import numpy as np
print(np.__version__) # NumPy 버전 확인
2.2 배열 생성
NumPy 배열은 파이썬 리스트처럼 직접 생성할 수도 있고, 특정 값으로 채우거나 범위 및 간격에 따라 생성할 수도 있습니다.
import numpy as np
# 1차원 및 2차원 배열을 생성
x = np.array([1,2,3,4])
print(x)
y = np.array([[1,2,3],[4,5,6]])
print(y)
# np.zeros() 함수
x = np.zeros((2,3))
print(x)
# np.ones() 함수
x = np.ones((2, 3))
print(x)
# np.full() 함수
x = np.full((2, 2), 7)
print(x)
# np.empty() 함수
x = np.empty((2, 2))
print(x)
# np.arange() 함수
x = np.arange(0, 10, 2)
print(x)
# np.linspace() 함
x = np.linspace(0, 1, 5)
print(x)
np.array()
를 사용하여 리스트로부터 1차원 및 2차원 배열을 생성하고 출력했습니다. 또한, np.zeros()
, np.ones()
, np.full()
, np.empty()
를 사용하여 특정 값으로 채워진 배열을 생성하고 출력하는 방법을 배웠습니다. np.arange()
로 특정 범위의 배열을, np.linspace()
로 동일 간격의 숫자로 배열을 생성하고 출력하는 예시를 살펴보았습니다.
2.3 배열의 주요 속성
NumPy 배열은 shape
, dtype
, size
, ndim
등 다양한 속성을 가지고 있어 배열의 특징을 쉽게 파악할 수 있습니다.
import numpy as np
# shape 속성
x = np.array([[1, 2, 3], [4, 5, 6]])
print(x.shape)
# dtype 속성
x = np.array([1.0, 2.0, 3.0])
print(x.dtype)
# size 속성
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(x.size)
# ndim 속성
x = np.array([1, 2, 3])
print(x.ndim)
y = np.array([[[1], [2]],[[3], [4]]])
print(y.ndim)
# 다차원 배열의 모든 요소를 순
x = np.array([[1, 2], [3, 4]])
for element in x.flat:
print(element)
배열 x
와 y
의 shape
(형태), dtype
(데이터 타입), size
(전체 요소 개수), ndim
(차원 수)과 같은 주요 속성들을 출력하여 배열의 특징을 파악하는 방법을 학습했습니다. 또한, x.flat
을 사용하여 배열의 모든 요소를 1차원 형태로 순회하며 출력하는 방법을 알아보았습니다.
2.4 배열의 데이터 타입
NumPy는 다양한 데이터 타입을 지원하며, 필요에 따라 데이터 타입을 변환할 수도 있습니다.
import numpy as np
# 기본 데이터 타입
a = np.array([1, 2, 3], dtype=np.int32)
print(a.dtype)
b = np.array([1.0, 2.0, 3.0], dtype=np.float64)
print(b.dtype)
c = np.array([True, False, True], dtype=np.bool_)
print(c.dtype)
d = np.array(['apple', 'banana', 'cherry'], dtype=np.bytes_)
print(d.dtype)
# astype 함수를 사용하여 데이터 타입을 변
x = np.array([1.5, 2.3, 3.7])
y = x.astype(np.int32)
print(y)
dtype
매개변수를 사용하여 정수(a
), 실수(b
), 불리언(c
), 바이트 문자열(d
) 타입의 배열을 생성하고 각 데이터 타입을 출력했습니다. 이어서 실수형 배열 x
를 x.astype(np.int32)
를 사용하여 정수형으로 변환한 새로운 배열 y
를 출력하는 방법을 학습했습니다.
2.5 배열의 인덱싱
NumPy 배열의 특정 요소에 접근하는 방법은 파이썬 리스트와 유사하면서도 더욱 강력합니다.
import numpy as np
# 1차원 배열의 인덱싱
x = np.array([10, 20, 30, 40, 50])
print(x[0])
print(x[3])
# 2차원 배열의 인덱싱
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(x[1, 2])
print(x[0, 0])
# 1차원 배열의 음수 인덱싱
x = np.array([10, 20, 30, 40, 50])
print(x[-1])
print(x[-2])
# 2차원 배열의 음수 인덱싱
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(x[-1, -1])
# Boolean 인덱싱
x = np.array([10, 20, 30, 40, 50])
y = x > 30
print(x[y])
# 팬시 인덱싱
x = np.array([10, 20, 30, 40, 50])
y = [0, 2, 4]
print(x[y])
# 다차원 배열에서 특정 요소들을 동시에 선
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8,9]])
print(x[[0, 2], [1, 0]])
1차원 배열 x
에서 x[index]
와 x[-index]
를 사용하여 특정 인덱스(양수 및 음수)의 요소를 출력했습니다. 2차원 배열 x
에서는 x[row_index, col_index]
와 x[-row_index, -col_index]
를 사용하여 특정 행과 열의 요소를 출력했습니다. 또한, 불리언 배열 y
(x > 30
)를 이용한 x[y]
로 조건에 맞는 요소를 선택하거나, 정수 리스트 y
([0, 2, 4]
)를 이용한 x[y]
로 특정 인덱스의 요소를 선택하는 방법을 학습했습니다. 마지막으로 2차원 배열 x
에서 x[[0, 2], [1, 0]]
와 같이 특정 위치의 값들을 선택하는 예시를 살펴보았습니다.
2.6 배열의 슬라이싱
배열의 특정 부분을 잘라내는 슬라이싱은 데이터 분석에서 매우 자주 활용되는 기능입니다.
import numpy as np
# 슬라이싱
x = np.array([10, 20, 30, 40, 50])
print(x[1:4])
print(x[:3])
print(x[::2])
print(x[-3:])
# NumPy의 슬라이싱 기능을 사용하여 2차원 배열에서 특정 행과 열의 서브 배열 선택
x = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(x[0:2, 1:3])
# NumPy 배열에서 특정 열과 행 선택
y = x[:, 1]
print(y)
z = x[1, :]
print(z)
# Boolean 슬라이싱
x = np.array([10, 20, 30, 40, 50])
y = x % 20 == 0
print(x[y])
# 배열 슬라이싱
x = np.array([1, 2, 3, 4, 5])
y = x[1:4]
print(y)
y[0] = 99
print(y)
print(x)
1차원 배열 x
에서 x[start:end:step]
형태를 사용하여 x[1:4]
, x[:3]
, x[::2]
, x[-3:]
와 같이 다양한 방식으로 요소를 선택하고 출력했습니다. 2차원 배열 x
에서는 x[0:2, 1:3]
와 같이 특정 행과 열 범위를 지정하여 서브 배열을 선택하고 출력했습니다. x[:, 1]
로 특정 열 전체를, x[1, :]
로 특정 행 전체를 선택하는 방법도 학습했습니다. 불리언 배열 y
(x % 20 == 0
)를 이용한 x[y]
로 조건에 맞는 요소를 선택하는 예시도 살펴보았습니다. 마지막으로, y = x[1:4]
와 같이 슬라이싱된 배열 y
가 원본 배열 x
의 ‘뷰’이므로, y
의 요소를 변경하면 x
도 함께 변경됨을 보여주는 예시를 통해 이 중요한 특징을 이해했습니다.
1주차 마무리
이번 주에는 구글 코랩으로 개발 환경을 설정하고, NumPy의 기본적인 배열 생성, 속성 확인, 인덱싱, 슬라이싱까지 꼼꼼하게 살펴보았습니다. 처음에는 어려울 수 있었는데, 저자분의 무료 유튜브 온라인 강의를 보면서 직접 코드를 실행하고 결과물을 확인하니 이해하는 데 큰 도움이 되었습니다.
특히 NumPy의 강력함과 유연성을 조금이나마 경험한 것 같아 다음 주 학습이 더욱 기대됩니다.