📘 Tech Learning/Pandas

📘 [Tech/Pandas] 빅데이터분석기사 - 작업형#1 정리

혜덕hyeduck 2024. 6. 18. 23:58

※ 본 게시물은 인프런 강의 퇴근후딴짓 빅분기 실기 강의 내용을 토대로 정리했습니다.

 

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3) 강의 | 퇴근후딴짓 - 인프런

퇴근후딴짓 | 비전공자, 입문자가 빅데이터 분석기사 실기를 빠르게 취득할 수 있도록 안내해드려요! 꼭 필요한 파이썬, 판다스, 머신러닝을 다루고 있어요!, ❤️공지❤️ 7회 기출 유형 업데이

www.inflearn.com

 

라이브러리 & 데이터 불러오기

라이브러리 불러오기

import panadas as pd
import numpy as np

데이터 불러오기 & 변수에 담기

  • pd.read_csv()
df = pd.read_csv('파일명.csv')

데이터 샘플링 확인

  • 데이터프레임.head(), 데이터프레임.tail()
df.head() # 앞에서부터(기본 5개)
df.tail() # 뒤에서부터 

 

데이터 프레임과 시리즈

시리즈 만들기

  • pd.Series([리스트])
menu = pd.Series(['A', 'B', 'C'])

데이터 프레임 만들기

  • pd.DataFrame({”컬럼명” : 데이터})
df = pd.DataFrame(
	{
		'menu' : menu,
		'price' : [1000, 2000, 3000],
	}
)

시리즈 선택(열/칼럼 선택)

df['칼렴명']

특정 열의 데이터 프레임 선택

df[['칼럼명']]

데이터 프레임 type 확인

type('데이터프레임 명')

시리즈 type 확인

type(df['칼럼명'])

 

탐색적 데이터 분석

데이터 프레임 크기 확인

df.shape #(행크기, 열크기)
df.shape[0] #행크기
df.shape[1] #열크기

칼럼 타입 확인

df.info()

기초 통계 확인 : 숫자타입

df.describe()

기초 통계 확인 : object 타입

  • count : 데이터 개수
  • unique : 고유값 수
  • top : 가장 많이 등장하는 값
  • freq : 전체 데이터에서 top에 나온 value 개수
df.describe(include='O')

상관관계

  • 코랩에서는 numeric_only=True 추가해야함 (시험에서는 X)
  • 칼럼들간 상관 계수 계산
    • 1 : 양
    • -1 : 음
    • 0 : 관계 없음
df.corr()
# 코랩 pandas에서는..
df.corr(numeric_only = True)

항목 종류 개수

  • 데이터 프레임, 시리즈(특정 칼럼)의 고유 값 개수카운트
df.nunique()
df['칼럼명'].nunique()

항목 종류

  • 시리즈(특정 칼럼)의 고유 값들 반환 ex)sedan, suv…
df['칼럼명'].unique()

항목별 개수 카운트

  • 시리즈(특정 칼럼)의 고유 값 빈도수 계산
  • 즉, 각 항목이 몇 개씩인지 보여줌 ex) sedan 7, suv 9….
df['칼럼명'].value_counts()

 

자료형 변환 

자료형 변환

  • 만약 할인율 칼럼이 object 타입인데, float 타입으로 변환하고 싶다면
    df['할인율'] = df['할인율'].astype('float')
  • 이때 다시 칼럼에 대입해주지 않으면 원본 데이터프레임에 반영 안 됨!!!

 

새로운 칼럼 추가

새로운 칼럼 추가

  • 만약 가격에 할인율을 반영한 할인가 칼럼을 추가하고 싶다면
    df['할인가'] = df['가격'] * (1 - df['할인율'])
  • 만약 결측값을 대입한 원두 칼럼을 추가하고 싶다면
    import numpy as np
    df['원두'] = np.nan

데이터 삭제

칼럼(열) 삭제 : axis = 1

  • 역시나 원본 데이터프레임에 반영하고 싶다면 대입해야함
df = df.drop('칼럼명', axis = 1)

데이터(행) 삭제 : axis = 0

df = df.drop('칼럼명', axis = 0)

 

CSV 저장하기

  • csv파일로 저장
    데이터프레임명.to_csv('파일명.csv', index=False)
  • csv파일 불러오기
    df = pd.read_csv('파일명.csv')

 

인덱싱 / 슬라이싱 / 데이터, 값 추가 / 소팅 / 인덱스 새로 만들기

loc : 인덱스명, 칼럼명

  • 특정 행 전체 조회
df.loc[인덱스명]
  • 특정 칼럼 전체 조회
df.loc[:, '칼럼명']
  • index명이 1인 카페라떼의 가격 칼럼 값 조회
df.loc[1, '가격']
  • index명이 2인 카페모카의 메뉴부터 가격칼럼까지 값 조회
df.loc[2, '메뉴' : '가격']
  • index명이 2인 카페모카의 메뉴칼럼과 칼로리칼럼 값 조회
df.loc[2, ['메뉴', '칼로리']]

iloc : 인덱스 번호, 칼럼 번호

  • 특정 행 전체 조회
