2020年5月28日 星期四

python 統計 scipy.stats

import numpy as np
arr = np.array([1,3,2,5,4,4,5,453,43,45,43,5])
print("平均:",arr.mean())
print("標準差:",arr.std())
print("變異數:",arr.var())

print(np.sort(arr))
print("中位數:",np.median(arr))
#四分之一位數
np.quantile(e,.25)


#眾數
v = [1,2,3,4,5,3,3,3,3,3,3,3,3,4,4,4,4,4,4,5]
print(np.argmax(np.bincount(v)))


#共變異數 與 相關係數
def cov(X, Y):  # 嘗試手刻共變異數吧
    s = 0
    for i in range(0,len(X)):
        s += (X[i] - X.mean()) * (Y[i] - Y.mean())
    s /= (len(X) - 1)
    return s

def cor(X, Y):  # 嘗試手刻相關係數吧
    s,sx,sy = 0,0,0
    for i in range(0,len(X)):
        s += (X[i] - X.mean()) * (Y[i] - Y.mean())
        sx += (X[i] - X.mean()) ** 2
        sy += (Y[i] - Y.mean()) ** 2
    s /= (sx** 0.5) * (sy** 0.5)
    return s

X = np.array([1,2,3,4,5,6])
Y = np.array([3,5,6,7,8,9])

#使用自訂函式
print(cov(X,Y))
print(cor(X,Y))

#使用Numpy
print(np.cov(X, Y))
print(np.corrcoef(X, Y))








#==========================================================
import scipy.stats as stats
# 請查看 P(X <= -1),X服從標準常態分佈:
norm_cdf = stats.norm.cdf
print("P(X <= -1)=", norm_cdf(-1, loc=0, scale=1))

# 請畫出標準常態分佈的累積機率函數(CDF),範圍從-3至3:
x = np.linspace(-3, 3, 1000)
norm_cdf = stats.norm.cdf

plt.plot(x, norm_cdf(x, loc=0, scale=1))
plt.arrow(-1, 0, 0, norm_cdf(-1, loc=0, scale=1), head_width=0.02,
          width=0.005, head_length=0.02, color='r')
plt.arrow(-1, norm_cdf(-1, loc=0, scale=1), -3, 0, head_width=0.02,
          width=0.005, head_length=0.02, color='g')
plt.show()

# 請分別查看標準常態分佈的 2.5%, 50%, 97.5% 分位數:
norm_ppf = stats.norm.ppf

print("2.5% 分位數:", norm_ppf(0.025))
print("50% 分位數:", norm_ppf(0.5))
print("97.5% 分位數:", norm_ppf(0.975))

# 請以直方圖(histogram)觀察10000個標準常態分佈的隨機數結果:
norm_rvs = stats.norm.rvs(loc=0, scale=1, size=10000)
n, bins, patches = plt.hist(norm_rvs, 100, density=True, facecolor='green', alpha=0.6)

mu, sigma = 0, 1
x = np.linspace(stats.norm.ppf(0.0001), stats.norm.ppf(0.9999), 101)
y = stats.norm.pdf(bins)
l = plt.plot(bins, y, 'r--', linewidth=2)

plt.xlabel('norm_rvs')
plt.ylabel('Probability')
plt.title(r'$\mathrm{Histogram\ of\ Symmetric\ Distribution:}\ \mu=0,\ \sigma=1$')
plt.show()



#==========================================================
# 隨機抽樣(random sampling):
s0 = np.random.choice([1, 2, 3, 4, 5], 5, replace=False)

# 請利用隨機抽樣的方法,將20個樣本隨機分派至2種不同的群組:
s1 = np.random.choice(2, 20, replace=True)

# 請利用隨機抽樣的方法,從20個樣本中,隨機抽取10個子樣本分派至群組1:
s2 = np.random.choice(20, 10, replace=False)

print(s0)
print(s1)
print(s2)

沒有留言:

張貼留言