[機器學習筆記] 用Python分析:紅葡萄酒質量分析(數據探索)

用Python分析:紅葡萄酒質量分析(數據探索)

數據集:winemag-data_first150k.csv

先來導入數據

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
# 將數據集讀入到pandas數據框中
wine = pd.read_csv('C:\\Machine-Learning-with-Python-master\\data\\winemag-data_first150k.csv', sep=',', header=0)
wine.columns = wine.columns.str.replace(' ', '_')
print(wine.head())

 

查看數據集的行和列信息

#查看數據集行列數
print("該數據集共有 {} 行 {} 列".format(wine.shape[0],wine.shape[1])) 
wine.columns

解釋一下列的含義:

列名 含義
country 葡萄酒來自的國家
description 描述葡萄酒的味道、氣味、外觀、感覺等
designation 釀酒廠內的葡萄園,釀造葡萄酒的葡萄來自葡萄園
points Wine Enthusiast 對葡萄酒的評分爲 1-100 (儘管他們說他們只對評分>=80的葡萄酒發表評論)
price 一瓶葡萄酒的成本
province 葡萄酒來自的產地
region_1 葡萄酒來自的產地
region_2 葡萄酒來自的產地
variety 用於釀造葡萄酒的葡萄種類
winery 生產葡萄酒的釀酒廠

顯示數據集中的記錄

 

檢查數據集中列信息的空值

 

 各個Column內容的描述性統計

 

關注 price  的描述性統計信息

wine['province'].value_counts().head(10).plot.bar()

 

從上圖中可以看出California的產量遠遠高於世界其他省份的產量,我們可能會問,California葡萄酒佔總葡萄酒的百分比是多少?這個柱形圖告訴我們絕對值,但知道相對比例更有用。

從上圖可以得知California出產的葡萄酒幾乎佔葡萄酒雜誌評論的三分之一。
柱形圖非常靈活:高度可以表示任何東西,只要它是一個數字。每個欄可以代表任何東西,只要它是一個分類。
上例的中省份分類是一個定類數據(沒有內在固有大小或高低順序),還有一種分類數據是定序數據,它相對於定類數據類型來說存在一種程度有序現象,例如下例中葡萄酒不同評分的評論數量。

 從上圖可看到,每個葡萄酒的總分都在80到100分之間。有20個分數值類別,柱狀圖剛好可以完全展示這些值。如果評分是0-100呢?恐怕無法完全展示每個類別的情況,這時,我們需要使用折線圖。

使用面積圖

當只繪製一個變量時,面積圖和折線圖之間的區別主要是可視化的。在這種情況下,它們可以互換使用。

 

每個樣本都有得分從1到10的質量評分,以及若干理化檢驗的結果

 

直方圖是用一系列等寬不等高的長方形來繪製,寬度表示數據的範圍間隔,高度表示頻數或者頻率。
查看葡萄酒價格分佈

 

 

從上圖看價格主要分佈在0~200,由於高位價格偏差,導致價格區間過大,看不出問題。 

len(wine[wine['price'] > 200])/len(wine)

 

通過計算,發現價格在200以上的佔比只有 0.005,可以忽略,處理一下數據偏差,重新查看price<200時的價格數量分佈

 

 

 

 

 

 

 

 

 

 

 

 

 

這圖似乎過於普通,圖表標題也沒有,x軸上標籤字號也有點小,下面我們來改造一下。

 

調整之後,比我們開始的時候更清晰,能更好地把分析結果傳達給讀者,下面逐一說明一下參數。
1.圖表大小,使用figsize(width, height)參數 figsize=(10, 5)
2.修改顏色 ,使用 color 參數 color='mediumvioletred'取值表見文末鏈接
3.設置標籤文字大小 ,使用fontsize參數 fontsize=16
4.設置標題和大小 plot.bar(title='xxx')
但是標題文字大小的設置,pandas沒有給出設置參數。在底層,panda數據可視化工具是基與matplotlib的,這裏可以藉助matplotlib的 set_title函數實現

