판다스 (Pandas) 역시 NumPy와 더불어 데이터 분석과 처리를 쉽게 해줄 수 있는 라이브러리이다. Pandas는 NumPy를 기반으로 만들어졌으나, NumPy와 달리 데이터프레임 (DataFrame) 형식의 자료구조 분석에 더욱 특화되어 있으며 이외의 다양한 데이터 타입이 섞여 있을 때도 처리가 가능하다는 장점을 가지고 있다.
1) Pandas의 자료구조
간단히 Pandas를 사용해보기 위해 pd라는 별칭으로 라이브러리를 불러오자. Pandas에서 다루는 자료구조에는 크게 1차원 자료구조인 Series와 2차원 자료구조인 DataFrame이 있다. 우선 NumPy의 배열과 유사한 의미인 Series 자료구조에 대해 알아보자.
Series
Series 형식의 데이터는 1차원 배열에 인덱스를 붙여놓은 형태이다.
import pandas as pd
series = pd.Series([1, 2, 3, 4, 5])
series
▶ Series( ) 함수를 이용하여 [1, 2, 3, 4, 5] 리스트를 Series 형식의 데이터로 변환한다.
0 1
1 2
2 3
3 4
4 5
dtype: int64
☞ 좌측 열에 해당하는 인덱스 값이 0부터 시작하는 것을 확인할 수 있는데 이는 별도의 인덱스 레이블을 지정하지 않아 기본값(0부터 시작)이 적용된 것이다.
DataFrame
데이터프레임은 라벨을 가진 2차원 데이터를 생성하고 처리할 수 있는 데이터 구조이며, 그 안의 원소들은 리스트, 딕셔너리, NumPy 배열, 그리고 Series 형식의 데이터를 수용할 수 있다. 아래 그림은 데이터프레임의 구조를 보여준다.
[그림 2-2] 데이터프레임 구조
가장 왼쪽 열은 인덱스이며 0부터 시작하고, 상단의 첫 번째 행은 컬럼명이 나열되어 있다. index와 columns를 제외한 나머지 값은 values라고 하며, 실제 데이터 분석에 필요한 값을 의미한다. 데이터프레임을 생성하기 위해서는 DataFrame( )이라는 함수를 사용하며, 다음과 같이 리스트나 딕셔너리를 이용하여 만들 수 있다.
• 리스트를 활용한 데이터프레임 생성
columns_list = ['고객이름', '나이', '등급']
value_list = [['차희권', 27, 'Silver'], ['차동민', 6, 'Gold'], ['차승용', 23, 'Vip']]
pd.DataFrame(data=value_list, columns=columns_list)
▶ columns_list 객체에 컬럼명을, value_list 객체에 실제값을 리스트로 할당한다. 그 다음 Pandas 라이브러리의 DataFrame( ) 함수의 data 인자에 value_list를, columns 인자에 columns_list를 할당하여 데이터프레임을 생성한다.
• 딕셔너리를 활용한 데이터프레임 생성
dict = {'고객이름' : ['차희권','차동민현','차승용'], '나이' : [26,23,30], '등급' : ['Silver','Gold','Vip']}
pd.DataFrame(data=dict)
▶ ‘dict’라는 객체에 각 컬럼에 해당하는 ‘컬럼명:값’ 형태의 쌍을 입력하여 할당한다. 마찬가지로 pd.DataFrame( ) 함수를 사용하되, data 인자에만 dict 객체를 할당하였다.
두가지 방식의 데이터프레임 생성 예제는 다음과 같이 동일한 출력 결과를 갖는다.
2) Pandas를 이용한 기초통계
Pandas를 이용하면 간단하게 데이터의 기초통계를 구할 수 있다. Pandas를 사용한 기초통계분석을 수행하기 위해 아래와 같은 DataFrame 형태의 데이터 세트를 만들어보자.
sales_data = {'화장품': [300, 274, 150, 524, 211],
'의류': [773, 657, 699, 324, 487],
'식음료': [362, 131, 593, 348, 98],
'전자제품': [458, 667, 123, 521, 662]}
index_list = ['2014', '2015', '2016', '2017', '2018']
df_store = pd.DataFrame(data = sales_data, columns = columns_list, index = index_list)
df_store
▶ DataFrame( ) 함수의 index 인자를 사용하여 데이터프레임의 인덱스를 index_list의 값으로 지정하였다.
코드를 실행해보면 다음과 같은 출력 결과를 확인할 수 있다.
☞ 코드 실행 결과, 2014년부터 2018년까지의 상품 카테고리별 판매량을 나타내는 데이터프레임 객체 df_store가 생성되었다.
데이터프레임 객체 df_store의 평균과 표준편차를 구해보자. 평균은 mean( ), 표준편차는 std( ) 함수를 통해 구할 수 있다.
#평균 출력
print(df_store.mean())
#표준편차 출력
print(df_store.std())
화장품 291.8
의류 588.0
식음료 306.4
전자제품 486.2
dtype: float64
화장품 142.246968
의류 181.110464
식음료 200.721947
전자제품 222.213186
dtype: float64
☞ 출력 결과, 각 상품 카테고리별로 판매량의 평균과 표준편차가 계산되어 출력된 것을 확인할 수 있다.
다음으로 상품 카테고리가 아니라 연도별, 즉 인덱스별로 평균을 계산해보자.
print((df_store.mean(axis=1)))
▶ mean( ) 함수의 axis 인자를 통해 행과 열 중 어떤 축을 기준으로 연산할 것인지를 지정할 수 있다. 기본값은 ‘axis=0’으로 이는 열별 연산을 수행한다. ‘axis=1’로 지정하면 행별, 즉 인덱스별로 연산을 수행하게 된다.
[Out 30]
2014 473.25
2015 432.25
2016 391.25
2017 429.25
2018 364.50
dtype: float64
☞ 코드 실행 결과, 연도에 따라 모든 상품 카테고리의 판매량 평균이 집계되었다.
Pandas 라이브러리에서는 기초적인 통계량들을 한 번에 구할 수 있는 describe( ) 함수를 제공한다.
df_store.describe( )
☞ 각 컬럼별 개수, 평균, 표준편차, 최소값, 최대값, 4분위수까지 한 번에 출력되었다.
3) DataFrame에서 원하는 데이터 추출
DataFrame 속의 데이터가 방대할 경우 분석에 필요한 데이터만을 추출하는 기능은 매우 중요하다. DataFrame에서 분석에 필요한 데이터만을 추출하는 방법을 알아보자.
아래 코드는 백화점의 지점별, 연도별 고객의 방문횟수를 DataFrame 형태로 만든 것이다. 이 데이터를 활용하여 원하는 행과 열을 추출하는 방법을 알아보자.
dep_data = {'명동점': [59060, 49296, 62015, 48621, 46712, 31216, 38467],
'분당점': [9312, 1267, 6893, 7226, 8878, 13622, 18228],
'광주점': [2627, 4145, 4088, 4321, 4679, 4994, 5544],
'부산점': [14211, 11071, 11234, 15424, 12146, 39415, 57866],
'송도점': [np.nan,np.nan, 9912, 9224, 8395, 9786, 9667]}
index_list = ['2011', '2012', '2013', '2014', '2015', '2016', '2017']
df_store = pd.DataFrame(dep_data, index = index_list)
df_store
이렇게 생성된 데이터프레임에서 아래와 같이 특정 행의 범위를 추출할 수 있다.
df_store[0:2]
▶ df_stroe[0:2] 코드를 통해 추출할 행이 시작하는 위치의 인덱스와 끝나는 위치의 인덱스를 지정하여 원하는 행만을 추출한다.
출력 결과는 다음과 같다.
loc[ ] 함수를 이용하면 인덱스명을 직접 입력하여 원하는 행을 추출할 수 있다.
df_store.loc['2016']
명동점 31216.0
분당점 13622.0
송도점 9786.0
부산점 39415.0
광주점 4994.0
Name: 2016, dtype: float64
☞ 2016년도 지점별 고객 방문횟수가 출력되었다.
This post was written based on what I read and studied the book below.
http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791195511747
댓글