내일배움 본캠프

[내일배움 본캠프] 데이터 시각화 그래프, 선형회귀1

hyeon-ji 2026. 6. 2. 20:29

☆ To do list 

  • AI진단퀴즈
  • 에이타니 2문제 풀기
  • 데이터 전처리&시각화 4주차 강의 수강
  • 라이브 세션 (10:00, 15:00)
  • 아티클 스터디 진행
  • TIL 작성 및 제출

🤖 에이타니 

● Bar Chart : 범주형 데이터를 비교하고 싶은 경우 사용

  • 지역별 매출 비교
  • 제품별 판매량 비교
  • 부서별 인원수 비교
  • 연령대별 고객 수 비교

 

● Line Chart : 시간 흐름에 따른 변화(추세)를 확인하고 싶은 경우 사용

  • 월별 기온 변화
  • 주가 변동
  • 일별 방문자 수
  • 연도별 매출 변화

 

● Histogram : 값이 어디에 많이 몰려 있는지, 데이터가 어떻게 퍼져 있는지 확인하고 싶은 경우 사용

  • 시험 점수 분포
  • 사람 키 분포
  • 제품 불량 크기 분포
  • 공정 온도 분포

→ 오늘은 에이타니를 통해 '데이터 시각화 목적과 활용'에 관한 문제를 풀었다. 문제에는 그래프와 관련된 문제 위주로 출제되었다. 약간씩 헷갈리는 부분들이 있었어서, 정리해 두었다¡


🔐 CodeKata

● 약수의 합 구하기

# 약수의 합 구하기
def solution(n):
    answer = 0
    for i in range(1, n+1):
      if n % i == 0:
        answer += i
    return answer
solution(5)

# 결과 --> 1 + 5 = 6

# 리스트 컴프리헨션
def solution(n):
    return sum([i for i in range(1, n+1) if n % i == 0])

print(solution(5))

 

● 나머지가 1이 되는 수 구하기

# 나머지가 1이 되는 수
def solution(n):
  for x in range(1, n):
    if n % x == 1:
       return x
print(solution(12))

# 결과 --> 12를 11로 나누었을 때 나머지가 1이므로, ' 11 ' 출력

 

→ 2번째 문제는.. 코드가 다 빠여진 상태로 예문을 주어져서 n값만 넣어 실행시켰더니 값이 제대로 나와서.. 수정한 부분이 없었다.


💻 Python

▶ Matplotlib을 이용하여 시각화하기

 

● 한글 폰트 설정하기

# 한글 폰트 설정 (Windows/Mac)
import platform
if platform.system() == 'Darwin': # Mac
    plt.rc('font', family='AppleGothic')
elif platform.system() == 'Windows': # Windows
    plt.rc('font', family='Malgun Gothic')
    
# 마이너스 부호 깨짐 방지
plt.rc('axes', unicode_minus=False)

# 화질 선명하게 설정 (Retina 디스플레이 지원)
%config InlineBackend.figure_format = 'retina'

 

● 주요 그래프

→ Bar, Line, Histogram은 위에서 다뤘으니 간단하게만 짚고 넘어가자 ¡

import matplotlib.pyplot as plt
를 먼저 선언한 후 그래프를 그린다.

 

○ Bar Plot(막대 그래프)

→ 범주형 데이터를 비교할 때 사용 한다.

더보기
categories = tips['day']
values = tips['total_bill']

plt.bar(categories, values)
plt.show()

○ Line Plot(선 그래프)

→ 시간 흐름에 따른 변화(추세)를 확인하고 싶은 경우 사용 한다.

더보기
# 1. 시간대별 매출 합계
sales_by_time = tips.groupby('time')['total_bill'].sum()

# 2. 시각화
fig, ax = plt.subplots()
ax.plot(sales_by_time.index, sales_by_time.values, marker='o', linestyle='--')

ax.set_title("시간대별 총 매출 추이")
plt.show()

○ Histogram(히스토그램)

→ 데이터의 분포를 확인할 사용한다.

더보기
fig, ax = plt.subplots()

# bins: 막대 개수 (구간을 얼마나 잘게 쪼갤지)
ax.hist(tips['tip'], bins=20, color='green', edgecolor='black')

ax.set_title("팁 금액 분포")
ax.set_xlabel("Tip ($)")
plt.show()
                               < Bar Chart와 Histogram의 차이점 >

구분 Bar Chart Histogram
데이터 종류 범주형 데이터 연속형 수치 데이터
목적 항목 간 비교 데이터 분포 확인
x축 의미 서로 다른 범주 연속된 구간
막대 간격 막대 사이 벌어짐 막대가 붙어 있음

 

Scatter Plot

→ 두 변수 간의 관계(상관관계)를 볼 때 사용한다.

→ 데이터의 분포와 패턴 파악이 가능하고 선형회귀를 그릴 수 있다.

→ 이상치 탐지에 유용하다.

더보기
fig, ax = plt.subplots()

