Development

Python 시작하기 #4 : 모듈, 패키지, 라이브러리

jjangmo91 2025. 5. 8. 17:28

안녕하세요:) 이번 포스팅에서는 Python의 모듈(Module), 패키지(Package), 라이브러리(Library)에 대해 알아보겠습니다. 이 글은 Python 공식 문서를 참고하여 작성하였습니다.

 

실습 링크

https://github.com/jjangmo91/ParkLab/blob/main/Python/05_Module_%26_Package_%26_Library.ipynb

 

ParkLab/Python/05_Module_&_Package_&_Library.ipynb at main · jjangmo91/ParkLab

Contribute to jjangmo91/ParkLab development by creating an account on GitHub.

github.com


파이썬 생태계

Python은 웹 개발, 데이터 과학, 자동화, AI 등 다양한 분야에서 활발히 사용되며, 오픈소스 패키지와 라이브러리들이 지속적으로 개발·관리되는 거대한 생태계를 형성하고 있습니다. 주요 구성 요소는 다음과 같습니다.

  • 표준 라이브러리(stdlib) : Python 설치 시 함께 제공되는 기본 모듈 모음
  • PyPI(Python Package Index) : Python 커뮤니티에서 개발·공유한 소프트웨어를 모아놓은 공식 저장소로, pip를 이용해 60만 개 이상의 프로젝트와 라이브러리를 설치할 수 있습니다.
  • 커뮤니티 & 프레임워크 : 웹 개발(Django, Flask), 데이터 과학(TensorFlow, PyTorch) 등 분야별 주요 프로젝트
  • 패키지 관리 도구 : 패키지 설치·업데이트·의존성 관리를 도와주는 도구 pip(기본), conda 등

이처럼 방대한 생태계 덕분에, 필요한 기능을 직접 구현하지 않고도 검증된 패키지를 가져다 쓰는 방식으로 즉시 활용할 수 있습니다.


모듈, 패키지, 라이브러리

실제 데이터 분석에서는 "패키지"와 "라이브러리" 용어를 구분 없이 혼용하여 부릅니다. 간단히 다음과 같이 이해하면 좋습니다.

  • 모듈(module) : 함수, 클래스 등을 담은 단일 .py 파일
  • 패키지(package) : 관련 모듈을 폴더로 묶어놓은 것으로, 폴더에 _init_.py 파일이 있어야 패키지로 인식됩니다.
  • 라이브러리(library) : 특정 목적(데이터 분석, 시각화, 머신러닝 등)을 위해 배포·설치 가능한 패키지 모음
my_module.py           # 모듈
└── my_module.py

my_package/            # 패키지
    ├── __init__.py
    └── sub_module.py

data_lib (라이브러리)
    ├── package_a/
    ├── package_b/
    └── setup.py        # 배포용 설정 파일

주요 라이브러리 설치 및 소개

데이터 분석에서 자주 사용되는 라이브러리는 다음과 같습니다. colab 환경이나 터미널에서 바로 설치 가능합니다.

# Colab에서 바로 설치
!pip install numpy pandas matplotlib
!pip install seaborn plotly folium
!pip install geopandas shapely rasterio fiona
!pip install statsmodels scikit-learn xgboost lightgbm

출처: https://www.marketcalls.in/python/exploring-the-essential-python-libraries-for-data-analytics.html

 

패키지 주요 기능은 다음과 같습니다.

패키지 주요 기능
numpy 빠른 수치 연산과 다차원 배열 처리
pandas 표 형식(데이터프레임) 데이터 조작
matplotlib 대표적인 2D 시각화 도구
seaborn 통계적 데이터 시각화
plotly 인터랙티브 그래프 및 대시보드
folium Leaflet 기반 웹 지도 시각화
geopandas 데이터프레임 기반 공간(지리) 데이터 처리 및 시각화
shapely 지리공간(Geometry) 객체 처리
rasterio 래스터(위성·항공) 데이터 입출력 및 처리
fiona 벡터(Shapefile, GeoJSON) 데이터 입출력
statsmodels 통계 모델링(회귀분석, 시계열 분석 등)
scikit-learn 머신러닝 알고리즘
xgboost 그래디언트 부스팅 머신
lightgbm 경량화된 그래디언트 부스팅

