Data_preprocessing

46265 ワード

NumpyとPandasについて学びました.
簡単に整理できます.

Numpy


-> Numerical Python
->標準(多次元配列)

Pandas


->シリーズ(1 D)、DataFrame(2 D)
====>Numpyベースのカレンダー作成
->DataFrameのフィーチャー、プロパティ、作成方法、関数、インデックス、スライス
こんなに簡単に整理できます.
今日はDataFrameが提供する分析関数です
  • 技術分析=記述
  • 平均
  • 、標準偏差、分散、公分散、相関係数、四分位.これらを理解しましょう.
  • 次に、
  • の例を示します.
  • import numpy as np
    import pandas as pd
    
    data = np.array([[2, np.nan],
                    [7, -3],
                    [np.nan, np.nan],
                    [1, -2]])
    print(data)
    # [[ 2. nan]
    #  [ 7. -3.]
    #  [nan nan]
    #  [ 1. -2.]]
    
    df = pd.DataFrame(data,
                      columns=['one','two'],
                      index=['a','b','c','d'])
    
    display(df)
    #   	one	two
    # a	    2.0	NaN
    # b	    7.0	-3.0
    # c	    NaN	NaN
    # d	    1.0	-2.0
    
    # 합을 함 구해볼거다 numpy 경우 축(axis)을 정해줘야 축끼리 계산이 된다. 아니면 전체를 더하게 된다.
    # 
    # print(df.sum())         # DataFrame의 경우만약 axis를 지정하지 않으면  axis=0 default.로 사용
                            # 기본속성으로 dropna=True가 default
      
    # print(df.sum(axis=1))
    # a    2.0
    # b    4.0
    # c    0.0
    # d   -1.0
    # print(df['two'].sum()) # Series에 대해서도 집계함수를 사용할 수 있어요! 
    # -5.0
  • Pandas内蔵グラフィックツール
  • これらの機能はmatplotlibであり、二重車の
  • に用いられる.
    だからPandasのグラフィックツールを使うより.
    勉強はmapotlibを使ったほうがいいです.

    データプリプロセッシング


    データの前処理について説明しましょう.

    データ解析


    機械学習、deep learningは何が必要ですか?
  • データ量
  • 良質データ
  • を含む
  • データ品質が重要
  • 欠落値(実測値)
  • Outlier(理想)
  • 冗長データ(意味のある冗長性か不要な冗長性かを判断する)
  • データのセル処理
  • 標準化
  • 軒の家の価値は1億から5億
  • 軒までです
  • 軒の年食1年~40年
  • はさらに1億~5億に達しているため、焦点はここに集中している.
    =>これらのデータを処理する必要があります!
  • 例題を利用して前処理しましょう.
    タイタニック号データセットを利用します!
  • Seabornモジュールを使用!
  • 図形描画モジュール
  • Matplotlib拡張版
  • は、Titanicデータセットを利用する.
  • データプリプロセッシングプロセス

  • 欠落値
  • DataFrameに欠落する値
  • データの入力中に誤って紛失したり、ファイルの変換中に処理の問題で紛失したりしました.
    ->差分値をNANとして表す
  • このようなMissing Valueはあまりよくありません!
    ->そのために処理が必要です

  • 削除
  • :データが十分に多い場合、欠落値が合計の3%から4%以内の場合、
  • を削除します.
  • 代替:平均、中央値、最大値、最小値、周波数値で代替できます.
  • マシン学習テクニックでこの値を予測して入力します!
  • はいつも使えないので、条件があります!
  • 異常値処理
  • 以上の値を見つけ、
  • を変更します.
  • この部分は後で理解します.実測値の処理に集中します.
  • 繰返し処理
  • duplicated( )
  • drop_duplicates( )
  • は、2つの方法で処理することができる.
  • データ変換
  • 数値が文字列(pandas object)として格納されている場合、カテゴリは数値形式で区分され、カテゴリ別に分類されます!
  • 例を挙げてさらに理解してみましょう.
    まず、Anacondaでsebornモジュールをインストールします.
    conda install seaborn
  • 欠落値(実測値)処理
  • import numpy as np
    import pandas as pd
    import seaborn as sns
    
    df =sns.load_dataset('titanic')
    
    # display(df)
    
    # 먼저 전체 데이터를 가지고 Missing Value가 존재하는 지 확인
    # 이 작업이 먼저 선행되어야 해요!
    
    # print(df.info())
    # df['deck'].value_counts()   # 688개의 NaN
    # df.isnull().sum(axis=0)
    survived         0
    pclass           0
    sex              0
    age            177
    sibsp            0
    parch            0
    fare             0
    embarked         2
    class            0
    who              0
    adult_male       0
    deck           688
    embark_town      2
    alive            0
    alone            0
    dtype: int64
    
    # missing_df = df.isnull()
    # for col in df.columns:
    #     missing_value = missing_df[col].value_counts()
    #     try:
    #         print(col, ' :', missing_value[True])
    #     except:
    #         print(col, ' :', 0)
    
    
    # 결치값을 삭제해 봐요!
    # 일단 먼저 삭제할 column을 결정해서 지워보아요!
    
    # 기본적인 삭제방법
    # df2 =df.drop('deck', axis=1, inplace=False)   # 컬럼명을 명시해서 지워줌
    # display(df2.head())
    # "deck" 컬럼이 사라진걸 확인 할 수 있다.
    
    # 또 다른 컬럼 삭제 방법
    # dropna
    thresh_df = df.dropna(axis=1, thresh=500, inplace=False) # 컬럼중에 nan이 500개가 넘어가면 지워라 라는 뜻
    # display(thresh_df.head())
    
    # 행을 지울 수 있어요!
    result_df = thresh_df.dropna(subset=['age'], axis=0, how='any',inplace=False) # 행을 지우는데 age컬럼의 nan이 있으면 지워라
    print(result_df.shape)   # (714, 15) 원래는 (891, 15) 이었음
    print(result_df.info())
    
    # 컬럼단위로 nan이 많은 값은 날려주고 그다음 행단위로 nan이 있는 값들을 지워준다
  • の決済値の代わりに他の値を使うにはどうすればいいですか?
  • import numpy as np
    import pandas as pd
    import seaborn as sns
    
    # titanic data set loading
    df= sns.load_dataset('titanic')
    display(df.head())
    
    # age column의 missing value(결측치)를 다른 값으로 대체
    
    # age의 평균 값으로 대체
    # mean_age = df['age'].mean()  #  mean은 기본적으로 NaN은 제외하고 평균을 구해요!
    # print(mean_age)  # 29,669
    # df['age'].fillna(mean_age, inplace=True)
    # display(df.head(10))
    # fillna를 통해 nan값들을 mean_age로 변경시켜준다!
    
    
    # embarke 같은 경우에는 빈도를 이용해서 값을 대체하는게 좋아요!
    # 데이터 특성상 서로 이웃하고 있는 데이터는 유사성을 가질 확률이 높아요!
    # 그래서 자신의 앞이나 뒤의 데이터로 Missing Value를 채우는 방법을 제공!
    display(df['embarked'][820:831])
    # df['embarked'].fillna(method='ffill', inplace = True)
    df['embarked'].fillna(method='bfill', inplace = True)
    # 다음과 같이 method=ffill or bfill을 통해 앞이나 뒤의 데이터로 missing value를 채워 줄 수 있어요!
    820      S
    821      S
    822      S
    823      S
    824      S
    825      Q
    826      S
    827      C
    828      Q
    829    NaN
    830      C
    Name: embarked, dtype: object
    820    S
    821    S
    822    S
    823    S
    824    S
    825    Q
    826    S
    827    C
    828    Q
    829    C
    830    C
    Name: embarked, dtype: object
    
    print(df['embarked'][820:831])
    異常値であれば後で知るので、今回は繰り返してみます.
  • 繰返し処理
  • # 의미가 있는 중복인지 아니면 그냥 중복된 데이터가 존재하는지를 판단
    # 만약 의미없는 중복된 데이터가 있으면 제거!
    
    import numpy as np
    import pandas as pd
    import seaborn as sns
    
    df = pd.DataFrame({'c1':['a','a','b','a','b'],
                       'c2':[1,1,1,2,2],
                       'c3':[1,1,2,2,2]})
    display(df)
    
    	c1	c2	c3
    0	a	1	1
    1	a	1	1
    2	b	1	2
    3	a	2	2
    4	b	2	2
    # df.duplicated() # 중복되었니? 라고 물어보는 함수
    # dup_df = df.duplicated()  # 한줄한줄 비교하며 확인 Series를 리턴
    # print(dup_df)
    0    False
    1     True
    2    False
    3    False
    4    False
    dtype: bool
    
    # duplicated()는 DataFrame에 적용되는데 이걸 Series에도 적용할 수 있어요!
    # print(df['c2'].duplicated())
    0    False
    1     True
    2     True
    3    False
    4     True
    Name: c2, dtype: bool
    # 위에서부터 한줄씩 비교하면서 결과를 출력
    
    # 중복 데이터를 제거! (모든 컬럼을 다 비교)  drop_duplicates   
    # df2 = df.drop_duplicates()
    # display(df2)
    # 중복데이터를 비교하여 제거함
    	c1	c2	c3
    0	a	1	1
    2	b	1	2
    3	a	2	2
    4	b	2	2
    
    # 중복데이터를 제거 ( 특정 컬럼만 비교) subset
    df2 = df.drop_duplicates(subset=['c2', 'c3'])
    display(df2)
    	c1	c2	c3
    0	a	1	1
    2	b	1	2
    3	a	2	2
    # 이거 또한 위에서 비교하면서 결과를 출력해준다!
  • データ型変換
  • # 사용하는 데이터 set은 mpg데이터 셋을 사용할거임
    import numpy as np
    import pandas as pd
    import seaborn as sns
    
    df = pd.read_csv('./data/auto-mpg.csv', header =None) # header = None은 컬럼명이 없다를 명시
    
    # mpg : 연비(mile per gallon)
    # cylinders : 실린더 개수
    # displacement : 배기량
    # horsepower : 마력(출력)
    # weight : 중량
    # acceleration : 가속능력
    # year : 출시년도 (70 => 1970년도)
    # origin : 제조국 (1: USA, 2: EU, 3: JPN)
    # name : 차량이름
    df.columns = ['mpg', 'cylinders','displacement','horsepower',
                  'weight', 'acceleration', 'year', 'origin', 'name']
    
    display(df)
    # print(df.dtypes)
    
    # horsepower 컬럼은 안에 숫자가 들어가 있는데 type이 object
    # 숫자(실수)로 변경하는게 좋을것 같아요!
    
    # df['horsepower']= df['horsepower'].astype('float')
    # 다음 문장을 실행하면 오류가난다.. 왜그럴까?
    #실수로 바꿀수 없는 무언가가 있어서 오류가 나는것 같다
    # print(df['horsepower'].unique())
    
    # ['130.0' '165.0' '150.0' '140.0' '198.0' '220.0' '215.0' '225.0' '190.0'
    #  '170.0' '160.0' '95.00' '97.00' '85.00' '88.00' '46.00' '87.00' '90.00'
    #  '113.0' '200.0' '210.0' '193.0' '?' '100.0' '105.0' '175.0' '153.0'
    #  ...'64.00' '74.00' '116.0' '82.00']
    # 값을 확인해보니 '?' 값이 들어가 있다.
    
    # 원래 결측치(missing Value)는 NaN으로 표현되는데 가끔 다른문자('?','-')로 표현하는 경우가 종종 있음!
    # 권장되는 방법은 이런 다른 문자로 표현되는 결측치를 NaN으로 변환시켜서
    # 우리가 알고 있는 dropna()메소드를 이용해 결측치를 처리!
    df['horsepower'].replace('?',np.nan, inplace=True)
    # replce를 통해 해당 값을 nan값으로 바꿔준다
    
    # print(df['horsepower'].unique())
    df.dropna(subset=['horsepower'], axis=0, inplace=True)
    # 열기준이아닌 행을 기준으로 nan값을 제거해야해서 axis = 0인거를 잊지말자
    # print(df['horsepower'].unique())
    
    df['horsepower']= df['horsepower'].astype('float')
    print(df.dtypes)
    mpg             float64
    cylinders         int64
    displacement    float64
    horsepower      float64
    weight          float64
    acceleration    float64
    year              int64
    origin            int64
    name             object
    dtype: object
    
    # origin column의 값을 1, 2, 3에서 USA, EU, JPN으로 변경
    df['origin'].replace({1:'USA',
                          2:'EU',
                          3:'JPN'},
                          inplace=True)
    display(df.head(3))
    # 기존의 origin이 1,2,3으로 표현되는데
    # 각각 명시된 거에따라 USA, EU, JPN으로 표현된다!
    df['origin']= df['origin'].astype('category')
    print(df.dtypes)
    mpg              float64
    cylinders          int64
    displacement     float64
    horsepower       float64
    weight           float64
    acceleration     float64
    year               int64
    origin          category
    name              object
    dtype: object

  • ぶんかつデータしょり
    0-5:子供
    16-25:青少年
    26~40:若者
    =>このような形式で連続的なデータを提供し、
    効率の高い赤牛
    パーティション
    =>連続データを一定の区間に分割
    固定区間:Bin
          - bin 1 -                 - bin2 -                 - bin3 -
        |--------------------|------------------------|-----------------------|
      경계1                    경계2                       경계3                     경계 4
  • import numpy as np
    import pandas as pd
    import seaborn as sns
    
    df = pd.read_csv('./data/auto-mpg.csv', header =None) # header = None은 컬럼명이 없다를 명시
    
    # mpg : 연비(mile per gallon)
    # cylinders : 실린더 개수
    # displacement : 배기량
    # horsepower : 마력(출력)
    # weight : 중량
    # acceleration : 가속능력
    # year : 출시년도 (70 => 1970년도)
    # origin : 제조국 (1: USA, 2: EU, 3: JPN)
    # name : 차량이름
    df.columns = ['mpg', 'cylinders','displacement','horsepower',
                  'weight', 'acceleration', 'year', 'origin', 'name']
    display(df)
    
    df['horsepower'].replace('?',np.nan, inplace=True)       # Missing Value 변화
    df.dropna(subset=['horsepower'], axis=0, inplace=True)   # Missing Value 삭제
    df['horsepower']= df['horsepower'].astype('float')        # 실수로 데이터 타입 변환            
    display(df.head(3))
    
    # horsepower를 구간보조에 사용할거도
    # ['고출력'],['보통출력'], ['저출력']
    
    count, bin_divider = np.histogram(df['horsepower'],bins=3)
    print(count, bin_divider)
    [257 103  32] [ 46.         107.33333333 168.66666667 230.        ]
    
    
    bin_names = ['저출력', '보통출력', '고출력']
    
    df['hp_bin'] = pd.cut(x=df['horsepower'],
                         bins=bin_divider,
                         labels=bin_names,
                         include_lowest=True) # True는 첫 경계값을 포함 시킴
    
    display(df.head(100))
    
    # 이런 카테고리를 나타내는 범주형 데이터는 머신러닝 알고리즘에서 바로 사용하기 힘들어요!
    # - 컴퓨터가 인식 할 수 있는 형태로 제공해줘야함
    # 이문제를 해결하기위해 사용하는게 dummy variable(더미변수) == 0과 1로 표현하고 해당 특성이 있는지 없는지를 표현
    
    # ==> one - hot -encoding
    
    horsepower_dummy = pd.get_dummies(df['hp_bin'])
    display(horsepower_dummy.head(5))
    	저출력	보통출력	고출력
    0		0	  	1	    0
    1		0		1		0
    2		0		1		0
    3		0		1		0
    4		0		1		0
  • 標準化
  • DataFrameの列ごとに持つデジタルデータの相対的な違いは機械学習結果の違いを招く!
  • デジタルデータの相対的なサイズの違いを解消する必要があります.
  • 標準化(標準化)
  • ->正規分布z-scoreがあります.後で調べてみます
  • ->Min-Max-SCaling->こいつを知っておきましょう!
  • 標準化は正規分布を基準に計算され、異常値の感覚が鈍くなります!
  • ですが、標準化の範囲は0と1の間ではありませんので、各列の傾向は
  • です.
  • MinMaxScalerは以下の方式を有する
  • import numpy as np
    import pandas as pd
    import seaborn as sn
    
    
    df = pd.read_csv('./data/auto-mpg.csv', header =None) # header = None은 컬럼명이 없다를 명시
    
    df.columns = ['mpg', 'cylinders','displacement','horsepower',
                  'weight', 'acceleration', 'year', 'origin', 'name']
    # display(df)
    
    df['horsepower'].replace('?',np.nan, inplace=True)       # Missing Value 변화
    df.dropna(subset=['horsepower'], axis=0, inplace=True)   # Missing Value 삭제
    df['horsepower']= df['horsepower'].astype('float')        # 실수로 데이터 타입 변환            
    # display(df.head(3))
    
    df['horsepower']= (df['horsepower']- df['horsepower'].min())/(df['horsepower'].max()- df['horsepower'].min())
    df['weight']= (df['weight']- df['weight'].min())/(df['weight'].max()- df['weight'].min())
    display(df)