Sam Park Blog.

Sam의 워드프레스 블로그

Sam Park Blog.

Sam의 워드프레스 블로그

미분류

 ‘처음이야? 파이썬 데이터 분석’ 2주차 스터디 후기: NumPy 배열, 데이터 분석의 핵심 기능 활용


드디어 ‘처음이야? 파이썬 데이터 분석’ 온라인 독학 스터디 2주차 미션을 완료하였습니다. 지난주 NumPy 기초 학습에 이어, 이번 주에는 배열을 활용하여 더 복잡하고 실용적인 작업을 수행해 보았습니다.

배열 연산부터 비교, 병합, 정렬, 필터링, 그리고 통계까지, 데이터 분석의 핵심인 NumPy 배열을 다루는 방법을 제대로 익힌 것 같습니다. 그럼 제가 2주차에 어떤 내용들을 학습하였는지 함께 살펴보시겠습니다.





2.7 배열의 연산

NumPy 배열의 가장 큰 장점은 벡터화된 연산입니다. 배열끼리 더하기, 빼기, 곱하기, 나누기 등 사칙연산을 수행하면 각 요소에 바로 적용되어 편리합니다. 이는 같은 크기의 배열끼리 요소별로 계산되며, 크기가 다른 배열이라도 브로드캐스팅 규칙에 따라 연산이 가능합니다. 예를 들어, 배열에 스칼라 값을 더하거나 곱하는 경우에도 배열 전체에 연산이 일괄 적용됩니다. 또한, np.logical_andnp.logical_ornp.logical_not 함수를 사용하여 논리 연산을 수행할 수 있으며, np.sqrt()와 같은 수학 함수도 배열 전체에 적용됩니다.


import numpy as np

x = np.array([1, 2, 3])
y = np.array([4, 5, 6])
a = x + y
print(a)

b = x - y
print(b)

c = x * y
print(c)

d = x / y
print(d)

a = x + 2
print(a)

b = x * 3
print(b)

bool_x = np.array([True, False, True])
bool_y = np.array([False, False, True])
a = np.logical_and(bool_x, bool_y)
print(a)

b = np.logical_or(bool_x, bool_y)
print(b)

c = np.logical_not(bool_x)
print(c)

nums = np.array([1, 4, 9])
a = np.sqrt(nums)
print(a)




2.8 배열 비교

데이터 분석에서 특정 조건을 만족하는 데이터를 찾는 것은 매우 중요합니다. NumPy 배열에서는 > (초과), < (미만), == (같음) 등 다양한 비교 연산자를 사용하여 각 요소에 대해 비교를 수행할 수 있으며, 결과는 불리언(Boolean) 배열로 반환됩니다. 배열의 모든 요소가 True인지 확인하려면 np.all()을, 하나라도 True가 있는지 확인하려면 np.any()를 사용합니다. 두 배열의 형태와 모든 요소가 완전히 동일한지 정확하게 확인하고 싶을 때는 np.array_equal() 함수를 사용합니다.


import numpy as np

x = np.array([10, 20, 30, 40, 50])
print(x > 30)

y = np.array([[1, 2, 3], [4, 5, 6]])
print(y > 3)

arr1 = np.array([1, 2, 3])
arr2 = np.array([1, 2, 3])
arr3 = np.array([1, 2, 4])

print(np.array_equal(arr1, arr2))
print(np.array_equal(arr1, arr3))

bool_arr = np.array([True, False, True])
print(np.all(bool_arr))
print(np.any(bool_arr))




2.9 배열 병합

여러 개의 배열을 하나로 합쳐야 할 때 np.concatenate() 함수를 사용합니다. 이 함수는 여러 배열을 특정 axis를 기준으로 합치는데, axis=0은 행(row)을 기준으로 세로로 병합하고, axis=1은 열(column)을 기준으로 가로로 병합합니다. axis 옵션을 활용하여 데이터의 구조를 유지하면서 배열을 효율적으로 결합할 수 있습니다.


import numpy as np

x = np.array([[1, 2], [3, 4]])
y = np.array([[5, 6], [7, 8]])

print(np.concatenate((x, y), axis=0))
print(np.concatenate((x, y), axis=1))




2.10 배열 정렬

데이터를 분석하기 전에 특정 기준에 따라 정렬하는 것은 필수적인 작업입니다. NumPy에서는 np.sort() 함수나 배열 자체의 sort() 메서드를 사용하여 배열을 정렬할 수 있습니다. np.sort()는 원본을 변경하지 않고 정렬된 새 배열을 반환하며, [::-1]을 붙이면 역순 정렬도 가능합니다. array.sort()는 원본 배열을 제자리에서 정렬합니다. 다차원 배열의 경우 axis 옵션을 활용하여 열(axis=0) 또는 행(axis=1) 기준으로 정렬합니다. np.lexsort((key1, key2, ...)) 함수를 사용하면 여러 키를 기준으로 복합적인 정렬을 수행할 수 있으며, 가장 마지막 키가 주된 정렬 기준이 됩니다.


import numpy as np

x = np.array([3, 1, 2, 5, 4])
print(np.sort(x))
print(np.sort(x)[::-1])

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

b = np.sort(a, axis=0)
print(b)

c = np.sort(a, axis=1)
print(c)

d = np.sort(a, axis=None)
print(d)

y = np.array([3, 1, 4, 1, 5, 9])
y.sort()
print(y)
y = y[::-1]
print(y)

