AI/머신러닝

[ML 실습] 3일차 복습- 넘파이 마지막, 판다스 시작

씨이오가 되자 2025. 1. 27. 19:31
728x90

일단은 numpy를 import시켜준다.

import numpy as np

 

행렬의 정렬 

np.sort( )넘파이에서 sort( ) 를 호출하는 방식

원본 행렬은 그대로 유지한 채 원행렬의 정렬된 행렬을 반환한다.

ndarray.sort( ) 행렬 자체에서 sort( )를 호출하는 방식 

원본 행렬 자체를 정렬한 형태로 변환하며 반환 값은 None이다. 

org_array = np.array([3,1,9,5])
print('원본 행렬:', org_array)

#np.sort()로 정렬
sort_array1 = np.sort(org_array)
print('np.sort() 호출 후 반환된 정렬 행렬:', sort_array1)
print('np.sort() 호출 후 원본 행렬:',org_array)

#ndarray.sort()로 정렬
sort_array2 = org_array.sort()
print('org_array.sort() 호출 후 반환된 행렬:',sort_array2)
print('org_array.sort() 호출 후 원본 행렬:',org_array)

#내림차순 정렬
sort_array1_desc = np.sort(org_array)[::-1]
print('내림차순으로 정렬:',sort_array1_desc)

[::-1]을 통해 내림차순 정렬도 가능하다. 

행렬이 2차원 이상일때 axis 축값 설정을 통해 로우 방향, 칼럼 방향으로 정렬을 수행한다.

세로(row): aixs=0, 가로(column): axis=1

 

정렬된 행렬의 인덱스 반환 => np.argsort( )

np.argsort( )은 정렬 행렬의 원본 행렬 인덱스를 ndarray형으로 반환한다.

org_array = np.array([3,1,9,5])
sort_indices = np.argsort(org_array)
print(type(sort_indices))
print('행렬 정렬 시 원본 행렬의 인덱스:',sort_indices)

org_array = np.array([3,1,9,5])
sort_indices_desc = np.argsort(org_array)[::-1]
print('행렬 내림차순 정렬 시 원본 행렬의 인덱스:',sort_indices_desc)

넘파이의 ndarray는 RDBMS의 TABLE 칼럼이나 판다스 DataFrame 칼럼과 같은 메타 데이터를 가질 수 없다.

실제값과 그 값이 뜻하는 메타 데이터를 별도의 ndarray로 각각 가져야한다.

John = 78점, Mike = 95점, Sarah = 84점, Samuel = 88점에서 분리해서 name_array와 score_array를 만들어야한다.

name_array = np.array(['John', 'Mike', 'Sarah', 'Kate', 'Samuel'])
score_array = np.array([78,95,84,98,88])