데이터 가져오기 및 분석 예시

국립공원공단에서 제공하는 생물자원 현황 데이터를 활용해 보겠습니다. 이번 예제에서 사용될 데이터는 실습 링크의  GitHub 레포지토리에 CSV포맷 형태로 준비되어 있습니다.

 

 

파이썬 환경에서 데이터 분석을 시작하기 전에, 필요한 라이브러리들을 설치하고 그래프에 한글이 올바르게 보이도록 폰트를 설정합니다. 실제 프로젝트에서는 한글 대신 영어와 숫자 조합의 변수명을 사용해 폰트 문제를 피하기도 하지만, 이번 예제에서는 시각적 이해를 위해 한글을 그대로 사용하겠습니다.

# Colab에서 바로 설치
!pip install pandas numpy matplotlib seaborn
# 한글 폰트 설치
!apt-get update -qq
!apt-get install -y fonts-nanum

 

데이터 처리와 시각화를 위해 가장 많이 쓰이는 파이썬 라이브러리를 불러오고, 한글 레이블이 깨지지 않도록 시스템에 설치된 Nanum 폰트를 등록하는 단계입니다.

  • pandas : CSV나 엑셀 파일을 읽고, 테이블 형태로 다룰 수 있게 해 주는 핵심 라이브러리
  • numpy : 수친 연산을 최적화한 배열 객체(ndarray)를 제공하며, 벡터·행렬 연산에 탁월
  • matplotlib.pyplot : 파이썬 기본 시각화 라이브러리로, 세부 설정을 사용자 정의하기 좋음
  • seaborn : matplotlib를 기반으로 더 세련된 통계 그래프(히트맵, 박스플롯 등)를 간단한 코드로 그려줌
  • matplotlib.font_manager : 시스템 폰트를 matplotlib에 등록할 때 사용 
# pandas: 데이터 불러오기 및 데이터 프레임 관리
import pandas as pd

# numpy: 수치 연산 및 배열 처리
import numpy as np

# matplotlib, seaborn: 데이터 시각화
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.font_manager as fm

# 한글 폰트 등록 및 설정
font_dirs = ['/usr/share/fonts/truetype/nanum/']
for font_path in fm.findSystemFonts(font_dirs):
    fm.fontManager.addfont(font_path)
plt.rc('font', family='NanumGothic') # Matplotlib이 기본으로 사용할 폰트로 설정
plt.rc('axes', unicode_minus=False) # 음수(-) 기호가 깨지지 않도록 설정

 

다음 코드는 GitHub에 호스팅된 국립공원 생물종 관측 CSV 파일을 pandas의 read_csv 함수로 읽어들여, 곧바로 표 형식의 DataFrame 객체인 df에 저장하는 단계입니다. 결과적으로 df는 엑셀과 유사한 형태의 표 데이터가 되어, 열 이름으로 접근하거나 필터링·집계·정렬 등 다양한 pandas 메서드를 이용한 후속 분석이 쉽도록 준비됩니다.

# 국립공원 데이터 불러오기
file_path = (
    "https://raw.githubusercontent.com/jjangmo91/ParkLab/refs/heads/main/data/"
    "%EA%B5%AD%EB%A6%BD%EA%B3%B5%EC%9B%90_%EC%83%9D%EB%AC%BC%EC%9E%90%EC%9B%90%ED%98%84%ED%99%A9_2023.csv"
)
df = pd.read_csv(file_path, encoding='utf-8')

 

다음은 df.head() 메서드를 호출하여 방금 불러온 DataFrame인 df의 상위 5개 행을 출력하는 부분입니다. 상위 5개 행을 보는 이유는 어떤 컬럼(변수)이 있는지, 이름은 무엇인지 빠르게 확인할 수 있습니다.

