01. Matplotlib 기초 사용법
|
# x축 데이터와 y축 데이터 준비
x = [1, 2, 3, 4, 5]
y = [10, 20, 25, 30, 35]
|
1) 플롯 생성
|
# 기본 플롯 생성
plt.plot(x, y)
|
2) 축, 제목, 레이블 추가하기
|
plt.xlabel('X축 이름') # X축 이름 설정
plt.ylabel('Y축 이름') # Y축 이름 설정
plt.title('플롯 제목') # 플롯 제목 설정
|
3) 범례 추가하기
|
plt.plot(x, y, label='샘플 데이터')
plt.legend() # 범례 추가
|
4) matplotib 사용 문법
4-1. pyplot 인터페이스
|
import matplotlib.pyplot as plt
# 데이터 준비
x = [1, 2, 3, 4, 5]
y = [10, 20, 25, 30, 35]
# 플롯 생성 및 스타일 추가
plt.plot(x, y, label='샘플 데이터', color='blue', linestyle='--', marker='o')
# 레이블, 제목, 범례 추가
plt.xlabel('X축 이름')
plt.ylabel('Y축 이름')
plt.title('pyplot 인터페이스 예시')
plt.legend()
# 플롯 표시
plt.show()
|
4-2. 객체 지향 인터페이스
|
import matplotlib.pyplot as plt
# 데이터 준비
x = [1, 2, 3, 4, 5]
y = [10, 20, 25, 30, 35]
# 캔버스와 축 생성
fig, ax = plt.subplots()
# 축(ax) 객체에 직접 플롯 추가
ax.plot(x, y, label='샘플 데이터', color='blue', linestyle='--', marker='o')
# 축, 제목, 범례 추가
ax.set_xlabel('X축 이름')
ax.set_ylabel('Y축 이름')
ax.set_title('객체 지향 인터페이스 예시')
ax.legend()
# 플롯 표시
plt.show()
|
02. 그래프 시각화
1) Line Plot
- 사용 상황: 시간에 따른 데이터의 변화를 보여줄 때, 예를 들어 주식 가격의 변동, 기온 변화 등 연속적인 데이터의 추세를 파악할 때 사용합니다.
- 장점: 시간의 흐름에 따른 변화를 직관적으로 표현할 수 있습니다.
|
# pyplot 인터페이스
import matplotlib.pyplot as plt
x = [1, 2, 3, 4]
y = [10, 20, 25, 30]
plt.plot(x, y, color = 'red')
plt.show()
|
|
# 객체지향 인터페이스
fig, ax = plt.subplots() # Figure와 Axes 객체 생성
x = [1, 2, 3, 4]
y = [10, 20, 25, 30]
ax.plot(x, y)
plt.show()
|

2) Bar Chart
- 사용 상황: 카테고리별 데이터 값을 비교할 때 사용합니다. 예를 들어, 다른 그룹의 인구, 판매량 비교 등에 적합합니다.
- 장점: 카테고리별 값의 크기를 직관적으로 비교할 수 있습니다.
|
# pyplot 인터페이스
categories = ['A', 'B', 'C', 'D']
values = [10, 20, 15, 30]
plt.bar(categories, values)
plt.show()
|
|
# 객체지향 인터페이스
fig, ax = plt.subplots()
categories = ['A', 'B', 'C', 'D']
values = [10, 20, 15, 30]
ax.bar(categories, values)
plt.show()
|

3) Scatter Plot
- 사용 상황: 두 변수 간의 관계를 탐색할 때 사용합니다. 예를 들어, 키와 몸무게의 관계, 광고 비용 대비 판매량의 상관관계 분석 등에 사용됩니다.
- 장점: 변수 간의 관계나 데이터의 분포를 쉽게 파악할 수 있습니다.
|
# pyplot 인터페이스
x키 = [5, 7, 8, 7, 2, 17, 2, 9, 4, 11, 12, 9, 6]
y몸무게 = [99, 86, 87, 88, 100, 86, 103, 87, 94, 78, 77, 85, 86]
plt.scatter(x, y)
plt.show()
|
|
# 객체지향 인터페이스
fig, ax = plt.subplots()
x = [5, 7, 8, 7, 2, 17, 2, 9, 4, 11, 12, 9, 6]
y = [99, 86, 87, 88, 100, 86, 103, 87, 94, 78, 77, 85, 86]
ax.scatter(x, y)
plt.show()
|

