풀스택 백엔드 2026.07.23

syyu21b·2026년 7월 23일

풀스택 - 백엔드

목록 보기
49/49
post-thumbnail

[SECTION 17. 파이썬 기초 문법 - Pandas 실전 활용: 데이터의 요약본 만들기]

1. Groupby의 핵심 원리: Split-Apply-Combine

  • groupby는 복잡해 보이지만 딱 3단계만 기억하면 됩니다.
  • Split (분할): 기준(예: 항공사)에 따라 데이터를 나눕니다.
  • Apply (적용): 각 그룹에 대해 평균(mean)이나 개수(count)를 계산합니다.
  • Combine (결합): 계산된 결과를 하나의 표로 다시 합칩니다.

2. 예제

예제 2-1. 항공사별 평균 가격 구하기

  • 가장 기본이 되는 그룹화 연산을 해 봅시다.
import pandas as pd

# 1. 데이터 불러오기 (인덱스 컬럼 지정)
df = pd.read_csv('Clean_Dataset.csv', index_col=0)

# 2. 항공사(airline)별로 그룹을 묶고, 가격(price)의 평균 구하기
# [해석] airline으로 묶어서 -> price 컬럼을 선택해 -> mean(평균)을 내라!
airline_price = df.groupby('airline')['price'].mean()

print("--- 항공사별 평균 항공권 가격 ---")
print(airline_price)

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

airline_price = df.groupby("class")["price"].mean()

print("--- 등급별 평균 항공권 가격 ---")
print(airline_price)

예제 2-2. 여러 개의 통계 한 번에 보기

  • 평균뿐만 아니라 최대값, 최소값, 개수까지 한 번에 보고 싶을 때 사용합니다.
import pandas as pd
df = pd.read_csv('Clean_Dataset.csv', index_col=0)

# agg() 함수를 사용하면 여러 함수를 리스트 형태로 전달할 수 있습니다.
airline_stats = df.groupby('airline')['price'].agg(['mean', 'max', 'min', 'count'])

print("--- 항공사별 가격 상세 통계 ---")
print(airline_stats)

3. 연습 문제

Q1. Clean_Dataset.csv를 사용하여 다음 분석을 수행하세요.

  • 출발 도시(source_city)별로 평균 비행 시간(duration)을 구하세요.
  • 결과값을 비행 시간이 긴 순서(내림차순)로 정렬하여 출력하세요.
import pandas as pd

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

source_duration = df.groupby('source_city')['duration'].agg(['mean'])

print(source_duration.sort_values(by=['mean'], ascending=False))

[SECTION 18. 파이썬 기초 문법 - 원-핫 인코딩(One-Hot Encoding)]

1. 원-핫 인코딩 핵심 메소드 (Pandas)

메소드 / 파라미터사용 예시
pd.get_dummies()'성별' 컬럼 하나가 '성별남', '성별여'라는 두 개의 새로운 열로 분리됨
columns=['컬럼명']전체 10개 컬럼 중 '항공사', '도시' 등 특정 문자열 컬럼만 선택해서 숫자로 변환
drop_first=True'남/여' 두 열 중 '남'만 남김. (1이면 남성, 0이면 여성으로 인식하여 중복 제거)
dtype=int결과 표의 값이 True/False라는 글자 대신 1/0이라는 깔끔한 숫자로 출력됨

2. 열 삭제 이유

  • 문제점: 성별_남이 1인 순간, 성별_여는 무조건 0입니다. 즉, 하나만 알아도 나머지는 100% 예측 가능한 중복 정보입니다. AI는 이런 불필요한 중복(다중공선성)이 있으면 계산 오류를 낼 확률이 높아집니다.
    이름성별_남성별_여
    철수10
    영희01
  • 해결: 열은 하나뿐이지만 남녀 구분이 완벽합니다. 데이터 양은 줄어들고, AI는 헷갈리지 않는 최적의 상태가 됩니다.
    이름성별_남정체
    철수1남자니까 1
    영희00이면? 자동으로 여성

3. 예제

예제 3-1. 가장 쉬운 성별 예제

import pandas as pd

# 1. 샘플 데이터 생성
df_person = pd.DataFrame({'이름': ['철수', '영희', '민수'], '성별': ['남', '여', '남']})

# 2. 원-핫 인코딩 적용 (drop_first=True)
# '성별_남' 열만 남게 되며, 0인 데이터가 여성을 의미함
df_gender = pd.get_dummies(df_person, columns=['성별'], drop_first=True, dtype=int)

print("--- 성별 인코딩 결과 ---")
print(df_gender)

예제 3-2. 카테고리가 3개인 경우 (항공사)

import pandas as pd

# 1. 항공사 데이터 생성
df_air = pd.DataFrame({'항공사': ['Air_India', 'Vistara', 'Indigo', 'Vistara']})

# 2. 원-핫 인코딩
# Indigo와 Vistara 열만 남고, 둘 다 0이면 Air_India를 의미함
df_air_enc = pd.get_dummies(df_air, columns=['항공사'], drop_first=True, dtype=int)

print("\n--- 항공사 인코딩 결과 ---")
print(df_air_enc)

예제 3-3. 실제 데이터 활용하기

import pandas as pd

# 1. 실제 데이터 로드
df = pd.read_csv('Clean_Dataset.csv', index_col=0)

# 2. 인코딩할 컬럼들 리스트업
target_cols = ['airline', 'source_city', 'destination_city']

# 3. 한 번에 인코딩 적용 및 1/0 숫자로 고정
df_final = pd.get_dummies(df, columns=target_cols, drop_first=True, dtype=int)

print(f"\n인코딩 후 컬럼 개수: {df_final.shape[1]}개")
print(df_final.head())

4. 연습 문제

Q1. Clean_Dataset.csv 데이터를 불러와서, 좌석 등급을 나타내는 'class' 컬럼에 대해 원-핫 인코딩을 수행하세요.

  • 조건 1: 반드시 drop_first=True 옵션을 사용하세요.
  • 조건 2: 결과값이 True/False가 아닌 0과 1로 나오도록 dtype=int 옵션을 사용하세요.
  • 조건 3: 변환 후 df.columns를 출력하여 어떤 컬럼이 남았는지 확인하세요.
    import pandas as pd
    
    df = pd.read_csv('clean_dataset.csv')
    
    df_enc = pd.get_dummies(df, columns=['class'], drop_first=True, dtype='int')
    
    print(df_enc.columns)

Q2. Clean_Dataset.csv 데이터에서 'airline'과 'stops' 두 개의 컬럼을 동시에 원-핫 인코딩 하세요.

  • 조건 1: 인코딩 후 생성된 새로운 표를 답안10이라는 변수에 저장하세요.
  • 조건 2: 인코딩 전의 컬럼 개수와 인코딩 후의 컬럼 개수를 각각 출력하여 비교하세요. (힌트: df.shape 사용)
    import pandas as pd
    
    df = pd.read_csv('clean_dataset.csv')
    
    답안5 = pd.get_dummies(df, columns=['stops', 'airline'], drop_first=True, dtype='int')
    
    print(f"인코딩 전 컬럼 갯수: {df.shape[1]}")
    print(f"인코딩 후 컬럼 갯수: {답안5.shape[1]}")

0개의 댓글