지도학습에서 극도로 불균형한 레이블 값 분포로 인한 문제점을 해결하기 위해선 적절한 학습 데이터를 확보하는 방안이 필요하다. 대표적으로 오버 샘플링과 언더 샘플링 방법이 있다. 오버 샘플링 방식이 예측 방식이 예측 성능상 더 유리한 경우가 많아 주로 사용된다. 다음은 샘플링 방법을 설명한다.

 

출처: https://roytravel.tistory.com/55

언더 샘플링은 많은 데이터 셋을 적은 데이터 셋 수준으로 감소시키는 방식이다. 가령 정상 레이블을 가진 데이터가 10,000건, 비정상 레이블을 가진 데이터가 100건이 있을 경우 정상 레이블 데이터를 100건으로 줄이는 방식이다.

 

오버 샘플링은 비정상 데이터와 같이 적은 데이터 셋을 증식하여 학습을 위한 충분한 데이터를 확보하는 방법이다. 동일한 데이터를 단순히 증식하는 방법은 과적합이 되기 때문에 의미가 없으므로 원본 데이터의 피처 값들을 아주 약간만 변경하여 증식하며 대표적으로 SMOTE(Synthetic Minority Over-Sampling Technique) 방법이 있다.

 

SMOTE


SMOTE는 적은 데이터 셋에 있는 개별 데이터들의 K 최근접 아웃(K Nearest Neighbor)을 찾아서 이 데이터와 K개 이웃들의 차이를 일정 값으로 만들어서 기존 데이터와 약간 차이가 나는 새로운 데이터들을 생성하는 방식이다.

 

 

Reference : roytravel.tistory.com/55

데이터 분석의 첫 단계는 “문제 정의”이다. 데이터 분석을 시작하기 전 단계에서 분석을 통해 알고 싶은 것이 “무엇”인지를 구체적으로 명확히 정의하지 않으면 “어떻게” 분석해야 할 지도 알기 어렵다.

 

문제 정의 단계에서 목표를 구체적으로 설정하는 것의 중요성은 많은 데이터 분석가들이 주지하고 있지만, 또 하나 이 단계에서 중요하게 생각해야 할 Task가 있다. 바로 “문제 유형 알기”가 그것이다. 내가 해결하고자 하는 문제가 어떤 유형의 문제인지를 알고 있어야 어떤 분석 방법을 사용할 것인지, 어떤 방법은 적당하지 않은지를 알 수 있게 된다. 이 글에서는 데이터 분석 유형에 대해 정리하고, 해결해야 할 유형을 오해하고 있을 때 발생하는 문제를 알아보고자 한다.

1. Descriptive analysis

가장 기본이 되는 분석으로, 주어진 데이터를 요약/집계하여 결과를 도출하는 것Descriptive Analysis의 목표가 된다.

 

이번 달 매출액, 평균 세션 타임, 설문 응답자의 남/녀 비중 등이 이 유형의 분석 결과이다. 이러한 지표들은 Business 관점에서 보면 Bottom line이고, 특히 경영자, 주주 및 여러 이해관계자들이 가장 눈여겨 보는 지표이기 때문에 회사 차원에서 가장 중요한 수치이지만, 과거의 데이터를 단순 계산/집계하여 얻어진 Fact이기 때문에, 분석 결과를 따로 해석하는 과정(So what?, Can we apply this to other population?)을 거치지 않는다. (비즈니스가 아니라 분석 관점에서) 이 단계에서 주로 사용되는 그래프는 Pie chart, Box plot, Bar plot 등이 있으며, 요약 형식의 테이블도 주로 이러한 유형의 분석의 결과물 이다.

2. Exploratory analysis

EDA라고도 불리우는 Exploratory Analysis는 최근 Visualization이 데이터 분석의 화두로 떠오르면서 주목을 받게 된 분석 유형이다. Exploratory Analysis의 주요 목표는 여러 변수 간 트렌드나 패턴, 관계를 찾는 것인데, 이 분석 역시 통계적 기법을 사용한 모델링이라기 보다는 그래프(주로 Plot)를 통한 사실 확인이 주된 작업이다.

 

주로 데이터 분석 프로젝트 초기에 가설을 수립하기 위해 수행되기도 한다. 새로운 데이터를 접할 때 마다 여러 변수들 간의 관계를 이리 저리 그래프로 그리다 보면 흥미로운 사실들이 발견되면서 점점 빨려들어가는데, 아래 두가지를 염두하고 있으면 이 단계를 효율적으로 진행할 수 있을 것이다.

 