# x축: 총 금액, y축: 팁
ax.scatter(tips['total_bill'], tips['tip'], alpha=0.5, color='blue')

ax.set_title("총 금액과 팁의 관계")
ax.set_xlabel("Total Bill")
ax.set_ylabel("Tip")
plt.show()

○ Multiple Bar Chart

→ 여러 항목을 그룹별로 비교. 분석할 때 사용한다.

범주 간의 차이를 한눈에 비교할 수 있다.

→ 제품별. 연도별 같은 다중 비교에 적합하다.

더보기
tip_yes = tips[tips['smoker'] == 'Yes'].groupby('day')['tip'].mean()
tip_no  = tips[tips['smoker'] == 'No'].groupby('day')['tip'].mean()


df_combined = pd.DataFrame({
    'Smoker: Yes': tip_yes,
    'Smoker: No': tip_no
})

df_combined.plot(kind='bar', figsize=(8, 5), rot=0, color=['tomato', 'skyblue'])

plt.title("요일별/흡연여부별 평균 팁 (Pandas)")
plt.ylabel("Average Tip ($)")
plt.show()

○ Pie Chart

→ 전체에서 각 항목이 차지하는 비율을 표현할 때 사용한다.

→ 각 값을 비교하는 것에 사용은 적절하지 않다. 수치 없이 차트만 확인할 시 25%가 큰지 30%가 큰지 정확히 알기 힘들기 때문이다.

→ 항목 수가 너무 많으면 가독성이 떨어진다.

더보기
# 1. 데이터 준비 (점심 vs 저녁 빈도)
time_counts = tips['time'].value_counts()

# 2. 시각화
fig, ax = plt.subplots(figsize=(6, 6))

# autopct='%.1f%%': 소수점 1자리까지 %로 표시
ax.pie(time_counts, labels=time_counts.index, autopct='%.1f%%', 
       colors=['lightcoral', 'lightskyblue'], startangle=90)

ax.set_title("점심 vs 저녁 손님 비율")
plt.show()

○ Box Plot

→ 데이터의 분포, 중앙값, 이상치 확인에 용이하다.

[내일배움 본캠프] Outlier처리하기, 속성과 메서드 ← IQR 부분 참고하

더보기
fig, ax = plt.subplots()

# vert=False: 가로로 눕혀서 그리기 (보기 더 편함)
ax.boxplot(tips['total_bill'], vert=False)

ax.set_title("결제 금액의 이상치 탐지 (Box Plot)")
ax.set_xlabel("Total Bill")
plt.show()

○ Violin Plot

→ 데이터의 밀도(값이 어디에 몰려있는지) 확인할 때 사용한다.

→ 데이터의 비대칭성 확인이 가능하다.

더보기
fig, ax = plt.subplots()

# 팁 금액의 분포를 바이올린 모양으로 그리기
# vert=False: 가로로 눕히기 (보기 편함)
dataset = [tips[tips['sex']=='Male']['tip'], tips[tips['sex']=='Female']['tip']]

# Matplotlib의 violinplot은 데이터를 리스트 형태로 묶어서 넣어줘야 합니다.
ax.violinplot(dataset, vert=False, showmeans=True)

# y축 눈금 라벨 설정 (0번 인덱스가 아니라 1번부터 시작함에 주의)
ax.set_yticks([1, 2])
ax.set_yticklabels(['Male', 'Female'])

ax.set_title("성별 팁 금액 분포 (Violin Plot)")
ax.set_xlabel("Tip")
plt.show()

○ Treemap

→ 계층형 데이터를 사각형 크기로 표현한 그래프이다.

→ 비율과 구조를 동시에 확인할 수 있고, 큰 범주와 하위 범주 표현에 적합하다.

더보기
# 1. 라이브러리 설치 및 임포트 (Matplotlib 보조 도구)
# !pip install squarify
import squarify

# 2. 데이터 준비 (요일별 빈도수)
day_counts = tips['day'].value_counts()

# 3. 시각화
fig, ax = plt.subplots(figsize=(8, 6))

# sizes: 사각형 크기 (데이터 값)
# label: 사각형 안에 들어갈 이름
# alpha: 투명도 (0~1)
squarify.plot(sizes=day_counts.values, label=day_counts.index, 
              alpha=0.7, color=['red', 'green', 'blue', 'orange'], ax=ax)

# 트리맵은 축(x, y)이 필요 없으므로 제거합니다.
ax.axis('off') 
ax.set_title("요일별 방문 빈도 (Treemap)")

plt.show()

○ Heatmap

→ 패턴, 밀집도, 상관관계 파악에 적합하다.

→ 상관계수 행렬이나 시간대별 데이터 분석에 자주 사용되며, 값이 클수록 진한 색으로 표현한다.

더보기
# 1. 상관관계 계산 (숫자 데이터만)
corr = tips.corr(numeric_only=True)

