디지털 마케팅 LAB

패스트캠퍼스 데이터분석 부트캠프 4주차_PYTHON (2) 본문

패스트캠퍼스 데이터분석 부트캠프 14기/주차별 학습기록

패스트캠퍼스 데이터분석 부트캠프 4주차_PYTHON (2)

홍보하swu 2024. 5. 17. 16:43
데이터 가공
  • 인덱스
    • 인덱스 변경
      ■  인덱스 몇개를 바꿀 때 - 데이터명.rename({기존 인덱스: 바꿀 인덱스, 기존 인덱스: 바꿀 인덱스, ...})
      ■  인덱스 전체를 바꿀 때 - 데이터명.index = 바꿀 인덱스 리스트
    • 열을 인덱스로 설정
      ■  데이터명.set_index(컬럼명)
    • 인덱스를 열로 변환
      ■  데이터명.reset_index()
      ■  만약 열로 변환된 인덱스를 삭제하고 싶다면 'drop=True' 옵션 추가 ( = 인덱스가 새로 리셋된 결과)
    • 행 추가
      ■  pd.concat([기존 데이터명, 추가할 데이터명])
      df3 = pd.concat([df1, df2])
      df3 = df3.reset_index(drop=True)
      df3

    •  행 제거
      ■  데이터명.drop(제거할 인덱스 명)
      ■  데이터명.drop([제거할 인덱스 범위])
    • 행 중복 제
      ■  데이터명.drop_duplicates()
    • 열 추가
      ■  데이터명[추가할 컬럼] = 추가할 값 리스트 or 시리즈
    • 열 제거
      ■  데이터명.drop(제거할 컬럼, axis=1)
    • 열 이름 변경
      ■  이름 하나를 바꿀 때 - 데이터명.rename({기존 열 이름: 바꿀 이름, 기존 열 이름 : 바꿀 이름, ...})
      ■  이름 전체를 바꿀 때 - 데이터명.columns = 열 이름 리스트

 

  • 결측값 처리
    • 결측값 확인
      ■  isna(): 결측값을 True로 반환
      ■  notna(): 결측값을 False로 반환
    • 결측값 제거
      ■  데이터명.dropna(axis=0, how='any', subset=None)
      ■  axis: {0: index / 1: columns}
      ■  how: {'any' : 존재하면 제거 / 'all' : 모두 결측치면 제거}
      ■  subset: 행/열의 이름을 지정 → 지정된 행/열에서의 결측값 확인
    • 결측값 대치
      ■  데이터 전체 - 데이터명.fillna(대치할 값)
      ■  특정 컬럼 - 컬럼.fillna(대치할 값)
      ■  결측값 바로 위의 값으로 - 이터명.fillna(method='ffill')
      ■  결측값 바로 아래의 값으로 - 이터명.fillna(method='bfill')
  • 타입 변환
    • 컬럼.astype(타입)

 

  • 날짜 다루기
    • 문자형을 날짜형으로 변경
      ■ pd.to_datetime(컬럼, format='날짜 형식')
      형식 설명
      %Y 0을 채운 4자리 연도
      %y 0을 채운 2자리 연도
      %m 0을 채운 월
      %d 0을 채운 일
      %H 0을 채운 시간
      %M 0을 채운 분
      %S 0을 채운 초
    • 날짜를 원하는 형식으로 변경
      ■ 컬럼.dt.strftime('날짜 형식')
    • dt 연산자 변경
      ■ 컬럼.dt.연산자
      연산자 설명
      year 연도
      month
      day
      dayofweek 요일(0-월요일, 6-일요일)
      day_name() 요일을 문자열로
    • 날짜 계산
      ■  day 연산: pd.Timedelta(days=숫자)
      df['minus day1'] = df['Date1'] - pd.Timedelta(days=1)     # 하루 전 날짜
      df['plus day7'] = df['Date1'] + pd.Timedelta(days=7)     # 일주일 후 날짜

      ■  month 연산: pd.DateOffset(months=숫자)
      # month, year 연산을 위해서 offset라이브러리 설치 필요
      from pandas.tseries.offsets import DateOffset

      df['plus month1'] = df['Date1'] + DateOffset(months=1)      # 한달 후 날짜
      df['minus month3'] = df['Date1'] - DateOffset(months=3)      # 세달 전 날짜

      ■  year 연산: pd.DateOffset(years=숫자)
      df['plus year1'] = df['Date1'] + DateOffset(years=1)       # 일년 후 날짜
      df['minus year3'] = df['Date1'] + DateOffset(years=1)       # 삼년 전 날짜
    • 날짜 구간 데이터 만들기
      ■  pd.date_range(start=시작일자, end=종료일자, periods=기간수, freq='주기')
      주기 형식 설명
      D 일별
      W 주별
      M 월별 말일
      MS 월별 시작일
      A 연도별 말일
      AS 연도별 시작일
    • 기간 이동 계산
      ■  컬럼.rolling().집계함수()
      # 7일 이동평균
      ## 지난 7일간의 평균을 구하는 것이기 때문에 1~6일까지의 'ma7' 컬럼은 결측값
      df1['ma7'] = df1['Temp'].rolling(7).mean()
    • 행 이동
      ■  컬럼.shift(이동할 행의 수)
        전날 대비 변화율이 얼마나 되는지 구할 때 많이 사용
      df2['Temp shift1'] = df2['Temp'].shift(1)      # 'temp' 컬럼에서 한개씩 밀린 값을 'shift1'컬럼으로 = 전날의 기온
      df2['pct change'] = (df2['Temp shift1'] - df2['Temp'])/df2['Temp']       # 전일대비 기온 변화율
       
      df2['Temp'].shift(-1).head(10)       # 음수를 넣으면 다음칸의 값을 앞으로 당겨온다. ex) 다음날의 기온
  • 고급 기능
    • apply 함수
      ■  사용자 정의 함수를 데이터에 적용하고 싶을 때 사용
      ■  데이터명.apply(함수, axis=0/1)
      # 예시1
      ## 함수가 열을 참조했기 때문에 axis=1 적용
      def pclass_sibsp(x):
          if x['Pclass'] == 1 and x['SibSp'] == 1:
              return 1
          else:
              return 0
      df1['pclass_sibsp_filter'] = df1.apply(pclass_sibsp, axis=1)
       
      # 예시2
      def adult(x):
          if x >= 19:
              return 1
          elif x < 19:
              return 0
          else:
              return np.nan
      df1['adult_yn'] = df1['Age'].apply(adult)

      ■  간단한 함수는 lambda로 구현 가능
      # 예시1과 같은 함수
      df1['pclass_sibsp_lambda'] = df1.apply(lambda x: 1 if x['Pclass'] == 1 and x['SibSp'] == 1 else 0, axis=1)
       
    • map 함수
      ■  값을 특정 값으로 치환하고 싶을 때 사용
      ■  컬럼.map(매핑 딕셔너리)
      gender_map = {'male':'남자', 'female':'여자'}
      df1['Sex_kr'] = df1['Sex'].map(gender_map)
    • 문자열 함수
      메소드 설명
      컬럼.str.contains(문자열) 문자열을 포함하고 있는지 유무
      컬럼.str.replace(기존문자열, 대치문자열) 문자열 대치
      컬럼.str.split(문자열, expand=True/False, n=개수) 특정 문자열을 기준으로 쪼개기
      컬럼.str.lower() 소문자로 바꾸기
      컬럼.str.upper() 대문자로 바꾸기

 

  • 데이터 결합
    • pd.merge(데이터1, 데이터2, on='기준컬럼', how='결합방법')
      ■  결합 방법에는 4가지가 있다 → 'inner', 'left', 'right', 'outer'
    • 두 데이터의 기준 컬럼명이 다를 경우
      ■  pd.merge(데이터1, 데이터2, left_on='데이터1의 기준컬럼', right_on='데이터2의 기준컬럼', how='결합방법')

 

 

