본문 바로가기
혼자 공부하는 데이터 분석

6장 복잡한 데이터 표현하기

by chaechaekim 2023. 6. 8.

06-1 객체지향 API로 그래프 꾸미기

 

pyplot 방식과 객체지향 API 방식

pyplot 방식: matplotlib.pyplot에 있는 함수를 사용

객체지향 API 방식: 명시적으로 피겨 객체와 서브플롯 객체를 만들고 이 객체의 메서드를 사용

 

그래프 해상도 높이기: 맷플롯립의 기본 DPI를 100으로 바꾼다.

import matplotlib.pyplot as plt

plt.rcParams['figure.dpi'] = 100

 

  • pyplot 방식으로 그래프 그리기

: plot() 함수에 리스트 형태로 데이터를 전달하고, title() 함수에는 그래프 제목을 넣어 그리기

plt.plot([1, 4, 9, 16])
plt.title('simple line graph')
plt.show()

*matplotlib.pyplot에 있는 함수를 사용하면 함수들이 하나의 피겨 객체에 대한 상태를 공유한다.

*만약 하나의 리스트만 전달한다면, plot() 함수는 원소를 y축의 값이라고 인식하고 이 리스트의 인덱스를 x축의 값으로 사용한다.

 

  • 객체지향 API 방식으로 그래프 그리기
fig, ax = plt.subplots()
ax.plot([1, 4, 9, 16])
ax.set_title('simple line graph')
fig.show()

※ 하나의 그래프를 간단하게 그릴 때는 pyplot 방식, 그래프를 여러 개 그리거나 꾸미려면 객체지향 API를 사용하면 좋다.

 

 

그래프에 한글 출력하기

 

코랩에서 폰트 설치하기

# 노트북이 코랩에서 실행 중인지 체크합니다.
import sys
if 'google.colab' in sys.modules:
    !echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
    # 나눔 폰트를 설치합니다.
    !sudo apt-get -qq -y install fonts-nanum
    import matplotlib.font_manager as fm
    font_files = fm.findSystemFonts(fontpaths=['/usr/share/fonts/truetype/nanum'])
    for fpath in font_files:
        fm.fontManager.addfont(fpath)

 

나눔폰트 설치한 후 다시 맷플롯립을 임포트하고 DPI 기본값 변경

import matplotlib.pyplot as plt
plt.rcParams['figure.dpi'] = 100

 

  • 폰트 지정하기(1): font.family 속성
plt.rcParams['font.family']

*맷플롯립의 기본 폰트는 영문 sans-serif 폰트이다.

 

기본 폰트를 나눔고딕 폰트로 바꾸기

# 나눔고딕 폰트를 사용합니다.
plt.rcParams['font.family'] = 'NanumGothic'

 

  • 폰트 지정하기(2): rc() 함수
# 위와 동일하지만 이번에는 나눔바른고딕 폰트로 설정합니다.
plt.rc('font', family='NanumBarunGothic')

*rc() 함수의 첫 번째 매개변수에는 설정할 그룹을 지정하고, 두 번째 매개변수에는 그룹 하위 속성을 지정한다.

(font.family의 경우 font가 그룹이고 family는 그룹 하위 속성이다.)

 

rc() 함수를 사용하면 한 그룹 내의 여러 설정을 동시에 지정할 수 있다.

plt.rc('font', family='NanumBarunGothic', size=11)

 

바뀐 내용 rcParams 객체로 확인

print(plt.rcParams['font.family'], plt.rcParams['font.size'])

 

앞에서 출력한 그래프의 제목을 한글로 출력해보기

plt.plot([1, 4, 9, 16])
plt.title('간단한 선 그래프')
plt.show()

 

폰트 크기 다시 기본값 10으로 변경

plt.rc('font', size=10)

 

 

출판사별 발행 도서 개수 산점도 그리기

 

ns_book7.csv 파일을 구글 드라이브에서 다운로드하고 판다스 데이터프레임으로 불러오기

import gdown

gdown.download('https://bit.ly/3pK7iuu', 'ns_book7.csv', quiet=False)

import pandas as pd

ns_book7 = pd.read_csv('ns_book7.csv', low_memory=False)
ns_book7.head()

 

  • 고유한 출판사 목록 만들기

 

상위 30개 출판사 선택

