- 드라이브 마운트 하기
from google.colab import drive
drive.mount('/content/drive/')
- 파일 불러오기
df = pd.read_csv("/파일경로)
1. 데이터 불러오기
- Python 라이브러리를 활용하여, 구글 드라이브의 CSV 파일을 DataFrame으로 읽어오는 코드를 작성해주세요.
- 테이블의 행과 열 개수를 확인해주세요.
- 행과 열 개수 세기 : .shape = 행과 열. 각자로는 ([0] : 행, [1] : 열)
- 테이블의 처음 5줄을 확인해주세요.
- 처음 5줄 : .head()
import pandas as pd
df = pd.read_csv("/content/drive/MyDrive/colab notebook/flight_data_homework.csv")
df.shape
df.head()
2. 결측치 처리
- 각 컬럼별 결측치 개수를 구해주세요.
- 결측치 찾기 : .isna()
- 결측치 개수 : .isna().sum()
- 결측치가 있는 행을 모두 제거해주세요.
- 결측치 행 제거 : .dropna() => 할당 해줘야함 (df = df.dropna)
import pandas as pd
df.isna().sum()
df = df.dropna()
3. 조건에 맞는 데이터 추출하기
- 데이터프레임의 Destination 컬럼 기준 price의 평균값과 중앙값을 동시에 구해주세요. 단, 값은 모두 소수점 첫번째 자리까지 표현해주세요.
- .groupby를 먼저하고 기준이 될 (열) 을 작성 후 [구해야 할 조건] 적고 .mean()은 평균, 소수점 1번째까지이므로 .round(1)
- 중앙값은 .median () 그 외는 동일
- 데이터프레임의 Airline, Total_Stops 기준 Route 컬럼을 중복값 없이 추출해주시고, 인덱스를 재정렬해주세요. 이를 df2 라는 dataframe 으로 받아주세요.
- .nunique() : 고유값의 개수를 계산
import pandas as pd
import numpy as np
mean = df.groupby('Destination')['Price'].mean().round(1)
median = df.groupby('Destination')['Price'].median().round(1)
print(mean)
print(median)
df2 = df.groupby(['Airline','Total_Stops'])['Route'].nunique().reset_index()
df2
# df.groupby('Destination')['Price'].agg(['mean','median']).round(1)
# 'Destination'을 기준으로 'Price'를 구하는데 여러개를 집계해야하지깐 .agg함수를 써주고 평균값과 중위값을 구한다음에 소숫접 1번째 자리까지 나타내기
# 평균값 구하기: .mean
# 중위값 구하기: .median
# 최빈값 구하기: .mode
# agg: 다중집계작업을 간결하게 나타내는 것
# https://kbkb456.tistory.com/88
# fillna() 결측치 채워넣는 함수
# 예시: fillna(df3['컬럼].mode()[0]) 컬럼에서의 최빈값을 채워넣어줌
df2 = df.groupby(['Airline','Total_Stops'])['Route'].nunique().reset_index()
df2
# reser_index: 인덱스 재정렬
4. 조건에 맞는 데이터 추출하기2
- 피벗테이블을 구현하여 출발지와 도착지를 기준으로 한 Airline을 카운트해주세요. 그리고, 카운트 값을 기준으로 내림차순 정렬해주세요.
- Airline 컬럼이 Air India 이고, Price 컬럼이 7000 이상인 데이터를 필터링 해주세요.
import pandas as pd
pd.pivot_table(df, index=['Source', 'Destination'], values='Airline', aggfunc='count').sort_values(by='Airline', ascending=False)
df3 = ((df['Airline'] == 'Air India') & (df['Price'] >= 7000))
df[df3]
도전 1. 조건에 맞는 데이터 추출하기3
- Date_of_Journey 기준 수요일에 예약된 경우의 평균 가격을 구해주세요.
- 힌트1: pandas의 to_datetime 함수의 infer_datetime_format(여러 datetime 유명한 포맷 중에서 datetime이 어떤 형식으로 이루어졌는지 확인 후 자동으로 변환)
- 힌트2: 아래 두가지 방식 중 하나를 선택하여 문제를 풀어주세요.
- 1️⃣ dt.day_name() 의 사용
- 2️⃣ rrule 함수의 byweekday property사용
- 함수 사용을 위해, dtstart는 Date_of_Journey 컬럼의 최소값으로 설정해주세요.
- rrule byweekday property는 아래와 같이 사용할 수 있습니다.
#문자열 형식을 활용하지 않을 경우, 라이브러리 import 예시
from dateutil.rrule import rrule, WEEKLY
#문자열 형식을 활용할 경우, 라이브러리 import 예시(월요일, 화요일, 일요일 사용)
from dateutil.rrule import rrule, WEEKLY, MO, TU, SU
월: MO 또는 0
화: TU 또는 1
수: WE 또는 2
목: TH 또는 3
금: FR 또는 4
토: SA 또는 5
일: SU 또는 6
사용법
rrule(~~, byweekday=❓❓❓)
2. 조건에 맞는 데이터 추출하기4
- 출발 시간(Dep_Time) 컬럼을 기준으로 lambda 함수를 활용하여 아침, 오후, 저녁, 밤 비행기로 항공편(Airline)을 분류하고 그 개수를 count 해주세요.
아침: 5시 이상 12시 미만
낮: 12시 이상 18시 미만
오후: 18시 이상 24시 미만
밤: 24시 이상 5시 미만(즉, 위의 세가지가 아닌 경우)
- 힌트1: pandas의 to_datetime 함수의 infer_datetime_format(여러 datetime 유명한 포맷 중에서 datetime이 어떤 형식으로 이루어졌는지 확인 후 자동으로 변환)
- 힌트2
- inline(one-line) if 절 : 코드 가독성을 위해, 한 줄에 if함수를 사용하는 것을 의미합니다.
- 문법
- **if절이 참일 경우 결과값** **if** **조건** **if절이 거짓일 경우 결과값**
- 주의할 점: inline if 절에는 elif 를 사용할 수 없습니다.
라이브러리 정리
- 라이브러리 호출
import pandas as pd (pandas 는 6 글자라서 pd 로 줄여 명령)
import numpy as np
import time
from matplotlib.pyplot as plt
1-2회차 코드 요약
# pandas 라이브러리를 활용한 csv 파일 읽기
df = pd.read_csv("xxxx.csv")
# 테이블 확인하기
display(df, df2, df3)
# 처음 5 줄만 출력하기
#df2.head()
# 마지막 5 줄만 출력하기
#df2.tail()
# 각 테이블의 행(가로) 길이 파악하기
len(df)
# shape: 테이블의 행과 열의 갯수를 반환
df.shape
# dtypes: 테이블 내 컬럼타입(문자형, 숫자형, 배열 등) 확인
df.dtypes
# columns: 테이블 내 컬럼 확인
df.columns
# values: 테이블 내 각 행들을 배열 형태로 확인
df.values
# 테이블 기본 구조 한눈에 확인하기
df.info()
# 전체 행 갯수, 평균, 표준편차, 최솟값, 사분위수, 최댓값 확인
df2.describe()
#컬럼별로 결측치(데이터가 없는) 확인하기
df.isnull().sum()
# 특정 컬럼 1개 가져오기
#방법1: 속성. 사용
df.Category
#방법2: [] 연산자 사용
df['Category']
#방법3: iloc 사용
# : 은 모든 행을 가져오겠다는 의미이며 dataframe 의 인덱스 번호 4번(카테고리)컬럼을 가져오겠다는 희미
df.iloc[:,4]
# 특정 컬럼 여러개 가져오기
#방법1: [[]] 연산자 사용
# []를 하나 사용하면 결과값이 series 형태로 반환되어 key error 가발생되며, [[]] 는 dataframe 으로 반환되어 에러가 나지 않습니다.
df[['Category','Selling Price']]
#방법2: iloc 사용
# : 은 모든 행을 가져오겠다는 의미이며 dataframe 의 인덱스 번호 4번,7번 컬럼을 가져오겠다는 희미
df.iloc[:,[4,7]]
# 특정 컬럼 버리기
# axis=0 은 인덱스 기준, 1은 컬럼 기준 삭제를 의미
# inplace=True 는 원본을 변경하겠다는 의미, False 의 경우 원본테이블은 변경되지 않음
df3.drop('Interaction type', axis=1, inplace=True)
# 조건에 부합하는 데이터 가져오기1
# 조건에 만족하는 행은 정상출력 ,아닌 행은 NaN 으로 반환
df2.where(df2['Age']>50)
# 조건에 부합하는 데이터 가져오기2
# true, false의 개념이 아닌 조건에 부합하는 데이터만 슬라이싱하여 가져오고 싶을 때
# mask 메서드로 불립니다. 이름은 반드시 mask 일 필요가 없습니다.
mask = ((df2['Age']>50) & (df2['Gender']=='Male'))
df2[mask]
# 조건에 부합하는 데이터 가져오기3
# 데이터프레임명[조건] 을 사용하면 조건을 만족하는 행만 필터링됩니다.
df2 = df2[df2['Age']>50]
# 조건에 부합하는 데이터 가져오기4
# loc[]을 활용한 조건 필터링
df2 = df2.loc[df2['Age']>50]
# 데이터 그루핑- 기준 1개
df2.groupby('Gender')['Customer ID'].count()
# 데이터 그루핑- 기준 여러개
df2.groupby(['Gender','Location'])['Customer ID'].count()
# 데이터 count 와 nunique(distinct, 중복제거) 차이
df2.groupby('Location')['Age'].count()
df2.groupby('Location')['Age'].nunique()
3-4회차 코드 요약 (데이터 결합, 피벗테이블)
- MERGE : pandas 의 함수 중 하나로, 공통컬럼을 기준으로 테이블을 병합하여, SQL 구문의 JOIN 과 가장 유사
on: 조건 컬럼이 한개인지 여러개인지
how: 어떤 조인 방식을 사용할 것인지 (inner, outer, left, right)
left on / right on : 열기준 병합 시 기준으로 할 열의 양측 이름이 다르다면, 각각 어떤 열을 기준으로 할 지 지정합니다.
sort: 병합 후 인덱스 정렬 여부(True/False)
suffixes: 중복된 컬럼 이름의 처리
indicator: True 로 할 경우, 마지막 열에 병합 정보를 출력해줍니다.
# 컬럼명이 같은 경우의 예시를 보여주기 위해 컬럼명을 임의로 변경해 줌
df3['Customer ID']=df3['user id']
# 기본 작성구문으로, 디폴트값은 inner join
# 공통컬럼값은 합쳐져 하나의 컬럼으로 출력
merge_df = pd.merge(df2,df3)
# 위 코드와 동일한 기능입니다. on 절을 사용할 수 있어요.
merge_df = pd.merge(df2,df3, how='inner', on='Customer ID')
# 공통컬럼이 2개 이상일 때
merge_df = pd.merge(df2, df3, how='inner', on=['공통컬럼1','공통컬럼2'])
# 기준열 이름이 다를 때
merge_df = pd.merge(df2,df3, how='inner', left_on = 'Customer ID', right_on = 'user id')
# 공통컬럼을 개별로 출력하고 싶을 때
merge_df = pd.merge(df2,df3, how='inner', on='Customer ID', suffixes=('_left','_rihgt'))
- JOIN : pandas 의 함수 중 하나로 Join은 인덱스 기준으로 테이블을 병합합니다. 인덱스 = 축
- ow: 어떤 조인 방식을 사용할 것인지 (inner, outer, left, right)
- lsuffix / rsuffix: 이름이 같은 컬럼이 있을 경우, 문자열 지정하여 부여
- sort: 인덱스 정렬여부(True / False)
# 단순 조인
df2.join(df3)
# join 방식 설정
df2.join(df3, how='right')
# join시 이름이 같은 컬럼이 있을 경우, 옵션으로 설정하여 조인 가능
# 아래 코드는 오류가 남
# df.join(df2)
df.join(df2,how='left', lsuffix='1', rsuffix='2')
# join 이후, 인덱스 정렬하기
df.join(df2,how='left', lsuffix='1', rsuffix='2', sort=True)
- CONCAT : pandas 의 함수 중 하나로, 여러 데이터프레임 또는 시리즈를 특정 축을 따라 연결하는 데 사용
axis: 수직결합인지, 수평결합인지(axis=0: 수직결합**(기본값) / axis=1: 수평결합)
join: 어떤 조인 방식을 사용할 것인지 (inner, outer, left, right)
join_axes : 조인 축 지정
keys: 데이터프레임 축이름 지정
ignore_index=True : 인덱스 재배열
# 기본 작성구문
pd.concat([df2, df3])
# 세로로 결합
pd.concat([df2, df3], axis=0, ignore_index=True, join='inner')
# 가로로 결합
pd.concat([df2, df3], axis=1, ignore_index=True, join='inner')
- APPEND : pandas 의 함수 중 하나. 데이터프레임에 행을 추가하는 메서드로, 두 데이터프레임을 행 기준으로 결합
ignore_index: 기존 인덱스를 사용할지 여부. False로 할 경우 0,1,2,..,n 이 부여
sort : 열을 사전적으로 정렬할 지 여부
# 기능이 없어질 예정으로 아래와 같이 concat 으로 변경하여 실행해주시면 됩니다.
# 에러가 아닌 경고메시지로, 이를 무시하고 싶다면 아래와 같은 코드를 입력해주시면 됩니다.
# import warnings
# warnings.filterwarnings('ignore')
# 단순 결합, 없는 건 NaN으로 처리되고 결합
# df2 가 df 의 아래로 붙음
df.append(df2)
- PIVOT TABLE : 데이터의 열을 기준으로 피벗테이블로 변환시키는 함수.
- index: 인덱스(축) 으로 사용될 열
- columns: 열로 사용될 열
- values: 값으로 사용될 열
INDEX | COLUMNS |
VALUES |
aggfunc: 어떠한 계산을 할 지
- fill_value: NaN 값을 처리하고 싶을 때 사용, fill_value=0 이 가장 많이 사용됨
- dropna: 결측치(na)삭제 여부 결정
- sort: index or columns 기준으로 정렬
# age 라는 축을 기준으로 카테고리별 고객id 카운트
pd.pivot_table(df2, index='Age', columns='Category', values='Customer ID', aggfunc='count')
# age, Category 라는 축을 기준으로 성별 Previous Purchases 최소, 최대값 구하기
pd.pivot_table(df2, index=['Age','Category'],columns='Gender', values='Previous Purchases', aggfunc=['min','max'])
# 성별을 축으로 하고, 사이즈, 나이별 고객id 고유하게 카운트
pd.pivot_table(df2, index=['Gender'],columns=['Size','Age'], values='Customer ID', aggfunc='nunique')
- 그 외 유용한 메서드
# LAMBDA
# lambda 함수를 이용한 홀수 출력하기
mylist = [1, 2, 3, 4, 5]
mylist2 = list(filter(lambda x: x % 2 == 1, mylist))
print(mylist2)
# lambda 함수를 이용한 정렬
mylist = ['apple', 'banana', 'cherry']
mylist2 = sorted(mylist, key=lambda x: len(x))
print(mylist2)
# SPLIT
sep: 문자열을 나눌 구분자 기입
maxsplit: 최대 split 횟수 (디폴트: 모두 다 나눔)
# 예시 문자열 선언
s = "aa.bb.cc.dd.ee.ff.gg"
# '.' 구분자를 기준으로 데이터를 나눔
# 아래 두 코드 결과 동일
s.split('.')
s.split(sep='.')
# df 에 x 컬럼추가
df2['x']="aa.bb.cc.dd.ee.ff.gg"
# '.' 구분자를 기준으로 데이터를 나누고 컬럼으로 받음
# lambda 함수와 결합하여 사용하는 경우
# 7번 반복, a 를 컬럼 구분자로 받아주고, format 함수를 통해 a0, a1, a2 ... 로 표기
# lambda 함수를 통해 '.' 로 구분. 단, len(x.split('.') 즉 7 보다 i 가 작을 때 수행
# 중요
for i in range(i):
df2["a{}".format(i)] = df2['x'].apply(lambda x: x.split('.')[i] if len(x.split('.'))>i else None)
# RRULE
dateutil 라이브러리에 속한 함수로, 날짜 데이터를 원하는 기준에 따라 output 으로 가져올 수 있DMA
freq : 반복 주기를 나타내는 파라미터로, SECONDLY, MINUTELY, HOURLY, DAILY, WEEKLY, MONTHLY, YEARLY
dtstart: 반복이 시작하는 날짜와 시간을 나타냅니다.
interval: 주기적으로 반복되는 간격을 나타냅니다.
count: 생성할 날짜의 최대 수를 나타냅니다.
until: 반복이 끝나는 날짜와 시간을 나타냅니다.
# 라이브러리 불러오기
from datetime import datetime
from dateutil.rrule import rrule, DAILY, TU
# 시작 날짜, 종료날짜
start_date = datetime(2024, 2, 1)
end_date = datetime(2024, 3, 1)
# 2024-02-01 부터 2024-03-01 까지 strf 사용하여 원하는 데이터 형식으로 출력.
weekly_rule = rrule(DAILY, dtstart=start_date, until=end_date)
for date in weekly_rule:
print(date.strftime('%Y-%m-%d'))
# 빈 리스트 생성 후 날짜를 담아주기
a=[]
for date in weekly_rule:
a.append(date.strftime('%Y-%m-%d'))
# 2023-02-01 부터 2023-03-01 까지 strf 사용하여 원하는 데이터 형식으로 출력
weekly_rule = rrule(DAILY, dtstart=start_date, until=end_date)
# 데이터프레임에서 특정 날짜기간에 해당하는 데이터만 슬라이싱 하기
# 빈 리스트 생성 후 날짜를 담아주기
a=[]
for date in weekly_rule:
a.append(date.strftime('%Y-%m-%d'))
# df3 에 있는 날짜 데이터는 string
# string -> datetimd -> string 의 형태로 변환
# 위에서 받은 리스트에 해당하는 데이터만 필터링하기 위함
df3['Time stamp2'] = pd.to_datetime(df3['Time stamp']).dt.strftime('%Y-%m-%d')
mask =(df3['Time stamp2'].isin(a))
df3[mask]
5-6회차 요약
- 결측치 처리 (제거)
# 컬럼별 결측치 식별
df3.isnull().sum()
# 결측치 제거1 - 열 제거하기
df3 = df3.drop('Unnamed: 4', axis=1)
# 결측치 제거2 - 결측치가 있는 행들은 모두 제거
df3.dropna()
# 같은 표현
df3.dropna(axis=0, how='any')
# 결측치 제거3 - 결측치가 있는 열을 모두 제거
# 열로 제거하면 컬럼이 제거되는 현상이 발생하므로 매우 위험합니다.
# df3.dropna(axis=1)
# 결측치 제거4 - 전체 행이 결측값인 경우만 삭제하고 싶은 경우
# how='all'을 사용해줍니다.
df3.dropna(how='all')
# 결측치 제거5 - 결측치 제거 후 결과를 바로 저장하고 싶을 때
# inplace=True 조건을 넣어줍니다.
df3.dropna(inplace=True)
# drop 이후 결측치가 잘 제거되었는지 체크가 필요하겠죠?
df3.isnull().sum()
- 결측치 처리 (대체)
# 결측치 대체: 최빈값
# mode 는 최빈값을 의미
# df3 의 Interaction type 컬럼을 fillna함수를 이용하여 채워주되, mode() 함수를 사용하여 최빈값으로 넣어줌
# mode 함수는 시리즈를 output으로 가집니다.
# 따라서,[0]을 통해 시리즈 중 단일값을 가져와야 합니다.
df3 = df3['Interaction type'].fillna(df3['Interaction type'].mode()[0])
# 결측치 대체: 평균값
df['sw'] = df['sw'].fillna(df['sw'].mean())
df.isnull().sum()
# 결측치 대체: 중간값
# inplace=True 로 하면 원본 데이터가 바뀌게 됩니다.
df['sw'] = df['sw'].fillna(df['sw'].median())
df.isnull().sum()
# 결측치 대체: 바로 위 값으로 대체
df['sw'] = df['sw'].fillna(method='ffill')
df.isnull().sum()
# 결측치 대체: 바로 아래 값으로 대체
df['sw'] = df['sw'].fillna(method='bfill')
#df.isnull().sum()
# 결측치 대체: group by 값으로 대체
# 사전 데이터 확인
df.groupby('Is Amazon Seller')['sw'].median()
# group by한 데이터를 데이터프레임의 컬럼으로 추가하기 위해
# transform 함수 사용
df['sw'] = df['sw'].fillna(df.groupby('Is Amazon Seller')['sw'].transform('median'))
df.isnull().sum()
- 이상치 식별 (Z-SCORE)
- 평균으로부터 얼마나 떨어져 있는가? 를 통한 이상치 판별
- 각 데이터(행) 마다 Z-score 를 구합니다. Z 값은 X에서 평균을 뺀 데이터를 표준편차로 나눈 값이며, 표준 점수라고 부릅니다.
- 표준 점수는 평균으로부터 얼마나 멀리 떨어져 있는지를 보여주며, 일반적으로 -3에서 3 사이의 값을 가지고 있습니다. ±3 이상이면 이상치로 간주하게 됩니다.
- Z-Score : 0 해당 데이터는 평균과 같음을 의미합니다. (=평균에서 떨어진 거리가 0)
- Z-Score > 0 : 해당 데이터 평균보다 큼. Z-Score가 1이면, 해당 데이터 포인트는 평균보다 1 표준편차만큼 더 큰 값임을 의미합니다.
- Z-Score > 0 : 해당 데이터는 평균보다 작음. Z-Score가 -1이면, 해당 데이터 포인트는 평균보다 1 표준편차만큼 더 작음을 의미합니다.
- 평균으로부터 얼마나 떨어져 있는가? 를 통한 이상치 판별
# df 의 Shipping Weight를 기준으로 다양한 이상치 감지 기법을 적용해 보겠습니다.
df = pd.read_csv("p.csv")
# string -> float -> int
df['sw'] = df['Shipping Weight'].str.split().str[0]
df['sw'] = pd.to_numeric(df['sw'] , errors='coerce').fillna(0.0).astype(int)
# z-score 를 적용할 컬럼 선정
df1 = df[['sw']]
# 표준화 진행
# 표준화 : 평균을 0으로, 표준 편차를 1로
# 데이터를 0을 중심으로 양쪽으로 데이터를 분포시키는 방법
# 표준화를 하게 되면 각 데이터들은 평균을 기준으로 얼마나 떨여져 있는지를 나타내는 값으로 변환
scale_df = StandardScaler().fit_transform(df1)
merge_df = pd.concat([df1, pd.DataFrame(StandardScaler().fit_transform(df1))],axis=1)
merge_df.columns = ['Shipping Weight', 'zscore']
# 이상치 감지
# Z-SCORE 기반, -3 보다 작거나 3보다 큰 경우를 이상치로 판별
mask = ((merge_df['zscore']<-3) | (merge_df['zscore']>3))
# mask 메소드 사용
strange_df = merge_df[mask]
strange_df.count()
- 이상치 식별 (IQR)
- 데이터의 분포가 정규분포를 이루지 않을 때
- 데이터의 25% 지점()과 75% 지점() 사이의 범위()를 사용합니다. 이를 벗어나는 값들은 모두 이상치로 간주
# df 의 Shipping Weight를 기준으로 다양한 이상치 감지 기법을 적용해 보겠습니다.
df = pd.read_csv("p.csv")
# string -> float -> int
df['sw'] = df['Shipping Weight'].str.split().str[0]
df['sw'] = pd.to_numeric(df['sw'] , errors='coerce').fillna(0.0).astype(int)
# 이상치를 감지할 컬럼 선정
df1 = df[['sw']]
# Q3, Q1, IQR 값 구하기
# 백분위수를 구해주는 quantile 함수를 적용하여 쉽게 구할 수 있음
# 데이터프레임 전체 혹은 특정 열에 대하여 모두 적용이 가능
q3 = df1['sw'].quantile(0.75)
q1 = df1['sw'].quantile(0.25)
iqr = q3 - q1
q3, q1, iqr
# 이상치 판별 및 dataframe 저장
# Q3 : 100개의 데이터로 가정 시, 25번째로 높은 값에 해당합니다.
# Q1 : 100개의 데이터로 가정 시, 75번째로 높은 값에 해당합니다.
# IQR : Q3 - Q1의 차이를 의미합니다.
# 이상치 : Q3 + 1.5 * IQR보다 높거나 Q1 - 1.5 * IQR보다 낮은 값을 의미
def is_outlier(df1):
score = df1['sw']
if score > 7 + (1.5 * 6) or score < 1 - (1.5 * 6):
return '이상치'
else:
return '이상치아님'
# apply 함수를 통하여 각 값의 이상치 여부를 찾고 새로운 열에 결과 저장
df1['이상치여부'] = df1.apply(is_outlier, axis = 1) # axis = 1 지정 필수
# IQR 방식으로 구한 이상치 개수는 349 개
df1.groupby('이상치여부').count()
- 이상치 식별 (Isolation Forest 개념)
- 머신러닝 기법 중 하나로, 컬럼 갯수가 많을 때 이상치를 판별하기 용이
- 이상치 식별 (DBScan 개념)
- 밀도 기반의 클러스터링 알고리즘으로 어떠한 클러스터에도 포함되지 않는 데이터를 이상치로 탐지하는 방법입니다. 복잡한 구조의 데이터에서 이상치를 판별하는 데 유용
'파이썬' 카테고리의 다른 글
[250318] 데이터 시각화 + 파이썬 입문 과제 (0) | 2025.03.18 |
---|---|
[250317] 데이터 전처리 + 코드카타 70 (0) | 2025.03.17 |
[250313] 라이브러리 복습 + 파이썬 개인과제 (0) | 2025.03.13 |
[250311] 파이썬 종합반 5주차 + 알고리즘 6-10 (0) | 2025.03.11 |
[250310] 파이썬 종합 4주차 + 코드카타 64-65 + 알고리즘 1-5 (0) | 2025.03.10 |