[EDA] 탐색적 데이터 분석 with Python (1)

2024. 9. 25. 18:11·AI
728x90

데이터를 다루는 데에 있어서 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로 두면 원본 데이터프레임에 바로 반영이 된다.

 

 

 

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'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
'AI' 카테고리의 다른 글
  • [LLM] OpenAI API (2) - Playground를 사용해 보자
  • [LLM] OpenAI API (1) - API key 발급하기
  • [LLM] 트랜스포머 구조 파헤치기 (1) - 텍스트를 임베딩 (Embedding)으로 변환하기
  • [EDA] 탐색적 데이터 분석 with Python (2)
100두산
100두산
출발하게 만드는 힘이 동기라면, 계속 나아가게 만드는 힘은 습관이다.
  • 100두산
    정상에서 보자 ✈️
    100두산
  • 전체
    오늘
    어제
    • 분류 전체보기 (126)
      • Life (6)
        • living (1)
      • Research (6)
      • AI (20)
      • Dev (45)
        • iOS (28)
        • Web (4)
        • flutter (9)
        • etc (4)
      • PS (Problem Solving) (23)
      • Computer Science and Engine.. (21)
        • Data Structures and Algorit.. (13)
        • OOP (Object Oriented Progra.. (8)
      • etc (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ios
    알고리즘
    TIP
    xcode
    파이썬
    D3
    swift
    티스토리챌린지
    백준
    c++
    SKTelecom
    오블완
    Challenger
    BOJ
    AI
    PS
    Python
    SKT
    자료구조
    백트래킹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
100두산
[EDA] 탐색적 데이터 분석 with Python (1)
상단으로

티스토리툴바