EDA with Python - Pandas

Page content

강의 홍보

I. 개요

  • Pandaspanel data의 의미를 가지고 있다.
  • 흔히, 엑셀 데이터로 불리우는 관계형(Relational) 또는 레이블링된(Labeling)된 데이터를 보다 쉽게, 직관적으로 작업할 수 있도록 설계되어 있다.
  • Python에서 데이터 분석을 수행하기 위한 매우 기초적이며 높은 수준의 문법을 제공한다.
  • Pandas는 크게 Series & DataFrame을 다룰 수 있도록 기초 문법을 제공하고 있다.
  • Pandas가 다루는 여러 종류의 데이터를 확인해보자.
    • SQL 테이블 또는 Excel 스프레드시트에서와 같이 형식의 행과 열이 있는 표 형식 데이터
    • 순서 및 순서 지정되지 않은(고정 빈도일 필요는 없음) 시계열 데이터.
    • 행 및 열 레이블이 있는 임의 행렬 데이터(동일하게 입력 또는 이기종)
    • 기타 형태의 관측/통계 데이터 세트

II. 모듈 Import

import pandas as pd
print(pd.__version__)
1.0.3

III. Pandas 기본 활용법

  • Pandas가 제공하는 다양한 기능은 다음과 같지만, 본 튜토리얼에서는 Sample 위주로 다루도록 한다.
    • 부동 소수점 데이터뿐만 아니라 부동 소수점 데이터에서도 결측 데이터(NaN으로 표시됨)를 쉽게 처리함
    • 크기 변이성: DataFrame 및 고차원 객체에서 열을 삽입 및 삭제 가능
    • 자동 및 명시적 데이터 정렬: 객체를 라벨 집합에 명시적으로 정렬하거나, 사용자가 라벨을 무시하고 Series, DataFrame 등이 자동으로 데이터를 계산에서 정렬 가능
    • 데이터 집합에서 데이터 집합의 분할 적용 결합 작업을 수행할 수 있는 기능
    • 다른 PythonNumPy 데이터 구조에서 색인이 다른 데이터를 DataFrame 개체로 쉽게 변환
    • 지능형 라벨 기반 슬라이싱, 고급 인덱싱 및 대용량 데이터 세트 부분 집합 취하기
    • 직관적인 데이터 세트 병합 및 결합
    • 유연한 데이터 세트 재구성 및 피벗테이블 구성
    • 축의 계층적 라벨링(눈금당 여러 개의 라벨을 가질 수 있음)
    • 플랫 파일(CSV 및 구분), Excel 파일, 데이터베이스 로딩 및 초고속 HDF5 형식의 데이터 저장/로딩에 사용되는 강력한 데이터 IO 도구
    • 시계열별 기능: 날짜 범위 생성 및 주파수 변환, 이동 창 통계, 날짜 이동 및 지연.

IV. Pandas Sample Tutorial

  • 간단하게 Pandas를 활용한 Tutorial을 확인해보자.

(1) 파라미터 세팅

  • 먼저, 행과 열을 최대 출력하는 개수를 지정한다.
pd.set_option('display.max_columns', 500)
pd.set_option('display.max_rows', 500)

(2) 데이터 생성

  • 데이터를 생성하는 방법은 크게 2가지로 구분된다. (Series, DataFrame)
  • 먼저 Series를 만들어보자.
temp_series = pd.Series([1,2,3,5,8,13,21])
print(temp_series)
0     1
1     2
2     3
3     5
4     8
5    13
6    21
dtype: int64
  • 이제 Series에 있는 데이터와 함께 DataFrame을 만든다.
series_df = pd.DataFrame({
    "No":range(1,5), 
    "날짜":pd.Timestamp('20200601'), 
    "출석점수":pd.Series(5, index=list(range(4)), dtype='float64'), 
    "등급":pd.Categorical(["A등급", "B등급", "C등급", "D등급"]), 
    "구분":"학점"
})

print(series_df)
   No         날짜  출석점수   등급  구분
0   1 2020-06-01   5.0  A등급  학점
1   2 2020-06-01   5.0  B등급  학점
2   3 2020-06-01   5.0  C등급  학점
3   4 2020-06-01   5.0  D등급  학점
  • 이번에는 딕셔너리에서 데이터프레임으로 변환하는 소스코드다.
  • 아래 코드에서 보여주고자 하는 것은 딕셔너리의 크기가 동일하지 않아도, 데이터프레임으로 변환되는데 문제가 없다.
  • 다만, NaN으로 채울 뿐이다.
