想要製作漂亮的視覺化圖表嗎?Kaggle 平臺上有一個資料視覺化的微課程,總時長才 4 小時。快來學習吧!
課程地址:https://www.kaggle.com/learn/data-visualization-from-non-coder-to-coder
課程簡介
該課程為免費課程,共包含 15 節課,時長 4 小時。主講人 Alexis Cook 曾就讀於杜克大學、密歇根大學和布朗大學,在多個線上學習平臺(如 Udacity 和 DataCamp)教授資料科學。
這門課程使用的資料視覺化工具是 Seaborn,所以學員需要稍微瞭解如何寫 Python 程式碼。不過沒有任何程式設計經驗的人也可以通過該課程學會資料視覺化,正如課程名稱那樣:Data Visualization: from Non-Coder to Coder,透過資料視覺化見證程式設計的魅力。
該課程包含 15 節課,分為課程講解和練習兩類,每一堂講解課後都有一節練習課,讓學員及時鞏固和應用所學知識。
課程涉及對資料視覺化工具 Seaborn 的介紹,如何繪製折線圖、柱狀圖、熱圖、散點圖、分佈圖,如何選擇圖表型別和自定義樣式,課程期末專案,以及如何舉一反三為自己的專案建立 notebook。課程目錄如下所示:
下面,我們將選取其中一節課——散點圖(Scatter Plots)進行簡單介紹。
如何建立高階散點圖
點進去你會在左側看到這節課的大致內容,如下圖所示,「散點圖」共包含五個部分:
btw,眼尖的讀者會發現,下面還有一個 comments 版塊。所以,該課程還是互動式的呢,你可以邊學習邊評論。
通過這節課,你將學習如何建立高階的散點圖。
設定 notebook
首先,我們要設定編碼環境。
輸入:
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
print("Setup Complete")
輸出:
Setup Complete
載入和檢查資料
我們將使用一個保險費用(合成)資料集,目的是瞭解為什麼有些客戶需要比其他人支付得更多。資料集地址:https://www.kaggle.com/mirichoi0218/insurance/home
輸入:
# Path of the file to read
insurance_filepath = "../input/insurance.csv"
# Read the file into a variable
insurance_datainsurance_data = pd.read_csv(insurance_filepath)
列印前五行,以檢查資料集是否正確載入。
輸入:
insurance_data.head()
輸出:
散點圖
為了建立簡單的散點圖,我們使用 sns.scatterplot 命令並指定以下值:
水平 x 軸(x=insurance_data['bmi'])
垂直 y 軸(y=insurance_data['charges'])
輸入:
sns.scatterplot(x=insurance_data['bmi'], y=insurance_data['charges'])
輸出:
<matplotlib.axes._subplots.AxesSubplot at 0x7f4d146c3dd8>
上面的散點圖表明身體質量指數(BMI)和保險費用是正相關的,BMI 指數更高的客戶通常需要支付更多的保險費用。(這也不難理解,高 BMI 指數通常意味著更高的慢性病風險。)
如果要再次檢查這種關係的強度,你可能需要新增一條迴歸線,或者最擬合資料的線。我們通過將該命令更改為 sns.regplot 來實現這一點。
輸入:
sns.regplot(x=insurance_data['bmi'], y=insurance_data['charges'])
輸出:
/opt/conda/lib/python3.6/site-packages/scipy/stats/stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval
<matplotlib.axes._subplots.AxesSubplot at 0x7f4d10de8748>
著色散點圖
我們可以使用散點圖展示三個變數之間的關係,實現方式就是給資料點著色。
例如,為了瞭解吸菸對 BMI 和保險費用之間關係的影響,我們可以給資料點 'smoker' 進行著色編碼,然後將'bmi'、'charges'作為座標軸。
輸入:
sns.scatterplot(x=insurance_data['bmi'], y=insurance_data['charges'], hue=insurance_data['smoker'])
輸出:
<matplotlib.axes._subplots.AxesSubplot at 0x7f4d10d0c6a0>
以上散點圖展示了不抽菸的人隨著 BMI 指數的增加保險費用會稍有增加,而抽菸的人的保險費用要增加得多得多。
要想進一步明確這一事實,我們可以使用 sns.lmplot 命令新增兩個迴歸線,分別對應抽菸者和不抽菸者。(你會看到抽菸者的迴歸線更加陡峭。)
輸入:
sns.lmplot(x="bmi", y="charges", hue="smoker", data=insurance_data)
輸出:
/opt/conda/lib/python3.6/site-packages/scipy/stats/stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval
<seaborn.axisgrid.FacetGrid at 0x7f4d10c73240>
sns.lmplot 命令與其他命令有一些不同:
這裡沒有用 x=insurance_data['bmi'] 來選擇 insurance_data 中的'bmi'列,而是設定 x="bmi"來指定列的名稱。
類似地,y="charges" 和 hue="smoker"也包含列的名稱。
我們使用 data=insurance_data 來指定資料集。
最後,還有一個圖要學。我們通常使用散點圖顯示兩個連續變數(如"bmi"和 "charges")之間的關係。但是,我們可以調整散點圖的設計,來側重某一個類別變數(如"smoker")。我們將這種圖表型別稱作類別散點圖(categorical scatter plot),可使用 sns.swarmplot 命令構建。
輸入:
sns.swarmplot(x=insurance_data['smoker'],
y=insurance_data['charges'])
輸出:
<matplotlib.axes._subplots.AxesSubplot at 0x7f4d10c50c88>
除此之外,這個圖向我們展示了:
不抽菸的人比抽菸的人平均支付的保險費用更少;
支付最多保險費用的客戶是抽菸的人,而支付最少的客戶是不抽菸的人。