人生苦短,我能受这气?| 我用Python轻松解决了这个简单又恼火的问题

今天统计学老师布置了一道题,题目是这样的:
在这里插入图片描述
在这里插入图片描述


这个题目,就是用 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=n11i=1n(xix)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.0x)2+...+(17.6x)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}}] [xt2α(n1)×n S , x+t2α(n1)×n S]

其实吧,本来我也是想老老实实算的,像这样:

在这里插入图片描述
但是那数据太多了啊,就简简单单的一个平均值,我算了好几遍,都不一样…(心态崩了啊)

在这里插入图片描述

单单一个平均值就算的我一肚子气,想想后面还有 [ ( 13.0 − x ‾ ) 2 + . . . + ( 17.6 − x ‾ ) 2 ] [(13.0-\overline{x})^2+...+(17.6-\overline{x})^2] [(13.0x)2+...+(17.6x)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=n11i=1n(xix)2 =311[(13.0x)2+...+(17.6x)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α(n1)=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}}] [xt2α(n1)×n S , x+t2α(n1)×n S]
[ 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.068752.04×32 3.2555 , 19.06875+2.04×32 3.2555]
[ 19.06875 − 1.174 , 19.06875 + 1.174 ] [19.06875-1.174,19.06875+1.174] [19.068751.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真好 ~ ~ ~

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值