λ°μν
Describing a Single Set of Data (λ¨μΌ λ°μ΄ν° μΈνΈ)
λ¨μΌ λ°μ΄ν° μΈνΈ(describing a single set of data)λ νλμ λ°μ΄ν° μΈνΈμ λν νΉμ±μ΄λ νΉμ§μ μ€λͺ νκ³ λΆμνλ κ³Όμ μ μλ―Έν©λλ€.
- μ΄λ₯Ό ν΅ν΄ λ°μ΄ν°μ μ€μ¬ κ²½ν₯, λΆμ°, νν λ° λΆν¬ λ±μ νμ ν μ μμ΅λλ€.
- μλ₯Ό λ€μ΄λ³΄λ©΄, λͺ¨κΈ νλ λ¨μ²΄μ λΆμ¬μ₯μ΄ νμλ€μ΄ μΉκ΅¬λ₯Ό μΌλ§λ κ°μ§κ³ μλμ§μ λν μ€λͺ μ μμ²νμ΅λλ€.
from collections import Counter
from linear_algebra import sum_of_squares, dot
import math
from operator import add
num_friends = [100,49,41,40,25,21,21,19,19,18,18,16,15,15,15,15,14,14,13,13,13,13,12,12,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,8,8,8,8,8,8,8,8,8,8,8,8,8,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
t = Counter(num_friends)
def make_friend_counts_histogram(plt):
# Counter κ°μ²΄λ₯Ό μ¬μ©νμ¬ κ° μΉκ΅¬ μμ λΉλλ₯Ό κ³μ°ν©λλ€.
friend_counts = Counter(num_friends)
# x μΆμ 0λΆν° 100κΉμ§μ μ μλ‘ μ€μ ν©λλ€.
xs = range(101)
# μΉκ΅¬ μμ λν λΉλλ₯Ό κ°μ Έμμ ys 리μ€νΈμ μ μ₯ν©λλ€.
ys = [friend_counts[x] for x in xs]
# λ§λ κ·Έλνλ₯Ό 그립λλ€.
plt.bar(xs, ys)
# x μΆκ³Ό y μΆμ λ²μλ₯Ό μ€μ ν©λλ€.
plt.axis([0, 101, 0, 25])
# κ·Έλνμ μ λͺ©μ μ€μ ν©λλ€.
plt.title("Histogram of Friend Counts")
# x μΆμ λ μ΄λΈμ μ€μ ν©λλ€.
plt.xlabel("# of friends")
# y μΆμ λ μ΄λΈμ μ€μ ν©λλ€.
plt.ylabel("# of people")
# κ·Έλνλ₯Ό νλ©΄μ νμν©λλ€.
plt.show()
import matplotlib.pyplot as plt
make_friend_counts_histogram(plt)
- μμ μ½λλ₯Ό μ€ννλ©΄ μλ κ²°κ³Όμ κ·Έλνκ° λμ΅λλ€.
- μμ½κ²λ, μ΄μ°¨νΈλ κ²°κ³Όμ λ°μ΄ν°λ₯Ό ꡬ체μ μΌλ‘ 보μ¬μ€λ€κ³ νκΈ°μ μ΄λ ΅μ΅λλ€.
- κ·Έλμ λͺκ°μ§ ν΅κ³κ°μ νλ² λ§λ€μ΄ λ³΄κ² μ΅λλ€.
- μ μΌ λ¨Όμ λ§λ€μ΄ 보λ ν΅κ³κ°μ κ°λ¨ν λ°μ΄ν° ν¬μΈνΈμ μμ λλ€.
Min, Max, Smallest, Largest
λ°μ΄ν° ν¬μΈνΈμ μλ₯Ό κ³μ°νκ³ , μ΅λκ° & μ΅μκ°μ μ°ΎμΌλ©°, μ λ ¬λ κ°μμ λ λ²μ§Έλ‘ μμ κ°κ³Ό λ λ²μ§Έλ‘ ν° κ°μ μ°Ύλ λ±μ ν΅κ³λ₯Ό μμ±ν©λλ€. μ΄λ₯Ό μΆλ ₯νμ¬ νμΈν μ μμ΅λλ€.
num_points = len(num_friends) # 204
largest_value = max(num_friends) # 100
smallest_value = min(num_friends) # 1
sorted_values = sorted(num_friends)
smallest_value = sorted_values[0] # 1
second_smallest_value = sorted_values[1] # 1
second_largest_value = sorted_values[-2] # 49
print("num_points", len(num_friends))
print("largest value", max(num_friends))
print("smallest value", min(num_friends))
print("second_smallest_value", sorted_values[1])
print("second_largest_value", sorted_values[-2])
num_points 204
largest value 100
smallest value 1
second_smallest_value 1
second_largest_value 49
Numpy Version
import numpy as np
num_friends = np.array(num_friends)
num_points = num_friends.shape[0] # 204
largest_value = np.max(num_friends) # 100
smallest_value = np.min(num_friends) # 1
sorted_values = np.sort(num_friends)
smallest_value = sorted_values[0] # 1
second_smallest_value = sorted_values[1] # 1
second_largest_value = sorted_values[-2] # 49
print("num_points", len(num_friends))
print("largest value", max(num_friends))
print("smallest value", min(num_friends))
print("second_smallest_value", sorted_values[1])
print("second_largest_value", sorted_values[-2])
num_friends = list(num_friends)
num_points 204
largest value 100
smallest value 1
second_smallest_value 1
second_largest_value 49
- NumPyλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό λ°°μ΄λ‘ λ³ννκ³ , λ°°μ΄μ ννλ₯Ό νμΈνλ©°, μ΅λκ°κ³Ό μ΅μκ°μ κ³μ°νκ³ , λ°°μ΄μ μ λ ¬νμ¬ κ·Έ μ€ μμ κ°κ³Ό ν° κ° λ±μ μ°Ύμ΅λλ€. κ·Έλ¦¬κ³ μΆλ ₯νμ¬ νμΈ ν. λ§μ§λ§μΌλ‘, λ°°μ΄μ λ€μ 리μ€νΈλ‘ λ³νν©λλ€.
μ€μ¬ κ²½ν₯μ±(Central Tendencies)
μ€μ¬ κ²½ν₯μ±(Central Tendencies)μ λ°μ΄ν° μΈνΈμμ λ°μ΄ν° κ°λ€μ΄ λͺ¨μ¬ μλ κ²½ν₯μ λνλ΄λ μΈ‘μ μΉμ λλ€.
μ΄λ λ°μ΄ν°λ₯Ό λννλ κ°μ μ 곡νμ¬ λ°μ΄ν°μ μ€μ¬μ μ΄ν΄νλ λ° λμμ μ€λλ€.
- μ€μ¬ κ²½ν₯μ±μ λνλ΄λ μ£Όμ ν΅κ³λμλ νκ· (mean), μ€μκ°(median), μ΅λΉκ°(mode)μ΄ μμ΅λλ€.
- medianμ λ°μ΄ν°μ λͺ¨λ κ°μ μμ‘΄νμ§ μμ΅λλ€.
- μλ₯Ό λ€μ΄, κ°μ₯ ν° μ μλ₯Ό λ ν¬κ² λ§λ€κ±°λ (λλ κ°μ₯ μμ μ μλ₯Ό λ μκ² λ§λ€λ©΄), μ€κ° μ μλ λ³κ²½λμ§ μμ΅λλ€.
- meanμ λ°μ΄ν°μ μ΄μμΉμ λ§€μ° λ―Όκ°ν©λλ€.
- μλ₯Ό λ€μ΄, μ°λ¦¬ μΉκ΅¬κ° 100λͺ μ΄ μλ 200λͺ μ μΉκ΅¬λ₯Ό κ°μ‘λ€λ©΄, meanμ 7.82λ‘ μμΉνμ§λ§, medianμ κ·Έλλ‘ μ μ§λ©λλ€.
- μλ₯Ό λ€μ΄, 1980λ λ μ€λ°μ λ Έμ€μΊλ‘€λΌμ΄λ λνμμ κ°μ₯ λμ νκ· μ΄λ΄μ κ°μ§ μ 곡μ μ§λ¦¬νμ΄μλ€κ³ μμ£Ό μΈκΈλ©λλ€. μ΄λ μ£Όλ‘ NBA μ€νμ΄μ μ΄μμΉμΈ λ§μ΄ν΄ μ‘°λ λλ¬Έμ΄μμ΅λλ€.
- medianμ μΌλ°νλ ννλ quantileλ‘, νΉμ λ°±λΆμμμ λ°μ΄ν°κ° κ·Έ κ°λ³΄λ€ μλ€λ κ²μ λνλ λλ€. (medianμ λ°μ΄ν°μ 50%κ° κ·Έ κ°λ³΄λ€ μλ€λ κ²μ λνλ λλ€.)
- mode: κ°μ₯ νν κ°μ λνλ λλ€.
λ§μ½, μ€μ¬κ²½ν₯μ± → Outlier(κ²°μΈ‘μΉ)μ μμΌλ©΄ λκ° λ―Όκ°νκ² λ°μν κΉμ? (Mean: νκ· κ°μ΄ κ°νκ² λ°μν©λλ€)
mean(νκ· ), median(μ€κ°), quantile(μ μΌ μμκ° ~ μ μΌ ν°κ°), mode(μ΅λΉκ°)
λ°μ΄ν° μ§ν©μ λν νκ· (mean), μ€μκ°(median), λ°±λΆμμ(quantile), μ΅λΉκ°(mode)μ κ³μ°νλ ν¨μλ€μ μ μν©λλ€.
κ° ν¨μλ μ£Όμ΄μ§ 리μ€νΈμ ν΅κ³μ νΉμ±μ κ³μ°νμ¬ λ°νν©λλ€.
def mean(x):
# 리μ€νΈ xμ νκ· μ κ³μ°νμ¬ λ°νν©λλ€.
return sum(x) / len(x)
def median(v):
"""vμ 'μ€μκ°'μ μ°Ύμ΅λλ€."""
n = len(v)
sorted_v = sorted(v) # vλ₯Ό μ λ ¬ν©λλ€.
midpoint = n // 2 # μ€μ μ§μ μ κ³μ°ν©λλ€.
if n % 2 == 1:
# λ§μ½ 리μ€νΈμ κΈΈμ΄κ° νμλΌλ©΄, μ€μμ κ°μ λ°νν©λλ€.
return sorted_v[midpoint]
else:
# μ§μλΌλ©΄, μ€μμ μμΉν λ κ°μ νκ· μ λ°νν©λλ€.
lo = midpoint - 1
hi = midpoint
return (sorted_v[lo] + sorted_v[hi]) / 2
def quantile(x, p):
"""xμ pλ²μ§Έ λ°±λΆμμ κ°μ λ°νν©λλ€."""
p_index = int(p * len(x)) # λ°±λΆμμμ ν΄λΉνλ μΈλ±μ€λ₯Ό κ³μ°ν©λλ€.
return sorted(x)[p_index] # xλ₯Ό μ λ ¬νκ³ , ν΄λΉ μΈλ±μ€μ κ°μ λ°νν©λλ€.
def mode(x):
"""리μ€νΈμμ κ°μ₯ λ§μ΄ λνλλ κ°μ λ°νν©λλ€. μ¬λ¬ κ°μΌ κ²½μ° λ¦¬μ€νΈλ‘ λ°νλ©λλ€."""
from collections import Counter # Counterλ₯Ό μ¬μ©νμ¬ κ° κ°μ λΉλλ₯Ό κ³μ°ν©λλ€.
counts = Counter(x)
max_count = max(counts.values()) # κ°μ₯ λμ λΉλλ₯Ό μ°Ύμ΅λλ€.
return [x_i for x_i, count in counts.items()
if count == max_count] # κ°μ₯ λμ λΉλλ₯Ό κ°μ§ κ°λ€μ 리μ€νΈλ‘ λ°νν©λλ€.
print("mean(num_friends)", mean(num_friends))
print("median(num_friends)", median(num_friends))
print("quantile(num_friends, 0.10)", quantile(num_friends, 0.10))
print("quantile(num_friends, 0.25)", quantile(num_friends, 0.25))
print("quantile(num_friends, 0.75)", quantile(num_friends, 0.75))
print("quantile(num_friends, 0.90)", quantile(num_friends, 0.90))
print("mode(num_friends)", mode(num_friends))
mean(num_friends) 7.333333333333333
median(num_friends) 6.0
quantile(num_friends, 0.10) 1
quantile(num_friends, 0.25) 3
quantile(num_friends, 0.75) 9
quantile(num_friends, 0.90) 13
mode(num_friends) [6, 1]
num_friends 리μ€νΈμ λͺ¨λ μμλ₯Ό 볡μ¬νμ¬ num_friends_2λΌλ μλ‘μ΄ λ¦¬μ€νΈμ ν λΉν©λλ€.
[:]λ 리μ€νΈμ μμλΆν° λκΉμ§ λͺ¨λ μμλ₯Ό μ ννλ μ¬λΌμ΄μ±(slicing) μ°μ°μμ λλ€.
- λ°λΌμ, μ΄λ num_friends 리μ€νΈμ κΉμ 볡μ¬(deep copy)λ₯Ό μμ±νλ λ°©λ² μ€ νλμ λλ€.
num_friends_2 = num_friends[:] #
mean(num_friends_2) # νκ·
# Result: 7.333333333333333
median(num_friends_2) # μ€κ°κ°
# Result: 6.0
num_friends_2[0] = 200
75900 * 1300 // 10000 # 75900 x 1300ν λλκΈ° 10000
# Result: 9867
- num_friends_2[0] = 200 μ΄ μ½λλ num_friends_2 리μ€νΈμ 첫 λ²μ§Έ μμ(μΈλ±μ€ 0μ μμΉν μμ)μ κ°μ 200μΌλ‘ λ³κ²½ν©λλ€.
- λ§μ½ num_friends_2 리μ€νΈκ° [10, 20, 30, 40]μ κ°μ΄ μ μλμλ€λ©΄, μ΄ μ½λλ₯Ό μ€νν ν num_friends_2μ λ΄μ©μ [200, 20, 30, 40]μΌλ‘ λ³κ²½λ©λλ€.
- μ΄λ 리μ€νΈ λ΄ νΉμ μμΉμ μλ κ°μ μλ‘μ΄ κ°μΌλ‘ μ λ°μ΄νΈνκ³ μΆμ λ μ¬μ©νλ λ°©λ²μ λλ€.
Numpy Version
Numpy λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ num_friends λ°μ΄ν°μ μ λν κΈ°μ΄ ν΅κ³λ₯Ό κ³μ°νλ μ½λμ λλ€.
- np.quantile ν¨μλ Numpy λ²μ 1.16λΆν° μ¬μ© κ°λ₯ν©λλ€.
- np.percentile ν¨μλ λΉμ¨ λμ νΌμΌνΈλ₯Ό μ¬μ©ν©λλ€.
import numpy as np
# λ°μ΄ν°μ
μ νκ· μ κ³μ°ν©λλ€.
print("mean(num_friends)", np.mean(num_friends))
# λ°μ΄ν°μ
μ μ€μκ°μ κ³μ°ν©λλ€. λ°μ΄ν°κ° νμλΌλ©΄ μ€μμ κ°, μ§μλΌλ©΄ μ€μμ μλ λ κ°μ νκ· μ λ°νν©λλ€.
print("median(num_friends)", np.median(num_friends))
# λ°μ΄ν°μ
μ 10%μ ν΄λΉνλ λΆμμλ₯Ό κ³μ°ν©λλ€. μ¦, λ°μ΄ν°λ₯Ό μ€λ¦μ°¨μμΌλ‘ μ λ ¬νμ λ νμ 10%λ₯Ό μ°¨μ§νλ κ°μ
λλ€.
print("quantile(num_friends, 0.10)", np.percentile(num_friends, 10))
# λ°μ΄ν°μ
μ 25%μ ν΄λΉνλ λΆμμλ₯Ό κ³μ°ν©λλ€. μ΄λ₯Ό 1μ¬λΆμμ λλ νμ 25% κ²½κ³κ°μ΄λΌκ³ ν©λλ€.
print("quantile(num_friends, 0.25)", np.percentile(num_friends, 25))
# λ°μ΄ν°μ
μ 75%μ ν΄λΉνλ λΆμμλ₯Ό κ³μ°ν©λλ€. μ΄λ₯Ό 3μ¬λΆμμ λλ μμ 25% κ²½κ³κ°μ΄λΌκ³ ν©λλ€.
print("quantile(num_friends, 0.75)", np.percentile(num_friends, 75))
# λ°μ΄ν°μ
μ 90%μ ν΄λΉνλ λΆμμλ₯Ό κ³μ°ν©λλ€. μ¦, λ°μ΄ν°λ₯Ό μ€λ¦μ°¨μμΌλ‘ μ λ ¬νμ λ νμ 90%λ₯Ό μ°¨μ§νλ κ°μ
λλ€.
print("quantile(num_friends, 0.90)", np.percentile(num_friends, 90))
mean(num_friends) 7.333333333333333
median(num_friends) 6.0
quantile(num_friends, 0.10) 1.0
quantile(num_friends, 0.25) 3.0
quantile(num_friends, 0.75) 9.0
quantile(num_friends, 0.90) 13.0
import numpy as np
np.percentile(np.array([0,1,2,3,4,5,100]), [75, 50, 25])
# Result: array([4.5, 3. , 1.5])
- Numpyμ np.percentile ν¨μλ₯Ό μ¬μ©νμ¬ μ£Όμ΄μ§ λ°°μ΄ [0, 1, 2, 3, 4, 5, 100]μ 75λ²μ§Έ, 50λ²μ§Έ(μ€μκ°), κ·Έλ¦¬κ³ 25λ²μ§Έ λ°±λΆμμλ₯Ό κ³μ°ν©λλ€.
- μ΄ ν¨μλ λ°μ΄ν°λ₯Ό μ λ ¬ν ν μ§μ λ λ°±λΆμμμ ν΄λΉνλ λ°μ΄ν° ν¬μΈνΈ κ°μ λ°νν©λλ€.
import numpy as np
from scipy import stats
array = np.array([1, 2, 2, 3, 4, 4, 5])
# stats.mode ν¨μλ₯Ό μ¬μ©νμ¬ λ°°μ΄μ μ΅λΉκ°(mode)μ κ³μ°ν©λλ€.
# μ΄ ν¨μλ μ΅λΉκ°κ³Ό κ·Έ λΉλλ₯Ό λͺ¨λ λ°νν©λλ€.
mode = stats.mode(array)
# μ΅λΉκ°λ§ μΆλ ₯ν©λλ€. mode[0]μ μ΅λΉκ°μ, mode[1]μ ν΄λΉ μ΅λΉκ°μ λΉλλ₯Ό λνλ
λλ€.
# μ¬κΈ°μλ μ΅λΉκ°λ§ νμνκΈ° λλ¬Έμ mode[0]λ§μ μΆλ ₯ν©λλ€.
print(mode[0])
# Result: [2]
- [1, 2, 2, 3, 4, 4, 5] λ°°μ΄μμ κ°μ₯ μμ£Ό λνλλ κ°μ μ°Ύκ³ κ·Έ κ°μ μΆλ ₯ν©λλ€.
- stats.mode ν¨μλ μ΅λΉκ°κ³Ό ν΄λΉ μ΅λΉκ°μ λΉλλ₯Ό λ°ννλλ°, μ¬κΈ°μλ μ΅λΉκ°μΈ 2λ§μ μΆλ ₯ν©λλ€.
- λ§μ½ λ°°μ΄μμ μ¬λ¬ κ°μ μ΅λΉκ°μ΄ λμΌν λΉλλ‘ λνλλ€λ©΄, stats.mode ν¨μλ κ°μ₯ μμ κ°μ μ΅λΉκ°μΌλ‘ λ°νν©λλ€.
import numpy as np
# λ°°μ΄μ μμ±ν©λλ€.
array = np.array([1,2,2,3,4,4,5])
# np.uniqueλ₯Ό μ¬μ©νμ¬ λ°°μ΄ λ΄μ κ³ μ ν κ°λ€(vals)κ³Ό κ° κ°μ λ±μ₯ νμ(counts)λ₯Ό λ°νλ°μ΅λλ€.
vals, counts = np.unique(array, return_counts=True)
# counts λ°°μ΄μμ κ°μ₯ ν° κ°μ μ°Ύμ΅λλ€. μ΄ κ°μ λ°°μ΄ λ΄μμ κ°μ₯ λ§μ΄ λ±μ₯νλ μμμ λ±μ₯ νμμ
λλ€.
max_val = np.max(counts)
# counts == max_valμ counts λ°°μ΄μμ max_valκ³Ό κ°μ κ°μ κ°μ§λ μμμ μμΉλ₯Ό λΆλ¦¬μΈ λ°°μ΄λ‘ λ°νν©λλ€.
# μ΄ λΆλ¦¬μΈ λ°°μ΄μ μ΄μ©νμ¬ vals λ°°μ΄μμ 쑰건μ λ§μ‘±νλ μμλ€λ§μ μ νν©λλ€.
# κ²°κ³Όμ μΌλ‘, κ°μ₯ λ§μ΄ λ±μ₯νλ μμλ€μ΄ λ°νλ©λλ€. λ§μ½ μ΅λΉκ°μ΄ μ¬λ¬ κ°λΌλ©΄, κ·Έ λͺ¨λ κ°μ λ°νν©λλ€.
mode_vals = vals[counts == max_val]
# μ΅λΉκ°(λ€)μ μΆλ ₯ν©λλ€.
print(mode_vals)
# Result: array([2, 4])
- λ°°μ΄ [1,2,2,3,4,4,5]μμ 2μ 4κ° κ°κ° λ λ²μ© λ±μ₯νμ¬ κ°μ₯ λ§μ΄ λ±μ₯νλ κ°μμ νμΈνκ³ , λ κ°μ λͺ¨λ λ°νν©λλ€.
- μ΄ λ°©λ²μ μ¬λ¬ μ΅λΉκ°μ μ°Ύμ λ μ μ©νλ©°, SciPy λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ§ μκ³ μμ Numpyλ‘λ§ κ΅¬ννμ΅λλ€.
Dispersion(λΆμ°)
λΆμ°(Dispersion)μ λ°μ΄ν° κ°λ€μ΄ νκ· μ΄λ μ€μκ°κ³Ό μΌλ§λ λ¨μ΄μ Έ μλμ§λ₯Ό λνλ΄λ μΈ‘μ μΉμ λλ€.
- λΆμ°μ λ°μ΄ν°μ λ³λμ±μ μ΄ν΄νλ λ° μ€μνλ©°, λ°μ΄ν°λ₯Ό μμ½νκ³ λΉκ΅ν λ μ€μ¬ κ²½ν₯μ± μΈμλ μ€μν μ 보λ₯Ό μ 곡ν©λλ€.
- μ£Όμν λΆμ° μΈ‘μ μΉλ‘λ λ²μ(Range), λΆμ°(Variance), νμ€νΈμ°¨(Standard Deviation), μ¬λΆμμ λ²μ(Interquartile Range, IQR) λ±μ΄ μμ΅λλ€.
- Dispersion(λΆμ°)μ λ°μ΄ν°κ° μΌλ§λ νΌμ Έ μλμ§ μΈ‘μ νλ κ²μ λ§ν©λλ€.
- Range(λ²μ)λ κ°μ₯ ν° μμμ κ°μ₯ μμ μμμ μ°¨μ΄μΌ λΏμ λλ€ → μ΅μ, μ΅λκ°μ μ°¨μ΄
- Variance, Standard deviation(νμ€νΈμ°¨)
- Range(λ²μ)μ Standard deviation(νμ€νΈμ°¨) λͺ¨λ Outlier λ¬Έμ κ° λμΌν©λλ€
- μ¬λΆμμ_λ²μ(Interquartile_range): 75λ²μ§Έ λ°±λΆμμ κ°κ³Ό 25λ²μ§Έ λ°±λΆμμ κ°μ μ°¨μ΄λ₯Ό μλ―Έν©λλ€.
# "range"λΌλ μ΄λ¦μ Pythonμμ μ΄λ―Έ λ€λ₯Έ μλ―Έλ‘ μ¬μ©λλ―λ‘ λ€λ₯Έ μ΄λ¦μ μ¬μ©ν©λλ€.
def data_range(x):
# λ°μ΄ν° μ§ν© xμ μ΅λκ°κ³Ό μ΅μκ°μ μ°¨μ΄λ₯Ό λ°νν©λλ€.
return max(x) - min(x)
def de_mean(x):
# λ°μ΄ν° μ§ν© xμ κ° μμμμ xμ νκ· μ λΊ κ°μ λ°νν©λλ€.
# κ·Έ κ²°κ³Όλ‘ λ°νλ λ°μ΄ν° μ§ν©μ νκ· μ 0μ΄ λ©λλ€.
x_bar = sum(x) / len(x)
return [x_i - x_bar for x_i in x]
def variance(x):
# λ°μ΄ν° μ§ν© xμ λΆμ°μ κ³μ°ν©λλ€.
# λΆμ°μ λ°μ΄ν°κ° νκ· μΌλ‘λΆν° μΌλ§λ νΌμ Έ μλμ§λ₯Ό μΈ‘μ ν©λλ€.
n = len(x)
deviations = de_mean(x)
return sum_of_squares(deviations) / (n - 1)
def standard_deviation(x):
# λ°μ΄ν° μ§ν© xμ νμ€νΈμ°¨λ₯Ό κ³μ°ν©λλ€.
return math.sqrt(variance(x))
def interquartile_range(x):
# λ°μ΄ν° μ§ν© xμ μ¬λΆμλ²μ(IQR)λ₯Ό κ³μ°ν©λλ€.
return quantile(x, 0.75) - quantile(x, 0.25)
print("data_range(num_friends)", data_range(num_friends))
print("variance(num_friends)", variance(num_friends))
print("standard_deviation(num_friends)", standard_deviation(num_friends))
print("interquartile_range(num_friends)", interquartile_range(num_friends))
data_range(num_friends) 99
variance(num_friends) 81.54351395730716
standard_deviation(num_friends) 9.03014473623248
interquartile_range(num_friends) 6
Numpy Version
num_friends = np.array(num_friends) # num_friends λ°μ΄ν°λ₯Ό NumPy λ°°μ΄λ‘ λ³ν
# λ°μ΄ν°μ μ΅λκ°κ³Ό μ΅μκ°μ μ°¨μ΄λ₯Ό κ³μ° (ptp - λΆμ°)
print("data_range(num_friends)", np.ptp(num_friends))
# μ§μ μ΅λκ°κ³Ό μ΅μκ°μ μ°¨μ΄λ₯Ό κ³μ°νμ¬ λ°μ΄ν° λ²μλ₯Ό ꡬν¨
print("data_range(num_friends)", np.max(num_friends) - np.min(num_friends))
# λ°μ΄ν°μ λΆμ°μ κ³μ°, ddof=1λ‘ μ€μ νμ¬ νλ³Έ λΆμ°μ κ΅¬ν¨ (var - λΆμ°)
print("variance(num_friends)", np.var(num_friends, ddof=1))
# λ°μ΄ν°μ νμ€νΈμ°¨λ₯Ό κ³μ°, ddof=1λ‘ μ€μ νμ¬ νλ³Έ νμ€νΈμ°¨λ₯Ό ꡬν¨
print("standard_deviation(num_friends)", np.std(num_friends, ddof=1))
# λ°μ΄ν°μ 75λ²μ§Έ λ°±λΆμμμ 25λ²μ§Έ λ°±λΆμμλ₯Ό κ³μ°
q75, q25 = np.percentile(num_friends, [75, 25])
# λ°±λΆμμ λ²μ, μ¦ IQRμ κ³μ°
print("interquartile_range(num_friends)", q75 - q25)
# NumPy λ°°μ΄μ λ€μ 리μ€νΈλ‘ λ³ν
num_friends = list(num_friends)
data_range(num_friends) 99
data_range(num_friends) 99
variance(num_friends) 81.54351395730707
standard_deviation(num_friends) 9.030144736232474
interquartile_range(num_friends) 6.0
Boxplot
Boxplotμ λ°μ΄ν°μ λΆν¬λ₯Ό μκ°μ μΌλ‘ λνλ΄λ λꡬλ‘, λ°μ΄ν°μ μ€μ¬ κ²½ν₯κ³Ό λΆμ°μ λμμ 보μ¬μ€λλ€.
Boxplotμ λ°μ΄ν°μ μ£Όμ ν΅κ³λμΈ μ΅μκ°, 1μ¬λΆμμ(Q1), μ€μκ°(μ€μμ, Median), 3μ¬λΆμμ(Q3), μ΅λκ°μ λνλ΄λ©°, μ΄μμΉ(outliers)λ₯Ό μκ°ννλ λ° μ μ©ν©λλ€.
import numpy as np
p75, p50, p25 = np.percentile(np.array([0,1,2,3,4,5,100]), [75, 50, 25])
p75, p50, p25
(4.5, 3.0, 1.5)
- μ£Όμ΄μ§ λ°°μ΄ [0,1,2,3,4,5,100]μ λν΄ 75λ²μ§Έ λ°±λΆμμ(p75), 50λ²μ§Έ λ°±λΆμμ(μ€μκ°, p50), 25λ²μ§Έ λ°±λΆμμ(p25)λ₯Ό κ³μ°ν©λλ€.
- np.percentile ν¨μλ μ§μ λ λ°±λΆμμμ ν΄λΉνλ κ°μ λ°νν©λλ€.
- μ λ°°μ΄μμ, 25λ²μ§Έ λ°±λΆμμ(p25)λ 1κ³Ό 2 μ¬μ΄μ κ°μ λλ€.50λ²μ§Έ λ°±λΆμμ(p50), μ¦ μ€μκ°μ 3μ λλ€.
- 75λ²μ§Έ λ°±λΆμμ(p75)λ 4μ 5 μ¬μ΄μ κ°μ λλ€.
np.percentile(np.array([0,1,2,3]),90)
# Result: 2.7
- NumPyμ np.percentile ν¨μλ₯Ό μ¬μ©νμ¬ μ£Όμ΄μ§ λ°°μ΄ [0,1,2,3]μ 90λ²μ§Έ λ°±λΆμμλ₯Ό κ³μ°νλ©΄, λ°°μ΄μ λ°μ΄ν° λΆν¬λ₯Ό κ³ λ €νμ¬ ν΄λΉ λ°±λΆμμμ ν΄λΉνλ κ°μ μ ν 보κ°(linear interpolation) λ°©μμΌλ‘ μ°Ύμ΅λλ€.
- μ΄ λ°°μ΄μμ 90λ²μ§Έ λ°±λΆμμλ 2μ 3 μ¬μ΄μ μμΉν©λλ€. ꡬ체μ μΌλ‘, 90%μ ν΄λΉνλ μμΉλ λ°°μ΄μ λμμ λ λ²μ§Έ κ°κ³Ό λ§μ§λ§ κ° μ¬μ΄μ μμΌλ―λ‘, 2μ 3 μ¬μ΄μ κ°μ λλ€.
- μ ν 보κ°μ μ¬μ©νμ¬ κ³μ°νλ©΄, 90λ²μ§Έ λ°±λΆμμλ λλ΅μ μΌλ‘ 2.7μ΄ λ©λλ€. μ΄λ 2μ 3 μ¬μ΄μ 거리(1)μ 90%μ ν΄λΉνλ μμΉλ₯Ό μλ―Έν©λλ€.
In case of normal distribution (μ κ·λΆν¬)
uniform vs peaked vs skewed (κ· μΌ λ μ μ λ λΉλμΉ)
num_friends λ°μ΄ν°μ μ λν λ°μ€ νλ‘―μ μμ±ν©λλ€.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
plt.boxplot(num_friends) # num_friends λ°μ΄ν°μ
μ λν λ°μ€ νλ‘―μ μμ±
plt.show()
λ°μ΄ν°μ μ ν¬ν¨νλ λ°°μ΄μ λ§λ€μ΄ μ΄ λ°°μ΄μ boxplot κ·Έλ¦Όμ μμ±ν©λλ€.
λν κ°μ λ°μ΄ν°μ μ μΈ λ² λ°λ³΅νμ¬ λ°°μ΄λ‘ λ§λ€μμ΅λλ€. λ°λΌμ μΈ κ°μ boxplot κ·Έλ¦Όμ΄ μκΉλλ€.
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
# λ°μ΄ν°μ
μ ν¬ν¨νλ λ°°μ΄μ λ§λ€μ΄ μ΄ λ°°μ΄μ boxplot κ·Έλ¦Όμ μμ±
# κ°μ λ°μ΄ν°μ
μ μΈ λ² λ°λ³΅νμ¬ λ°°μ΄λ‘ λ§λ€μμ΅λλ€. λ°λΌμ μΈ κ°μ boxplot κ·Έλ¦Όμ΄ μκΉ
plt.boxplot([num_friends, num_friends, num_friends])
plt.show()
Seaborn λΌμ΄λΈλ¬λ¦¬μ μ¬μ©νμ¬ λ°μ€νλ‘―μ μμ±ν©λλ€.
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
sns.boxplot(num_friends) # Seabornμ μ¬μ©νμ¬ λ°μ€νλ‘― μμ±
plt.show()
λ°μ΄ν°λ₯Ό 50κ°μ ꡬκ°μΌλ‘ λλμ΄ κ° κ΅¬κ°μ μνλ λ°μ΄ν°μ κ°μλ₯Ό λ§λλ‘ ννν©λλ€.
# bins=50 μΈμλ λ°μ΄ν°λ₯Ό 50κ°μ ꡬκ°μΌλ‘ λλμ΄ κ° κ΅¬κ°μ μνλ λ°μ΄ν°μ κ°μλ₯Ό λ§λλ‘ νν
plt.hist(num_friends, bins=50)
plt.show()
νκ· 0, νμ€νΈμ°¨ 1μ κ°μ§ μ κ· λΆν¬μμ 1000x3 λ°°μ΄μ μμ±ν©λλ€.
μ΄ λ°°μ΄μ 1000κ°μ μνμ κ°κ° κ°μ§ 3κ°μ λ 립μ μΈ λ°μ΄ν° μΈνΈ μ λλ€.
data = np.random.randn(1000,3)
plt.boxplot(data)
plt.show()
λ°μ΄ν°μ λΆν¬λ₯Ό 10κ°μ ꡬκ°μΌλ‘ λλμ΄ κ° κ΅¬κ°μ μνλ μνμ μλ₯Ό λ§λλ‘ ννν νμ€ν κ·Έλ¨μ μμ±ν©λλ€.
μ΄ μ½λμμλ 3κ°μ λ°μ΄ν° μΈνΈμ λν΄ νμ€ν κ·Έλ¨μ΄ μμ±λλ©°, κ°κ°μ λ°μ΄ν° μΈνΈλ λ³λμ λ§λ κ·Έλ£ΉμΌλ‘ νμν©λλ€.
plt.hist(data, bins=10)
plt.show()
- λ§μ½ λͺ¨μ§λ¨μ νκ· (μ)μ μκ³ μλ€λ©΄, νμ€νΈμ°¨(σ)λ λ€μκ³Ό κ°μ΄ κ³μ°λ©λλ€.
- μ¬κΈ°μ xλ κ° λ°μ΄ν° ν¬μΈνΈλ₯Ό λνλ΄λ©°, xΛλ νλ³Έμ νκ· μ΄κ³ , nμ λ°μ΄ν° ν¬μΈνΈμ μμ λλ€.
- μ΄ κ³΅μμ λͺ¨λ λ°μ΄ν° ν¬μΈνΈμ νλ³Έ νκ· κ°μ νΈμ°¨λ₯Ό μ κ³±ν κ°μ λͺ¨λ λν ν, μ΄λ₯Ό λ°μ΄ν° ν¬μΈνΈμ μμμ 1μ λΊ κ°μΌλ‘ λλμ΄ κ΅¬ν©λλ€.
- λͺ¨μ§λ¨μ νκ· μ μμ§ λͺ»νλ κ²½μ°, νλ³Έ νκ· (π₯Λ)μ μ¬μ©νμ¬ νμ€νΈμ°¨(σ)λ₯Ό κ³μ°ν μ μμ΅λλ€.
- μ¬κΈ°μ xλ κ° λ°μ΄ν° ν¬μΈνΈλ₯Ό λνλ΄λ©°, xΛλ νλ³Έμ νκ· μ΄κ³ , nμ λ°μ΄ν° ν¬μΈνΈμ μμ λλ€.
- μ΄ κ³΅μμ λͺ¨λ λ°μ΄ν° ν¬μΈνΈμ νλ³Έ νκ· κ°μ νΈμ°¨λ₯Ό μ κ³±ν κ°μ λͺ¨λ λν ν, μ΄λ₯Ό λ°μ΄ν° ν¬μΈνΈμ μμμ 1μ λΊ κ°μΌλ‘ λλμ΄ κ΅¬ν©λλ€.
import numpy as np
print(np.std([1,2,3])) # λͺ¨μ§λ¨ νμ€νΈμ°¨
print(np.std([1,2,3], ddof=1)) # νλ³Έ νμ€νΈμ°¨, ddof=1μ μ€μ . νλ³Έ νμ€νΈμ°¨λ₯Ό κ³μ°
print(standard_deviation([1,2,3])) # μ΄ μ€μ μ€λ₯λ₯Ό λ°μμν΄
0.816496580927726
1.0
1.0
Correlation (μκ΄κ΄κ³)
μκ΄κ΄κ³(Correlation)λ λ λ³μ κ°μ κ΄κ³λ₯Ό λνλ΄λ ν΅κ³μ μΈ‘μ μΉλ‘, ν λ³μμ λ³νκ° λ€λ₯Έ λ³μμ λ³νμ μ΄λ»κ² κ΄λ ¨λμ΄ μλμ§λ₯Ό 보μ¬μ€λλ€.
- μκ΄κ΄κ³λ -1κ³Ό 1 μ¬μ΄μ κ°μ κ°μ§λ©°, μ΄ κ°μ ν¬κΈ°μ λ°©ν₯μ λ³μ κ°μ κ΄κ³μ κ°λμ λ°©ν₯μ λνλ λλ€.
- μμλ‘ μ€λͺ μ λ€μ΄λ³΄λ©΄ DataSciencesμ μ±μ₯ λ΄λΉ λΆμ¬μ₯μ μ¬λλ€μ΄ μ¬μ΄νΈμμ 보λ΄λ μκ°μ΄ μ¬μ΄νΈμ μλ μΉκ΅¬μ μμ κ΄λ ¨μ΄ μλ€λ μ΄λ‘ μ κ°μ§κ³ μμΌλ©°, κ·Έλ λ μ΄λ₯Ό νμΈν΄ μ€ κ²μ μμ²νμ΅λλ€.
- μ΄ λ μ§ν(metrics) κ°μ κ΄κ³λ₯Ό μ‘°μ¬νκ³ μ ν©λλ€.
- Variance(λΆμ°)μ λ¨μΌ λ³μκ° νκ· μμ λ²μ΄λλ λ°©λ²μ μΈ‘μ νλ λ°λ©΄ covariance(곡λΆμ°)μ λ λ³μκ° νκ· μμ ν¨κ» λ³νλ λ°©λ²μ μΈ‘μ ν©λλ€.
- μ κ·νλμ§ μλ ν "ν°" covariance(곡λΆμ°)μ΄ λ¬΄μμΈμ§ ν΄μνκΈ°κ° μ΄λ ΅μ΅λλ€.
- μκ΄κ΄κ³: covariance(곡λΆμ°)μ λ λ³μμ standard deviations(νμ€ νΈμ°¨)λ‘ λλ κ°μ λλ€.
- correlation(μκ΄ κ΄κ³)λ λ¨μκ° μμΌλ©° νμ -1(perfect anti-correlation - μλ²½ν λ°μκ΄)κ³Ό 1(perfect correlation - μλ²½ν μκ΄) μ¬μ΄μ μμ΅λλ€.
daily_minutes = [1,68.77,51.25,52.08,38.36,44.54,57.13,51.4,41.42,31.22,34.76,54.01,38.79,47.59,49.1,27.66,41.03,36.73,48.65,28.12,46.62,35.57,32.98,35,26.07,23.77,39.73,40.57,31.65,31.21,36.32,20.45,21.93,26.02,27.34,23.49,46.94,30.5,33.8,24.23,21.4,27.94,32.24,40.57,25.07,19.42,22.39,18.42,46.96,23.72,26.41,26.97,36.76,40.32,35.02,29.47,30.2,31,38.11,38.18,36.31,21.03,30.86,36.07,28.66,29.08,37.28,15.28,24.17,22.31,30.17,25.53,19.85,35.37,44.6,17.23,13.47,26.33,35.02,32.09,24.81,19.33,28.77,24.26,31.98,25.73,24.86,16.28,34.51,15.23,39.72,40.8,26.06,35.76,34.76,16.13,44.04,18.03,19.65,32.62,35.59,39.43,14.18,35.24,40.13,41.82,35.45,36.07,43.67,24.61,20.9,21.9,18.79,27.61,27.21,26.61,29.77,20.59,27.53,13.82,33.2,25,33.1,36.65,18.63,14.87,22.2,36.81,25.53,24.62,26.25,18.21,28.08,19.42,29.79,32.8,35.99,28.32,27.79,35.88,29.06,36.28,14.1,36.63,37.49,26.9,18.58,38.48,24.48,18.95,33.55,14.24,29.04,32.51,25.63,22.22,19,32.73,15.16,13.9,27.2,32.01,29.27,33,13.74,20.42,27.32,18.23,35.35,28.48,9.08,24.62,20.12,35.26,19.92,31.02,16.49,12.16,30.7,31.22,34.65,13.13,27.51,33.2,31.57,14.1,33.42,17.44,10.12,24.42,9.82,23.39,30.93,15.03,21.67,31.09,33.29,22.61,26.89,23.48,8.38,27.81,32.35,23.84]
# daily_minutesμ λ€λ₯Έ λ°μ΄ν° μΈνΈ κ°μ 곡λΆμ° λ° μκ΄κ΄κ³ κ³μ°μ μν μ½λ
def covariance(x, y):
n = len(x) # xμ κΈΈμ΄, μ¦ λ°μ΄ν° ν¬μΈνΈμ μ
return dot(de_mean(x), de_mean(y)) / (n - 1) # 곡λΆμ° κ³μ°
def correlation(x, y):
stdev_x = standard_deviation(x) # xμ νμ€νΈμ°¨ κ³μ°
stdev_y = standard_deviation(y) # yμ νμ€νΈμ°¨ κ³μ°
if stdev_x > 0 and stdev_y > 0:
return covariance(x, y) / stdev_x / stdev_y # μκ΄κ΄κ³ κ³μ°
else:
return 0 # λ³λμ±μ΄ μμΌλ©΄ μκ΄κ΄κ³λ 0
print(covariance(num_friends, daily_minutes)) # 22.43
print(correlation(num_friends, daily_minutes)) # 0.25
# we may conclude that two variables are less correlated
22.425435139573064
0.24736957366478218
- de_mean(x): λ°μ΄ν° μ§ν© xμμ κ° λ°μ΄ν° ν¬μΈνΈμ κ°μμ νκ· κ°μ λΉΌμ, νκ· μ΄ 0μ΄ λλλ‘ μ‘°μ ν μλ‘μ΄ λ°μ΄ν° μ§ν©μ μμ±ν©λλ€. μ΄λ x λ°μ΄ν°μ μ€μ¬μ μμ μΌλ‘ μ΄λμν€λ ν¨κ³Όκ° μμ΅λλ€.
- dot(a, b): λ λ°μ΄ν° μ§ν© aμ bμμ κ°κ° λμνλ λ°μ΄ν° ν¬μΈνΈλ€μ κ³±μ κ²°κ³Όλ₯Ό λͺ¨λ λνλ μ°μ°μ λλ€. μ¦, a[0]*b[0] + a[1]*b[1] + ... + a[n-1]*b[n-1]μ ν©μ κ³μ°ν©λλ€. μ΄λ λ λ°μ΄ν° μ§ν© μ¬μ΄μ μνΈ μμ©μ μμΉννλ κ³Όμ μ λλ€.
- n: λ°μ΄ν°μ κ°μλ₯Ό μλ―Έν©λλ€. μ¬κΈ°μλ x λλ y λ°μ΄ν° μ§ν©μ κΈΈμ΄μ λλ€.
- / (n - 1): μ΅μ’ μ μΌλ‘ λν΄μ§ κ°μ n - 1λ‘ λλμ΄ μ€λλ€. μ΄λ νλ³Έ 곡λΆμ°μ κ³μ°ν λ μ¬μ©λλ 보μ 곡μμ μΌλΆλ‘, λ°μ΄ν° μ§ν©μ ν¬κΈ°κ° μμ λ λ°μν μ μλ νΈν₯μ μ‘°μ νκΈ° μν΄ μ¬μ©λ©λλ€.
plt.scatter(num_friends, daily_minutes)
plt.xlabel('num_friends')
plt.ylabel('daily_minutes')
plt.title('corr = {:.2}'.format(correlation(num_friends, daily_minutes)))
plt.show()
- plt.scatter(num_friends, daily_minutes): num_friendsλ₯Ό xμΆ κ°μΌλ‘, daily_minutesλ₯Ό yμΆ κ°μΌλ‘ νλ μ°μ λλ₯Ό 그립λλ€.
- plt.xlabel('num_friends'): xμΆμ 'num_friends'λΌλ λ μ΄λΈμ λΆμ λλ€.
- plt.ylabel('daily_minutes'): yμΆμ 'daily_minutes'λΌλ λ μ΄λΈμ λΆμ λλ€.
- plt.title('corr = {:.2}'.format(correlation(num_friends, daily_minutes))): μκ΄κ΄κ³ κ°μ κ³μ°νμ¬ μ λͺ©μ ν¬λ§·μ μ μ©ν ν 'corr = ' λ€μ νμν©λλ€.
- {:.2}λ μκ΄κ΄κ³ κ°μ μμμ λ μ리κΉμ§ νμνλλ‘ ν©λλ€.plt.show(): κ·Έλνλ₯Ό νλ©΄μ νμν©λλ€.
import matplotlib.pyplot as plt
# μ΄μμΉλ₯Ό μ μΈν num_friendsμ daily_minutes λ°μ΄ν°λ‘ μ°μ λλ₯Ό 그립λλ€.
plt.scatter(num_friends[1:], daily_minutes[1:])
# xμΆμ 'num_friends' λΌλ²¨μ μΆκ°ν©λλ€.
plt.xlabel('num_friends')
# yμΆμ 'daily_minutes' λΌλ²¨μ μΆκ°ν©λλ€.
plt.ylabel('daily_minutes')
# μ λͺ©μ μ΄μμΉλ₯Ό μ μΈν λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ κ³μ°λ μκ΄κ³μλ₯Ό ν¬ν¨μν΅λλ€.
# {:.2}λ μκ΄κ³μλ₯Ό μμμ λ μ리κΉμ§ νμνλλ‘ ν©λλ€.
plt.title('corr = {:.2}'.format(correlation(num_friends[1:], daily_minutes[1:])))
plt.show()
Correlation (μκ΄κ³μ) μΆκ° μ€λͺ
- μ νν –1. μλ²½ν λ΄λ¦¬λ§ (negative) μ ν κ΄κ³
- 0.70. κ°ν λ΄λ¦¬λ§ (negative) μ ν κ΄κ³
- 0.50. 보ν΅μ λ΄λ¦¬λ§ (negative) κ΄κ³
- 0.30. μ½ν λ΄λ¦¬λ§ (negative) μ ν κ΄κ³
- 0. μ ν κ΄κ³ μμ
- +0.30. μ½ν μ€λ₯΄λ§ (positive) μ ν κ΄κ³
- +0.50. 보ν΅μ μ€λ₯΄λ§ (positive) κ΄κ³
- +0.70. κ°ν μ€λ₯΄λ§ (positive) μ ν κ΄κ³
- μ νν +1. μλ²½ν μ€λ₯΄λ§ (positive) μ ν κ΄κ³
Correlation (μκ΄κ³μ) vs Cosine μ μ¬μ±
corr(x, y) = cosine(x - xΜ, y - yΜ) → μκ΄κ³μμ μ½μ¬μΈ μ μ¬λ μ¬μ΄μ κ΄κ³λ₯Ό λνλ΄λ μμμ λλ€.
- x - xΜ, y - yΜλ κ°κ° xμ π¦ λ°μ΄ν°μ νκ· μ λΊ κ°, μ¦ "νκ· μ€μ¬ν(mean-centered)"λ λ°μ΄ν° μ λλ€.
- μκ΄κ³μ (Correlation coefficient): μ΄λ λ λ³μ xμ π¦ κ°μ μ ν κ΄κ³μ κ°λμ λ°©ν₯μ μΈ‘μ νλ κ°μ
λλ€.
- μκ΄κ³μλ -1κ³Ό 1 μ¬μ΄μ κ°μ κ°μ§λ©°, +1μ μλ²½ν μμ μ ν κ΄κ³, -1μ μλ²½ν μμ μ ν κ΄κ³, 0μ μ ν κ΄κ³κ° μ ν μμμ λνλ λλ€.
- μ½μ¬μΈ μ μ¬λ (Cosine similarity): μ΄λ λ λ²‘ν° κ°μ μ½μ¬μΈ κ°λλ₯Ό μ΄μ©νμ¬ κ³μ°ν©λλ€.
- μ½μ¬μΈ μ μ¬λλ λ 벑ν°μ λ°©ν₯μ΄ μΌλ§λ μ μ¬νμ§λ₯Ό μΈ‘μ νλ©°, μ΄λ 벑ν°μ ν¬κΈ°μλ λ 립μ μ λλ€. μ½μ¬μΈ μ μ¬λλ -1κ³Ό 1 μ¬μ΄μ κ°μ κ°μ§λλ€.
Example: x = (1, 2, 3), y = (2, 4, 6), x - xΜ = (-1, 0, 1), y - yΜ = (-2, 0, 2)
κ°μ λ°©ν₯: 1, λ€λ₯Έ λ°©ν₯: -1. μ§κ°: 0 → Correlation
Numpy Version
- np.covλ 곡λΆμ° νλ ¬μ λ°νν©λλ€: λκ°μ μ λ³μμ λΆμ°μ λλ€.
- np.corrcoefλ μκ΄κ³μ νλ ¬μ λ°νν©λλ€: λκ°μ μ νμ 1μ λλ€.
- π×π μΌλ‘ 곡λΆμ° νλ ¬μ μ»μ μ μμ΅λλ€.
# NumPy λ°°μ΄λ‘ λ³ν
num_friends = np.array(num_friends)
daily_minutes = np.array(daily_minutes)
# λ λ°°μ΄μ νμΌλ‘ νλ 2D λ°°μ΄ μμ±
data = np.array([num_friends, daily_minutes])
# λ°μ΄ν°μ λͺ¨μ μΆλ ₯ (2, N) ννμΌ κ²μ
print(data.shape)
print()
# 곡λΆμ° νλ ¬ κ³μ° λ° μΆλ ₯
# λκ°μ μμλ κ°κ°μ λ³μμ λν λΆμ°μ, λΉλκ°μ μμλ λ λ³μ κ°μ 곡λΆμ°μ λνλ
print(np.cov(data))
# μκ΄κ³μ νλ ¬ κ³μ° λ° μΆλ ₯
# λκ°μ μμλ 1(μκΈ° μμ κ³Όμ μκ΄κ³μ), λΉλκ°μ μμλ λ λ³μ κ°μ μκ΄κ³μλ₯Ό λνλ
print(np.corrcoef(data))
print()
# λ λ³μ κ°μ μκ΄κ³μλ§ μΆλ ₯
print(np.corrcoef(data)[0,1])
print()
# μ£Όμ μ²λ¦¬λ λΆλΆ: κ° λ³μμ νλ³Έ λΆμ° κ³μ°
# ddof=1μ νλ³Έ λΆμ°μ κ³μ°ν λ μ¬μ©λ¨. κΈ°λ³Έκ°μ λͺ¨λΆμ° κ³μ°
# print(np.var(num_friends, ddof=1))
# print(np.var(daily_minutes, ddof=1))
# NumPy λ°°μ΄μ λ€μ 리μ€νΈλ‘ λ³ν
num_friends = list(num_friends)
daily_minutes = list(daily_minutes)
(2, 204)
[[ 81.54351396 22.42543514]
[ 22.42543514 100.78589895]]
[[1. 0.24736957]
[0.24736957 1. ]]
0.247369573664782
- μκ΄κ³μμ μ λκ°μ΄ 1μ κ°κΉμΈμλ‘ κ°ν μ ν κ΄κ³λ₯Ό λνλ΄λ©°, 0μ κ°κΉμΈμλ‘ μ ν κ΄κ³κ° μ½νκ±°λ μμμ μλ―Έν©λλ€.
Simpson’s Paradox (μ¬μ¨μ μμ€)
λ°μ΄ν°λ₯Ό λΆμν λ νλμ λλΌμ΄ μ μ μ¬μ¨μ μμ€μΈλ°, μ΄ μμ€μμ Confusion Matrix (νΌλ λ³μ)λ₯Ό 무μνλ©΄ μκ΄κ΄κ³κ° μ€ν΄μ μμ§κ° μμ μ μμ΅λλ€.
ν΄μ | νμ μ | νκ· μΉκ΅¬ μ |
μλΆ ν΄μ | 101 | 8.2 |
λλΆ ν΄μ | 103 | 6.5 |
- μλΆ ν΄μμ λ°μ΄ν° κ³Όνμλ€μ λλΆ ν΄μμ λ°μ΄ν° κ³Όνμλ€λ³΄λ€ λ μΉκ·Όνλ€κ³ λ³Ό μ μμ΅λλ€.
- μ κ·Έλ΄κΉμ?
- μ¬μ€, μΆκ° λ³μλ₯Ό λμ νλ©΄ μκ΄κ΄κ³κ° μ λ°λ λ°©ν₯μΌλ‘ λνλ©λλ€!
ν΄μ | νμ | νμ μ | νκ· μΉκ΅¬ μ |
μλΆ ν΄μ | λ°μ¬ | 35 | 3.1 |
λλΆ ν΄μ | λ°μ¬ | 70 | 3.2 |
μλΆ ν΄μ | λΉλ°μ¬ | 66 | 10.9 |
λλΆ ν΄μ | λΉλ°μ¬ | 33 | 13.4 |
- μ΄λ₯Ό νΌνλ μ μΌν λ°©λ²μ λ°μ΄ν°λ₯Ό μ μκ³ , κ°λ₯ν Confusion(νΌλ) μμΈμ νμΈνλ €κ³ λ Έλ ₯νλ κ²μ λλ€.
- λ¬Όλ‘ , μ΄κ²μ΄ νμ κ°λ₯ν κ²μ μλλλ€.
- μ€μ λ³λμ±μ λ°μν λ°μ΄ν°μ λν μ¬μ¨μ μμ€μ μκ°νλ μ§μ ν κ΄κ³λ₯Ό νλ¨νλ κ²μ΄ μ€μ λ‘ μ΄λ €μΈ μ μμμ λνλ λλ€.
- μ 체μ μΌλ‘λ κ°ν λΆμ μ μκ΄κ΄κ³: -0.74
- κ°λ³μ μΌλ‘λ κ°ν κΈμ μ μκ΄κ΄κ³: +0.74, +0.82, +0.75, +0.72, +0.69
Some Other Correlational Caveats (κΈ°ν μκ΄κ΄κ³ μ£Όμμ¬ν)
μκ΄κ΄κ³κ° 0μ΄λ©΄ λ λ³μ μ¬μ΄μ μ ν κ΄κ³κ° μμμ λνλ λλ€.
- κ΄λ ¨μ±μ΄ μμΌλ ν¬μ°©λμ§ μμ΅λλ€ (Related but not captured)
- Correlation(μκ΄ κ΄κ³) X → but, Correlation(μκ΄ κ΄κ³)λ‘ νμ κ°λ₯ν©λλ€.
# absolute value relationship
x = [-2, -1, 0, 1, 2]
y = [ 2, 1, 0, 1, 2]
plt.scatter(x, y)
plt.show()
μκ΄κ΄κ³κ° μΌλ§λ μ€μνκ±°λ μΌλ§λ ν₯λ―Έλ‘μ΄κ°μ? (How important or how interesting the correlation is?)
# xμ y λ°μ΄ν°λ₯Ό μ μν©λλ€.
x = [-2, -1, 0, 1, 2]
y = [99.98, 99.99, 100, 100.01, 100.02]
# xμ y λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ μ°μ λλ₯Ό 그립λλ€.
plt.scatter(x, y)
# μ°μ λμ μ λͺ©μ μ€μ ν©λλ€. μ¬κΈ°μ correlation(x,y)λ xμ y μ¬μ΄μ μκ΄κ΄κ³λ₯Ό κ³μ°νλ ν¨μλ‘,
# μ΄ ν¨μμ κ²°κ³Όκ°μ μμμ λμ§Έ μ리κΉμ§ λ°μ¬λ¦Όνμ¬ μ λͺ©μ ν¬ν¨μν΅λλ€.
plt.title('corr={:.2}'.format(correlation(x, y)))
plt.show()
- μκ΄κ΄κ³λ λ λ³μμ κ΄κ³μ κ°λμ λ°©ν₯μ λνλ΄λ μ§νλ‘, -1λΆν° 1κΉμ§μ κ°μΌλ‘ ννλ©λλ€.
- 1μ κ°κΉμΈμλ‘ κ°ν μ (+)μ μ ν κ΄κ³λ₯Ό, -1μ κ°κΉμΈμλ‘ κ°ν λΆ(-)μ μ ν κ΄κ³λ₯Ό, 0μ κ°κΉμΈμλ‘ μ ν κ΄κ³κ° μ½νκ±°λ μμμ μλ―Έν©λλ€.
# xμ y λ°μ΄ν°λ₯Ό μ μν©λλ€. μ΄ λ°μ΄ν°λ€μ μλ²½ν μ ν κ΄κ³λ₯Ό λνλ
λλ€.
x = [-2, -1, 0, 1, 2]
y = [99.98, 99.99, 100, 100.01, 100.02]
# xμ y λ°μ΄ν°λ₯Ό μ΄μ©νμ¬ μ°μ λλ₯Ό 그립λλ€.
plt.scatter(x, y)
# μΆμ λλ±ν λΉμ¨λ‘ μ€μ ν©λλ€. μ΄λ λ°μ΄ν° κ°μ κ΄κ³λ₯Ό λ λͺ
ννκ² λ³΄μ¬μ£ΌκΈ° μν¨μ
λλ€.
plt.axis('equal')
# κ·Έλνμ μ λͺ©μ xμ y λ°μ΄ν° κ°μ μκ΄κ΄κ³ κ³μλ₯Ό νμν©λλ€.
# μ¬κΈ°μ 'correlation(x,y)'λ xμ y λ°μ΄ν°μ μκ΄κ΄κ³λ₯Ό κ³μ°νλ ν¨μλ₯Ό νΈμΆνλ©°,
plt.title('corr={:.2}'.format(correlation(x,y)))
plt.show()
- plt.axis('equal')μ λ μΆμ μ€μΌμΌμ λμΌνκ² μ€μ νμ¬, λ°μ΄ν° ν¬μΈνΈ κ°μ μ§μ μ κ΄κ³λ₯Ό λμ± λͺ ννκ² λ³΄μ¬μ£Όλ λ° μ¬μ©λ©λλ€.
- μκ΄κ΄κ³ κ³μ(corr)λ -1μμ 1 μ¬μ΄μ κ°μ κ°μ§λ©°, μ΄ κ°μ΄ 1μ κ°κΉμΈμλ‘ λ³μ κ°μ μλ²½ν μμ μ ν κ΄κ³κ° μμμ μλ―Έν©λλ€. μ΄ μ½λμμλ correlation(x, y) ν¨μλ₯Ό ν΅ν΄ κ³μ°ν©λλ€.
Correlation and Causation (μκ΄κ΄κ³μ μΈκ³Όκ΄κ³)
"μκ΄κ΄κ³λ μΈκ³Όκ΄κ³κ° μλλλ€ (Correlation is not causation)”
- λ§μ½ xμ yκ° κ°ν μκ΄κ΄κ³λ₯Ό κ°μ§λ€λ©΄,
- κ·Έκ²μ xκ° yλ₯Ό μΌμΌν¨λ€κ±°λ,
- yκ° xλ₯Ό μΌμΌν¨λ€κ±°λ,
- μλ‘κ° μλ‘λ₯Ό μΌμΌν¨λ€κ±°λ,
- μ΄λ€ μ 3μ μμΈμ΄ λ λ€λ₯Ό μΌμΌν¨λ€κ±°λ,
- λλ μ무 μλ―Έκ° μμ μλ μμ΅λλ€.
- DataSciencester μ¬μ΄νΈμμ λ λ§μ μΉκ΅¬λ₯Ό κ°μ§κ³ μλ κ²μ΄ μ¬μ©μλ€μ΄ μ¬μ΄νΈμμ λ λ§μ μκ°μ 보λ΄λ μμΈμ΄λΌκ³ ν μ μμ΅λλ€.
- λ°μ΄ν°μ¬μ΄μΈμ€ ν¬λΌμμ λ Όμνλ μκ°μ΄ κΈΈμλ‘, μ μ¬ν μ¬κ³ λ°©μμ κ°μ§ μ¬λλ€μ λ λ§μ΄ λ§λκ³ μΉκ΅¬λ₯Ό μ¬κ· κ°λ₯μ±μ΄ μμ΅λλ€.
- λ°μ΄ν° κ³Όνμ μ΄μ μ μΈ μ¬μ©μλ€μ΄ μ¬μ΄νΈμμ λ λ§μ μκ°μ 보λ΄λ κ²μ μ¬μ΄νΈλ₯Ό λ ν₯λ―Έλ‘κ² μ¬κ²¨μμ΄λ©°, λ λ§μ λ°μ΄ν° κ³Όν μΉκ΅¬λ₯Ό νλμ μΌλ‘ λͺ¨μΌλ κ²μ λ€λ₯Έ μ¬λλ€κ³Ό κ΅λ₯νκ³ μΆμ§ μκΈ° λλ¬ΈμΌ μ μμ΅λλ€.
λ°μν
'π Data Mining' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Data Mining] Getting Data Part.1 (0) | 2024.07.24 |
---|---|
[Data Mining] Gradient Descent (κ²½μ¬ νκ°λ²) (0) | 2024.07.23 |
[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 |