A A
[Data Mining] Visualizing Data


데이터 μ‹œκ°ν™”λ₯Ό μœ„ν•œ 두 가지 μ£Όμš” μš©λ„

데이터λ₯Ό νƒμƒ‰ν•˜λ €λ©΄? 두 가지 μ£Όμš” μš©λ„μ— λ°ν•˜μ—¬ μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€.

 

탐색적 데이터 뢄석 (Exploratory Data Analysis, EDA)

  • λͺ©μ : λ°μ΄ν„°μ˜ νŒ¨ν„΄, νŠΈλ Œλ“œ, μ΄μƒμΉ˜λ₯Ό μ‹λ³„ν•˜κ³  μ΄ν•΄ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. μ΄λŠ” λ°μ΄ν„°μ˜ ꡬ쑰λ₯Ό νŒŒμ•…ν•˜κ³  톡계적 관계λ₯Ό λ°œκ²¬ν•˜λŠ” 초기 λ‹¨κ³„μ—μ„œ 맀우 μ€‘μš”ν•©λ‹ˆλ‹€.
  • 도ꡬ: νžˆμŠ€ν† κ·Έλž¨, λ°•μŠ€ ν”Œλ‘―, 산점도, 열지도와 같은 κ·Έλž˜ν”„κ°€ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.

μ„€λͺ…적 데이터 뢄석 (Explanatory Data Analysis)

  • λͺ©μ : νŠΉμ • λ°œκ²¬μ΄λ‚˜ 톡찰을 μ „λ‹¬ν•˜κΈ° μœ„ν•΄ 데이터λ₯Ό μ‹œκ°μ μœΌλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€. μ΄λŠ” 데이터λ₯Ό 톡해 μ΄μ•ΌκΈ°ν•˜κ±°λ‚˜ μ˜μ‚¬ 결정을 μ§€μ›ν•˜λŠ” κ³Όμ •μ—μ„œ μ€‘μš”ν•©λ‹ˆλ‹€.
  • 도ꡬ: λ§‰λŒ€ κ·Έλž˜ν”„, 파이 차트, μ„  κ·Έλž˜ν”„, λŒ€μ‹œλ³΄λ“œ 등이 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.

Matplotlib

Matplotlib은 νŒŒμ΄μ¬μ—μ„œ 데이터λ₯Ό μ‹œκ°ν™”ν•˜λŠ” 데 널리 μ‚¬μš©λ˜λŠ” λΌμ΄λΈŒλŸ¬λ¦¬μž…λ‹ˆλ‹€.
  • 이 λΌμ΄λΈŒλŸ¬λ¦¬λŠ” λ‹€μ–‘ν•œ κ·Έλž˜ν”„μ™€ 차트λ₯Ό 생성할 수 μžˆλŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜λ©°, 특히 탐색적 데이터 뢄석(EDA)κ³Ό μ„€λͺ…적 데이터 뢄석(EDA) λͺ¨λ‘μ— μœ μš©ν•˜κ²Œ μ‚¬μš©λ©λ‹ˆλ‹€.
import matplotlib.pyplot as plt
  • 이 μ½”λ“œλŠ” (1, 10), (2, 20), 그리고 (10, 5) μ„Έ 점을 μ—°κ²°ν•˜λŠ” 선을 κ·Έλ¦½λ‹ˆλ‹€. 첫 번째 리슀트 [1, 2, 10]은 xμΆ• μ’Œν‘œλ₯Ό λ‚˜νƒ€λ‚΄κ³ , 두 번째 리슀트 [10, 20, 5]λŠ” yμΆ• μ’Œν‘œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
plt.plot([1,2,10],[10,20,5])
plt.show()

  • [1, 2, 10]의 x μ’Œν‘œμ™€ [10, 20, 5]의 y μ’Œν‘œλ₯Ό κ°€μ§€λŠ” μ„Έ 개의 점을 이어 μ„  κ·Έλž˜ν”„λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
