1. 程式人生 > >資料分析學習筆記part_1

資料分析學習筆記part_1

資料分析


 

Lesson 1 : SQL初探

SQL和移動平均值

SQL簡介

  • 實體關係圖(ERD) 是檢視資料庫中資料的常用方式。下面是我們將用於 Parch & Posey 資料庫的 ERD。包括:1. 表的名稱 2. 每個表中的列 3. 表配合工作的方式。如下圖所示,可以將每個表視為一個單獨的電子表格。然後將每個電子表格中的列放在表名下面。例如,region 表有兩列: id 和 name,而 web_events 表有四列。

 

 

  • SQL的優點

    ,使用傳統關係資料庫與 SQL 互動有一些主要優點。最明顯的 5 個優點是:

    1. SQL 很容易理解。

    2. 傳統的資料庫允許我們直接訪問資料。

    3. 傳統的資料庫可使我們稽核和複製資料。

    4. SQL 是一個可一次分析多個表的很好工具。5. 相對於 Google Analytics 等儀表板工具,SQL 可使我們分析更復雜的問題。

  • 為什麼企業喜歡使用資料庫:

    1. 只有輸入了需要輸入的資料,以及只有某些使用者能夠將資料輸入資料庫,才能保證資料的完整性。

    2. 可以快速訪問資料 - SQL 可使我們從資料庫中快速獲取結果。 可以優化程式碼,快速獲取結果。

    3. 可以很容易共享資料 - 多個人可以訪問儲存在資料庫中的資料,所有訪問資料庫的使用者獲得的資料都是一樣。

  • SQL 資料庫儲存資料方式

    1. CREATE TABLE 是一個在資料庫中建立新表的語句。

    2. DROP TABLE 是刪除資料庫中表的語句。

    3. SELECT 讀取並顯示資料。我們將這稱為查詢

  • 常用的兩種查詢語句

    1. SELECT用於提醒查詢要返回哪些列。

    2. FROM用於提醒查詢在哪個表中查詢。注意,這個表中需要有列。

    SELECT *
    FROM orders;

     

  • 注意:每個查詢至少有一個 SELECT 和 FROM 語句。 SELECT 語句用於放置要顯示資料的FROM 語句用於放置要從中提取資料的

  • 練習:嘗試編寫自己的查詢,以便為 orders 表中的所有訂單選擇 idaccount_id 和 occurred_at 列。

    SELECT id, account_id, occurred_at
    FROM orders;

     

  • 規定查詢格式

    1. 大寫,我們大寫了 SELECT 和 FROM,而將表和列名稱小寫。這是一個常見的格式慣例。大寫命令(SELECT、FROM),小寫查詢中的其他內容是常見做法。這使得查詢更容易讀取,這在編寫更復雜的查詢時更為重要。

    2. 表和變數名中不需要空格,通常在列名中使用下劃線,避免使用空格。 在 SQL 中使用空格有點麻煩。 在 Postgres 中,如果列或表名稱中有空格,就需要使用雙引號括住這些列/表名稱(例如:FROM "Table Name",而不是 FROM table_name)。在其他環境中,可能會使用方括號(例如:FROM [Table Name])。

    3. 在查詢中使用空格,QL 查詢忽略空格,因此可以根據需要在程式碼之間新增儘可能多的空格和空行,並且查詢結果是相同的。

      SELECT account_id FROM orders
      #等價於
      SELECT account_id
      FROM orders;

       

  • SQL不區分大小寫

    SELECT account_id
    FROM orders;
    #和這個相同
    DELECT account_id
    FROM orders
    #也和這個相同
    SELECT AcCoUnt_id
    FROM oRdErS

     

    但是如果沒有區分大小寫鍵入正確的字元,程式語言會變得不易閱讀。

  • 分號

    根據 SQL 環境,查詢結尾可能需要一個執行的分號。 這個"要求"在其他環境中比較靈活。我們認為在每個語句的末尾新增一個分號是最好的做法,如果環境能夠一次顯示多個結果,那麼這樣做還可以一次執行多個命令。最好的做法:

    SELECT account_id
    FROM orders;

     

  • LIMIT

    LIMIT 命令始終是查詢的最後一部分。下面的例子僅顯示訂單表的前 10 行和所有列:

    SELECT *
    FROM orders
    LIMIT 10;

     

  • 練習

    1. 編寫一個查詢,將響應限制在前 15 行,和包括 web_events 表中的 occurred_ataccount_id 和 channel 欄位。

      SELECT occurred_at, account_id
      FROM web_events
      LIMIT 15;

       

  • ORDER BY

  • 語句可使我們按任意行排序表。ORDER BY 語句始終在 SELECT 和 FROM 語句之後,但位於 LIMIT 語句之前。 學習其他命令時,這些語句的順序將更為重要。 如果使用 LIMIT 語句,它將始終顯示在最後。(提示 記住可以在 ORDER BY 語句中的列之後新增 DESC,然後按降序排序,因為預設是按升序排序的。")

    練習

    1. 編寫查詢,返回 orders 表的前 10 個訂單。包含 idoccurred_at 和 total_amt_usd

      SELECT id, occurred_at, total_amt_usd
      FROM orders
      ORDER BY occurred_at
      LIMIT 10;

       

    2. 編寫一個查詢,基於 total_amt_usd 返回前 5 個最高的 訂單 (orders 表)。包括 idaccount_id 和 total_amt_usd

      SELECT id, account_id, total_amt_usd
      FROM orders
      ORDER BY total_amt_usd DESC 
      LIMIT 5;

       

    3. 編寫一個查詢,基於 total 返回前 20 個最低 訂單 (orders 表)。包括 idaccount_id和 total

      SELECT id, account_id, total
      FROM orders
      ORDER BY total
      LIMIT 20;

       

 

  • 我們可以基於必須滿足的條件,使用 WHERE 語句來為表格建立子集。WHERE 語句中使用的常用符號包括:

  1. >(大於)

  2. <(小於)

  3. >=(大於或等於)

  4. <=(小於或等於)

  5. =(等於)

  6. !=(不等於)

    練習

    1. 從 訂單 表提取出大於或等於 1000 的 gloss_amt_usd 美元數額的前五行資料(包含所有列)。

      SELECT *
      FROM orders
      WHERE gloss_amt_usd >= 1000
      LIMIT 5;

       

    2. 從 訂單 表提取出小於 500 的 total_amt_usd美元數額的前十行資料(包含所有列)。

      SELECT *
      FROM orders
      WHERE total_amt_usd < 500
      LIMIT 10;

       

  • WHERE 與非數字資料一起使用
    • WHERE 語句也可以與非數字資料一起使用。在這節課中,我們可以使用 = 和 != 運算子。 還需要確保在文字資料中使用引號(單引號或雙引號都可以 - 如果原始文字中有引號,就一定要注意)。

    • 通常將 WHERE 與非數字資料欄位一起使用時,我們會使用 LIKENOT 或 IN 運算子。

    練習

    1. 過濾賬戶(accounts )表格,從該表格中篩選出 Exxon Mobil 的 namewebsite 和 primary point of contact (primary_poc)。

      SELECT name, website, primary_poc
      FROM accounts
      WHERE name = 'Exxon Mobil';

       

  • 算數運算子

  • 派生列:我們將現有的列組合,生成的新列稱為 派生 列。

    常見運算包括:

    1. *(乘法)

    2. +(加法)

    3. -(減法)

    4. /(除法)

    練習

    1. 使用 訂單 (orders)表:

      建立一個用 standard_amt_usd 除以 standard_qty 的列,查詢每個訂單中標準紙的單價。將結果限制到前 10 個訂單,幷包含 id和 account_id 欄位。

      SELECT id, account_id, standard_amt_usd/standard_qty AS unit_price
      FROM orders
      LIMIT 10;

       

    2. 編寫一個查詢,查詢每個訂單海報紙的收入百分比。 只需使用以 _usd 結尾的列。 (在這個查詢中試一下不使用總列)。包含 id 和 account_id 欄位。

      SELECT id, account_id,
      poster_amt_usd/(standard_amt_usd + gloss_amt_usd + poster_amt_usd) AS post_per
      FROM orders;

       

  • 邏輯運算子

  • 邏輯運算子包括:

    1. LIKE 可用於進行類似於使用 WHERE 和 = 的運算,但是這用於可能  知道自己想準確查詢哪些內容的情況。

    2. IN 用於執行類似於使用 WHERE 和 = 的運算,但用於多個條件的情況。

    3. NOT 這與 IN 和 LIKE 一起使用,用於選擇 NOT LIKE 或 NOT IN 某個條件的所有行。

    4. AND & BETWEEN 可用於組合所有組合條件必須為真的運算。

    5. OR 可用於組合至少一個組合條件必須為真的運算。

  • LIKE 運算子對於處理文字非常有用。我們將在 WHERE 子句中使用 LIKE。 LIKE 運算子經常與  一起使用。  告訴我們,我們可能會想要任何數量的字元,產生一組特定的字元或者遵循一組特定的字元。記住,需要用單引號或雙引號將傳達給 LIKE 運算子的文字括住,因為這個字串中的大小寫字母不一樣。 搜尋 'T' 與搜尋 't' 不同。

    練習

    使用 accounts (客戶) 表查詢

    1. 所有以 'C' 開頭公司名。

      SELECT name
      FROM accounts
      WHERE name LIKE 'C%';

       

    2. 名稱中包含字串 'one' 的所有公司名。

      SELECT name
      FROM accounts
      WHERE name LIKE '%one%';

       

    3. 所有以 's' 結尾的公司名。

      SELECT name
      FROM accounts
      WHERE name LIKE '%s';

       

  • IN 運算子對於數字和文字列都很有用。這個運算子可使我們使用 =,但對於特定列的多個專案。 可以檢查我們要提取資料的一個、兩個或多個列值,但這些都在同一個查詢中。 在後面的概念中,我們將介紹 OR 運算子,也可以使用這個運算子執行這些任務,但使用 In運算子編寫的查詢更清楚一些。

    練習

    1. 使用 客戶 表查詢 Walmart、Target 和 Nordstrom 的name (客戶名稱)primary_poc (主要零售店), and sales_rep_id (銷售代表 id)

      SELECT name, primary_poc, sales_rep_id
      FROM accounts
      WHERE name IN ('Walmart', 'Target', 'Nordstrom');

       

    2. 使用 web_events 表查詢有關通過 organic 或 adwords 聯絡的所有個人資訊。

      SELECT *
      FROM web_events
      WHERE channel IN ('organic', 'adwords');

       

  • NOT 運算子是一個非常有用的運算子,用於與之前介紹的兩個運算子 IN 和 LIKE 一起運算。通過指定 NOT LIKE 或 NOT IN,我們可以查詢到所有不符合特定條件的行。

    練習

    1. 使用客戶表查詢除 Walmart、Target 和 Nordstrom 之外的所有商店的客戶名稱、主要零售店和銷售代表 id。

      SELECT name, primary_poc, sales_rep_id
      FROM accounts
      WHERE name NOT IN ('Walmart', 'Target', 'Nordstrom');

       

    2. 使用 web_events 表查詢除通過任何方法聯絡的個人的所有資訊,除了使用 organic 或 adwords 方法。

      SELECT *
      FROM web_events
      WHERE channel NOT IN ('organic', 'adwords');

       

    3. 使用客戶表查詢所有不以 'C' 開頭的公司名。

      SELECT name
      FROM accounts
      WHERE name NOT LIKE 'C%';

       

    4. 所有名稱中不包含字串 'one' 的公司名。

      SELECT name
      FROM accounts
      WHERE name NOT LIKE '%one%';

       

    5. 所有不以 's' 結尾的公司名。

      SELECT name
      FROM accounts
      WHERE name NOT LIKE '%s';

       

  • 有時使用 BETWEEN 比使用 AND 使語句更清楚一些。

  • AND 運算子用於 WHERE 語句中,用於一次考慮多個邏輯子句。 使用 AND 連線一個新的語句時,需要指定感興趣的列。可以同時連線儘可能多的考慮語句。 這個運算子可用於我們迄今為止所學習到的所有運算,包括算術運算子(+*-/),可以使用 AND運算子將 LIKEIN 和 NOT 邏輯連線到一起。

    WHERE column >= 6 AND column <= 10
    #運用between
    WHERE column BETWEEN 6 AND 10

     

    練習

    1. 編寫一個查詢,返回所有訂單,其中 standard_qty 超過 1000,poster_qty 是 0,gloss_qty 也是 0。

      SELECT *
      FROM orders
      WHERE standard_qty > 1000 AND poster_qty = 0 AND gloss_qty = 0;

       

    2. 使用客戶表查詢所有不以 'C' 開始但以 's' 結尾的公司名。

      SELECT name
      FROM accounts
      WHERE name NOT LIKE 'C%' AND name LIKE '%s';

       

    3. 使用 web_events 表查詢通過 organic 或 adwords 聯絡,並在 2016 年的任何時間開通帳戶的個人全部資訊,並按照從最新到最舊的順序排列。

      SELECT *
      FROM web_events
      WHERE channel IN ('organic', 'adwords') AND occurred_at BETWEEN '2016-01-01' AND '2017-01-01'
      ORDER BY occurred_at DESC;

       

  • 與 AND 運算子類似,OR 運算子可以組合多個語句。 使用 OR 連線新的語句時,需要指定感興趣的列。可以同時連線儘可能多的考慮語句。 這個運算子可用於我們迄今為止所學習到的所有運算,包括算術運算子(+*-/),可以使用 OR 運算子將 LIKEINNOTAND 和 BETWEEN邏輯連線到一起。

    將多個運算組合到一起時,可能經常需要使用括號來確保我們要執行的邏輯能得到正確執行。

    練習

    1. 查詢 訂單 (orders) id 的列表,其中 gloss_qty 或 poster_qty 大於 4000。只在結果表中包含 id 欄位。

      SELECT id
      FROM orders
      WHERE gloss_qty > 4000 OR poster_qty > 4000;

       

    2. 編寫一個查詢,返回訂單 (orders) 的列表,其中標準數量 (standard_qty)為零,光澤度 (gloss_qty) 或海報數量 (poster_qty)超過 1000。

      SELECT *
      FROM orders
      WHERE standard_qty = 0 AND (gloss_qty > 1000 OR poster_qty > 1000);

       

    3. 查詢以 'C' 或 'W' 開頭的所有公司名 (company names),主要聯絡人 (primary contact包含 'ana' 或 'Ana',但不包含 'eana'。

      SELECT *
      FROM accounts
      WHERE (name LIKE 'C%' OR name LIKE 'W%') 
                 AND ((primary_poc LIKE '%ana%' OR primary_poc LIKE '%Ana%') 
                 AND primary_poc NOT LIKE '%eana%');

       

  • 總結

  • 語句 使用方法 其他詳細資訊
    SELECT SELECT Col1Col2, ... 提供需要的列
    FROM FROM Table 提供列所在的表格
    LIMIT LIMIT 10 限制返回的行數
    ORDER BY ORDER BY Col 根據列命令表格。與 DESC 一起使用。
    WHERE WHERE Col > 5 用於過濾結果的一個條件語句
    LIKE WHERE Col LIKE '%me%' 僅提取出列文字中具有 'me' 的行
    IN WHERE Col IN ('Y', 'N') 僅過濾行對應的列為 'Y' 或 'N'
    NOT WHERE Col NOT IN ('Y', "N') NOT 經常與 LIKE 和 IN 一起使用。
    AND WHERE Col1 > 5 AND Col2 < 3 過濾兩個或多個條件必須為真的行
    OR WHERE Col1 > 5 OR Col2 < 3 過濾一個條件必須為真的行
    BETWEEN WHERE Col BETWEEN 3 AND 5 一般情況下,語法比使用 AND 簡單一些
  • SELECT col1, col2
    FROM table1
    WHERE col3  > 5 AND col4 LIKE '%os%'
    ORDER BY col5
    LIMIT 10;

     

  • 移動平均值

  • 移動平均值用於將資料線性化,以便更容易觀察長期趨勢,也不會因日常波動而錯亂。例如,假設想視覺化服裝零售店的銷售趨勢。從每天的資料開始,而圖表看起來太不穩定,因為更多的人在週末購物,所以銷售額會在週末飆升。

  • 可以按周計算銷售額,但這可能不能顯示想要的一些詳細資訊。
  • 使用移動平均值可使每日波動平滑一些,也可以觀察長期趨勢。

 

    • Project : 探索未來氣候發展趨勢

    • 注:學習筆記是在優達學城學習時,參考部分課程內容總結而成。
    • Project : 探索未來氣候發展趨勢-專案心得:
      專案描述:用SQL編寫查詢,提取城市資料,並匯出至csv檔案,利用Excle對城市氣候變化趨勢進行視覺化,最終圍繞三個問題進行分析。
      專案心得:通過本專案,瞭解了全球變暖下的氣候發展背景,熟悉SQL基本查詢語句,初步瞭解資料分析基本流程,在實際問題與資料分析相聯絡方面有了新的認識,對於資料分析更加感興趣。