통계적 데이터 분석-데이터 자체 통계 정보

  • 연속형 변수는 통계적 특징을 갖기 때문에, 데이터 분석 시 주로 통계적 분석을 실시
  • 통계적 분석의 종류
    - 데이터 자체의 통계 정보(internal information)
    - 데이터 간 통계 정보(external or relational information)

데이터 자체의 통계 정보

1. 기본적인 분석 방법

import pandas as pd
HANDS2_HOUSEPRICE = "https://raw.githubusercontent.com/ageron/handson-ml2/master/datasets/housing/housing.csv"
df_data = pd.read_csv(HANDS2_HOUSEPRICE)
df_data.head()
  • DataFrame의 describe
df_data.describe(include = 'all')
  • Series의 describe
df_data['median_income'].describe()

df_data.describe()

실행 결과, 컬럼 longtitude와 같이 mean과 50%(median)간 차이가 작은 경우와 total_rooms, population과 같이 차이가 크게 난 경우를 볼 수 있다.

  • | mean(평균) - 50%(median) |의 값이 큰 경우 예측해 볼 수 있는 점
    - 데이터의 치우침(skewness)이 존재할 가능성이 있음
  • | mean(평균) - 50%(median) |의 값이 작은 경우 예측해 볼 수 있는 점
    - 정규분포를 이룰 가능성이 존재
    => 분석에 용이(전처리가 덜 필요), 모집단과 유사할 가능성이 높음(별도의 입증은 필요)

데이터 분포 시각화

  • 확률 밀도 함수(PDF : Probability Density Function) : 연속 확률 분포를 그래프로 나타낸 것
    - 데이터 분포의 개형, 영역, 분산 등을 알 수 있음
df_data['median_income'].plot(kind='density')

  • 누적 분포 함수(CDF : Cumulative Distribution Function) : 주어진 확률 변수가 특정 값보다 작거나 같은 확률을 나타내는 함수
df_data['median_income'].sort_values().cumsum().reset_index(drop=True).plot()

그 밖의 분석 방법

  • min-max scaling : 최대-최소 구간을 [0, 1] 구간으로 설정하여 이에 맞게 데이터를 선형 변환하는 방법
    예) 10 -> 1, 9.8 -> 0.98
from pandas import Series

def min_max_scaling(series:Series) -> Series:
    return (series - series.min())/(series.max() - series.min())
  • 정규화 : 데이터의 분포를 표준 정규 분포로 변형
from pandas import Series

def normalize(series:Series) -> Series:
    return (series - series.mean())/series.std()
  • 변수 구간화 : 연속형 변수를 특정 구간으로 나누어 범주형 혹은 순위형 변수로 변환하는 방법
import pandas as pd

BIN = 5
CAT = range(10)
pd.cut(df_data['median_income], q=BIN, labels=CAT)

아웃라이어 처리 방법

df_data['median_income'].plot(kind='box)

  • 최소값, 최대값으로 각각 맵핑
from typing import Tuple
from pandas import Series

def include_outlier(series:Series, bounds:Tuple[int, int] = (0.1, 0.9)):
    series = series.copy()
    lower,upper = bounds
    l, u = series.quantile(lower), series.quantile(upper)
    series[series < l], series[series > u] = l, u
    return series
  • (사용자 지정 값) * IQR 값으로 최소, 최대값 맵핑
def include_outlier2(series:Series):
	series = series.copy()
    q3, q1 = series.quantile(0.75), series.quantile(0.25)
    iqr = q3 - q1
    series[series < q1 - (1.5 * iqr)], series[series > q3 + (1.5 * iqr)] = q1, q3
    return series
  • outlier 제거
def drop_outlier(series:Series, bounds:Tuple[int, int] = (0.1, 0.9)):
	series = series.copy()
    lower, upper = bounds
    s, e = series.quantile(lower), series.quantile(upper)
    return series[(s <= series) & (series <= e)]
  • (사용자 지정 값) * IQR 값을 이용하여 아웃라이어 제거
def drop_outlier2(series:Series):
	series = series.copy()
    q3, q1 = series.quantile(0.75), series.quantile(0.25)
    iqr = q3 - q1
    l = q1 - (1.5*iqr)
    u = q3 + (1.5*iqr)
    return series[(l<=series) & (series <= u)]

아웃라이어 처리 함수 적용

include_outlier(df_data['median_income'], (0.1, 0.9)).describe()

drop_outlier(df_data['median_income'], (0.1, 0.9))

좋은 웹페이지 즐겨찾기