ax = xxx.plot.bar()
ax.set_title('title', fontsize=20)

變量ax 是一個AxesSubplot對象。
5.去掉圖表黑色邊框
sns.despine(bottom=True, left=True)
這裏引入一個新的庫seaborn ,後續會專門介紹。
6.圖形完整顯示,有時候圖表標籤會被遮擋
plt.tight_layout()僅僅檢查座標軸標籤、刻度標籤以及標題的部分。
7.帶中文的圖表需要設置字體,本文中未使用,特單獨說明

import matplotlib
font = {
    'family': 'SimHei'
}
matplotlib.rc('font', **font)

散點圖是以一個變量爲橫座標,另一個變量爲縱座標,利用散點(座標點)的分佈形態反映變量關係的一種圖形。
下面查看一下葡萄酒價格和評分之間的關係:

看到圖中全是點,基本看不出來葡萄酒價格和評分之間的關係。由於散點圖不能有效的處理映射相同位置的點,爲了更好的表示兩者之間的關係,我們需要對數據進行抽樣,抽取100個點重新進行展示:

 

從上圖可以看出價格更高的葡萄酒在評論時會獲得更高的評分。由此可見散點圖對於相對較小的數據集和具有大量惟一值的變量最有效。
處理多重複數據點導致的覆蓋繪製,除了抽樣數據,還可以使用Hexplot。

六邊形圖將空間中的點聚合成六邊形,然後根據六邊形內部的值爲這些六邊形上色。

wine[wine['price'] < 100].plot.hexbin(x='price', y='points', gridsize=15)

有測試price<200 的情況,發現圖形集中在0-100價格區間(此處未展示圖片),故調整過濾條件爲price<100。

從上圖中,看到了散點圖未告知的信息,我們可以看到葡萄酒雜誌上評論的葡萄酒的價格集中在87.5分左右,在20美元左右。

堆積圖是一種把變量一個放在另一個上面的圖表。
回顧一下上一篇文章中的單變量柱形圖,這裏可以簡單使用一個stacked 參數,達到多個柱形的疊加。
原文是引入新的數據集,這裏我們在源數據上進行一下處理,獲得top5葡萄酒不同評價分數的次數數據:

#top5酒廠
winery = wine['winery'].value_counts().head(5)
wine_counts = pd.DataFrame({'points': range(80, 101)})
for name in winery.index:
    winery_grouped = wine[wine['winery'] == name]
    points_series = winery_grouped['points'].value_counts().sort_index()
    df = pd.DataFrame({'points': points_series.index, name: list(points_series)})
    wine_counts = wine_counts.merge(df, on='points',how='left').fillna(0)
wine_counts.set_index('points', inplace=True)

 

wine_counts.plot.bar(stacked=True)

堆積條形圖具有單變量條形圖的優點和缺點。它們最適用於定類數據或少量定序數據。
另一個簡單的例子是堆積面積圖。

wine_counts.plot.area()

 

與單變量面積圖一樣,多變量面積適用於展示定類數據或區間數據。
堆積圖在視覺上非常漂亮。但是它們有兩個主要侷限性。
第一個侷限性: 堆積圖的第二個變量必須是一個可能值數量非常有限的變量。8有時被稱爲建議的上限。有許多數據集字段不符合這個準則,需要進一步進行數據處理。
第二個侷限性:可讀性差,難以區分具體的值。例如,看上面的圖,你能告訴我在得分值爲87.5的時候,哪一種葡萄酒得分更高:Testarossa(橙色),williams(藍色),還是DFJ(綠色)? 這真的很難講!

Bivariate line chart 多變量折線圖

wine_counts.plot.line()

這種方式使用折線圖彌補了堆積圖可讀性的侷限。在這個圖表中,我們可以很容易地回答上一個例子中的問題:分值爲87.5的時候,哪一種葡萄酒得分更高?我們可以看到Columbia Crest最高。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章