데이터 집계
  • 분포 및 요약 통계
    • describe(): 컬럼별 값의 갯수, 평균, 표준편차, 최솟값, 최댓값, 사분위수를 보여준다.
  • 대푯값
    • 결측값이나 숫자형이 아닌 데이터가 섞인 경우 'numeric_only=True' 옵션 적용
      메소드 설명
      min() 최솟값
      max() 최댓값
      mean() 평균
      median() 중간값
      std() 표준편차
      var() 분산
      quantile() 분위수
  • 변수의 상관관계
    • 상관관계 분석은 두 변수의 관련성을 구하는 분석
    • 두 변수 간의 연관된 정도이지 인과관계를 설명하지 않는다.
    • 상관계수 = 두 변수가 함께 변하는 정도 / 두 변수가 각각 변하는 정도

 

  • 그룹화
    • 같은 값을 한 그룹으로 묶어서 여러 가지 연산 및 통계를 구할 수 있다.
    • 데이터명.groupby(컬럼).연산및통계함수
    • 단일 그룹화
      함수 설명
      count() 행의 갯수
      nunique() 행의 유니크한 갯수
      sum()
      mean() 평균
      min() 최솟값
      max() 최댓값
      std() 표준편차
      var() 분산
    • 다중 그룹화
      # 성별과 객실 등급을 기준으로 그룹으로 묶고 다음 컬럼들의 평균, 최소, 최대값을 일괄적으로 계산 
      df.groupby(['Sex','Pclass'])[['Survived','Age','SibSp','Parch','Fare']].aggregate([np.mean, np.min, np.max])

 

