22.10.24 - 데이터분석(데이터전처리)(1)

LaMelo·2022년 10월 24일
0

jupyter

목록 보기
23/29
post-thumbnail

계층 색인

  • 행, 열의 각 축에 대해 다중 단계(계층)를 지정하여 데이터에 차원을 설정

  • 인덱스에 다차원 리스트를 전달하면 계층 색인을 지정할 수 있음

  • 데이터 구조를 재배열하거나 pivot 테이블과 같은 그룹 기반 작업에 유용

  • 재배열 메서드

    • stack() : 컬럼을 로우로 피벗
    • unstack() : 로우를 컬럼으로 피벗
  • Series 인덱스에 다차원 리스트(아이템 2개)를 전달하려면

    • 다차원리스트[0] : 상위계층
      • 상위계층 작성시 주의점 : 각 계층별로 속하는 하위계층 값의 개수만큼 계층명 작성
      • 상위계층 리스트 개수 = 하위계층 리스트 개수
    • 다차원리스트[1] : 하위계층
  • 로우 인덱스 - 상위계층 : a, b, c, d
    하위계층 : a(1, 2, 3), b(1, 2), c(1, 2, 3, 4), d(1)
    인 시리즈를 만들어보자.

    • 인덱스 확인 (s1.index)
    • 상위 인덱스(상위 계층)에 접근
      • 계층 색인이 적용된 객체에 상위 인덱스에 접근 : 일반적인 Series 인덱싱으로 접근
      • 계층 색인에 대한 슬라이싱 : 마지막 인덱스도 포함('b':'d'로 입력시 b,c,d 조회)
      • 하위계층에 접근
        • a, b, c, d에서 하위계층 라벨번호 2인 데이터만 조회
        • 데이터[상위계층범위, 하위계층번호]
      • 하위계층 슬라이싱
        • 일반 슬라이싱 문법과 loc 슬라이싱의 출력 비교
  • unstack() : 로우가 2개인데 이 중 최하위(기본동작)에 있는 로우 계층을 컬럼으로 적용하여 위로 올림

    • Series 객체를 DataFrame으로 재배열할 수 있음
    • NaN : 기존에 없던 로우 계층에 대한 값
    • stack 메서드 : unstack()과 반대 개념으로
      • 컬럼에 있던 값을, 멀티 인덱스의 하위 인덱스로 내려서 재배열하게 된다.
      • DataFrame을 다시 Series()로 바꿔줄때 사용.
  • 예제

    • 다음 구조의 DataFrame을 생성해봅시다.
      • 로우 인덱스 : 상위(2017, 2018) / 하위(모든 상위 인덱스에 대해 동일하게 'a', 'b')
      • 컬럼 인덱스 : 상위(서울, 경기) / 하위(서울-강남, 잠실 / 경기-분당, 수원, 판교)
      • 구조 및 자료 : 4 x 5 배열로 1씩 증가하는 20개의 데이터
      • 서울 데이터를 조회해봅시다.
        • 서울 데이터 중 강남의 데이터를 조회해봅시다.
        • 참고 : 한번에 조회하고 싶다면 튜플로 전달하면 됩니다.
      • 로우의 상위계층에 접근해봅시다.
        • 2017년 데이터 조회
        • 그 중 'a'데이터에 접근
    • 분당 ~ 수원까지 데이터 조회
      - 주의점 : 데이터프레임 컬럼은 로우 슬라이싱 결과에 대해서만 슬라이싱 적용 가능
      - df['경기']['분당':'수원'] -> Error(컬럼 슬라이싱은 단독으로 불가능)
      (df['경기'].loc[:,('분당','수원')]도 가능)
  • 계층의 인덱스번호 또는 라벨을 사용하여 상 하위간 교환

    • swaplevel(key1, key2, axis=0(기본값))
      • axis가 0인 경우 row의 상하위개념이 뒤집힌다.
      • axis = 1 인 경우 컬럼의 위치가 바뀐다.

