데이터 분석 2nd(Data Analysis)
이번 포스팅은 데이터 분석에 있어서 자주 사용하는 함수를 실습한 코드 입니다.
저번 포스팅에 이어서 실습한 코드 입니다.
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 |
이와 같이 동일한 결과가 나오게 됩니다.
후기: 한 코드당 한 함수 쓰는 것은 참 쉽지만, 한 코드에 함수 다 몰아 쓰는건 아직도 어려운 듯 합니다. 손과 머리에 익숙해질 때 까지 반복 숙달 해야겠습니다.