데이터 분석 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 |
이와 같이 동일한 결과가 나오게 됩니다.
후기: 한 코드당 한 함수 쓰는 것은 참 쉽지만, 한 코드에 함수 다 몰아 쓰는건 아직도 어려운 듯 합니다. 손과 머리에 익숙해질 때 까지 반복 숙달 해야겠습니다.