퍼포먼스 마케터 부트캠프 5주 2일차 (참여 17일차)

MIN BAEK·2025년 6월 10일
0

데이터 전처리 시각화 라이브 세션 1회차 정리

데이터 구조 이해하기

  • Pandas 핵심 구조
    • Series: 1차원 배열, 인덱스와 값으로 구성 (하나의 컬럼)
    • DataFrame: 2차원 테이블, 행과 열로 구성된 엑셀 시트와 유사 (여러 컬럼의 집합)
  • 기본 속성 확인
    • df.shape: 데이터 크기 (행, 열)
    • df.columns: 컬럼명 목록
    • df.index: 인덱스 정보
    • df.dtypes: 각 컬럼의 데이터 타입
  • 컬럼명 변경
    • 전체 컬럼명 변경 : df.columns = ['새이름1', '새이름2', ...]
    • 특정 컬럼명 변경 : df.rename(columns={'옛이름': '새이름'}, inplace=True)
    • inplace : 연산의 결과를 새로운 객체로 반환하지 않고, 원본 객체(DataFrame 또는 Series)를 직접 변경(수정)하도록 지시하는 역할

      inplace=True : 원본이 바로 변경, 메서드 자체는 주로 None을 반환

      inplace=False : 보통 기본값, 원본 객체는 그대로 유지, 변경된 내용이 담긴 새로운 객체를 반환

데이터 불러오기 및 기본 탐색

  • 파일 불러오기
    • CSV: pd.read_csv('파일경로/파일명.csv', encoding='utf-8', index_col=0, sep=',')
    • Excel: pd.read_excel('파일명.xlsx', sheet_name='Sheet1')
    • 온라인 데이터: pd.read_csv(url) (예: 타이타닉 데이터셋)
  • 데이터 미리보기
    • df.head(n): 상위 n행 (기본 5행)
    • df.tail(n): 하위 n행 (기본 5행)
  • 데이터 전체 정보
    • df.info(): 총 행/컬럼 수, 데이터 타입, 결측치 개수, 메모리 사용량 확인
  • 기본 통계
    • df.describe(): 숫자형 데이터의 기본 통계량 확인

데이터 선택 및 필터링

  • 속성 vs. 메서드
    • 속성: 객체의 정보/특성 (.shape, .columns), 괄호 () 없이 사용
    • 메서드: 객체의 동작/기능 (.head(), .describe()), 괄호 () 와 함께 사용
  • 컬럼 선택
    • 단일: df['컬럼명'] (Series 반환)
    • 여러: df[['컬럼1', '컬럼2']] (DataFrame 반환)
    • 순서 변경: df[['새순서_컬럼1', '새순서_컬럼2']]
  • 행 선택
    • loc[라벨] (라벨 기반): df.loc[0], df.loc[0:4, ['Name', 'Age']] (끝 포함)
    • iloc[위치] (위치 기반): df.iloc[0], df.iloc[0:5, [3, 4, 5]] (끝 미포함)
  • 조건부 선택 (Boolean 인덱싱)
    • 단일 조건: df[df['컬럼명'] == '값']
    • 복합 조건: df[(조건1) & (조건2)] (AND는 &, OR는 |, 조건 괄호 필수)
    • 여러 값 중 일치: df[df['컬럼명'].isin([값1, 값2])]
    • isin(): '이 목록 안에 포함되니?' 포함되면 True, 아니면 False를 반환
    • 결측치 아닌 데이터: df[df['컬럼명'].notna()] (또는 ~df['컬럼명'].isna())

      *isna() (또는 isnull()): '결측치니?' 결측치면 True, 아니면 False를 반환

      *notna() (또는 notnull()): '결측치가 아니니?' 결측치가 아니면 True, 결측치면 False를 반환

  • 인덱스 관리
    • df.reset_index(): 인덱스를 초기화하고 컬럼으로 만듦
    • df.set_index('컬럼명'): 특정 컬럼을 인덱스로 설정

데이터 변경 및 생성

  • 새로운 컬럼 생성
    • 기존 컬럼 조합: df['새컬럼'] = df['컬럼1'] + df['컬럼2']
    • 예시: titanic['Family_Size'] = titanic['SibSp'] + titanic['Parch'] + 1
  • 조건부 컬럼 생성 (np.where())
    • df['새컬럼'] = np.where(조건, True일_때_값, False일_때_값)
    • 예시: titanic['Is_Adult'] = np.where(titanic['Age'] >= 18, 'Adult', 'Child')
  • 데이터 정렬 (.sort_values())
    • 단일 컬럼: df.sort_values('컬럼명', ascending=False) (내림차순)
    • 여러 컬럼: df.sort_values(['컬럼1', '컬럼2'], ascending=[True, False])