A. 분석의 목적을 항상 염두에 두자.

데이터 탐색은 기본적으로 끝이 없는 작업이다. 현실에서 분석하게 되는 데이터들은 다양한 변수들을 가지고 있는데, 각 변수들의 조합, 범주형 변수가 있을 경우 범주 내에서의 조합, 범주형 변수 끼리의 조합 등등 목적없이 파게 되면 끝없이 팔 수 있는 것이 탐색적 데이터 분석이기 때문에, 분석의 목적이 가설 수립인지, 특정 변수들 간의 관계 파악인지, 트렌드 파악인지를 항상 머릿속에 가지고 분석을 진행하는 것을 추천한다.

 

B. Reproduciblity

변수의 개수가 많을 경우 데이터 탐색을 위해 그리게 되는 Plot도 늘어나게 된다. 흥미로운 Plot을 발견한 경우 해당 그래프를 다시 생성할 수 있도록 어떤 조건에서 그러한 Plot을 그리게 됬는지를 확인하자. 이 단계에서 주로 사용되는 그래프는 Scatter plot, Bobble chart 시계열 차트 등이 있다.

3. Inferential analysis

[샘플 – 모집단 간의 관계를 탐구하는 것이 이 분석 유형의 목적이다.] 샘플에서 얻어낸 정보가 모집단에도 적용될 수 있는지를 검토하는 것인데, 이는 자원이 한정되어 있어 샘플 크기를 무한정 늘릴 수 없기 때문에 발생하는 일반적인 문제를 해결하기 위한 분석 유형이다. “95%의 확률로 모집단의 평균 점수는 80~85점 사이라고 말할 수 있다” , “그룹 A의 성적이 그룹 B보다 유의미하게 높았다”는 식의 결론이 Inferential analysis의 결과 이다.

4. Predictive analysis

머신 러닝(Machine learning), 의사결정나무(Decision Tree) 등 다양한 통계적 기법을 사용하여 미래 혹은 발생하지 않은 어떤 사건에 대한 예측을 하는 것이 Predictive analysis의 주요 목표이다. “왜” 보다는 “정확한 예측”을 하는 것이 주요 관심사이기 때문에, 특정한 설명 변수가 어떤 매커니즘으로 목표 변수에 영향을 미치는 가에 대한 설명력은 약하다.

 

예를 들어 금연 성공률과 여러가지 설명 변수들 간의 관계를 분석한다고 가정 하자. Causal analysis의 목표가 금연 성공률에 영향을 끼치는 변수는 금연 방법 (그냥 끊기, 약물치료, 상담치료, 약물/상담 병행) 및 흡연 기간이다라는 “관계”를 밝혀내는 것이라면, Predictive analysis의 목표는 직관적으로 금연과 관계 있는 요소 뿐 만 아니라 나이, 직업, 키, 몸무게, 거주 지역 등 사용가능한 변수들을 모두 활용하여 모델의 “예측력”을 높이는 것이다.

 

최근 Predictive analysis에서 좀 더 나아간 Prescriptive analysis도 주목 받고 있는데, 이 유형의 분석은 예측 모델을 기반으로 어떤 의사결정을 해야 하는지를 “처방”하는 것이 주요 목적이다. 예측 모델 속에 여러 의사 결정 옵션을 변수로 포함시켰다고 보면 이해가 쉬울 것 같다. Prescriptive model어떤 의사 결정을 하느냐에 따라 변하는 결과를 예측해 주기 때문에 이러한 분석을 통해 최적화된 의사 결정을 할 수 있다.

 

2000년대 초중반 까지 유행했던 Scenario analysis와 유사한 점도 있지만, Scenario analysis가 비즈니스 인싸이트에 기반하여 만든 정성적인 시나리오를 기반으로 미래를 예측하고 행동 옵션을 제시했다면, 최근의 Prescriptive analytics는 철저하게 수학 모델에 기반하고 있다는 점, 행동 옵션도 모델에 포함시켜 미래를 예측 한다는 점이 차이라고 볼 수 있다.

5. Causal analysis

독립 변수와 종속 변수 간의 인과관계가 있는지 여부를 확인하기 위한 분석이다. Causal analysis의 특징 중 하나는 실험을 통해 수집된 데이터를 대상으로 한다는 점이다. 주로 독립 변수를 실험대상에 랜덤하게 할당한 후, 그룹 간 실험 전/후의 종속 변수의 변화를 관찰하여 실험 데이터 수집이 이루어 진다.


