---
title: 南大_大數據視覺化實務(2021/09/01-2022/01/31)
tags: 大數據分析,Hadoop
description: 本門課的重點在輔導學生了解大數據的歷史由來及發展現狀,分享大數據零售行業、電信行業、互聯網行業相關企業的真實案例。
lang: zh
---
# 大數據視覺化實務
###### tags: 大數據視覺化實務,bigdata,opendata,hadoop
## 重要課程規定
### 評分方式
1. 期中考:30%
2. 期末分組報告:40%(書面:20% 口頭:20%)
3. 平時成績(出席、課堂表現、作業、報告):30%
4. [額外全國競賽加分](https://gec2021.twisc.ncku.edu.tw/):<font color="red">依課程說明</font>
## 課程大綱
本門課將以資安議題為出發角度,教導學生如何利用現有的網路相關log發掘出潛在的資安問題,並由淺入深教導學生如何看懂相關資料,並做出對應的分析結果。
## 相關使用軟體
1. Excel
2. Apache Hadoop Pig、Hive
3. Wireshark 封包分析
## 課程重要行程
1. 期中考:110年11月05日。
2. 全國競賽初賽(線上競賽):110年11月27日(六)。
3. 期末報告:111月01月XX日 <font color="red">(暫定)</font>。
4. 110年11月15日(停課 > 線上觀看影片)
## 課程相關線上教材
1. 電子書:[大數據(Big Data)分析與應用:使用Hadoop與Spark](https://nutn.ebook.hyread.com.tw/bookDetail.jsp?id=160971)
2. 線上影音教學: [Hadoop 線上課程](https://www.youtube.com/watch?v=I4esbC7ipbk&list=PLUuQL_ogRVuixcTdE9Q0XhvWz6l3p9xbC)
3. 課程雲端分享區: [連結1](https://drive.google.com/drive/folders/1-nln-V7l7O4Agy65pw12M5cDpS0JfN_x?usp=sharing)
## 初探大數據課程
userprofile.tsv (會員註冊資料)
| 欄位名稱 | 描述 | 型態 |
| -------- | -------- | -------- |
| userid | 使用者 ID | chararray |
| gender | 性別 | chararray |
| age | 年齡 | int |
| country | 國家 | chararray |
| registered | 註冊日期 | chararray |
userdemand.tsv (會員點播紀錄)
| 欄位名稱 | 描述 | 型態 |
| -------- | -------- | -------- |
| userid | 使用者 ID | chararray |
| time | 點聽時間 | chararray |
| artname | 歌手名稱 | chararray |
| traname | 歌曲名稱 | chararray |
### 2021/09/24 課堂練習題目 (基礎-Excel)
#### 練習1 男性與女性的會員數分別是多少
:::spoiler 參考答案
m 182
f 137
:::
#### 練習2 來自加拿大(Canada)的會員數是多少
:::spoiler 參考答案
60
:::
#### 練習3 來自美國(United States)的男性會員數是多少
:::spoiler 參考答案
8
:::
#### 練習4 來自美國(United States)***或***男性會員數是多少
:::spoiler 參考答案
186
:::
### 2021/10/01 課堂練習題目 (基礎-Excel)
#### 練習1 不屬於加拿大(Canada)的男性會員有多少人?
:::spoiler 參考答案
153
:::
#### 練習2 年齡在25(含)歲以上的女性會員人數
:::spoiler 參考答案
60
:::
#### 練習3 年齡在30(含)~40(含)的會員人數
:::spoiler 參考答案
58
:::
#### 練習4 有多少會員的年齡超過平均年齡
:::spoiler 參考答案
117
:::
### 2021/10/08 課堂練習題目 (基礎-Excel)
#### 練習1 哪國家的會員人數最少,顯示國家名稱跟註冊人數?
:::spoiler 參考答案
:::
#### 練習2 年齡層的會員人數最多,有多少人?
:::spoiler 參考答案
21 35
:::
#### 練習3 哪一年註冊的會員人數最多?有多少人
:::spoiler 參考答案
:::
#### 練習4 哪個月註冊的會員人數最多?有多少人
:::spoiler 參考答案
:::
#### 練習5 哪個國家的平均註冊年齡最年輕
:::spoiler 參考答案
:::
#### 練習6 請查詢出人數排名第五名的國家 男性會員與女性會員的人數是多少人?
:::spoiler
:::
### 2021/10/15 課堂練習
練習1 男性與女性的會員數分別是多少
練習2 來自於加拿大(Canada)的男性會員人數
練習3 來自於加拿大(Canada)或男性會員人數
練習4 年齡介於20~30歲的會員人數
練習5 請查詢高於平均會員年齡的會員人數
練習6 請查詢年齡最多的前名五分別是幾歲與人數為何
練習7 請根據資料集查詢出所有會員資料表中,那些國家的男性會員註冊人數是最多的,請顯示國家名稱與註冊人數
題目8 哪個國家的平均年齡最輕
### 2021/10/22 課堂練習
#### 練習1 在點播紀錄中,點播次數前五名的歌手分別為那些歌手
:::spoiler
:::
#### 練習2 在點播紀錄中,熱門排行歌曲的前五名
:::spoiler
:::
#### 練習3 在點播紀錄中,那些歌手的紛絲數量最多?(使用者點播該歌手即為該歌手的粉絲,同一個會員僅可計算一次)
:::spoiler
:::
### 2021/10/29 課堂練習
#### 練習1 查詢哪一位歌手所唱的歌曲點播次數最高(同一個使用者點播僅可計算一次)
:::spoiler
:::
#### 練習2 哪一位使用者的點播次數最高 分別為幾次
:::spoiler
:::
#### 練習3 哪一位使用者的點播次數最高 分別為幾次 並顯示出他來自於哪個國家
:::spoiler
:::
#### 練習4 哪一個國家的點播次數最多
:::spoiler
:::
#### 練習5 哪一個國家的男性會員點播次數最多
:::spoiler
:::
### 2021/12/17 上課內容
#### 簡易C#奇偶數判斷練習
```csharp=
static void Main(string[] args)
{
Console.Write("請輸入一個整數:");
String userIn = Console.ReadLine();
//文字轉換為數字
int number = Int32.Parse(userIn);
//判斷是否為偶數
if (number % 2 == 0)
{
Console.WriteLine(String.Format("輸入的數字是{0}系統判定為{1}",userIn,"偶數"));
}
else
{
Console.WriteLine(String.Format("輸入的數字是{0}系統判定為{1}", userIn, "奇數"));
}
Console.ReadKey();
}
```
#### 簡易取得網頁資料範例
```csharp=
static void Main(string[] args)
{
GetWebData();
Console.ReadKey();
}
static async void GetWebData()
{
//強制瀏覽器使用新版的加密協議
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
String Url = "https://datacenter.taichung.gov.tw/swagger/OpenData/537fca8f-4fc7-495f-b33f-114ba60e26f8";
//建立一個HttpClient的物件(類似瀏覽器)
HttpClient client = new HttpClient();
//命令瀏覽器發出一個請求,取得某個網頁的內容
String webData = await client.GetStringAsync(Url);
//產生輸出的結果
Console.WriteLine(webData);
}
```
#### 簡易讀取與分析資料
```csharp=
static async void GetWebData()
{
//強制瀏覽器使用新版的加密協議
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
String Url = "https://datacenter.taichung.gov.tw/swagger/OpenData/537fca8f-4fc7-495f-b33f-114ba60e26f8";
//建立一個HttpClient的物件(類似瀏覽器)
HttpClient client = new HttpClient();
//命令瀏覽器發出一個請求,取得某個網頁的內容
String webData = await client.GetStringAsync(Url);
//分割原始資料並將每筆資料存放到陣列中
String[] dataArray = webData.Split('\n');
int sumDeath = 0;
int sumInjury = 0;
for (int i = 1; i < dataArray.Length - 1; i++)
{
string nowData = dataArray[i];
string[] record = nowData.Split(',');
string year = record[0];
string month = record[1];
string day = record[2];
string hour = record[3];
string min = record[4];
int death = Int32.Parse(record[7]);
int injury = Int32.Parse(record[8]);
Console.WriteLine("日期:{0}/{1}/{2} 時間:{3}:{4} 死亡人數:{5} 受傷人數:{6}", year , month , day, hour,min, death , injury);
//計算總受傷與死亡人數
sumDeath = sumDeath + death;
sumInjury = sumInjury + injury;
}
Console.WriteLine("本月累積受傷人數:{0},累積死亡人數:{1}", sumInjury, sumDeath);
}
```
### 期末報告範例
```csharp=
static async void GetWebResult()
{
//強制瀏覽器使用新版的加密協議
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
//設定資料的來源網址
String Url = "https://data.cip.gov.tw/API/v1/dump/datastore/A53000000A-110067-001";
//建立一個HttpClient的物件(類似瀏覽器)
HttpClient client = new HttpClient();
//命令瀏覽器發出一個請求,取得某個網頁的內容
String webData = await client.GetStringAsync(Url);
//將來源資料轉換為JSON格式
dynamic jsonObject = JsonConvert.DeserializeObject(webData);
//將資料集的內容存放到變數中
dynamic results = jsonObject[0].result.records;
//題目1 : 查詢報名人數低於50人的考試場次有哪些
int Q1Count = 0;
foreach (dynamic result in results)
{ if ((int)result.報名人數 < 50)
{
Console.WriteLine("年度:{0} 驗證語言:{1} 級別:{2} 報名人數:{3} 到考人數:{4} 合格人數:{5}",
result.年度,
result.族語方言別,
result.級別,
result.報名人數,
result.應試人數,
result.通過人數
);
Q1Count++;
}
}
Console.WriteLine("題目1:報名人數低於50人的考試場次共有{0}", Q1Count);
//題目2 : 到考率低於70%的場次有哪些
int Q2Count = 0;
foreach (dynamic result in results)
{
//出席率
double presenceRate = (double)result.應試人數 / (double)result.報名人數;
if (presenceRate < 0.7)
{
Console.WriteLine("年度:{0} 驗證語言:{1} 級別:{2} 報名人數:{3} 到考人數:{4} 合格人數:{5} , 到考率:{6}",
result.年度,
result.族語方言別,
result.級別,
result.報名人數,
result.應試人數,
result.通過人數,
Math.Round(presenceRate * 100,2)
);
Q2Count++;
}
}
Console.WriteLine("題目2到考率低於70%的場次共有{0}場", Q2Count);
//題目3 : 查詢每種類別的報名場次
Dictionary<String, int> Q3Count = new Dictionary<string, int>();
foreach (dynamic result in results)
{
String key = (string)result.族語方言別;
if (Q3Count.ContainsKey(key))
{
Q3Count[key]++;
}
else
{
Q3Count.Add(key, 1);
}
}
// 顯示查詢結果
foreach (String key in Q3Count.Keys)
{
Console.WriteLine("語言類別:{0} 舉辦場次:{1}", key, Q3Count[key]);
}
}
```