정렬

  • obj.sort_index() : 인덱스를 기준으로 정렬 (기본값은 ascending=True, 오름차순 정렬)

    • DataFrame, Series
      • axis = 0 : 기본값, 로우 인덱스 기준으로 정렬
      • axis = 1 : 컬럼 인덱스 기준으로 정렬
  • obj.sort_values() : 값을 기준으로 정렬

    • DataFrame, Series
      • by : 정렬의 기준이 되는 인덱스 값 전달
      • axis = 0 : 기본값, 컬럼을 기준으로 로우 인덱스를 정렬하며 기준값으로 by에 인덱스 컬럼 레벨 또는 컬럼명 전달
      • axis = 1 : 로우 인덱스를 기준으로 컬럼 라벨을 정렬하며 기준값으로 by에 레벨 또는 라벨명 전달
  • Series 생성 및 여러 정렬을 시행해보자.

    • 인덱스 기준 오름차순과 내림차순

    • 값 기준 오름차순과 내림차순

    • 일시적인 변경이므로 s1 자체에는 영향 없음

  • DataFrame의 정렬

    • DataFrame 생성

      • 4X5 무작위 정수
      • 로우/컬럼 인덱스도 순서가 없는 값 지정
      • (1) 로우 인덱스 오름차순, 내림차순
        (2) 컬럼 인덱스 오름차순, 내림차순
    • 로우/컬럼 오름/내림차순 활용

      • 컬럼 기준으로 내림차순 정렬 후, 로우 기준으로 오름차순 정렬
      • 이런 활용들에도 원본에는 변화가 없다.
    • 기준을 정한 정렬

      • sort_values(axis=0, by='기준컬럼이름') : 기본동작(정렬결과를 로우에 반영)
      • 컬럼 D의 값을 기준으로 오름차순 정렬
      • 활용 : 컬럼 A를 기준으로 내림차순 정렬
    • 인덱스라벨(로우) c의 값을 오름차순으로 정렬

      • 결과적으로 정렬되는 대상 : 컬럼
      • 정렬의 기준 : 로우 레이블
    • 로우 'e'의 값을 기준으로 내림차순 정렬

  • 두 개의 컬럼에 대해서 정렬 : 리스트로 묶어서 by의 인자값으로 전달

    • 정렬 우선순위 : 차례대로 1순위 > 2순위 (1순위 동점시 2순위로 넘어감)
    • 1순위 정렬 후 1순위 컬럼의 동점값에 대해 2순위 컬럼의 값이 재정렬
    • 동일한 값이 아니라면 무조건 1순위 컬럼이 우선
    • e는 오름차순, c는 내림차순으로 하고 싶다면
      • ascending=[True, False]와 같이 각각의 기준에 대해서 ascending을 따로 지정해준다.

연습문제

1. 아래의 데이터프레임을 생성하세요

  • 학생들의 점수는 50 이상 100 미만의 무작위 정수 값을 생성하여 사용

  • (1) 데이터프레임 생성

    • 로우 인덱스 이름 설정
    • 컬럼 인덱스 이름 설정(리스트로 넘김)
      • 멀티인덱스는 df.columns.set_names 로 세팅이 가능하다.
      • 튜플 형태로 넣는 것도 가능하긴 하다.
      • df.columns.names = '카테고리1', '카테고리2', ...
  • (2) 2016년 데이터만 별도의 데이터프레임으로 분리 저장하세요.(깊은 복사)

    • df2[2016] -> 이렇게만 써도 깊은 복사
  • (3) 2016년 데이터에 대해 학생 이름을 기준으로 오름차순 정렬하세요.

  • (4) 2016년 데이터의 과목별 점수에 대하여 영어 점수가 높은 순서로 정렬하고, 영어 점수 동점자의 경우 수학 점수가 낮은 순서로 정렬

데이터 합치기

  • merge

    • pandas 객체의 메서드로 pandas.merge(df1, df2 ...)로 사용
    • 두 개의 데이터프레임에 대해 특정 컬럼을 기준으로 합치기
    • 주요 파라미터
      • how : 합치는 방식으로 inner(기본값), left, right, outer 방식 존재
      • on : 합치는 기준으로 두 개의 데이터프레임에 공통으로 존재하는 컬럼명을 사용해야함 (기본값=None)
  • 고객 데이터 생성

    • 딕셔너리 타입으로 데이터프레임 데이터 생성 : key:col, value-> list():row

      • df1 : 고객번호, 고객이름 / df2 : 고객번호, 주문량
    • inner merge (교집합)

      • 가장 기본적인 merge 방식 : 공통 컬럼을 기준으로 두 df에 모두 존재하는 교집합만 추출 (기본 동작 : how = 'inner')
    • outer merge (합집합)

      • 교집합이 아닌 부분에 대해서는 NaN으로 처리(누락X)
    • left : 첫 번째로 전달한 데이터 프레임의 자료는 모두 살리고, 두 번째에서 교집합만

    • right : 두 번째로 전달한 데이터 프레임의 자료는 모두 살리고, 첫 번째에서 교집합만

  • 공통 컬럼이 두 개 이상인 경우

    • 공통된 이름을 가진 컬럼이 두 개 이상인 경우 파라미터가 없으면 결과도 없다.
      • inner merge
      • on 파라미터 : 공통된 컬럼이 여럿인 경우 결합 기준 컬럼을 지정
      • 합칠때 key로 사용할 컬럼 : '고객명'
      • 공통컬럼 결과 : 고객명, 정보 -> 정보 컬럼 결과를 확인
      • 만약에 겹치는 컬럼명이 없을 경우 에러를 출력하게 된다.
    • left_on, right_on : 두 개의 데이터프레임에 대해서 서로 다른 기준컬럼을 지정
      • 예) 동일한 속성의 자료를 저장하는 컬럼인데 표기하는 이름이 다른 경우
      • 고객이름, 날짜, 구매금액을 저장하고 있는 데이터프레임 생성
        • 이럴 경우 두 컬럼 다 출력 후 지우는 방식으로 가는게 편하다.
        • left(df5), right(df6)에서 공통컬럼명을 각각 지정
        • drop()함수 사용

