Skip to content

판다스 기초


학습 목표

  1. Pandas 라이브러리를 import하고 CSV 파일을 로드할 수 있다
  2. 인코딩(CP949, UTF-8, EUC-KR) 문제를 해결할 수 있다
  3. info, describe, shape로 데이터를 요약할 수 있다
  4. head, tail, sample로 데이터를 미리보기할 수 있다
  5. 수치형 데이터와 오브젝트 타입 데이터의 차이를 이해한다

전체 구조


1. Pandas 라이브러리 불러오기

Pandas는 Python에서 데이터 분석의 핵심 라이브러리다. as pd로 별칭(alias)을 지정하여 간결하게 사용한다.

python
import pandas as pd

# Pandas 버전 확인
print(pd.__version__)

2. CSV 파일 로드하기

기본 로드

python
# CSV 파일 로드
df = pd.read_csv("data/전국_평균_분양가격.csv")

인코딩 문제 해결

한글이 포함된 CSV 파일을 로드할 때 UnicodeDecodeError가 발생할 수 있다. Pandas의 read_csv는 기본적으로 UTF-8 인코딩을 사용하기 때문이다.

python
# CP949 인코딩으로 로드
df_last = pd.read_csv("data/주택도시보증공사_전국_평균_분양가격.csv",
                       encoding="cp949")

# EUC-KR로도 가능 (단, 일부 한글 미지원)
df_last = pd.read_csv("data/주택도시보증공사_전국_평균_분양가격.csv",
                       encoding="euc-kr")

CP949 vs EUC-KR: EUC-KR은 2,350자만 표현할 수 있어 "설", "믜" 같은 글자가 깨진다. CP949는 11,172자를 모두 표현할 수 있으므로, 한글 CSV 파일에는 CP949를 사용하는 것이 안전하다.

구분자(Separator) 지정

CSV가 쉼표가 아닌 다른 문자로 구분되어 있을 수 있다.

python
# 파이프(|)로 구분된 파일
df = pd.read_csv("data/상가업소정보.csv", sep="|")

# 탭으로 구분된 파일
df = pd.read_csv("data/file.tsv", sep="\t")

3. 데이터 크기 확인 - shape

shape는 항상 (행, 열) 순서로 반환한다.

python
# 데이터 크기 확인
print(df_last.shape)
# 출력: (4335, 5)  → 4335행, 5열

4. 데이터 미리보기 - head, tail, sample

python
# 위에서 5개 (기본값)
df_last.head()

# 위에서 10개
df_last.head(10)

# 아래에서 5개 (기본값)
df_last.tail()

# 랜덤 샘플 3개
df_last.sample(3)

5. 전체 정보 요약 - info

info()는 데이터의 전체적인 구조를 한눈에 보여준다.

python
df_last.info()

출력 예시:

RangeIndex: 4335 entries, 0 to 4334
Data columns (total 5 columns):
 #   Column   Non-Null Count  Dtype
---  ------   --------------  -----
 0   지역명     4335 non-null   object
 1   규모구분    4335 non-null   object
 2   연도      4335 non-null   int64
 3   월       4335 non-null   int64
 4   분양가격    4058 non-null   object

info에서 확인할 수 있는 정보

  • Non-Null Count가 다른 컬럼: 결측치(NaN)가 있다는 의미
  • object 타입: 문자열 데이터 (수치 연산 불가)
  • int64/float64 타입: 숫자 데이터 (연산 가능)

6. 기술 통계 요약 - describe

수치형 데이터 요약

python
df_last["분양가격"].describe()
count    4058.000000   ← 결측치 제외한 데이터 수
mean     3089.844998   ← 평균값
std      1266.195187   ← 표준편차
min       428.000000   ← 최소값
25%      2221.000000   ← 1사분위수 (25% 위치)
50%      2874.000000   ← 중앙값 (median)
75%      3561.000000   ← 3사분위수 (75% 위치)
max     12728.000000   ← 최대값

오브젝트 타입 데이터 요약

python
df_last["분양가격(제곱미터)"].describe()
count     4335        ← 전체 데이터 수
unique    1753        ← 고유값 개수
top       2221        ← 가장 빈번한 값
freq        17        ← 최빈값의 등장 횟수

평균값 vs 중앙값: 중앙값(50%)이 2,874인데 평균값이 3,089로 더 높다. 이는 최대값(12,728)처럼 극단적으로 큰 값이 평균을 끌어올리기 때문이다. 이런 경우 중앙값이 데이터의 대표값으로 더 적합하다.


7. 컬럼 접근과 인덱싱

python
# 단일 컬럼 (Series 반환)
df_last["지역명"]

# 여러 컬럼 (DataFrame 반환) - 리스트로 감싸야 한다
df_last[["지역명", "분양가격"]]

# 컬럼 목록 확인
df_last.columns

# 컬럼 목록을 리스트로
df_last.columns.tolist()

8. 행 접근 - loc과 iloc

python
# loc: 인덱스 라벨 기반
df.loc[0]                       # 0번 인덱스의 모든 컬럼
df.loc[0, "상호명"]              # 0번 인덱스의 상호명 컬럼
df.loc[[0, 1, 2], ["상호명", "도로명주소"]]  # 여러 행, 여러 열

# iloc: 정수 위치 기반 (슬라이싱)
df.iloc[:5]                     # 위에서 5개 행 (head와 동일)
df.iloc[:5, :5]                 # 위에서 5행, 왼쪽 5열
df.iloc[-5:]                    # 아래에서 5개 행 (tail과 동일)
df.iloc[-5:, -5:]               # 아래 5행, 오른쪽 5열

9. 표시 옵션 설정

데이터가 많아 중간이 ...으로 표시될 때 옵션을 변경할 수 있다.

python
# 모든 컬럼 표시
pd.options.display.max_columns = 100

# 모든 행 표시
pd.options.display.max_rows = 100

핵심 정리

  • pd.read_csv로 CSV 파일을 로드하며, 한글 파일은 encoding="cp949"를 지정한다
  • shape는 (행, 열) 순서로 데이터 크기를 반환한다
  • **info()**로 결측치, 데이터 타입, 메모리 사용량을 한눈에 파악한다
  • **describe()**는 수치형이면 통계값, 오브젝트형이면 빈도 정보를 보여준다
  • head/tail/sample로 데이터를 빠르게 미리본다
  • loc은 라벨 기반, iloc은 정수 위치 기반 인덱싱이다