데이터 재구조화
  • crosstab
    • 범주형 데이터를 비교분석할 대 유용
    • 범주별 갯수 구하기
      ■  pd.crosstab(행으로 넣을 컬럼, 열로 넣을 컬럼)
    • 범주별 비율 구하기
      ■  normalize='all' 옵션은 전체 비율의 합이 100%임을 의미
      ■  normalize='index'  옵션은 행별 합이 100%임을 의미

      ■  normalize='columns'  옵션은 열별 합이 100%임을 의미
      ■  margins=True 옵션은 행별/열별 합계를 보여줌
    • 다중 인덱스, 다중 컬럼의 범주표 구하기
      pd.crosstab(index=[df['Sex'], df['Pclass']], columns=[df['Survived'], df['Embarked']], normalize='all')

 

  • 피벗테이블
    • 엑셀의 피벗테이블처럼 인덱스별 컬럼별 값의 연산을 할 수 있다.
    • 단일 인덱스, 단일 컬럼, 단일 값
      # 성별을 인덱스로, 객실등급을 컬럼으로, 평균 생존율을 값으로 갖는 피벗테이블 생성
      pd.pivot_table(df, index='Sex', columns='Pclass', values='Survived', aggfunc='mean')
      ■  margins 옵션을 통해 행과 열 전체의 값도 구할 수 있다.
    • 다중 인덱스, 다중 컬럼, 다중 값
      # 성별과 객실등급을 다중인덱스로, 생존여부와 탑승지를 다중컬럼으로, 평균나이와 평균요금을 값으로 갖는 피벗테이블 생성
      pd.pivot_table(df, index=['Sex','Pclass'], columns=['Survived','Embarked'], values=['Age','Fare'], aggfunc='mean')

 

 

# 성별과 객실등급을 다중인덱스로 하고 요금과 생존여부의 평균, 중앙값, 합계를 값으로 갖는 피벗테이블 생성
pivot = pd.pivot_table(df, index=['Sex','Pclass'], values=['Survived','Fare'], aggfunc=['mean','median','sum'])

  • stack
    • 컬럼 레벨에서 인덱스 레벨로 피벗테이블을 변경
      pivot.stack(0)     # 컬럼의 첫번째 레벨('mean', 'median', 'sum')을 세번째 인덱스로 내림
       
      pivot.stack(1)     # 컬럼의 두번째 레벨('fare', 'survived')을 세번째 인덱스로 내림
  • unstack
    • 인덱스 레벨에서 컬럼 레벨로 피벗테이블을 변경
    • stack의 반대
      pivot.unstack(0)     # 인덱스의 첫번째 레벨('sex')을 세번째 컬럼으로 쌓아 올림
       
      pivot.unstack(1)     # 인덱스의 첫번째 레벨('pclass')을 세번째 컬럼으로 쌓아 올림
  • melt
    • wide dataframe → long dataframe
    • pd.melt(데이터명, id_vars=기준 컬럼)
      data = pd.DataFrame({'name':['a','b','c']
                          , 'order_count':[3,4,10]
                          , 'amount':[10000,25000,300000]})
       
      # 'name' 컬럼을 기준으로 다른 컬럼들의 값들을 나열
      ## key들이 모인 컬럼(var_name)의 이름을 'type'으로, value들이 모인 컬럼(value_name)의 이름을 'val'
      pd.melt(data, id_vars=['name'], var_name='type', value_name='val')