내배캠_Data_3기/TIL

240827_데이터 전처리(Pandas)

케일라(Data_3기) 2024. 8. 27. 20:32

강의 : 데이터 전처리(Pandas)

강의 목표: Python의 Pandas 라이브러리를 활용해서 데이터를 전처리하는 과정을 학습해보자.

 

데이터 전처리

>데이터 전처리란?

내가 원하는 데이터를 보기 위해 하는 모든 활동 = 데이터 전처리

 

>데이터 전처리 왜함?

실제 데이터는 원하는 형태로 구축되어있지 않다.

그래서 데이터를 필요한 형태로 하나하나 가공해서 활용해야한다.

 

>데이터 전처리는 어떻게 함?

데이터 전처리는 꼭 방향성을 가지고 해야한다.

데이터를 통해 얻고자 하는지, 그 목적을 달성하기 위해 데이터 전처리가 필요하다.

 

 

Pandas

>Pandas 와 Excel

1. 자동화와 프로그래밍 기능

  • Pandas는 다양한 라이브러리를 사용하여 데이터를 불러오고, 변환하며, 분석할 수 있다. 이를 통해 반복적이고 복잡한 작업을 자동화할 수 있다.
  • 엑셀은 시각적 사용자 인터페이스를 통해 데이터를 다루는 스프레드시트 프로그램이다. 작업은 주로 수동으로 수행되며, 고급기능을 프로그래밍적으로 확장하기가 어렵다.

2. 대용량 데이터 처리

  • Pandas는 대용량 데이터를 처리하는 데 유용하다. 메모리 내에서 데이터를 처리하거나, 큰 데이터 세트를 조각으로 나누어 처리할 수 있는 기능을 제공한다.
  • 엑셀은 상대적으로 작은 크기의 데이터셋을 다루는데 적합하다. 매우 큰 데이터를 처리할 경우에는 처리 속도가 느려질 수 있고, 파일 크기 제한 등의 제약이 있을 수 있다.

3. 복잡한 데이터 처리 및 분석

  • Pandas는 데이터 분석 및 처리를 위한 다양한 도구와 라이브러리를 활용가능하며, 데이터를 다양한 방식으로 조작하고 분석할 수 있다. 이를 통해 복잡한 데이터 작업, 통계 분석, 머신러닝 모델 구축 등이 가능하다.
  • 엑셀은 기본적인 수식과 함수를 통해 데이터를 처리하고 시각화할 수 있지만, 복잡한 데이터 조작이나 분석에는 제약이 있을 수 있다.

4. 확장성과 유연성

  • Python은 다양한 데이터 포맷을 처리할 수 있는 라이브러리를 지원하며, 데이터베이스와 연동하여 작업할 수 있는 등 매우 유연하다.
  • 엑셀은 주로 특정 데이터 형식의 파일(.xlsx, .csv 등)을 다루는 데에 제한되어 있다.

5. 버전 관리 및 자동화

  • Python코드는 버전 관리 시스템(Git 등)을 사용하여 변경 내역을 관리하고, 코드 자체에 주석을 추가하거나 문서화할 수 있어 작업 히스토리를 추적하기 용이하다.
  • 엑셀은 사용자가 직접 수정하기 때문에 변경 사항을 추적하거나 문서화하기 어려울 수 있다.

 

>Pandas란?

Python에서 데이터를 조작하고 쉽게 분석할 수 있게 도와주는 라이브러리

Pandas를 활용하면

  • 대용량 데이터 처리가 가능 : Pandas는 데이터를 메모리에 로드하고, 다양한 연산을 빠른 처리가 가능하면 대용량 데이터를 처리하는데 최적화되어 있음
  • 데이터 조작 기능 : 데이터 정렬, 필터링, 집계, 결측값 처리 등 데이터를 쉽게 가공할 수 있음
  • 데이터 시각화 기능 제공 : Matplotlib, Seaborn, ..., etc
  • 데이터를 구조화하여 분석할 수 있음 : DataFrame이라는 자료형을 제공하여 데이터를 표 형태로 나타내어 분석이 가능함

 

>Pandas 구조

DataFrame = 표 형태

  • index : 각 아이템을 특정할 수 있는 고유의 값(엑셀에서는 좌측 열순서로 생각하면 됨)
  • columns : 하나의 속성을 가진 데이터 집합

Series = 하나의 속성을 가진 데이터 집합(= DataFrame 표에서 열 1줄이라고 생각하면 쉬움)

  • value + index

 

>Pandas 불러오기

import 명령어를 통해서 pandas 라이브러리를 불러오자

import pandas as pd

# 에러날 경우 !pip install pandas #실행

 

 

>인덱스(Index)

인덱스 : 데이터프레임(DataFrame) 또는 시리즈(Series)의 각 행 또는 각 요소에 대한 식별자이다.

  • DataFrame 자료구조에도 인덱스를 설정할 수 있음
  • 0부터 시작하는 숫자 뿐아니라 임의로 문자로 적용할 수 있음
  • 아예 처음부터 파일 불러올 때, 인덱스를 지정하는 것도 가능

