7 분 소요

ABC 부트캠프 [Pandas, Numpy]

image

오늘은 판다스(Pandas) 라이브러리와 넘파이(Numpy) 라이브러리를 배웠다.

두 라이브러리가 어떤 것이고, 무슨 역할을 하는지 간단한 설명과 실습을 진행해보자

#3 판다스(Pandas) 라이브러리란?

판다스(Pandas)는 파이썬 데이터 처리를 위한 파이썬 패키지다.

import pandas as pd

파이썬을 이용한 데이터 분석과 같은 작업에서 필수 라이브러리로 for문이나

조건문이 전혀 필요없이 간단한 함수로만으로도 표현이 가능한 장점이 있다!

image

데이터 처리는 판다스가 해결해준다구 ~.. ~

넘파이(Numpy) 라이브러리란?

넘파이(Numpy)는 수치 데이터를 다루는 파이썬 패키지다.

import numpy as np

numpy에서는 기본적으로 array라는 단위로 데이터를 관리하며 이에 대해 연산을 수행한다.

함수와 메서드 차이 알아보기

· 내장함수: sum()

sum(var) / max(var)

· 패키지함수: pd.read_csv()

import pandas as pd

pd.read_csv(‘exam.csv’)

pd.DataFrame({‘x’ : [1, 2, 3]})

· 메서드: df.head()

메서드(method): 변수가 지니고 있는 함수

df.head() / df.info()

데이터 프레임

df = pd.read_csv('exam.csv')
df.head()
   id  nclass  math  english  science
0   1       1    50       98       50
1   2       1    60       97       60
2   3       1    45       86       78
3   4       1    30       98       58
4   5       2    25       80       65

메서드와 어트리뷰트 차이

메서드(method): 변수가 지니고 있는 함수

어트리뷰트(attribute): 변수가 지니고 있는 값

메서드

df.head()
   id  nclass  math  english  science
0   1       1    50       98       50
1   2       1    60       97       60
2   3       1    45       86       78
3   4       1    30       98       58
4   5       2    25       80       65

어트리뷰트

df.shape

(20, 5) ​

이제 두 라이브러리를 사용하는 데이터 분석 기초인 데이터를 파악해보자~

Pandas 함수 종류

image

데이터 파악하기(ex) mpg 파일)

mpg.head() - 데이터 앞부분 확인하기

mpg.tail() - 데이터 뒷부분 확인하기

mpg.shape() - 데이터가 몇행, 몇열로 구성되는지 알아보기

mpg.info() - 속성파악(Data type)

mpg.describe(include=’all’) - 요약 통계량 구하기

mpg 파일 각 변수명

image

변수명 바꾸기

1. 데이터 프레임 만들기

df_mpg = pd.read_csv('mpg.csv')

2. 데이터 프레임 복사본 만들기

df_new = df_mpg.copy()     # 복사본 만들기
df_new                     # 출력

image

3. 변수명 바꾸기

df_new = df_new.rename(columns={'manufacturer':'manufact'})   # {원래 컬럼명:바꿀 컬럼명}
df_new

image

※ manufacturer -> manufact

4. 파생변수 만들기

변수를 조합해 파생변수 만들기 => mpg 통합 연비 변수 만들기

# 통합연비 = 도시연비 + 고속도로연비
mpg['total'] = (mpg['cty'] + mpg['hwy']) / 2
mpg.head()

mpg['total'].mean()   # 통합연비 평균 확인

통합 연비 그래프

mpg['total'].plot.hist(); 

image

1) 활용해 파생 변수 만들기

  • 판정 합격 변수 만들기
  • numpy 라이브러리 사용
# 통합 연비가 20이상이면 pass, 그렇지 않으면 fail 부여하는 test 파생변수 만들기
import numpy as np

mpg['test'] = np.where(mpg['total'] >= 20, 'pass', 'fail')  # np.where(조건식, true, false)
mpg.head()


mpg.head(20)    # 잘들어갔는지 확인

