# 資訊是甚麼,可以吃嗎?Python抓取線上資訊並進行視覺化分析 [colab範例程式碼 - 從政府公開資訊.csv](https://colab.research.google.com/drive/1fgEBaSUqRtT_kRR0oVu4xLcD1QKpGyjb#scrollTo=lU-wfkEUqp4z) [colab範例程式碼 - kaggle與Titanic](https://colab.research.google.com/drive/15HQyAm3qkKP6ibbOEWFTcPGBXd9NsFwg#scrollTo=PyLUJNKy4F6P) ## 資料流程與分工 在進行資料分析時,我們可以將過程分為以下幾個步驟: 1. **資料取得**:從政府或開放數據平台下載資料,例如使用 API 獲取 `.csv` 檔案。 2. **資料預處理**:清理和整理資料,包含刪除不需要的欄位、處理重複資料、轉換資料格式等。 3. **資料分析**:利用數據運算和分組技術,計算指標或生成摘要。 4. **資料視覺化**:使用圖表(如長條圖、折線圖)來呈現分析結果。 5. **洞察與應用**:根據分析結果提出結論,應用於實際決策或研究中。 ## 簡易資料分析 - 從政府公開資訊開始 >[!Note]政府資料開放平台 >為各機關於職權範圍內取得或做成,且依法得公開之各類電子**資料**,包含文字、數據、圖片、影像、聲音、詮釋**資料**(metadata)等,以**開放**格式於網路公開,提供個人、學校、團體、企業或**政府**機關等使用者,依其需求連結下載及利用。 ## 資料是什麼,電腦看得懂嗎 在各種網站當中,如果他想要開放資料,他們都會將資料轉為.csv檔案(逗號區隔檔案) >[!Note]CSV (Comma-Separated Values) >是一種常見且通用性強的資料儲存格式,記錄中的各個資料欄位由逗號分隔。 而我們將利用python的兩個函式庫,協助我們**資料抓取與整理**以及**資料視覺化** ## pandas 與 matplotlib 函式庫 |名稱| 說明| |-|-| |pandas| 資料處理和分析模組(資料處理)。| |matplotlib |將資料視覺化(圖表製作)。| --- # 範例:空氣品質預報資料分析 ## 1. 資料取得 使用 `pandas` 的 `read_csv` 方法讀取資料,資料來源為 [空氣品質預報資料](https://data.gov.tw/dataset/6349)。 ```python import pandas as pd import matplotlib.pyplot as plt path = 'https://data.moenv.gov.tw/api/v2/aqf_p_01?api_key=e8dd42e6-9b8b-43f8-991e-b3dee723a52d&limit=1000&sort=publishtime+desc&format=CSV' df = pd.read_csv(path) ``` >[!Tip]連結在哪裡 >![image](https://hackmd.io/_uploads/ry8evVgj0.png) > 對.csv檔案下載的地方"右鍵->複製連結網址" ### **利用 `read_csv(path)` 將資料讀取到 DataFrame** df = pd.read_csv(path) - 使用 `pandas` 的 `read_csv` 函數,將CSV檔案中的資料讀取並存儲到名為 `df` 的 DataFrame 中。 - 你可以想像將Excel表格的資料塞到變數df當中 ## 2.資料預整理 ### 查看資料每個 column 的名稱 ```python print(df.columns) ``` - 這樣就能確認每個row的標籤意涵了 > ![image](https://hackmd.io/_uploads/H1LAuEeiA.png) - 根據結果可知,標籤有content,publishtime...等標籤,可知第一行一定都是"說明",第二行都是"發布時間".... ### 將不要的資訊丟掉 因為我們要分析"一個地區各時間平均"以及"一個時間內各地平均" => 其實,我們真正要的資訊只有'area'、'forecastdate'、'aqi' ```python df.drop(['publishtime','content', 'majorpollutant','minorpollutant','minorpollutantaqi'], axis=1, inplace=True) ``` >[!Note] >axis=1指定要刪除的是列而不是行 >inplace=True 表示直接在原 DataFrame 上進行修改 ![S__3027778](https://hackmd.io/_uploads/ryBmoNxj0.jpg) - 將不要的標籤行都刪除,並且 `inplace=True` 表示我們直接在原DataFrame上進行修改,而不返回新的DataFrame。 ### 如果你夠細心,你可能會發現這原資料的毛病 如果你有看過他的原資料,你會發現,有一些資料他是**重複登記的** >[!Caution] >猜測因為這資料是"預測並且要公布",才出現這樣的狀況 >> 8/15時,公告8/15 - 8/17的資訊 >> 8/16時,公告8/16 - 8/18的資訊 >> 可見8/17的資訊被重複公告(而且資訊還一模一樣) 所以我們可以利用.drop_duplicates()將重複資訊刪除 ```python df.drop_duplicates() ``` ![S__3027779](https://hackmd.io/_uploads/HkA4pVgjA.jpg) ### 觀察看看"有重複資訊"的資料長度跟"沒有重複資訊"的資料長度差多少 ```python print(len(df)) print(len(df_unique)) ``` ![image](https://hackmd.io/_uploads/ry1KaNloR.png) >代表他重複登記的資訊佔了大概80% ## 3.資料分析 ### 找到日期最大值與最小值 ```python # 將 'forecastdate' 欄位轉換為日期時間物件 df_unique['forecastdate'] = pd.to_datetime(df_unique['forecastdate']) # 找到最早和最晚的日期 earliest_date = df_unique['forecastdate'].min() latest_date = df_unique['forecastdate'].max() print("最早日期:", earliest_date.strftime('%Y/%m/%d')) print("最晚日期:", latest_date.strftime('%Y/%m/%d')) ``` - 找到資料中的"預測時間最大與最小值",有助於我們等等做圖表 - 先將日期轉成時間物件,後找到**在forecastdata欄位**中的最大與最小值 - 並利用strftime('%Y/%m/%d')顯示 ### 資料更正*(Mapping/Replace)* - 將資料中的中文轉換成英文 ```python area_mapping = { '北部': 'North', '竹苗': 'Zhubei', '中部': 'Central', '雲嘉南':'YunChiayiTainan', '高屏': 'KaohsiungPingtung', '宜蘭': 'Yilan', '花東': 'HualienTaitung', '馬祖': 'Matsu', '金門': 'Kinmen', '澎湖': 'Penghu' } df_unique['area'] = df_unique['area'].replace(area_mapping) ``` ### 根據組別分組並取平均值 根據目標,我們希望找到"每個地區在時間區間內的平均 AQI 值" => 我們需要按 `area` 這一標籤將資料分組,並計算每個地區的平均 AQI 值。 => 這樣,我們可以了解每個地區的空氣品質在整個時間區間內的表現。 我們可以使用以下程式碼來實現這個目標: ```pyhton area_aqi = df_unique.groupby('area')['aqi'].mean() ``` >[!Note] >`groupby('area')`:這部分代碼將資料按照 `area` 列的值進行分組,將所有具有相同 `area` 標籤的資料集合在一起。 > `['aqi'].mean()`:對每個分組計算 `aqi` 欄位的平均值,這樣每個地區的平均 AQI 值就會被計算出來。 將其結果print出來,`print(area_aqi)` ![image](https://hackmd.io/_uploads/rJc0WBeoR.png) ## 4.資料視覺化 ### 製作圖表,利用剛剛的area_aqi展示結果 根據剛剛計算出來的結果,製作成圖表,我們利用**長條圖**來表示每個地區的AQI值 > area_aqi.plot(kind='barh') = 說明我們現在area_aqi要用長條圖來表示 > xlabel() = 設定X軸名稱 > ylabel() = 設定Y軸名稱 > title() = 設定圖表標題名稱 > show() = show出製作好的圖表 ```python area_aqi.plot(kind='barh') plt.xlabel('Avg AQI') plt.ylabel('Area') plt.title('Each Area AQI in ' + earliest_date.strftime('%Y/%m/%d') + ' to '+ latest_date.strftime('%Y/%m/%d')) plt.savefig('area_aqi_chart.png') plt.show() ``` 最後,將其show出來後,應該會長: ![image](https://hackmd.io/_uploads/SkzoMrgoR.png) ### 換你來試看看 如果我們現在想要完成"根據時間分類,評判**各時段下所有地區的平均AQI數值**,並以**折線圖**表示" 應該怎麼做呢? >[!Tip]提示 > 1. 我們如果要完成上述目標,我們應該要將==日期相同的人==做AQI平均值,那該怎麼讓同日期的人在同一組? > 2. XXX.plot(kind='line') = 宣告你的dataframe以折線圖表示? XY軸名稱如何宣告? ## 補充:如果你想要繼續玩下去 ### Kaggle 簡介與入門 Kaggle 是一個為資料科學和機器學習愛好者設計的平台,提供以下功能與資源 - 擁有大量公開的資料集,涵蓋各種主題:電影評論、電子商務、醫療數據等。 可直接在 Kaggle Notebook 中下載與處理資料,無需本地環境設置。 競賽 - 提供各式機器學習競賽,從初學者到進階者都有適合的挑戰。常見主題包括分類、迴歸、圖像處理和自然語言處理。 - 大量學習資源 ### 如果你想要在Colab中使用Kaggle資料集 在 Google Colab 中使用 Kaggle 資料集,可以**直接將資料集下載到 Colab 的虛擬機器中**,避免使用本地端資源。 而要做到這件事情,需要Kaggle API認證才能進行: ![image](https://hackmd.io/_uploads/rydbUmsfJx.png) 到此畫面,點擊Setting ![image](https://hackmd.io/_uploads/BkFmLQoGyl.png) 到 Setting 中點擊 Create New Token 就可以拿到了 ![image](https://hackmd.io/_uploads/S1lfqU7sG1g.png) 在這樣的程式下,程式會要求你上傳檔案,將剛剛下載到的.json(即Kaggle API)上傳,此空間就能夠使用Kaggle資料集了! ![image](https://hackmd.io/_uploads/rJujvXoMJl.png) 如果你要下載想要的Dataset,就將Kaggle給予的地址複製到自己的空間中,驅動程式後就會下載 ![image](https://hackmd.io/_uploads/SJncj7oMkl.png) 之後就跟前面所述一樣就可以進行資料分析囉