top30_pubs = ns_book7['출판사'].value_counts()[:30] //마지막 인덱스는 범위에 포함하지 않으므로 가져오려는 인덱스보다 하나 더 크게 지정해야 함
top30_pubs

*value_counts() 메서드: 카운트가 높은 순으로 결과를 내림차순 정렬

 

ns_book7 데이터프레임에서 상위 30개 출판사에 해당하는 행을 표시하는 불리언 인덱스 만들기

top30_pubs_idx = ns_book7['출판사'].isin(top30_pubs.index) //상위 30개에 해당하는 출판사는 True, 아닌 출판사는 False로 반환
top30_pubs_idx

*isin() 메서드: 어떤 행의 출판사가 top30_pubs 목록에 있는 출판사 중 하나에 해당하는지 검사

*isin() 메서드에 값을 전달하면 데이터프레임에서 일치하는 값을 찾아 불리언 배열로 반환

 

상위 30개 출판사 발행 도서 개수 세기

: 시리즈 객체에서 sum() 메서드를 호출하면 값을 모두 더한다.

top30_pubs_idx.sum()

*값이 불리언일 경우 True는 1, False는 0으로 처리된다.

 

1,000개만 선택하기

ns_book8 = ns_book7[top30_pubs_idx].sample(1000, random_state=42)
ns_book8.head()

*sample() 메서드: 데이터프레임의 행을 무작위로 선택할 때 사용

*sample() 메서드의 첫 번째 매개변수에는 무작위로 선택할 행 개수를 지정

*random_state 매개변수: 넘파이의 seed() 함수와 비슷한 역할

 

  • 산점도 그리기

: x축에는 '발행년도'열, y축에는 '출판사'열 지정하고 조금 크게 그리기 위해 subplots() 함수로 피겨의 크기를 (10,8)로 지정

→ 자연스럽게 객체지향 API 사용

fig, ax = plt.subplots(figsize=(10, 8))
ax.scatter(ns_book8['발행년도'], ns_book8['출판사'])
ax.set_title('출판사별 발행도서')
fig.show()

 

  • 값에 따라 마커 크기를 다르게 나타내기

: '대출건수'열을 마커 크기로 전달하여 대출건수가 많은 도서를 상대적으로 크게 그리기

fig, ax = plt.subplots(figsize=(10, 8))
ax.scatter(ns_book8['발행년도'], ns_book8['출판사'], s=ns_book8['대출건수'])
ax.set_title('출판사별 발행도서')
fig.show()

*scatter() 함수: 마커의 크기를 지정할 수 있는 s 매개변수 제공

*선 그래프와 산점도의 마커 크기는 rcParams['lines.markersize']로 지정하며 기본값은 6

*s 매개변수의 기본값: rcParams['lines.markersize']의 제곱 사용

*s 매개변수 값을 하나의 실수로 바꾸면 산점도의 모든 마커 크기가 동일하게 바뀐다.

→ 입력 데이터와 동일한 길이의 배열을 지정하면 각 데이터마다 마커의 크기가 다른 산점도 그리기 가능

 

  • 마커 꾸미기

1. 투명도 조절하기: alpha 매개변수

2. 마커 테두리 색 바꾸기: edgecolor 매개변수(기본값은 마커의 색을 의미하는 'face')

3. 마커 테두리 선 두께 바꾸기: linewidths 매개변수(기본값은 1.5)

4. 산점도 색 바꾸기: c 매개변수

fig, ax = plt.subplots(figsize=(10, 8))
ax.scatter(ns_book8['발행년도'], ns_book8['출판사'], 
           linewidths=0.5, edgecolors='k', alpha=0.3,
           s=ns_book8['대출건수']*2, c=ns_book8['대출건수'])
ax.set_title('출판사별 발행도서')
fig.show()

 

  • 값에 따라 색상 표현하기: 컬러맵

산점도를 jet 컬러맵으로 그리기 + 컬러맵의 색깔이 어떤 대출건수 값에 대응하는지 참조 정보를 제공하는 컬러막대

fig, ax = plt.subplots(figsize=(10, 8))
sc = ax.scatter(ns_book8['발행년도'], ns_book8['출판사'], 
                linewidths=0.5, edgecolors='k', alpha=0.3,
                s=ns_book8['대출건수']**1.3, c=ns_book8['대출건수'], cmap='jet')