과거의 단순 관찰 데이터(Observational data)로는  Confounding variable이 있을 가능성을 배제할 수가 없으므로, 인과 관계 여부를 명확하게 밝혀 낼 수가 없기 때문이다. 최근 자주 언급되는 A/B test도 이러한 데이터 수집 방법의 하나라고 볼 수 있다. Linear Regression이 가장 많이 사용되는 분석 방법이며, 변수가 여러개일 경우 Multi variable regression, 변수가 범주형일 경우 Logistics regression을 사용한다.

6. Mechanistic analysis

독립 변수가 어떤 매커니즘으로 종속 변수에 영향을 미치는 지를 분석하는 것으로, 위 6가지 유형 중 가장 노력이 많이 필요한 분석 유형이다. Causal analysis의 목적이 독립 -종속 변수 간의 “인과 관계 여부”를 밝혀내는 것이었다면, Mechanistic analysis의 목적은 이에 더해 어떠한 독립 변수가 어떠한 작용을 통해 독립 변수에 그러한 영향을 미치는 지를 이해하는 것이다. Causal analysis와 동일하게 실험 데이터를 분석 대상으로 한다.

 

출처:

1) Coursera, Managing Data Analysis by Jeff Leek, Brian Caffo, Roger Peng
2) udemy, 10 Different kinds of Graphs for your data (https://blog.udemy.com/different-kinds-of-graphs/)
3) Wikipedia, Predictive analytics (https://en.wikipedia.org/wiki/Predictive_analytics)

www.dodomira.com/2016/01/12/데이터-분석의-유형/

 

pandas.DataFrame.dtypes

Return.: the dtypes in the DataFrame.

This returns a Series with the data type of each column. The result’s index is the original DataFrame’s columns. Columns with mixed types are stored with the object dtype. See the User Guide for more.

pandas.DataFrame.astype

Cast a pandas object to a specified dtype dtype.

pandas.DataFrame.isna

Detect missing values.

Return: a boolean same-sized object indicating if the values are NA. NA values, such as None or numpy.NaN, gets mapped to True values. Everything else gets mapped to False values. Characters such as empty strings '' or numpy.inf are not considered NA values (unless you set pandas.options.mode.use_inf_as_na = True).

 

Returns : DataFrame

Mask of bool values for each element in DataFrame that indicates whether an element is not an NA value.

pandas.DataFrame.notna

Detect existing (non-missing) values.

Return:  a boolean same-sized object indicating if the values are not NA. Non-missing values get mapped to True. Characters such as empty strings '' or numpy.inf are not considered NA values (unless you set pandas.options.mode.use_inf_as_na = True). NA values, such as None or numpy.NaN, get mapped to False values.

 

Returns: DataFrame

Mask of bool values for each element in DataFrame that indicates whether an element is not an NA value.

pandas.DataFrame.head

Return :  the first n rows.

This function returns the first n rows for the object based on position. It is useful for quickly testing if your object has the right type of data in it.

For negative values of n, this function returns all rows except the last n rows, equivalent to df[:-n].

 

Parametersn : int, default 5

                     Number of rows to select.

Returns : same type as caller

                     The first n rows of the caller object.

pandas.DataFrame.apply

DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds)

Apply a function along an axis of the DataFrame.

 

Objects passed to the function are Series objects whose index is either the DataFrame’s index (axis=0) or the DataFrame’s columns (axis=1). By default (result_type=None), the final return type is inferred from the return type of the applied function. Otherwise, it depends on the result_type argument.

 

Parameters : 

func : function

Function to apply to each column or row.

 

axis : {0 or ‘index’, 1 or ‘columns’}, default 0

Axis along which the function is applied:

  • 0 or ‘index’: apply function to each column.

  • 1 or ‘columns’: apply function to each row.

raw : bool, default False

Determines if row or column is passed as a Series or ndarray object:

  • False : passes each row or column as a Series to the function.

  • True : the passed function will receive ndarray objects instead. If you are just applying a NumPy reduction function this will achieve much better performance.

result_type : {‘expand’, ‘reduce’, ‘broadcast’, None}, default None

These only act when axis=1 (columns):

  • ‘expand’ : list-like results will be turned into columns.

  • ‘reduce’ : returns a Series if possible rather than expanding list-like results. This is the opposite of ‘expand’.

  • ‘broadcast’ : results will be broadcast to the original shape of the DataFrame, the original index and columns will be retained.

The default behaviour (None) depends on the return value of the applied function: list-like results will be returned as a Series of those. However if the apply function returns a Series these are expanded to columns.

New in version 0.23.0.

 

args : tuple