plt.plot([1,2,0],[10,20,5])
plt.show()

plt.plot(['a','b','c'],[10,20,5])
plt.show()

# just rank
plt.plot(['a','b','z'],[10,20,5])
plt.show()

# xμΆ•κ³Ό yμΆ•μ˜ λ²”μœ„ μ„€μ •
plt.axis([-0.2, 2.2, 0, 21])

# μ„  κ·Έλž˜ν”„ 생성
plt.plot(['z', 'b', 'a'], [10, 20, 5])

# μƒμ„±ν•œ κ·Έλž˜ν”„λ₯Ό 화면에 ν‘œμ‹œ
plt.show()


Example.

def make_chart_simple_line_chart():
    # 연도 데이터λ₯Ό 담은 리슀트
    years = [1950, 1960, 1970, 1980, 1990, 2000, 2010]
    # ν•΄λ‹Ή μ—°λ„μ˜ GDP 데이터λ₯Ό 담은 리슀트
    gdp = [300.2, 543.3, 1075.9, 2862.5, 5979.6, 10289.7, 14958.3]

    # 라인 차트 생성: xμΆ•μ—λŠ” 연도, yμΆ•μ—λŠ” GDP
    # 색깔은 녹색, λ§ˆμ»€λŠ” 'o' (μ›ν˜•), μ„  μŠ€νƒ€μΌμ€ μ‹€μ„ μœΌλ‘œ μ„€μ •
    plt.plot(years, gdp, color='green', marker='o', linestyle='solid')

    # μ°¨νŠΈμ— 제λͺ© μΆ”κ°€
    plt.title("Nominal GDP")

    # y좕에 λ ˆμ΄λΈ” μΆ”κ°€
    plt.ylabel("Billions of $")

    # μƒμ„±ν•œ 차트λ₯Ό 화면에 ν‘œμ‹œ
    plt.show()

# ν•¨μˆ˜ 호좜
make_chart_simple_line_chart()
  1. years λ¦¬μŠ€νŠΈμ—λŠ” 연도 데이터λ₯Ό, gdp λ¦¬μŠ€νŠΈμ—λŠ” ν•΄λ‹Ή μ—°λ„μ˜ GDP 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
  2. plt.plot() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 라인 차트λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. xμΆ•μ—λŠ” 연도 (years)λ₯Ό, yμΆ•μ—λŠ” GDP (gdp)λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. 라인의 색깔은 λ…Ήμƒ‰μœΌλ‘œ μ§€μ •λ˜μ—ˆκ³ , λ§ˆμ»€λŠ” 'o' (μ›ν˜•)둜, μ„  μŠ€νƒ€μΌμ€ 'solid'둜 μ„€μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  3. plt.title() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ°¨νŠΈμ— 제λͺ©μ„ μΆ”κ°€ν•©λ‹ˆλ‹€. 제λͺ©μ€ "Nominal GDP"둜 μ§€μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  4. plt.ylabel() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ y좕에 λ ˆμ΄λΈ”μ„ μΆ”κ°€ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” "Billions of $"둜 μ„€μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
  5. plt.show() ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ 차트λ₯Ό 화면에 ν‘œμ‹œν•©λ‹ˆλ‹€.


Bar Charts

λ§‰λŒ€ μ°¨νŠΈλŠ” 일뢀 κ°œλ³„ ν•­λͺ© μ§‘ν•©μ—μ„œ 일뢀 μˆ˜λŸ‰μ΄ μ–΄λ–»κ²Œ λ‹€λ₯Έμ§€ 보여주고 싢을 λ•Œ 쒋은 μ„ νƒμž…λ‹ˆλ‹€.
plt.bar([1, 3, 0, 10],[10,20,30,1])
plt.show()


Example.

