풀스택 백엔드 2026.07.22

syyu21b·2026년 7월 22일

풀스택 - 백엔드

목록 보기
48/49
post-thumbnail

[SECTION 15. 파이썬 기초 문법 - Pandas 실전 활용: 필터링 및 결측치 처리]

1. 데이터 필터링 (Boolean Indexing)

  • 조건을 걸어 원하는 행(Row)만 추출하는 방법입니다. 결과가 True인 데이터만 남긴다고 해서 불리언 인덱싱이라 부릅니다.
연산자의미예시
==같다df['class'] == 'Business'
!=다르다df['airline'] != 'Korean Air'
> , <크다, 작다df['price'] > 500000
&AND (그리고)(조건1) & (조건2)
``OR (또는)

2. 단일 조건 필터링

  • 가장 기본적인 '하나의 조건'으로 걸러내기입니다.
import pandas as pd

# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv')
pd.set_option('display.max_columns', None)

# 2. 'Business' 좌석 등급만 골라내기
# df[조건식] 형태로 작성합니다.
business_df = df[df['class'] == 'Business']

print("--- 비즈니스석 데이터 상위 5행 ---")
print(business_df.head())
print(f"전체 건수: {len(business_df)}건")

3. 다중 조건 필터링

  • 여러 조건을 동시에 만족하는 데이터를 찾을 때 씁니다. 조건마다 반드시 괄호()를 쳐야 에러가 나지 않습니다.
import pandas as pd
df = pd.read_csv('Clean_Dataset.csv')

# [실습] 항공사가 'Asiana'이면서 가격이 6,000원 이하인 항공권 찾기
condition = (df['airline'] == 'AirAsia') & (df['price'] <= 6000)
target_df = df[condition]

print("--- 아시아나 & 20만원 이하 데이터 ---")
print(target_df.head())


4. 결측치(Missing Value) 처리하기

  • 데이터에 값이 비어 있는 상태인 NaN(Not a Number)을 처리하는 과정입니다.

4-1. 결측치가 포함된 데이터 프레임 생성하기

  • 먼저, 일부러 구멍(NaN)을 숭숭 뚫어놓은 실습용 데이터를 생성합니다.
import pandas as pd
import numpy as np

# 1. 실습용 '구멍 난' 데이터 생성
data = {
    '이름': ['자바', '바미', '초코', np.nan],
    '나이': [3, np.nan, 5, 1],
    '몸무게': [4.5, 3.2, np.nan, np.nan],
    '소속': [np.nan, np.nan, np.nan, np.nan] # 모든 값이 결측치인 컬럼
}
df = pd.DataFrame(data)

print("--- 원본 데이터 (NaN 확인) ---")
print(df)
  • dropna(): "불량품은 버린다” → 결측치가 있는 행이나 열을 삭제하는 도구입니다.
  • how 옵션: 얼마나 엄격하게 지울까?
  • how='any' (기본값): 행에 결측치가 하나라도 있으면 삭제
  • how='all': 행의 모든 값이 결측치여야 삭제
# 하나라도 NaN이 있으면 삭제 (대부분의 데이터가 사라짐)
df_any = df.dropna(how='any')

# 모든 값이 NaN인 행만 삭제 (여기서는 삭제되는 행이 없음)
df_all = df.dropna(how='all')
  • fillna(): "빈칸을 메운다” → 삭제 대신 적절한 값으로 채워 넣는 도구입니다.
import pandas as pd
import numpy as np

data = {
    '이름': ['자바', '바미', '초코', np.nan],
    '나이': [3, np.nan, 5, np.nan],
    '몸무게': [4.5, 3.2, np.nan, np.nan],
    '소속': ["한코딩", np.nan, np.nan, np.nan] # 모든 값이 결측치인 컬럼
}

df = pd.DataFrame(data)

df_custom = df.fillna({'이름' : '이름 없음', '나이' : 0, '몸무게' : 0, "소속" : "무소속"})

print(df_custom)

4-2. 결측치 확인하기

  • 어떤 컬럼에 결측치가 발생했는지 먼저 파악해야 합니다.
import pandas as pd
df = pd.read_csv('Clean_Dataset.csv')

# 각 컬럼별로 비어있는 데이터가 몇 개인지 합계 출력
print("--- 컬럼별 결측치 개수 ---")
print(df.isnull().sum())
import pandas as pd
import numpy as np

data = {
    '이름': ['자바', '바미', '초코', np.nan],
    '나이': [3, np.nan, 5, np.nan],
    '몸무게': [4.5, 3.2, np.nan, np.nan],
    '소속': ['SBS', np.nan, np.nan, np.nan] # 모든 값이 결측치인 컬럼
}

df = pd.DataFrame(data)

print(df.isnull().sum())

