地理空間資料分析在資料科學領域應用廣泛,能揭示資料背後的地理位置關聯性。本文使用 DuckDB 結合 Python 程式函式庫,示範如何分析美國機場資料集。首先,利用 DuckDB 的空間擴充套件功能,結合 Shapely 函式庫進行幾何資料轉換,並使用 Folium 函式庫在地圖上視覺化機場位置,實作地理空間資料的有效展示。接著,運用描述性統計方法,分析各州的機場數量分佈,並使用 SQL 查詢搭配 Python 程式碼進行資料聚合和排序。最後,使用 Matplotlib 函式庫繪製圓餅圖和長條圖,比較不同視覺化方式的優缺點,並根據資料特性選擇最佳呈現方式,例如在呈現各州機場數量時,除了百分比之外,也加入實際數量標示,使圖表資訊更完整。

探索美國機場資料:玄貓的地理空間與描述性分析之旅

在資料分析的世界裡,地理空間資料往往隱藏著豐富的資訊。今天,玄貓(BlackCat)將帶領大家深入探索美國機場資料集,利用 DuckDB 的空間擴充套件和描述性分析,揭示資料背後的故事。

從 Folium 到 DuckDB:玄貓的資料探索之路

首先,我們回顧一下之前學到的技能:

  • Folium 地圖展示:利用 Folium 函式庫,我們可以在地圖上視覺化機場的位置。
  • 多樣圖資整合:Folium 支援多種圖資,讓地圖呈現更豐富的資訊。
  • 標記機場:在地圖上使用標記,清晰呈現每個機場的位置。
  • DuckDB 空間擴充套件:DuckDB 的空間擴充套件讓我們能夠執行地理空間查詢。
  • Shapely 幾何轉換:使用 Shapely 函式庫將經緯度轉換為 Point 資料型別,方便 DuckDB 進行空間分析。
  • GeoDataFrame 展示:利用 GeoDataFrame 物件,更有效地展示機場位置。
  • 鄰近機場搜尋:透過經緯度和距離,找出鄰近的機場。

掌握了這些技能,我們就能更深入地探索機場資料,發現更多有趣的資訊。

描述性分析:解鎖資料背後的秘密

地理空間分析只是起點,描述性分析能讓我們更瞭解資料的本質。透過描述性分析,我們可以回答以下問題:

  • 各州機場數量:哪個州擁有最多的機場?
  • 機場間航班數量:哪些機場之間的航班最頻繁?
  • 每週航班數量:一週中哪幾天航班數量較少?
  • 每日最佳飛行時間:一天中哪個時段最不容易遇到航班延誤?
  • 取消航班最多的航空公司:哪家航空公司的航班取消率最高?
  • 延遲航班最多的航空公司:哪家航空公司的航班延遲率最高?

接下來,玄貓(BlackCat)將一步步帶領大家找到這些問題的答案。

各州與城市機場分佈:玄貓的資料洞察

讓我們先從簡單的開始,找出各州與城市的機場分佈。以下程式碼可以將機場按照州和城市排序:

df_city_state = conn.execute("""
SELECT
    *
FROM
    airports
ORDER BY
    STATE,
    CITY
""").df()
df_city_state

執行這段程式碼後,我們得到一個 DataFrame,其中包含按州和城市分組的機場詳細資訊。

為了更方便地查詢,我們可以將 STATE 和 CITY 設定為 MultiIndex:

df_city_state.set_index(['STATE','CITY'], inplace = True)
df_city_state

現在,我們可以輕鬆地使用 loc[] 索引器來查詢特定州或城市的機場。例如,要找出加州(CA)的所有機場,只需輸入:

df_city_state.loc['CA']

若要尋找舊金山(San Francisco)的機場,則輸入:

df_city_state.loc[('CA','San Francisco')]

透過 MultiIndex,我們可以快速定位到特定地點的機場資訊。

各州機場總數:玄貓的資料統計

接下來,讓我們統計各州的機場總數,並以降序排列:

df_airports_state = conn.execute("""
SELECT
    STATE,
    count(*) as COUNT
FROM
    airports
GROUP BY
    STATE
ORDER BY
    Count DESC
""").df()
df_airports_state.head()

這段程式碼會回傳一個 DataFrame,其中包含各州的機場數量。我們可以透過 head() 函式檢視前五個州。

為了更直觀地呈現資料,我們可以將其繪製成圓餅圖。

import matplotlib.pyplot as plt
import seaborn

palette_color = seaborn.color_palette('pastel')
plt.figure(figsize = (7, 7))
plt.pie(df_airports_state['COUNT'],
        labels = df_airports_state['STATE'],
        colors = palette_color,
        autopct = '%.0f%%',)
plt.legend(df_airports_state['STATE'], loc = "best")

然而,由於州數量眾多,圓餅圖可能顯得雜亂。為了改善視覺效果,我們可以只顯示機場數量最多的前十個州:

SELECT
    STATE,
    count(*) as COUNT
FROM
    airports
GROUP BY
    STATE
ORDER BY
    Count DESC
LIMIT 10

重新繪製圓餅圖後,圖表會更加清晰。

但玄貓(BlackCat)認為,圓餅圖的重點應該是呈現各州機場的具體數量,而非百分比。因此,我們可以定義一個 fmt() 函式來格式化圓餅圖的標籤:

# total number of airports
total = df_airports_state['COUNT'].sum()

def fmt(x):
    return '{:.1f}%\n({:.0f} airports)'.format(x, total * x / 100)

palette_color = seaborn.color_palette('pastel')
plt.figure(figsize = (7, 7))
plt.pie(df_airports_state['COUNT'],
        labels = df_airports_state['STATE'],
        colors = palette_color,
        autopct = fmt)
plt.legend(df_airports_state['STATE'], loc = "best")

現在,圓餅圖會顯示每個州機場的百分比和實際數量。

當然,圓餅圖並非呈現資料的唯一方式。有些人認為圓餅圖存在一些問題。因此,玄貓(BlackCat)也提供另一種選擇:長條圖。

# create the bar chart
plt.bar(df_airports_state['STATE'],
        df_airports_state['COUNT'],
        color='skyblue')
plt.xlabel('State')
plt.ylabel('Number of Airports')
plt.title('Top 10 States with Most Airports')
plt.xticks(rotation = 45)

長條圖能更清晰地比較各州之間的機場數量差異。

更多航班資料探索:玄貓的下一步

除了機場數量,我們還可以探索更多航班相關的資料,例如:

  • 各機場出發航班數量
  • 起訖機場組合的航班數量

在接下來的文章中,玄貓(BlackCat)將會探討這些資料,揭示更多關於航班的秘密。

總結來說,透過地理空間分析和描述性分析,我們可以從美國機場資料集中獲得豐富的資訊。從 Folium 地圖展示到 DuckDB 空間查詢,再到 Matplotlib 資料視覺化,每個環節都扮演著重要的角色。希望這篇文章能幫助大家更瞭解如何利用資料分析工具,探索資料背後的故事。