인덱스의 특징

1. 고유성(Uniqueness) : 각 행은 유일한 인덱스 값을 가져야함. 중복된 인덱스 값을 가질 수 없음.

2. 불변성(Immutability) : 불변성을 가진다. 한 번 생성된 인덱스는 변경(수정)할 수 없다.

단, 새로운 값을 할당하여 기존 인덱스를 대체하는 것은 가능.

# Pandas에서 사용자가 직접 설정한 인덱스를 변경하는 예시

import pandas as pd

# 사용자가 직접 인덱스를 설정한 데이터프레임 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']}, index=['idx1', 'idx2', 'idx3'])

# 인덱스 변경 (대체)
df.index = ['new_idx1', 'new_idx2', 'new_idx3']

print(df)

 

3. 조작 및 탐색(Manipulation and Retrieval) : 인덱스를 사용하여 데이터프레임 또는 시리즈의 특정 행을 선택하거나 탐색할 수 있다.

4. 정렬(Sorting) : 인덱스를 기준으로 데이터 프레임 또는 시리즈의 행을 정렬할 수 있다.

 

인덱스 예시

1. 기본 인덱스 : Pandas는 기본적으로 0부터 시작하는 정수 인덱스를 제공한다.

이는 데이터 프레임을 생성할 때 자동으로 부여되는 인덱스이다.

import pandas as pd

# 기본 정수 인덱스를 가진 데이터프레임 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']})

 

2. 사용자 지정 인덱스 : 사용자가 직접 인덱스를 설정할 수도 있다.

# 사용자가 직접 인덱스를 설정한 데이터프레임 생성
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c']}, index=['idx1', 'idx2', 'idx3'])

 

3. 인덱스 활용하기 : 인덱스를 활용하여 데이터에 접근하거나 조작할 수 있다.

# 특정 인덱스의 행에 접근
row = df.loc['idx2']

# 인덱스를 기준으로 데이터프레임 정렬
sorted_df = df.sort_index()

 

 

인덱스 활용하기(set_index)

  • set_index() → 특정 칼럼에 들어있는 값을 인덱스로 활용하기
# df가 가지고 있는 특정 컬럼명을 기준으로 인덱스를 설정하기
data = df.set_index('컬럼명')
data.head()

# 불러올때 인덱스 지정하기
pd.read_csv('./data/file.csv' , index_col = '컬럼정보') 
pd.read_csv('./data/file.csv' , index_col = 0) # 0부터 시작

 

 

데이터프레임.index를 통해 인덱스를 확인할 수 있다.

#인덱스 확인하기
data.index

#리스트 형태를 활용해서 인덱스를 새로 입력할 수 있습니다.
data.index = ['1번' , '2번' , '3번']
data

 

reset_index() 를 활용해서 현재 인덱스를 0부터 시작하는 정수로 변경할 수 있다.

# reset_index() 의 기본 값은 drop = False 를 가지고 있습니다.
data.reset_index()

# 현재 인덱스를 컬럼으로 변경할 수 있습니다.

# reset_index(drop = True) 명령어를 활용하면,
# 현재 인덱스 값을 컬럼으로 변경하지 않고 인덱스를 초기화할 수 있습니다
data.reset_index(drop=True)

 

 

>컬럼(Column)

컬럼

  • 데이터프레일(DataFrame)의 열(또는 변수)을 나타낸다.
  • 데이터프레임은 행과 열로 구성되며, 각 열은 서로 다른 종류의 데이터를 담고 있다.
  • 데이터프레임의 세로 방향에 있는 데이터들을 컬럼이라고 부른다.

컬럼의 특징

1. 고유한 이름(라벨)을 가지고 있으며, 해당 컬럼의 데이터를 식별하는 데 사용

2. 특정한 종류의 데이터를 담고 있고 숫자, 문자열, 날짜 등 다양한 유형의 데이터를 포함할 수 있다.

3. 시리즈(Series) 객체로 구성되어 있으며, 시리즈는 동일한 데이터 유형을 가진 1차원 배열과 유사함

4. 데이터프레임의 일부로 간주되며, 해당 열의 데이터를 조작하고 접근할 수 있는 인터페이스를 제공한다.

 

컬럼 예시

import pandas as pd

# 데이터프레임 생성
data = {
    '이름': ['Alice', 'Bob', 'Charlie'],
    '나이': [25, 30, 35],
    '성별': ['여', '남', '남']
}

df = pd.DataFrame(data)

# 각 컬럼 출력
print(df['이름'])  # '이름' 컬럼 출력
print(df['나이'])  # '나이' 컬럼 출력
print(df['성별'])  # '성별' 컬럼 출력

 

컬럼명 변경하기

names = ['컬럼명1', '컬럼명2', ..., '컬럼명19']