2) 빈도표로 합격 판정 자동차수 살펴보기

count_test = mpg['test'].value_counts()
count_test
  • 막대 그래프로 빈도 표현
# x축 이름을 수평으로 만들기
count_test.plot.bar(rot=0);   # rot는 로테이션

image

중첩 조건문 활용

1) 연비 등급 변수 만들기

# 통합 연비 기준으로 A(30이상), B(20이상), C(그외) 등급 부여하는 grade 변수 만들기

mpg['grade'] = np.where(mpg['total'] >= 30, 'A',
                        np.where(mpg['total'] >= 20, 'B', 'C'))

mpg.head(40)

2. 빈도표와 막대 그래프로 연비 등급 살펴보기

count_grade = mpg['grade'].value_counts()
count_grade.plot.bar(rot=0);   # 보통은 카운트가 큰 값이 먼저 나옴

image

3. 알파벳순으로 막대(x축) 정렬

count_grade = mpg['grade'].value_counts().sort_index()    # 메서드 체이싱(연결) / sort_index => 정렬
count_grade.plot.bar(rot=0)

메서드 체인싱이란?

# 출력 결과를 변수에 할당하는 방법
df = mpg['grade']
df = df.value_counts()
df = df.sort_index()

# 메서드 체이싱
df = mpg['grade'].value_counts().sort_index()

차량 종류(7종류)를 small, large 파생변수 만들기

# compact, subcompact, 2seater은 small, 그 외는 large로 담는 size 파생변수 만들기

mpg['size'] = np.where((mpg['category'] == 'compact') |
                       (mpg['category'] == 'subcompact') |
                       (mpg['category'] == '2seater'), 'small', 'large' )
mpg['size'].value_counts()

image

isin을 사용하여 코드 줄이기 (위와 결과 동일)

mpg['size'] = np.where(mpg['category'].isin(['compact', 'subcompact', '2seater']), 'small', 'large' )

mpg['size'].value_counts()

조건에 맞는 데이터 추출하기

image

query문을 사용하여 추출(검색)하기

# mpg 데이터에서 category가 minivan인 아닌 경우만 추출
mpg_df.query("category != 'minivan'")      #  ""는 ''안에 올 수 없어서 ""로 감싼다.

초과(>), 미만(<), 이상(>=), 이하(<=) 조건 걸기

# 연식이 2000년 초과인 경우
mpg_df.query("year > 2000")

# 연식이 2000년 미만인 경우
mpg_df.query("year < 2000")

# 연식이 2000년 이상인 경우
mpg_df.query("year >= 2000")

# 연식이 2000년 이하인 경우
mpg_df.query("year <= 2000")

여러 조건을 충족하는 행 추출하기

# minivan 이면서, 연식이 2000년 이상인 경우
mpg_df.query("category == 'minivan' & year >= 2000 ")     # & (and)연산을 사용해서 조건을 두개 충족한다.

# minivan 이거나, 연식이 2000년 이상인 경우
mpg_df.query("category == 'minivan' | year >= 2000 ")     # | (or)연산을 사용해서 조건을 두개 충족한다.

목록에 해당되는 행 추출하기

# 차종이 minivan 이거나, 2seater거나 pickup인 경우
mpg_df.query("category == 'minivan' | category == '2seater' | category == 'pickup' ")     # | 연산을 사용해서 조건을 여러개 충족한다.

# 차종이 minivan 이거나, 2seater거나 pickup인 경우
mpg_df.query("category in ['minivan', '2seater', 'pickup']")    # in 연산자와 리스트를 사용해서 코드를 줄인다.

추출한 행으로 데이터 만들기

# 차종이 minivan인 행만 추출해서 category_minivan 변수에 담기
category_minivan = mpg_df.query("category == 'minivan'")

# 차종이 2seater인 행만 추출해서 category_2seater 변수에 담기
category_2seater = mpg_df.query("category == '2seater'")

# minivan의 도시 연비 평균 구하기  (연비는 높을 수록 좋다)
category_minivan['cty'].mean()