def make_chart_simple_bar_chart():
    # μ˜ν™” 제λͺ©κ³Ό ν•΄λ‹Ή μ˜ν™”κ°€ μˆ˜μƒν•œ 아카데미 μƒμ˜ 개수λ₯Ό 담은 리슀트
    movies = ["Annie Hall", "Ben-Hur", "Casablanca", "Gandhi", "West Side Story"]
    num_oscars = [5, 11, 3, 8, 10]

    # 각 λ§‰λŒ€κ°€ 쀑앙에 μœ„μΉ˜ν•˜λ„λ‘ ν•˜κΈ° μœ„ν•΄ μ™Όμͺ½ μ’Œν‘œμ— 0.1을 μΆ”κ°€
    xs = [i + 0.5 for i, _ in enumerate(movies)]
    # λ§‰λŒ€ κ·Έλž˜ν”„ 생성: x좕은 μ˜ν™” 제λͺ©, y좕은 아카데미 상 개수
    plt.bar(xs, num_oscars)
    
    # yμΆ• λ ˆμ΄λΈ” μΆ”κ°€
    plt.ylabel("# of Academy Awards")
    # 차트 제λͺ© μΆ”κ°€
    plt.title("My Favorite Movies")

    # λ§‰λŒ€μ˜ κ°€μš΄λ°μ— μ˜ν™” 제λͺ©μ„ ν‘œμ‹œν•˜κΈ° μœ„ν•΄ xμΆ• λ ˆμ΄λΈ” μ„€μ •
    plt.xticks([i for i, _ in enumerate(movies)], movies)

    # μƒμ„±ν•œ 차트λ₯Ό 화면에 ν‘œμ‹œ
    plt.show()

# ν•¨μˆ˜ 호좜
make_chart_simple_bar_chart()

  • movies λ¦¬μŠ€νŠΈλŠ” λ‹€μ„― 개의 μ˜ν™” 제λͺ©μ„ ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
  • num_oscars λ¦¬μŠ€νŠΈλŠ” 각 μ˜ν™”κ°€ μˆ˜μƒν•œ 아카데미 μƒμ˜ 수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • xs λ¦¬μŠ€νŠΈλŠ” 각 λ§‰λŒ€μ˜ xμ’Œν‘œλ₯Ό μ‘°μ •ν•˜μ—¬ λ§‰λŒ€κ°€ 쀑앙에 μœ„μΉ˜ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
  • plt.bar() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ§‰λŒ€ κ·Έλž˜ν”„λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. x좕은 μ˜ν™” 제λͺ©μ„, y좕은 아카데미 μƒμ˜ 개수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • plt.ylabel() ν•¨μˆ˜λŠ” y좕에 λ ˆμ΄λΈ” "# of Academy Awards"λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
  • plt.title() ν•¨μˆ˜λŠ” μ°¨νŠΈμ— 제λͺ© "My Favorite Movies"λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
  • plt.xticks() ν•¨μˆ˜λŠ” xμΆ• λ ˆμ΄λΈ”λ‘œ μ˜ν™” 제λͺ©μ„ μ‚¬μš©ν•˜μ—¬ λ§‰λŒ€μ˜ κ°€μš΄λ°μ— μ˜ν™” 제λͺ©μ„ ν‘œμ‹œν•©λ‹ˆλ‹€.
  • plt.show() ν•¨μˆ˜λŠ” μƒμ„±λœ 차트λ₯Ό 화면에 ν‘œμ‹œν•©λ‹ˆλ‹€.

λ§‰λŒ€ μ°¨νŠΈλŠ” 값이 λΆ„ν¬λ˜λŠ” 방식을 μ‹œκ°μ μœΌλ‘œ νƒμƒ‰ν•˜κΈ° μœ„ν•΄ 버킷 숫자 κ°’μ˜ νžˆμŠ€ν† κ·Έλž¨μ„ ν‘œμ‹œν•˜λŠ” 데에도 쒋은 선택이 될 수 μžˆμŠ΅λ‹ˆλ‹€.
from collections import Counter