df.iloc[인덱스 번호]
  • 특정 칼럼 전체 조회
df.iloc[:, 칼럼 번호]
  • index가 0인 카페모카의 메뉴(인덱스0)부터 가격(인덱스1)조회
df.iloc[0, 0:2]
  • index가 0인 카페모카부터 인덱스가 2인 카페라떼까지 전체 데이터 조회
df.iloc[0:3, :]
df.iloc[0:3]

응용(값/데이터 추가)

  • index번호가 0인 아메리카노의 원두 칼럼 값에 콜롬비아 값 추가
df.loc[0, '원두'] = '콜롬비아'
  • 리스트 형태로 데이터 추가
    • 인덱스가 시즌인 데이터를 추가해보자
    df.loc['시즌'] = ['크리스마스 라떼', 6000, 0, 500, '한국']
    
  • 딕셔너리 형태로 데이터 추가
    • 인덱스가 10인 데이터를 추가해보자
    df.loc[10] = {
        '메뉴' : '페퍼민트 차',
        '가격' : 4500,
        '할인율' : 0,
    }
    
    • 따로 적어주지 않은 칼럼 값은 결측값 NaN으로 채워짐

소팅

  • 인덱스 기준 오름차순 정렬 : sort_index()
df.sort_index(ascending = True)
  • 특정 칼럼 기준 오름차순 정렬 : sort_values
df.sort_values('칼럼명', ascending = True)
  • 여러 칼럼 기준 정렬
df.sort_values(['칼럼명1', '칼럼명2'], ascending = [False, True])

인덱스 새로 만들기

  • 만약 기존 인덱스를 삭제하고 새로운 정수 인덱스를 만든다면 drop = True
df.reset_index(drop = True)

 

조건필터

조건 1개

  • 할인율 0.2보다 큰 데이터만 조회
cond = df['할인율'] > 0.2
df[cond]

조건 여러개

  • AND (&)
    • 할인율이 0.2이상이고, 칼로리가 200미만
    cond1 = df['할인율'] >= 0.2
    cond2 = df['칼로리'] < 200
    
    df[cond1 & cond2]
    
  • OR (|)
    • 할인율이 0.2이상 또는 칼로리가 200미만
    cond1 = df['할인율'] >= 0.2
    cond2 = df['칼로리'] < 200
    
    df[cond1 | cond2]
    

 

결측치

칼럼별 결측치 확인

df.isnull().sum()

결측값 채우기

  • 특정 칼럼의 결측치 채우기
    df['칼럼명'].fillna(채우려는 값)
  • 모든 결측치 채우기
    • 단 주의할 점은 칼럼마다 타입이 다를 경우 구분해서 채울 것
    df.fillna(채우려는 값 )
    

 

결측치 있는 행 제거

df.dropna(axis = 0)

특정 칼럼의 결측치가 있는 행 삭제

df.dropna(subset=['칼럼'])

결측치를 뒤/앞의 값으로 대체하기 : method=bfill/ffill

df.fillna(method = 'bfill')
df.fillna(method = 'ffill')

 

값 변경

변경 방법 1 → replace

  • 변수에 넣어줘야 원본 데이터 프레임에 반영
df = df.replace(변경전 값1, 변경후 값1).replace(변경전 값2, 변경후 값2)

변경 방법 2 → 딕셔너리 + replace

  • 변수에 넣어줘야 원본 데이터 프레임에 반영
change = {
	변경전 값 : 변경후 값,
	변경전 값 : 변경후 값,
}

df = df.replace(change)

변경 방법 3 → loc

  • 특정 데이터의 특정 칼럼 값 변경
    df.loc[변경할 칼럼 인덱스 이름, '변경하려는 칼럼명'] = 변경후 값
  • 모든 데이터의 특정 칼럼 값 변경
    df.loc[:, '원두'] = '코스타리'

내장함수

count(axis = 0또는 1) : 각 칼럼마다 결측값 제외한 요소 개수

  • axis = 0 → 각 칼럼마다 결측값 제외한 요소 개수(행 개수)
    df.count(axis = 0)
  • axis = 1 → 각 행마다 결측값 제외한 요소 개수(열 개수)
    df.count(axis = 1)
     

len() : 데이터 수 조회 cf) shape[0]

len(df)

max() : 최대값

df['가격'].max()

min() : 최소값

df['가격'].min()

mean() : 평균

df['기격'].mean()

median() : 중앙값

df['기격'].median()

sum() : 합계

df['기격'].sum()

std() : 표준편차

df['기격'].std()

var() : 분산

df['기격'].var()

skew() : 왜도

df['기격'].skew()

kurt() : 첨도

df['기격'].kurt()

describe() : 백분위수

df['기격'].describe()

