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