def make_chart_histogram():
    # ν•™μƒλ“€μ˜ μ‹œν—˜ 성적을 λ‚˜νƒ€λ‚΄λŠ” 리슀트
    grades = [83, 95, 91, 87, 70, 0, 85, 82, 100, 67, 73, 77, 0]
    
    # 성적을 10의 λ°°μˆ˜μ— ν•΄λ‹Ήν•˜λŠ” κ΅¬κ°„μœΌλ‘œ λ³€ν™˜ν•˜λŠ” λžŒλ‹€ ν•¨μˆ˜
    decile = lambda grade: grade // 10 * 10
    # Counter 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ 각 ꡬ간에 μ†ν•˜λŠ” 학생 수λ₯Ό μ„Έμ–΄ μ €μž₯
    histogram = Counter(decile(grade) for grade in grades)

    # λ§‰λŒ€ κ·Έλž˜ν”„ 생성: 각 λ§‰λŒ€λŠ” νŠΉμ • ꡬ간에 μ†ν•˜λŠ” 학생 수λ₯Ό λ‚˜νƒ€λƒ„
    plt.bar([x + 5 for x in histogram.keys()],  # λ§‰λŒ€λ₯Ό μ™Όμͺ½μœΌλ‘œ 5만큼 이동
            histogram.values(),                 # 각 λ§‰λŒ€μ˜ 높이 지정
            8)                                  # λ§‰λŒ€μ˜ λ„ˆλΉ„ 지정

    # xμΆ• λ²”μœ„ μ„€μ •: -5λΆ€ν„° 105κΉŒμ§€, yμΆ• λ²”μœ„ μ„€μ •: 0λΆ€ν„° 5κΉŒμ§€
    plt.axis([-5, 105, 0, 5])
    # xμΆ• λ ˆμ΄λΈ” μ„€μ •: 0λΆ€ν„° 100κΉŒμ§€ 10의 배수둜 ν‘œμ‹œ
    plt.xticks([10 * i for i in range(11)])
    # xμΆ• λ ˆμ΄λΈ” 지정
    plt.xlabel("Decile")
    # yμΆ• λ ˆμ΄λΈ” 지정
    plt.ylabel("# of Students")
    # 차트 제λͺ© 지정
    plt.title("Distribution of Exam 1 Grades")

    # μƒμ„±ν•œ νžˆμŠ€ν† κ·Έλž¨μ„ 화면에 ν‘œμ‹œ
    plt.show()

# ν•¨μˆ˜ 호좜
make_chart_histogram()

 

# 데이터
data = [1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 4, 6, 10, 10, 10, 10, 10]

# νžˆμŠ€ν† κ·Έλž¨ 생성
plt.hist(data, bins=10)

# μƒμ„±ν•œ νžˆμŠ€ν† κ·Έλž¨μ„ 화면에 ν‘œμ‹œ
plt.show()


Misleading bar chart

def make_chart_misleading_y_axis(mislead=True):
    # "data science"μ΄λΌλŠ” 문ꡬ가 μ–ΈκΈ‰λœ 횟수
    mentions = [500, 505]
    # 연도
    years = [2013, 2014]

    # λ§‰λŒ€ κ·Έλž˜ν”„ 생성
    plt.bar([2012.6, 2013.6], mentions, 0.8)
    # x좕에 연도 λ ˆμ΄λΈ” μΆ”κ°€
    plt.xticks(years)
    # yμΆ• λ ˆμ΄λΈ” μΆ”κ°€
    plt.ylabel("# of times I heard someone say 'data science'")

    if mislead:
        # y좕을 μ˜€λ„ν•˜μ—¬ 500 μ΄μƒμ˜ λΆ€λΆ„λ§Œ 보이게 함
        plt.axis([2012.5, 2014.5, 499, 506])
        # μ˜€λ„ν•œ μ°¨νŠΈμ— λŒ€ν•œ 제λͺ© μΆ”κ°€
        plt.title("Look at the 'Huge' Increase!")
    else:
        # μ˜€λ„ν•˜μ§€ μ•Šμ€ 정상적인 차트
        plt.axis([2012.5, 2014.5, 0, 550])
        # 정상적인 μ°¨νŠΈμ— λŒ€ν•œ 제λͺ© μΆ”κ°€
        plt.title("Not So Huge Anymore.")

    # μƒμ„±ν•œ 차트λ₯Ό 화면에 ν‘œμ‹œ
    plt.show()