ax.set_title('출판사별 발행도서')
fig.colorbar(sc)
fig.show()

*viridis 컬러맵: scatter() 함수가 사용하는 기본값

*jet 컬러맵: 낮은 값일수록 짙은 파란색, 높은 값으로 갈수록 노란색으로 바뀌었다가 붉은색

*컬러맵은 cmap 매개변수로 지정

*컬러막대는 scatter() 함수가 반환하는 객체를 colorbar() 메서드에 전달

 

정리

함수/메서드 기능
matplotlib.pyplot.rc() rcParams 객체의 값 설정
Figure.colorbar() 그래프에 컬러 막대 추가

06-1 맷플롭립의 고급 기능 배우기

 

실습 준비하기

 

한글 폰트 설치

# 노트북이 코랩에서 실행 중인지 체크합니다.
import sys
if 'google.colab' in sys.modules:
    !echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
    # 나눔 폰트를 설치합니다.
    !sudo apt-get -qq -y install fonts-nanum
    import matplotlib.font_manager as fm
    font_files = fm.findSystemFonts(fontpaths=['/usr/share/fonts/truetype/nanum'])
    for fpath in font_files:
        fm.fontManager.addfont(fpath)

 

맷플롯립 폰트 기본값 'NanumBarunGothic'으로 설정해주고, 그래프가 잘 보이도록 해상도 기본값 100으로 높이기

import matplotlib.pyplot as plt

# 나눔바른고딕 폰트로 설정합니다.
plt.rc('font', family='NanumBarunGothic')

# 그래프 DPI 기본값을 변경합니다.
plt.rcParams['figure.dpi'] = 100

 

ns_book7.csv 파일을 구글 드라이브에서 다운로드하고 판다스 데이터프레임으로 불러오기

import gdown

gdown.download('https://bit.ly/3pK7iuu', 'ns_book7.csv', quiet=False)

import pandas as pd

ns_book7 = pd.read_csv('ns_book7.csv', low_memory=False)
ns_book7.head()

 

하나의 피겨에 여러 개의 선 그래프 그리기

맷플롯립: plot() 함수 여러 번 호출

 

ns_book7 데이터프레임에서 출판사 고르기

top30_pubs = ns_book7['출판사'].value_counts()[:30]
top30_pubs_idx = ns_book7['출판사'].isin(top30_pubs.index)

 

ns_book7 데이터프레임에서 상위 30위에 해당하는 '출판사', '발행년도', '대출건수' 열만 추출하여 ns_book9 만들기

→ groupby() 메서드를 사용해 '출판사'와 '발행년도'열을 기준으로 행을 모은 후 sum() 메서드로 '대출건수'열 합 구하기

ns_book9 = ns_book7[top30_pubs_idx][['출판사', '발행년도', '대출건수']]
ns_book9 = ns_book9.groupby(by=['출판사', '발행년도']).sum()

 

reset_index() 메서드: 인덱스를 초기화

→ 황금가지라는 출판사 데이터 확인

ns_book9 = ns_book9.reset_index()
ns_book9[ns_book9['출판사'] == '황금가지'].head()

 

  • 선 그래프 2개 그리기

출판사 별로 각각 데이터프레임 만들기

line1 = ns_book9[ns_book9['출판사'] == '황금가지']
line2 = ns_book9[ns_book9['출판사'] == '비룡소']

 

line1과  line2 데이터프레임의 '발행년도'열과 '대출건수'열로 plot() 함수를 두 번 호출

fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(line1['발행년도'], line1['대출건수'])
ax.plot(line2['발행년도'], line2['대출건수'])
ax.set_title('년도별 대출건수')
fig.show()

*파란색: 황금기지, 붉은색: 비룡소

 

범례 추가하기

: plot() 함수 호출할 때 각 선 그래프에 레이블을 추가하고, 마지막에 legend() 메서드를 호출

fig, ax = plt.subplots(figsize=(8, 6))
ax.plot(line1['발행년도'], line1['대출건수'], label='황금가지')
ax.plot(line2['발행년도'], line2['대출건수'], label='비룡소')
ax.set_title('년도별 대출건수')
ax.legend()
fig.show()

 

  • 선 그래프 5개 그리기

for 문과 슬라이스 연산자를 사용해 선 그래프 그리기

