美文网首页
案例:使用线性回归预测葡萄酒质量

案例:使用线性回归预测葡萄酒质量

作者: carmanzzz | 来源:发表于2019-04-02 15:42 被阅读0次

    这也是一个经典的描述性统计与建模的小案例了,主要用到pandas进行数据处理,用statsmodels进行统计建模。

    数据来源:

    红葡萄酒(http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv
    白葡萄酒(http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-white.csv
    将这两个数据表合并成为一个新的数据集wine,然后统一处理,代码如下:

    import numpy as np
    import numpy as np
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    import statsmodels.api as sm
    import statsmodels.formula.api as smf
    from statsmodels.formula.api import ols, glm
    

    合并文件

    filepath1 = 'C:/Users/Carman/Downloads/winequality-red.csv'
    filepath2 = 'C:/Users/Carman/Downloads/winequality-white.csv'
    red = pd.read_csv(filepath1,sep = ';')
    white = pd.read_csv(filepath2,sep = ';')
    red['type'] = 'red'   # 新增type一栏用于之后进行不同葡萄酒的品种对比
    white['type'] = 'white'
    wine = red.append(white).reset_index(drop = True)
    wine.columns = wine.columns.str.replace(' ','_')
    

    按照葡萄酒类型显示质量的描述性统计

    wine.groupby('type')['quality'].describe().unstack('type')
    
    image.png

    用seaborn画一下两种类型葡萄酒评分分布的密度直方图,从统计图可以看出,两种葡萄酒的评分都近似正态分布。

    sns.set_style("dark")
    sns.distplot(red_wine,norm_hist=True, kde=False, color="red", label="Red wine")
    sns.distplot(white_wine,norm_hist=True, kde=False, color="white", label="White wine")
    plt.title("Distribution of Quality by Wine Type")
    plt.legend()
    plt.show()
    
    image.png

    然后可以用t检验判断红葡萄酒和白葡萄酒的平均评分是否有区别。
    ps:t检验是用于小样本的两个平均值差异程度的检验方法。它是用T分布理论来推断差异发生的概率,从而判定两个平均数的差异是否显著。(上学期看的统计学的书又忘光了~~)

    # 检验红葡萄酒和白葡萄酒的平均质量是否有所不同
    print(wine.groupby(['type'])[['quality']].std())
    tstat, pvalue, df = sm.stats.ttest_ind(white_wine,red_wine)
    print('\ntstat: %.3f pvalue: %.4f' % (tstat, pvalue))
    
    image.png

    t 检验统计量为 9.69,p 值为 0.00,这说明白葡萄酒的平均质量评分在统计意义上大于红葡萄酒的平均质量评分。

    成对变量之间的关系和相关性

    ##计算所有变量的相关矩阵
    print(wine.corr())
    

    corr 函数可以计算出数据集中所有变量两两之间的线性相关性。根据相关系数的符号,从输出中可以知道酒精含量、硫酸盐、pH 值、游离二氧化硫和柠檬酸这些指标与质量是正相关的,相反,非挥发性酸、挥发性酸、残余糖分、氯化物、总二氧化硫和密度这些指标与质量是负相关的。

    用statsmodel 包来进行线性回归

    my_formula = 'quality~alcohol + chlorides + citric_acid + density\
    + fixed_acidity + free_sulfur_dioxide + pH + residual_sugar + sulphates\
    + total_sulfur_dioxide + volatile_acidity'
    lm = ols(my_formula, data=wine).fit()
    

    第一行代码将一个字符串赋给变量 my_foumula,有点R 语言语法的回归公式定义。波浪线左侧的变量 quality 是因变量,波浪线右侧的变量是自变量。
    输出看一下结果:

    print(lm.summary())
    

    打印出了模型结果的摘要信息,包括模型系数、系数的标准差和置信区间、修正 R 方、F 统计量等等信息。

    做预测

    对数据进行线性回归的建模之后就可以根据给出的自变量特征值做预测了,这里方便起见我们随机选取一些已经拟合过的数据

    new_observations = wine.sample(20)
    new_observations=new_observations[new_observations.columns.difference(['quality', 'type'])]
    y_test = new_observations1.quality
    
    # 基于新观测中的葡萄酒特性预测质量评分
    y_predicted = lm.predict(new_observations1)
    # 将预测值保留两位小数并打印到屏幕上
    y_predicted_rounded = [round(score, 2) for score in y_predicted]
    print(y_predicted_rounded)
    

    对于准确性的检验本来想用 accuracy_score,但是可能因为预测的quality有小数位数的原因报错,将小数四舍五入成整数之后倒是可以用,不过最终结果只有0.4。

    相关文章

      网友评论

          本文标题:案例:使用线性回归预测葡萄酒质量

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