# 2seater의 도시 연비 평균 구하기
category_2seater['cty'].mean()

# 외부 변수와 메서드 체이싱을 활용한 각 차종의 도시연비평균 구하기
var = 'minivan'    # var = '2seater'  /  var = 'suv'
mpg_df.query("category == @var")['cty'].mean     # 외부 변수를 @(변수)를 쓰면 바로 변수를 확인 가능

필요한 변수만 추출하기

변수 추출하기

# 차종만 추출
mpg_df['category']      # Pandas의 Series(단일행)로 추출하기

# 차종만 추출
mpg_df[['category']]    # Pandas의 데이터프레임(데이터프레임 기능 사용 가능) -> [[]]으로 추출하기

여러 변수 추출하기

# 모델, 연식, 차종만 추출
mpg_df[['model', 'year', 'category']]

변수 제거하기

mpg_df.drop(columns= 'category')    # drop으로 삭제. 그냥만 하면 리턴해준다.

mpg_df.drop(columns= ['category', 'model'])    # 차종과 모델 컬럼 삭제(리스트를 씌운다)
# mpg_df.drop(columns= ['category', 'model'], inplace=True)    # inplace는 바로 삭제(리턴X)

Pandas 함수 조합하기

query()와 [ ] 조합하기

# 차종이 minivan 차종을 가진 모델명 추출
mpg_df.query("category == 'minivan'")['model']

# 차종이 minivan 차종을 가진 모델명, 연식 추출
mpg_df.query("category == 'minivan'")[['model', 'year']]

# 일부만 출력하기 ( head(5) 사용)
# 차종이 minivan 차종을 가진 모델명, 연식 데이터를 5행만 추출
mpg_df.query("category ==  'minivan'")[['model','year']].head(5)

image

순서대로 정렬하기

오름차순으로 정렬하기

# 자동차 연식 기준으로 정렬하기 (오름차순)
mpg_df.sort_values('year')

내림차순으로 정렬하기

# 자동차 연식 기준으로 정렬하기 (내름차순)
mpg_df.sort_values('year', ascending=False)    # 내림차순으로 하려면 ascending(오름차순)을 False 하면 됨(오름차순 기준)

여러 정렬 기준

# 자동차 차종, 연식 기준으로 정렬하기 (오름차순)
mpg_df.sort_values(['category','year'])

# 자동차 차종(오름차순), 연식(내림차순) 기준으로 정렬하기
mpg_df.sort_values(['category','year'], ascending=[True, False])   # ascending을 이용한 나눔 정렬

파생변수 추가하기

# total((도시연비+고속도로연비)/2)변수 추가
mpg_df.assign(total = (mpg_df['cty']+mpg_df['hwy'])/2 )

# total(도시연비+고속도로연비) 변수
# mean(도시연비+고속도로연비)/2) 통합 평균연비 변수
mpg_df.assign(total = (mpg_df['cty']+mpg_df['hwy']),
               mean = (mpg_df['cty']+mpg_df['hwy'])/2)

mpg_df = mpg_df.assign(total = (mpg_df['cty']+mpg_df['hwy']),
               mean = (mpg_df['cty']+mpg_df['hwy'])/2)

df.assign()에 np.where() 적용하기

import numpy as np

mpg_df = mpg_df.assign(test = np.where(mpg_df['mean'] >= 20, 'pass', 'fail'))
mpg_df

집단별로 요약하기

전체 요약통계량 구하기

· agg 사용 : ( 통계변수 = (컬럼명, 통계기법))

· groupby() 사용 : ~별로 그룹으로 지어줄 때

# 통합연비(total)의 평균 구하기
mpg_df.agg(mean_total = ('total', 'mean'))     # agg는 통계를 내는 기능을 가짐

# 차종별로 통합연비 평균 구하기
mpg_df.groupby('category').agg(mean_total = ('total', 'mean'))  # group으로 지어서 (통계변수 = 컬럼명, 통계기법) 표현

