LG DX DATA SCHOOL

12/31 데이터 시각화 라이브러리

getfeelingsfrom 2025. 12. 31. 12:41

프로젝트 도메인 지식 탐구 ! ! !

케이블 산업/직군에 대한 도메인 수집 필요 

관련 데이터 수집(내부, 외부) 

전체 산업에서의 위치가 어떻게 되는지

시장 내에서 일등하는 기업의 장단점 분석 -> 우리의 기업에 어떻게 적용할것인지

데이터를 통해 어떻게 보완할 건지, 어떤 부분은 안되는지 => 모든 걸 "데이터"를 통해 ! ! 

 

결측치는  제거 => 무조건 없애는건 아님 상황 확인해보기 ! 

이상치는 변형? 제외해서 별도로 다루기? => 선택 

 

 

 과제 인식 => 관련 데이터 수집(내부, 외부, 웹크롤링) => 전처리 (결측치, 이상치, 정제, EDA) -> 분석 -> 모델 평가 -> 시각화

 


 

모니터를 추상화 한게 figure ( 액자) = 여기다가ㅏ 그림 그림 => axes 도화지 

 

1. Figure (피겨): 전체 캔버스 또는 액자

  • Figure는 그림이 그려지는 가장 바깥쪽의 전체 창(Window)
  • 비유: 거실 벽에 걸린 커다란 액자 혹은 캔버스 자체
  • 역할: 여러 개의 그래프를 담을 수 있는 공간을 제공하며, 전체 배경색이나 전체 제목(suptitle) 등을 관리
  • 특징: Figure 하나 안에 도화지(Axes)가 한 개일 수도, 여러 개일 수도

2. Axes (엑시즈): 실제 그래프가 그려지는 도화지

  • Axes는 Figure 안에 위치하며, 실제로 데이터가 시각화되는 개별 영역
  • 비유: 큰 액자 안에 끼워 넣은 하나하나의 그림판(도화지)
  • 역할:
    • 우리가 흔히 말하는 '그래프' 그 자체
    • x축, y축, 눈금(Tick), 레이블, 범례 등을 모두 포함하는 단위
  • 특징: "데이터를 그려라!"라고 명령을 내리는 대상
  • 코드
    • ax.plot() : 데이터 그림
    • ax.set_*() : 축, 제목, 레이블 제어
    • fig.suptitle() : 전체 제목
fig, ax = plt.subplots()
ax.plot([1, 2, 3])
ax.set_title("제목")
ax.set_xlabel("X축")
ax.set_ylabel("Y축")
ax.grid(True)
plt.show()

 

 

  • Figure (액자): 전체 캔버스, 1개 존재.
  • Axes (도화지): 실제 그래프 영역, 1:N 대응 가능.
  • Subplot: 하나의 Figure를 행/열로 분할하여 여러 개의 Axes를 배치하는 방식.
구분 pyplot 방식 체지향 방식
사용법 plt.plot() ax.plot()
대상 현재 활성 Axes 명시적 Axes
다중 그래프 불편 필수
시험 출제 낮음 높음

 

 

matplotlib

import matplotlib.pyplot as plt

 

1. fig, ax = plt.subplots() (객체지향 방식)

  • 액자와 도화지를 각각 받아서 직접 세밀하게 제어하겠다는 방식
  • 특징: fig(액자)와 ax(도화지)라는 '객체'를 변수로 할당
  • 장점: * 어느 도화지에 그림을 그릴지 명확하게 지정 가능 (여러 개의 그래프를 그릴 때 필수)
  • 그래프의 세부 요소(축 눈금, 눈금 레이블, 배경색 등)를 아주 정밀하게 조절하기 좋음
  • 비유: 전문가가 각기 다른 도화지 여러 장을 앞에 두고, "1번 도화지에는 선을 긋고, 2번 도화지에는 제목을 쓰자"라고  지시