4-3. 결측치 삭제 또는 채우기

  • AICE 시험 지시사항에 따라 삭제(dropna)할지, 특정 값으로 채울지(fillna) 결정합니다.
import pandas as pd
df = pd.read_csv('Clean_Dataset.csv')

# 방법 1: 결측치가 하나라도 있는 행을 통째로 삭제 (axis=0)
df_drop = df.dropna(axis=0)

# 방법 2: 결측치를 특정 값(예: 0)으로 채우기
df_fill_zero = df.fillna(0)

# 방법 3: 결측치를 해당 컬럼의 평균값으로 채우기 (가장 많이 권장됨)
price_mean = df['price'].mean()
df['price'] = df['price'].fillna(price_mean)

print("--- 결측치 처리 완료 ---")
import pandas as pd

data = {
    '이름': ['자바', '바미', '초코', np.nan],
    '나이': [3, np.nan, 5, np.nan],
    '몸무게': [4.5, 3.2, np.nan, np.nan],
    '소속': ['SBS', np.nan, np.nan, np.nan] # 모든 값이 결측치인 컬럼
}

df = pd.DataFrame(data)

# 방법 1: 결측치가 하나라도 있는 행을 통째로 삭제 (axis=0)
df_drop = df.dropna(axis=0)

# 방법 2: 결측치를 특정 값(예: 0)으로 채우기
df_fill_zero = df.fillna(0)

print("--- 결측치 처리 완료 ---")

5. 연습 문제

Q1. Clean_Dataset.csv를 사용하여 다음 조건에 맞는 데이터를 추출하고 처리하세요.

  • 출발 도시(source_city)가 'Delhi' 이고, 도착 도시(destination_city)가 'Mumbai' 인 데이터만 추출하세요.
  • 추출된 데이터에서 가격(price)이 높은 순서대로 상위 10개를 출력하세요.
import pandas as pd

df = pd.read_csv("clean_dataset.csv")

# 다중 조건 필터링
filtered_df = df[(df['source_city'] == 'Delhi') & (df['destination_city'] == 'Mumbai')]

result_df = filtered_df.sort_values(by='price', ascending=False)

print(result_df.head(10)[['source_city','destination_city','price']])

[SECTION 16. 파이썬 기초 문법 - 데이터 시각화]

1. 환경 설정: 모듈 가져오기 & 한글 깨짐 방지

  • 파이썬 시각화의 기본인 Matplotlib과 세련된 디자인의 Seaborn을 사용합니다. 한국어 데이터를 다룰 때는 한글 폰트 설정이 필수입니다.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv', index_col=0)

# 2. 한글 깨짐 방지 설정 (Windows 기준)
plt.rc('font', family='Malgun Gothic')
plt.rcParams['axes.unicode_minus'] = False # 마이너스 기호 깨짐 방지

print("시각화 준비 완료!")

2. Matplotlib & Seaborn 필수 메소드

  • 시각화를 위한 필수 메소드에 대해 알아 봅니다.
분류메소드 (함수)역할 및 목적주요 파라미터 (옵션)
기본 설정plt.rc() / plt.rcParams한글 폰트, 마이너스 기호 깨짐 등을 설정family(글꼴), size(글자 크기)
plt.figure()그래프를 그릴 도화지(Canvas)를 준비figsize=(가로, 세로) # 단위는 inch
비교 (범주)sns.barplot()막대 그래프. 그룹별 평균값 비교 시 사용x, y, data, palette(색상)
sns.countplot()항목별 데이터 개수를 자동으로 세어줌x, data, hue(추가 분류)
분포 (수치)sns.histplot()히스토그램. 데이터가 어디에 몰려 있는지 확인bins(막대 개수), kde(곡선 여부)
sns.boxplot()상자 그림. 사분위수와 이상치 확인 (시험 빈출)x, y, data
관계sns.scatterplot()산점도. 두 숫자 데이터 간의 상관관계 확인x, y, data
sns.heatmap()히트맵. 상관계수를 색상으로 시각화data, annot=True(숫자 표시)
꾸미기plt.title()그래프 상단에 제목을 달아줌fontsize(글자 크기)
plt.xlabel() / ylabel()X축과 Y축에 이름(라벨)을 붙여줌label
plt.xticks(rotation=45)X축 글자가 겹칠 때 각도를 회전시킴rotation
마무리plt.show()완성된 그래프를 화면에 출력 (마침표 역할)-
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv')
plt.rc('font', family='Malgun Gothic')

# 2. 도화지 꺼내기
plt.figure(figsize=(12, 6))

# 3. 그림 그리기
# hue='airline'을 넣어 색상 기준을 명시하고, legend=False로 중복 범례를 숨깁니다.
sns.barplot(x='airline', y='price', data=df, hue='airline', palette='viridis', legend=False)

