본문 바로가기
데이터 분석 관련

[패스트캠퍼스] 데이터분석 강의 학습일지 (4)

by 달빛 정원 2023. 5. 3.
반응형

데이터 분석 패키지인 numpy, pandas를 익히는 시간입니다. 드디어 기다려왔던 데이터 분석 파트가 나왔습니다. 벡터의 개념, 통계적 개념들이 기반되어야 합니다. (본 내용은 국비지원 "빅데이터 분석 첫걸음"강의를 듣고 배운 내용을 정리한 것입니다.)

2023.04.17 - [데이터 분석 관련] - [패스트캠퍼스] 데이터분석 강의 학습일지

2023.04.24 - [데이터 분석 관련] - [패스트캠퍼스] 데이터분석 강의 학습일지 (2)

2023.04.25 - [데이터 분석 관련] - [패스트캠퍼스] 데이터분석 강의 학습일지 (3)

데이터 분석 실습 예시

Data 분석 패키지 (Numpy, Pandas)

파이썬 자체의 기능을 보완적으로 해주는 패키지 입니다. 데이터 분석을 위한 add-on의 개념으로 생각하면 될 듯하네요. 여기서는 numpy, pandas를 다루게 됩니다. 

Numpy

데이터는 벡터로 표현되고 np는 벡터연산에 최적화 되어 있습니다. 그래서 numpy를 보면 array(배열)이라는 명령어가 많이 등장합니다. 파이썬 리스트를 numpy array로 변환할 수도 있습니다.

# 파이썬 list를 numpy array로 변환
arr = np.array(data) # numpy array는 파이썬 리스트를 np.array로 변환하는 방식이 많이 쓰임.
arr

숫자를 자동으로 생성해서 array를 만들수도 있고, reshape 함수를 활용해 행렬로 변환할 수 있습니다.

# reshape을 이용하여 3x3행렬을 만드는 방법
np.arange(1,10).reshape(3,3)

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

Broadcast and Universal Function

서로다른 크기의 array를 연산할 때 자동으로 연산을 전파해주는 기능입니다. 행렬 곱 연산에 유리합니다.

universal function은 broadcast 기능을 확장해서 array의 모든 원소에 동일한 함수를 반복문으로 적용한 것과 같은 효과를 내는 기능입니다.

f = lambda x : 1/x

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

for i in range(arr1.shape[0]):
  arr1[i] = f(arr1[i])
print(arr1)

arr2 =  np.array([1.,2.,3.])
print(1/arr2) # universal function

[1.         0.5        0.33333333]
[1.         0.5        0.33333333]

Indexing

numpy도 마찬가지로 indexing이 가능합니다. arr1[0]은 첫번째 원소, arr1[-1]은 마지막 원소, arr1[:3]은 앞에서 원소 3개를 slicing한 값입니다.

다만 행과 열로 이루어져 있기 때문에 arr2[1][2]를 입력하면 2행 3열의 원소가 출력됩니다. 그리고 만약 2번째 행 모두를 출력하려면 arr2[1,:]과 같이 쓰면 됩니다.

Numpy Methods

numpy에서는 수학 함수들이 많습니다. 특히 random sampling이 가능합니다.

# 표준정규분포에서 random sampling을 한 원소를 가지는 5x3 행렬을 생성
mat1 = np.random.randn(5, 3)
mat1

array([[-0.67166743, -0.57938561, -0.14031174],
       [ 1.90931098, -0.5646686 ,  1.10359815],
       [ 0.7682551 ,  0.2769269 , -2.20505012],
       [-1.13001518, -0.87072728, -0.20004108],
       [-1.75346033,  0.28554012,  0.81748679]])

이외 수학함수들을 보면 다음과 같습니다.

  • 절대값: np.abs(mat1)
  • 제곱: np.square(mat1)
  • 제곱근: np.sqrt(mat1)
  • norm: np.linalg.norm(vec) # vec = np.array([1,2,3])
  • eigenvalue: np.linalg.eig(mat1)
  • 랜덤행렬: mat2 = np.random.rand(3,2)
  • 행렬 내 연산: np.sum(mat2), np.sum(mat2, axis=1), np.sum(mat2, axis=0)
  • 표준편차: np.std(mat2), np.std(mat2, axis=1), np.std(mat2, axis=0)
  • 최대값, 최소값: np.min()....np.max()
  • 정렬(오름차순): np.sort(mat2), 내림차순:np.sort(mat2, axis=0)[::-1]

Pandas

판다스는 넘파이와 같이 데이터 분석에서 활용도가 높은 오픈소스입니다. 정형데이터를 효율적으로 표현할 수 있는 DataFrame(df)형태로 모든데이터를 표현합니다. 즉 표 형태로 데이터를 정리합니다. 여기도 indexing, filtering, reshaping, concatenation, reading, writing등이 가능합니다. 또한 다양한 정형데이터를 통합 관리 가능합니다. json, html, csv, slsx, hdf5, sql 등 다양한 데이터를 통일해서 표현, 계산할 수 있습니다. 또한 여러 dataframe을 합치는 것도 가능합니다. 다양한 기능들이 있으니 익숙해지도록 노력해야겠습니다.

google colab에서는 마운트를 이용하여 외부 데이터를 불러오는 것도 가능합니다. 본 사례에서는 타이타닉 데이터를 가져와서 기본적인 분석을 수행하였습니다.

titanic = pd.read_csv("/0000/titanic/train.csv")
titanic.info()
titanic.describe()

titanic["Pclass"].value_counts()
titanic[titanic.Age.isnull()] # mask 통해서 null값에 해당하는 애들 뽑아낼 수 있음.
titanic.loc[0:100, "PassengerId":"Age"]
titanic.iloc[100:200, :3]
titanic[titanic.Age > 30]["Fare"] #이것보다는 loc를 활용하는게 더 좋음.
titanic.loc[titanic.Age > 30,"Fare"].mean()

위와 같이  null값을 찾아내서 정리할 수도 있습니다. 또한 피봇테이블을 활용하여 보고싶은 정보들을 정리하는 것도 가능합니다. 앞으로 대용량 데이터도 다루게 될 텐데 필수적으로 익혀야 하는 기능이라고 생각합니다.

# 성별을 기준으로 생존률 파악 --> Mean vs Sum
pd.pivot_table(data=titanic, index = ["Sex"], values = ["Survived"], aggfunc=["sum","mean","count"])

# 사회 계급을 기준으로 생존률 파악
pd.pivot_table(data=titanic, index=["Pclass", "Sex"], values=["Survived"], aggfunc=["mean", "count"])

 

반응형

댓글