Positional arguments to pass to func in addition to the array/series.

**kwds :

Additional keyword arguments to pass as keywords arguments to func.

 

Returns : Series or DataFrame

                Result of applying func along the given axis of the DataFrame.

pandas.DataFrame.isin

Whether each element in the DataFrame is contained in values.

Parametersvaluesiterable, Series, DataFrame or dict

 

The result will only be true at a location if all the labels match. If values is a Series, that’s the index. If values is a dict, the keys must be the column names, which must match. If values is a DataFrame, then both the index and column labels must match.

 

Returns : DataFrame

DataFrame of booleans showing whether each element in the DataFrame is contained in values.

pandas.DataFrame.transform

Call func on self producing a DataFrame with transformed values.

Produced DataFrame will have same axis length as self.

 

Parametersfuncfunction, str, list or dict

Function to use for transforming the data. If a function, must either work when passed a DataFrame or when passed to DataFrame.apply.

Accepted combinations are:

  • function

  • string function name

  • list of functions and/or function names, e.g. [np.exp. 'sqrt']

  • dict of axis labels -> functions, function names or list of such.

axis{0 or ‘index’, 1 or ‘columns’}, default 0

If 0 or ‘index’: apply function to each column. If 1 or ‘columns’: apply function to each row.

*args

Positional arguments to pass to func.

**kwargs

Keyword arguments to pass to func.

 

Returns : DataFrame

A DataFrame that must have the same length as self.

pandas.DataFrame.groupby

pandas.DataFrame.describe

출처 : https://pandas.pydata.org/pandas-docs/stable/reference/frame.html

Exploratory Data Analysis

Python을 통해 탐색적 자료분석을 할 때, 무엇을 해야하고, 순서는 어떻게 해야하는지 막막한 경우가 많은데요. 탐색적 자료분석의 기본은 바로 변수 별로 분포를 그려보는 것이겠죠. 수치형 데이터의 경우는 히스토그램을, 명목형 데이터의 경우는 빈도표를 통해 데이터의 분포를 살펴보게 됩니다. 본 포스팅에서는 파이썬을 통해 탐색적 자료 분석을 하는 방법을 유명한 데이터셋인 타이타닉 데이터를 통하여 차근차근 알아보겠습니다. 

기본적인 탐색적 자료 분석의 순서는 아래와 같이 정리해보았습니다. 

 

1. 데이터를 임포트하여 메모리에 올린다.

2. 데이터의 모양을 확인 한다.

3. 데이터의 타입을 확인한다.

4. 데이터의 Null 값을 체크한다. 

5. 종속변수의 분포를 살펴본다.

6. 독립변수 - 명목형 변수의 분포를 살펴본다. 

7. 독립변수 - 수치형 변수의 분포를 살펴본다. 

8. 수치형, 명목형 변수간의 관계를 파악한다. 

 

1. 데이터 임포트.

아래와 같이 패키지와 데이터를 임포트합니다. numpy, pandas, matplotlib, seaborn은 이 4가지의 패키지는 파이썬을 통한 EDA에서 거의 필수적으로 사용하는 라이브러리입니다.

 

2. 데이터 모양 확인.

 

head(), shape, tail 등을 활용하여 데이터 모양을 확인한다.

 

3. 데이터의 타입을 체크한다.

데이터의 타입을 체크하는 이유는 해당 변수의 타입을 제대로 맞추어주기 위해서입니다. 범주형 변수의 경우 object 또는 string, 수치형 변수의 경우 int64 혹은 float 64로 맞추어주면 됩니다. 범주형 변수의 경우 값이 문자열로 들어가 있으면 알아서 object 타입이 되지만, 만약의 숫자로된 범주형 변수의 경우 int64 등으로 잘못 타입이 들어가 있는 경우가 있습니다.  

4. 데이터의 Null 값을 체크한다. 

 

Null Check도 매우 중요한 작업 중 하나입니다. 단순히 Tutorial이나 학습을 위해 제작된 데이터셋이아닌 현실의 데이터셋의 경우, 많은 부분이 Null 인 경우가 많습니다. 따라서 이 Null 값을 어떻게 처리하느냐가 매우 중요합니다. 

Cabin 변수가  687 행이 missing이고 Embarked가 2개의 행이 missing인 것을 확인하였습니다.

 

Null 값이 있는 경우, 크게 그 값을 빼고 하는지, 혹은 결측치를 대치하는지 2개의 방법으로 나눌 수 있습니다. 각각의 방법에 대한 이름이 다르긴한데 보통 첫 번째 방법을 complete data analysis, 두 번째 방법을 Imputation이라고 이름 붙입니다. 