concat

  • 특정 key를 기준으로 데이터를 합치는 것이 아니라 행, 열 기준으로 데이터를 연결

  • 주요 파라미터

    • axis : 0 / 행 방향(기본값)이며 컬럼을 key로 합치고, 1 / 열 방향으로 로우를 key로 합침
    • join : 데이터프레임끼리 연결할 때 합치는 방법으로 outer(기본값), inner 방식 존재
    • ignore_index : 합친 후 기존 인덱스를 유지 또는 새로운 인덱스를 지정
  • 공통 인덱스 라벨을 가지는 Series 2개 생성

    • 두 Series 간 연결
      • 기본 : axis = 0 (행 방향으로 연결)
      • 첫 번째로 전달된 객체가 위에, 두 번째로 전달된 객체가 아래로 추가(연결)
      • 인덱스 라벨은 기존 값 유지
        • 새로운 인덱스로 초기화하기
    • 열 방향 연결
      • 두 개의 Series를 연결해서 하나의 DataFrame화 시키기
      • 로우의 길이가 다른 경우 활용 가능하다.
  • 연결한 시리즈를 활용

    • 열 이름을 설정하면서 붙여주기
      • keys 파라미터에 컬럼명을 리스트로 전달
  • 예제

    • 두 개의 데이터프레임 연결
      • 행방향 병합, 열방향 병합

집계

  • groupby(컬럼명)

    • 특정 속성을 기준으로 묶어서 다양한 집계 함수 적용
    • 대표적인 집계 함수
      • sum : 총합
      • mean : 평균값
      • min : 최소값
      • max : 최대값
      • count : 개수
      • std : 표준편차
  • pivot table

    • df.pivot(로우로 사용될 컬럼명, 컬럼으로 사용될 컬럼명, 튜플을 구성하는 값으로 사용될 컬럼명, 집계함수)
    • 일차원으로 컬럼 및 로우가 단순 나열된 형식은 데이터를 파악하는데 적합하지 않기 때문에 pivot을 통해 계층 색인 및 형태 변경을 수행
  • 엑셀 자료를 pandas로 불러옵니다.

    • 서울과 부산의 각 구 인구에 대한 가상 자료 입니다.


      - 상위 5개 / 하위 5개 조회
    • 자치구별 남, 여 인구 각각의 총합
    • 도시별 남여 인구 각각의 총합
    • 연도별, 도시별 남여 인구의 총합
    • 도시, 연도별 총인구 평균을 구해주세요.
    • 데이터 파악에 용이한 구조로 변경

통계

  • 주요 통계 함수

    • value_count() : 각 고유값의 중복개수
    • count : NaN 값을 제외한 값의 개수
    • describe : 각 컬럼에 대한 요약통계 계산(count, mean, std, min, 1사분위수, 중위값, 3사분위수, max)
    • min, max : 최소, 최대 값
    • sum : 총 합
    • cumsum : 누적합
    • mean : 평균
    • median : 중위값(전체 데이터를 나열 했을 때 중간에 위치한 값)
    • var : 분산(데이터가 전체적으로 흩어진 정도, 편차제곱의 평균)
    • std : 표준편차 = 분산의 양의 제곱근
  • 주요 파라미터

    • axis : 연산의 기준이 되는 축, axis=0(기본값)이면 행 방향으로 axis=1이면 열 방향으로 적용
    • skipna : NaN 값을 제외할지 여부를 설정, 기본값 = True
  • 샘플 데이터 생성

    • 기술통계, 요약통계
    • 2017년도 성적만분리해서 df2017로 저장(깊은복사)
    • 자료 활용
      • 1) value_counts() : 범주형 데이터(문자열 등)에 대한 각 분류값의 개수 / 빈도수
      • 2) sum() : 해당 컬럼이나 로우의 총합을 계산
      • 3) mean() : 과목별 평균
profile
가즈아~

0개의 댓글