집단별로 다시 집단 나누기

# 제조 회사별로 분류하고 구동 방식별로 분리 -> 도시 연비의 평균
# F는 Front whell: 전륜, R은 Rear Wheel: 후륜, 4: 사륜
mpg.groupby(['manufacturer', 'drv']).agg(mean_cty = ('cty', 'mean'))

( 그룹화 O )

# audi의 구동방식별 차량의 수
# 1) audi 추출
# 2) 구동 방식으로 fripby
# 3) 차량의 빈도 구하기 agg -> count
mpg.query("manufacturer == 'audi'").groupby('drv').agg(n = ('drv', 'count'))

image

( 그룹화 X )

mpg.query("manufacturer == 'audi'")['drv'].value_counts()    # 위 형식과 출력은 같으나 grouping 되어 있는 것이 다름

image

# volkswagen의 연식별 차량의 빈도
# 1) volkswagen 추출
# 2) 연식으로 groupby
# 3) 차량의 빈도 구하기 agg -> count
mpg.query("manufacturer == 'volkswagen'").groupby('year').agg(n = ('year', 'count'))

그래프 그리기

산점도 - 변수 간의 관계 표현하기

​ · 산점도 그리기

import seaborn as sns

# x축은 displ(배기량), y축은 hwy(고속도로연비) 나타내는 산점도 만들기
sns.scatterplot(data=mpg, x='displ', y='hwy')

image

# x축은 displ(배기량), y축은 hwy(고속도로연비) 나타내는 산점도 만들기 -> 구동방식(drv) 색으로 표시
sns.scatterplot(data=mpg, x='displ', y='hwy', hue='drv')

image

# x축은 displ(배기량), y축은 hwy(고속도로연비) 나타내는 산점도 만들기 -> 연식(year) 색으로 표시
sns.scatterplot(data=mpg, x='displ', y='hwy', hue='year')

image

막대 그래프 - 집단 간 차이 표현하기

평균 막대 그래프

  1. 집단별 평균표 만들기
# 구동방식별 고속도로 연비의 평균표 만들기
df_mpg = mpg.groupby('drv', as_index=False).agg(mean_hwy = ('hwy', 'mean'))   # mean_hwy = 고속도로 평균표
df_mpg

​2. 막대 그래프 그리기 (barplot 사용)

sns.barplot(data=df_mpg, x='drv', y='mean_hwy')     # barplot은 바로 나타내는 그래프

image

  1. 크기 순으로 막대 그래프 정렬하기
df_mpg = df_mpg.sort_values('mean_hwy', ascending=False)

# 크기
df_mpg = df_mpg.sort_values('mean_hwy')
sns.barplot(data=df_mpg, x='drv', y='mean_hwy')

image

집단별 빈도표 만들기

# 구동방식별 빈도표 만들기
df_mpg = mpg.groupby('drv', as_index=False).agg(n= ('drv', 'count'))
df_mpg

sns.barplot(data=df_mpg.sort_values('n', ascending=False), x='drv', y='n')

image

빈도 막대 그래프 그리기 ( 순서대로 정렬 )

sns.countplot(data=mpg, x='drv', order=['4', 'f', 'r'])      # order은 순서대로 정렬해서 보여주게 해준다.

image

—​

이렇게 이번 시간에는 Pandas와 numpy를 사용한

데이터 분석 시간을 가졌다.

그동안 했던 어려운 방식의 코드를 생각해보면,

라이브러리로 간단하게 만들 수 있다는 점이 제일 장점인 것 같다.

코드의 가독성이 뛰어난 만큼, 코드에 대한 이해가 높아야하고, 외워야 할 함수들이 많아서

라이브러리 사용하면 쉽다고 넘어갈 문제가 아니라,

오히려 쉬운 만큼 더욱 더 해보고, 상황에 쓰이는 각 함수들을 맞게 사용해야 하는 점이

가장 이 라이브러리를 사용할 때 골고루 써먹을 수가 있다는 강점이다!

댓글남기기