제로베이스 데이터 파트타임 스쿨 학습 일지 [25.05.09]
[강의 요약]
[Part 04. EDA/웹 크롤링/파이썬 프로그래밍_ Ch 02] 강의 수강
클립 12~20까지 강의 수강하였음
🐢 100일 챌린지 🔥 : [▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰▰ ] 54/100일 (54%)
보니까 데이터 분석만 있고 그걸 바탕으로 ML DL을 돌리는 부분은 아직인 듯하다.
하지만 EDA가 기본 중에 기본이니 열심히 복습하는 걸로!
matplotlib 공식 사이트(참고용)
[12~20_matplotlib]
▶ 1. matplotlib 시각화 라이브러리
matplotlib은 파이썬에서 가장 많이 사용되는 시각화 도구다.
특히 데이터 분석에서 많이 사용한 경험이 있고, 실제로도 많이 사용한다.
기본 사용법은 다음과 같다.
import matplotlib.pyplot as plt
- pyplot은 matplotlib에서 시각화를 담당하는 핵심 모듈
- 일반적으로 plt라는 별칭을 사용
주피터 노트북에서 코드를 작성한다면 환경설정을 해줘야 한다.
%matplotlib inline
- 그래프가 외부 창이 아니라 출력 셀 안에 표시되도록 도와주는 매직 커맨드
▶ 2. 막대그래프 (Bar Graph)
막대그래프는 카테고리별 수치 데이터를 시각화하는 데 적합하다.
다음 코드는 서울시 각 자치구의 CCTV 설치 수량을 한눈에 비교할 수 있는 코드다.
data_result['소계'].sort_values().plot(kind='barh', grid=True, figsize=(10,10))
plt.title('구별 CCTV 설치 현황')
plt.xlabel('CCTV 대수')
plt.ylabel('자치구')
plt.show()
- DataFrame.plot(kind='barh') : 수평 막대그래프 생성
- sort_values() : CCTV 수 기준으로 정렬
- grid=True : 격자선 추가
- figsize=(10,10) : 그래프의 크기 조정
- plt.title() / xlabel() / ylabel() : 제목 및 축 이름 지정
- plt.show() : 그래프 출력 명령
▶ 3. 산점도 (Scatter Plot)로 관계 시각화
산점도는 두 변수 간의 상관관계를 시각화하는 대표적인 방법이다.
예를 들어 인구수 ↔ CCTV 설치 대수
plt.scatter(data_result['인구수'], data_result['소계'], s=50)
plt.xlabel('인구수')
plt.ylabel('CCTV 수')
plt.title('인구수와 CCTV 수 관계')
plt.grid(True)
plt.show()
- plt.scatter(x, y) : 산점도 그리기
- s=50 : 점 크기 설정 (size)
- xlabel / ylabel / title : 축과 제목
- grid(True) : 격자 표시
▶ 4. 경향선(선형 회귀선) - numpy 활용
산점도는 관계를 시각적으로 보여주지만, 정량적 추세선이 없으면 비교하기 어렵다.
이를 위해 numpy의 polyfit()과 poly1d()를 이용해 1차 함수 기반 경향선을 추가한다.
import numpy as np
fp1 = np.polyfit(data_result['인구수'], data_result['소계'], 1) # 1차 회귀 계수 구하기
f1 = np.poly1d(fp1) # 회귀식을 함수로 변환
fx = np.linspace(data_result['인구수'].min(), data_result['인구수'].max(), 100) # 등간격 x 데이터
# 시각화
plt.scatter(data_result['인구수'], data_result['소계'], s=50)
plt.plot(fx, f1(fx), ls='dashed', lw=3, color='g')
plt.xlabel('인구수')
plt.ylabel('CCTV 수')
plt.title('인구수 대비 CCTV 경향선')
plt.grid(True)
plt.show()
- np.polyfit(x, y, 1) : x, y값을 바탕으로 1차 회귀 직선의 계수 [기울기, 절편] 반환
- np.poly1d() : 다항식 계수 리스트를 함수처럼 쓸 수 있도록 객체로 반환
- np.linspace(start, end, num) : 지정 구간에서 num개의 등간격 데이터를 생성 (X축용)
- ls='dashed' : 선 종류 (점선)
- lw=3 : 선 굵기
▶ 5. 오차 계산 및 색상 시각화
실제 데이터와 추세선 사이의 거리를 계산하면, 예상보다 많은 CCTV를 설치한 구 / 적게 설치한 구를 알 수 있다.
data_result['오차'] = np.abs(data_result['소계'] - f1(data_result['인구수']))
오차값을 산점도의 color로 반영하여 강조 시각화
plt.figure(figsize=(14,10))
plt.scatter(data_result['인구수'], data_result['소계'],
c=data_result['오차'], s=50, cmap='Reds')
plt.plot(fx, f1(fx), ls='dashed', lw=3, color='g')
plt.xlabel('인구수')
plt.ylabel('CCTV 수')
plt.title('오차를 색으로 표현한 인구-CCTV 관계')
plt.colorbar(label='오차 크기')
plt.grid(True)
plt.show()
- c=data_result['오차'] : 각 점의 색상을 오차값에 따라 다르게
- cmap='Reds' : 색상 맵 적용 (진한 빨강 = 큰 오차)
- colorbar() : 색상 범례 추가
▶ 6. 구 이름 표시
중요한 포인트의 데이터는 이름을 직접 표시해 주면 이해에 도움이 된다.
for idx in data_result.sort_values(by='오차', ascending=False).index[:5]:
gu = data_result.loc[idx]
plt.text(gu['인구수']*1.02, gu['소계']*0.98, idx, fontsize=9, color='blue')
- plt.text(x, y, 문자열) : x, y 좌표에 텍스트 표시
- *1.02, *0.98 : 마커와 겹치지 않도록 살짝 이동
- fontsize, color : 폰트 크기와 색상 지정
▶ 7. 분석 결과 저장
분석한 데이터를 CSV 파일로 저장하면, 나중에 분석을 이어가거나 시각화만 다시 할 때 편리하다.
data_result.to_csv("data_result.csv", encoding="utf-8")
저장위치는 본인이 원하는 곳으로 지정하면 된다.
- DataFrame.to_csv(filename) : 데이터를 CSV 형태로 저장
- encoding='utf-8' : 한글 깨짐 방지를 위한 인코딩 설정 (Windows는 cp949일 수도 있음)
[요약]
기능 | 목적 | 함수 / 문법 | 설명 |
시각화 기본 | 그래프 출력 | plt.plot(), plt.scatter() | 관계, 분포 표현 |
회귀선 생성 | 추세선 도출 | np.polyfit(), np.poly1d() | 1차 선형 함수 구성 |
오차 계산 | 경향과 차이 측정 | np.abs() | 절대값 오차 계산 |
시각화 색상 강조 | 오차 시각화 | c=, cmap= | 점 색상으로 오차 표현 |
텍스트 표시 | 데이터 레이블 | plt.text() | 각 점에 구 이름 붙이기 |
데이터 저장 | 분석 결과 보관 | to_csv() | CSV 파일로 저장 |
[나의 생각 정리]
데이터 분석에 사용되는 시각화 라이브러리 matploblib의 기본 사용 방법을 정리할 수 있었다.
[적용점]
데이터 분석(EDA)에서 시각화
“이 글은 제로베이스 데이터 스쿨 주 3일반 강의 자료 일부를 발췌하여 작성되었습니다.”