《python數據分析基礎》之描述性統計與建模


1、數據集

紅葡萄酒數據集:

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

紅葡萄酒文件中包含1599條觀測,白葡萄酒文件包含4898條觀測。輸入變量是葡萄酒的物理化學成分和特性,包括非揮發性酸、揮發性酸、檸檬酸、殘余糖分、氯化物、游離二氧化硫、總二氧化硫、密度、pH值、硫酸鹽和酒精含量。我們將兩個文件合並,並增加一列type變量,用於區分白葡萄酒和紅葡萄酒:

 

 2、描述性統計

#!/usr/bin/env python3
import pandas as pd

# 將數據集讀入到pandas數據框中,分隔符為逗號
f = open('F://python入門//數據1//紅葡萄酒和白葡萄酒//winequality-whole.csv')
#read_csv讀取時會自動識別表頭,數據有表頭時不能設置header為空(默認讀取第一行,即header=0);
#數據無表頭時,若不設置header,第一行數據會被視為表頭,應傳入names參數設置表頭名稱或設置header=None。
wine = pd.read_csv(f, sep=',', header=0)
#將標題行中的空格替換成下划線
wine.columns = wine.columns.str.replace(' ', '_')
#使用head函數檢查一下標題行和前五行數據
print('查看前五行數據:\n',wine.head())
# 顯示所有變量的描述性統計量,這些統計量包括:總數、均值、標准差、最小值、第25個百分位數、
#中位數、第75個百分位數和最大值
#標准差是一組數據平均值分散程度的一種度量。一個較大的標准差,代表大部分數值和其平均值之間差異較大。
print('描述性統計:\n',wine.describe())
#找出唯一值,即quality列中刪除重復值留下的數值
print('quality列去重后的值,從小到大輸出:\n',sorted(wine.quality.unique()))
# 計算值的頻率
print('每個唯一值在數據集中出現的次數:\n',wine.quality.value_counts())

結果:

查看前五行數據:
   type  fixed_acidity  volatile_acidity   ...     sulphates  alcohol  quality
0  red            7.4              0.70   ...          0.56      9.4        5
1  red            7.8              0.88   ...          0.68      9.8        5
2  red            7.8              0.76   ...          0.65      9.8        5
3  red           11.2              0.28   ...          0.58      9.8        6
4  red            7.4              0.70   ...          0.56      9.4        5

[5 rows x 13 columns]
描述性統計:
        fixed_acidity  volatile_acidity     ...           alcohol      quality
count    6497.000000       6497.000000     ...       6497.000000  6497.000000
mean        7.215307          0.339666     ...         10.491801     5.818378
std         1.296434          0.164636     ...          1.192712     0.873255
min         3.800000          0.080000     ...          8.000000     3.000000
25%         6.400000          0.230000     ...          9.500000     5.000000
50%         7.000000          0.290000     ...         10.300000     6.000000
75%         7.700000          0.400000     ...         11.300000     6.000000
max        15.900000          1.580000     ...         14.900000     9.000000

[8 rows x 12 columns]
quality列去重后的值,從小到大輸出:
 [3, 4, 5, 6, 7, 8, 9]
每個唯一值在數據集中出現的次數:
 6    2836
5    2138
7    1079
4     216
8     193
3      30
9       5
Name: quality, dtype: int64

 3、分組、直方圖和t檢驗