quantile() : 상위 ~%값

  • 하위 25% 값
    df['기격'].quantile(.25)
  • 상위 25% 값
    df['기격'].quantile(.75
  • 하위 25% 데이터
    cond = df['가격'] < df['기격'].quantile(.25)
    df[cond]
     

mode() : 최빈값

df['원두'].mode()[0]

 

apply 함수

  • 칼로리가 300이상이면 NO, 미만이면 YES를 반환하는 함수 생성 → 먹어도될까요 칼럼 추가
def cal(x): 
	if x >= 300:
		return 'NO'
	else:
		return "YES"
		
df['먹어도될까요'] = df['칼로리'].apply(cal)

 

그룹핑

  • groupby(’칼럼명’)
  • 원두 칼럼 기준 평균
    • 코랩에서 판다스 버전이 업데이트되어 일부 함수에 numeric_only=True 를 설정
      • 시험 환경은 불필요
df.groupby('원두').mean(numeric_only = True)
  • 원두와 할인율 칼럼 기준 평균
df.groupby(['원두', '할인율']).mean()
  • 원두와 할인율 칼럼 기준 가격의 평균
    • 만약 결과값을 데이터 프레임 형태로 나타내려면 pd.DataFrame()으로 감싸기
df.groupby(['원두', '할인율'])['가격'].mean()
  • 그룹화한 것을 인덱스 1개 형태로 리셋
df.groupby('가격').mean().reset_index(drop=True)

 

시계열 데이터(Datetime cf) to_datetime)

DateTime 형식으로 변환하기

  • pd.to_datetime(df[’변환할 칼럼 명’], format = “원래 데이터 형식”)
#'17-Feb-2024' 형태의 데이터를 datetime으로 변환하기
df['Date'] = df.to_datetime(df['Date'], format = "%d-%b-%Y")

알아두면 좋을 형식 지정자

  • %Y : 4자리 연도
  • %y : 2자리 연도
  • %m : 2자리 월
  • %B : 전체 월 이름 ex) January
  • %b : 약어 월 이름 ex) Jan
  • %d : 2자리 일
  • %H : 24시간 형식에서 2자리 시간
  • %I : 12시가 형식에서 2자리 시간
  • %M : 2자리 분
  • %S : 두자리 초
  • %p : AM 또는 PM

년, 월, 일, 시간, 분, 초 추출하기

  • 추출한 값들을 새로운 칼럼에 담아보자
df['year'] = df['Date'].dt.year
df['month'] = df['Date'].dt.month
df['day'] = df['Date'].dt.day
df['hour'] = df['Date'].dt.hour
df['minute'] = df['Date'].dt.minute
df['second'] = df['Date'].dt.second

요일 조회

  • dayofweek
    • 결과값 0~6, 순서대로 월~일
  • 주말이면 True인 칼럼 생성
df['is주말'] = df['Date'].dt.dayofweek >= 5

[참고] 기간

  • to_period() : 시간 간격을 주기로 변환 ex) 월별 매출 조회시 유용
df['Date'].dt.to_period('Y')
df['Date'].dt.to_period('Q') #분기
df['Date'].dt.to_period('M')
df['Date'].dt.to_period('W') #주
df['Date'].dt.to_period('D')
df['Date'].dt.to_period('H')
df['Date'].dt.to_period('T') #분
df['Date'].dt.to_period('S')

 

시계열 데이터(Timedelta)

100일째 되는 날 조회

day = pd.Timedelta(days = 99)
df['100일째'] = df['Date'] + day

3주, 3일, 3시간, 3분, 3초 이전과 이후

diff = pd.Timedelta(weeks = 3, days = 3, hours = 3, minutes = 3, seconds = 3)
df['-diff'] = df['Date'] - diff
df['+diff'] = df['Date'] + diff

기간을 초로 변환 : total_seconds()

df['Date'].dt.total_seconds()
  • 그냥 dt.seconds는 전체 초를 셀 수 없음!

 

문자열

데이터의 일부분 변경시 : str.replace()

df['메뉴'] = df['메뉴'].str.replace('스무디', '에이드')

어절 나누기 : str.split()

df['메뉴'].str.split()
  • 어절 나눈 후 첫 번째값 조회시
    df['new'] = df['메뉴'].str.split().str[0]
     

특정 문자 찾기 : str.contains()

df['메뉴'].str.contains('딸기')

특정 값/단어가 있는 지 확인 : isin()

  • 특정 값 유무 조회
menu = pd.Series(['딸기 스무디', '사과', '바나나'])

menu.isin(['딸기 스무디', '바나나'])
  • 특정 단어 유무 조회
menu = pd.Series(['딸기 스무디', '사과', '바나나'])

menu.str.contains('딸기')

문자 길이 : len()

df['메뉴'].str.len()

대문자 / 소문자 변경 : upper(), lower()

df['메뉴'].str.upper()
df['메뉴'].str.lower()

데이터의 일부분만 슬라이싱 해서 조회

  • 년도만 조회
df['날짜'].str[:4]

 

sum vs len

  • len() : 객체의 길이나 크기 반환
  • sum() : 숫자로 구성된 iterable의 합계 계산
    • 만약 조건에 맞는 데이터 수를 조회하고 싶다면(True, false), sum을 사용하는게 용이
  • 나이가 25세보다 큰 데이터 조회
cond = df['나이'] > 25
sum(cond)
len(df[cond])