make_chart_misleading_y_axis()

make_chart_misleading_y_axis(mislead=False)


Line Charts

  • plt.plot()을 μ‚¬μš©ν•œ μ„ ν˜• 차트 μž…λ‹ˆλ‹€.
  • νŠΈλ Œλ“œλ₯Ό λ³΄μ—¬μ€„λ•Œ 주둜 μ‚¬μš© ν•©λ‹ˆλ‹€.
def make_chart_several_line_charts():
    # λΆ„μ‚°
    variance = [1, 2, 4, 8, 16, 32, 64, 128, 256]
    # 편ν–₯ 제곱
    bias_squared = [256, 128, 64, 32, 16, 8, 4, 2, 1]
    # 총 였차
    total_error = [x + y for x, y in zip(variance, bias_squared)]

    xs = range(len(variance))

    # μ—¬λŸ¬ 개의 plt.plot 호좜둜 λ™μΌν•œ μ°¨νŠΈμ— μ—¬λŸ¬ μ‹œλ¦¬μ¦ˆλ₯Ό ν‘œμ‹œν•  수 있음
    # 각 μ‹œλ¦¬μ¦ˆμ— λ ˆμ΄λΈ”μ„ ν• λ‹Ήν–ˆμœΌλ―€λ‘œ λ²”λ‘€κ°€ μžλ™μœΌλ‘œ 생성됨
    plt.plot(xs, variance, 'g-', label='variance')  # 녹색 μ‹€μ„ 
    plt.plot(xs, bias_squared, 'r-.', label='bias^2')  # 빨간색 점선
    plt.plot(xs, total_error, 'b:', label='total error')  # νŒŒλž€μƒ‰ 점선

    # λ²”λ‘€ μœ„μΉ˜ μ„€μ •: loc=5λŠ” "였λ₯Έμͺ½ 상단"
    plt.legend(loc=5)
    plt.xlabel("model complexity")  # xμΆ• λ ˆμ΄λΈ” μ„€μ •
    plt.title("The Bias-Variance Tradeoff")  # 차트 제λͺ© μ„€μ •
    plt.show()  # μƒμ„±ν•œ 차트λ₯Ό 화면에 ν‘œμ‹œ

# ν•¨μˆ˜ 호좜
make_chart_several_line_charts()


Scatter plots

  • 두 쌍의 λ°μ΄ν„° 집합 μ‚¬μ΄μ˜ 관계λ₯Ό μ‹œκ°ν™”ν•˜κΈ° μœ„ν•˜μ—¬ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.
plt.scatter(['z','b','a'],[10,20,5])
plt.show()

plt.scatter(['z','b','a'],['a','aaa', 'aaaadfas'])
# plt.axis()
plt.show()

 

