[1주차] 데이터 전처리 기본기

2024. 1. 2. 17:37Portfolio/BDA 7기

Contents 접기

데이터 분석에 필요한 기초문법

pandas 라이브러리에서 제공하는 기초 문법들은 여러가지가 있지만,

그 중 데이터 전처리에 필요한 기초 문법들 중 필수적인 문법 몇 가지만 알아보자

 

먼저 pandas 라이브러리를 임포트하고,

예제 파일 학생들의 반 별(nclass) 과목별 점수가 나와있는 exam.csv 파일을 불러온다.

import pandas as pd
df = pd.read_csv('exam.csv')

 

 

1. query()

 

query() 함수는 행 데이터를 추출할 때 사용한다.

예를 들어, 데이터프레임(df) 데이터를 추출할 때 학생(id), 반(nclass)와 같은 연속적인 범주형 데이터를 추출할 수 있다.

 

query() 괄호 안에 다양한 조건들을 넣어 원하는 조건의 데이터를 추출할 수 있다.

# Case 1: 3반 학생들 데이터 추출
df.query('nclass == 3')

# Case 2: 영어 점수가 80점 초과인 학생들의 데이터 추출
df.query('english > 80')

# Case 3: 영어 점수 95점 초과이면서 수학 점수 50점 이상인 학생들의 데이터 추출 
df.query('english > 95 and math > 50') # 논리 연산자 (and, or) 조건 가능

 

 

열을 추출하는 법 [],  [[]]

 

열 데이터를 추출하고 싶을 때는 대괄호[]를 사용하여 추출할 수 있다.

# id, math, english 데이터만 추출
df[['id', 'math', 'english']]

id, math, english 데이터

 

 

변수(column)를 제거하고 싶은 경우에는 .drop() 함수를 사용하여 제거한다.

여기서 컬럼을 삭제해도 반영되지 않고 원본데이터는 그대로 남아 있다.

# 수학 column만 제거
df.drop(columns='math')

 

 

원본 데이터에서도 변경하고 싶다면?

'inplace=True' 파라미터를 통해 변경할 수 있다.

이 파라미터를 사용하면 원본 데이터프레임이 직접적으로 변경되며, 새로운 데이터프레임을 반환하지 않는다.

df.drop(columns='math', inplace=True)

 

예를 들어, 위의 코드에서는 'math'열을 삭제하는데, 만약 'inplace=True'가 없다면

새로운 데이터프레임이 반환되어 다른 변수에 할당해야 하는 번거로움이 생긴다.

 

 

 

파이썬 메서드체이닝으로 문법이 이어짐
# Case 1: Series 형태
df.query('nlcass==4 & math > 30')['math']

# Case 2: 데이터프레임
df.query('nclass==4 & math > 30)[['id','nclass', 'math']]

# Case 3: Case 2를 반대로 진행
df[['id', 'nclass', 'math']].query('nclass==4 & math > 30')
# Case 1
12 46
13 48
14 75
15 58
Name: math, dtype: int64

Case 2, Case 3 출력 결과

 

 

시리즈(Series) vs 데이터프레임(DataFrame)

시리즈와 데이터프레임은 데이터를 다룰 때 항상 등장하는 자료구조이다.

출처: Kaggle에서 파이썬으로 데이터분석 시작하기

 

시리즈는 1차원 데이터 배열 형태이며, 데이터프레임의 각 열 또는 행을 나타내는데 사용된다.

각 요소는 인덱스를 가지며, 데이터 타입은 동일해야 한다.

데이터 프레임은 2차원 테이블 형태로, 행과 열로 이루어진 데이터를 다룬다.

 

따라서, 데이터프레임은 여러 개의 시리즈로 구성되어 있다는 것~

 

 

 

정렬

 

데이터프레임에서는 .sort()함수를 통해 내림차순, 오름차순 정렬이 가능하다.

# Case 1: math 점수 기준 오름차순 정렬
df.sort_values('math')

# Case 2: math 점수 기준 내림차순 정렬
df.sort_values('math', ascending=False)

 

오름차순, 내림차순 기준이 한 개인 경우만 있는 것은 아니다.

# Case 1: math 점수 30점 초과인 데이터 내림차순 정렬
df.sort_values('math', ascending=False)[['math','id']].query('math>30')

Case 1

 

# Case 2: 두 개 이상의 조건 차순 정렬
df.sort_values[['math', 'nclass']]

조건 한 개 더 추가하면 2차원의 개념이라 꼭 리스트로 넣어야 하고

math가 가장 먼저 앞에 있어서 메인정렬,  nclass 서브 정렬이 된다.

 

즉, math 정렬 이후 동점자 처리할 때 nclass 정렬을 고려하는 것!

 

이때, 다음 코드와 같이 math 점수 오름차순이 디폴트인데, nclass는 내림차순으로 정렬하는 것도 가능하다.

df.sort_values(['math', 'nclass'], ascending=[True, False])

math 점수 동점자 내림차순 정렬

 

 

파생변수(Derived variable)

파생변수는 기존의 내부 데이터를 가지고 새로운 변수를 만드는 것을 말한다.

pandas에서 column을 가지고 바로 작업할 수 있고, 다양한 함수를 적용하여 만들 수 있다.

 

파생변수를 만드는 이유는 다음과 같다.

1. 특정 정보 추출 및 가공: ex) 날짜 데이터에서 연도만 추출, 텍스트 데이터에서 특정 패턴
2. 범주형 변수를 수치형으로 변환
3. 새로운 도메인 지식의 반영: ex) 매출액 = 판매량 * 가격
4. 데이터 탐색 및 시각화를 위한 특징 생성 ex) 시간 데이터 기반 주간, 월간, 연간 패턴 변수 생성
5. 모델 성능 향상   

 

그렇다면 다양한 방법으로 파생변수를 만들어보자

 

파생변수 생성
# Case 1 : column을 직접 이용해서 생성
df['3_mean'] = (df['math'] + df['english'] + df['science']) / 3 # 과목의 평균 파생변수 생성

# Case 2 : .assign() 함수와 lambda 이용
df.assign(mean_s = lambda x : (x['math'] + x['english'] + x['science']) / 3)

# Case 3 : 추가로 파생변수 생성
df.assign(mean_t = (df['math'] + df['english'] + df['science']) / 3, inplace = True, no = 1).head(5)

Case 1, 3
Case 2

 

numpy 라이브러리를 이용하여 파생변수를 만들 수 있다.

# 평균 기준으로 평균이상, 이하 파생변수 생성
df.assign(test = np.where(df['3_mean'] > 67.3, '평균이상', '평균이하'))

평균을 기준으로 파생변수 test 생성

 

np.where 함수는 조건이 참인 경우 '평균이상'으로 설정, 그렇지 않은 경우 '평균이하'로 설정한다.

 

 

groupby

 

'groupby'는 데이터프레임을 특정 기준에 따라 그룹으로 묶는 데 사용된다.

이를 통해 각 그룹에 대해 통계치를 집계, 변환, 필터링 등의 작업을 수행할 수 있다.

df.group(기준).agg(변수, 요약통계치)

 

# nclass 별 과목 점수 평균
df.groupby('nclass').agg(ncl_math = ('math', 'mean'),
			ncl_eng = ('english', 'mean'),
                        ncl_sci = ('science', 'mean'))

nclass 별 과목 점수 평균

 

 


오늘 배운 문법 이외에도 데이터 전처리에 필요한 문법은 너무너무너무 많다

갈 길이 멀다 ,,