4) Histogram
- 사용 상황: 데이터의 분포를 파악할 때 사용합니다. 예를 들어, 시험 점수의 분포, 고객 연령 분포 등을 시각화할 때 유용합니다.
- 장점: 데이터의 분포 형태(정규 분포, 치우침 등)를 확인할 수 있습니다.
|
# pyplot 인터페이스
import numpy as np
import matplotlib as mpl
mpl.rcParams['axes.unicode_minus'] = False #마이너스 깨짐 방지
data = np.random.randn(1000)
plt.hist(data, bins=30)
plt.show()
|
|
# 객체지향 인터페이스
import numpy as np
import matplotlib as mpl
mpl.rcParams['axes.unicode_minus'] = False #마이너스 깨짐 방지
fig, ax = plt.subplots()
data = np.random.randn(1000)
ax.hist(data, bins=30)
plt.show()
|
5) Pie Chart
- 사용 상황: 전체에 대한 각 부분의 비율을 보여줄 때 사용합니다. 예를 들어, 시장 점유율, 투표 결과 등의 비율을 시각화할 때 적합합니다. 불량과 정상에 대한 비율
- 장점: 전체 중 각 부분이 차지하는 비율을 한눈에 파악할 수 있습니다.
|
# pyplot 인터페이스
sizes = [10, 20, 25, 30]
labels = ['A', 'B', 'C', 'D']
plt.pie(sizes , labels=labels)
plt.show()
|
|
# 객체지향 인터페이스
fig, ax = plt.subplots() # Figure와 Axes 객체 생성
sizes = [10, 20, 25, 30]
labels = ['A', 'B', 'C', 'D']
ax.pie(sizes , labels=labels)
plt.show()
|

6) Stack Plot
- 사용 상황: 시간에 따라 여러 그룹의 변화를 함께 보여줄 때 사용합니다. 예를 들어, 여러 제품의 판매량 변화를 시간에 따라 비교하거나, 전체 예산 중 각 부서의 지출 비율 변화를 보여줄 때 사용됩니다.
- 장점: 전체와 각 부분의 시간에 따른 변화를 동시에 파악할 수 있습니다
|
# pyplot 인터페이스
x = [1, 2, 3, 4, 5]
y1 = [1, 1, 2, 3, 5]
y2 = [0, 4, 2, 6, 8]
y3 = [1, 3, 5, 7, 9]
plt.stackplot(x, y1, y2, y3, labels=['Y1', 'Y2', 'Y3'])
plt.legend(loc='upper left')
plt.show()
|
|
# 객체지향 인터페이스
fig, ax = plt.subplots()
x = [1, 2, 3, 4, 5]
y1 = [1, 1, 2, 3, 5]
y2 = [0, 4, 2, 6, 8]
y3 = [1, 3, 5, 7, 9]
ax.stackplot(x, y1, y2, y3, labels=['Y1', 'Y2', 'Y3'])
ax.legend(loc='upper left')
plt.show()
|

7) Box Plot
- 사용 상황: 데이터의 분포와 이상치를 파악할 때 사용합니다. 예를 들어, 다양한 그룹의 시험 점수 분포 비교, 제품의 크기 분포 등에 사용됩니다.
- 장점: 중앙값, 사분위수, 이상치 등 데이터의 통계적 분포를 요약하여 보여줍니다.

|
# pyplot 인터페이스
data = np.random.rand(10, 4)
plt.boxplot(data)
plt.show()
|
|
# 객체지향 인터페이스
fig, ax = plt.subplots()
data = np.random.rand(10, 4)
ax.boxplot(data)
plt.show()
|

8) Violin Plot
- 사용 상황: 박스 플롯과 비슷하지만, 데이터 분포의 밀도까지 함께 보여줄 때 사용합니다. 예를 들어, 여러 그룹의 연령 분포나 소득 분포 등을 비교할 때 사용됩니다.
- 장점: 박스 플롯의 요약 정보에 더해, 데이터 분포의 밀도를 시각적으로 파악할 수 있습니다.
|
# pyplot 인터페이스
data = np.random.rand(10, 4)
plt.violinplot(data)
plt.show()
|
|
# 객체지향 인터페이스
fig, ax = plt.subplots()
data = np.random.rand(10, 4)
ax.violinplot(data)
plt.show()
|

03. GroupBy 이해하기
|
# 간단한 매출 데이터로 GroupBy 개념 익히기
import pandas as pd
simple_data = {
'region': ['Seoul', 'Seoul', 'Busan', 'Seoul', 'Busan', 'Busan'],
'product': ['A', 'B', 'A', 'A', 'B', 'A'],
'sales': [100, 150, 80, 120, 110, 90]
}
df = pd.DataFrame(simple_data)
print("기본 데이터:")
df
|

1) 기본 GroupBy 사용법
|
# 지역별 매출 합계
region_sum = df.groupby('region')['sales'].sum()
print("지역별 총 매출:")
region_sum
|

