강의 : 데이터 전처리(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개의 컬럼 전체를 선택할 경우
리스트 슬라이싱을 활용해서 선택해봅
'내배캠_Data_3기 > TIL' 카테고리의 다른 글
2024년 10월 8일 데이터 리터러시 (1) | 2024.10.08 |
---|---|
240828_데이터 전처리_인덱스(Index) (1) | 2024.08.28 |
240826_데이터 분석가란? (1) | 2024.08.27 |
240812_머신러닝 기초 1. 머신러닝의 기초 (0) | 2024.08.12 |
240809_통계학 기초 5주차 상관관계 (0) | 2024.08.09 |