两个样本比例之差是什么分布?当大样本的情况下,它可由正态分布来近似,这一结论对于置信区间的计算,以及总体比例差的假设检验非常重要,这里要给出的并不是理论推导,而是通过实验的方式给出样本比例之差的分布。实验步骤如下:
1 构造两个总体
import pandas as pd
import numpy as np
num=50000
#np.repeat("class1",num)
#np.random.choice([0,1], size=num, replace=True, p=[0.7,0.3])
class1=np.array([np.repeat("class1",num),np.random.choice(['M','F'], size=num, replace=True, p=[0.8,0.2])])
class2=np.array([np.repeat("class2",num),np.random.choice(['M','F'], size=num, replace=True, p=[0.6,0.4])])
classp=np.hstack((class1,class2))
data=pd.DataFrame(classp).T
data.columns=["class","MF"]
data.head()
image.png
2 计算总体比例并画图
mrate1=len(data[(data["class"]=='class1') & (data["MF"]=='M')])/len(data[(data["class"]=='class1')])
mrate2=len(data[(data["class"]=='class2') & (data["MF"]=='M')])/len(data[(data["class"]=='class2')])
print("class1的男性总体比例:",mrate1)
print("class2的男性总体比例:",mrate2)
from pyecharts import Bar
bar =Bar("两个班级的男生比例")
bar.add("总体比例",["class1","class2"], [0.8,0.6])
bar.render()
bar
image.png
3 进行3000次抽样,样本量为1000
from tqdm import tqdm
num_choice=3000
sa_size=1000
ratedata=pd.DataFrame(columns=('rate1','rate2','rate_diff'))
for i in tqdm(range(num_choice)):
np.random.seed(i+1)
rate1=np.sum(np.random.choice(data[(data["class"]=='class1')].MF, size=sa_size, replace=True)=="M")/sa_size
rate2=np.sum(np.random.choice(data[(data["class"]=='class2')].MF, size=sa_size, replace=True)=="M")/sa_size
rate_diff=rate1-rate2
ratedata=ratedata.append(pd.DataFrame({'rate1':[rate1],'rate2':[rate2],'rate_diff':[rate_diff]}),ignore_index=True)
ratedata.head()
image.png
4 画出每个样本比例,及比例差的分布图
import matplotlib.pyplot as plt #加载可视化工具
import seaborn as sns #加载可视化工具
plt.figure()
fig = plt.figure(figsize=(16, 8))
sns1=sns.distplot(ratedata["rate1"],bins=20,kde=True,label="Distribution of Sample Proportion for Population 1") #绘制直方图,20个分箱(直方),kde表示需要密度曲线
sns2=sns.distplot(ratedata["rate2"],bins=20,kde=True,label="Distribution of Sample Proportion for Population 2")
sns3=sns.distplot(ratedata["rate_diff"],bins=20,kde=True,label="Distribution of Sample Proportion difference")
plt.legend()
plt.show()
image.png
图中绿色的就是样本比例差的分布了,样本量越大,越接近于正态分布,大家可以修改样本量并画图试试。