y_2d = np.array([[3, 1, 4], [1, 5, 9]])
y_2d.sort(axis=1)
print(y_2d)
y_2d.sort(axis=0)
print(y_2d)

ages = np.array([25, 30, 22, 24])
names = np.array(["철수", "영희", "민수", "영희"])
sorted_indices = np.lexsort((ages, names))

print(ages[sorted_indices])
print(names[sorted_indices])




2.11 배열 필터링

수많은 데이터 중에서 원하는 조건에 맞는 데이터만 골라내는 것을 필터링이라고 합니다. NumPy에서는 불리언 인덱싱을 통해 조건에 맞는 요소를 추출할 수 있습니다. np.where(condition, x, y) 함수는 조건이 True이면 x의 값을, False이면 y의 값을 반환하여 특정 값으로 대체하거나 인덱스를 찾을 때 유용합니다. 여러 조건을 조합할 때는 & (AND), | (OR), ~ (NOT) 연산자를 사용하며, 이는 파이썬의 기본 andor 연산자와는 다르게 요소별로 적용됩니다. np.extract(condition, arr) 함수도 조건이 True인 요소를 추출하는 데 사용됩니다.


import numpy as np

x = np.array([10, 20, 30, 40, 50])
print(x > 30)
print(x[x > 30])

x_2d = np.array([[1, 2, 3], [4, 5, 6], [7,8, 9]])
print(x_2d[x_2d > 5])

y = np.where(x > 25, x, -1)
print(y)

x2_where = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y2_where = np.where(x2_where % 2 == 0, x2_where, -1)
print(y2_where)

print(np.where(x > 25))

x_ma = np.array([1, 2, 3, 4, 5])
y_ma = x_ma % 2 == 1
z_ma = np.ma.array(x_ma, mask=y_ma)
print(z_ma)
print(np.ma.sum(z_ma))

x_val = np.array([10, 20, 30, 40, 50, 60, 70, 80])
y_val = np.array([15, 22, 35, 45, 55, 65, 75, 85])
condition1 = x_val > 30
print(condition1)

condition2 = y_val < 50
print(condition2)

print(x_val[condition1 & condition2])
print(x_val[condition1 | condition2])
print(x_val[~condition2])

x_extract = np.array([10, 20, 30, 40, 50])
print(np.extract(x_extract > 25, x_extract))




2.12 배열의 통계

데이터 분석의 핵심은 통계입니다. NumPy는 배열의 최소/최대값(np.min()np.max()), 합계(np.sum()), 평균(np.mean()), 중앙값(np.median()), 분산(np.var()), 표준편차(np.std()) 등 다양한 통계량을 쉽게 계산할 수 있는 함수들을 제공합니다. np.ptp()는 최댓값과 최솟값의 차이를 반환합니다. 이 통계 함수들에서도 axis 옵션을 활용하여 열(axis=0) 또는 행(axis=1) 기준으로 통계를 계산할 수 있습니다. 또한, np.percentile(arr, q) 함수로 배열의 특정 백분위수를 계산할 수 있습니다.


import numpy as np

data = np.array([1, 2, 3, 4, 5, 9])
print(np.min(data))
print(np.max(data))
print(np.sum(data))
print(np.mean(data))
print(np.median(data))
print(np.var(data))
print(np.std(data))
print(np.ptp(data))

matrix = np.array([[1, 2, 3], [4, 5, 9]])

print(np.mean(matrix))
print(np.mean(matrix, axis=0))
print(np.mean(matrix, axis=1))

x1_med = np.array([1, 2, 3, 4, 9])
y1_med = np.median(x1_med)
print(y1_med)

x2_med = np.array([[1, 2, 3], [4, 5, 9]])
y2_med = np.median(x2_med)
print(y2_med)

y3_med = np.median(x2_med, axis=0)
print(y3_med)

y4_med = np.median(x2_med, axis=1)
print(y4_med)

x1_var = np.array([1, 2, 3, 4, 9])
y1_var = np.var(x1_var)
print(y1_var)

x2_var = np.array([[1, 2, 3], [4, 5, 9]])
y2_var = np.var(x2_var)
print(y2_var)

y3_var = np.var(x2_var, axis=0)
print(y3_var)

y4_var = np.var(x2_var, axis=1)
print(y4_var)

x1_std = np.array([1, 2, 3, 4, 9])
y1_std = np.std(x1_std)
print(y1_std)

x2_std = np.array([[1, 2, 3], [4, 5, 9]])
y2_std = np.std(x2_std)
print(y2_std)

y3_std = np.std(x2_std, axis=0)
print(y3_std)

y4_std = np.std(x2_std, axis=1)
print(y4_std)

data_percentile = np.array([10, 20, 30, 40, 50])
q1 = np.percentile(data_percentile, 25)
q3 = np.percentile(data_percentile, 75)
print(q1)
print(q3)




2주차 마무리

이번 2주차 스터디를 진행하면서 NumPy가 왜 데이터 분석의 ‘핵심’ 라이브러리인지 제대로 체감하였습니다. 배열 연산부터 통계 분석까지, 복잡한 데이터 처리도 NumPy 덕분에 훨씬 쉽고 빠르게 수행할 수 있다는 것을 깨달았습니다. 특히 axis 옵션의 중요성을 다시 한번 상기하게 된 시간이었습니다.



답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다