def make_chart_scatter_plot():
    # 친ꡬ 수
    friends = [70, 65, 72, 63, 71, 64, 60, 64, 67]
    # μ‚¬μ΄νŠΈμ—μ„œ λ³΄λ‚΄λŠ” 일일 μ‹œκ°„
    minutes = [175, 170, 205, 120, 220, 130, 105, 145, 190]
    # 각 점에 λŒ€ν•œ λ ˆμ΄λΈ”
    labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

    # 산점도 생성
    plt.scatter(friends, minutes)

    # 각 점에 λ ˆμ΄λΈ” μΆ”κ°€
    for label, friend_count, minute_count in zip(labels, friends, minutes):
        plt.annotate(label,
                     xy=(friend_count, minute_count),  # 점과 λ ˆμ΄λΈ”μ„ λ™μ‹œμ— ν‘œμ‹œ
                     xytext=(5, -5),  # μ•½κ°„μ˜ μ˜€ν”„μ…‹ μ„€μ •
                     textcoords='offset points')

    # 차트 제λͺ© μ„€μ •
    plt.title("Daily Minutes vs. Number of Friends")
    # xμΆ• λ ˆμ΄λΈ” μ„€μ •
    plt.xlabel("# of friends")
    # yμΆ• λ ˆμ΄λΈ” μ„€μ •
    plt.ylabel("daily minutes spent on the site")
    # μƒμ„±ν•œ 차트λ₯Ό 화면에 ν‘œμ‹œ
    plt.show()

# ν•¨μˆ˜ 호좜
make_chart_scatter_plot()

 

λ§Œμ•½ μœ μ‚¬ν•œ λ³€μˆ˜λ₯Ό μ‚°ν¬ν•˜λŠ” 경우 matplotlibμ—μ„œ 척도λ₯Ό μ„ νƒν•˜λ„λ‘ ν•˜λ©΄ μ˜€ν•΄μ˜ μ†Œμ§€κ°€ μžˆλŠ” 그림이 λ‚˜νƒ€λ‚  수 μžˆμŠ΅λ‹ˆλ‹€
def make_chart_scatterplot_axes(equal_axes=False):
    # μ‹œν—˜ 1 점수
    test_1_grades = [99, 90, 85, 97, 80]
    # μ‹œν—˜ 2 점수
    test_2_grades = [100, 85, 60, 90, 70]

    # 산점도 생성
    plt.scatter(test_1_grades, test_2_grades)
    # xμΆ• λ ˆμ΄λΈ” μ„€μ •
    plt.xlabel("test 1 grade")
    # yμΆ• λ ˆμ΄λΈ” μ„€μ •
    plt.ylabel("test 2 grade")

    if equal_axes:
        # μΆ•μ˜ 척도λ₯Ό λ™μΌν•˜κ²Œ μ„€μ •ν•˜μ—¬ 차트λ₯Ό 생성
        plt.title("Axes Are Comparable")
        plt.axis("equal")
    else:
        # 기본적인 μΆ• μ„€μ •μœΌλ‘œ 차트 생성
        plt.title("Axes Aren't Comparable")

    # μƒμ„±ν•œ 차트λ₯Ό 화면에 ν‘œμ‹œ
    plt.show()
make_chart_scatterplot_axes()

make_chart_scatterplot_axes(equal_axes=True)


Pie Charts

숫자 λΉ„μœ¨μ„ μ„€λͺ…ν•˜κΈ° μœ„ν•΄ 슬라이슀둜 λ‚˜λˆˆ 원 ν˜•νƒœμ˜ 차트 μž…λ‹ˆλ‹€.
def make_chart_pie_chart():
    # 파이 차트 생성: 각 λ²”μ£Όμ˜ λΉ„μœ¨μ„ λ‚˜νƒ€λƒ„
    plt.pie([0.95, 0.05], labels=["Uses pie charts", "Knows better"])
    
    # νŒŒμ΄κ°€ μ›ν˜•μœΌλ‘œ ν‘œμ‹œλ˜λ„λ‘ μ„€μ •
    plt.axis("equal")
    # μƒμ„±ν•œ 차트λ₯Ό 화면에 ν‘œμ‹œ
    plt.show()

# ν•¨μˆ˜ 호좜
make_chart_pie_chart()


Data scientists move to bokeh

BokehλŠ” D3 μŠ€νƒ€μΌ(λŒ€ν™”ν˜•)의 μ‹œκ°ν™”λ₯Ό Python에 λ„μž…ν•œ μƒˆλ‘œμš΄ 라이브러리 μž…λ‹ˆλ‹€.
 

Movies

 

demo.bokeh.org

