8 분 소요

이번 포스팅은 데이터 분석에 있어서 자주 사용하는 함수를 실습한 코드 입니다.

저번 포스팅에 이어서 실습한 코드 입니다.

pandas 패키지에는 여러 함수가 존재합니다. 데이터 분석에 있어서 조금 복잡해 보이는 부분이 있어도, pandas 패키지 안에 있는 함수 몇가지를 조합하면, 간단히 해결할 수 있었습니다.

자주 사용하는 pandas 함수를 정리하자면, query( ), assign( ), groupby( ), agg( ), sort_values( ), head( ), tail( ) 등이 있습니다.

query( )함수는 사용할 데이터만 따로 추출하는 것이고, assign( )은 변수 생성, groupby( )는 분리, 구분지어줄 때 사용합니다.

또한 agg( )함수는 agg()함수 안에 또 다른 함수를 조합해서 사용하게 되는데, mean(), sum(), median(), min(), max(), count()를 같이 사용하게 되며, 계산 값을 생성한 변수에 넣어줄 때 사용합니다.

이어서 sort_values( )는 내림차순, 오름차순 정렬할 때 사용하고, head( ), tail( )함수는 전의 포스팅 내용과 동일합니다.

실습을 위해 데이터를 불러오겠습니다. 데이터는 ggplot2 패키지에 들어있는 mpg 데이터 입니다.

import pandas as pd
data = pd.read_csv('mpg.csv')
data
manufacturer model displ year cyl trans drv cty hwy fl category
0 audi a4 1.8 1999 4 auto(l5) f 18 29 p compact
1 audi a4 1.8 1999 4 manual(m5) f 21 29 p compact
2 audi a4 2.0 2008 4 manual(m6) f 20 31 p compact
3 audi a4 2.0 2008 4 auto(av) f 21 30 p compact
4 audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
... ... ... ... ... ... ... ... ... ... ... ...
229 volkswagen passat 2.0 2008 4 auto(s6) f 19 28 p midsize
230 volkswagen passat 2.0 2008 4 manual(m6) f 21 29 p midsize
231 volkswagen passat 2.8 1999 6 auto(l5) f 16 26 p midsize
232 volkswagen passat 2.8 1999 6 manual(m5) f 18 26 p midsize
233 volkswagen passat 3.6 2008 6 auto(s6) f 17 26 p midsize

234 rows × 11 columns

위 데이터의 ‘manufacturer’별로 ‘compact’ 자동차의 연비 평균을 구한 다음, 연비가 높은 차량 5위 까지 출력하는 과정을 거치겠습니다.

