00、背景
今晚重温下数据统计,学习以下内容:
1、对给定数据进行探索性数据分析。
2、计算描述性统计数据并绘制直方图。
3、使用 scipy 库计算置信区间、Z-score和 T-score。
01、几个名词介绍
置信区间(confidence interval):即误差范围。
用(a, b)表示,a和b的确切数值取决于事件对于“该区间包含总体均值”这一结果的可信程度。
置信区间在频率学派中间使用,其在贝叶斯统计中的对应概念是可信区间(credible interval)
从正态分布产生的50个样本中得出的50个置信区间
置信水平(Confidence level):即置信区间包含总体平均值的概率多大。
例如,95%的置信水平指的是100个置信区间有95个包含了总体平均值。置信水平越高,区间越宽,置信区间包含总体统计量的几率越大,但置信区间太宽,则会失去意义。常用置信水平为95%。
我们常犯一个概念性错误,是将基于观测到的数据所同样构造的置信区间的置信水平,误认为是它包含真实未知参数的真实值的概率。正确的理解是:置信水平只有在描述这个同样构造置信区间的过程(或称方法)的意义下才能被视为一个概率。
Z分数:
z分数(z-score),也叫标准分数(standard score)是一个数与平均数的差再除以标准差的过程。在统计学中,标准分数是一个观测或数据点的值高于被观测值或测量值的平均值的标准偏差的符号数。
z分数可以回答这样一个问题:"一个给定分数距离平均数多少个标准差?"在平均数之上的分数会得到一个正的标准分数,在平均数之下的分数会得到一个负的标准分数。z分数是一种可以看出某分数在分布中相对位置的方法。
T分数:
T分数是原始分数的导出分数。把原始分数转换成标准化分数为线性转换,Z分数与原始分数的分布形状相同,原始分数为正态分布,则Z分数也为正态分布。
原始分数如果不是正态分布,如何使导出分数为正态分布呢?这时可先把原始分数转换成百分等级,而后再把百分等级转换成标准正态分布的z值,从而迫使导出分数z服从均数为0、标准差为1的正态分布,叫做正态化的标准分数。
02、完整代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.read_csv('Q7.csv')
df.head()
输出:
Unnamed: 0 | Points | Score | Weigh | |
0 | Mazda RX4 | 3.90 | 2.620 | 16.46 |
1 | Mazda RX4 Wag | 3.90 | 2.875 | 17.02 |
2 | Datsun 710 | 3.85 | 2.320 | 18.61 |
3 | Hornet 4 Drive | 3.08 | 3.215 | 19.44 |
4 | Hornet Sportabout | 3.15 | 3.440 | 17.02 |
df.describe()
输出:
Points | Score | Weigh | |
count | 32.000000 | 32.000000 | 32.000000 |
mean | 3.596563 | 3.217250 | 17.848750 |
std | 0.534679 | 0.978457 | 1.786943 |
min | 2.760000 | 1.513000 | 14.500000 |
25% | 3.080000 | 2.581250 | 16.892500 |
50% | 3.695000 | 3.325000 | 17.710000 |
75% | 3.920000 | 3.610000 | 18.900000 |
max | 4.930000 | 5.424000 | 22.900000 |
df['Weigh'].mode()
输出:
0 17.02
1 18.90
Name: Weigh, dtype: float64
df['Weigh'].var()
输出:
3.193166129032258
df['Weigh'].std()
输出:
1.7869432360968431
df['Weigh'].max() - df['Weigh'].min()
输出:
8.399999999999999
sns.boxplot(df)
输出:
sns.scatterplot(df)
输出:
sns.boxplot(df['Points'])
输出:
prob= [108, 110, 123, 134, 135, 145, 167, 187, 199]
lex = []
for i in prob:
exp= i*(1/9)
lex.append(exp)
print(lex)
[12.0, 12.222222222222221, 13.666666666666666, 14.888888888888888, 15.0, 16.11111111111111, 18.555555555555554, 20.777777777777775, 22.11111111111111]
np.sum(lex)
输出:
145.33333333333331
dc= pd.read_csv('Q9_a.csv')
dc.head()
输出:
Index | speed | dist | |
0 | 1 | 4 | 2 |
1 | 2 | 4 | 10 |
2 | 3 | 7 | 4 |
3 | 4 | 7 | 22 |
4 | 5 | 8 | 16 |
(dc['speed']).skew(), (dc['speed']).kurt()
输出:
(-0.11750986144663393, -0.5089944204057617)
(dc['dist']).skew(), (dc['dist']).kurt()
输出:
(0.8068949601674215, 0.4050525816795765)
sns.histplot(dc['dist'])
输出:
<Axes: xlabel='dist', ylabel='Count'>
sns.histplot(dc['speed'])
输出:
<Axes: xlabel='speed', ylabel='Count'>
dc2= pd.read_csv('Q9_b.csv')
dc2.head()
输出:
Unnamed: 0 | SP | WT | |
0 | 1 | 104.185353 | 28.762059 |
1 | 2 | 105.461264 | 30.466833 |
2 | 3 | 105.461264 | 30.193597 |
3 | 4 | 113.461264 | 30.632114 |
4 | 5 | 104.461264 | 29.889149 |
dc2['SP'].skew().round(3), dc2['SP'].kurt().round(3)
输出:
(1.611, 2.977)
dc2['WT'].skew().round(3), dc2['WT'].kurt().round(3)
输出:
(-0.615, 0.95)
plt.figure(figsize=(8,4), dpi=80)
plt.subplot(1,2,1)
sns.histplot(dc2['SP'])
plt.subplot(1,2,2)
sns.histplot(dc2['WT'])
plt.show()
import numpy as np
from scipy import stats
sm= 200 # 样本均值
ss= 30/np.sqrt(200) # 标准差
ci94 =stats.norm.interval(confidence = 0.94, loc=sm, scale=ss)
print('94% 置信水平的置信区间为', np.round(ci94,2))
94% 置信水平的置信区间为 [196.01 203.99]
ci98 =stats.norm.interval(confidence = 0.98, loc=sm, scale=ss)
print('98% 置信水平的置信区间为', np.round(ci98,2))
98% 置信水平的置信区间为 [195.07 204.93]
ci96 =stats.norm.interval(confidence = 0.96, loc=sm, scale=ss)
print('96% 置信水平的置信区间为', np.round(ci96,2))
96% 置信水平的置信区间为 [195.64 204.36]
import numpy as np
sc= [34,36,36,38,38,39,39,40,40,41,41,41,41,42,42,45,49,56]
print('均值:', np.mean(sc), '\n中位数:', np.median(sc),
'\n方差:', np.var(sc).round(2), '\ns标准差:', np.std(sc).round(2))
均值:41.0
中位数:40.5
方差:24.11
s标准差:4.91
import warnings
warnings.filterwarnings("ignore")
sns.distplot(sc)
输出:
<Axes: ylabel='Density'>
sns.boxplot(sc)
输出:
<Axes: >
import pandas as pd
import numpy as np
dc3 = pd.read_csv('Cars.csv')
dc3.head()
输出:
Car | MPG | Cylinders | Displacement | Horsepower | Weight | Acceleration | Model | Origin | |
0 | Chevrolet Chevelle Malibu | 18.0 | 8 | 307.0 | 130 | 3504 | 12.0 | 70 | US |
1 | Buick Skylark 320 | 15.0 | 8 | 350.0 | 165 | 3693 | 11.5 | 70 | US |
2 | Plymouth Satellite | 18.0 | 8 | 318.0 | 150 | 3436 | 11.0 | 70 | US |
3 | AMC Rebel SST | 16.0 | 8 | 304.0 | 150 | 3433 | 12.0 | 70 | US |
4 | Ford Torino | 17.0 | 8 | 302.0 | 140 | 3449 | 10.5 | 70 | US |
m1= dc3['MPG'].mean()
s1= dc3['MPG'].std()
prob_mpg = (1 - stats.norm.cdf(38, loc= m1, scale= s1))
print('mpg > 38 的概率是', np.round(prob_mpg, 3))
mpg > 38 的概率是 0.038
prob_mpg2 = stats.norm.cdf(40, loc= m1, scale= s1)
print('mpg < 40 的概率是', np.round(prob_mpg2, 3))
mpg < 40 的概率是 0.978
prob_mpg3 = (1-stats.norm.cdf(20, loc= m1, scale= s1))
print('mpg > 20 的概率是', np.round(prob_mpg3, 3))
prob_mpg4 = stats.norm.cdf(50, loc= m1, scale= s1)
print('mpg < 50 的概率是', np.round(prob_mpg4, 3))
prob_mpg5= prob_mpg4 - prob_mpg3
print('mpg 在 20 到 50 之间的概率是', np.round(prob_mpg5, 3))
mpg > 20 的概率是 0.642
mpg < 50 的概率是 0.999
mpg 在 20 到 50 之间的概率是 0.358
import warnings
warnings.filterwarnings("ignore")
sns.distplot(dc3['MPG'])
输出:
<Axes: xlabel='MPG', ylabel='Density'>
# mean < median
dc3['MPG'].describe()
输出:
count 406.000000
mean 23.051232
std 8.401777
min 0.000000
25% 17.000000
50% 22.350000
75% 29.000000
max 46.600000
Name: MPG, dtype: float64
import pandas as pd
import numpy as np
db = pd.read_csv('wc-at.csv')
db.head()
输出:
Waist | AT | |
0 | 74.75 | 25.72 |
1 | 72.60 | 25.89 |
2 | 81.80 | 42.60 |
3 | 83.95 | 42.80 |
4 | 74.65 | 29.84 |
plt.figure(figsize= (18,8), dpi= 80)
plt.subplot(1,2,1)
sns.distplot(db['AT'])
plt.subplot(1,2,2)
sns.distplot(db['Waist'])
输出:
db.describe()
输出:
Waist | AT | |
count | 109.000000 | 109.000000 |
mean | 91.901835 | 101.894037 |
std | 13.559116 | 57.294763 |
min | 63.500000 | 11.440000 |
25% | 80.000000 | 50.880000 |
50% | 90.800000 | 96.540000 |
75% | 104.000000 | 137.000000 |
max | 121.000000 | 253.000000 |
z 分数
from scipy import stats
alpha= 0.05
q= 0.95+(alpha/2)
print(q)
print('z score for 95% confidence interval is', np.round(stats.norm.ppf(q),3))
0.975
z score for 95% confidence interval is 1.96
from scipy import stats
alpha= 0.1
q= 0.9+(alpha/2)
print(np.round(q,3))
print('90% 置信区间的 z 分数为', np.round(stats.norm.ppf(q),3))
0.95
95% 置信区间的 z 分数为 1.645
alpha= 0.06
q= 0.94+(alpha/2)
print(np.round(q,3))
print('94% 置信区间的 z 分数为', np.round(stats.norm.ppf(q),3))
0.97
94% 置信区间的 z 分数为 1.881
alpha= 0.4
q= 0.6+(alpha/2)
#print(np.round(q,3))
print('60% 置信区间的 z 分数为', np.round(stats.norm.ppf(q),3))
60% 置信区间的 z 分数为 0.842
t 分数
from scipy import stats
alpha= 0.05
q= 0.95+(alpha/2)
print(np.round(q,3))
print('95% 置信区间的 t 分数为', np.round(stats.t.ppf(q, df= 24),3))
0.975
95% 置信区间的 t 分数为 2.064
alpha= 0.04
q= 0.96+(alpha/2)
print(np.round(q,3))
print('96% 置信区间的 t 分数为', np.round(stats.t.ppf(q, df= 24),3))
0.98
96% 置信区间的 t 分数为 2.172
alpha= 0.01
q= 0.99+(alpha/2)
#print(np.round(q,3))
print('99% 置信区间的 t 分数为', np.round(stats.t.ppf(q, df= 24),3))
99% 置信区间的 t 分数为 2.797
概率
import numpy as np
from scipy import stats
m= 270 # 总体均数
n= 18 # 样本大小
x= 260 # 样本均值;
s= 90 # 样本标准差
ts = (x - m) / (s/ np.sqrt(n))
print('t分数是', np.round(ts, 3))
t_prob= stats.t.cdf(ts, df= 17)
print('概率是', np.round(t_prob,3)*100)
t分数是 -0.471
概率是 32.2