美文网首页统计学学习
实践-python实现假设检验

实践-python实现假设检验

作者: HenlyX | 来源:发表于2020-01-13 12:59 被阅读0次

    作业链接:

    https://mp.weixin.qq.com/s/Jj6b_F25TsbziYxedr-jHg

    知识点:假设检验

    本周是统计学学习小组-第二期的第十一周,我们这周的学习内容是假设检验实践,主要是使用python对我们上周学习的内容进行实践~ 本周需要解决的几个小问题:

    1、人体体温的总体均值是否为98.6华氏度?

    2、人体的温度是否服从正态分布?

    3、人体体温中存在的异常数据是哪些?

    4、男女体温是否存在明显差异?

    5、体温与心率间的相关性(强?弱?中等?)

    引申出来的点:你要怎么向运营或者产品的同事展示数据结果?

    具体过程及实现参照如下:

    导入所需的包

    import pandasas pd

    import pylab

    import math

    import numpyas np

    import matplotlib.pyplotas plt

    #%matplotlib inline

    from scipy.statsimport norm

    import scipy.stats

    import warnings

    warnings.filterwarnings("ignore")

    #df = pd.read_csv("http://ww2.amstat.org/publications/jse/datasets/normtemp.dat.txt", sep="  ",names=['Temperature', 'Gender', 'Heart Rate'])

    df = pd.read_csv('D:/Users/Downloads/test.csv',  sep=",", names=['Temperature', 'Gender', 'Heart Rate'])

    df.head()

    df.describe()


    # 1.验证98.6为平均温度

    from scipyimport stats

    CW_mu =98.6

    stats.ttest_1samp(df['Temperature'], CW_mu, axis=0)

    # T-Stat -5.454 p-value 近乎0,拒绝原假设

    #Ttest_1sampResult(statistic=-5.454823292364077, pvalue=2.410632041561008e-07)


    # 2.人体的温度是否服从正态分布?

    #采用shapiro_wiki进行判断,由返回的p_value进行判断,若p_value>0.05,则可认为该数据集近似于正态分布

    #1.计算均值和标注差   前提检验正态分布 图示如下

    observed_temperatures = df['Temperature'].sort_values()

    bin_val = np.arange(start=observed_temperatures.min(), stop=observed_temperatures.max(), step=50)

    mu, std = np.mean(observed_temperatures), np.std(observed_temperatures)

    p = norm.pdf(observed_temperatures, mu, std)

    plt.hist(observed_temperatures, bins=bin_val, normed=True, stacked=True)

    plt.plot(observed_temperatures, p, color='r')

    plt.xticks(np.arange(95.75, 101.25, 0.25), rotation=90)

    plt.xlabel('Human Body Temperature Distributions')

    plt.ylabel('human body temperature')

    plt.show()

    print("Average (Mu):" +str(mu) +"/ Standard Deviation:" +str(std))

    #Average(Mu): 98.24923076923076 / StandardDeviation: 0.7303577789050376

    # 2.1.确定指标进行正态检验

    x = observed_temperatures

    shapiro_test, shapiro_p = scipy.stats.shapiro(x)

    print("Shapiro-Wilk Stat:", shapiro_test, "Shapiro-Wilk p-Value:", shapiro_p)

    k2, p = scipy.stats.normaltest(observed_temperatures)

    print("k2:", k2, "p:", p)

    # 以上两种方法,p值大于0.05,认为正态分布

    # Another method to determining normality is through Quantile-Quantile Plots

    # 3.2 QQ图检查正态分布

    scipy.stats.probplot(observed_temperatures, dist='norm', plot=pylab)

    pylab.show()

    #Shapiro - WilkStat: 0.9865769743919373 Shapiro - Wilkp - Value: 0.2331680953502655

    #k2: 2.703801433319236 p: 0.2587479863488212

    # 另一种检测正态分布的方法

    def ecdf(data):

    # Compute ECDF

        n =len(data)

    x = np.sort(data)

    y = np.arange(1, n +1) / n

    return x, y

    # Compute empirical mean and standard deviation

    # Number of samples

    n =len(df['Temperature'])

    # Sample mean

    mu = np.mean(df['Temperature'])

    # Sample standard deviation

    std = np.std(df['Temperature'])

    print("Mean Temperature:", mu, "Standard deviation:", std)

    # 基于当前的均值和标准差,随机生成一个正态分布

    normalized_sample = np.random.normal(mu, std, size=10000)

    normalized_x, normalized_y = ecdf(normalized_sample)

    x_temperature, y_temperature = ecdf(df['Temperature'])

    # Plot the ECDFs

    fig = plt.figure(figsize=(8, 6))

    plt.plot(normalized_x, normalized_y)

    plt.plot(x_temperature, y_temperature, marker='.', linestyle='none')

    plt.xlabel('ECDF')

    plt.ylabel("Temperature")

    plt.legend(("Normal Distribution", "Sample data"))

    pylab.show()

    #Mean Temperature: 98.24923076923076 Standard deviation: 0.730357778905038

    #3.人体体温中存在的异常数据是哪些?

    percentile = np.percentile(df["Temperature"], [0, 25, 50, 75, 100])# 利用箱型图的四分位距来对数据进行异常的判断

    IQR = percentile[3] - percentile[1]

    up_limit = percentile[3] + IQR *1.5                                                                    # 上限设定为上四分位+1.5倍IQR(四分位距)距离

    down_limit = percentile[1] - IQR *1.5

    abnormal = df[(df["Temperature"] > up_limit) | (df["Temperature"] < down_limit)]

    print("依据箱型图测试异常数据为\n", abnormal)


    #4. 检验男女体温是否明显区别

    # 两独立样本t检验

    # H0:两样本没有明显差异,H1:有明显差异

    female_temperature = df.Temperature[df.Gender ==2]

    male_temperature = df.Temperature[df.Gender ==1]

    mean_female_temperature = female_temperature.mean()

    mean_male_temperature = male_temperature.mean()

    print("男体温均值:", mean_male_temperature, "女体温均值:", mean_female_temperature)

    # 两独立样本t检验

    t_stats, t_p_value = stats.ttest_ind(female_temperature, male_temperature, axis=0)

    print (t_p_value)

    if t_p_value<=0.05:

    print("异性之间在正常温度下存在明显差异")

    else:

    print("异性之间在正常温度不存在明显差异")

    # 由于p值0.024 < 0.05 ,拒绝原假设,我们有95%的自信度认为是有差异的

    #男体温均值:98.1046153846154 女体温均值: 98.39384615384616

    #Ttest_indResult(statistic=2.2854345381654984, pvalue=0.02393188312240236)


    #5.体温与心率间的相关性(强?弱?中等?)

    sorted_df = df[(df["Temperature"] <= up_limit) & (df["Temperature"] >= down_limit)]# 剔除上回所显示的异常数据

    pearson = sorted_df.corr()# 获取各个数据之间的相关性表

    temp_and_rate = pearson["Temperature"]["Heart Rate"]# 取人体温度与心率的系数结果

    if 0.8 < temp_and_rate <=1.0:# python中不存在switch-case语句

        print("人体的温度与心率具有相关性:极强")

    elif 0.6 < temp_and_rate <=0.8:

    print("人体的温度与心率具有相关性:强")

    elif 0.4 < temp_and_rate <=0.6:

    print("人体的温度与心率具有相关性:中等")

    elif 0.2 < temp_and_rate <=0.4:

    print("人体的温度与心率具有相关性:弱")

    elif 0 <= temp_and_rate <=0.2:

    print("人体的温度与心率具有相关性:极弱")


    其它打印结果:


    参考来源:

    https://blog.csdn.net/xzy53719/article/details/82851336

    https://blog.csdn.net/weixin_30772261/article/details/99810098

    相关文章

      网友评论

        本文标题:实践-python实现假设检验

        本文链接:https://www.haomeiwen.com/subject/kybgactx.html