《python을 이용하여 데이터 분석》 독서노트의 데이터 변환(二)

25573 단어 데이터 분석

데이터 변환

  • 이산화 및 분리
  • 이상 감지 및 여과
  • 교환 및 무작위 표본 추출
  • 계산 지표/가상 변수
  • 이산화 및 분리


    연속치는 자주 이산화되거나'상자'로 분리되어 분석해야 한다.현재 우리는 한 그룹의 연령 데이터를 가지고 있는데, 우리는 그들을 18-25, 26-35, 35-60, 그리고 60 이상 네 그룹으로 나누고 싶다.그룹 구성을 위해 pandas의 cut을 사용할 수 있습니다.
    import pandas as pd
    
    ages = [20,22,25,27,21,23,37,31,61,45,41,32]
    bins = [18,25,35,60,100]
    cats = pd.cut(ages,bins)
    print(cats)
    # [(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60], (35, 60], (25, 35]]
    # Length: 12
    # Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]
    
    

    cut는 Catagorical 대상을 되돌려줍니다.
    cats.codes
    #            
    # [0 0 0 1 0 0 2 1 3 2 2 1]
    print(cats.categories)
    #     
    # IntervalIndex([(18, 25], (25, 35], (35, 60], (60, 100]],
    #               closed='right',
    #               dtype='interval[int64]')
    pd.value_counts(cats)
    # (18, 25]     5
    # (35, 60]     3
    # (25, 35]     3
    # (60, 100]    1
    # dtype: int64
    
    

    우리는 그룹을 구성할 때 labels 옵션을 통해 그룹의 이름을 정의할 수 있습니다.
    cats = pd.cut(ages,bins,labels=['youth','youngAdult','MiddleAge','Senior'])
    print(cats)
    # [youth, youth, youth, youngAdult, youth, ..., youngAdult, Senior, MiddleAge, MiddleAge, youngAdult]
    # Length: 12
    # Categories (4, object): [youth < youngAdult < MiddleAge < Senior]
    print(cats.value_counts())
    # youth         5
    # youngAdult    3
    # MiddleAge     3
    # Senior        1
    # dtype: int64
    

    컨테이너(그룹)를 진행할 때 컨테이너의 개수가 아닌 컨테이너로 전송될 수 있습니다.pandas는 자동으로 데이터의 최대치와 최소치를 근거로 긴 컨테이너를 계산합니다.
    import pandas as pd
    import numpy as np
    
    data = np.random.rand(20)
    print(pd.cut(data,4,precision = 2))
    #precision = 2          
    # [(0.29, 0.52], (0.057, 0.29], (0.057, 0.29], (0.52, 0.74], (0.52, 0.74], ..., (0.29, 0.52], (0.057, 0.29], (0.29, 0.52], (0.74, 0.97], (0.74, 0.97]]
    # Length: 20
    # Categories (4, interval[float64]): [(0.057, 0.29] < (0.29, 0.52] < (0.52, 0.74] < (0.74, 0.97]]
    

    pands의 qcut는 견본의 분위수를 통해 상자를 나누기 때문에 이 함수를 통해 긴 상자를 나눌 수 있습니다.
    data = np.random.randn(1000)
    cats = pd.qcut(data,4) #        
    print(cats)
    # [(0.0416, 0.712], (-2.864, -0.607], (0.712, 3.555], (-2.864, -0.607], (-2.864, -0.607], ..., (-2.864, -0.607], (0.712, 3.555], (-0.607, 0.0416], (0.0416, 0.712], (0.0416, 0.712]]
    # Length: 1000
    # Categories (4, interval[float64]): [(-2.864, -0.607] < (-0.607, 0.0416] < (0.0416, 0.712] <
    #                                     (0.712, 3.555]]
    print(cats.value_counts())
    # (-2.864, -0.607]    250
    # (-0.607, 0.0416]    250
    # (0.0416, 0.712]     250
    # (0.712, 3.555]      250
    # dtype: int64
    

    또한 표시할 수 있는 지정된 상자 모서리는 분위수이므로 0-1 사이의 수여야 합니다.
    data = np.random.randn(1000)
    cats = pd.qcut(data,[0,0.1,0.9,1.])
    print(cats)
    # [(-1.335, 1.269], (-1.335, 1.269], (-1.335, 1.269], (-1.335, 1.269], (1.269, 3.305], ..., (-1.335, 1.269], (-1.335, 1.269], (-1.335, 1.269], (1.269, 3.305], (-1.335, 1.269]]
    # Length: 1000
    # Categories (3, interval[float64]): [(-3.5829999999999997, -1.335] < (-1.335, 1.269] < (1.269, 3.305]]                           (0.712, 3.555]]
    print(cats.value_counts())
    # (-3.5829999999999997, -1.335]    100
    # (-1.335, 1.269]                  800
    # (1.269, 3.305]                   100
    # dtype: int64
    

    예외 값 탐지 및 필터링


    이제 1000행 4열의 DataFrame이 있습니다. 열에서 절대값이 3보다 큰 값을 찾으려면 다음과 같이 하십시오.
    import pandas as pd
    import numpy as np
    
    data = pd.DataFrame(np.random.randn(1000,4))
    col = data[2]
    print(col[np.abs(col) > 3])
    # 350   -4.575044
    # 770   -3.001040
    # Name: 2, dtype: float64
    

    또한 다음과 같은 방법으로 요소의 절대값이 3보다 큰 줄을 얻을 수 있습니다.
    data = pd.DataFrame(np.random.randn(1000,4))
    print(data[(np.abs(data)>3).any(1)])
    #any                 True
    #             0         1         2         3
    # 16   0.007730  1.592332 -0.516403 -3.182190
    # 78  -0.574520  3.326386  1.297592  0.918248
    # 148 -3.253763 -0.879153 -0.341380 -0.421963
    # 195 -0.595610  0.122527 -2.147196  3.699034
    # 344 -4.702560 -0.519187 -0.696294  0.027065
    # 425 -0.745760 -0.530089 -1.714175 -3.268162
    # 632 -1.320824 -0.182225 -0.007968  3.311693
    # 650 -3.168038  1.513647 -0.604709 -0.353666
    # 740 -0.225773 -3.128919 -1.628717  0.951415
    # 788 -0.212660  2.015071  0.231082  4.244741
    # 846  0.907867  1.527613 -3.339816  0.001608
    # 852 -0.585060  0.137457  3.379468 -0.924044
    # 942  3.438187  0.061082 -0.202052 -1.716093
    # 943 -0.106008 -0.256375 -3.786214 -0.589181
    

    다음과 같은 방법으로 값을 모두 -3에서 3 사이로 제한할 수 있습니다(3보다 큰 것은 3으로, -3보다 작은 것은 -3으로 변경).
    data = pd.DataFrame(np.random.randn(1000,4))
    data[np.abs(data) > 3] = np.sign(data) * 3
    #sign            1  -1
    print(data.describe())
    #                  0            1            2            3
    # count  1000.000000  1000.000000  1000.000000  1000.000000
    # mean     -0.018379    -0.033751     0.003946    -0.013483
    # std       1.010813     1.008051     0.979408     0.957267
    # min      -3.000000    -3.000000    -3.000000    -3.000000
    # 25%      -0.689586    -0.699035    -0.672904    -0.661879
    # 50%      -0.017652    -0.009849     0.015468    -0.005632
    # 75%       0.633984     0.621483     0.685101     0.626534
    # max       3.000000     3.000000     3.000000     2.711717
    

    교환 및 무작위 표본 추출


    numpy를 사용합니다.random.permutation (n) 은 무작위 수열 (0~n-1로 구성) 을 얻을 수 있습니다.DataFrame 또는 Series의 take 방법을 사용하여 행 스왑을 수행할 수 있습니다.
    import pandas as pd
    import numpy as np
    
    data = pd.DataFrame(np.arange(20).reshape((5,4)))
    #     0   1   2   3
    # 0   0   1   2   3
    # 1   4   5   6   7
    # 2   8   9  10  11
    # 3  12  13  14  15
    # 4  16  17  18  19
    sampler = np.random.permutation(5)
    sampler
    # [1 2 4 3 0]
    data.take(sampler)
    #     0   1   2   3
    # 1   4   5   6   7
    # 2   8   9  10  11
    # 4  16  17  18  19
    # 3  12  13  14  15
    # 0   0   1   2   3
    

    DataFrame과 Series의 Sample 방법을 사용하여 샘플을 추출할 수 있습니다. 인자 n은 추출된 샘플의 수이고, Replace는 한 줄이 뽑힌 후에 다시 뽑힐 수 있는지 여부를 나타냅니다. (기본값은 False입니다.)
    data.sample(n = 3,replace = True)
    #     0   1   2   3
    # 3  12  13  14  15
    # 1   4   5   6   7
    # 1   4   5   6   7
    

    계산 지표/가상 변수


    컴포넌트를 "가상"또는 "지표"매트릭스로 변환하는 것은 통계 모델링이나 머신 러닝을 위한 변환 작업입니다.만약 DataFrame의 열에 k개의 다른 값이 있다면, k열의 값이 0 또는 1인 DataFrame 또는 행렬을 파생시킬 수 있다.pandas의 get 사용 가능dummies 함수는 다음과 같은 기능을 수행합니다.
    import pandas as pd
    
    df = pd.DataFrame({'key':list('bbacab'),
                       'data1':range(6)})
    #   key  data1
    # 0   b      0
    # 1   b      1
    # 2   a      2
    # 3   c      3
    # 4   a      4
    # 5   b      5
    pd.get_dummies(df['key'])
    #    a  b  c
    # 0  0  1  0
    # 1  0  1  0
    # 2  1  0  0
    # 3  0  0  1
    # 4  1  0  0
    # 5  0  1  0
    

    우리는 각 열의 이름에 접두사를 붙이고 다른 데이터와 통합할 수 있다.
    dummies = pd.get_dummies(df['key'],prefix = "key")
    df_with_dummy = df[['data1']].join(dummies)
    print(df_with_dummy)
    #    data1  key_a  key_b  key_c
    # 0      0      0      1      0
    # 1      1      0      1      0
    # 2      2      1      0      0
    # 3      3      0      0      1
    # 4      4      1      0      0
    # 5      5      0      1      0
    
    

    우리는 getdummies와 cut를 결합하여 사용:
    values = np.random.rand(10)
    # [0.40001288 0.34297895 0.28679133 0.74631303 0.42940742 0.48480155
    #  0.0805901  0.38736358 0.76718969 0.38822771]
    bins = [0,0.2,0.4,0.6,0.8,1]
    #    (0.0, 0.2]  (0.2, 0.4]  (0.4, 0.6]  (0.6, 0.8]  (0.8, 1.0]
    # 0           0           0           1           0           0
    # 1           0           1           0           0           0
    # 2           0           1           0           0           0
    # 3           0           0           0           1           0
    # 4           0           0           1           0           0
    # 5           0           0           1           0           0
    # 6           1           0           0           0           0
    # 7           0           1           0           0           0
    # 8           0           0           0           1           0
    # 9           0           1           0           0           0
    

    좋은 웹페이지 즐겨찾기