오늘은 Jupyter Notebook에서 자주 사용하는 Magic Command와 Pandas를 활용해 데이터를 불러오고 구조를 파악하는 EDA(탐색적 데이터 분석) 기본기를 배웠다.
Ⅰ. Magic Command
Magic command는 Ipython kernel에서 제공하는 특별한 명령어로 %, %% 기호를 사용해 실행한다. 특징은 다음과 같다:
- 주피터 노트북에서만 사용할 수 있는 특별한 명령어
- 셀의 가장 위쪽에 작성해야 정상 작동
- 실행 시간, 디버깅, 메모리 측정 등 편리한 기능을 제공
- 한 줄 실행 또는 셀 전체 실행 모두 가능
CPU time / Wall time
매직 커맨드로 실행 시간을 재면 두 가지 시간이 함께 출력된다.
- CPU time → CPU가 실제로 코드를 계산하는 데 사용한 시간
- Wall clock time → 실제 실행 시간(입출력 포함)
매직 커맨드로 실행 시간 측정하기
- %time: 한 줄짜리 코드 실행 시간 측정
- %timeit: 한 줄짜리 코드를 여러 번 반복 실행한 평균 시간 출력 → 안정적인 평균값을 얻고 싶을 때 사용
- %%time: 셀 전체의 실행 시간 측정
- %%timeit: 셀 전체를 여러 번 반복 실행하여 평균 시간 측정
실습 예제)
%%time
sum = 0
for x in range(10000000):
sum = sum + x
print("1부터 1000만까지 합 :", sum)
이렇게 하면 루프 전체를 실행하는 데 걸리는 시간(wall time + cpu time)을 모두 확인할 수 있다.
Ⅱ. Python과 라이브러리
라이브러리 import
데이터 분석을 할 때는 여러 라이브러리를 함께 사용하게 된다. 여기서 라이브러리는 분석에서 자주 사용되는 함수들의 모음이라고 생각하면 된다. 라이브러리를 불러오는 방법은 다음과 같다.
import pandas as pd
import numpy as np
import time
from PIL import Image
- pandas: 테이블(DataFrame) 형태의 데이터를 다룰 때 필수
- numpy: 배열, 수학연산
- time: 시간 측정
- PIL: 이미지 처리
라이브러리를 불러오면, 내부의 다양한 기능과 함수를 사용할 수 있게 된다. import를 통해 라이브러리 전체를 가져올 수 있고, from 라이브러리 함수 import 함수 구문을 통해 라이브러리 내 함수 일부만 가져올 수 있다.
라이브러리의 지원 함수 살펴보기
예를 들어 PIL에서 이미지를 열어보는 함수:
Image.open('func.png')
라이브러리를 가져오면 이렇게 점(.) 연산자를 이용해 내부 함수를 사용할 수 있다. 또한 .라이브러리명 + tab 을 눌러 라이브러리에 내장된 함수를 볼 수 있는 방법도 있다고 한다.
Ⅲ. Pandas로 EDA
EDA의 시작은 데이터를 확인하고 이해하는 과정이다. 이상치, 결측치, ㅇㅇㅇ 이거 뭐 있었는데 아 하나 까먹었다. Pandas를 사용해 DataFrame을 만들고, CSV 파일을 불러오고, 데이터 구조·결측치·조건 조회·그루핑 등 다양한 기초 분석을 실습한 내용을 정리해 보았다.
1. DataFrame 만들기
DataFrame은 엑셀처럼 가로와 세로로 구성된 표 형태의 데이터 구조이다.
1) 리스트로 만들기
data1 = [['Choi',22],['Kim',48],['Joo',32]]
df4 = pd.DataFrame(data1, columns=['Name','Age'])
2) 딕셔너리로 만들기
data2 = {'Name':['Choi','Kim','Joo'],'Age':[22,48,32]}
df5 = pd.DataFrame(data2)
2. CSV 파일 불러오기
df3 = pd.read_csv("E-commerece sales data 2024.csv")
read_csv( )는 가장 많이 사용되는 데이터 로딩 함수이다. 파일만 준비되어 있다면 단 한 줄로 데이터를 불러올 수 있다.
3. 테이블 확인하기
데이터가 어떻게 생겼는지 먼저 보는 것이 EDA의 시작이다.
df3 # 전체 출력
df3.head() # 처음 5줄
df3.tail() # 마지막 5줄
.head( )나 .tail( )은 괄호 안에 숫자를 넣으면 원하는 개수의 행을 볼 수 있다.
4. 테이블 구조 파악하기
1) 행 개수 확인
len(df), len(df2), len(df3)
2) DataFrame 정보 확인
df3.shape # (행, 열)
df3.dtypes # 컬럼별 데이터 타입
df3.columns # 컬럼명 리스트
df3.values # 데이터를 배열로 보기
df3.info() # 구조 + 타입 + 결측치 한눈에 보기
3) 행·열 전환
df3.T
4) 기본 통계정보 확인
아래 함수를 사용하면 숫자 형태의 데이터를 가진 컬럼의 평균, 표준편차, 사분위수(Q1, Q2, Q3), 최솟값, 최댓값 등을 자동으로 확인할 수 있다.
df3.describe()
5. 결측치 확인하기
결측치(데이터가 비어 있는 값)를 확인하는 방법:
df3.isna().sum()
df3.isnull().sum() # 같은 기능
6. 특정 컬럼 선택하기
1) 1개 컬럼
df['Category'] # 가장 많이 사용
df.Category # 점(.) 방식
df.iloc[:,4] # 인덱스로 선택
2) 여러 컬럼
df[['Category','Selling Price']]
df.iloc[:,[4,7]]
※ 주의: [ ] 하나만 쓰면 Series 형태가 되어 오류가 발생할 수 있으므로 여러 컬럼 선택 시에는 반드시 [[ ]] 로 감싸야 한다.
7. 결측치 제거 & 채우기
1) 결측치 제거
df.dropna()
df.dropna(inplace=True)
df = df.dropna()
2) 결측치 채우기
df = df.fillna(0)
8. 조건에 맞는 데이터 가져오기 (where)
조건을 만족하지 않는 행은 NaN으로 반환된다.
df2.where(df2['Age'] > 50)
9. 조건 필터링 (SQL where과 유사)
SQL 구문
SELECT *
FROM df2
WHERE country='kr' AND age>=40
Python에서는 mask(이름 변경 가능)를 만든 뒤 적용한다.
mask = ((df2['Age']>50) & (df2['Gender']=='Male'))
df2[mask]
※ 조건 연산자
- and → &
- or → |
10. 그룹핑 & 정렬
SQL의 GROUP BY 와 동일한 기능을 한다.
1) gender 기준 customer ID count
df2.groupby('Gender')['Customer ID'].count()
2) gender + location 기준
df2.groupby(['Gender','Location'])['Customer ID'].count()
3) location별 age의 고유값 개수
df2.groupby('Location')['Age'].nunique()
4) 고유값 개수 내림차순 정렬
df2.groupby('Location')['Age'].nunique().sort_values(ascending=False)
마무리
데이터 정제하고 가공하는 작업 즉, 데이터를 정리하는 작업을 하고싶어 무작정 참여한 부트캠프였다. 처음 파이썬의 기본 문법을 배울 때는 튜터님 설명을 들으면 이해는 되지만 응용하기까지 조금 막막한 감정이 있었는데 오늘은 조금 익순한 sql과 비교하며 파이썬을 사용해 데이터를 정리하는 과정을 배우니 재미있었다. 기본 문법과 마찬가지로 아직 파이썬을 사용하는 것이 어색하지만 앞으로 내가 무엇을 배워가야 할지 감이 조금은 잡히는 듯해 그동안 불안했던 감정이 가라앉는 느낌이었다. 앞으로 배운 내용을 꾸준히 복습하며 파이썬에 익숙해져 봐야겠다.
'Data_10기' 카테고리의 다른 글
| 데이터 전처리 & 시각화 - 결측치, 이상치 (0) | 2025.11.18 |
|---|---|
| 데이터 전처리 & 시각화 - merge, concat, lamda / split / rrule (0) | 2025.11.17 |
| Python 데이터 분석 기초 실습 (0) | 2025.11.13 |
| Python 표준 라이브러리 (0) | 2025.11.12 |
| Python 추가 문법 활용하기 (0) | 2025.11.11 |