# 2. 시각화
fig, ax = plt.subplots()
im = ax.imshow(corr, cmap='coolwarm') # cmap: 색상 테마 (파랑~빨강)

# 3. 꾸미기 (축 눈금 설정)
# 눈금 개수(0,1,2)와 이름(total_bill, tip...)을 맞춰줍니다.
ax.set_xticks(np.arange(len(corr.columns)))
ax.set_yticks(np.arange(len(corr.columns)))
ax.set_xticklabels(corr.columns)
ax.set_yticklabels(corr.columns)

# 컬러바(범례) 추가
plt.colorbar(im)
ax.set_title("변수 간 상관관계 (Heatmap)")
plt.show()

 

● 그래프 스타일 지정하기

문자 색상 이름 문자 마커 종류 문자 의미
'b' blue '.' '-' 실선
'g' green ',' 픽셀 '--' 점선
'r' red 'o' '-.' 점-실선 혼합
'c' cyan 'v' 아래 삼각형 ':' 점선 (촘촘)
'm' magenta '^' 위 삼각형 '' 선 없음
'y' yellow '<' 왼쪽 삼각형    
'k' black '>' 오른쪽 삼각형    
'w' white 's' 정사각형    
    'p' 오각형    
    '*'    
    '+' + 기호    
    'x' x 기호    
    'D' 다이아몬드    
plt.plot([1,2,3,4], [1,4,9,16], 'cs')  # 색상 : cyan / 마커종류 : 정사각형
plt.axis([0,6,0,20])  # 축 범위 설정. 앞 2개 : x축 최소(0), 최대(6) / 뒤 2개 : y축 최소(0), 최대(20)
plt.show()

 

○ labelpad : 축 레이블의 여백을 지정한다.

○ fontdict = {'family' :} : 폰트를 지정한다.

# 폰트 설정하기

plt.plot([1, 2, 3, 4], [2, 3, 5, 10])
plt.xlabel('X-Axis', labelpad=15, fontdict={'family': 'serif', 'color': 'b', 'weight': 'bold', 'size': 14})
plt.ylabel('Y-Axis', labelpad=20, fontdict={'family': 'fantasy', 'color': 'deeppink', 'weight': 'normal', 'size': 'xx-large'})
plt.show()

○ loc : 축 레이블의 위치 지정

 

● 그래프 이미지 파일로 저장하기

 

plt. savefig('파일 이름.png')

 

→ 데이터 시각화한 자료를 이미지 파일로 저장할 수 있다.

※ 반드시, ' plt.show() ' 앞에 작성하기


▶추가 학습

 

■ 회귀분석

→ 연구대상이 되는 시스템에 존재하는 변수들 사이의 함수적인 관계를 규명하기 위해 수학적인 모형을 상정하고, 이 모형을 수집된 자료로부터 추정하는 통계적인 기법.

 

● 목적

○ 변수 간의 관계를 기술하고 설명 (ex. 아파트 평수와 전기소모량의 관계)

예측(prediction) (ex. 아파트 평수에 따른 전기소모량 예측)

→ ' 최단 거리 ' = ' 점과 직선 사이의 거리 '

 

● 목표 

○ 설명 모델 : 예측변수(설명 변수, 독립변수, 회귀변수)와 목표변수(종속변수, 타깃변수, 반응변수) 사이의 관계 설명

○ 예측 모델 : 예측 변수 값은 있지만, 목표변수의 값이 없는 경우 다른 데이터로부터 목표변수의 값을 예측

 

● 변수

○ 반응 변수(response variable, x) : 다른 변수의 영향을 받는 변수 (ex. 전기소모량)

○ 회귀변수(regressor variable, y) : 다른 변수에 영향을 미치는 변수 (ex. 아파트의 평수)

 

● 단순회귀 모형

→ 반응변수 y가 하나의 회귀변수 x에 대하여 아래와 같은 관계를 가질 때, '일차 단순 회귀 모형'이라고 부른다.

여기서 ' β '는 ' 회귀계수 ', ' ε '는 ' 오차항 ' 을 뜻한다.

 

☞ 오차항 추정 방법은 시간이 부족하여 다음 시간에 이어서 알아봐야겠다.


오늘은 Matplotlib를 활용한 데이터 시각화 방법에 대해 배웠다. 시각화 함수들을 모두 외우기보다 필요할 때 찾아서 사용하면 된다고 하셔서 부담 없이 재미있게 강의를 들을 수 있었다. 다양한 차트를 직접 시각화하고 여러 속성을 변경하며 표현할 수 있다는 점이 흥미로웠고, 특히 축 폰트를 다양하게 바꿀 수 있다는 점이 가장 신기했다.

 

노트북이 오전까지만 해도 어제처럼 엄청 느리고 실행이 잘 되지 않았는데, 최적화하는 방법을 찾아서 돌렸더니 좀 괜찮아져서 VS Code를 좀 돌려볼 수 있었다. 이대로만 가쟈 노트북아..~