기초 수학과 통계 (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



댓글

이 블로그의 인기 게시물

베이스 캠프에서 (1)

베이스 캠프에서 (2)

Database 분석 (4)