내일배움캠프(QC,QA_5기)

[내일배움캠프_QA/QC 5기] 17일차 _ 데이터 전처리&시각화 3강

qc-standard 2026. 3. 31. 21:18

2026/03/31 Tue.


⊙ 데이터 전처리 & 시각화 3강

 Pandas 설치

!pip install pandas    #pandas 설치

!pip install seaborn    #seaborn 설치

 

 

 import 명령어 : 라이브러리 불러오는 명령어

import pandas as pd    #pandas를 pd라고 부를게

import seaborn as sns    #seaborn을 sns라고 부를게
data = sns.load_dataset('tips')    # tips라는 이름의 데이터 셋을 불러와서 data 변수에 저장

data    # 데이터 출력

 

데이터 불러오기, 저장하기, 인덱스

 데이터 불러오기

df = pd.read_csv("./tips_data.csv")
df
# pd.read_확장자('.폴더명/파일명.확장자')

# 확장자
# excel - xlsx
# csv - csv
# csv - xlsx

# ./ → 현재 위치

 데이터 저장

data.to_csv("폴더명./tips_data.csv")
df. to_csv("폴더명/tips_data.csv" , index=False)

#엑셀 저장하는 법
df.to_excel("파일이름/tips_data.xlsx", index = False)
 
# () 안에 파일경로 저장할파일명 확장자

인덱스

# 컬럼 인덱스 없이 불러오기

df = pd.read_csv()"./tips_data.csv", index_col=0)

data.to_csv("./tips_data.csv", index=False)


#별도의 인덱스 설정이 없으면 인덱스가 컬럼의 형태 가되는 경우가 있음

# index_col=0
# index=False


#인덱스 X
df = pd.DataFrame({
     'A': [1, 2, 3],
     'B': ['a', 'b', 'c']
})
df

#인덱스 O
df = pd.DataFrame({
     'A': [1, 2, 3],
     'B': ['a', 'b', 'c']
}, index=['idx1', 'indx2', 'indx3'])
df

#특정 인덱스 출력 : loc

df.loc['indx2']

#indx2 행에 대한 정보만 출력
#인덱스 순서 정렬 : 기본적으로 오름차순

df.sort_index()
#인덱스 재지정

df.set_index('A')
 
#A라는 컬럽을 인덱스로 쓰겠다 → A 값이 인덱스로 됨
# 인덱스 값 확인
df.index

#인덱스 추가

df.index = ['ㄱ', 'ㄴ', 'ㄷ']
df
#기존 인덱스로 되돌림

df.reset_index()


df.reset_index(drop=True)

 

 


컬럼(Column)

    : 데이터 프레임(DataFrame)의 또는 변수, 세로방향에 있는 데이터들

    : 행은 row 또는 인덱스라고 함

#특정 컬럼 추출

df['이름']
#컬럼 확인

df.columns
#컬럼 순서 변경

df.['A', 'B']   →  df.['B', 'A']
 
#컬럼 이름 변경

df.rename(columns={'name':'이름' , 'age':'나이' , 'gender':'남/여'})




#컬럼 추가

df['스포츠'] = '야구'
df
#컬럼 삭제

del df['나이']
df

 


데이터 확인

.head()

df.head()


→ 기본적으로 5개 데이터 제공

df.head(7)

#괄호 안에 숫자(N)를 넣으면 N행 까지 데이터 제공

 

.info()

    : 데이터 프레임에 대한 정보 확인
    : 
주데이터 타입 / 컬럼에 대한 null값이 카운트

    : float(소수점이 있는 숫자), int(정수)에 대한 숫자 타입컬럼 값들만 기초 통계 확인 가능

df.info()

 

● .describe()

    : 사카운트 갯수 / 평균, 표준 편차, 최대값, 최소값, 각 4분위 값에 대한 기초 통계량 확인 가능 메서드
    : float(소수점이 있는 숫자), int(정수)에 대한 숫자 타입 컬럼 값들만 기초 통계 확인 가능

df.describe()

 

● 데이터 타입 확인


#데이터 타입 확인

df.dtype


#컬럼별 dtype 확인

df['size'].dtype


 

결측치 확인 = nuull값 확인 

#1

df.info()


 
#non-null : null값이 아닌 값 = 정상값?

#A 컬럼에는 non-null 4개
#B 컬럼에는 non-null 3개

#non-null값 갯수 차이로 'B'에 null값 여부 알 수 있음

#2 - null값 직접 확인

df.isna()

 


#null값 = True
#3

df.isnull()
#3 #결측치 갯수 확인 가능