#!/usr/bin/env python3
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import statsmodels.api as sm
# 將數據集讀入到pandas數據框中,分隔符為逗號
f = open('F://python入門//數據1//紅葡萄酒和白葡萄酒//winequality-whole.csv')
#read_csv讀取時會自動識別表頭,數據有表頭時不能設置header為空(默認讀取第一行,即header=0);
#數據無表頭時,若不設置header,第一行數據會被視為表頭,應傳入names參數設置表頭名稱或設置header=None。
wine = pd.read_csv(f, sep=',', header=0)
#將標題行中的空格替換成下划線
wine.columns = wine.columns.str.replace(' ', '_')
#按照葡萄酒類型顯示質量的描述性統計量,分別打印紅葡萄酒和白葡萄酒的摘要統計量
print('分別打印紅葡萄酒和白葡萄酒的摘要統計量:\n',wine.groupby('type')[['quality']].describe())
#unstack函數將結果重新排列,使統計量顯示在並排的兩列中
print('分別打印紅葡萄酒和白葡萄酒的摘要統計量(結果重排列):\n',wine.groupby('type')[['quality']].describe().unstack('type'))
#按照葡萄酒類型顯示質量的特定分位數值,quantile函數對質量列計算第25百分位數和第75百分位數
print('分別計算第25百分位數和第75百分位數(結果重排列):\n',wine.groupby('type')[['quality']].quantile([0.25, 0.75]).unstack('type'))
#按照葡萄酒類型查看質量分布
red_wine = wine.loc[wine['type'] == 'red', 'quality']
white_wine = wine.loc[wine['type'] == 'white', 'quality']
#畫布背景色為暗色
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")
#設置x軸、y軸標簽
sns.utils.axlabel("Quality Score", "Density")
#設置圖標題
plt.title("Distribution of Quality by Wine Type")
#給圖像加上圖例
plt.legend()
#圖像顯示
plt.show()
#檢驗紅葡萄酒和白葡萄酒的平均質量是否有所不同,分組計算標准差
print('分組計算標准差:\n',wine.groupby(['type'])[['quality']].agg(['std']))
#t檢驗統計量為tstat,p值為pvalue,
#t檢驗主要用於樣本含量較小或兩樣本總體方差相等,總體標准差σ未知的正態分布。df為自由度
#T檢驗是用t分布理論來推論差異發生的概率,從而比較兩個平均數的差異是否顯著。
#P越小,越有理由說明兩者有差異,求出的p值如果小於5%,則拒絕原建設,即拒絕兩樣本均值不相等的假設
tstat, pvalue, df = sm.stats.ttest_ind(red_wine, white_wine)
print('t統計量為: %.3f;p值為: %.4f;自由度為:%.1f;' % (tstat, pvalue,df))

結果:

分別打印紅葡萄酒和白葡萄酒的摘要統計量:
       quality                                             
        count      mean       std  min  25%  50%  75%  max
type                                                      
red    1599.0  5.636023  0.807569  3.0  5.0  6.0  6.0  8.0
white  4898.0  5.877909  0.885639  3.0  5.0  6.0  6.0  9.0
分別打印紅葡萄酒和白葡萄酒的摘要統計量(結果重排列):
                 type 
quality  count  red      1599.000000
                white    4898.000000
         mean   red         5.636023
                white       5.877909
         std    red         0.807569
                white       0.885639
         min    red         3.000000
                white       3.000000
         25%    red         5.000000
                white       5.000000
         50%    red         6.000000
                white       6.000000
         75%    red         6.000000
                white       6.000000
         max    red         8.000000
                white       9.000000
dtype: float64
分別計算第25百分位數和第75百分位數(結果重排列):
      quality      
type     red white
0.25     5.0   5.0
0.75     6.0   6.0

 

 

分組計算標准差:
         quality
            std
type           
red    0.807569
white  0.885639
t統計量為: -9.686;p值為: 0.0000;自由度為:6495.0;

說明:該例使用t檢驗,判斷紅葡萄酒和白葡萄酒的平均評分是否有區別,結論是p<0.05,我們認為沒有區別。t值為負代表前面一組樣本的均值低於后面一組的均值,說明在統計意義上,白葡萄酒的平均質量評分大於紅葡萄酒的平均質量評分。

 4、成對變量之間的關系和相關性

#!/usr/bin/env python3
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 將數據集讀入到pandas數據框中,分隔符為逗號
f = open('F://python入門//數據1//紅葡萄酒和白葡萄酒//winequality-whole.csv')
#read_csv讀取時會自動識別表頭,數據有表頭時不能設置header為空(默認讀取第一行,即header=0);
#數據無表頭時,若不設置header,第一行數據會被視為表頭,應傳入names參數設置表頭名稱或設置header=None。
wine = pd.read_csv(f, sep=',', header=0)
#將標題行中的空格替換成下划線
wine.columns = wine.columns.str.replace(' ', '_')
# 計算所有變量兩兩之間的相關性矩陣
print('所有變量兩兩之間的相關性矩陣:\n',wine.corr())
# 從紅葡萄酒和白葡萄酒的數據中取出一個“小”樣本來進行繪圖,抽取在統計圖中使用的樣本點
#np.random.choice是從data_frame中隨機選擇200個,replace代表的意思是抽樣之后還放不放回去,
#如果是False的話,那么出來的三個數都不一樣,如果是True的話,有可能會出現重復的,因為前面的抽的放回去了。
def take_sample(data_frame, replace=False, n=200):
    return data_frame.loc[np.random.choice(data_frame.index, replace=replace, size=n)]