# 데이터 확인 (상위 5개 행)
print(df.head())

 

다음은 DataFrame의 전체 구조를 한눈에 확인할 때 쓰이는 info() 메서드를 호출하여, 각 열의 데이터 타입과 결측치 여부, 전체 행·열 개수 및 메모리 사용량까지 요약해서 보여줍니다. 결측치 점검은 분석 전에 어떤 열에 결측값이 있는지 빠르게 확인할 수 있어, 전처리(결측치 처리) 전략을 세우는 데 필수적입니다. 또한 자료형 검증을 통해 적절히 변환할 수 있습니다.(예 : 숫자형으로 처리해야 할 열이 문자열로 들어왔거나)

# 데이터 기본 정보 확인
print(df.info())

 

다음 과정은 전체 레코드 수와 조사 기간을 콘솔에 한눈에 보기 좋게 출력합니다.

# 전체 관측 레코드 수 및 기간 확인
total_records = len(df)
df['조사일자'] = pd.to_datetime(df['조사일자'], errors='coerce')
start_date = df['조사일자'].min().date()
end_date = df['조사일자'].max().date()
print(f"전체 관측 레코드 수: {total_records}")
print(f"조사기간: {start_date} ~ {end_date}")

 

다음 코드는 각 국립공원별로 관측된 전체 레코드 수와 고유 종 수를 계산해, 하나의 데이터프레임으로 정리하는 과정입니다.

# 국립공원별 관측 레코드 수 및 종 수 계산
record_counts = df['국립공원'].value_counts()
species_counts = df.groupby('국립공원')['종명'].nunique()
summary = pd.DataFrame({'관측레코드수': record_counts, '종수': species_counts}).sort_values('관측레코드수')

 

다음 코드는 앞서 계산한 summary DataFrame(국립공원별 관측 레코드 수와 종 수)을 수평 막대그래프로 그려, 두 지표를 한 화면에서 비교하도록 구성한 부분입니다. 이렇게 하면 각 공원별로 얼마나 많은 관측 기록이 쌓였는지와, 관측된 고유 종의 수를 한눈에 비교할 수 있어, 데이터의 양과 다양성을 동시에 파악하는 데 효과적입니다.

# 시각화 1: 국립공원별 관측 레코드 수 및 종 수 비교
fig, ax = plt.subplots(figsize=(10, 8))
summary.plot(kind='barh', ax=ax, color=['steelblue', 'darkorange'], width=0.7)
max_val = summary['관측레코드수'].max()
for i, (rec, spe) in enumerate(zip(summary['관측레코드수'], summary['종수'])):
    ax.text(rec + max_val*0.01, i-0.15, f'{rec:,}', va='center')
    ax.text(spe + max_val*0.01, i+0.15, f'{spe:,}', va='center')
ax.set_title('국립공원별 관측 레코드 수 및 종 수')
ax.set_xlabel('Count')
ax.set_ylabel('국립공원')
ax.legend(['관측 레코드 수', '종 수'])
plt.tight_layout()
plt.show()

다음 코드는 어떤 종이 가장 많이 관측되었는지 파악하기 위한 부분입니다. 이 과정을 통해 가장 많이 관측된 주요 20개 종과 그 빈도를 한눈에 확인할 수 있으며, 개체 다양성보다는 빈도의 차이를 직관적으로 파악하는 데 유용합니다.

# 시각화 2: 상위 20개 종별 관측 빈도
species_freq = df['종명'].value_counts().head(20)
print(f"총 고유 종 수: {df['종명'].nunique()}")
plt.figure(figsize=(8, 6))
species_freq.sort_values().plot(kind='barh', color='forestgreen')
plt.title('상위 20개 종별 관측 빈도')
plt.xlabel('관측 빈도')
plt.ylabel('종명')
plt.tight_layout()
plt.show()