기초 수학과 통계 (1)
NumPy
import numpy as np
NumPy 배열 생성
NumPy의 핵심은 ndarray(N차원 배열) 객체입니다. 이 자료구조는 숫자 데이터를 다루는 데 최적화되어 있으며,
Python 리스트보다 훨씬 빠르고 수학적 연산에 유용한 기능이 많습니다. Python 리스트를 이용해 간단하게 만들 수 있습니다.
np.array() 함수에 Python 리스트를 전달
2차원 배열(행렬)을 만들려면 리스트 안에 리스트를 넣는 중첩 구조
# 1차원 배열 생성
list_1d = [1, 2, 3, 4, 5]
arr1d = np.array(list_1d)
print("1차원 배열:\n", arr1d)
# 2차원 배열(행렬) 생성
list_2d = [[10, 20, 30], [40, 50, 60]]
arr2d = np.array(list_2d)
print("\n2차원 배열:\n", arr2d)
1차원 배열:
[1 2 3 4 5]
2차원 배열:
[[10 20 30]
[40 50 60]]
3명의 환자 데이터를 담은 2차원 NumPy 배열 patient_data를 만들어 보세요.
각 환자의 데이터는 [키(cm), 체중(kg), 나이(세)] 순서입니다.
환자 1: [175, 72, 45]
환자 2: [160, 58, 32]
환자 3: [182, 85, 51]
list2ndData = [[175, 72, 45],[160, 58, 32],[182, 85, 51]]
patient_data = np.array(list2ndData)
print(patient_data)
[[175 72 45]
[160 58 32]
[182 85 51]]
배열의 속성 확인
데이터의 구조
NumPy 배열은 shape(형태), ndim(차원), dtype(데이터 타입)과 같은 메타데이터를 속성
# 이전 섹션에서 만든 patient_data 배열을 사용합니다.
print("배열의 형태 (shape):", patient_data.shape)
print("배열의 차원 (ndim):", patient_data.ndim)
print("배열의 데이터 타입 (dtype):", patient_data.dtype)
배열의 형태 (shape): (3, 3)
배열의 차원 (ndim): 2
배열의 데이터 타입 (dtype): int64
4명의 학생에 대한 2과목의 시험 점수 데이터 [[88, 92], [75, 81], [95, 99], [61, 72]]를 담은 score_data 배열을 만들고,
그 배열의 형태와 차원 수를 출력해 보세요.
ListscoreData = [[88, 92], [75, 81], [95, 99], [61, 72]]
score_data = np.array(ListscoreData)
print("시험 점수 배열의 형태: ",score_data.shape)
print("시험 점수 배열의 차원: ", score_data.ndim)
인덱싱과 슬라이싱 (데이터 추출)
인덱싱과 슬라이싱은 배열에서 특정 원소나 부분 집합을 추출
분석에 필요한 데이터만 골라내
대괄호 []를 사용해 데이터에 접근합니다. 2차원 배열은 배열[행, 열] 형식입니다. 콜론(:)은 특정 축의 모든 원소 또는 범위를 선택하는 슬라이싱에 사용됩니다.
배열[2]: 3번째 행 전체에 접근합니다. (인덱스는 0부터 시작)
배열[2, 1]: 3번째 행, 2번째 열의 원소 하나에 접근합니다.
배열[:, 1]: 모든 행(:)의 2번째 열 데이터만 추출합니다.
배열[0:2, :]: 1번째 행부터 2번째 행까지(0:2는 인덱스 0, 1을 의미), 그리고 모든 열(:)을 추출합니다.
# patient_data 배열에서 데이터 추출하기
# 첫 번째 환자 정보 (인덱스 0번 행)
print("1번 환자 정보:", patient_data[0])
# 세 번째 환자의 나이 (인덱스 2번 행, 2번 열)
print("3번 환자 나이:", patient_data[2, 2])
# 모든 환자의 체중 (모든 행, 인덱스 1번 열)
print("모든 환자 체중:", patient_data[:, 1])
1번 환자 정보: [175 72 45]
3번 환자 나이: 51
모든 환자 체중: [72 58 85]
patient_data 배열을 이용하여 다음 정보를 추출해 보세요.
두 번째 환자(인덱스 1)의 체중(인덱스 1)
모든 환자의 나이(인덱스 2)
세 번째 환자(인덱스 2)의 모든 정보
환자 1: [175, 72, 45] 환자 2: [160, 58, 32] 환자 3: [182, 85, 51]
print(patient_data[1,1])
print(patient_data[:,2])
print(patient_data[2])
58
[45 32 51]
[182 85 51]
벡터화 연산 (Vectorized Operation)
벡터화는 NumPy의 가장 강력한 기능
for 반복문 없이 배열 전체에 대해 산술 연산을 한 번에 적용
코드가 매우 간결해지고 연산 속도가 비약적으로 빨라짐
스칼라-벡터 연산 (배열과 숫자 간의 연산)
NumPy 배열과 숫자(스칼라) 사이에 일반적인 산술 연산자(+, -, *, /)를 사용하면 됩니다.
연산은 배열의 모든 원소에 자동으로 적용(브로드캐스팅)됩니다.
arr = np.array([1, 2, 3])
print("배열에 10 더하기:", arr + 10)
print("배열에 2 곱하기:", arr * 2)
patient_data 배열에서 모든 환자의 키(cm)를 미터(m) 단위로 변환하세요.
먼저 모든 환자의 키 데이터(인덱스 0번 열)를 추출합니다.
추출된 배열을 100으로 나눕니다.
print(patient_data[:,0]/100)
[1.75 1.6 1.82]
벡터-벡터 연산 (배열과 배열 간의 연산)
같은 크기를 가진 두 배열 사이의 연산은 같은 위치에 있는 원소끼리(element-wise) 수행
크기가 동일한 두 NumPy 배열 사이에 산술 연산자를 사용하면, 같은 위치의 원소끼리 연산이 이루어짐
midterm_scores = np.array([80, 75, 90])
final_scores = np.array([85, 95, 88])
# 같은 인덱스의 원소끼리 더함: 80+85, 75+95, 90+88
total_scores = midterm_scores + final_scores
print("합산 총점:", total_scores)
합산 총점: [165 170 178]
환자 3명의 체중(kg)을 담은 weights_kg 배열과 키(m)를 담은 heights_m 배열이 주어졌을 때, 각 환자의 BMI(체질량지수)를 계산해 보세요.
BMI 계산 공식: 체중(kg) / (키(m) ** 2)
# 주어진 데이터
weights_kg = np.array([72, 58, 85])
heights_m = np.array([1.75, 1.60, 1.82])
weights_kg = np.array([72, 58, 85])
heights_m = np.array([1.75, 1.60, 1.82])
bmi_values = weights_kg / heights_m ** 2
print(bmi_values)
print(np.round(bmi_values,2))
[23.51020408 22.65625 25.66115203]
[23.51 22.66 25.66]
조건 필터링 (Boolean Indexing)
조건 필터링은 특정 조건을 만족하는 데이터만 True로 표시하여 골라내
이터의 부분집합을 추출하여 분석을 심화
배열에 조건식(예: 배열 > 30)을 적용하여 True와 False로 이루어진 불리언 마스크(boolean mask) 배열을 만듭니다.
생성된 마스크를 원본 배열의 인덱스 자리에 넣으면, 마스크 값이 True인 위치의 원소만 추출됩니다.
age_arr = np.array([10, 45, 22, 58, 31])
# 1단계: 불리언 마스크 생성
age_mask = age_arr > 30
print("30보다 큰가? (마스크):", age_mask)
# 2단계: 마스크를 이용해 데이터 필터링
print("30보다 큰 값:", age_arr[age_mask])
30보다 큰가? (마스크): [False True False True True]
30보다 큰 값: [45 58 31]
patient_data 배열에서 나이가 50세 이상인 환자의 **모든 데이터(키, 체중, 나이)**를 추출해 보세요
age_mask = patient_data[:,2] >= 50
senior_patients = patient_data[age_mask]
print(senior_patients)
[[182 85 51]]
기본 통계 계산
NumPy는 데이터의 통계적 특성을 파악하는 데 유용한 함수들을 제공합니다.
이를 통해 데이터를 요약하고 이해할 수 있습니다.
평균 (np.mean()): 모든 원소의 평균값
최댓값 (np.max()): 가장 큰 값
최솟값 (np.min()): 가장 작은 값
합계 (np.sum()): 모든 원소의 합
표준편차 (np.std()): 데이터가 평균으로부터 얼마나 퍼져있는지를 나타내는 값
통계 함수는 배열 전체에 적용하거나,
axis 매개변수를 사용하여 특정 축(방향)을 기준으로 적용할 수 있습니다.
axis=0: 열(세로) 방향으로 연산을 수행합니다.
axis=1: 행(가로) 방향으로 연산을 수행합니다.
# patient_data 배열 사용
# 배열 전체 원소의 평균
print("전체 평균:", np.mean(patient_data))
# 각 열(특성)의 평균 계산 (axis=0) -> [평균 키, 평균 체중, 평균 나이]
column_means = np.mean(patient_data, axis=0)
print("열(특성)별 평균:", column_means)
# 각 행(환자)의 최댓값 계산 (axis=1)
row_maxes = np.max(patient_data, axis=1)
print("행(환자)별 최댓값:", row_maxes)
전체 평균: 95.55555555555556
열(특성)별 평균: [172.33333333 71.66666667 42.66666667]
행(환자)별 최댓값: [175 160 182]
patient_data 배열을 사용하여 다음 통계치를 계산하고 출력해 보세요.
모든 환자의 평균 나이
가장 무거운 체중(최댓값)
PatientAge= patient_data[:,2]
print(np.mean(PatientAge))
PatientWeight = patient_data[:,1]
print(np.max(PatientWeight))
height = patient_data[:,0]
std_height = np.std(height)
print(std_height)
42.666666666666664
85
9.177266598624136
댓글
댓글 쓰기