# 4. 이름표 붙이기
plt.title('항공사별 평균 항공권 가격 현황', fontsize=15)
plt.xlabel('항공사 이름')
plt.ylabel('평균 가격(INR)')

# 5. X축 글자 회전
plt.xticks(rotation=45)

# 6. 출력하기
plt.show()
메소드기능주요 매개변수 (Usage)
plt.plot()선 그래프 그리기x, y: 데이터, label: 범례에 표시할 이름, color: 색상
plt.title()그래프 제목 설정label: 제목 텍스트, fontsize: 글자 크기
plt.xlabel()X축 라벨 설정xlabel: 축 이름
plt.ylabel()Y축 라벨 설정ylabel: 축 이름
plt.legend()범례 표시loc: 위치(best, upper right 등)
plt.show()그래프 출력없음 (마지막에 호출)
import pandas as pd
import matplotlib.pyplot as plt

# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv', index_col=0)

# 2. 데이터 가공 (항공사별/남은일수별 평균 가격)
vistara = df[df['airline'] == 'Vistara'].groupby('days_left')['price'].mean()
air_india = df[df['airline'] == 'Air_India'].groupby('days_left')['price'].mean()

# 3. 그래프 그리기 (여기에 코드를 완성해 보세요!)
plt.figure(figsize=(10, 5))

# 선 그래프 그리기
plt.plot(vistara.index, vistara.values, label='Vistara')
plt.plot(air_india.index, air_india.values, label='Air_India')

plt.title('Price Trend')
plt.xlabel('Days Left')
plt.ylabel('Avg Price')
plt.legend()

# 표시
plt.show()

2. 막대 그래프 (Bar Chart): 항목별 비교

  • "어느 항공사가 가장 비싼가?"처럼 그룹 간의 수치를 비교할 때 가장 좋습니다.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv', index_col=0)
plt.rc('font', family='Malgun Gothic')

# 항공사별 평균 가격 시각화
plt.figure(figsize=(10, 6)) # 도화지 크기 설정

# sns.barplot은 자동으로 평균을 계산해서 그려줍니다.
sns.barplot(x='airline', y='price', data=df)

plt.title('항공사별 평균 항공권 가격')
plt.xlabel('항공사')
plt.ylabel('평균 가격')
plt.show()

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 1. 데이터 불러오기
df = pd.read_csv('student.csv', index_col=0)
plt.rc('font', family='Malgun Gothic')

plt.figure(figsize=(10, 6)) # 도화지 크기 설정

sns.barplot(x='name', y='age', data=df)

plt.title('이름별 평균 나이')
plt.xlabel('이름')
plt.ylabel('나이')

plt.show()

3. 히스토그램 (Histogram): 데이터의 분포 확인

  • "항공권 가격은 주로 어느 가격대에 몰려 있는가?"를 확인할 때 사용합니다.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 1. 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv', index_col=0)
plt.rc('font', family='Malgun Gothic')

# 전체 항공권 가격 분포 확인
plt.figure(figsize=(10, 6))

# bins는 막대의 개수, kde는 부드러운 곡선 표시 여부입니다.
sns.histplot(df['price'], bins=50, kde=True, color='skyblue')

plt.title('항공권 가격 분포도')
plt.show()

4. 박스 플롯 (Box Plot): 이상치와 분포 확인

  • AICE 시험에서 가장 중요하게 다루는 차트입니다. 최솟값, 최댓값, 중앙값, 그리고 이상치(점 모양)를 한눈에 보여줍니다.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 불러오기
df = pd.read_csv('Clean_Dataset.csv', index_col=0)
plt.rc('font', family='Malgun Gothic')

# 좌석 등급(class)별 가격 분포와 이상치 확인
plt.figure(figsize=(8, 6))

sns.boxplot(x='class', y='price', data=df)

plt.title('좌석 등급별 가격 분포 (Economy vs Business)')
plt.show()
특징의미
상자의 높낮이평균적인 가격대 (비즈니스가 훨씬 높음)
상자의 세로 길이가격의 일관성
상자 밖의 점들예외적인 가격 (평균치를 벗어난 가격들)

5. 연습 문제

Q1. Clean_Dataset.csv를 활용하여 '출발 도시(source_city)별 비행 시간(duration)의 평균'을 막대 그래프로 그려보세요.

  • 차트 종류: sns.barplot

  • 제목: '출발 도시별 평균 비행 시간'

  • 색상 테마: palette='Set2' 옵션을 추가해 보세요.

  • 정답

    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    df = pd.read_csv('Clean_Dataset.csv', index_col=0)
    
    plt.figure(figsize=(10, 5))
    
    sns.barplot(x='source_city', y='duration', data=df, hue='source_city', palette='Set1')
    
    plt.show()

0개의 댓글