이상치를 정제하고 그것을 이용해서 히스토그램, 산점도, 박스플롯을 그려봤다.

이상치 정제는 z-score를 이용해서 했다.

여기 나오는 내용은 '예제로 배우는 파이썬 데이터 시각화'의 코드(파이썬 2.7)를 

파이썬 3 코드로 바꾼 것이다.



============================ Python ============================

import numpy as np

import matplotlib.pyplot as plt



def is_outlier(points, threshold = 3.5):

    '''

    포인터가 이상치면 참이고, 그렇지 않으면 거짓인 boolean 배열을 반환한다.

    이것은 수정된 z-score보다 큰 데이터 포인트를 지닌다.

    '''

    # 벡터로 변환

    if len(points.shape) == 1:  # 만약 1차원 구조라면 이걸 진행. 1차원은 [] <- 이런 형태를 뜻한다.

                                # 2차원 -> [[]],  3차원 ->[[[]]]

        points = points[:, None]  # 1차원 배열 구조(n X 1)를 각 원소별 리스트 2차원 구조로 바꿔준다.

                                  # ex) [1, 2, 3] -> [[1],[2],[3]]

        # print(points)


        # 중앙값 연산

        # axis = 0 (x축 기준), axis = 1 (y축 기준), axis = 2 (z축 기준)

        # axis에 대한 설명  =>   http://taewan.kim/post/numpy_sum_axis/

        median = np.median(points, axis = 0)

        # print(median)


        # 축상의 diff sum 연산(데이터갯수*루트분산 = 데이터갯수*표준편차)

        '''

        'axis = -1 에 대한 설명'


        numpy.stack 에서...

        The axis parameter specifies the index of the new axis in the dimensions of the result.

        For example, if axis=0 it will be the first dimension and if axis=-1 

        it will be the last dimension.


        ref.

        https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.stack.html



        numpy.sum 에서...

        axis : None or int or tuple of ints, optional

        Axis or axes along which a sum is performed. 

        The default, axis=None, will sum all of the elements of the input array. 

        If axis is negative it counts from the last to the first axis.


        New in version 1.7.0.


        If axis is a tuple of ints, a sum is performed on all of the axes specified in the tuple 

        instead of a single axis or all the axes as before.


        ref.

        https://www.numpy.org/devdocs/reference/generated/numpy.sum.html?highlight=sum

        '''

        diff = np.sum((points - median)**2, axis = -1)

        # print(diff)

        diff = np.sqrt(diff)

        ### end of if; ###


    # MAD(Median Abs Deviation) 연산 (중앙값을 이용한 표준편차)

    med_abs_deviation = np.median(diff)


    # 수정된 z-score 연산

    # http://www.itl.nist.gov/div898/handbook/eda/section4/eda43.thm#Iglewicz

    # z-score => 검사의 결과 해석할 떄 측정 단위가 다른 것으로 환산해서 직접적인 비교를 가능케 하는 방법

    modified_z_score = 0.6745 * diff / med_abs_deviation


    # 각 아웃라이어 마스크 반환

    return modified_z_score > threshold  # boolean으로 리턴이 된다. 여기가 True이면 이상치라는 뜻.


# 랜덤 데이터

x = np.random.random(100)


# 히스토그램 버켓

buckets = 50


# 아웃라이어 추가

x = np.r_[x, -49, 95, 100, -100]


# 유효한 데이터 포인트 유지

# ~ 연산자가 불린 numpy 배열에서는 논리 NOT으로 동작한다.

filtered = x[~is_outlier(x)]  # ~는 numpy.array에서 not과 동일하다. 즉, 이상치가 아닌 값만 filtered에 저장된다.


# 히스토그램 그리기

plt.figure()


plt.subplot(211)

plt.hist(x, buckets)

plt.xlabel('Raw')


plt.subplot(212)

plt.hist(filtered, buckets)

plt.xlabel('Cleaned')


plt.show()






from numpy.matlib import rand

from pylab import *

# 가짜 데이터 생성


spread = rand(50) * 100  # 50개의 원소를 가진 랜덤한 리스트에 100을 곱해준다. 따라서 100이하 0이상인 데이터가 생긴다.

# print(spread)


center = ones(25) * 50  # 1이 25개인 리스트를 만들고 리스트에 50을 곱한다. 원소는 전부 50이다.

# print(center)


# 최대 최소 아웃라이어 생성

flier_high = rand(10) * 100 + 100  # 10개의 0~100의 데이터를 생성해서 100을 더한다.

# print(flier_high)

flier_low = rand(10) * -100  # 10개의 0~1의 데이터를 생성해서 -100을 곱한다.

# print(flier_low)


# 생성된 데이터 셋 합치기

data = concatenate((spread, center, flier_high, flier_low), axis = 0)  # 위의 4개 데이터를 전부 합친다.

print(data)


subplot(3, 1, 1)  # subplot(311)과 동일. plot을 3행 1열의 1번째 자리에 놓는다는 뜻.

# 기본 플롯

# 'gx'는 아웃라이어 출력 설정을 뜻함. symbols 설정. gD 같은 것도 있음.

boxplot(data, 0, sym='gx')


# 비슷한 산점도와의 비교

subplot(3, 1, 2)  # subplot(312)과 동일. plot을 3행 1열의 2번째 자리에 놓는다는 뜻.

spread_1 = concatenate((spread, flier_high, flier_low), 0)

center_1 = ones(70) * 25

scatter(center_1, spread_1)

xlim([0, 50])  # x의 범위를 0~50까지 설정.


# 산점도의 장점을 보여주는 그래프 추가 출력

subplot(3, 1, 3)  # subplot(313)과 동일. plot을 3행 1열의 3번째 자리에 놓는다는 뜻.

center_2 = rand(70) * 50

scatter(center_2, spread_1)

xlim([0, 50])

show()


============================ Python ============================

+ Recent posts