AI 데이터는 처음부터 깨끗한 배열이 아니다

NumPy Array로도 행과 열을 다룰 수 있는데, 왜 Pandas라는 새로운 라이브러리를 또 배워야 할까요?
지난 NumPy 시리즈에서는 AI가 데이터를 어떻게 숫자의 배열로 바라보는지 살펴보았습니다.
우리는 다음과 같은 내용을 배웠습니다.
Array
Shape
dtype
Indexing
Slicing
Vectorization
Broadcasting
Vector
Matrix
그리고 마지막에는 이미지까지 NumPy Array로 표현했습니다.
이쯤 되면 자연스럽게 이런 생각이 들 수 있습니다.
"NumPy로 데이터도 저장하고 계산할 수 있는데 Pandas는 왜 필요한 거지?"
좋은 질문입니다.
실제로 NumPy만으로도 많은 데이터를 처리할 수 있습니다.
하지만 우리가 현실에서 만나게 되는 데이터는 이미지처럼 모든 값이 같은 의미를 가진 숫자 배열만 있는 것이 아닙니다.
예를 들어 다음과 같은 데이터가 있다고 해보겠습니다.
| student_id | age | study_hours | attendance_rate | course | city | passed |
| 1001 | 39 | 15.8 | 94.6 | Python | Daegu | 1 |
| 1002 | 25 | 12.8 | 85.5 | AI | Daejeon | 1 |
| 1003 | 37 | 9.0 | 100.0 | AI | Incheon | 1 |
| 1004 | 21 | 19.2 | 77.1 | Python | Daejeon | 1 |
| 1005 | 31 | 13.6 | 88.0 | Python | Busan | 1 |
숫자도 있고, 문자열도 있고, 각 열마다 의미도 다릅니다.
이런 표 형태의 현실 데이터를 다루기 시작하면 NumPy와는 조금 다른 도구가 필요해집니다.
그 도구가 바로 Pandas입니다.
이번 Pandas 시리즈에서 사용할 데이터
이번 Pandas 시리즈부터 데이터 시각화 단계까지 하나의 공통 데이터셋을 계속 사용할 예정입니다.
파일 이름은 다음과 같습니다.
ai_learning_dataset.csv
총 9개의 컬럼을 가진 AI 학습자 데이터입니다.
student_id
age
study_hours
attendance_rate
assignment_score
previous_score
course
city
passed
이번 글에서는 파일을 직접 불러오지는 않습니다.
Pandas가 왜 필요한지를 이해하기 위해 데이터 일부만 사용하겠습니다.
다음 글부터 실제 CSV 파일을 불러와 하나씩 분석해볼 예정입니다.
NumPy로도 표를 만들 수 있지 않을까?
먼저 NumPy로 간단한 학생 데이터를 만들어보겠습니다.
import numpy as np
students = np.array([
[1001, 39, 15.8, 94.6],
[1002, 25, 12.8, 85.5],
[1003, 37, 9.0, 100.0]
])
print(students)
실행 결과
[[1001. 39. 15.8 94.6]
[1002. 25. 12.8 85.5]
[1003. 37. 9. 100. ]]
Shape도 확인할 수 있습니다.
print(students.shape)
실행 결과
(3, 4)
3개의 행과 4개의 열이 있습니다.
NumPy에서 배운 내용을 이용하면 원하는 값도 선택할 수 있습니다.
print(students[1, 2])
실행 결과
12.8
코드는 정상적으로 동작합니다.
그런데 문제가 하나 있습니다.
12.8은 무엇을 의미할까?
다시 코드를 보겠습니다.
students[1, 2]
결과는
12.8
입니다.
그런데 코드만 보고 이 값이 무엇인지 바로 알 수 있을까요?
학생 ID인가?
나이인가?
학습 시간인가?
출석률인가?
우리가 배열 구조를 기억하고 있다면 알 수 있습니다.
0번째 열 → student_id
1번째 열 → age
2번째 열 → study_hours
3번째 열 → attendance_rate
그러므로
students[1, 2]
는 두 번째 학생의 study_hours입니다.
하지만 열이 4개가 아니라 40개라면 어떨까요?
매번
0번은 무엇이고
1번은 무엇이고
2번은 무엇이고...
를 기억해야 할까요?
현실의 데이터 분석에서는 이런 방식이 매우 불편합니다.
데이터에는 숫자뿐 아니라 의미가 있다
NumPy Array는 숫자를 빠르게 계산하는 데 매우 뛰어납니다.
하지만 실제 데이터 분석에서는 숫자 자체뿐 아니라 그 숫자가 무엇을 의미하는지도 중요합니다.
예를 들어 다음 값만 있다고 해보겠습니다.
94.6
그 자체로는 의미를 알기 어렵습니다.
하지만
attendance_rate = 94.6
이라고 이름을 붙이면 바로 이해할 수 있습니다.
즉 현실의 표 데이터에는 보통 다음 두 가지가 함께 존재합니다.
값
+
값의 의미
Pandas는 이런 데이터를 다루기 위해 행과 열에 이름을 붙일 수 있는 구조를 제공합니다.
Pandas란 무엇일까?
Pandas는 Python에서 표 형태의 데이터를 처리하고 분석하기 위해 널리 사용하는 라이브러리입니다.
일반적으로 다음과 같은 데이터를 다룰 때 매우 유용합니다.
CSV
Excel
Database에서 가져온 표
설문조사 데이터
실험 결과
사용자 데이터
머신러닝 Dataset
Pandas를 사용하면 다음처럼 데이터의 의미를 유지한 상태로 작업할 수 있습니다.
student_id | age | study_hours | attendance_rate
------------------------------------------------
1001 | 39 | 15.8 | 94.6
1002 | 25 | 12.8 | 85.5
1003 | 37 | 9.0 | 100.0
이 표 전체를 Pandas에서는 주로 DataFrame이라는 구조로 다룹니다.
DataFrame이란?
DataFrame은 Pandas의 가장 핵심적인 자료구조입니다.
처음에는 어렵게 생각하지 않아도 됩니다.
행과 열에 이름을 붙여 관리할 수 있는 표
라고 이해하면 충분합니다.
엑셀의 표를 떠올려도 좋습니다.
age study_hours attendance_rate
0 39 15.8 94.6
1 25 12.8 85.5
2 37 9.0 100.0
NumPy에서는
열 0
열 1
열 2
처럼 위치가 중요했다면, Pandas에서는
age
study_hours
attendance_rate
열의 이름으로 데이터를 표현할 수 있습니다.
Python Dictionary에서 DataFrame 만들기
Pandas를 이해하기 좋은 방법은 Python에서 이미 배운 Dictionary와 연결하는 것입니다.
다음 Dictionary를 만들어보겠습니다.
students = {
"name": ["민수", "지수", "철수"],
"age": [30, 25, 42],
"study_hours": [12.5, 6.0, 15.0]
}
구조를 보면 각 Key가 데이터의 이름 역할을 합니다.
name
age
study_hours
그리고 각각의 Key에는 여러 값이 들어 있습니다.
이 데이터를 Pandas DataFrame으로 바꿔보겠습니다.
먼저 Pandas를 불러옵니다.
import pandas as pd
Pandas는 관례적으로
pd
라는 이름으로 불러옵니다.
pandas 모듈 설치가 필요하다면 아래의 명령어를 통해 설치를 진행합니다.
pip install pandas
https://pypi.org/project/pandas/
pandas
Powerful data structures for data analysis, time series, and statistics
pypi.org
이제 DataFrame을 생성합니다.
df = pd.DataFrame(students)
print(df)
실행 결과
name age study_hours
0 민수 30 12.5
1 지수 25 6.0
2 철수 42 15.0
이제 데이터가 훨씬 읽기 쉬워졌습니다.
Dictionary가 표로 바뀌었다
방금 일어난 변화를 살펴보겠습니다.
기존 Dictionary는
students = {
"name": ["민수", "지수", "철수"],
"age": [30, 25, 42],
"study_hours": [12.5, 6.0, 15.0]
}
였습니다.
Pandas DataFrame으로 바꾸면
name age study_hours
0 민수 30 12.5
1 지수 25 6.0
2 철수 42 15.0
가 됩니다.
Dictionary의 Key가 열 이름이 되었습니다.
"name"
↓
name 열
"age"
↓
age 열
"study_hours"
↓
study_hours 열
Python에서 배운 Dictionary가 현실의 표 데이터를 만드는 기반으로 다시 등장하였습니다.
Row와 Column
표 형태의 데이터에서는 두 가지 방향이 중요합니다.
Row
가로 한 줄입니다.
민수 | 30 | 12.5
Row는 하나의 관측값 또는 하나의 Sample을 나타내는 경우가 많습니다.
이번 데이터에서는 학생 한 명이 하나의 Row입니다.
Column
세로 방향의 데이터입니다.
예를 들어
30
25
42
는 age Column입니다.
Column은 보통 하나의 Feature 또는 속성을 나타냅니다.
name
age
study_hours
각각이 하나의 Column입니다.
머신러닝에서 배울 구조와 다시 연결된다
NumPy#33 문서에서 머신러닝 데이터를 다음처럼 설명했습니다.
행
→ Sample
열
→ Feature
Pandas에서도 똑같은 구조를 볼 수 있습니다.
age study_hours
민수 30 12.5
지수 25 6.0
철수 42 15.0
여기서
행
→ 학생 하나
열
→ Feature 하나
입니다.
NumPy에서 Matrix로 배웠던 구조가 Pandas에서는 이름이 붙은 표로 표현되고 있습니다.
DataFrame 왼쪽의 숫자는 무엇일까?
DataFrame을 다시 보겠습니다.
name age study_hours
0 민수 30 12.5
1 지수 25 6.0
2 철수 42 15.0
왼쪽에
0
1
2
라는 숫자가 있습니다.
이것은 우리가 만든 name, age 같은 Column이 아닙니다.
Pandas가 각 행에 붙여준 Index입니다.
쉽게 표현하면
행의 이름표
라고 생각할 수 있습니다.
현재는 기본적으로
0
1
2
가 붙어 있습니다.
이 Index는 이후 원하는 행을 선택할 때 중요하게 사용됩니다.
다만 지금은 Index를 변경하거나 조작하는 방법까지 배우지는 않겠습니다.
Pandas에서 데이터를 선택하는 글에서 다시 만나게 됩니다.
Series란 무엇일까?
Pandas를 공부하면 DataFrame과 함께 Series라는 단어를 자주 만나게 됩니다.
처음부터 복잡하게 생각할 필요는 없습니다.
DataFrame이 표 전체라면,
Series는 표의 한 열과 비슷한 구조
라고 생각하면 됩니다.
앞의 예시에서 DataFrame에서 age만 선택해보겠습니다.
age = df["age"]
print(age)
실행 결과
0 30
1 25
2 42
Name: age, dtype: int64
그리고 자료형을 확인해보면
print(type(age))
다음과 같이 나옵니다.
<class 'pandas.core.series.Series'>
DataFrame
→ 여러 열이 모인 표
Series
→ 하나의 열과 비슷한 1차원 데이터
정도로 이해하면 충분합니다.
Series를 별도의 긴 주제로 파고들 필요는 없습니다.
앞으로 DataFrame을 사용하다 보면 자연스럽게 반복해서 만나게 됩니다.
NumPy Array와 Pandas DataFrame 비교
이제 둘의 차이를 정리해보겠습니다.
NumPy Array
import numpy as np
data = np.array([
[39, 15.8, 94.6],
[25, 12.8, 85.5],
[37, 9.0, 100.0]
])
print(data)
결과
[[ 39. 15.8 94.6]
[ 25. 12.8 85.5]
[ 37. 9. 100. ]]
각 숫자의 의미를 알고 있으려면 열 위치를 기억해야 합니다.
Pandas DataFrame
import pandas as pd
data = {
"age": [39, 25, 37],
"study_hours": [15.8, 12.8, 9.0],
"attendance_rate": [94.6, 85.5, 100.0]
}
df = pd.DataFrame(data)
print(df)
결과
age study_hours attendance_rate
0 39 15.8 94.6
1 25 12.8 85.5
2 37 9.0 100.0
열 이름이 있기 때문에 데이터의 의미를 바로 알 수 있습니다.
그렇다면 Pandas가 NumPy보다 좋은 걸까?
그렇게 단순하게 비교하면 안 됩니다.
두 라이브러리는 경쟁 관계라기보다 역할이 다릅니다.
NumPy는 대규모 수치 계산을 위한 배열 연산에 강합니다.
Pandas는 이름이 붙은 현실의 표 데이터를 다루는 데 강합니다.
쉽게 비교하면 다음과 같습니다.
| NumPy | Pandas |
| 숫자 배열 | 표 형태 데이터 |
| 위치 중심 | 이름과 Label 중심 |
| 빠른 수치 계산 | 데이터 정리와 분석 |
| 같은 dtype 중심 | 열마다 서로 다른 dtype 가능 |
| Matrix·Tensor의 기초 | CSV·Excel 같은 현실 데이터 처리 |
따라서
NumPy를 배웠으니 Pandas가 필요 없다.
도 아니고,
Pandas가 편하니 NumPy를 몰라도 된다.
도 아닙니다.
두 도구는 AI 데이터 과정에서 서로 연결됩니다.
현실의 데이터는 한 종류의 값만 있지 않다
우리가 사용할 학습 데이터에는 다음과 같은 값이 함께 존재합니다.
student_id
→ 정수
study_hours
→ 실수
course
→ 문자열
city
→ 문자열
passed
→ 0 또는 1
1001 | 39 | 15.8 | Python | Daegu | 1
서로 다른 성격의 데이터가 한 행에 존재합니다.
Pandas DataFrame은 열마다 서로 다른 dtype을 관리할 수 있기 때문에 이런 표 데이터를 다루기 편리합니다.
NumPy는 같은 종류의 수치 데이터를 빠르게 계산하는 데 강하고,
Pandas는 서로 다른 의미와 자료형을 가진 현실 데이터를 표라는 구조 안에서 관리합니다.
이름으로 데이터를 선택할 수 있다는 것
Pandas를 사용하는 큰 이유 중 하나는 데이터의 의미를 코드에 그대로 표현할 수 있다는 점입니다.
NumPy에서는 특정 열을 위치로 선택할 수 있습니다.
data[:, 2]
Pandas에서는 아래와 처럼 작성할 수 있습니다.
df["study_hours"]
두 코드를 비교해보겠습니다.
data[:, 2]
이 코드만 보면 2가 무엇을 의미하는지 알아야 합니다.
반면
df["study_hours"]
는 코드를 읽는 것만으로도 의도가 보입니다.
학습 시간 데이터를 선택하고 있구나.
데이터 분석에서는 이런 가독성이 매우 중요합니다.
AI에서 Pandas는 어디에 쓰일까?
Pandas가 AI 모델 자체를 만드는 라이브러리는 아닙니다.
AI 데이터를 준비하는 과정을 생각해보겠습니다.
현실의 데이터
CSV / Excel / Database
↓
Pandas
↓
데이터 확인
데이터 선택
결측값 처리
중복 제거
문자열 정리
통계 분석
↓
Feature / Label
↓
NumPy Array 또는 Tensor
↓
Machine Learning / Deep Learning
즉 Pandas는
현실의 데이터를 AI가 학습할 수 있는 상태로 준비하는 작업대
라고 생각하면 좋습니다.
좋은 모델보다 먼저 좋은 데이터가 필요하다
AI를 처음 공부하면 모델에 관심이 집중되기 쉽습니다.
어떤 알고리즘을 사용할까?
어떤 신경망을 사용할까?
모델 정확도는 얼마나 나올까?
하지만 실제로는 그 전에 해야 할 일이 많습니다.
예를 들어 데이터에
비어 있는 값
중복된 데이터
잘못된 문자열
잘못된 자료형
이상한 값
이 있다면 좋은 모델을 선택한다고 모든 문제가 해결되는 것은 아닙니다.
그래서 머신러닝을 배우기 전에 데이터를 확인하고 정리하는 과정을 먼저 배우는 것입니다.
Pandas Phase의 진짜 목적도 여기에 있습니다.
앞으로 사용할 데이터셋을 살펴보자
앞으로 사용할 데이터에는 총 9개의 Column이 있습니다.
| Column | 의미 |
| student_id | 학습자 ID |
| age | 나이 |
| study_hours | 주간 학습 시간 |
| attendance_rate | 출석률 |
| assignment_score | 과제 점수 |
| previous_score | 이전 시험 점수 |
| course | 수강 과정 |
| city | 지역 |
| passed | 합격 여부 |
실제 데이터 일부는 다음과 같습니다.
student_id age study_hours attendance_rate assignment_score previous_score course city passed
1001 39 15.8 94.6 100.0 74.2 Python Daegu 1
1002 25 12.8 85.5 88.0 90.2 AI Daejeon 1
1003 37 9.0 100.0 85.9 74.4 AI Incheon 1
1004 21 19.2 77.1 100.0 81.8 Python Daejeon 1
1005 31 13.6 88.0 80.8 56.7 Python Busan 1
이번 글에서는 데이터가 어떤 의미를 갖는지만 살펴보았습니다.
아직 이 데이터가 깨끗한지, 문제가 있는 값은 없는지, 몇 명의 학생이 들어 있는지, 각 Column의 dtype은 무엇인지 확인하지 않았습니다.
그 작업은 다음 글에서 직접 해보겠습니다.
Pandas Phase에서 우리가 하게 될 일
앞으로 이 하나의 데이터셋을 계속 사용합니다.
처음에는 단순한 표처럼 보일 것입니다.
하지만 글이 진행될수록 조금씩 달라집니다.
#35
표를 DataFrame으로 바라보기
↓
#36
CSV를 실제로 불러오고
데이터 상태 확인하기
↓
#37
필요한 행과 열
조건에 맞는 데이터 선택하기
↓
#38
결측값
중복
문자열
dtype 문제 정리하기
↓
#39
통계와 GroupBy로 분석하고
Feature와 Label 만들기
그리고 정리된 데이터를 그대로 데이터 시각화 Phase에서 사용합니다.
즉 이번 Pandas 학습은 서로 떨어진 예제의 모음이 아닙니다.
하나의 데이터셋을 처음 받아서 AI가 사용할 수 있는 상태까지 정리하는 하나의 과정
입니다.
이번 글에서 해결한 질문
이번 글의 시작은 다음 질문이었습니다.
NumPy Array가 있는데 왜 Pandas가 필요할까?
NumPy는 숫자의 배열을 효율적으로 저장하고 계산하는 데 강력합니다.
하지만 현실의 표 데이터에는
열의 이름
서로 다른 자료형
문자열
결측값
Index
데이터의 의미
같은 정보가 함께 존재합니다.
Pandas는 이런 데이터를
DataFrame이라는 이름이 붙은 표 형태로 다루게 해줍니다.
따라서 NumPy와 Pandas의 관계를 다음처럼 이해하면 좋습니다.
NumPy
→ 숫자의 배열을 이해하고 계산한다.
Pandas
→ 현실의 표 데이터를 이해하고 정리한다.
그리고 두 도구는 결국 다시 연결됩니다.
현실 데이터
↓
Pandas
↓
정리된 Feature / Label
↓
NumPy Array 또는 Tensor
↓
AI 모델
핵심 정리
Pandas는 표 형태의 데이터를 처리하고 분석하기 위한 Python 라이브러리입니다.
Pandas의 핵심 자료구조는 DataFrame입니다.
df = pd.DataFrame(data)
DataFrame은 행과 열을 가진 표 형태의 데이터입니다.
Row
→ 하나의 Sample
Column
→ 하나의 Feature 또는 속성
DataFrame의 한 열과 비슷한 1차원 구조는 Series라고 합니다.
df["age"]
NumPy가 배열의 위치와 수치 계산에 강하다면, Pandas는 Label과 의미를 가진 현실의 표 데이터 처리에 강합니다.
결국 Pandas를 배우는 이유는 단순히 표를 예쁘게 출력하기 위해서가 아닙니다.
현실의 데이터를 이해하고 정리해서 AI가 사용할 수 있는 형태로 만들기 위해서입니다.
다음 글 예고
이제 Pandas가 왜 필요한지는 알았습니다.
그렇다면 실제 데이터를 가져와보겠습니다.
앞으로 사용할 파일은 아래와 같습니다.
ai_learning_dataset.csv
그런데 CSV 파일을 불러왔다고 바로 분석을 시작해도 될까요?
먼저 확인해야 할 것이 있습니다.
데이터는 몇 행인가?
Column은 몇 개인가?
앞부분에는 어떤 값이 들어 있는가?
각 Column의 dtype은 무엇인가?
비어 있는 값은 없는가?
다음 글에서는 pd.read_csv()를 이용해 실제 CSV 파일을 DataFrame으로 불러오고,
head()
shape
info()
dtypes
를 통해 데이터를 처음 받았을 때 가장 먼저 확인해야 하는 것들을 살펴보겠습니다.
그리고 우리가 만든 데이터 안에 어떤 문제가 숨어 있는지도 직접 찾아보겠습니다.
'AI Journey > Pandas' 카테고리의 다른 글
| Pandas 데이터 선택하기 — loc, iloc과 조건 필터링 쉽게 이해하기 (0) | 2026.08.23 |
|---|---|
| Pandas CSV 불러오기 — 데이터를 받으면 가장 먼저 확인해야 할 것들 (0) | 2026.08.23 |