fig, ax = plt.subplots(figsize=(8, 6))
for pub in top30_pubs.index[:5]:
    line = ns_book9[ns_book9['출판사'] == pub] //상위 5개 출판사 선택
    ax.plot(line['발행년도'], line['대출건수'], label=pub) //5개 출판사에 대한 선 그래프 그리기
ax.set_title('년도별 대출건수')
ax.legend()
ax.set_xlim(1985, 2025) //x축 범위 1985부터 2025까지
fig.show()

*연도 범위 지정하지 않으면 오른쪽으로 많이 치우침 → set_xlim() 메서드 사용하여 1990년대 이후 데이터 중점

*첫 번째 매개변수는 x축의 최솟값, 두 번째 매개변수는 x축의 최댓값

*y축 범위 지정은 set_ylim() 메서드 사용

 

  • 스택 영역 그래프

: 하나의 선 그래프 위에 다른 선 그래프를 차례대로 쌓는 것

*그래프 사이의 간격이 y축의 값이 된다.

*stackplot() 메서드: 첫 번째 매개변수에 x축, 두 번째 매개변수에 y축 값을 2차원 배열로 전달

 

ns_book9 데이터프레임에서 '발행년도'열의 개별 값을 하나의 열로 구성한 후 상위 10개 출판사의 연도별 대출건수 스택 그래프로 그리기

1. pivot_table() 메서드로 각 '발행년도' 열의 값을 열로 바꾸기

데이터 구조를 바꿀 때 pivot_table() 메서드로 처리 (엑셀의 피벗 테이블과 유사)

*index 매개변수와 columns 매개변수에 원본 데이터프레임의 열을 지정하면 각 열의 고유한 값이 피벗 테이블로 변환된 데이터프레임의 인덱스와 열이 된다.

 

index 매개변수에 '출판사'열, columns 매개변수에 '발행년도'열 지정

ns_book10 = ns_book9.pivot_table(index='출판사', columns='발행년도')
ns_book10.head()

 

2. '발행년도' 열을 리스트 형태로 바꾸기

*get_level_values() 메서드: 다단으로 구성된 열 이름에서 선택한 항목만 가져올 수 있다.

top10_pubs = top30_pubs.index[:10]
year_cols = ns_book10.columns.get_level_values(1)

 

3. stackplot() 메서드로 스택 영역 그래프 그리기

*legend() 메서드: loc 매개변수로 범례 위치 지정 가능

stackplot() 메서드 x축 값에는 year_cols를,  y축에는 ns_book10에서 상위 10개 출판사에 해당하는 행을 골라 전달

fig, ax = plt.subplots(figsize=(8, 6))
ax.stackplot(year_cols, ns_book10.loc[top10_pubs].fillna(0), labels=top10_pubs)
ax.set_title('년도별 대출건수')
ax.legend(loc='upper left')
ax.set_xlim(1985, 2025)
fig.show()

 

하나의 피겨에 여러 개의 막대 그래프 그리기

: bar() 메서드 여러 번 호출

 

앞에서 만든 line1과 line2 데이터프레임으로 연이어 bar() 메서드 호출

fig, ax = plt.subplots(figsize=(8, 6))
ax.bar(line1['발행년도'], line1['대출건수'], label='황금가지')
ax.bar(line2['발행년도'], line2['대출건수'], label='비룡소')
ax.set_title('년도별 대출건수')
ax.legend()
fig.show()

 

두 출판사 막대 나란히 옆으로 그리기

: 기본 너비 0.8의 절반인 0.4 너비로 두 막대 그래프를 그린 다음, x축에서 막대 하나 너비 0.4의 절반 0.2씩 떨어지도록

fig, ax = plt.subplots(figsize=(8, 6))
ax.bar(line1['발행년도']-0.2, line1['대출건수'], width=0.4, label='황금가지')
ax.bar(line2['발행년도']+0.2, line2['대출건수'], width=0.4, label='비룡소')
ax.set_title('년도별 대출건수')
ax.legend()
fig.show()

 

  • 스택 막대 그래프

: 막대 그래프를 스택 영역 그래프처럼 위로 쌓은 그래프

*bar() 메서드의 bottom 매개변수를 사용하여 수동으로 막대 쌓기

 

height1 막대 그래프 위에 height2 쌓기

height1 = [5, 4, 7, 9, 8]
height2 = [3, 2, 4, 1, 2]