2) agg() 함수로 여러 통계량 한번에 보기
|
# 한 컬럼에 여러 함수 적용
region_agg = df.groupby('region')['sales'].agg(['sum', 'mean', 'count'])
print("지역별 종합 통계:")
region_agg
|

|
# 여러 컬럼에 각각 다른 함수 적용
multi_agg = df.groupby('region').agg({
'sales': ['sum', 'mean'],# sales는 합계와 평균
'product': 'count'# product는 개수만
})
print("여러 컬럼 집계:")
multi_agg
|

3) 여러컬럼으로 그룹화
|
# 지역과 제품을 모두 고려한 그룹화
region_product = df.groupby(['region', 'product'])['sales'].sum()
print("지역+제품별 매출:
|

4) 다중 그룹화
|
# 지역과 제품을 동시에 고려한 분석
region_product = sales_df.groupby(['region', 'product'])['sales_amount'].agg(['sum', 'count', 'mean'])
print("지역×제품 교차 분석:")
region_product
|

04.데이터 결합
|
# concat 기본 문법# pd.concat([데이터1, 데이터2], axis=0/1, keys=['이름1', '이름2'])# axis=0: 세로로 연결 (행 추가)# axis=1: 가로로 연결 (열 추가)# 먼저 간단한 예제로 개념 이해
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [5, 6], 'B': [7, 8]})
print("첫 번째 데이터:")
print(df1)
print("두 번째 데이터:")
print(df2)
|

1) concat을 이용한 결합
|
# 세로로 연결 (axis=0, 기본값)
vertical_concat = pd.concat([df1, df2])
print("세로 연결 결과:")
print(vertical_concat)
|

|
# 가로로 연결 (axis=1)
horizontal_concat = pd.concat([df1, df2], axis=1)
print("가로 연결 결과:")
print(horizontal_concat)
|

|
df3 = pd.DataFrame({'A': [5, 6], 'B': [7, 8], 'C' : [9,10]})
# 가로로 연결 (axis=0, 기본값)
vertical_concat = pd.concat([df1, df3])
print("세로 연결 결과:")
vertical_concat
|

|
# 세로로 연결 (axis=0, 기본값)
horizontal_concat = pd.concat([df1, df3], axis=1)
horizontal_concat
|

2) merge를 이용한 결합 - 서로 다른 테이블 결합
※ merge() 사용 시기
- 공통 키(key)를 기준으로 테이블을 결합할 때
- 관계형 데이터베이스의 JOIN과 같은 개념
- 서로 다른 구조의 테이블을 연결할 때

⊙ 예시데이터
|
# merge 기본 문법# df1.merge(df2, on='공통컬럼', how='join방식')# 핵심 파라미터:# - on: 결합 기준이 되는 공통 컬럼# - how: 결합 방식 ('left', 'right', 'inner', 'outer')# - left_on, right_on: 서로 다른 컬럼명으로 결합할 때# 제품 마스터 정보 테이블 생성
product_info = pd.DataFrame({
'product': ['Laptop', 'Phone', 'Tablet', 'Watch'],
'category': ['Computer', 'Mobile', 'Mobile', 'Wearable'],
'cost_price': [800000, 400000, 300000, 200000],# 원가
'launch_year': [2020, 2021, 2022, 2023]
})
print("제품 정보 테이블:")
product_info
|

|
# 예제를 위한 간단한 데이터 생성
sales_sample = pd.DataFrame({
'product': ['Laptop', 'Phone', 'Speaker'],# Speaker는 product_info에 없음
'sales': [1000, 800, 300]
})
product_sample = pd.DataFrame({
'product': ['Laptop', 'Phone', 'Tablet'],# Tablet은 sales_sample에 없음
'number': [1500, 900, 600]
})
print("매출 샘플 데이터:")
print(sales_sample)
print("제품 갯수 데이터:")
print(product_sample)
|

① INNER JOIN - 양쪽에 모두 있는 것만
|
inner_result = sales_sample.merge(product_sample, on='product', how='inner')
print(inner_result)
|

② LEFT JOIN - 왼쪽 테이블 기준
|
# 2. LEFT JOIN - 왼쪽 테이블 기준
left_result = sales_sample.merge(product_sample, on='product', how='left')
print(left_result)
|

③ RIGHT JOIN - 오른쪽 테이블 기준
|
# 3. RIGHT JOIN - 오른쪽 테이블 기준
right_result = sales_sample.merge(product_sample, on='product', how='right')
print(right_result)
|

④ OUTER JOIN - 모든데이터 포함
|
# 4. OUTER JOIN (합집합) - 모든 데이터 포함
outer_result = sales_sample.merge(product_sample, on='product', how='outer')
print(outer_result)
|