2. plt.plot() (Pyplot 방식)

  • 지금 열려 있는 도화지에 알아서 한 번에 그려줘라는 방식
  • 특징: 별도의 변수 설정 없이 plt.이라는 명령어로 모든 것을 처리
  • 장점: 코드가 짧고 간결하여 빠르게 그래프를 확인하고 싶을 때 편리
  • 옵션(그래프 종류, 스타일, 제목 등)만 인자로 넣어주면 Matplotlib이 내부적으로 액자와 도화지를 생성해서 그림
  • 비유: 현재 내 눈앞에 있는 도화지 한 장에 "제목 쓰고 그림 그려!"라고 말하면, 캔버스를 따로 관리할 필요 없이 알아서 그려주는 것

 

3. subplot과 subplots차이 

plt.subplot(2,2,1)   # 상태 기반 (pyplot)
fig, ax = plt.subplots(2,2)  # 객체지향
구분 subplot subplots
방식 pyplot 객체지향
반환값 없음 fig, axes

 

 

 

• 기본 플롯: 데이터를 (x, y) 쌍으로 표현

• 배열과 필드 플롯: 데이터 Z(x, y)와 필드 U(x, y), V(x, y)의 배열을 표현

 

 

• 통계 플롯: 데이터 분포를 시각화하여 통계 분석에 적합

• 비정형 좌표: 좌표(x, y)에서의 값 z를 등고선으로 시각화

 

plt.title('대한민국')
plt.plot([-1,2,3,4])
plt.show()

글자체가 없어서 한글이 깨진당께

 

 

 

폰트 적용

import matplotlib.font_manager as fm

path='C:/Windows/Fonts/malgun.ttf'
font_prop= fm.FontProperties(fname=path)
#plt.rc('font', family='NanumGothic')
plt.rcParams['axes.unicode_minus'] = False

plt.title('대한민국', fontproperties=font_prop, fontsize=15)
plt.plot([-1, 2, 3, 4])
plt.show()

 

폰트 직접 지정으로 문제 해결

 

 

plt.legend()