plt.bar(range(5), height1, width=0.5)
plt.bar(range(5), height2, bottom=height1, width=0.5)
plt.show()

 

막대의 길이를 누적해 놓고 이 값으로 그래프 그리기

: height1과 height2를 더하여 height3을 만든 후, height3을 먼저 그리고 height1 그리기

height3 = [a + b for a, b in zip(height1, height2)]

plt.bar(range(5), height3, width=0.5)
plt.bar(range(5), height1, width=0.5)
plt.show()

 

  • 데이터값 누적하여 그리기

ns_book10 데이터프레임에서 상위 5개 출판사의 2013~2020년 대출건수 확인

→ loc 메서드 사용

ns_book10.loc[top10_pubs[:5], ('대출건수',2013):('대출건수',2020)]

 

동일한 데이터프레임에서 cumsum() 메서드 호출

ns_book10.loc[top10_pubs[:5], ('대출건수',2013):('대출건수',2020)].cumsum()

*cumsum() 메서드는 기본적으로 행을 따라 값을 누적 → axis 매개변수를 1로 지정하면 열 방향으로 누적 가능

 

ns_book10 데이터프레임 전체에 cumsum() 메서드 적용

ns_book12 = ns_book10.loc[top10_pubs].cumsum()

 

파이썬의 range() 함수로 ns_book12 데이터프레임 행 개수만큼 인덱스 번호를 만들고, for 문에 reversed() 함수를 사용해 인덱스 역순으로 반복하여 그리기

fig, ax = plt.subplots(figsize=(8, 6))
for i in reversed(range(len(ns_book12))):
    bar = ns_book12.iloc[i]     # 행 추출
    label = ns_book12.index[i]  # 출판사 이름 추출
    ax.bar(year_cols, bar, label=label)
ax.set_title('년도별 대출건수')
ax.legend(loc='upper left')
ax.set_xlim(1985, 2025)
fig.show()

*가장 큰 막대 먼저 그려야 하므로 누적 합계가 가장 큰 마지막 출판사부터 그린다.

 

원 그래프 그리기

원 그래프(파이 차트): 전체 데이터에 대한 비율을 원의 부채꼴로 나타낸 그래프

 

top30_pubs의 값과 인덱스에서 처음 10개만 선택하여 각각 data와 labels 변수에 저장

data = top30_pubs[:10]
labels = top30_pubs.index[:10]

 

pie() 메서드: 첫 번째 매개변수에 앞서 정의한 data를 전달하면 자동으로 데이터 전체에 대한 비율을 계산하여 그래프 그린다.

fig, ax = plt.subplots(figsize=(8, 6))
ax.pie(data, labels=labels)
ax.set_title('출판사 도서비율')
fig.show()

*맷플롯립의 원 그래프는 기본적으로 3시 방향부터 반시계 방향으로 데이터를 그린다.

 

  • 원 그래프의 단점

: 시각적으로 어떤 데이터가 더 큰지 한눈에 구분하기 어렵다. (특히 3차원)

 

startangle 매개변수를 90으로 지정하여 12시 방향부터 원 그래프 그리기

: 2개의 데이터만 있는 경우 데이터 차이를 명확하게 나타낼 수 있다.

plt.pie([10,9], labels=['A제품', 'B제품'], startangle=90)
plt.title('제품의 매출비율')
plt.show()

 

  • 비율 표시하고 부채꼴 강조하기

pie() 메서드의 autopct 매개변수: 파이썬의 % 연산자에 적용할 포맷팅 문자열 전달 가능 예) %d를 전달하면 비율이 정수로 표시

부채꼴 조각을 떨어뜨려 시각적으로 부각: explode 매개변수에 떨어뜨리길 원하는 조각의 간격을 반지름의 비율로 지정

fig, ax = plt.subplots(figsize=(8, 6))
ax.pie(data, labels=labels, startangle=90,
       autopct='%.1f%%', explode=[0.1]+[0]*9)
ax.set_title('출판사 도서비율')
fig.show()

 

여러 종류의 그래프가 있는 서브플롯 그리기

*subplots() 함수의 첫 번째 매개변수와 두 번째 매개변수에는 서브플롯의 행 개수와 열 개수를 지정할 수 있다.

예) subplots(2, 2): 행이 2개이고 열이 2개인 4개의 서브플롯이 만들어짐