pd.read_csv('./data/file.csv' , names = [’컬럼명1’, ‘컬럼명2’, … ,‘컬럼명 19’])

 

데이터프레임.column을 통해 컬럼을 확인할 수 있다.

#컬럼 확인하기
data.column

#리스트 형태를 활용해서 컬럼명을 새롭게 입력할 수 있습니다.
data.column = ['축구', '농구', '배구', '야구']
data

 

 

>데이터 저장하기

pd.to_csv('파일경로/파일명.확장자', index = False)

pd.to_excel('파일경로/파일명.확장자', index = False)

df = 데이터프레임 # 저장하고 싶은 데이터

df.to_csv('./newfile.csv', index = False)

 

 

데이터 확인

> .head() : 데이터를 N개 행까지 보여준다.

data.head() # head()은 기본 5개 행에 대한 데이터를 보여줌
data.head(3) # ()안에 숫자만큼 데이터를 보여줌

 

> .Info() : 데이터의 정보를 파악한다.(인덱스, 컬럼명, 컬럼의 데이터 개수, 데이터 타입)

data.info() 
# null 값을 확인할때도 활용

 

> .describe() : 데이터의 기초통계량을 확인한다.(개수, 평균, 표준편차, 사분위, 중앙값)

data.describe()
# 숫자값에 대해서만 기초통계량 확인이 가능합니다.

 

>데이터의 결측치(null)가 있을 때 : 결측치 제거하는 방법

# 결측치 확인 : isnull()
df.isnull().sum() # 이렇게하면 결측치가 몇개있는지도 알 수 있어요 !

# 결측치 제거 : dropna()
df.dropna()

 

>중복 데이터가  있을때 : 중복 데이터 제거하는 방법

# 중복 데이터 확인
df.duplicated(subset=['컬럼1', '컬럼2', '컬럼3'])

# 중복 데이터 제거
df.drop_duplicates(subset=['컬럼1', '컬럼2', '컬럼3'])

 

>데이터 이상치 처리하는 방법 

# IQR (Interquartile Range) 방법 찾아보기
# 참고 : https://www.scribbr.com/statistics/interquartile-range/

# IQR 계산
Q1 = df['컬럼1'].quantile(0.25)
Q3 = df['컬럼1'].quantile(0.75)
IQR = Q3 - Q1

# 이상치 기준 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 이상치 제거
df[(df['컬럼1'] >= lower_bound) & (df['컬럼1'] <= upper_bound)]

 

>데이터 타입을 알맞게 들어있는지 확인 ex)날짜, 숫자

# 데이터 타입 변경을 원한다면 ! 
df['column_name'].astype(int)
df['column_name'].astype(float)
df['column_name'].astype(str)
df['column_name'].astype(bool)
df['column_name'].astype('category')
df['column_name'].astype('datetime64[ns]')
df['column_name'].astype(complex)
df['column_name'].astype(object)

 

 

>astype를 사용한 데이터 타입 변경

astype()는 Pandas 데이터프레임의 열의 데이터 타입을 변경하는데 사용된다. 이를 사용하여 열의 데이터 타입을 원하는 형식으로 변환할 수 있다.

DataFrame['column_name'] = DataFrame['column_name'].astype(new_dtype)

 

  • DataFrame['column_name'] : 열을 선택하는 방식으로 열의 데이터 타입을 변경하고자 하는 열을 지정한다.
  • new_dtype : 변경하고자 하는 새로운 데이터 타입을 명시한다.(예 : 'int', 'float', 'str' 등)
import pandas as pd

# 예시 데이터프레임 생성
data = {'integer_column': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)

# 정수형 열을 부동소수점으로 변환
df['integer_column'] = df['integer_column'].astype(float)
print(df.dtypes)  # 데이터프레임의 열 타입 확인

 

 

데이터 선택

> .iloc[로우, 컬럼] : 인덱스 번호로 선택하기

행번우(로우)와 열번호(컬럼)를 통해 특정 행과 열 데이터를 선택할 수 있다.

import pandas as pd

# 샘플 데이터프레임 생성
data = {
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50],
    'C': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)

# iloc을 사용하여 특정 행과 열 선택
selected_data = df.iloc[1:4, 0:2]  # 인덱스 1부터 3까지의 행과 0부터 1까지의 열 선택
print(selected_data)

 

> .loc[로우, 컬럼] : 이름으로 선택하기

인덱스가 번호가 아니고 특정 문자일 경우

 

import pandas as pd

# 샘플 데이터프레임 생성
data = {
    'A': [1, 2, 3, 4, 5],
    'B': [10, 20, 30, 40, 50],
    'C': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])

# loc을 사용하여 특정 행과 열 선택
selected_data = df.loc['b':'d', 'A':'B']  # 레이블 'b'부터 'd'까지의 행과 'A'부터 'B'까지의 열 선택
print(selected_data)

 

>1개의 컬럼 전체를 선택할 경우

리스트 슬라이싱을 활용해서 선택해봅