ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유형별 데이터 분석 맛보기 01 - EDA & 회귀분석(1)
    빅데이터/Machine-Learning 2022. 2. 15. 16:07

    패스트캠퍼스 '직장인을 위한 파이썬 데이터분석 올인원 패키치 Online' 참조

     

     

     

    01 데이터 분석이란?

    • 데이터로 할 수 있는 모든 것들
    • 머신러닝, 딥러닝, AI, 비지니스 인사이트, 통계, 분석 등 분석의 목적, 분야에 따라 여러가지의 기술들이 필요함
    • 직무별로도 데이터 분석이 나뉜다. BA, Data Analystics, ML Engineer, Data Engineer, Data Scientist etc..

     

    알맞은 데이터 분석을 하려면 

    1) 목표에 대한 문제 정의

    2) 문제 해결에 필요한 탐색적 데이터 분석

    3) 목표에 맞는 분석 기법 적용 (산업군 혹은 직무에 맞게 회귀분석, 딥러닝, 시각화 등이 있다)

     

     

     

    02 데이터 분석 문제를 정의하는 방식과 유형들

    1. 탐색적 데이터 분석 ('Exploratory Data Analysis)
      데이터 분포, 특징, 시각화등을 진행하는 일이다. 예로 워드 클라우드는 어떠한 어려운 수학이나 기술이 들어간것이아닌 데이터의 특정 단어들을 세어 어떤 단어들이 많이 있는지를 볼 수 있다. 


    2. 예측, 분류 분석
      무엇 하나로 특정 짓기보다는 여러가지를 조합하여 하나의 결과를 예측하는 일. 결과는 단순하나 EDA보다는 과정 및 기술등이 복잡하다. 


    ▶ 피처, 종속, 독립변수 등에 관한 블로그 (https://joylife052.tistory.com/entry/ML%EC%99%95%EC%B4%88%EB%B3%B4-%ED%94%BC%EC%B2%98feature-%EB%8F%85%EB%A6%BD%EB%B3%80%EC%88%98-%EC%A2%85%EC%86%8D%EB%B3%80%EC%88%98)

     

     

     

     

    03 EDA를 통한 인사이트 발견 실습

    • 실습을 위한 필요 라이브러리들
      import pandas as pd
      import numpy as np
      import matplotlib.pylab as plt
      import seaborn as sns
      
      import warnings
      warnings.filterwarnings('ignore')​
      
      df = pd.read_csv('https://raw.githubusercontent.com/yoonkt200/FastCampusDataset/master/BostonHousing2.csv')
      
      df.head()

    CMEDV 가장 중점적으로 보아야 하는 데이터값

    ▶ 모든 피처들을 종합해서 인사이트를 얻거나 집값을 타겟으로 하여 회귀분석을 함으로써 집값을 예측 할 수 있다.

     

     

     

    • EDA를 그럼 이 데이터셋에 어떻게 적용 할 까?

    1. 데이터셋의 기본 정보 탐색

    # EDA를 적용 하는 방법 
    
    # 1. 데이터셋 기본 정보 탐색
    df.shape # 데이터 크기
    (506, 17)
    
    
    df.isnull().sum() # 결측치 체크
    TOWN       0
    LON        0
    LAT        0
    CMEDV      0
    CRIM       0
    ZN         0
    INDUS      0
    CHAS       0
    NOX        0
    RM         0
    AGE        0
    DIS        0
    RAD        0
    TAX        0
    PTRATIO    0
    B          0
    LSTAT      0
    dtype: int64
    
    
    df.info() # 데이터들의 타입 체크
    Data columns (total 17 columns):
     #   Column   Non-Null Count  Dtype  
    ---  ------   --------------  -----  
     0   TOWN     506 non-null    object 
     1   LON      506 non-null    float64
     2   LAT      506 non-null    float64
     3   CMEDV    506 non-null    float64
     4   CRIM     506 non-null    float64
     5   ZN       506 non-null    float64
     6   INDUS    506 non-null    float64
     7   CHAS     506 non-null    int64  
     8   NOX      506 non-null    float64
     9   RM       506 non-null    float64
     10  AGE      506 non-null    float64
     11  DIS      506 non-null    float64
     12  RAD      506 non-null    int64  
     13  TAX      506 non-null    int64  
     14  PTRATIO  506 non-null    float64
     15  B        506 non-null    float64
     16  LSTAT    506 non-null    float64
    • 유명한 연습 데이터이기 때문에 결측치는 없고, 데이터도 'TOWN'을 제외하고 모두 숫자형이다.

     

     

    2. 주요 타겟 데이터 탐색

    • 데이터가 준비되었다면 그 데이터 중 자기가 가장 중요하다고 생각하는 데이터를 선택 후 그 데이터에 대한 탐색이 이루어 져야 한다. 이 보스턴 집값 데이터에서는 'CMEDV' 가 중요하기때문에 이에대한 탐색이 필요 하다
    # CMEDV가 중요한 데이터이므로 여기에 대한 탐색이 필요 하다
    df['CMEDV'].describe()
    
    count    506.000000
    mean      22.528854
    std        9.182176
    min        5.000000
    25%       17.025000
    50%       21.200000
    75%       25.000000
    max       50.000000
    Name: CMEDV, dtype: float64
    
    df['CMEDV'].hist(bins=50);
    
    df.boxplot(column=['CMEDV']);

    • 'df['CMEDV'].describe()'으로 나온 값들 중 'mean(중앙값)'을 기준으로 'std(편차) = 9' 정도로 집값이 퍼져있는것을 볼 수 있다. 즉 집값이 보통 5~35 정도를 기준으로 형성이 될것이라고 봐진다

    • 박스플롯으로 봐도 히스토에서 보이듯이 5~35 밖이면 일반적인 데이터보다는 밖에 있다는것을 알 수 있다.

     

     

    3. 설명 변수 탐색

    • 값의 특성은 위에서 잘 보았고 이제 이 타겟(집값)값들이 주변 설명 변수들에 의해서 어떻게 바뀌는지를 봐야 한다.
      # 3. 설명변수 탐색 -> 타겟변수에 영향을 주는 값들, 즉 타겟이 이 설명변수에 의해 어떻게 바뀌는지 볼 수 있다
      # 타겟값, 스트링값, 경도, 위도를 제외하고 한 변수에 몰아 넣고 시각화하여 분포도를 탐색
      numerical_columns = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM' , 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']
      fig = plt.figure(figsize=(16, 20))
      ax = fig.gca() # .gca() -> 현재 그래프 틀
      
      # 'numerical_columns' DF처리 후 HIST로 시각화
      # ax = 틀 선택, ax=ax는 ax를 위에서 만든 틀로 함
      df[numerical_columns].hist(ax=ax);​

    B, CHAS 같은 피처는 특정 값에 굉장히 편향 되어있거나 RM, NOX등은 고르게 분포 되어 있다

     

     

     

    4. 설명 변수들의 상관관계 보기

    # 4. 설명 변수들의 상관 관계 보기
    
    # cols 변수에 모든 피처를 다 넣어주고
    cols = ['CMEDV','CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM' , 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT']
    
    # 각각의 변수들을 1:1 상관관계를 보기 위해 'pearson'으로 상관관계함수를 돌림 .corr()
    corr = df[cols].corr(method='pearson')
    
    # 히트맵으로 출력
    
    fig=plt.figure(figsize=(20,20))
    ax = fig.gca()
    sns.set(font_scale=1.5) #히트맵 폰트 세팅
    
    # annot = 'cell'값 표기, fmt가 같이 따라오고 소수점 표시를 정의 해야 함
    # annot_kws = 수치표시사이즈
    # yticklabels,xticklabels = y,x축에 컬럼명 출력
    hm = sns.heatmap(corr.values, annot=True, fmt='.2f', annot_kws={'size':15},
                    yticklabels=cols, xticklabels=cols, ax=ax)
    plt.tight_layout();

    RM/LSTAT 이 집값과의 상관관계가 가장 높다
    타겟값과 상관관계가 높은것들을 봐야한다 0.70 과 -0.74이다

    • 상관계수에서 -1~1에 가까울수록 상관관계가 높으며 음/양의 상관관계로 나눌 수 있고 0에 가까울수록 상관관계가 없다고 이야기 한다
    • RM - 방 개수 비율, LSTAT - 빈곤층 비율이 가장 상관관계가 높게 나왔다

     

    5. 가장 높은 상관관계를 가진것들로 다시 상관관계를 봐야 한다

    # 5 상관관계가 높은것들로 다시 보기
    plt.plot('RM', 'CMEDV', data=df, linestyle='none', marker='o',markersize=5, color='blue', alpha=0.5)
    plt.title('Scatter Plot')
    plt.xlabel('RM')
    plt.ylabel('CMEDV');

    방의 개수만큼 가격이 올라간다

    plt.plot('LSTAT','CMEDV', data=df, linestyle='none', marker='o',markersize=5, color='blue', alpha=0.5)
    plt.title('Scatter Plot')
    plt.xlabel('LSTAT')
    plt.ylabel('CMEDV');

    집값이 높을수록 빈곤율이 적다

    plt.plot('RM','LSTAT', data=df, linestyle='none', marker='o',markersize=5, color='blue', alpha=0.5)
    plt.title('Scatter Plot')
    plt.xlabel('RM')
    plt.ylabel('LSTAT');

    반비례로 방이 증가하면 빈곤율도 그에 맞게 반으로 줄어 든다.

     

     

    6. 지역별 차이 탐색

    # 6. 지역별 차이 탐색
    df['TOWN'].value_counts()
    
    Cambridge            30
    Boston Savin Hill    23
    Lynn                 22
    Boston Roxbury       19
    Newton               18
                         ..
    Medfield              1
    Dover                 1
    Lincoln               1
    Sherborn              1
    Nahant                1
    Name: TOWN, Length: 92, dtype: int64
    
    
    # 히스토그램으로 출력
    df['TOWN'].value_counts().hist(bins=50);

    0~10개 정도의 지역별 부동산 데이터가 있다는것을 볼 수 있다

     

    • 박스플롯으로 보면 조금 더 정확하게 분포율을 볼 수 있다
    fig=plt.figure(figsize=(20,20))
    ax = fig.gca()
    sns.boxenplot(x='CMEDV', y='TOWN', data=df, ax=ax);

    빨간부분이 고소득, 파란부분이 저소득층이 주로 모여있다는것을 알 수 있다

     

    ▶ 범죄율 같은것도 볼 수 있다(흥미가 있는 데이터를 이리 저리 바꿔서 보면 공부에 도움이 된다)

    fig=plt.figure(figsize=(20,20))
    ax = fig.gca()
    sns.boxenplot(x='CRIM', y='TOWN', data=df, ax=ax);

    특정 지역에 범죄율으 높은것을 볼 수 있다

     

Designed by Tistory.