*subplots() 함수에서 반환 받은 Axes 객체를 사용할 때는 2차원 배열처럼 각 격자의 위치를 지정해야 함

*셔브플롯 안에 있는 산점도에 컬러 막대도 넣으려면 colorbar() 메서드의 ax 매개변수에 해당 서브플롯 객체를 지정해줘야 함

fig, axes = plt.subplots(2, 2, figsize=(20, 16))

# 산점도
ns_book8 = ns_book7[top30_pubs_idx].sample(1000, random_state=42)
sc = axes[0, 0].scatter(ns_book8['발행년도'], ns_book8['출판사'], 
                        linewidths=0.5, edgecolors='k', alpha=0.3,
                        s=ns_book8['대출건수'], c=ns_book8['대출건수'], cmap='jet')
axes[0, 0].set_title('출판사별 발행도서')
fig.colorbar(sc, ax=axes[0, 0])

# 스택 선 그래프
axes[0, 1].stackplot(year_cols, ns_book10.loc[top10_pubs].fillna(0), 
                     labels=top10_pubs)
axes[0, 1].set_title('년도별 대출건수')
axes[0, 1].legend(loc='upper left')
axes[0, 1].set_xlim(1985, 2025)

# 스택 막대 그래프
for i in reversed(range(len(ns_book12))):
    bar = ns_book12.iloc[i]     # 행 추출
    label = ns_book12.index[i]  # 출판사 이름 추출
    axes[1, 0].bar(year_cols, bar, label=label)
axes[1, 0].set_title('년도별 대출건수')
axes[1, 0].legend(loc='upper left')
axes[1, 0].set_xlim(1985, 2025)

# 원 그래프
axes[1, 1].pie(data, labels=labels, startangle=90,
               autopct='%.1f%%', explode=[0.1]+[0]*9)
axes[1, 1].set_title('출판사 도서비율')

fig.savefig('all_in_one.png')
fig.show()

 

좀 더 알아보기) 판다스로 여러 개의 그래프 그리기

  • 스택 영역 그래프 그리기: plot.area() 메서드 사용

 

ns_book9를 피벗 테이블로 변환하고 index 매개변수에는 '발행년도'열, columns 매개변수에는 '출판사' 열 지정

ns_book11 = ns_book9.pivot_table(index='발행년도', columns='출판사', values='대출건수')
ns_book11.loc[2000:2005]

*values 매개변수에 집계할 열 지정 → 열 이름이 다단으로 구성되지 않는다.

 

plot.area() 메서드를 호출하여 스택 영역 그래프 그리기

fig, ax = plt.subplots(figsize=(8, 6))
ns_book11[top10_pubs].plot.area(ax=ax, title='년도별 대출건수',
                                xlim=(1985, 2025))
ax.legend(loc='upper left')
fig.show()

*서브플롯을 명시적으로 만든 경우 area() 메서드의 ax 매개변수에 맷플롯립의 Axes 객체를 전달해야 한다.

 

 

  • 스택 막대 그래프 그리기: plot.bar() 메서드

*stacked 매개변수를 True로 지정하면 그릴 수 있다. (cumsum() 메서드 호출 필요없음)

fig, ax = plt.subplots(figsize=(8, 6))
ns_book11.loc[1985:2025, top10_pubs].plot.bar(
    ax=ax, title='년도별 대출건수', stacked=True, width=0.8)
ax.legend(loc='upper left')
fig.show()

 

 

정리

함수/메서드 기능
Axes.legend() 그래프에 범례 추가
Axes.set_xlim() x축의 출력 범위 지정
DataFrame.pivot_table() 피벗 테이블 기능 제공
Axes.stackplot() 스택 영역 그래프 그리기
DataFrame.plot.area() 스택 영역 그래프 그리기
DataFrame.plot.bar() 막대 그래프 그리기
DataFrame.cumsum() 행이나 열 방향으로 누적 합 계산
Axes.pie() 원 그래프 그리기

 

'혼자 공부하는 데이터 분석' 카테고리의 다른 글

7장 검증하고 예측하기  (0) 2023.06.11
5장 데이터 시각화하기  (1) 2023.05.29
4장 데이터 요약하기  (0) 2023.05.29
3장 데이터 정제하기  (0) 2023.05.22
2장 데이터 수집하기  (0) 2023.05.14

댓글