import numpy as np
plt.plot(np.random.randn(10), 'k', label='one’) #검은색 실선
plt.plot(np.random.randn(10)*3, 'r--', label='two’) #빨간색 파선
plt.plot(np.random.randn(10)*10, 'g.', label='three’) #선 없이 초록색 점
#마커로 표시
plt.legend()
plt.show()

 

  • Label 등록: plt.plot()을 그릴 때 label='이름' 인자를 통해 각 그래프의 이름을 미리 등록
  • 범례 출력: plt.legend()를 호출하면, 등록된 레이블들을 모아서 적절한 위치에 박스 형태로 보여줌

 

 

다중 그래프

plt.subplot(2, 2, 1) # 2행 2열 중 첫 번째 그래프
plt.plot(np.random.randn(10), 'b--')
plt.subplot(2, 2, 2) # 2행 2열 중 두 번째 그래프
plt.plot(np.random.randn(100), 'r', alpha=0.7)
plt.subplot(2, 2, 3) # 2행 2열 중 세 번째 그래프
plt.plot(np.random.randn(10), 'y^')
plt.subplot(2, 2, 4) # 2행 2열 중 네 번째 그래프
plt.plot(np.random.randn(10), 'g.')
plt.show()

 

 

  • 다중 그래프(Multi graph)는 축이 여러 개
  • plt.subplot(행, 열, 인덱스) 순서
  • plt.subplot(2, 2, 1)에서 숫자의 의미는 다음과 같습니다.
    • 첫 번째 숫자 (2): 전체를 몇 개의 **행(row, 가로줄)**으로 나눌 것인가?
    • 두 번째 숫자 (2): 전체를 몇 개의 **열(column, 세로줄)**로 나눌 것인가?
    • 세 번째 숫자 (1~4): 그중 몇 번째 칸에 그림을 그릴 것인가?

 

 

산점도 (Scatter Plot)

: 연속형 변수(양적 데이터) 값의 분포 또는 상관관계를 나타냄

plt.scatter(x값 리스트, y값 리스트, c=‘색상’, s=크기, marker=‘모양’)

 

year = [2014, 2017, 2020, 2023]
price = [25000, 31000, 53000, 63000]
plt.scatter(year, price, c='g', s=50, marker='^')
plt.show()

 

 

데이터 성격에 따른 그래프 종류

데이터 구분 세부 유형 대표 그래프 특징 및 목적
양적 데이터 연속형 히스토그램 데이터의 분포와 밀집도 확인
이산형 막대 그래프 수치 데이터의 크기 비교
질적 데이터 명목형 파이 차트 범주별 상대적 비율 확인
순서형 막대/누적 막대 범주 간의 순위와 빈도 확인

 

 

히스토그램

연속형 변수의 구간별 분포를 나타냄

plt.hist(값 리스트, bins=구간의 수)

 

 

막대 그래프

범주형 변수끼리 연속형 값을 비교할 때 사용함 

plt.bar(x값 리스트, y값 리스트)

 

 

구분 히스토그램(Histogram) 막대그래프( Bar chart)
데이터 유형 연속형 데이터 이산형(범주형) 데이터
목적 분포 형태 파악 범주 간 크기 비교
막대 의미 구간(bin)의 빈도/비율 범주별 값
막대 간 간격 없음 (연속) 있음 (범주 분리)
x축 의미 값의 범위(구간) 범주(카테고리)

 

 

 파이 차트

범주형 변수끼리 연속형 값의 비율을 비교할 수 있음.

plt.pie(값 리스트, labels=레이블 리스트, autopct='%.숫자f%%', colors=색상, explode=띄우는 값 리스트)

 

 

명목형 데이터는 질적 데이터이지만, 도수분포표로 정리하면 각 범주의 빈도는 이산형 양적 데이터로 취급 가능

 

 

워드클라우드

  • 데이터의 빈도를 단어(Word)의 구름(Cloud)으로 표현 
  • 각 단어를 발생 빈도에 비례하는 크기로 나타냄
  • 주요 단어는 보통 명사를 기반으로 선정됨 
  • 워드클라우드 생성 과정
    • ① 텍스트 데이터를 사전 처리하여 영어의 the, and, of와 같은 일반적인 단어를 제거
    • ② 남은 단어들의 빈도수를 계산
    • ③ 빈도수에 비례하는 크기로 단어를 표시하여 구름 모양으로 나타냄
    • ④ 워드클라우드의 마스크, 단어 크기와 글꼴, 색을 설정하여 시각화 효과를 높임
  • 비정형 데이터를 다루는 것 

문서 (docs) -> 문장들(sentences) -> 단어(띄어쓰기) ----(이 과정에서 오차 발생할 확률↑)----> 품사 태깅 

 

 

import os
print(os.environ.get('JAVA_HOME'))

from konlpy.tag import Okt
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from collections import Counter

text = """
자연어 처리는 컴퓨터가 인간의 언어를 이해하고 생성하는 기술입니다. 
파이썬의 KoNLPy 라이브러리를 사용하면 한국어 텍스트 분석이 매우 쉬워집니다.
명사를 추출하고 빈도를 계산하여 워드클라우드를 만들 수 있습니다. 
데이터 분석에서 시각화는 매우 중요한 단계이며, 워드클라우드는 그 중 하나입니다.
"""

okt = Okt()
nouns = okt.nouns(text)

words = [n for n in nouns if len(n) > 1]
words


# 빈도 계산
count = Counter(words)

font_path = "C:/Windows/Fonts/malgun.ttf"

# 워드클라우드 생성
wc = WordCloud(
    font_path=font_path,
    background_color="white",
    width=800,
    height=400
)

wc.generate_from_frequencies(count)

# 시각화
plt.figure(figsize=(10, 5))
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.show()