#從紅酒數據集中抽取200個樣本
reds_sample = take_sample(wine.loc[wine['type'] == 'red', :])
#從白酒數據集中抽取200個樣本
whites_sample = take_sample(wine.loc[wine['type'] == 'white', :])
#將400個樣本放在一起組成新樣本集
wine_sample = pd.concat([reds_sample, whites_sample])
#對總的數據集添加一列'in_sample',填充依據是此行的索引值是否在抽樣數據的索引值中,如果在則置為1,否則置為0
wine['in_sample'] = np.where(wine.index.isin(wine_sample.index), 1., 0.)
#crosstab交叉列表取值,第一個參數是列, 第二個參數是行. 還可以添加第三個參數,類似Excel中的透視表功能
print('樣本與總數據集的統計:\n',pd.crosstab(wine.in_sample, wine.type, margins=True))
#seaborn的pairplot函數可以創建一個統計圖矩陣,主對角線上的圖以直方圖或密度圖的形式顯示了每個變量的單變量分布。
#對角線之外的圖以散點圖的形式顯示了每兩個變量之間的雙變量分布,散點圖中可以有回歸直線,也可以沒有
#設置背景色為暗色
sns.set_style("dark")
#第一個參數是完整數據集wine_sample,kind為可選圖樣,kind="reg"為使用回歸,hue : 使用指定變量為分類變量畫圖
#diag_kind='hist'對角子圖的圖樣,柱狀圖,palette使用調色板,markers點使用不同的形狀,
#vars要使用的數據中的變量
g = sns.pairplot(wine_sample, kind='reg', plot_kws={"ci": False, "x_jitter": 0.25, "y_jitter": 0.25}, hue='type',
                 diag_kind='hist', diag_kws={"bins": 10, "alpha": 1.0}, palette=dict(red="red", white="white"),
                 markers=["o", "s"], vars=['quality', 'alcohol', 'residual_sugar'])
#添加標題,fontsize=14字體大小,horizontalalignment='center'文字居中,verticalalignment='top'頂部對齊
plt.suptitle('Histograms and Scatter Plots of Quality, Alcohol, and Residual Sugar', fontsize=14,
             horizontalalignment='center', verticalalignment='top', x=0.5, y=0.999)
#顯示圖像
plt.show()

結果:

所有變量兩兩之間的相關性矩陣:
                       fixed_acidity    ...      quality
fixed_acidity              1.000000    ...    -0.076743
volatile_acidity           0.219008    ...    -0.265699
citric_acid                0.324436    ...     0.085532
residual_sugar            -0.111981    ...    -0.036980
chlorides                  0.298195    ...    -0.200666
free_sulfur_dioxide       -0.282735    ...     0.055463
total_sulfur_dioxide      -0.329054    ...    -0.041385
density                    0.458910    ...    -0.305858
pH                        -0.252700    ...     0.019506
sulphates                  0.299568    ...     0.038485
alcohol                   -0.095452    ...     0.444319
quality                   -0.076743    ...     1.000000

[12 rows x 12 columns]
樣本與總數據集的統計:
 type        red  white   All
in_sample                   
0.0        1399   4698  6097
1.0         200    200   400
All        1599   4898  6497

說明:

  根據相關系數的符號,從輸出中可以知道酒精含量、硫酸鹽、pH值、游離二氧化硫和檸檬酸這些指標與質量是正相關的,相反,非揮發性酸、揮發性酸、殘余糖分、氯化物、總二氧化硫和密度這些指標與質量是負相關的。
  從統計圖中可以看出,對於紅葡萄酒和白葡萄酒來說,酒精含量的均值和標准差是大致相同的,但是,白葡萄酒殘余糖分的均值和標准差卻大於紅葡萄酒殘余糖分的均值和標准差。從回歸直線可以看出,對於兩種類型的葡萄酒,酒精含量增加時,質量評分也隨之提高,相反,殘余糖分增加時,白葡萄酒質量評分則隨之降低。

