본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
AI Generated
2025. 11. 28. · 13 Views
함수와 그래프 완벽 가이드
프로그래밍에서 필수적인 수학 함수의 개념부터 실제 코드로 그래프를 그리는 방법까지 다룹니다. 일차 함수, 이차 함수, 지수와 로그 함수, 그리고 딥러닝의 핵심인 시그모이드와 ReLU 함수까지 차근차근 살펴봅니다.
목차
1. 함수의 정의와 표현
어느 날 김개발 씨가 머신러닝 코드를 분석하다가 선배에게 질문했습니다. "선배님, 여기 f(x)라고 되어 있는데, 이게 정확히 뭔가요?
수학 시간에 배운 그 함수 맞나요?" 프로그래밍을 하다 보면 수학적 함수 개념이 자주 등장합니다.
함수는 한마디로 입력값을 받아서 정해진 규칙에 따라 출력값을 내보내는 것입니다. 마치 자판기처럼 동전을 넣으면 음료수가 나오는 것과 같습니다.
수학에서는 f(x) = 2x + 1처럼 표현하고, 프로그래밍에서는 def 키워드로 정의합니다.
다음 코드를 살펴봅시다.
# 수학 함수를 파이썬으로 표현하기
def f(x):
# f(x) = 2x + 1을 코드로 구현
return 2 * x + 1
# 함수 사용 예시
input_value = 3
output_value = f(input_value)
print(f"f({input_value}) = {output_value}") # f(3) = 7
# 여러 입력값에 대해 함수 적용
x_values = [1, 2, 3, 4, 5]
y_values = [f(x) for x in x_values]
print(f"입력: {x_values}")
print(f"출력: {y_values}") # [3, 5, 7, 9, 11]
김개발 씨는 입사 3개월 차 주니어 개발자입니다. 오늘 처음으로 머신러닝 관련 코드를 분석하게 되었는데, 곳곳에 수학 기호가 등장해서 당황스러웠습니다.
특히 f(x), g(x) 같은 표현이 자주 나왔습니다. 선배 개발자 박시니어 씨가 다가와 물었습니다.
"개발 씨, 함수가 뭔지 알아요?" 김개발 씨는 고개를 갸웃거렸습니다. "파이썬에서 def로 만드는 거 아닌가요?" 박시니어 씨가 미소를 지었습니다.
"그것도 맞아요. 하지만 더 근본적인 의미가 있어요." 함수란 무엇일까요?
쉽게 비유하자면, 함수는 마치 자판기와 같습니다. 자판기에 천 원을 넣으면 콜라가 나오고, 천오백 원을 넣으면 주스가 나옵니다.
입력에 따라 정해진 출력이 나오는 것이죠. 여기서 중요한 점은 같은 입력에는 항상 같은 출력이 나온다는 것입니다.
수학에서는 이것을 f(x) = y로 표현합니다. x는 입력값이고, y는 출력값입니다.
f라는 규칙을 거쳐서 x가 y로 변환되는 것입니다. 프로그래밍에서 함수를 이해하는 것이 왜 중요할까요?
사실 우리가 작성하는 거의 모든 코드가 함수로 이루어져 있습니다. 더구나 데이터 분석, 머신러닝, 그래픽스 등 고급 주제로 넘어갈수록 수학적 함수 개념이 필수적으로 등장합니다.
위의 코드를 살펴보겠습니다. def f(x)는 f라는 이름의 함수를 정의하고, x라는 입력을 받겠다는 의미입니다.
return 2 * x + 1은 입력값 x에 2를 곱하고 1을 더한 결과를 돌려준다는 뜻입니다. f(3)을 호출하면 어떻게 될까요?
x 자리에 3이 들어가서 2 * 3 + 1 = 7이 계산됩니다. 마치 수학 시간에 f(x) = 2x + 1에서 x에 3을 대입하는 것과 똑같습니다.
실제 현업에서는 이런 수학 함수가 어디에 쓰일까요? 예를 들어 쇼핑몰에서 할인 가격을 계산한다고 생각해봅시다.
할인율 함수 discount(price) = price * 0.8로 정의하면, 어떤 가격이든 20% 할인된 금액을 바로 계산할 수 있습니다. 주의할 점도 있습니다.
수학 함수는 같은 입력에 항상 같은 출력을 내야 합니다. 만약 함수 안에서 전역 변수를 사용하거나 랜덤 값을 생성한다면, 이는 순수한 의미의 수학 함수와는 다릅니다.
프로그래밍에서 이런 함수를 순수 함수라고 부르며, 테스트와 디버깅이 쉬워지는 장점이 있습니다. 다시 김개발 씨의 이야기로 돌아가 봅시다.
박시니어 씨의 설명을 들은 김개발 씨는 고개를 끄덕였습니다. "아, 그래서 수학에서 배운 함수랑 코드에서 만드는 함수가 같은 개념이었군요!" 함수의 본질을 이해하면 앞으로 배울 다양한 수학적 함수들을 코드로 자유자재로 표현할 수 있습니다.
실전 팁
💡 - 수학 함수 f(x)는 파이썬의 def f(x)와 동일한 개념입니다
- 같은 입력에 같은 출력을 보장하는 순수 함수를 작성하는 습관을 들이세요
2. 일차 함수와 이차 함수
김개발 씨가 데이터 분석 프로젝트를 맡게 되었습니다. 매출 데이터를 그래프로 그려보니 일직선으로 증가하는 패턴이 보였습니다.
"이게 바로 일차 함수구나!" 학교에서 배운 내용이 실무에서 살아 숨 쉬는 순간이었습니다.
일차 함수는 y = ax + b 형태로, 그래프가 직선을 그립니다. a는 기울기로 선이 얼마나 가파른지를, b는 y절편으로 선이 y축과 만나는 점을 결정합니다.
이차 함수는 y = ax^2 + bx + c 형태로, 포물선 모양의 곡선을 그립니다.
다음 코드를 살펴봅시다.
import numpy as np
# 일차 함수: y = 2x + 1
def linear_function(x, a=2, b=1):
# a: 기울기, b: y절편
return a * x + b
# 이차 함수: y = x^2 - 4x + 3
def quadratic_function(x, a=1, b=-4, c=3):
# a: x^2의 계수, b: x의 계수, c: 상수항
return a * x**2 + b * x + c
# 값 계산 예시
x = np.array([0, 1, 2, 3, 4])
print(f"일차 함수 결과: {linear_function(x)}") # [1, 3, 5, 7, 9]
print(f"이차 함수 결과: {quadratic_function(x)}") # [3, 0, -1, 0, 3]
# 이차 함수의 꼭짓점 계산
vertex_x = -b / (2 * a) # x 좌표
vertex_y = quadratic_function(vertex_x) # y 좌표
김개발 씨는 이번에 쇼핑몰의 월별 매출 데이터를 분석하는 업무를 맡았습니다. 엑셀에서 데이터를 그래프로 그려보니 신기하게도 거의 일직선에 가까운 모양이 나왔습니다.
박시니어 씨가 지나가다 그래프를 봤습니다. "오, 전형적인 선형 증가 패턴이네요.
일차 함수로 모델링하면 되겠어요." 일차 함수란 무엇일까요? y = ax + b라는 형태로 표현되는 가장 단순한 함수입니다.
마치 에스컬레이터를 타고 올라가는 것과 같습니다. 일정한 속도로 꾸준히 올라가거나 내려갑니다.
여기서 a는 기울기입니다. 에스컬레이터가 얼마나 가파른지를 나타냅니다.
a가 크면 가파르게 올라가고, a가 작으면 완만하게 올라갑니다. a가 음수면 내려가는 에스컬레이터가 됩니다.
b는 y절편이라고 부릅니다. 에스컬레이터의 시작점이 몇 층인지를 나타냅니다.
x가 0일 때 y값이 바로 b입니다. 그렇다면 이차 함수는 어떨까요?
y = ax^2 + bx + c 형태로, 그래프가 포물선을 그립니다. 공을 던졌을 때 그리는 궤적을 생각해보세요.
위로 올라갔다가 정점을 찍고 다시 내려옵니다. 이것이 바로 포물선입니다.
이차 함수에서 a의 부호가 중요합니다. a가 양수면 포물선이 아래로 볼록한 U자 모양이 되고, a가 음수면 위로 볼록한 역U자 모양이 됩니다.
위의 코드에서 linear_function은 일차 함수를, quadratic_function은 이차 함수를 구현했습니다. 두 함수 모두 계수를 매개변수로 받아서 다양한 형태의 함수를 만들 수 있습니다.
실제 현업에서 일차 함수는 단순 예측에 자주 사용됩니다. 예를 들어 "광고비를 10% 늘리면 매출이 얼마나 오를까?"라는 질문에 일차 함수 모델이 답을 줄 수 있습니다.
이것이 바로 선형 회귀의 기초입니다. 이차 함수는 최적화 문제에서 빛을 발합니다.
포물선의 꼭짓점이 최솟값이나 최댓값이 되기 때문입니다. 예를 들어 "비용을 최소화하는 생산량은 얼마일까?"라는 문제를 풀 때 이차 함수가 등장합니다.
주의할 점은 모든 데이터가 일차나 이차 함수로 설명되지는 않는다는 것입니다. 실제 데이터는 더 복잡한 패턴을 보이는 경우가 많습니다.
하지만 이 기본 함수들을 이해해야 더 복잡한 함수도 다룰 수 있습니다. 김개발 씨는 일차 함수를 이용해 다음 달 매출을 예측하는 간단한 모델을 만들었습니다.
완벽하지는 않았지만, 데이터의 전체적인 추세를 파악하는 데는 충분했습니다.
실전 팁
💡 - 일차 함수의 기울기 a가 양수면 증가, 음수면 감소 추세를 나타냅니다
- 이차 함수의 꼭짓점은 x = -b/(2a)에서 찾을 수 있습니다
3. 지수 함수와 로그 함수
김개발 씨가 서버 로그를 분석하다가 이상한 현상을 발견했습니다. 트래픽이 갑자기 폭발적으로 증가하는 패턴이었습니다.
"이건 일차 함수로는 설명이 안 되는데..." 박시니어 씨가 말했습니다. "그건 지수적 증가야.
바이럴 효과라고 하지."
지수 함수는 y = a^x 형태로, 폭발적인 증가나 감소를 표현합니다. 반대로 로그 함수는 y = log(x)로, 지수 함수의 역함수입니다.
로그는 큰 숫자를 다루기 쉬운 작은 숫자로 변환해주며, 데이터 분석에서 매우 유용하게 쓰입니다.
다음 코드를 살펴봅시다.
import numpy as np
# 지수 함수: y = e^x (자연 지수 함수)
def exponential_function(x):
# np.exp는 자연상수 e를 밑으로 하는 지수 함수
return np.exp(x)
# 로그 함수: y = ln(x) (자연 로그)
def logarithm_function(x):
# np.log는 자연 로그 (밑이 e)
return np.log(x)
# 지수 함수의 폭발적 증가
x_exp = np.array([0, 1, 2, 3, 4, 5])
print(f"e^x: {np.round(exponential_function(x_exp), 2)}")
# [1.0, 2.72, 7.39, 20.09, 54.6, 148.41]
# 로그 함수의 완만한 증가
x_log = np.array([1, 10, 100, 1000, 10000])
print(f"ln(x): {np.round(logarithm_function(x_log), 2)}")
# [0.0, 2.3, 4.61, 6.91, 9.21]
# 지수와 로그는 역함수 관계
print(f"ln(e^3) = {logarithm_function(exponential_function(3))}") # 3.0
김개발 씨가 운영하는 서비스에 어느 날 갑자기 트래픽이 몰렸습니다. 처음에는 100명이던 동시 접속자가 200명, 400명, 800명으로 두 배씩 늘어났습니다.
이것이 바로 지수적 증가입니다. 박시니어 씨가 설명을 이어갔습니다.
"일차 함수가 계단을 오르는 것이라면, 지수 함수는 로켓을 타고 올라가는 거야." 지수 함수는 y = a^x 형태입니다. 여기서 a를 밑이라고 부르고, x가 지수입니다.
가장 많이 쓰이는 밑은 자연상수 e(약 2.718)입니다. e를 밑으로 하는 지수 함수 e^x를 자연 지수 함수라고 부릅니다.
지수 함수의 특징은 성장 속도가 점점 빨라진다는 것입니다. 처음에는 천천히 증가하다가 어느 순간부터 급격하게 치솟습니다.
바이러스 확산, 복리 이자, 소셜 미디어의 바이럴 효과 등이 모두 지수적 증가를 따릅니다. 그렇다면 로그 함수는 무엇일까요?
로그는 지수 함수의 역함수입니다. 만약 2^3 = 8이라면, log_2(8) = 3입니다.
"2를 몇 번 곱해야 8이 되는가?"에 대한 답이 바로 로그입니다. 로그 함수의 놀라운 특징은 아무리 큰 수도 작은 수로 압축해준다는 것입니다.
위의 코드에서 보듯이 1, 10, 100, 1000, 10000이라는 큰 범위의 숫자가 로그를 취하면 0, 2.3, 4.6, 6.9, 9.2로 압축됩니다. 이 특성이 왜 유용할까요?
데이터 분석에서 값의 범위가 너무 넓으면 그래프가 찌그러지고 분석이 어려워집니다. 로그 스케일을 사용하면 이 문제를 해결할 수 있습니다.
위 코드에서 np.exp(x)는 e^x를 계산하고, np.log(x)는 자연 로그 ln(x)를 계산합니다. 마지막 줄을 보면 ln(e^3) = 3이 나오는데, 이것이 바로 지수와 로그가 역함수 관계임을 보여줍니다.
실무에서 로그는 정말 다양한 곳에 쓰입니다. 소리의 크기를 나타내는 데시벨, 지진의 강도를 나타내는 리히터 규모, 그리고 머신러닝의 손실 함수인 로그 손실까지 모두 로그를 기반으로 합니다.
주의할 점은 로그 함수의 정의역입니다. log(x)에서 x는 반드시 양수여야 합니다.
x가 0이거나 음수면 정의되지 않습니다. 코드에서 음수나 0에 로그를 적용하면 에러가 발생합니다.
김개발 씨는 트래픽 데이터를 로그 스케일로 변환해서 그래프를 다시 그렸습니다. 급격한 증가 패턴이 완만한 직선처럼 보이게 되어 분석이 훨씬 쉬워졌습니다.
실전 팁
💡 - 데이터 범위가 너무 넓을 때는 로그 스케일을 고려해보세요
- np.log()는 자연 로그, np.log10()은 상용 로그입니다
4. 시그모이드 ReLU 함수
김개발 씨가 드디어 딥러닝 프로젝트에 투입되었습니다. 코드를 보니 sigmoid, relu 같은 함수가 여기저기 등장합니다.
"이게 다 뭐죠?" 박시니어 씨가 답했습니다. "활성화 함수야.
신경망의 핵심이지."
시그모이드 함수는 어떤 값이든 0과 1 사이로 압축해주는 S자 곡선입니다. 확률을 표현할 때 유용합니다.
ReLU 함수는 음수는 0으로, 양수는 그대로 출력하는 단순하지만 강력한 함수입니다. 둘 다 딥러닝에서 활성화 함수로 널리 사용됩니다.
다음 코드를 살펴봅시다.
import numpy as np
# 시그모이드 함수: 출력을 0~1 사이로 압축
def sigmoid(x):
# 1 / (1 + e^(-x)) 공식
return 1 / (1 + np.exp(-x))
# ReLU 함수: 음수는 0, 양수는 그대로
def relu(x):
# max(0, x)와 동일
return np.maximum(0, x)
# 시그모이드 테스트
x = np.array([-10, -2, 0, 2, 10])
print(f"Sigmoid: {np.round(sigmoid(x), 4)}")
# [0.0, 0.1192, 0.5, 0.8808, 1.0]
# ReLU 테스트
x = np.array([-3, -1, 0, 1, 3])
print(f"ReLU: {relu(x)}")
# [0, 0, 0, 1, 3]
# 시그모이드를 이용한 이진 분류 예측
score = 2.5 # 모델의 출력
probability = sigmoid(score)
prediction = "합격" if probability > 0.5 else "불합격"
print(f"확률: {probability:.2%}, 예측: {prediction}")
김개발 씨는 회사에서 이미지 분류 프로젝트를 담당하게 되었습니다. 처음 접하는 딥러닝 코드는 낯설기만 했습니다.
특히 model.add(Activation('sigmoid'))나 model.add(Activation('relu')) 같은 코드가 도무지 이해되지 않았습니다. 박시니어 씨가 차근차근 설명해주었습니다.
"신경망에서 활성화 함수가 없으면 아무리 많은 층을 쌓아도 그냥 일차 함수밖에 안 돼. 복잡한 패턴을 학습할 수가 없어." 시그모이드 함수부터 살펴봅시다.
공식은 σ(x) = 1 / (1 + e^(-x))입니다. 이 함수의 마법 같은 특징은 어떤 값을 넣어도 결과가 0과 1 사이로 나온다는 것입니다.
마치 문지기와 같습니다. 아무리 크거나 작은 숫자가 들어와도 문지기는 0에서 1 사이의 값만 통과시킵니다.
x가 아주 크면 1에 가깝고, 아주 작으면 0에 가깝습니다. x가 0이면 정확히 0.5가 나옵니다.
이 특성 때문에 시그모이드는 확률을 표현하는 데 완벽합니다. "이 이메일이 스팸일 확률", "이 사진에 고양이가 있을 확률" 같은 것을 계산할 때 사용합니다.
0.5보다 크면 "예", 작으면 "아니오"로 분류하면 됩니다. 그렇다면 ReLU 함수는 무엇일까요?
ReLU는 Rectified Linear Unit의 약자로, 공식은 max(0, x)입니다. 놀랍도록 단순합니다.
양수는 그대로 통과시키고, 음수는 모조리 0으로 만듭니다. 왜 이렇게 단순한 함수가 중요할까요?
시그모이드에는 치명적인 단점이 있습니다. 값이 아주 크거나 작으면 기울기가 거의 0에 가까워집니다.
딥러닝에서 학습은 기울기를 통해 이루어지는데, 기울기가 0이면 학습이 멈춥니다. 이것을 기울기 소실 문제라고 합니다.
ReLU는 이 문제를 해결합니다. 양수 구간에서는 기울기가 항상 1이기 때문에 아무리 깊은 신경망에서도 기울기가 사라지지 않습니다.
위의 코드를 보면 sigmoid 함수는 -10이 들어가면 거의 0이 나오고, 10이 들어가면 거의 1이 나옵니다. relu 함수는 -3, -1이 들어가면 0이 나오고, 1, 3은 그대로 나옵니다.
실무에서 시그모이드는 주로 출력층에서 이진 분류를 할 때 사용합니다. 반면 ReLU는 은닉층에서 거의 표준처럼 사용됩니다.
현대 딥러닝의 성공에 ReLU가 큰 기여를 했다고 해도 과언이 아닙니다. 주의할 점도 있습니다.
ReLU는 음수를 모두 0으로 만들기 때문에, 일부 뉴런이 영원히 죽어버리는 죽은 ReLU 문제가 발생할 수 있습니다. 이를 해결하기 위해 Leaky ReLU, ELU 같은 변형들이 나왔습니다.
김개발 씨는 이제 활성화 함수의 의미를 이해하게 되었습니다. "결국 비선형성을 추가해서 복잡한 패턴을 학습할 수 있게 해주는 거군요!"
실전 팁
💡 - 이진 분류의 출력층에는 시그모이드, 은닉층에는 ReLU를 사용하세요
- 시그모이드 출력이 0.5보다 크면 양성, 작으면 음성으로 분류합니다
5. 함수의 그래프 해석
김개발 씨가 머신러닝 논문을 읽다가 멈칫했습니다. 그래프가 잔뜩 나오는데 어떻게 해석해야 할지 막막했습니다.
"선배님, 이 그래프들이 무슨 의미인지 모르겠어요." 박시니어 씨가 말했습니다. "그래프를 읽을 줄 알아야 데이터가 보여."
함수의 그래프는 입력과 출력의 관계를 시각적으로 보여줍니다. x축은 입력값, y축은 출력값을 나타내며, 그래프의 기울기는 변화율을, 곡률은 변화의 가속도를 의미합니다.
그래프를 해석할 줄 알면 데이터의 패턴을 직관적으로 파악할 수 있습니다.
다음 코드를 살펴봅시다.
import numpy as np
# 그래프 해석을 위한 핵심 특성 분석
def analyze_function(f, x_range, name):
x = np.linspace(x_range[0], x_range[1], 100)
y = f(x)
# 기울기(변화율) 계산 - 수치 미분
dx = x[1] - x[0]
dy = np.diff(y)
slope = dy / dx
# 특성 분석
print(f"=== {name} 분석 ===")
print(f"y의 범위: [{y.min():.2f}, {y.max():.2f}]")
print(f"최대 기울기: {slope.max():.2f}")
print(f"최소 기울기: {slope.min():.2f}")
# 증가/감소 구간 판단
increasing = np.sum(slope > 0) / len(slope) * 100
print(f"증가 구간 비율: {increasing:.1f}%")
# 분석 실행
analyze_function(lambda x: x**2, (-5, 5), "이차 함수")
analyze_function(lambda x: 1/(1+np.exp(-x)), (-5, 5), "시그모이드")
김개발 씨는 데이터 분석 보고서를 작성해야 했습니다. 숫자 표만 나열하면 읽는 사람이 이해하기 어렵다는 것을 알고 있었습니다.
그래서 그래프를 추가하기로 했는데, 막상 그리고 나니 어떻게 설명해야 할지 막막했습니다. 박시니어 씨가 다가왔습니다.
"그래프는 숫자의 이야기를 그림으로 보여주는 거야. 몇 가지 핵심만 알면 누구나 읽을 수 있어." 함수의 그래프에서 가장 중요한 것은 기울기입니다.
기울기가 양수면 함수가 증가하고, 음수면 감소합니다. 기울기의 절댓값이 크면 급격하게 변하고, 작으면 완만하게 변합니다.
마치 등산로를 생각해보세요. 가파른 오르막은 기울기가 크고, 완만한 평지는 기울기가 거의 0입니다.
내리막은 음수 기울기입니다. 다음으로 중요한 것은 곡률입니다.
기울기의 기울기, 즉 변화의 변화입니다. 그래프가 위로 볼록하면 기울기가 감소하고 있다는 뜻이고, 아래로 볼록하면 기울기가 증가하고 있다는 뜻입니다.
위의 코드는 함수의 특성을 분석합니다. np.diff로 y값의 차이를 구하고, 이를 x 간격으로 나누면 기울기를 얻을 수 있습니다.
이것이 바로 수치 미분의 기본 원리입니다. 이차 함수 y = x^2의 그래프를 분석해봅시다.
x가 음수일 때는 기울기가 음수이고, x가 양수일 때는 기울기가 양수입니다. x = 0에서 기울기가 0이 되는데, 이 점이 바로 최솟값입니다.
시그모이드 함수는 어떨까요? 항상 기울기가 양수입니다.
즉, 항상 증가합니다. 하지만 x가 0 근처일 때 가장 가파르고, x가 아주 크거나 작을 때는 거의 평평해집니다.
실무에서 그래프 해석은 필수적입니다. 머신러닝에서 손실 함수 그래프를 보면 모델이 잘 학습되고 있는지 알 수 있습니다.
손실이 꾸준히 감소하면 좋은 징조이고, 감소가 멈추거나 다시 증가하면 문제가 있다는 신호입니다. 학습률을 결정할 때도 그래프가 중요합니다.
학습률이 너무 크면 손실이 진동하고, 너무 작으면 감소가 느립니다. 그래프를 보면서 적절한 학습률을 찾아야 합니다.
주의할 점은 스케일입니다. 같은 데이터도 y축 범위를 어떻게 설정하느냐에 따라 완전히 다르게 보일 수 있습니다.
그래프를 볼 때는 항상 축의 범위를 확인해야 합니다. 김개발 씨는 보고서에 그래프를 추가하면서 핵심 포인트를 함께 설명했습니다.
"여기서 기울기가 급격히 감소하는 것을 볼 수 있습니다. 이는 성장률이 둔화되고 있음을 의미합니다." 숫자만 나열했을 때보다 훨씬 설득력 있는 보고서가 되었습니다.
실전 팁
💡 - 그래프를 볼 때 먼저 축의 범위와 단위를 확인하세요
- 기울기의 부호와 크기로 증감 추세와 속도를 파악하세요
6. Matplotlib으로 함수 시각화
김개발 씨가 드디어 그래프를 직접 그려볼 차례입니다. "파이썬으로 그래프를 그리려면 어떻게 해야 하죠?" 박시니어 씨가 답했습니다.
"Matplotlib이라는 라이브러리가 있어. 데이터 시각화의 기본이지."
Matplotlib은 파이썬의 대표적인 시각화 라이브러리입니다. plt.plot()으로 선 그래프를, plt.scatter()로 점 그래프를 그릴 수 있습니다.
축 레이블, 제목, 범례 등을 추가하여 전문적인 그래프를 만들 수 있습니다.
다음 코드를 살펴봅시다.
import numpy as np
import matplotlib.pyplot as plt
# x 값 생성 (-5에서 5까지 100개의 점)
x = np.linspace(-5, 5, 100)
# 여러 함수 정의
y_linear = 2 * x + 1 # 일차 함수
y_quadratic = x ** 2 # 이차 함수
y_sigmoid = 1 / (1 + np.exp(-x)) # 시그모이드
# 그래프 그리기
plt.figure(figsize=(10, 6))
plt.plot(x, y_linear, label='y = 2x + 1', color='blue')
plt.plot(x, y_quadratic, label='y = x²', color='red')
plt.plot(x, y_sigmoid, label='Sigmoid', color='green')
# 그래프 꾸미기
plt.xlabel('x')
plt.ylabel('y')
plt.title('Functions Comparison')
plt.legend()
plt.grid(True, alpha=0.3)
plt.axhline(y=0, color='k', linewidth=0.5) # x축
plt.axvline(x=0, color='k', linewidth=0.5) # y축
plt.savefig('functions.png', dpi=150)
plt.show()
김개발 씨는 지금까지 배운 함수들을 직접 그래프로 그려보고 싶었습니다. 엑셀로 그릴 수도 있지만, 파이썬으로 하면 자동화가 가능하고 더 세밀한 조정이 가능합니다.
박시니어 씨가 말했습니다. "Matplotlib은 파이썬에서 가장 오래되고 널리 쓰이는 시각화 라이브러리야.
이것만 알아도 웬만한 그래프는 다 그릴 수 있어." 먼저 데이터를 준비해야 합니다. np.linspace(-5, 5, 100)은 -5에서 5까지를 100개의 점으로 균등하게 나눕니다.
이 x 값들에 함수를 적용하면 y 값들이 나옵니다. 위의 코드에서 핵심은 **plt.plot(x, y, label='이름')**입니다.
x 좌표 배열과 y 좌표 배열을 넘기면 선 그래프가 그려집니다. label은 나중에 범례에 표시될 이름입니다.
plt.figure(figsize=(10, 6))은 그래프의 크기를 설정합니다. 가로 10인치, 세로 6인치입니다.
적절한 크기를 설정하면 그래프가 더 보기 좋아집니다. color 매개변수로 선의 색상을 지정할 수 있습니다.
'blue', 'red', 'green' 같은 이름을 사용하거나, '#FF5733' 같은 16진수 색상 코드를 사용할 수도 있습니다. 그래프를 그린 후에는 꾸미는 작업이 필요합니다.
plt.xlabel()과 plt.ylabel()은 축에 레이블을 붙입니다. plt.title()은 그래프 제목을 추가합니다.
이런 요소들이 있어야 다른 사람도 그래프를 이해할 수 있습니다. plt.legend()는 범례를 표시합니다.
앞서 plot()에서 지정한 label들이 여기에 나타납니다. plt.grid(True, alpha=0.3)은 격자선을 추가하는데, alpha로 투명도를 조절해서 너무 눈에 띄지 않게 합니다.
plt.axhline()과 plt.axvline()은 각각 수평선과 수직선을 그립니다. y=0과 x=0에 검은 선을 그려서 좌표축을 표시했습니다.
마지막으로 plt.savefig()는 그래프를 파일로 저장하고, plt.show()는 화면에 표시합니다. dpi는 해상도를 의미하며, 150 정도면 충분히 선명합니다.
실무에서 Matplotlib은 데이터 분석 결과를 시각화할 때 필수입니다. 보고서, 논문, 프레젠테이션에 사용할 그래프를 만들 수 있습니다.
더 예쁜 그래프를 원한다면 Seaborn이나 Plotly 같은 라이브러리도 있지만, 기본은 Matplotlib입니다. 주의할 점은 plt.show()를 호출하면 현재 그래프가 초기화된다는 것입니다.
여러 그래프를 그릴 때는 plt.figure()로 새 그래프를 시작하거나, plt.subplot()으로 한 화면에 여러 그래프를 배치해야 합니다. 김개발 씨는 직접 그래프를 그려보며 함수들의 특성을 눈으로 확인했습니다.
일차 함수는 직선, 이차 함수는 포물선, 시그모이드는 S자 곡선. 이제 함수와 그래프가 머릿속에 확실히 자리 잡았습니다.
실전 팁
💡 - plt.savefig()는 plt.show() 전에 호출해야 합니다
- 한글 폰트를 사용하려면 plt.rcParams['font.family'] = 'Malgun Gothic'을 설정하세요
이상으로 학습을 마칩니다. 위 내용을 직접 코드로 작성해보면서 익혀보세요!
댓글 (0)
함께 보면 좋은 카드 뉴스
Helm 마이크로서비스 패키징 완벽 가이드
Kubernetes 환경에서 마이크로서비스를 효율적으로 패키징하고 배포하는 Helm의 핵심 기능을 실무 중심으로 학습합니다. Chart 생성부터 릴리스 관리까지 체계적으로 다룹니다.
보안 아키텍처 구성 완벽 가이드
프로젝트의 보안을 처음부터 설계하는 방법을 배웁니다. AWS 환경에서 VPC부터 WAF, 암호화, 접근 제어까지 실무에서 바로 적용할 수 있는 보안 아키텍처를 단계별로 구성해봅니다.
AWS Organizations 완벽 가이드
여러 AWS 계정을 체계적으로 관리하고 통합 결제와 보안 정책을 적용하는 방법을 실무 스토리로 쉽게 배워봅니다. 초보 개발자도 바로 이해할 수 있는 친절한 설명과 실전 예제를 제공합니다.
AWS KMS 암호화 완벽 가이드
AWS KMS(Key Management Service)를 활용한 클라우드 데이터 암호화 방법을 초급 개발자를 위해 쉽게 설명합니다. CMK 생성부터 S3, EBS 암호화, 봉투 암호화까지 실무에 필요한 모든 내용을 담았습니다.
AWS Secrets Manager 완벽 가이드
AWS에서 데이터베이스 비밀번호, API 키 등 민감한 정보를 안전하게 관리하는 Secrets Manager의 핵심 개념과 실무 활용법을 배워봅니다. 초급 개발자도 쉽게 따라할 수 있도록 실전 예제와 함께 설명합니다.