data1 = data.query('category == "compact"')
data1
manufacturer model displ year cyl trans drv cty hwy fl category
0 audi a4 1.8 1999 4 auto(l5) f 18 29 p compact
1 audi a4 1.8 1999 4 manual(m5) f 21 29 p compact
2 audi a4 2.0 2008 4 manual(m6) f 20 31 p compact
3 audi a4 2.0 2008 4 auto(av) f 21 30 p compact
4 audi a4 2.8 1999 6 auto(l5) f 16 26 p compact
5 audi a4 2.8 1999 6 manual(m5) f 18 26 p compact
6 audi a4 3.1 2008 6 auto(av) f 18 27 p compact
7 audi a4 quattro 1.8 1999 4 manual(m5) 4 18 26 p compact
8 audi a4 quattro 1.8 1999 4 auto(l5) 4 16 25 p compact
9 audi a4 quattro 2.0 2008 4 manual(m6) 4 20 28 p compact
10 audi a4 quattro 2.0 2008 4 auto(s6) 4 19 27 p compact
11 audi a4 quattro 2.8 1999 6 auto(l5) 4 15 25 p compact
12 audi a4 quattro 2.8 1999 6 manual(m5) 4 17 25 p compact
13 audi a4 quattro 3.1 2008 6 auto(s6) 4 17 25 p compact
14 audi a4 quattro 3.1 2008 6 manual(m6) 4 15 25 p compact
141 nissan altima 2.4 1999 4 manual(m5) f 21 29 r compact
142 nissan altima 2.4 1999 4 auto(l4) f 19 27 r compact
169 subaru impreza awd 2.5 2008 4 auto(s4) 4 20 25 p compact
170 subaru impreza awd 2.5 2008 4 auto(s4) 4 20 27 r compact
171 subaru impreza awd 2.5 2008 4 manual(m5) 4 19 25 p compact
172 subaru impreza awd 2.5 2008 4 manual(m5) 4 20 27 r compact
186 toyota camry solara 2.2 1999 4 auto(l4) f 21 27 r compact
187 toyota camry solara 2.2 1999 4 manual(m5) f 21 29 r compact
188 toyota camry solara 2.4 2008 4 manual(m5) f 21 31 r compact
189 toyota camry solara 2.4 2008 4 auto(s5) f 22 31 r compact
190 toyota camry solara 3.0 1999 6 auto(l4) f 18 26 r compact
191 toyota camry solara 3.0 1999 6 manual(m5) f 18 26 r compact
192 toyota camry solara 3.3 2008 6 auto(s5) f 18 27 r compact
193 toyota corolla 1.8 1999 4 auto(l3) f 24 30 r compact
194 toyota corolla 1.8 1999 4 auto(l4) f 24 33 r compact
195 toyota corolla 1.8 1999 4 manual(m5) f 26 35 r compact
196 toyota corolla 1.8 2008 4 manual(m5) f 28 37 r compact
197 toyota corolla 1.8 2008 4 auto(l4) f 26 35 r compact
207 volkswagen gti 2.0 1999 4 manual(m5) f 21 29 r compact
208 volkswagen gti 2.0 1999 4 auto(l4) f 19 26 r compact
209 volkswagen gti 2.0 2008 4 manual(m6) f 21 29 p compact
210 volkswagen gti 2.0 2008 4 auto(s6) f 22 29 p compact
211 volkswagen gti 2.8 1999 6 manual(m5) f 17 24 r compact
212 volkswagen jetta 1.9 1999 4 manual(m5) f 33 44 d compact
213 volkswagen jetta 2.0 1999 4 manual(m5) f 21 29 r compact
214 volkswagen jetta 2.0 1999 4 auto(l4) f 19 26 r compact
215 volkswagen jetta 2.0 2008 4 auto(s6) f 22 29 p compact
216 volkswagen jetta 2.0 2008 4 manual(m6) f 21 29 p compact
217 volkswagen jetta 2.5 2008 5 auto(s6) f 21 29 r compact
218 volkswagen jetta 2.5 2008 5 manual(m5) f 21 29 r compact
219 volkswagen jetta 2.8 1999 6 auto(l4) f 16 23 r compact
220 volkswagen jetta 2.8 1999 6 manual(m5) f 17 24 r compact

먼저 query() 함수를 사용하면 compact차량만 따로 추출 된 것을 확인 할 수 있습니다.