5、使用最小二乘法估計進行線性回歸

#!/usr/bin/env python3
import pandas as pd
#import statsmodels.api as sm
from statsmodels.formula.api import ols, glm
# 將數據集讀入到pandas數據框中,分隔符為逗號
f = open('F://python入門//數據1//紅葡萄酒和白葡萄酒//winequality-whole.csv')
#read_csv讀取時會自動識別表頭,數據有表頭時不能設置header為空(默認讀取第一行,即header=0);
#數據無表頭時,若不設置header,第一行數據會被視為表頭,應傳入names參數設置表頭名稱或設置header=None。
wine = pd.read_csv(f, sep=',', header=0)
#將標題行中的空格替換成下划線
wine.columns = wine.columns.str.replace(' ', '_')
#將一個字符串賦給變量my_formula,~左側的變量quality是因變量,波浪線右側的變量是自變量
my_formula = 'quality ~ alcohol + chlorides + citric_acid + density +fixed_acidity + free_sulfur_dioxide + pH' \
             '+ residual_sugar + sulphates + total_sulfur_dioxide + volatile_acidity'
#使用公式和數據擬合一個普通最小二乘法模型,並將結果賦值給lm
lm = ols(my_formula, data=wine).fit()
# 或者,也可以使用廣義線性模型(glm)語法進行線性回歸
#lm = glm(my_formula, data=wine, family=sm.families.Gaussian()).fit()
#打印結果的摘要信息,包含了模型系數,系數的標准差,修正R^2,F統計量等信息
print('摘要:\n',lm.summary())
print('………………')
#打印出一個列表,包含模型對象lm的所有信息
print("打印出一個列表,包含模型對象lm的所有信息:\n%s" % dir(lm))
#打印模型的系數
print("模型的系數:\n%s" % lm.params)
#系數的標准差
print("模型系數的標准差:\n%s" % lm.bse)
#修正的R^2
print("修正的R^2:%.2f" % lm.rsquared_adj)
#F統計量和它的P值
print("F統計量: %.1f,和它的P值: %.2f" % (lm.fvalue, lm.f_pvalue))
#模型的擬合值
print("觀測總數: %d,擬合值的數量: %d" % (lm.nobs, len(lm.fittedvalues)))

結果:

摘要:
                             OLS Regression Results                            
==============================================================================
Dep. Variable:                quality   R-squared:                       0.292
Model:                            OLS   Adj. R-squared:                  0.291
Method:                 Least Squares   F-statistic:                     243.3
Date:                Sat, 18 Apr 2020   Prob (F-statistic):               0.00
Time:                        23:01:26   Log-Likelihood:                -7215.5
No. Observations:                6497   AIC:                         1.445e+04
Df Residuals:                    6485   BIC:                         1.454e+04
Df Model:                          11                                         
Covariance Type:            nonrobust                                         
========================================================================================
                           coef    std err          t      P>|t|      [0.025      0.975]