df.isnull().sum()
# 결측치 제거 : dropna()

df.dropna()
 

 

중복 데이터 확인 및 제거 


# 중복 데이터 확인
df.duplicated( )


# 중복 데이터 제거
df.drop_duplicates( )

 

● .astype()   데이터 타입 변경 : Pandas 데이터 프레임의 열=colum 데이터 타입 변경에 사용


#기존 float 타입을 string으로 바꾼다

df['total_bill'] = df['total_bill'].astype(str)



#float → string으로 바꾼걸 확인

df.info()



 

데이터 타입

설명
int 64, int32 정수형 데이터(64비트, 32비트)
float64, float32 부동 소수점 수(64비트, 32비트)
object 문자열 데이터(일반적 문자열)
bool 불리언(참/거짓) 데이터
datetime64 날짜와 시간 데이터
timedelta64 시간 간격 데이터
(두 날짜 또는 시간사이의 차이)
categgory 카테고리형 데이터
(제한된 고유값으로 구성)

 


데이터 선택

특정 행, 열 선택 = 슬라이싱 = Slicing & Selection

.iloc[ ]

.loc[ ]

인덱스 번호로 특정 행과 열 선택

이름으로 특정 행, 열 선택

.iloc[row start : row end+1 : 간격]
.iloc[row, colum]
.iloc[ , ]  전체

.loc[행 이름, 컬럼명]
.loc[ '행이름' , ['B', 'C']]
.loc['행이름', '컬럼명1' : ]   컬럼명 1~끝까지

\ : 줄바꿈


데이터 선택

 불리언 인덱싱 = Boolean Indexing

  • 특정 조건을 만족하는 행만 선택하는 방법
  • 데이터 필터링 or 원하는 조건에 만족하는 행 추출 
  • 조건식에 따라 True  False로 평가

df['day'] = 'sun'
df

  • 'sun' 행은 Ture
  • Not 'sun' 행은 False

df[df['age'] >= 30]

  • 'age' 컬럼(열)에서 '30 이상' 행 필터링
  • 여러 조건 : (조건 1) & (조건 2)

df[df['day'] .isin('Sun', 'Thu')]

  • 'day' 컬럼에서 'Sun' 또는 'Thu' 행 필터

데이터 병합

 concat( ) : 위아래 / 좌우로 병합

.axis = 0    위아래
=기본값

.axis = 1    좌우

pd.concat([df1, df2]), reset_index(drop=ture)

pd.concat([df1, df2], axis=1)

ignore_index  :  df 인덱스 유지/새롭게
reset_index(drop=Ture)   :   새로운 인덱스
reset_index(droop=False)   :   기존 인덱스

 

merge( ) : 특정 컬럼을 중심으로 좌우 병합 

  • on : 병합 기준이 되는 컬럼
  • how : 병합 방법

pd.merge(df1, df2, on='key', how='outer')

  • 'key' 컬럼을 중심으로 병합
  • 'outer'형식으로 병합 - inner 기본값


데이터 집계

groupby( ) : 데이터프레임을 그룹화 / 그룹단위로 분할(split) / 적용(apply) / 결합(combine)

  • 컬럼 기준 그룹 생성 → 그룹 단위 연산 → 결과 결합

df.groupby('category').mean( )

카테고리 컬럼 값(value) 평균

df.groupby('category').sum( )

카테고리 컬럼 값(value)

df.groupby('category').count( )

카테고리 컬럼 값(value) count

df.groupby('category').max( )

df.groupby('category').min( )

 

카테고리 컬럼 값(value) 최대 / 최소

df.groupby('category').first( )

 

df.groupby('category').agg( list )

df.groupby('category', 'Subcategory').agg( {'value1' : ['mean', 'sum'], 'value2' : 'sum'} )

 

어그리게이션
카테고리 컬럼 값(value) 리스트

 

 

Pivot Table( ) 

  • 피벗테이블 : 기존 데이터프레임을 재구성ㅇ하여 요약/정리해 보여주는 테이블 형태 
data = {
    'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02', '2023-01-01'],
    'Category': ['A', 'B', 'A', 'B', 'A'],
    'Value1': [10, 20, 30, 40, 50],
    'Value2': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)

# 피벗 테이블 생성: 'Date'를 행 인덱스로, 'Category'를 열 인덱스로, 값은 'Value1'과 'Value2'의 평균으로 집계
pivot = df.pivot_table(index='Date', columns='Category', values=['Value1', 'Value2'], aggfunc='mean')

 

데이터 정렬

sort_values( ) → sort_values(by='age')  : age 컬럼을 기준으로 오름차순

sort_index( )