# Bokeh Libraries
from bokeh.io import output_notebook
from bokeh.plotting import figure, show
import random

# 데이터
friends = [70, 65, 72, 63, 71, 64, 60, 64, 67]
minutes = [175, 170, 205, 120, 220, 130, 105, 145, 190]

# 주석 처리된 뢀뢄은 데이터λ₯Ό μ‘°μž‘ν•˜μ—¬ 좔가적인 λ…Έμ΄μ¦ˆλ₯Ό λ§Œλ“œλŠ” λΆ€λΆ„μž…λ‹ˆλ‹€.
# 이 μ½”λ“œλŠ” ν˜„μž¬ 주석 μ²˜λ¦¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
# friends = [i + 3 * random.random() for i in friends for _ in range(100)]
# minutes = [i + 50 * random.random() for i in minutes for _ in range(100)]

# Jupyter Notebookμ—μ„œ Bokeh 좜λ ₯을 μ‚¬μš©ν•©λ‹ˆλ‹€.
output_notebook()

# μ‚¬μš©ν•  도ꡬ듀
TOOLS="hover,crosshair,pan,wheel_zoom,zoom_in,zoom_out,box_zoom,undo,redo,reset,tap,save,box_select,poly_select,lasso_select,"

# 일반적인 figure() 객체 μ„€μ •
fig = figure(tools=TOOLS)

# 산점도 생성
fig.scatter(friends, minutes)

# μƒμ„±ν•œ κ·Έλž˜ν”„ 보기
show(fig)


Complete Example

import matplotlib.pyplot as plt
import numpy as np

# κ·Έλž˜ν”„ 크기 μ„€μ •
plt.figure(figsize=(10,5))

# ν•™κ³Ό 이름과 μ§€μ›μž 수, μž…ν•™μž 수 데이터
dept_names = ['ME', 'EE', 'CS', 'CE', 'IE']
num_apps = [100, 123, 212, 50, 55]
num_adms = [50, 60, 60, 30, 30]

# μ§€μ›μž 수 λ§‰λŒ€ κ·Έλž˜ν”„ 생성
plt.bar(np.array(range(len(dept_names))) - 0.2, num_apps, width=0.5, label='# applied')
# μž…ν•™μž 수 λ§‰λŒ€ κ·Έλž˜ν”„ 생성
plt.bar(range(len(dept_names)), num_adms, color='g', width=0.5, label='# admitted')

# x좕에 ν•™κ³Ό 이름 ν‘œμ‹œ
plt.xticks(range(len(dept_names)), dept_names)
# yμΆ• 눈금 μ„€μ •
plt.yticks(range(0, 250, 50))
# λ²”λ‘€ μœ„μΉ˜ μ„€μ •
plt.legend(loc=1)
# 차트 제λͺ© μ„€μ •
plt.title('comparing # of dept applicants')
# xμΆ• λ ˆμ΄λΈ” μ„€μ •
plt.xlabel("departments")
# yμΆ• λ ˆμ΄λΈ” μ„€μ •
plt.ylabel("# applied vs # admitted")

# μ°¨νŠΈμ— 주석 μΆ”κ°€ (CS ν•™κ³Όμ˜ 경쟁λ₯ )
plt.annotate('CS competition rate = {:.2}'.format(num_adms[2]/num_apps[2]), xy=(-0.1, 180))

# μƒμ„±ν•œ 차트λ₯Ό 화면에 ν‘œμ‹œ
plt.show()

# 2x2 μ„œλΈŒν”Œλ‘―μ„ κ°€μ§€λŠ” κ·Έλ¦Ό 생성
fig, ax = plt.subplots(2, 2)

# 첫 번째 μ„œλΈŒν”Œλ‘―μ— μ„  κ·Έλž˜ν”„ μΆ”κ°€
ax[0, 0].plot([1, 2], [3, 3])

# κ²°κ³Ό ν‘œμ‹œ
plt.show()