----------------------------------------------------------------------------------------
Intercept               55.7627     11.894      4.688      0.000      32.447      79.079
alcohol                  0.2670      0.017     15.963      0.000       0.234       0.300
chlorides               -0.4837      0.333     -1.454      0.146      -1.136       0.168
citric_acid             -0.1097      0.080     -1.377      0.168      -0.266       0.046
density                -54.9669     12.137     -4.529      0.000     -78.760     -31.173
fixed_acidity            0.0677      0.016      4.346      0.000       0.037       0.098
free_sulfur_dioxide      0.0060      0.001      7.948      0.000       0.004       0.007
pH                       0.4393      0.090      4.861      0.000       0.262       0.616
residual_sugar           0.0436      0.005      8.449      0.000       0.033       0.054
sulphates                0.7683      0.076     10.092      0.000       0.619       0.917
total_sulfur_dioxide    -0.0025      0.000     -8.969      0.000      -0.003      -0.002
volatile_acidity        -1.3279      0.077    -17.162      0.000      -1.480      -1.176
==============================================================================
Omnibus:                      144.075   Durbin-Watson:                   1.646
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              324.712
Skew:                          -0.006   Prob(JB):                     3.09e-71
Kurtosis:                       4.095   Cond. No.                     2.49e+05
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
[2] The condition number is large, 2.49e+05. This might indicate that there are
strong multicollinearity or other numerical problems.
………………
打印出一個列表,包含模型對象lm的所有信息:
['HC0_se', 'HC1_se', 'HC2_se', 'HC3_se', '_HCCM', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_cache', '_data_attr', '_get_robustcov_results', '_is_nested', '_wexog_singular_values', 'aic', 'bic', 'bse', 'centered_tss', 'compare_f_test', 'compare_lm_test', 'compare_lr_test', 'condition_number', 'conf_int', 'conf_int_el', 'cov_HC0', 'cov_HC1', 'cov_HC2', 'cov_HC3', 'cov_kwds', 'cov_params', 'cov_type', 'df_model', 'df_resid', 'diagn', 'eigenvals', 'el_test', 'ess', 'f_pvalue', 'f_test', 'fittedvalues', 'fvalue', 'get_influence', 'get_prediction', 'get_robustcov_results', 'initialize', 'k_constant', 'llf', 'load', 'model', 'mse_model', 'mse_resid', 'mse_total', 'nobs', 'normalized_cov_params', 'outlier_test', 'params', 'predict', 'pvalues', 'remove_data', 'resid', 'resid_pearson', 'rsquared', 'rsquared_adj', 'save', 'scale', 'ssr', 'summary', 'summary2', 't_test', 't_test_pairwise', 'tvalues', 'uncentered_tss', 'use_t', 'wald_test', 'wald_test_terms', 'wresid']
模型的系數:
Intercept               55.762750
alcohol                  0.267030
chlorides               -0.483714
citric_acid             -0.109657
density                -54.966942
fixed_acidity            0.067684
free_sulfur_dioxide      0.005970
pH                       0.439296
residual_sugar           0.043559
sulphates                0.768252
total_sulfur_dioxide    -0.002481
volatile_acidity        -1.327892
dtype: float64
模型系數的標准差:
Intercept               11.893899
alcohol                  0.016728
chlorides                0.332683
citric_acid              0.079619
density                 12.137473
fixed_acidity            0.015573
free_sulfur_dioxide      0.000751
pH                       0.090371
residual_sugar           0.005156
sulphates                0.076123
total_sulfur_dioxide     0.000277
volatile_acidity         0.077373
dtype: float64
修正的R^2:0.29
F統計量: 243.3,和它的P值: 0.00
觀測總數: 6497,擬合值的數量: 6497

 說明,這里就最小二乘法的擬合結果做一個結果分析,R是相關系數,R^2是相關系數的平方,又稱判定系數,判定線性回歸的擬合程度,用來說明用自變量解釋因變量變異的程度(所占比例)。調整后的判定系數,用來估計標准誤差,R^2衡量方程擬合優度,R^2越大越好,一般的,大於0.8說明方程對樣本點的擬合效果很好,0.5~0.8之間也可以接受,時間序列的話,R^2很容易達到很大,如果是截面數據,R^2要求沒那么嚴格,但要注意的是,R^2統計量不是檢驗的統計量,只衡量顯著性。F值(F-statistic)為243.3,顯著性概率(Prob (F-statistic))為0.00,表明回歸極顯著。F是檢驗方程顯著性的統計量,是平均的回歸平方和與平均剩余平方和之比,越大越好。前面提到的t統計量對應的概率值(tstat, pvalue, df)中pvalue的值為0.0000,要求小於給定的顯著性水平(一般是0.05,0.01等),pvalue越接近0越好,如果0.01<pvalue<0.05,則為差異顯著,如果pvalue<0.01,則為差異極顯著。

 擬合方程:

y=55.762750+0.267030x1-0.483714x2-0.109657x3-54.966942x4+0.067684x5+0.005970x6+0.439296x7+0.043559x8+0.768252x9-0.002481x10-1.327892x11

Intercept為截距項。截距系數沒有具體意義。

模型自變量系數的意義:在其他自變量保持不變的情況下,這個自變量發生1個單位的變化時,導致葡萄酒質量評分發生的平均變化。例如,酒精含量系數的含義就是,從平均意義上來說,如果兩種葡萄酒其他自變量的值都相同,那么酒精含量高一個單位的葡萄酒的質量評分就要比另一種葡萄酒的質量評分高出0.27分。

6、自變量標准化

#!/usr/bin/env python3
import pandas as pd
from statsmodels.formula.api import ols, glm
# 將數據集讀入到pandas數據框中,分隔符為逗號
f = open('F://python入門//數據1//紅葡萄酒和白葡萄酒//winequality-whole.csv')
#read_csv讀取時會自動識別表頭,數據有表頭時不能設置header為空(默認讀取第一行,即header=0);
#數據無表頭時,若不設置header,第一行數據會被視為表頭,應傳入names參數設置表頭名稱或設置header=None。
wine = pd.read_csv(f, sep=',', header=0)
#將標題行中的空格替換成下划線
wine.columns = wine.columns.str.replace(' ', '_')
#將一個字符串賦給變量my_formula,~左側的變量quality是因變量,波浪線右側的變量是自變量
my_formula = 'quality ~ alcohol + chlorides + citric_acid + density +fixed_acidity + free_sulfur_dioxide + pH' \
             '+ residual_sugar + sulphates + total_sulfur_dioxide + volatile_acidity'
# 創建一個名為dependent_variable的序列來保存質量數據
dependent_variable = wine['quality']
# 創建一個名為independent_variables的數據框來保存初始的葡萄酒數據集中除quality、type和in_sample之外的所有變量
#s.difference(t)返回在集合s中但不在t中的元素
independent_variables = wine[wine.columns.difference(['quality', 'type', 'in_sample'])]
# 對自變量進行標准化
# 對每個變量,在每個觀測中減去變量的均值
# 並且使用結果除以變量的標准差(最大值-最小值)
independent_variables_standardized = (independent_variables
                                      - independent_variables.mean()) / independent_variables.std()
# 將因變量quality作為一列添加到自變量數據框中
# 創建一個帶有標准化自變量的新數據集,當axis=1時,是在行上進行操作
wine_standardized = pd.concat([dependent_variable, independent_variables_standardized], axis=1)
# 重新進行線性回歸,並查看一下摘要統計
lm_standardized = ols(my_formula, data=wine_standardized).fit()
#查看摘要統計信息
print(lm_standardized.summary())

結果:

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                quality   R-squared:                       0.292
Model:                            OLS   Adj. R-squared:                  0.291
Method:                 Least Squares   F-statistic:                     243.3
Date:                Sun, 19 Apr 2020   Prob (F-statistic):               0.00
Time:                        11:04:39   Log-Likelihood:                -7215.5
No. Observations:                6497   AIC:                         1.445e+04
Df Residuals:                    6485   BIC:                         1.454e+04
Df Model:                          11                                         
Covariance Type:            nonrobust                                         
========================================================================================
                           coef    std err          t      P>|t|      [0.025      0.975]
----------------------------------------------------------------------------------------
Intercept                5.8184      0.009    637.785      0.000       5.800       5.836
alcohol                  0.3185      0.020     15.963      0.000       0.279       0.358
chlorides               -0.0169      0.012     -1.454      0.146      -0.040       0.006
citric_acid             -0.0159      0.012     -1.377      0.168      -0.039       0.007
density                 -0.1648      0.036     -4.529      0.000      -0.236      -0.093
fixed_acidity            0.0877      0.020      4.346      0.000       0.048       0.127
free_sulfur_dioxide      0.1060      0.013      7.948      0.000       0.080       0.132
pH                       0.0706      0.015      4.861      0.000       0.042       0.099
residual_sugar           0.2072      0.025      8.449      0.000       0.159       0.255
sulphates                0.1143      0.011     10.092      0.000       0.092       0.137
total_sulfur_dioxide    -0.1402      0.016     -8.969      0.000      -0.171      -0.110
volatile_acidity        -0.2186      0.013    -17.162      0.000      -0.244      -0.194
==============================================================================
Omnibus:                      144.075   Durbin-Watson:                   1.646
Prob(Omnibus):                  0.000   Jarque-Bera (JB):              324.712
Skew:                          -0.006   Prob(JB):                     3.09e-71
Kurtosis:                       4.095   Cond. No.                         9.61
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

  說明,關於這個模型,普通最小二乘回歸是通過使殘差平方和最小化來估計未知的β參數值的,這里的殘差是指自變量觀測值與擬合值之間的差別。因為殘差大小是依賴於自變量的測量單位的,所以如果自變量的測量單位相差很大的話,那么將自變量標准化后,就可以更容易對模型進行解釋了。對自變量進行標准化的方法是,先從自變量的每個觀測值中減去均值,然后再除以這個自變量的標准差。自變量標准化完成以后,它的均值為0,標准差為1。

  自變量標准化會改變對模型系數的解釋。現在每個自變量系數的含義是,不同的葡萄酒在其他自變量均相同的情況下,某個自變量相差1個標准差,會使葡萄酒的質量評分平均相差多少個標准差。舉個例子,酒精含量的系數意義是,從平均意義上說,如果兩種葡萄酒其他自變量的值都相同,那么酒精含量高1個標准差的葡萄酒的質量評分就要比另一種葡萄酒的質量評分高出0.32個標准差。自變量標准化同樣會改變對截距的解釋。當解釋變量被標准化后,截距表示的就是當所有自變量取值為均值時因變量的均值。

7、預測

#!/usr/bin/env python3
import pandas as pd
from statsmodels.formula.api import ols, glm
# 將數據集讀入到pandas數據框中,分隔符為逗號
f = open('F://python入門//數據1//紅葡萄酒和白葡萄酒//winequality-whole.csv')
#read_csv讀取時會自動識別表頭,數據有表頭時不能設置header為空(默認讀取第一行,即header=0);
#數據無表頭時,若不設置header,第一行數據會被視為表頭,應傳入names參數設置表頭名稱或設置header=None。
wine = pd.read_csv(f, sep=',', header=0)
#將標題行中的空格替換成下划線
wine.columns = wine.columns.str.replace(' ', '_')
#將一個字符串賦給變量my_formula,~左側的變量quality是因變量,波浪線右側的變量是自變量
my_formula = 'quality ~ alcohol + chlorides + citric_acid + density +fixed_acidity + free_sulfur_dioxide + pH' \
             '+ residual_sugar + sulphates + total_sulfur_dioxide + volatile_acidity'
#使用公式和數據擬合一個普通最小二乘法模型,並將結果賦值給lm
lm = ols(my_formula, data=wine).fit()
#創建一個名為dependent_variable的序列來保存質量數據
dependent_variable = wine['quality']
#創建一個名為independent_variables的數據框來保存初始的葡萄酒數據集中除quality、type和in_sample之外的所有變量
#s.difference(t)返回在集合s中但不在t中的元素
independent_variables = wine[wine.columns.difference(['quality', 'type', 'in_sample'])]
#使用葡萄酒數據集中的前10個觀測創建10個“新”觀測,新觀測中只包含模型中使用的自變量
#說明,這里使用已經用於擬合的數據,僅出於方便和演示的目的
#isin()函數,首先判斷對應的index是否存在,如果不存在則全部為false,存在則為true
new_observations = wine.loc[wine.index.isin(range(10)), independent_variables.columns]
#基於新觀測中的葡萄酒特性預測質量評分
y_predicted = lm.predict(new_observations)
# 將真實值和預測值保留兩位小數並打印到屏幕上
for each in range(10):
    print('真實值為:',round(dependent_variable[each],2),'\t預測值為:',round(y_predicted[each],2))

結果:

真實值為: 5         預測值為: 5.0
真實值為: 5         預測值為: 4.92
真實值為: 5         預測值為: 5.03
真實值為: 6         預測值為: 5.68
真實值為: 5         預測值為: 5.0
真實值為: 5         預測值為: 5.04
真實值為: 5         預測值為: 5.02
真實值為: 7         預測值為: 5.3
真實值為: 7         預測值為: 5.24
真實值為: 5         預測值為: 5.69

 

 

 

 


原文鏈接:https://blog.csdn.net/qq_45554010/article/details/104537309

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM