今天统计学老师布置了一道题,题目是这样的:
这个题目,就是用 t 估计估计一下置信区间:
先求出来
X
‾
=
1
32
(
13.0
+
.
.
.
+
17.6
)
\overline{X}=\frac{1}{32}(13.0+...+17.6)
X=321(13.0+...+17.6)
然后
S
=
1
n
−
1
∑
i
=
1
n
(
x
i
−
x
‾
)
2
S=\sqrt{\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\overline{x})^2}
S=n−11i=1∑n(xi−x)2
=
1
31
[
(
13.0
−
x
‾
)
2
+
.
.
.
+
(
17.6
−
x
‾
)
2
]
=\sqrt{\frac{1}{31}[(13.0-\overline{x})^2+...+(17.6-\overline{x})^2]}
=311[(13.0−x)2+...+(17.6−x)2]
最后得出置信区间
[
x
‾
−
t
α
2
(
n
−
1
)
×
S
n
,
x
‾
+
t
α
2
(
n
−
1
)
×
S
n
]
[\overline{x}-t_{\frac{\alpha}{2}}(n-1) × \frac{S}{\sqrt{n}} \ , \ \overline{x}+t_{\frac{\alpha}{2}}(n-1) × \frac{S}{\sqrt{n}}]
[x−t2α(n−1)×nS , x+t2α(n−1)×nS]
其实吧,本来我也是想老老实实算的,像这样:
但是那数据太多了啊,就简简单单的一个平均值,我算了好几遍,都不一样…(心态崩了啊)
单单一个平均值就算的我一肚子气,想想后面还有 [ ( 13.0 − x ‾ ) 2 + . . . + ( 17.6 − x ‾ ) 2 ] [(13.0-\overline{x})^2+...+(17.6-\overline{x})^2] [(13.0−x)2+...+(17.6−x)2],啊啊啊啊啊啊啊啊啊啊啊啊,想想就恼火,堂堂一敲代码的能受这气???🌚
然后我本来想用python平平静静地把那些数据处理完,但是,我又看了一眼,这…这些数据是图片,也就是说就算用程序算,我也要把数据挨个敲上去,这和我用手机算又有什么区别嘛…啊啊啊啊啊啊啊啊啊啊啊啊啊啊,堂堂一敲代码的能受这气???🌚
然后我想用WPS自带的图片识别功能,结果:
唉,勉勉强强吧…不过我还是需要改动,身为一个有键盘就不愿意动笔的男人,我忍不了,这还不是我想要的效果。哎没办法,只能祭出我的大杀器了:
import pytesseract
还需要一个辅助工具:
from PIL import Image
不过在操作之前,我需要先把图片裁剪一下,因为我只需要数据:
然后因为背景是黄色的,会影响OCR识别,所以我需要黑白处理一下:
img = Image.open("123456789.png")
img = img.convert('L')
img = img.point(lambda x: 255 if x > 135 else 0)
然后识别:
text = None
if pytesseract.image_to_string(img):
text = pytesseract.image_to_string(img)
print(text)
我的天哪,这真的是百分百识别啊!!!不得不说啊,tesseract就是🐮🍺啊…(其实我这里用的pytesseract是tesseract的python版,相比起原版还是弱那么一点点的,但是原版我安不上…哎么的办法…)
虽然识别超准,但是这还不是我想要的结果,因为这个text是一个字符串,我要求这些数字的和,还是得把它转化为一个可迭代对象比如列表然后用sum函数求和再求平均:
也只需要简简单单的一句:
text=text.split()
结果就转化成了这个样子:
['13.0', '20.8', '25.1', '16.0', '18.5', '19.3', '16.8', '21.7', '16.4', '18.8', '20.4', '15.2', '14.8', '23.1', '17.4', '21.3', '19.4', '15.2', '25.2', '21.5', '17.3', '19.9', '23.1', '16.8', '23.2', '19.1', '15.3', '15.6', '24.9', '18.1', '19.4', '17.6']
然后就可以开开心心求平均值啦:
print(sum([float(_) for _ in text])/len(text))
哦豁这结果和我用计算机摁的第一遍结果一样欸…
我以后再也不验算了…
好啦, X ‾ = 1 32 ( 13.0 + . . . + 17.6 ) \overline{X}=\frac{1}{32}(13.0+...+17.6) X=321(13.0+...+17.6)求出来了,该 S = 1 n − 1 ∑ i = 1 n ( x i − x ‾ ) 2 = 1 31 [ ( 13.0 − x ‾ ) 2 + . . . + ( 17.6 − x ‾ ) 2 ] S=\sqrt{\frac{1}{n-1}\sum_{i=1}^{n}(x_i-\overline{x})^2}=\sqrt{\frac{1}{31}[(13.0-\overline{x})^2+...+(17.6-\overline{x})^2]} S=n−11∑i=1n(xi−x)2=311[(13.0−x)2+...+(17.6−x)2] 了:(这不就小case了嘛😁)
S = math.sqrt(float((1 / 31) * sum([float(_ - average) ** 2 for _ in [float(_) for _ in text]])))
好啦,轻轻松松算出来了S
😄(我要是用手 + 计算器…啊…🌚)
然后,因为要估计
μ
\mu
μ 的95%的置信区间,
α
\alpha
α 即为0.05,查表得
t
α
2
(
n
−
1
)
=
t
0.025
(
31
)
=
2.04
t_{\frac{\alpha}{2}}(n-1)=t_{0.025}(31)=2.04
t2α(n−1)=t0.025(31)=2.04
所以置信区间为:
[
x
‾
−
t
α
2
(
n
−
1
)
×
S
n
,
x
‾
+
t
α
2
(
n
−
1
)
×
S
n
]
[\overline{x}-t_{\frac{\alpha}{2}}(n-1) × \frac{S}{\sqrt{n}} \ , \ \overline{x}+t_{\frac{\alpha}{2}}(n-1) × \frac{S}{\sqrt{n}}]
[x−t2α(n−1)×nS , x+t2α(n−1)×nS]
[
19.06875
−
2.04
×
3.2555
32
,
19.06875
+
2.04
×
3.2555
32
]
[19.06875-2.04 × \frac{3.2555}{\sqrt{32}} \ , \ 19.06875+2.04 × \frac{3.2555}{\sqrt{32}}]
[19.06875−2.04×323.2555 , 19.06875+2.04×323.2555]
[
19.06875
−
1.174
,
19.06875
+
1.174
]
[19.06875-1.174,19.06875+1.174]
[19.06875−1.174,19.06875+1.174]
[
17.89475
,
20.24275
]
[17.89475,20.24275]
[17.89475,20.24275]
然后把源码贴出来吧:
import pytesseract
from PIL import Image
import math
img = Image.open("123456789.png")
img = img.convert('L')
img = img.point(lambda x: 255 if x > 135 else 0)
# img.show()
text = pytesseract.image_to_string(img).split()
# print(text)
average = sum([float(_) for _ in text]) / len(text)
S = math.sqrt(float((1 / (len(text)-1)) * sum([float(_ - average) ** 2 for _ in [float(_) for _ in text]])))
# print(S)
print("置信区间:[{},{}]".format(average - 2.04 * S / math.sqrt(len(text)), average + 2.04 * S / math.sqrt(len(text))))
哈哈,Python真好 ~ ~ ~