dict_df = [{'가': '사과', '나': '볼'},{'가': '비행기', '나': '방망이', '다': '고양이'}]
dict_df = pd.DataFrame(dict_df)
print(dict_df)
     가    나    다
0   사과    볼  NaN
1  비행기  방망이  고양이
  • 이번에는 배열에서 데이터프레임으로 변환하는 소스코드다.
sdf = {
    '국가':['한국', '미국', '일본'],
    'ISO-Code':[1,2,3],
    '지역': [4180.69, 4917.94, 454.07,],
    '위치': ["서울", "LA", "동경"]
    }
sdf = pd.DataFrame(sdf)
print(sdf)
   국가  ISO-Code       지역  위치
0  한국         1  4180.69  서울
1  미국         2  4917.94  LA
2  일본         3   454.07  동경

(3) 파일 입출력

  • 외부 데이터의 파일 입출력에 대한 코드를 입력한다.
url = 'http://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data'
df = pd.read_csv(url)
print(df.head(2))
   39          State-gov   77516   Bachelors   13        Never-married  \
0  50   Self-emp-not-inc   83311   Bachelors   13   Married-civ-spouse   
1  38            Private  215646     HS-grad    9             Divorced   

         Adm-clerical   Not-in-family   White   Male   2174   0   40  \
0     Exec-managerial         Husband   White   Male      0   0   13   
1   Handlers-cleaners   Not-in-family   White   Male      0   0   40   

    United-States   <=50K  
0   United-States   <=50K  
1   United-States   <=50K  
  • 컬럼명이 지정되지 않아 관측값이 컬럼명 위치에 있는 것을 확인할 수 있다.
  • 이 때에는 컬럼명을 먼저 저장한 뒤, 아래와 같은 코드로 실행하면 정상적으로 데이터프레임이 완성된다.
columns = ['age', 'workclass', 'fnlwgt', 'education', 'education_num', 
           'marital_status', 'occupation', 'relationship', 'ethnicity', 
           'gender','capital_gain','capital_loss','hours_per_week','country_of_origin','income']

df2 = pd.read_csv(url, names=columns)
print(df2.head(2))
   age          workclass  fnlwgt   education  education_num  \
0   39          State-gov   77516   Bachelors             13   
1   50   Self-emp-not-inc   83311   Bachelors             13   

        marital_status        occupation    relationship ethnicity gender  \
0        Never-married      Adm-clerical   Not-in-family     White   Male   
1   Married-civ-spouse   Exec-managerial         Husband     White   Male   

   capital_gain  capital_loss  hours_per_week country_of_origin  income  
0          2174             0              40     United-States   <=50K  
1             0             0              13     United-States   <=50K  
  • 컬럼명에 대한 정보는 Adult Data Set 에서 참고한다.
  • 판다스를 배울 때 조금더 자세히 배우겠지만, info() 함수를 사용하면 데이터의 일반적인 정보를 확인할 수 있다.
print(df2.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 32561 entries, 0 to 32560
Data columns (total 15 columns):
 #   Column             Non-Null Count  Dtype 
---  ------             --------------  ----- 
 0   age                32561 non-null  int64 
 1   workclass          32561 non-null  object
 2   fnlwgt             32561 non-null  int64 
 3   education          32561 non-null  object
 4   education_num      32561 non-null  int64 
 5   marital_status     32561 non-null  object
 6   occupation         32561 non-null  object
 7   relationship       32561 non-null  object
 8   ethnicity          32561 non-null  object
 9   gender             32561 non-null  object
 10  capital_gain       32561 non-null  int64 
 11  capital_loss       32561 non-null  int64 
 12  hours_per_week     32561 non-null  int64 
 13  country_of_origin  32561 non-null  object
 14  income             32561 non-null  object
dtypes: int64(6), object(9)
memory usage: 3.7+ MB
None

V. 결론

  • 간단하게 Pandas를 활용한 데이터 생성 및 파일 입출력에 대해서 배우는 시간을 가졌다.
  • 만약, 빠르게 판다스를 활용하여 데이터 전처리를 연습 하고 싶다면, 공식홈페이지에 있는 10 minutes to pandas에서 학습하는 것을 권장한다.
  • 강사는 Kaggle 데이터를 활용하여 Pandas 함수를 응용할 것이다.

Reference

Mukhiya, Suresh Kumar, and Usman Ahmed. “Hands-On Exploratory Data Analysis with Python.” Packt Publishing, Mar. 2020, www.packtpub.com/data/hands-on-exploratory-data-analysis-with-python.