위 명령어를 통해 전체의 몇 %가 missing 인지를 확인할 수 있습니다. 

 

5. 종속변수 체크.

저는 bar_chart 함수를 만들어 종속 변수인 Survived의 유무를 다른 변수와 바로 비교 가능하도록 했습니다. 다른 방법으로는 기본적으로 종속변수의 분포를 살펴볼수 있습니다. (종속변수란 다른 변수들의 관계를 주로 추론하고, 최종적으로는 예측하고자 하는 변수입니다.)

6. 명목형 변수의 분포 살피기.

 

단변수 확인 및 이변수 탐색

저는 주로 단변수를 확인할때, info()를 활용하는 편입니다 하지만 보다 쉽게 보기를 원하신다면, 먼저 명목형 변수의 형을 object로 모두 변경하고 컬럼 중에서 object 타입을 가진 컬럼만 뽑아서 명목형 변수의 리스트를 만듭니다. 

이 때, 데이터의 기본키(인덱스), 종속변수 등을 제외하고 분석하는 것이 좋습니다. 

다음으로는 그래프를 통해 명목형 변수의 분포를 살펴보는 것입니다. 저는 5번 종속변수를 확인할때 종속변수와 다른 변수를 확인하기 위해 이미 함수를 만들어 놓았었습니다. 위와 같은 이미지 입니다 ^^;; 따라서 'Cobin', 'Sex' , 'Ticket' , 'Name' 등과 비교하여 확인하시면 됩니다

이렇게 살펴봄으로써 명목형 변수를 어떻게 다룰지를 판단할 수 있습니다. 예를 들어, 카테고리수가 너무 많고, 종속변수와 별로 관련이 없어보이는 독립 변수들은 빼고 분석하는 것이 나을 수도 있습니다.

이변수 탐색은 위에서 생존과 사망을 나누어 각각의 변수와 비교하는 것을 말합니다. 즉 성별-생존의 관계 파악처럼 두 변수의 관계를 파악하기 위해서는 위와 같이 확인할 수 있습니다.

7. 수치형 변수의 분포 살펴보기

 

단변수 탐색

단변수 탐색은 seaborn 패키지의 distplot 함수를 이용하면 매우 편합니다.

 

우선 이와 같이 전체 변수 중에서 범주형 변수와 기타 인덱스 변수, 종속변수들을 제외하고 수치형 변수만 골라냅니다.

이변수, 삼변수 탐색

seaborn 패키지의 pairplot을 통해 종속변수를 포함한 3개의 변수를 한 번에 볼 수 있도록 플로팅합니다.

8. 수치형, 명목형 변수 간의 관계 탐색

 

앞서서 수치형-수치형  간의 관계, 그리고 명목형-명목형 간의 관계에 종속변수까지 포함해서 보았습니다. 이 번에는 수치형-명목형 간의 관계를 파악해 보는 것입니다. 예를 들어, 성별, 나이, 생존여부 3개의 변수를 동시에 탐색하고 싶을 수 있습니다. 이 경우에 명목형 변수에 따라 수치형변수의 boxplot을 그려봄으로써 대략적인 데이터의 형태를 살펴볼 수 있습니다. 


참고: https://3months.tistory.com/325 [Deep Play]

'%matplotlib inline'이라는 commendjupyter notebook에서 matplotlib시각화한 결과를 바로 볼 수 있도록 하는 것이다. 다른 함수도 lnline을 활용하면 바로 결과를 볼 수 있을 것이다.

 

결론

%matplotlib inline 의 역할은 notebook을 실행한 브라우저에서 바로 그림을 볼 수 있게 해주는 것 입니다.

출처: https://korbillgates.tistory.com/85

출처 : ttps://zzsza.github.io/development/2018/08/24/data-visualization-in-python/

 

Python에서 데이터 시각화하는 다양한 방법

Python에서 데이터 시각화할 때 사용하는 다양한 라이브러리를 정리한 글입니다 데이터 분석가들은 주로 Python(또는 R, SQL)을 가지고 데이터 분석을 합니다 R에는 ggplot이란 시각화에 좋은 라이브러리가 있는 반면 Python에는 어느 춘추전국시대처럼 다양한 라이브러리들이 있습니다 각 라이브러리들마다 특징이 있기 때문에, 자유롭게 사용하면 좋을 것 같습니다 Zeppelin도 시각화할 때 사용할 수 있지만, 라이브러리는 아니기...

zzsza.github.io

 

+ Recent posts