2020. 12. 22. 05:00ㆍPython과 머신러닝/Pandas 데이터 분석
0. 이전 포스트
- 2020/12/19 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map
 - 2020/12/20 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Map 함수 실전편 + .replace함수 사용하기
 - 2020/12/21 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] DataFrame.apply, DataFrame.applymap
 
[Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map
1. Lambda란? In [1]:def f1(x,y): return x+y In [2]:f1(1,2) Out[2]:3 In [3]:f2=lambda x,y:x+y In [4]:f2(1,2) Out[4]:3 Lambda란 함수를 한 줄로 표현하는 익명 함수 기법이다. lisp 언어에서 시작된 기법으..
coding-grandpa.tistory.com
[Python.Pandas] Map 함수 실전편 + .replace함수 사용하기
1. wget으로 데이터 다운로드하여 .unique로 데이터 종류 분석하기 In [1]:import wget url = 'https://raw.githubusercontent.com/rstudio/Intro/master/data/wages.csv' wget.download(url) Out[1]:'wages.csv'..
coding-grandpa.tistory.com
[Python.Pandas] DataFrame.apply, DataFrame.applymap
1. DataFrame.Apply - 하나의 Series가 아닌 전체 DataFrame에 함수를 적용하고 싶을 때 In [1]:from pandas import Series, DataFrame import pandas as pd import numpy as np In [2]:df = pd.read_csv("wages.c..
coding-grandpa.tistory.com
1. DataFrame.describe 및 데이터 초기 분석
In [1]:from pandas import Series, DataFrame 
       import pandas as pd 
	   import numpy as np
In [2]:df = pd.read_csv('wages.csv') 
       df.head(2).T
Out[2]:
         0          1
earn     79571.3    96397
height   73.89	    66.23
sex      male	    female
race     white      white
ed       16         16
age      49         62
In [3]:df.describe()
Out[3]:
       earn          height       ed           age
count  1379.000000   1379.000000  1379.000000  1379.000000
mean   32446.292622  66.592640    13.354605    45.328499
std    31257.070006  3.818108     2.438741     15.789715
min    -98.580489    57.340000    3.000000     22.000000
25%    10538.790721  63.720000    12.000000    33.000000
50%    26877.870178  66.050000    13.000000    42.000000
75%    44506.215336  69.315000    15.000000    55.000000
max    317949.127955 77.210000    18.000000    95.000000
- 데이터를 처음 불러오면 가장 먼저 위와 같은 동작을 하여 보는 것이 매우 도움이 된다.
 - In[2]의 df.head(2).T는 첫 두 개의 데이터를 Transpose 해서 보여주는 함수이다. 이를 통해 어떤 Series가 존재하고, 각 Series의 값들은 대충 어떻게 생겼는지를 파악할 수 있다.
 - In[3]의 df.describe()는 df 중에서 숫자형 데이터에 대한 count/mean/std/min/max 등의 기본 통계형 데이터를 한 번에 보여준다.
 - 범주형 데이터는 제외된 것을 확인할 수 있다. 그렇기 때문에 전체 Series가 어떻게 생겼는지를 먼저 보고, describe함수를 통해서 각 column을 이해하는 것이 좋다.
 
2. 범주형 데이터 Encoding 하기
In [4]:key=df.race.unique() 
       key
Out[4]:array(['white', 'other', 'hispanic', 'black'], 
              dtype=object)
              
In [5]:value=range(len(df.race.unique())) 
       value
Out[5]:range(0, 4)
In [6]:df['race_code'] = df['race'].replace(to_replace=key, value=value) 
       df[['race', 'race_code']].head(9)
Out[6]:
    race      race_code
0   white     0
1   white     0
2   white     0
3   other     1
4   white     0
5   white     0
6   white     0
7   white     0
8   hispanic  2
- 1번에서 봤듯이, 범주형 데이터는 기본적인 Built-in function에서 소외(?) 되기 마련이다.
 - 그렇기 때문에 범주형으로 되어있는 데이터도, 숫자형으로 변형하여 주는 것이 분석에 유리하고,
이 과정을 encoding이라 한다. - Encoding과 관련된 이전 포스트
2020/12/19 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map
2020/12/20 - [Python과 머신러닝/Pandas 데이터 분석] - [Python.Pandas] Map 함수 실전편 + .replace함수 사용하기 - 위와 같이 변형하고자 하는 key와, key가 변형되었으면 하는 결과 값 value를 .replace로 제공하면, race_code라는 새로운 열에 0~3의 값으로 변형된 것을 확인할 수 있다.
 
3. .sum 함수
In [7]:numeric_cols=['earn', 'height', 'ed', 'age'] 
       numeric_cols
Out[7]:['earn', 'height', 'ed', 'age']
In [8]:df[numeric_cols].sum(axis=1) # 숫자인 column 들의 합
Out[8]:0 79710.189011 
       1 96541.218643 
       2 48823.436947 
       3 80652.316153
       4 82212.425498 
       ... 
       1374 30290.060363 
       1375 25018.829514 
       1376 13823.311312 
       1377 95563.664410 
       1378 9686.681857 
       
       Length: 1379, dtype: float64
In [9]:df.sum(axis=1) #동일한 값이 나옴
Out[9]:0 79710.189011 
       1 96541.218643 
       2 48823.436947 
       3 80652.316153
       4 82212.425498 
       ... 
       1374 30290.060363 
       1375 25018.829514 
       1376 13823.311312 
       1377 95563.664410 
       1378 9686.681857 
       
       Length: 1379, dtype: float64
- Pandas는 다양한 함수를 이미 제공하고 있다. 이를 Built-in Function이라고 한다.
 - 그중 가장 처음으로 배울 것은 .sum() 함수이다.
 - .sum 함수는 주어진 DataFrame의 모든 Column들을 row별로 합하는 함수이다.
 - In[9]에서 보다시피 전체 DataFrame에 .sum을 하면 숫자 데이터들만 더해준다.
 - sum 외에도 .sub()/.mean()/.min()/.max()/.count()/.median()/.var() 등의 함수들도 비슷하게 제공된다.
 
4. .isnull() 함수
In [10]:df['NaN'] = np.NaN 
        df.isnull().sum()
Out[10]:earn 0 
        height 0 
        sex 0
        race 0
        ed 0
        age 0
        race_code 0
        NaN 1379
        dtype: int64
- isnull함수는 각 element 별로 NaN 값인지 아닌지를 True/False로 반환하는 함수이다.
 - .isnull에 .sum을 하게 되면 True의 개수를 더해주는 함수이다.
 - 기존 데이터는 전부 값이 있기 때문에 NaN이라는 Series를 추가하였고, NaN column만 1379개이다.
 
5. pd.options.display.max_rows
In [11]:pd.options.display.max_rows=100
In [12]:df
Out[12]:
earn            height  sex     race    ed  age race_code NaN
79571.299011	73.89	male	white	16	49	0	NaN
96396.988643	66.23	female	white	16	62	0	NaN
48710.666947	63.77	female	white	16	33	0	NaN
80478.096153	63.22	female	other	16	95	1	NaN
82089.345498	63.08	female	white	17	43	0	NaN
...	...	...	...	...	...	...	...
30173.380363	71.68	male	white	12	33	0	NaN
24853.519514	61.31	female	white	18	86	0	NaN
13710.671312	63.64	female	white	12	37	0	NaN
95426.014410	71.65	male	white	12	54	0	NaN
9575.461857	68.22	male	white	12	31	0	NaN
1379 rows × 8 columns
- max_rows값은 전체 데이터를 보고 싶을 때 값을 수정해줄 수 있다.
 - 예를 들어 현재 데이터는 1379개의 row로 구성되어있으니, max_rows=2000으로 설정하면
 - 중간의 ... 없이 전체 데이터를 출력해준다.
 - 필요에 따라 사용하지만, 대부분의 경우 속도가 느려져서 불편한 경우가 더 많으니 사용에 주의가 필요하다.
 
6. .sort_values 함수를 통한 Data 정렬
In [13]:df.sort_values(['age', 'earn'], ascending=True)
Out[13]:
     earn           height  sex     race     ed  age race_code NaN
1038 -56.321979     67.81   male    hispanic 10  22  2         NaN
800  -27.876819     72.29   male    white    12  22  0         NaN
963  -25.655260     68.90   male    white    12  22  0         NaN
1105 988.565070     64.71   female  white    12  22  0         NaN
801  1000.221504    64.09   female  white    12  22  0         NaN
...	
993  32809.632677   59.61   female  other    16  92  1         NaN
102  39751.194030   67.14   male    white    12  93  0         NaN
331  39169.750135   64.79   female  white    12  95  0         NaN
809  42963.362005   72.94   male    white    12  95  0         NaN
3    80478.096153   63.22   female  other    16  95  1         NaN
1379 rows × 8 columns
- Excel에서도 가장 많이 사용되는 기능은 Filter 후 정렬일 것이다.
 - 이와 동일한 기능을 .sort_values 함수를 통해서 pandas built-in function으로 제공한다.
 - In[13]은 'age', 'earn' 순서대로 정렬하고, 정렬 기준은 오름차순이라는 것을 전달한다.
 - 그에 따라 데이터가 정렬된 것을 확인할 수 있다.
 
7. .corr 함수를 통한 변수간 상관관계 분석
In [14]:df.corr()
Out[14]:
            earn        height    ed          age         race_code
earh        1.000000    0.291600  0.350374    0.074003    -0.063977
height      0.291600    1.000000  0.114047    -0.133727   -0.045974
ed          0.350374    0.114047  1.000000    -0.129802   -0.049487
age         0.074003    -0.133727 -0.129802   1.000000    -0.056879
race_code  -0.063977    -0.045974 -0.049487   -0.056879    1.000000
- dataframe.corr() 함수를 통해 dataframe의 모든 변수간의 상관관계를 파악할 수 있다.
 
8. 특정 변수 간의 상관관계 분석
In [15]:df.age.corr(df.earn)
Out[15]:0.07400349177836055
In [16]:df.age[(df.age<45)&(df.age>15)].corr(df.earn)
Out[16]:0.31411788725189044
In [17]:df.corrwith(df.earn)
Out[17]:earn 1.000000 
        height 0.291600
        ed 0.350374
        age 0.074003
        race_code -0.063977
        dtype: float64
- In[15] : Series.corr(Series) 형태로 넣으면, 두개의 변수 간의 상관관계 값을 추출할 수 있다
 - In[16] : Series의 형태만 맞춰주면 되기 때문에, Series에 조건을 추가하여 filter 할수도 있다.
 - In[17] : .corrwith 함수는 dataframe.corrwith(Series) 형태로 사용되는 함수이다. 즉, 하나의 변수가 dataframe 내의 다른 변수들과 어떤 상관관계를 보이는지를 볼 때 사용되는 함수이다.
 
9. .cov 함수를 통한 Covariance(공분산) 분석
In [18]:df.cov()
Out[18]:
           earn          height        ed            age           race_code
earh       9.770044e+08  34800.406853  26708.239215	 36523.699210  -1899.083575
height     3.480041e+04  14.577946     1.061937      -8.061985     -0.166699
ed         2.670824e+04  1.061937      5.947459      -4.998284     -0.114611
age        3.652370e+04  -8.061985     -4.998284     249.315087    -0.852894
race_code  -1.899084e+03 -0.166699     -0.114611     -0.852894     0.901869
In [19]:df.age.cov(df.earn)
Out[19]:36523.6992104089
- 공분산도 유사한 원리로 동작한다.
 - DataFrame.cov()를 할 경우 DataFrame 내의 모든 변수들 간의 공분산을 계산한다.
 - Series.cov(Series)를 할 경우, 두 변수간의 공분산을 구할 수 있다.
 
'Python과 머신러닝 > Pandas 데이터 분석' 카테고리의 다른 글
| [Python.Pandas] Groupby 이해하기 - 2편 (0) | 2020.12.24 | 
|---|---|
| [Python.Pandas] Groupby 함수 이해하기 - 1편 (0) | 2020.12.23 | 
| [Python.Pandas] DataFrame.apply, DataFrame.applymap (0) | 2020.12.21 | 
| [Python.Pandas] Map 함수 실전편 + .replace함수 사용하기 (0) | 2020.12.20 | 
| [Python.Pandas] Lambda함수와 Map함수 이해하기 - Series.map (0) | 2020.12.19 |