教學課程第 2 部分:使用 Microsoft Fabric 筆記本探索和可視化數據
在本教學課程中,您將瞭解如何進行探勘數據分析(EDA),以檢查和調查數據,同時透過使用數據視覺效果技術來摘要其重要特性。
您將使用 seaborn
,這是 Python 數據視覺效果連結庫,提供高階介面,可在數據框架和陣列上建置視覺效果。 如需 的詳細資訊 seaborn
,請參閱 Seaborn:統計數據視覺效果。
您也將使用 以筆記本為基礎的工具 Data Wrangler,其可提供沉浸式體驗,以進行探勘數據分析和清除。
本教學課程的主要步驟如下:
- 讀取從 Lakehouse 中差異數據表儲存的數據。
- 將 Spark DataFrame 轉換成 Pandas DataFrame,Python 視覺效果連結庫支援此連結庫。
- 使用 Data Wrangler 執行初始數據清理和轉換。
- 使用
seaborn
執行探勘數據分析。
必要條件
取得 Microsoft Fabric 訂用帳戶。 或者,註冊免費的 Microsoft Fabric 試用版。
登入 Microsoft Fabric。
使用首頁左側的體驗切換器,切換至 Synapse 資料科學 體驗。
這是教學課程系列的第 2 部分。 若要完成本教學課程,請先完成:
- 第 1 部分:使用 Apache Spark 將數據內嵌至 Microsoft Fabric Lakehouse。
在筆記本中跟著
2-explore-cleanse-data.ipynb 是本教學課程隨附的筆記本。
若要開啟本教學課程隨附的筆記本,請遵循準備系統以進行數據科學教學課程中的指示,將筆記本匯入您的工作區。
如果您想要複製並貼上此頁面中的程式碼,您可以 建立新的筆記本。
開始執行程序代碼之前,請務必將 Lakehouse 附加至筆記本 。
重要
附加您在第 1 部分中使用的相同 Lakehouse。
從 Lakehouse 讀取原始數據
從 Lakehouse 的 [檔案 ] 區段讀取原始數據。 您已在上一個筆記本中上傳此數據。 在執行此程式代碼之前,請確定您已將第1部分中使用的相同Lakehouse附加至此筆記本。
df = (
spark.read.option("header", True)
.option("inferSchema", True)
.csv("Files/churn/raw/churn.csv")
.cache()
)
從數據集建立 pandas DataFrame
將spark DataFrame轉換成 pandas DataFrame,以方便處理和視覺效果。
df = df.toPandas()
顯示原始數據
使用 display
探索原始數據,執行一些基本統計數據並顯示圖表檢視。 請注意,您必須先匯入必要的連結庫,例如 Numpy
、 Pnadas
、 Seaborn
和 Matplotlib
,以進行數據分析和視覺效果。
import seaborn as sns
sns.set_theme(style="whitegrid", palette="tab10", rc = {'figure.figsize':(9,6)})
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
from matplotlib import rc, rcParams
import numpy as np
import pandas as pd
import itertools
display(df, summary=True)
使用 Data Wrangler 執行初始數據清理
若要探索及轉換筆記本中的任何 pandas 數據框架,請直接從筆記本啟動 Data Wrangler。
注意
當筆記本核心忙碌時,無法開啟數據 Wrangler。 數據格執行必須在啟動 Data Wrangler 之前完成。
- 在 [筆記本] 功能區 [數據] 索引標籤下,選取 [ 啟動數據 Wrangler]。 您會看到可供編輯的已啟動 pandas DataFrame 清單。
- 選取您想要在 Data Wrangler 中開啟的 DataFrame。 由於此筆記本只包含一個 DataFrame,請
df
選取df
。
Data Wrangler 會啟動併產生數據的描述性概觀。 中間的數據表會顯示每個數據行。 數據表 旁的 [摘要 ] 面板會顯示DataFrame的相關信息。 當您在數據表中選取數據行時,摘要會更新與所選數據行的相關信息。 在某些情況下,顯示和摘要的數據將會是 DataFrame 的截斷檢視。 發生這種情況時,您會在摘要窗格中看到警告影像。 將滑鼠停留在此警告上方,以檢視說明情況的文字。
您所做的每項作業都可以在點擊時套用,即時更新數據顯示,併產生程式碼,以重複使用的函式形式儲存回筆記本。
本節的其餘部分會逐步引導您完成使用 Data Wrangler 執行數據清理的步驟。
卸除重複的數據列
在左面板上是一份作業清單(例如尋找和取代、格式、公式、數值),您可以在數據集上執行。
展開 [ 尋找並取代 ],然後選取 [ 卸除重複的數據列]。
此時會出現一個面板,讓您選取要比較的數據行清單,以定義重複的數據列。 選取 [RowNumber ] 和 [CustomerId]。
中間面板中是這項作業結果的預覽。 預覽版底下是執行作業的程序代碼。 在此實例中,數據似乎不會變更。 但是,由於您正在查看截斷的檢視,所以仍套用作業是個好主意。
選取 [套用 ] (位於側邊或底部),以移至下一個步驟。
卸除遺漏數據的數據列
使用 Data Wrangler 卸除所有數據行遺漏數據的數據列。
卸除資料行
使用 Data Wrangler 卸除您不需要的數據行。
展開 [ 架構] ,然後選取 [ 卸除數據行]。
選取 [RowNumber]、 [CustomerId]、[ 姓氏]。 這些數據行會在預覽中以紅色顯示,以顯示程式代碼已變更的數據行(在此案例中為已卸除。
選取 [ 套用 ] 以移至下一個步驟。
將程式代碼新增至筆記本
每次選取 [ 套用] 時,會在左下方的 [清除步驟] 面板中建立新的步驟 。 在面板底部,針對所有步驟選取 [預覽程序代碼],以檢視所有個別步驟的組合。
選取 左上方的 [將程序代碼新增至筆記本 ],以關閉Data Wrangler並自動新增程序代碼。 將 程式代碼新增至筆記本 會將程式代碼包裝在函式中,然後呼叫 函式。
提示
在您手動執行新儲存格之前,將不會套用 Data Wrangler 所產生的程式代碼。
如果您未使用 Data Wrangler,您可以改用下一個程式代碼單元格。
此程式代碼類似於 Data Wrangler 所產生的程式代碼,但會將 自變數 inplace=True
新增至每個產生的步驟。 藉由設定 inplace=True
,pandas 會覆寫原始 DataFrame,而不是產生新的 DataFrame 做為輸出。
# Modified version of code generated by Data Wrangler
# Modification is to add in-place=True to each step
# Define a new function that include all above Data Wrangler operations
def clean_data(df):
# Drop rows with missing data across all columns
df.dropna(inplace=True)
# Drop duplicate rows in columns: 'RowNumber', 'CustomerId'
df.drop_duplicates(subset=['RowNumber', 'CustomerId'], inplace=True)
# Drop columns: 'RowNumber', 'CustomerId', 'Surname'
df.drop(columns=['RowNumber', 'CustomerId', 'Surname'], inplace=True)
return df
df_clean = clean_data(df.copy())
df_clean.head()
探索資料
顯示已清除數據的一些摘要和視覺效果。
判斷類別、數值和目標屬性
使用此程式代碼來判斷類別、數值和目標屬性。
# Determine the dependent (target) attribute
dependent_variable_name = "Exited"
print(dependent_variable_name)
# Determine the categorical attributes
categorical_variables = [col for col in df_clean.columns if col in "O"
or df_clean[col].nunique() <=5
and col not in "Exited"]
print(categorical_variables)
# Determine the numerical attributes
numeric_variables = [col for col in df_clean.columns if df_clean[col].dtype != "object"
and df_clean[col].nunique() >5]
print(numeric_variables)
五個數位摘要
使用方塊繪圖顯示數值屬性的五個數位摘要(最小值、第一分位數、中位數、第三分位數、最大分數)。
df_num_cols = df_clean[numeric_variables]
sns.set(font_scale = 0.7)
fig, axes = plt.subplots(nrows = 2, ncols = 3, gridspec_kw = dict(hspace=0.3), figsize = (17,8))
fig.tight_layout()
for ax,col in zip(axes.flatten(), df_num_cols.columns):
sns.boxplot(x = df_num_cols[col], color='green', ax = ax)
fig.delaxes(axes[1,2])
已結束和無選客戶的散發
顯示已結束的客戶與無選客戶在類別屬性之間的分佈。
attr_list = ['Geography', 'Gender', 'HasCrCard', 'IsActiveMember', 'NumOfProducts', 'Tenure']
fig, axarr = plt.subplots(2, 3, figsize=(15, 4))
for ind, item in enumerate (attr_list):
sns.countplot(x = item, hue = 'Exited', data = df_clean, ax = axarr[ind%2][ind//2])
fig.subplots_adjust(hspace=0.7)
數值屬性的分佈
使用直方圖顯示數值屬性的頻率分佈。
columns = df_num_cols.columns[: len(df_num_cols.columns)]
fig = plt.figure()
fig.set_size_inches(18, 8)
length = len(columns)
for i,j in itertools.zip_longest(columns, range(length)):
plt.subplot((length // 2), 3, j+1)
plt.subplots_adjust(wspace = 0.2, hspace = 0.5)
df_num_cols[i].hist(bins = 20, edgecolor = 'black')
plt.title(i)
plt.show()
執行特徵工程
執行特徵工程,根據目前屬性產生新的屬性:
df_clean["NewTenure"] = df_clean["Tenure"]/df_clean["Age"]
df_clean["NewCreditsScore"] = pd.qcut(df_clean['CreditScore'], 6, labels = [1, 2, 3, 4, 5, 6])
df_clean["NewAgeScore"] = pd.qcut(df_clean['Age'], 8, labels = [1, 2, 3, 4, 5, 6, 7, 8])
df_clean["NewBalanceScore"] = pd.qcut(df_clean['Balance'].rank(method="first"), 5, labels = [1, 2, 3, 4, 5])
df_clean["NewEstSalaryScore"] = pd.qcut(df_clean['EstimatedSalary'], 10, labels = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
使用 Data Wrangler 執行單熱編碼
數據 Wrangler 也可以用來執行單熱編碼。 若要這樣做,請重新開啟Data Wrangler。 這次,請選取 df_clean
數據。
- 展開 [公式] ,然後選取 [單熱編碼]。
- 此時會出現一個面板,讓您選取要執行單熱編碼的數據行清單。 選取 [地理位置] 和 [性別]。
您可以複製產生的程式代碼、關閉 Data Wrangler 以返回筆記本,然後貼到新的數據格中。 或者,選取 左上方的 [將程序代碼新增至筆記本 ],以關閉Data Wrangler並自動新增程序代碼。
如果您未使用 Data Wrangler,您可以改用下一個程式代碼數據格:
# This is the same code that Data Wrangler will generate
import pandas as pd
def clean_data(df_clean):
# One-hot encode columns: 'Geography', 'Gender'
df_clean = pd.get_dummies(df_clean, columns=['Geography', 'Gender'])
return df_clean
df_clean_1 = clean_data(df_clean.copy())
df_clean_1.head()
探勘數據分析的觀察摘要
- 大多數客戶來自法國,與西班牙和德國相比,而西班牙的流失率最低,與法國和德國相比。
- 大部分的客戶都有信用卡。
- 有客戶年齡和信用分數分別高於 60 和 400 以下,但不能被視為極端值。
- 很少有客戶擁有兩個以上的銀行產品。
- 未使用中的客戶流失率較高。
- 性別和任期年似乎不會影響客戶關閉銀行賬戶的決定。
建立已清除數據的差異數據表
您將在本系列的下一個筆記本中使用此數據。
table_name = "df_clean"
# Create Spark DataFrame from pandas
sparkDF=spark.createDataFrame(df_clean_1)
sparkDF.write.mode("overwrite").format("delta").save(f"Tables/{table_name}")
print(f"Spark dataframe saved to delta table: {table_name}")
後續步驟
使用此數據定型和註冊機器學習模型:
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應