data2 = data1.assign(total = (data['hwy'] + data['cty']) / 2)
data2
manufacturer model displ year cyl trans drv cty hwy fl category total
0 audi a4 1.8 1999 4 auto(l5) f 18 29 p compact 23.5
1 audi a4 1.8 1999 4 manual(m5) f 21 29 p compact 25.0
2 audi a4 2.0 2008 4 manual(m6) f 20 31 p compact 25.5
3 audi a4 2.0 2008 4 auto(av) f 21 30 p compact 25.5
4 audi a4 2.8 1999 6 auto(l5) f 16 26 p compact 21.0
5 audi a4 2.8 1999 6 manual(m5) f 18 26 p compact 22.0
6 audi a4 3.1 2008 6 auto(av) f 18 27 p compact 22.5
7 audi a4 quattro 1.8 1999 4 manual(m5) 4 18 26 p compact 22.0
8 audi a4 quattro 1.8 1999 4 auto(l5) 4 16 25 p compact 20.5
9 audi a4 quattro 2.0 2008 4 manual(m6) 4 20 28 p compact 24.0
10 audi a4 quattro 2.0 2008 4 auto(s6) 4 19 27 p compact 23.0
11 audi a4 quattro 2.8 1999 6 auto(l5) 4 15 25 p compact 20.0
12 audi a4 quattro 2.8 1999 6 manual(m5) 4 17 25 p compact 21.0
13 audi a4 quattro 3.1 2008 6 auto(s6) 4 17 25 p compact 21.0
14 audi a4 quattro 3.1 2008 6 manual(m6) 4 15 25 p compact 20.0
141 nissan altima 2.4 1999 4 manual(m5) f 21 29 r compact 25.0
142 nissan altima 2.4 1999 4 auto(l4) f 19 27 r compact 23.0
169 subaru impreza awd 2.5 2008 4 auto(s4) 4 20 25 p compact 22.5
170 subaru impreza awd 2.5 2008 4 auto(s4) 4 20 27 r compact 23.5
171 subaru impreza awd 2.5 2008 4 manual(m5) 4 19 25 p compact 22.0
172 subaru impreza awd 2.5 2008 4 manual(m5) 4 20 27 r compact 23.5
186 toyota camry solara 2.2 1999 4 auto(l4) f 21 27 r compact 24.0
187 toyota camry solara 2.2 1999 4 manual(m5) f 21 29 r compact 25.0
188 toyota camry solara 2.4 2008 4 manual(m5) f 21 31 r compact 26.0
189 toyota camry solara 2.4 2008 4 auto(s5) f 22 31 r compact 26.5
190 toyota camry solara 3.0 1999 6 auto(l4) f 18 26 r compact 22.0
191 toyota camry solara 3.0 1999 6 manual(m5) f 18 26 r compact 22.0
192 toyota camry solara 3.3 2008 6 auto(s5) f 18 27 r compact 22.5
193 toyota corolla 1.8 1999 4 auto(l3) f 24 30 r compact 27.0
194 toyota corolla 1.8 1999 4 auto(l4) f 24 33 r compact 28.5
195 toyota corolla 1.8 1999 4 manual(m5) f 26 35 r compact 30.5
196 toyota corolla 1.8 2008 4 manual(m5) f 28 37 r compact 32.5
197 toyota corolla 1.8 2008 4 auto(l4) f 26 35 r compact 30.5
207 volkswagen gti 2.0 1999 4 manual(m5) f 21 29 r compact 25.0
208 volkswagen gti 2.0 1999 4 auto(l4) f 19 26 r compact 22.5
209 volkswagen gti 2.0 2008 4 manual(m6) f 21 29 p compact 25.0
210 volkswagen gti 2.0 2008 4 auto(s6) f 22 29 p compact 25.5
211 volkswagen gti 2.8 1999 6 manual(m5) f 17 24 r compact 20.5
212 volkswagen jetta 1.9 1999 4 manual(m5) f 33 44 d compact 38.5
213 volkswagen jetta 2.0 1999 4 manual(m5) f 21 29 r compact 25.0
214 volkswagen jetta 2.0 1999 4 auto(l4) f 19 26 r compact 22.5
215 volkswagen jetta 2.0 2008 4 auto(s6) f 22 29 p compact 25.5
216 volkswagen jetta 2.0 2008 4 manual(m6) f 21 29 p compact 25.0
217 volkswagen jetta 2.5 2008 5 auto(s6) f 21 29 r compact 25.0
218 volkswagen jetta 2.5 2008 5 manual(m5) f 21 29 r compact 25.0
219 volkswagen jetta 2.8 1999 6 auto(l4) f 16 23 r compact 19.5
220 volkswagen jetta 2.8 1999 6 manual(m5) f 17 24 r compact 20.5

연비 변수를 따로 생성했습니다.

data3 = data2.groupby('manufacturer').agg(mean = ('total', 'mean'))
data3
mean
manufacturer
audi 22.433333
nissan 24.000000
subaru 22.875000
toyota 26.416667
volkswagen 24.642857

manufacturer별로 구분짓고, manufacturer별 연비 평균값을 내주었습니다.

data4 = data3.sort_values('mean', ascending = False)
data4
mean
manufacturer
toyota 26.416667
volkswagen 24.642857
nissan 24.000000
subaru 22.875000
audi 22.433333

상위 값을 추출하기 위해, 먼저 ‘mean’ 기준 내림차순 정렬을 했습니다

data5 = data4.head()
data5
mean
manufacturer
toyota 26.416667
volkswagen 24.642857
nissan 24.000000
subaru 22.875000
audi 22.433333

이제 마지막 과정인 제조사별 compact차량 상위 5개 연비를 구했습니다.

하지만 이 모든 과정은 하나의 코드로 추출 가능합니다.

data.query('category == "compact"')\
     .assign(total = (data['hwy'] + data['cty']) / 2)\
     .groupby('manufacturer').agg(mean = ('total', 'mean'))\
        .sort_values('mean', ascending = False)\
        .head()
mean
manufacturer
toyota 26.416667
volkswagen 24.642857
nissan 24.000000
subaru 22.875000
audi 22.433333

이와 같이 동일한 결과가 나오게 됩니다.

후기: 한 코드당 한 함수 쓰는 것은 참 쉽지만, 한 코드에 함수 다 몰아 쓰는건 아직도 어려운 듯 합니다. 손과 머리에 익숙해질 때 까지 반복 숙달 해야겠습니다.