Data Science/데이터 분석 📊

[데이터 분석] 2. 데이터 자료구조Ⅰ: Python

SLYK1D 2024. 7. 30. 13:05
728x90
반응형

0. 시작하기 전에

본래 파이썬의 자료구조에는 튜플, 리스트, 사전, 셋에 대한 내용을 다뤄야하지만, 해당 내용은 꼭 데이터 분석을 위해서 뿐만 아니라, 파이썬을 활용한 다양한 프로그래밍에서 활용되기 때문에, 이번 장에서는 넘어갈 예정이다. 혹시 필요한 사람이 있다면, "Python Basic" 에서 관련된 내용을 확인하기 바란다.

1. N차원 배열(ndarray)

numpy라는 라이브러리에 포함된 자료구조로, N차원 배열 객체를 의미하며, 같은 종류의 데이터를 담을 수 있는 다차원 배열이다. 모든 배열은 각 차원의 크기를 알려주는 shape라는 튜플과 배열에 저장된 자료형을 알려주는 dtype 객체를 가지고 있다. ndarray의 astype 메소드를 이용해 배열의 dtype을 다련 형으로 명시적 변경이 가능하다.

import numpy as np
 

1.1 생성함수

배열 생성과 관련하여 초기화 할 경우에 사용하며 사용되는 함수들은 아래와 같다.

array
입력 데이터(리스트, 튜플, 배열 또는 다른 열거형 데이터)를 ndarray로 변환하며, dtype이 명시되지 않은 경우에는 자료형을 추론하여 저장하며 기본적으로 입력 데이터는 복사한다.

as.array
입력 데이터를 ndarray로 변환하지만 입력 데이터가 이미 ndarray일 경우에는 복사되지 않는다.

arrange
range 함수와 유사하지만 리스트가 아닌 ndarray를 반환한다,

ones (like)
주어진 dtype과 주어진 모양을 가지는 배열을 생성하고 내용을 모두 1로 초기화 ones like의 경우 주어진 배열의 동일한 모양과 dtype을 가지는 배열을 새로 생성하여 내용을 모두 1로 초기화한다.

zero (like)
ones (like)와 유사하지만 초기화를 0으로 한다.

1.2. 인덱스와 슬라이스

표면적으로는 파이썬의 기본 자료구조 중 하나인 리스트와 유사하게 동작한다.

arr = np.arange(10)
arr
arr[5]
arr[5:8]
arr[5:8] = 12
arr
 

추가적으로 리스트와의 차이점은 아래와 같다.

list1 = list(range(5))
list2 = list1[0:3]
list2[1] = 0
list2

arr1 = np.arange(5)
arr2 = arr[0:3]
arr2[1] = 0
arr2
 

2차원 배열에서 각 인덱스에 해당하는 요소는 스칼라값이 아니라 1차원 배열로 저장된다.

arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d[2]
arr2d[0][2]
arr2d[0,2]

arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d
arr3d[0]

 

또한 특정 인덱스 범위만 추출하려는 경우에는 콜론(":") 을 통해 배열의 일부를 추출할 수 있다.

arr2d
arr2d[:2,1:]
arr2d[:,:1]

 

만약 특정 조건에 해당하는 값만 추출하려는 경우라면, 인덱스 대신 조건을 작성해주면 된다.

names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data = np.arange(28).reshape(7,4)
data[names == 'Bob']
data[names == 'Bob',1]
data[data < 5] = 0
data
 

2. 데이터프레임 (Dataframe)

Pandas 라는 라이브러리에 존재하는 자료구조로 ndarray가 하나의 자료형만 가질 수 있는 반면 데이터 프레임은 열마다 다른 값을 가질 수 있고 행과 열에 대한 인덱스가 존재한다. 데이터프레임은 구체적으로 인덱스가 동일한 여러 개의 Series 객체를 가지고 았는 사전과도 같으며, 여기서 말한 Series 객체는 파이썬 기본 자료구조인 리스트와 유사하다.

import pandas as pd

 

생성하는 방법은 다음과 같다.

data = {'state' : ['Ohio',' Ohio','Ohio','Nevada','Nevada'],
                   'year' : [2000, 2001, 2002, 2001, 2002],
                   'pop' : [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = DataFrame(data)
DataFrame(data, columns = ['year','state','pop'])

 

2.2 인덱스와 슬라이스

인덱스 사용법은 리스트와 N차원 객체와 동일하게 콜론(":") 을 사용해서 데이터를 슬라이스할 수 있다.

obj = Series(range(3), index=['a','b','c'])
index = obj.index
index
index[1:]
index[1] = 'd'

 

데이터프레임의 경우에는 reindex() 메소드를 통해 인덱스를 재할당하는 것이 가능하다.

frame = DataFrame(np.arange(9).reshape((3, 3)), index=['a','c','d'], columns=['Ohio','Texas','California'])
print(frame)

states = ['Texas','Utah','California']
frame.reindex(columns=states)
print(frame)

 

마지막으로 정렬하는 방법은 sort_index() 메소드를 사용해서 정렬할 수 있으며, 옵션 값인 axis 를 통해 행 또는 열 기준으로 정렬할 수 있고 ascending 값이 True 면 오름차순, False 면 내림차순으로 정렬한다. ascending 의 기본 값은 True 이다.

frame = DataFrame(np.arange(8).reshape((2,4)), index=['three','one'], columns=['d','a','b','c'])

frame.sort_index()
frame.sort_index(axis=1) # 열 별로 정렬

frame.sort_index(axis=1, ascending=False) # 내림차순으로 정렬

 

2.3 컬럼 삭제

열을 삭제할 때는 drop() 메소드를 사용해서 삭제하고자 하는 열을 삭제할 수 있다.

data = DataFrame(np.arange(16).reshape((4,4)), index=['Ohio','Colorado','Utah','New York'], columns=['one','two','three','four'])
 
data.drop(['Colorado','Ohio'])
data.drop(['two','four'], axis=1)

 

2.4 컬럼에 함수 적용하기: map()

또 하나의 특징은 특정 컬럼에 동일한 함수를 적용하고 싶은 경우에는 map() 메소드를 사용해 동일한 함수를 한번에 적용할 수 있다.

frame = DataFrame(np.random.randn(4, 3), columns = list('bde'), index=['Utah','Ohio','Texas','Oregon'])
print(frame)

np.abs(frame)

f = lambda x : x.max() - x.min() #lambda : 한 줄짜리 함수
frame.apply(f)
frame.apply(f, axis=1)
 

2.5 기술통계 계산과 요약

데이터프레임 내 각 컬럼에 대해 값의 개수, 최소값, 최대값 등 기본적인 통계값(기술통계) 을 추출하고 싶은 경우에는 describe() 메소드를 사용하면 된다. 기본적으로 모든 변수에 대해 모든 기술 통계값을 계산해주며, 수치형 변수의 경우에는 최소값, 4분위수, 최대값을 출력해주며, 문자열의 경우에는 값의 개수만 출력해준다.

df = DataFrame([[1.4, np.nan], [7.1, -4.5], [np.nan, np.nan], [0.75,-1.3]], index=['a','b','c','d'], columns=['one','two'])
df

df.sum()
df.sum(axis=1)
df.mean(axis=1, skipna=False)    # nan 를 제거하지않고 하고 싶은 경우 skipna=false로 해주면된다.
df.cumsum()
df.describe()
728x90
반응형