sort_indices_asc = np.argsort(score_array)
print('성적 오름차순 정렬 시 score_array의 인덱스:',sort_indices_asc)
print('성적 오름차순으로 name_array의 이름 출력:',name_array[sort_indices_asc]

행렬 내적과 전치 행렬

행렬의 내적은 행렬 곱이며, 두 행렬 A와 B의 내적은 np.dot( )을 이용한다.

A = np.array([[1,2,3],[4,5,6]])
B = np.array([[7,8],[9,10],[11,12]])
dot_product = np.dot(A,B)
print('행렬 내적 결과:\n',dot_product)

전치 행렬은 넘파이의 transpose( )를 이용하여 구할 수 있다.

A = np.array([[1,2],[3,4]])
transpose_mat = np.transpose(A)
print('A의 전치행렬\n',transpose_mat)

판다스 시작.

pandas는 파이썬에서 데이터 처리를 위해 존재하는 가장 인기 있는 라이브러리이다. 행과 열로 이뤄진 2차원 데이터이다. 

파이썬의 리스트, 컬렉션, 넘파이 등의 내부 데이터뿐만 아니라 CSV 등의 파일을 쉽게 DataFrame으로 변경해 데이터의 가공/분석을 편리하게 수행할 수 있게 해준다. 

판다스의 핵심 객체는 DataFrame이다. DataFrame은 여러 개의 행과 열로 이뤄진 2차원 데이터를 담는 데이터 구조체이다. 또다른 중요 객체는 Index와 Series도 있다. Index는 RDBMS의 PK처럼 개별 데이터를 고유하게 식별하는 Key값이다. Series와 DataFrame은 모두 Index를 key값으로 가지고 있다. Series와 DataFrame의 큰 차이는 Series는 칼럼이 하나뿐인 데이터 구조체이고, DataFrame은 칼럼이 여러 개인 데이터 구조체이다. 

 

판다스는 다양한 포맷으로 된 파일을 DataFrame으로 로딩할 수 있는 편리한 API 제공한다. 

1. read_CSV( ) - 칼럼을 ' , '로 구분한 파일 포맷인 CSV 파일 포맷 변환을 위한 API

  read_CSV( '파일명', sep = '\t')
  # sep 생략 시 콤마로 디폴트

 

2. read_table( ) - 칼럼을 'tab'으로 구분한 파일로 변환

3. read_fwf( ) - Fixed Width, 즉 고정 길이 기반의 칼럼 포맷을 DataFrame으로 로딩하기 위한 API

 

read_CSV(filepath_or_buffer, sep =', ', ...) 함수에서 가장 중요한 인자는 filepath이다. Filepath에는 로드하려는 데이터 파일의 경로를 포함한 파일명을 입력하면 된다. 만약 새로운 주피터 노트북을 C:\Users\chkwon\Data_Handling에 titanic_train.csv 파일을 저장했다면 read_csv('titanic_train.csv')만으로도 DataFrame으로 로딩이 가능하다.

titanic_df = pd.read_csv(r'C:\Users\yunju\Documents\ML\titanic_dataset\titanic_train.csv')
print('titanic 변수 type:',type(titanic_df))
titanic_df

titanic_df.head(3)

DataFrame.head(N)는 DataFrame의 맨앞에 N개의 로우(열)을 반환한다

 

print('DataFrame 크기:',titanic_df.shape)

DataFrame의 행과 열 크기를 알아보는 것은 DataFrame 객체의 shape변수를 이용한다.

titanic_df.info()

DataFrame은 데이터뿐만 아니라 컬럼의 타입, Null 데이터 개수, 데이터 분포도 등의 메타 데이터 등도 조회가 가능하다.

titanic_df.describe()

describe( ) 메서드는 칼럼별 숫자형 데이터값의 n-percentile 분포도, 평균값, 최댓값, 최솟값을 나타낸다.

오직 숫자형 칼럼의 분포도만 조사하며 자동으로 object 타입의 칼럼은 출력에서 제외시킨다. 

describe( ) 해당 숫자 칼럼이 숫자형 카테고리 칼럼인지를 판단할 수 있게 도와준다. 이때 카테고리 칼럼은 특정 범주에 속하는 값을 코드화한 칼럼이다. 

DataFrame [ ] 연산자 내부에 칼럼명을 입력하면 Series 형태로 특정 칼럼 데이터 세트가 반환된다. 반환된 Series 객체에 value_counts( ) 메서드를 호출하면 해당 칼럼값의 유형과 건수를 확인할 수 있다. value_counts( )는 지정된 칼럼의 데이터값 건수를 반환함. value_counts( )는 데이터의 분포도를 확인하는데 매우 유용한 함수이다. 

value_counts = titanic_df['Pclass'].value_counts()
print(value_counts)

⏫value_counts( )의 반환결과는 Pclass값 3이 491개, 1이 216개, 2가 184개이다.

value_counts( )많은 건수 순서로 정렬되어 값을 반환한다. DataFrame의 [ ] 연산자 내부에 칼럼명을 입력하면 해당 칼럼에 해당하는 Series 객체를 반환한다. 

print('titanic_df 데이터 건수:', titanic_df.shape[0])
print('기본 설정인 dropna=Ture로 value_counts()')

print(titanic_df['Embarked'].value_counts())
print(titanic_df['Embarked'].value_counts(dropna=False))

⏫타이타닉 데이터 세트의 전체 건수는 891건이며 이는 titani_df.shape[0]로 확인할 수 있다.

Embarked 칼럼은 전체 891건 중에 2건의 데이터가 Null이다. 만약 titanic_df['Embarked'].value_counts( )의 결과는 'S', 'C', 'Q' 값으로 각각 644, 168, 77을 반환한다. 전체를 합하면 889(644+168+77)가 되기에 2건의 NULL 데이터를 제외하고 연산을 수행. 

 


참고:

파이썬 머신러닝 완벽 가이드, 권철민, 위키북스

728x90