대표적인 메서드

조회 및 탐색head(), tail(), describe(), info()
데이터 선택 및 필터링loc[], iloc[], query(), filter()
데이터 조작 및 변형append(), drop(), rename(), melt(), pivot()
정렬 및 그룹화sort_values(), sort_index(), groupby()
결합 및 병합concat(), merge(), join()
결측치 처리isnull(), notnull(), fillna(), dropna()
통계 및 계산mean(), median(), sum(), std(), corr()
변형 및 재구성pivot(), pivot_table(), stack(), unstack()
시계열 데이터 처리resample(), asfreq(), rolling()

데이터 전처리 시각화 라이브 세션 2회차 정리

기초 통계 분석

  • describe() 메서드
    • 데이터의 분포와 중심 경향을 한눈에 파악하는 핵심 메서드
    • 평균, 표준편차, 최솟값, 최댓값, 사분위수 등을 제공하여 데이터의 전체적인 모습 빠르게 이해 가능
    • 숫자형 변수 분석
      • mean (평균)과 50% (중간값)를 비교하여 분포의 치우침을 파악
      • std (표준편차)로 데이터의 퍼짐 정도를 확인
      • min (최솟값)과 max (최댓값)으로 데이터 범위를 확인
      • percentiles 옵션으로 90%, 95% 등 상세 백분위수를 추가하여 이상치 존재를 더 정확히 파악
    • 범주형 변수 포함 분석: describe(include='all') 사용 시, count (결측치 아닌 개수), unique (고유한 값 개수), top (최빈값), freq (최빈값 빈도)를 제공
  • value_counts()를 활용한 범주형 데이터 분석
    • 각 범주형 값의 빈도(개수)를 확인
    • normalize=True 옵션으로 각 범주의 비율 함께 확인 가능
    • 단순히 개수만 보지 않고 비율을 함께 확인하는 것이 중요, 범주 간 불균형이 심한 경우 분석 방법을 조정해야 할 수 있음‼️

결측치 처리 마스터하기

  • 결측치란?
    • 데이터에서 값이 없거나 누락된 상태, 데이터 전처리의 핵심 단계
    • 발생 원인: 데이터 수집 문제, 입력 실수, 시스템적 결측, 의도적 결측 등
  • 결측치 탐색
    • df.isnull().sum(): 컬럼별 결측치 개수를 확인
    • (df.isnull().sum() / len(df) * 100).round(2): 컬럼별 결측치 비율을 계산하여 중요도를 파악
  • 결측치 제거 (dropna())
    • 행 삭제: df.dropna(): 하나라도 결측치가 있는 행을 모두 삭제
      • 사용 시기: 결측치 비율 5% 미만, 완전 무작위 패턴, 충분한 데이터가 남을 때
      • 주의: 많은 데이터 손실 가능성 있음
    • 컬럼 삭제: df.dropna(axis=1): 결측치가 있는 컬럼을 삭제
      • 사용 시기: 결측치 비율 50% 이상, 분석에 중요하지 않은 컬럼, 다른 변수로 대체 가능한 경우
    • 특정 컬럼의 결측치만 있는 행 삭제: df.dropna(subset=['컬럼명']) (예: Age)
  • 결측치 대체 (fillna())
    • 대체 전략 선택 가이드
      • 평균값: 정규분포에 가까운 연속형 변수
      • 중위수: 이상치가 많거나 치우친 분포 (이상치에 덜 민감, 안정적)
      • 최빈값: 범주형 변수
      • 특정값: 비즈니스 로직상 의미 있는 값
      • 예측값: 다른 변수들로 예측한 값
    • 평균/중위수 대체 예시 (Age): df['컬럼'].fillna(df['컬럼'].mean()) 또는 .median()
      • 평균값 대체 장점: 전체 평균에 영향 없음. 단점: 분산이 줄어들어 다양성 감소
    • 최빈값 대체 예시 (Embarked): df['컬럼'].fillna(df['컬럼'].mode()[0]). (mode()는 Series를 반환하므로 첫 번째 값 [0]을 선택)
    • 고급 대체 기법
      • Forward Fill (ffill): df.fillna(method='ffill') - 이전 행의 값으로 채움 (시계열 데이터에 적합)
      • 선형 보간법 (interpolate()): df.interpolate() - 앞뒤 값의 평균으로 채움 )연속적인 변화가 예상되는 데이터에 적합, 급격한 변화 피할 수 있음)
profile
안녕하세요 백민입니다:)

0개의 댓글