데이터를 다루기 위해 그동안 파이썬을 학습했다고 말할 수 있을 정도로 데이터를 다루는데 파이썬은 가장 효율적인 프로그래밍 언어 중 하나라고 할 수 있을 것 같다.
사실 지난번의 글들인 파이썬 기초와 파이썬 심화의 내용들은 대학교에서 배운 지 오래되어서 다시 공부한다는 생각으로 학습을 했었는데, 사실 데이터 분석 부분은 그동안 계속해서 팀 프로젝트나 공모전 등을 통해 해왔었던 내용이라 해당 학습 내용을 다시 학습한다는 생각이 아니라, 내가 알고 있는 개념이나 그런 지식들을 정리해 보는 계기로 삼아보는 것이 좋을 것 같다고 생각되었다.
그렇기에 데이터 분석 관련 내용은 알고 있는 정보들을 정리하고 이해하는 느낌으로 진행할 예정이다.
📘 데이터 과학이란?
✅ 1. 정의 (Definition)
데이터 과학(Data Science)은 "데이터로부터 가치 있는 인사이트(insight)를 추출"하는 분야이다.
예시:
수많은 고객들의 행동 데이터를 분석해서
→ "어떤 조건과 상황에서 고객이 이탈하는지",
→ "어떤 마케팅 전략이 효과적인지" 등과 같은 의사결정 근거를 제공하는 것을 목적으로 한다.
✅ 2. 목적 (Purpose)
데이터 과학의 궁극적인 목표는 "데이터를 활용해서 의사결정을 지원하고, 비즈니스 문제 등을 해결하는데 도움을 주는 것"이라고 할 수 있다.
예시:
- 병원: 환자 기록 분석으로 질병 조기 예측
- 금융: 고객의 카드 사용 패턴으로 사기 탐지
- 유통: 판매 데이터를 바탕으로 재고 최적화
데이터를 활용한 과정을 비유적으로 표현하면 요리사와 비슷하다고 많이들 이야기한다. 다양한 재료들(=데이터)을 수집해서 적절히 손질하고(=전처리) 조리법을 활용해 요리(=모델링)를 만들고, 맛있는 요리(=인사이트)를 제공하는 과정이 비슷한 부분이 많이 있다.
사실 어울리는 비유인지는 잘 모르겠지만 이것을 통해 말하고자 하는 것은 데이터 사이언스의 과정이 단순히 코드를 작성하고 실행하는 것이 아니라 문제 해결을 위한 사고라는 것이다.
실제로 그동안 팀 프로젝트를 하거나 공모전 등을 위한 프로젝트를 팀으로 진행할 때, 항상 많은 시간이 소요되고 팀원들과 회의하는 것 중 가장 많은 시간을 할애해야 하는 것이 데이터 전처리 부분이었고, 작은 것 하나하나 논의해서 결정해야 하는 부분이라 중요하게 생각했었다. 계속 학습을 진행하면서 또 이야기하겠지만 데이터 전처리 부분이 전체 과정 중 70% 정도를 차지한다고 생각해도 과언이 아닐 것이다.
📘 NumPy (Numerical Python)
✅ 1. 정의
Numpy는 "Numerical Python"의 줄임말로, 과학/수치 연산을 위한 기초 라이브러리이다. 특히 다차원 배열, 행렬 연산, 벡터 계산에 최적화되어 있다.
✅ 2. NumPy의 특징
특징 | 설명 |
빠른 계산 속도 | 내부가 C 언어로 구현되어 있어 연산 속도가 빠름 |
메모리 효율성 | 배열 구조로 데이터를 연속적으로 저장함 |
동일한 데이터 타입 | 배열 안의 모든 원소는 동일한 자료형을 가져야 함 |
벡터화 연산 지원 | for 루프 없이 전체 배열에 연산 가능 (ex. arr * 2) |
다양한 수학 함수 제공 | 삼각함수, 지수, 로그, 선형대수 등 다수 내장 |
✅ 3. NumPy 배열 vs 파이썬 리스트
항목 | NumPy 배열 (ndarray) | 파이썬 리스트 |
타입 | 동일한 자료형만 허용 | 서로 다른 타입 가능 |
성능 | 고속 계산 가능 | 느림 |
메모리 | 연속된 메모리 공간 사용 | 불연속적 |
연산 | 벡터화 연산 가능 | 루프 필요 |
✅ 4. 기본 사용법
# 가상환경 생성 및 NumPy 설치
python -m venv myenv
source myenv/bin/activate # Mac/Linux
myenv\Scripts\activate # Windows
pip install numpy
deactivate
import numpy as np
# 배열 생성
a = np.array([1, 2, 3])
b = np.array([[1, 2], [3, 4]])
# 기본 연산
a + 1 # 각 요소에 1씩 더함
a * 2 # 각 요소에 2배
np.sqrt(a) # 제곱근
✅ 5. 주요 연산 개념
▶ 행렬 곱 (dot()) vs 요소 곱 (*)
- np.dot(A, B) : 선형대수의 행렬 곱
- A * B : 각 위치의 요소별 곱
이 부분에서 행렬 곱과 요소별 곱을 헷갈리지 않도록 주의해야 한다.
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
np.dot(A, B) # 행렬 곱
A * B # 요소 곱
✅ 6. axis 개념
axis 값 | 연산 방향 | 예시 |
axis=0 | 세로 방향 (열 기준) | 열별 합계: np.sum(arr, axis=0) |
axis=1 | 가로 방향 (행 기준) | 행별 평균: np.mean(arr, axis=1) |
✅ 7. 브로드캐스팅 (Broadcasting)
서로 크기가 다른 배열끼리도 연산이 가능하도록 NumPy가 자동으로 크기를 맞춰준다.
a = np.array([[1, 2, 3],
[4, 5, 6]])
b = np.array([10, 20, 30])
a + b
→ b가 자동으로 2행 3열로 확장되어 연산된다.
✅ 8. 조건 필터링과 불리언 인덱싱
ages = np.array([10, 18, 22, 14, 30])
adult_filter = ages >= 18 # [False, True, True, False, True]
adults = ages[adult_filter] # [18, 22, 30]
# 조건에 따라 값 변경
ages[ages < 18] = 0 # 미성년자 나이를 0으로 변경
⚙️ 요약 정리
핵심 기능 | 설명 |
배열 생성 및 연산 | np.array, 벡터화 연산 |
행렬 곱과 요소 곱 구분 | dot() vs * |
axis 축 방향 이해 | axis=0: 열, axis=1: 행 |
브로드캐스팅 | 자동 차원 확장 |
조건 필터링 | 불리언 배열로 조건 추출 및 값 변경 |
NumPy는 데이터 전처리를 하게 되면 자연스럽게 import 하는 그런 라이브러리라고 생각하면 된다. 다음은 NumPy 만큼 중요한 라이브러리인 Pandas로 넘어가 볼 것이다.
📘 Pandas 기초
✅ 1. Pandas란?
Pandas는 표 형식(행과 열)의 데이터를 다루기 위한 파이썬 라이브러리이다. Excel과 SQL의 기능을 결합한 것과 비슷하다고 생각하면 된다.
✅ 2. Pandas의 특징
특징 | 설명 |
구조화된 데이터 처리 | 엑셀처럼 표 형태의 데이터 다루기 가능 |
SQL 유사 기능 | 필터링, 정렬, 그룹화, 집계, 조인 가능 |
빠른 연산 | NumPy 기반이라 대용량 처리에도 강함 |
다양한 데이터 입력 | CSV, 엑셀, SQL, JSON 등 다양한 포맷을 읽고 씀 |
결측치/이상치 처리 용이 | isna(), dropna(), fillna() 등 제공 |
✅ 3. Pandas의 주요 자료구조
▶ Series
- 1차원 배열 구조
- 인덱스 + 값 (엑셀의 한 열과 유사)
import pandas as pd
s = pd.Series([10, 20, 30], index=["a", "b", "c"])
print(s["b"]) # 20
▶ DataFrame
- 2차원 표 형식 (행 + 열)
- 다양한 데이터 타입 혼합 가능
- SQL 테이블이나 엑셀 스프레드시트와 유사
data = {
"name": ["Alice", "Bob", "Charlie"],
"age": [25, 30, 35],
"score": [85, 90, 95]
}
df = pd.DataFrame(data)
✅ 4. DataFrame 구조
구성 요소 | 설명 |
index | 행의 이름 (0, 1, 2 또는 날짜 등) |
columns | 열 이름 (name, age 등) |
values | 실제 데이터 값들 (2차원 배열 형태) |
✅ 5. 기본 함수
함수 | 설명 |
df.head() | 상위 5개 행 보기 |
df.tail() | 하위 5개 행 보기 |
df.shape | 행과 열 크기 |
df.info() | 데이터 타입, 결측 정보 등 요약 |
df.describe() | 수치형 열의 통계 요약 (평균, 중앙값, 표준편차 등) |
✅ 6. 인덱싱과 필터링
▶ 열 접근
df["name"] # Series로 반환
df[["name", "age"]] # DataFrame으로 반환
▶ 행 접근
df.loc[0] # 인덱스 이름으로 접근 (label-based)
df.iloc[0] # 정수 인덱스로 접근 (position-based)
✅ 7. GroupBy: 그룹별 통계
SQL의 GROUP BY처럼 사용 가능하다.
df.groupby("gender")["score"].mean()
- 그룹별 평균, 합계, 개수 등 집계 가능
- agg(), transform(), filter(), get_group() 등 다양하게 활용
✅ 8. 정렬
df.sort_values("age") # 오름차순
df.sort_values("score", ascending=False) # 내림차순
✅ 9. 상관관계 분석
▶ 공분산
- 평균 기준으로 두 변수의 변동이 얼마나 같이 움직이는지 측정
- 값이 클수록 연관 있음 (단위 영향받음)
▶ 피어슨 상관계수
- -1 ~ 1 사이 값
- 1: 강한 양의 상관관계
- -1: 강한 음의 상관관계
- 0: 선형 관계없음
df.corr() # 전체 수치형 변수 간의 상관관계 분석
✅ 10. 데이터 결합과 병합
▶ 병합 (SQL join처럼)
pd.merge(df1, df2, on="id", how="inner") # left, right, outer도 가능
▶ 단순 연결 (행 또는 열 방향)
pd.concat([df1, df2], axis=0) # 행 방향
pd.concat([df1, df2], axis=1) # 열 방향
✅ 요약정리
항목 | 설명 |
Series | 인덱스를 가진 1차원 데이터 |
DataFrame | 행과 열로 구성된 2차원 데이터 |
주요 기능 | 필터링, 정렬, 그룹화, 결합, 통계, 결측/이상치 처리 |
GroupBy | SQL처럼 그룹별 집계 가능 |
merge/concat | 조인 및 데이터 결합 기능 |
NumPy와 Pandas까지 정리하며 기본적인 개념을 학습해 보았다. 사실 Numpy와 Pandas를 익숙하게 사용은 하고 있었지만 이렇게 어떤 기능이 가능하고 왜 사용하는지를 다시 들으니 조금 더 이해하는 깊이가 달라질 수 있을 것 같다는 생각이 든다.
그럼 이제 이것들을 이용한 데이터 전처리 부분의 내용으로 넘어가 보자.
📘 데이터 전처리 (Data Preprocessing)
✅ 1. 데이터 전처리란?
원시 데이터(raw data)를 분석이나 머신러닝에 적합한 형태로 정제하고 변환하는 과정을 말한다. 이 전의 내용에서도 언급했듯이 전체 데이터 분석 프로젝트 시간의 70 ~ 80%를 차지할 만큼 가장 중요한 단계라고 할 수 있다.
✅ 2. 전처리가 중요한 이유
이유 | 설명 |
분석 정확성 보장 | 결측치나 이상치가 있으면 분석 결과가 왜곡됨 |
모델 성능 향상 | 머신러닝 모델은 깨끗한 데이터에서 더 잘 작동 |
리소스 효율성 | 중복, 불필요한 변수 제거로 속도와 비용 절감 |
통합 및 품질 개선 | 포맷 통일, 오류 감지로 데이터 품질 향상 |
✅ 3. 전처리의 단계별 흐름
1. 데이터 수집 (Data Collection)
- CSV, 엑셀, API, 웹 크롤링, DB 등에서 원시 데이터를 수집
- 대부분 노이즈, 결측, 중복을 포함한 "더러운" 상태
2. 데이터 정제 (Data Cleaning)
- 주요 작업:
- 결측치 처리: 제거 / 평균값 대체 / 예측값 대체
- 이상치 제거: 비정상적으로 크거나 작은 값 필터링
- 중복 제거: 동일 데이터 반복 제거
- 타입 변환: 문자열 → 숫자 등
- 정규화 / 표준화: 스케일 조정
3. 데이터 가공 (Data Processing)
- 주요 작업:
- 파생 변수 생성
- 인코딩 (원-핫, 라벨 인코딩)
- 그룹 집계
- 차원 축소 및 특성 선택
- 데이터 분할 (훈련/검증/테스트)
✅ 4. 결측치(Missing Value) 처리
- 식별: df.isna(), df.info(), df.describe()
- 처리 방법:
- 제거: df.dropna()
- 대체: 평균, 중간값, 고정값, 예측모델
- 추정: 앞/뒤 데이터로 채우기 (fillna(method="ffill"))
✅ 5. 이상치(Outlier) 처리
방법 1: IQR (Interquartile Range)
Q1 = df['col'].quantile(0.25)
Q3 = df['col'].quantile(0.75)
IQR = Q3 - Q1
df_filtered = df[(df['col'] >= Q1 - 1.5*IQR) & (df['col'] <= Q3 + 1.5*IQR)]
- 장점: 극단값에 강함, 정규분포가 아니어도 사용 가능
- 단점: 작은 데이터셋엔 불리할 수 있음
보통 Q1 - 1.5 x IQR과 Q + 1.5 x IQR 의 범위를 벗어나면 이상치라고 판단하는데, 이 또한 주관적으로 변경할 수 있는 것들이다.
방법 2: Z-Score
from scipy import stats
df_z = df[(np.abs(stats.zscore(df['col'])) < 3)]
- 정규분포 기준에서 ±3σ 이상은 이상치
- 장점: 수학적으로 명확함
- 단점: 정규분포 가정 필요
✅ 6. 중복 제거
df.drop_duplicates() # 전체 열 기준 중복 제거
df.drop_duplicates(subset=['name']) # 특정 열 기준 중복 제거
✅ 7. 스케일링 (정규화 / 표준화)
방법 | 정의 | 사용 예시 | 특징 |
표준화 (StandardScaler) | 평균 0, 표준편차 1 | SVM, 선형회귀 | 정규분포 기반 |
정규화 (MinMaxScaler) | 0~1 범위로 조정 | KNN, 신경망 | 이상치 민감 |
로버스트 스케일링 | 중앙값, IQR 사용 | 이상치 많은 데이터 | 이상치 강건성 |
로그 변환 | 로그 스케일로 변환 | 한쪽으로 치우친 데이터 | 양수만 가능 |
스케일링을 해야 하는 이유는 데이터에 수많은 컬럼들이 있을 텐데, 해당 컬럼들은 모두 각각의 수치 단위를 가지고 있다. 예를 들어, 컬럼1은 10,000이라는 값을 평균적으로 가지고, 컬럼2는 10 이라는 값을 평균적으로 가진다고 하면, 당연히 이 두 컬럼이 모델에 미치는 영향의 정도가 다를 것이다. 우리는 이를 예방하기 위해 스케일링을 진행하는 것이라고 생각하면 될 것이다.
✅ 8. 인코딩 (범주형 데이터 처리)
- 라벨 인코딩: 문자열 → 숫자 (ex. 'A' → 0, 'B' → 1)
- 원-핫 인코딩: 하나의 컬럼 → 여러 개의 이진 컬럼 (pandas get_dummies())
✅ 9. 특성 선택 & 차원 축소
- 불필요한 컬럼 제거 → 모델 성능 향상
- 차원의 저주 방지 → 고차원일수록 데이터 분석이 어려움
- PCA(주성분 분석) 등 사용
✅ 10. 데이터 분할
- 훈련 / 검증 / 테스트 세트로 분리
- 시계열 데이터는 시간 순서 유지 필수
데이터를 분할할 때도 Train, Validation, Test Set으로 나누게 되는데 Train Set은 모델 학습에 사용하고, Validation Set은 모델 검증에 사용하고, Test Set은 실제 모델을 평가할 때 사용하게 된다.
보통 Train Set과 Test Set을 7:3으로 나누고, 나눠진 Train Set에서 다시 Train Set과 Validation Set을 7:3 정도로 나눠서 사용했었다. 이 비율 또한 변경할 수 있는 부분이라 6:4 혹은 8:2로 사용하는 사람들도 있기에 잘 판단해서 사용하면 될 것 같다.
✅ 핵심 요약
전처리 작업 | 설명 |
결측치 처리 | 누락된 데이터 제거 또는 채우기 |
이상치 제거 | 극단값 필터링 (IQR, Z-score 등) |
중복 제거 | 동일 데이터 한 번만 남김 |
정규화 / 표준화 | 스케일 조정 (0~1 또는 평균=0) |
인코딩 | 문자열 데이터를 수치형으로 변환 |
특성 선택 | 쓸모없는 열 제거, 성능 향상 |
데이터 분할 | 학습/검증/테스트 구분 |
📘 데이터 시각화 (Data Visualization)
✅ 1. 시각화의 중요성
필요한 이유:
- 숫자로만 보면 안 보이던 패턴, 추세, 이상치를 한눈에 볼 수 있음
- 데이터 분석 결과를 직관적이고 설득력 있게 전달 가능
- 탐색적 분석(EDA), 리포트, 발표 등에서 필수
✅ 2. 주요 라이브러리
라이브러리 | 특징 |
Pandas 내장 시각화 | .plot() 하나로 간단한 그래프 가능 |
Matplotlib | 가장 기본적이고 강력한 시각화 라이브러리 |
Seaborn | Matplotlib 기반, 더 예쁜 스타일과 고급 기능 제공 |
Plotly | 웹 기반, 인터랙티브 그래프 지원 |
✅ 3. Pandas 내장 시각화
df['col'].plot(kind='line') # 선 그래프
df['col'].plot(kind='bar') # 막대 그래프
df['col'].plot(kind='hist') # 히스토그램
df.plot(kind='scatter', x='a', y='b') # 산점도
df.boxplot(column='col') # 박스플롯
✅ 4. Matplotlib 기본 구조
구성 요소 | 설명 |
Figure | 전체 캔버스 |
Axes | 실제 그래프 그려지는 영역 (서브플롯) |
Axis | 축 (x축, y축) |
Artist | 선, 점, 텍스트 등 그래프 요소 |
✅ 5. 주요 그래프 종류 및 설정
1. 선 그래프 ( plot() )
plt.plot(x, y, color='blue', linestyle='--', marker='o', label='Line')
plt.legend()
속성 | 예시 | 설명 |
color | 'red', '#00FF00' | 색상 |
linestyle | '-', '--', ':' | 선 종류 |
marker | 'o', 's', '^' | 데이터 포인트 |
linewidth | 2 | 선 두께 |
2. 산점도 ( scatter() )
plt.scatter(x, y, s=100, c='green', alpha=0.7, edgecolors='black')
속성 | 설명 |
s | 점 크기 |
c | 색상 |
alpha | 투명도 |
edgecolors | 테두리 색상 |
3. 막대 그래프 ( bar() )
plt.bar(x, y, color='orange', width=0.6, align='center')
→ 카테고리별 비교에 적합하다.
4. 히스토그램 (hist())
plt.hist(data, bins=10, color='purple', alpha=0.6)
→ 데이터의 분포를 보기 좋음
5. 박스플롯 (boxplot())
plt.boxplot(data)
→ 중앙값, 사분위수, 이상치 시각화 가능
6. 파이 차트 (pie())
plt.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)
→ 각 항목의 비율 시각화
✅ 6. 예제 코드 (Matplotlib 종합)
import matplotlib.pyplot as plt
x = [1, 2, 3, 4, 5]
y = [10, 12, 15, 20, 25]
plt.figure(figsize=(8, 5))
plt.plot(x, y, marker='o', linestyle='--', color='green', label='Trend')
plt.title('Sample Line Graph')
plt.xlabel('X Axis')
plt.ylabel('Y Axis')
plt.legend()
plt.grid(True)
plt.show()
✅ 요약정리
그래프 종류 | 사용 목적 |
선 그래프 | 시계열 추세, 변화량 |
막대 그래프 | 항목별 비교 |
산점도 | 두 변수 간 관계 |
히스토그램 | 분포 확인 |
박스플롯 | 이상치, 분포 요약 |
파이차트 | 비율 표현 |
데이터 분석과 시각화는 사실 파이썬(Python)으로도 많이 했지만 R이라는 언어를 사용해서도 많이 했었는데, 두 언어를 사용해 보며 느꼈던 점은 코드를 작성하고 사용하기에는 파이썬(Python)이 더 편하지만 모델을 사용하고, 시각화하는 부분에서는 R이 낫다고 생각했었다.
하지만 파이썬(Python)을 요즘 나도 많이 사용하고 있고, 데이터 전처리 등을 진행하는데 너무 편하게 사용할 수 있는 언어이기에 파이썬을 통해 데이터를 시각화하는 방법을 익히면 많은 도움이 될 것이라 생각한다. 그리고 데이터 전처리와 시각화 같은 경우에 직접 코드를 작성해서 데이터를 다뤄보며 익히는 것이 좋다고 생각된다. 어떻게 변화하는지를 직접 보면서 하는 것과 그렇지 않은 것은 차이가 많이 날 것이라고 생각되기에 그렇다.
이렇게 데이터 사이언스에 대한 내용도 데이터 전처리까지 일부 학습해 보았다.
본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성 되었습니다.