λ°μν
λ°μ΄ν° μκ°νλ₯Ό μν λ κ°μ§ μ£Όμ μ©λ
λ°μ΄ν°λ₯Ό νμνλ €λ©΄? λ κ°μ§ μ£Όμ μ©λμ λ°νμ¬ μμμΌ ν©λλ€.
νμμ λ°μ΄ν° λΆμ (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()
- years 리μ€νΈμλ μ°λ λ°μ΄ν°λ₯Ό, gdp 리μ€νΈμλ ν΄λΉ μ°λμ GDP λ°μ΄ν°λ₯Ό μ μ₯ν©λλ€.
- plt.plot() ν¨μλ₯Ό μ¬μ©νμ¬ λΌμΈ μ°¨νΈλ₯Ό μμ±ν©λλ€. xμΆμλ μ°λ (years)λ₯Ό, yμΆμλ GDP (gdp)λ₯Ό λνλ λλ€. λΌμΈμ μκΉμ λ ΉμμΌλ‘ μ§μ λμκ³ , λ§μ»€λ 'o' (μν)λ‘, μ μ€νμΌμ 'solid'λ‘ μ€μ λμμ΅λλ€.
- plt.title() ν¨μλ₯Ό μ¬μ©νμ¬ μ°¨νΈμ μ λͺ©μ μΆκ°ν©λλ€. μ λͺ©μ "Nominal GDP"λ‘ μ§μ λμμ΅λλ€.
- plt.ylabel() ν¨μλ₯Ό μ¬μ©νμ¬ yμΆμ λ μ΄λΈμ μΆκ°ν©λλ€. μ¬κΈ°μλ "Billions of $"λ‘ μ€μ λμμ΅λλ€.
- 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μ λμ ν μλ‘μ΄ λΌμ΄λΈλ¬λ¦¬ μ λλ€.
# 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()
λ°μν
'π Data Mining' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Data Mining] Linear Algebra (μ νλμ) (0) | 2024.07.09 |
---|---|
[Data Mining] Introduction to Numpy part.2 (0) | 2024.07.05 |
[Data Mining] Introduction to Numpy part.1 (0) | 2024.06.26 |
[Data Mining] Crash_Course in Python Part.2 (0) | 2024.06.25 |
[Data Mining] Crash_Course in Python Part.1 (0) | 2024.06.25 |