데이터를 다루는 데에 있어서 Exploratory Data Analysis(EDA)는 매우 중요한 자료 분석 방법론이다. 이를 통해 데이터를 살펴보며 여러 중요 지표를 찾을 수 있을 뿐만 아니라 시각화, 나아가 인공지능 학습에 있어서 쓸만한 데이터인지를 판단할 수 있는 과정으로서의 역할도 한다. 빅데이터 분석이나 인공지능 학습의 라이브러리가 대부분 파이썬을 기반으로 하고 있기 때문에 파이썬 기반의 EDA 관련 라이브러리와 문법을 정리해보려 한다.
Pandas: Dataframe을 다루는 라이브러리이다. 테이블 위주로 데이터를 보거나 처리할 수 있게 도와준다.
Numpy: 수치 데이터를 다룰 때 매우 유용한 라이브러리이다. 통계 계산이 빠르고 효율적이다.
Matplotlib & Seaborn: 데이터를 시각화하는데 가장 많이 사용되는 라이브러리이다. 차이는 Seaborn으로 시각화하는 게 더 예쁘고 다양하다는 점이다.
Series
import pandas as pd
sr = pd.Series([1,2,4,5,6], index= ['A', 'B', 'C', 'D', 'E'], name= 'point')
print(sr.name, sr.shape, sr.values)
# output:
# point (5,) [1 2 4 5 6]
pandas 라이브러리를 통해 Series를 생성해 보았다. Series는 1차원 배열 형태의 데이터 구조이다. 1차원 배열이지만 각각의 데이터에 인덱스를 붙일 수 있다는 점이 다르다. 해당 코드는 Series를 생성하고, 이름과 인덱스를 초기화해 주었다. Series에는 .name으로 이름을, .shape로 배열의 크기를, .values로 값을 출력해 볼 수 있다.
Dataframe
info = {
'Name': ['a', 'b', 'c', 'd'],
'Weight': [1,2,3,4],
'Option' : [True, True, False, False],
'Rate': [1, 2,3, 4]
}
df = pd.DataFrame(info)
print(df.shape)
print(df)
# output:
# (4, 4)
# Name Weight Option Rate
# 0 a 1 True 1
# 1 b 2 True 2
# 2 c 3 False 3
# 3 d 4 False 4
이어서 Dataframe이다. Dataframe은 2차원 테이블 형태의 데이터 구조로, 행과 열을 가지고 있으며, 각 열은 Series처럼 다룰 수 있다. 해당 코드에서 info라는 딕셔너리의 key 는 파라미터가 되고 value는 데이터가 된다.
Read
df = pd.read_csv("/content/sample_data/california_housing_test.csv")
df.head()
Google의 Colab을 이용하면 sample directory에 몇개의 csv 샘플 데이터가 있다. 그중 캘리포니아 집 값 데이터를 가져와 보았다. head()는 해당 데이터의 상위 5개 행을 반환하여 데이터를 미리 보기 할 수 있는 메서드이다.
df.describe().T
.describe() 메서드는 수치형 데이터에 대해 통계적인 정보를 제공한다. 데이터의 개수, 평균, 표준편차 등을 미리 확인해 볼 수 있다. .T 메서드는 해당 데이터프레임의 행과 열을 뒤집는 전치(transpose) 메서드이다. 이를 통해 데이터를 더 직관적으로 확인할 수 있다.
df.isna().sum()
.isna()는 데이터의 결측치를 확인하는 메서드이다. .sum()은 이들의 합산을 의미하며, 이를 통해 데이터의 어느 부분에 얼마만큼의 결측치가 있는지 쉽게 파악할 수 있다.
df.columns
# output:
# Index(['longitude', 'latitude', 'housing_median_age', 'total_rooms',
# 'total_bedrooms', 'population', 'households', 'median_income',
# 'median_house_value'],
# dtype='object')
데이터의 파라미터들을 확인할 수 있다.
df['households'].to_numpy()
# output:
# array([606., 277., 495., ..., 220., 14., 260.])
데이터 중 households에 해당하는 열을 가져와 Numpy 배열 형식으로 반환한다.
df.loc[(df.latitude > 40), ['latitude', 'housing_median_age']]
.loc 메서드를 통해 필터링이 가능하다. 해당 코드에서는 latitude가 40 이상인 데이터프레임에서, 'latitude'와 'housing_media_age' 열만 가져와 표시하였다.
df.iloc[0:4, [0, 1]]
iloc은 index를 기반으로 필터링하는 방법이다. 해당 코드에서는 0부터 3까지의 행, 그리고 첫 두열을 반환한다.
Update
df.columns = [col.lower().replace(' ', '_') for col in df.columns]
df.columns
# output:
# Index(['longitude', 'latitude', 'housing_median_age', 'total_rooms',
# 'total_bedrooms', 'population', 'households', 'median_income',
# 'median_house_value'],
# dtype='object')
파라미터를 다 소문자로 바꾸고, 만약 문자 중에 공백이 존재하면 "_"로 모두 대체하는 메서드. 그러나 이미 데이터의 파라미터 이름들이 해당 형식으로 구성되어 있으므로, 변화는 없다.
df.latitude = df['latitude'].fillna('population')
예제 데이터는 결측치가 존재하지 않아서 위 코드가 의미가 없지만, 만약 결측치가 존재한다면 해당하는 부분을 같은 행에 있는 다른 데이터로 채워주는 메서드이다. 해당 코드는 latitude가 결측치일 때, 해당 열에 위치한 population 데이터로 그 값을 채우겠다는 의미이다.
Create
df_num = df.select_dtypes(include= ['number'])
df_num['population_twice'] = df['population'] * 2
df_num.loc[:, ['population', 'population_twice']]
이번엔 새로운 열을 추가해 보자. 먼저 .select_dtypes는 데이터의 타입을 고르는 녀석이다. 이걸 통해 수치형 데이터만을 반환하였다. 이어서 'population_twice'라는 행을 만들 건데, 이는 'population' 열의 데이터를 2배로 하는 녀석이며, 해당 코드를 통해 새로운 열이 생성되었다. 앞서 설명한 .loc 메서드를 통해 해당 값만을 반환해 보았다.
Delete
df_num.drop('population_twice', axis=1, inplace= True)
df_num.head()
이제 .drop 메서드를 통해 방금 만들었던 'population_twice'열을 다시 지워보자. axis=1는 열을 지우겠다는 의미이고, inplace를 True로 두면 원본 데이터프레임에 바로 반영이 된다.
'AI' 카테고리의 다른 글
[LLM] OpenAI API (3) - 파이썬 코드로 호출해 보기 (2) | 2024.11.02 |
---|---|
[LLM] OpenAI API (2) - Playground를 사용해 보자 (1) | 2024.11.01 |
[LLM] OpenAI API (1) - API key 발급하기 (0) | 2024.10.30 |
[LLM] 트랜스포머 구조 파헤치기 (1) - 텍스트를 임베딩 (Embedding)으로 변환하기 (3) | 2024.10.24 |
[EDA] 탐색적 데이터 분석 with Python (2) (3) | 2024.09.28 |