Tag: news

  • PROJECT Data Analysis

    สำหรับส่วนนี้ จะเป็นส่วนที่ผมได้ลองหยิบ dataset จาก Kaggle มาลองใช้ทักษะทั้งหมดที่ได้เรียนมาเพื่อ ตอบคำถามจาก User ในที่นี้ User คือ Gemini

    ผมได้ทำการจ้างผู้เชี่ยวชาญโดยการให้สร้างให้ Gemini เป็นจำลองเป็น Manager ขององค์กรแห่งหนึ่งและทำการวิเคราะห์และตั้งโจทย์คำถามจาก dataset ที่เลือกมา แล้วผมจะเป็นผู้ตอบคำถามเหล่านั้น

    ซึ่งก่อนจะไปดู Project เหล่านั้นกัน เดี๋ยวผมจะขอลองยกตัวอย่าง Project สัก 1 ชิ้นที่ได้ใช้ทักษะของ Python และ library pandas และ numpy ที่ศึกษาจาก DataRockie Bootcamp มาให้ดูเป็นตัวอย่าง เพื่อให้ทุกท่านได้เห็นแนวคิด และเทคนิคพื้นฐานที่ผมนำมาใช้ในการวิเคราะห์ข้อมูล และทำ Project ต่างๆกันดูนะครับ

    เริ่มต้นจากที่เรามี Dataset อยู่ 1 ไฟล์ เป็นไฟล์ .CSV เราจะใช้ทักษะของ python มาวิเคราะห์ข้อมูล แล้วตอบคำถามทั้งหมด 10+1 คำถามต่อไปนี้

    TODO 01 – how many columns, rows in this dataset
    TODO 02 – is there any missing values?, if there is, which colunm? how many nan values?
    TODO 03 – your friend ask for California data, filter it and export csv for him
    TODO 04 – your friend ask for all order data in California and Texas in 2017 (look at Order Date), send him csv file
    TODO 05 – how much total sales, average sales, and standard deviation of sales your company make in 2017
    TODO 06 – which Segment has the highest profit in 2018
    TODO 07 – which top 5 States have the least total sales between 15 April 2019 – 31 December 2019
    TODO 08 – what is the proportion of total sales (%) in West + Central in 2019 e.g. 25%
    TODO 09 – find top 10 popular products in terms of number of orders vs. total sales during 2019-2020
    TODO 10 – plot at least 2 plots, any plot you think interesting 🙂

    เราเริ่มจากการเพิ่ม library pandas และ numpy เข้าไปก่อน ** พยายามทำให้เป็นนิสัย **

    ขั้นตอนถัดไป ก่อนที่จะทำการวิเคราะห์ข้อมูล เราจะทำการ Check data ก่อนทุกครั้ง โดยการใช้คำสั่งต่อไปนี้ ** พยายามทำให้เป็นนิสัย **

    df.head() , df.tail()

    เพื่อเช็คข้อมูล 5 แถวบนสุด และ 5 แถวล่างสุดของ dataset

    จะเห็นได้ว่า column Postal Code จะมี missing values อยู่ 11 cell เราจะลองตรวจสอบว่าถูกต้องหรือไม่ โดยการใช้คำสัั่ง

    จากนั้น จะทำการดึงข้อมูล data จากไฟล์ต้นฉบับ ที่เอาเฉพาะ rows ที่มีค่า Postal Code เป็นค่าว่างออกมาสร้างเป็น dataframe ก้อนใหม่โดยเขียนเพิ่มเติมดังนี้

    df_missing = df[df[‘Postal Code’].isnull()]

    เท่านี้เราก็ได้ dataframe ก้อนใหม่ที่มี Postal Code เป็นค่าว่างออกมาเรียบร้อย



    คำถามข้อที่ 3 นี้ เป็นการ Filter โดย User อยากได้ข้อมูลเฉพาะ State ที่เป็น California เท่านั้น เราจึงต้อง Filter โดยใช้คำสั่งดังนี้

    df_cali = df[df[“State”] == “California”]

    เป็นการ Filter column “State” โดยเอาเฉพาะที่มีคำว่า “California” เท่านั้น และให้แสดงข้อมูลออกมาทั้งแถว และแทนค่าผลลัพธ์ในให้อยู่ใน dataframe ที่ชื่อว่า df_cali

    เมื่อได้ข้อมูลแล้วเราจะส่งไฟล์นี้กลับให้เพื่อเรา ซึ่งต้องการไฟล์ .CSV เราจะต้องเขียนคำสั่งดังนี้

    file_name = ‘california.csv’

    df_cali.to_csv(file_name, index=False)

    คำสั่งนี่เริ่มต้นจากกำหนดชื่อไฟล์ที่เราจะ export ออกมา ในที่นี้ไฟล์จะชื่อว่า california.csv

    จากนั้นใช้คำสั่งจากในการ create ไฟล์

    df_cali.to_csv(‘california.csv’, index=False)

    'california.csv': จะเป็นชื่อไฟล์ที่ต้องการสร้าง ส่วน index=False: เราจพใส่เพื่อป้องกันไม่ให้ index ของ Dataframe ถูก save ลงในไฟล์


    คำถามข้อที่ 4 นี้ เราต้องการหาผลลัพธ์ของ State ที่เป็น California และ Texas ในปี 2017 อิงจาก Column Order date เท่านั้น

    เริ่มจากการสร้างคำสั่ง Filter ตามโจทย์ความต้องการของ User ก่อน

    ผมเริ่มจากวันที่ก่อน เพราะต้องการเปลี่ยนรูปแบบวันที่ให้เป็น datetime เพื่อให้สามารถทำการเปรียบเทียบวันที่ได้ เพราะจากที่เราตรวจสอบในตอนต้นก่อนเริ่มทำการตอบคำถาม จะเห็นได้ว่า column Order date เป็น type Object ผมจึงใช้คำสั่งต่อไปนี้

    pd.to_datetime(df["Order Date"])

    จากนั้นเราเอาเฉพาะค่าที่เป็นปี 2017 โดยเพิ่มคำสั่งต่อท้ายดังนี้

    pd.to_datetime(df[“Order Date”]).dt.year == 2017

    คำสั่ง .dt.year หมายความว่า เอารูปแบบ Year ที่มีค่าเท่ากับ 2017 เท่านั้น

    หลังจากนั้นก็ filter อีกส่วนหนึ่งคือ State ที่เป็น California และ Texas

    จากนั้นก็นำทั้ง 2 ส่วนมารวมกัน โดยการ Filter มากกว่า 1 เงื่อนไข เราจะใส่เครื่องหมาย & เข้าไป เราสร้าง dataframe ใหม่ขึ้มาชื่อว่า df_cali_texas_in_2017

    พอเสร็จเรียบร้อยเราก็ Export ข้อมูลส่งให้เพื่อนเราใหม่อีกครั้ง


    คำถามถัดมาเราต้องการหาค่าของยอดขายในปี 2017 เพราะฉะนั้นก่อนอื่นเราใช้เทคนิคเดียวกับข้อเมื่อสักครู่ โดยการแปลง Column Order date ให้เป็นรูปแบบวันที่ก่อน

    pd.to_datetime(df[“Order Date”]).dt.year == 2017

    จากนั้นเราต้องการหาผลลัพธ์ของ Column Sales เราก็เลือกเฉพาะ Column นี้มา แล้วใช้ library numpy ในการใช้ function คำนวณยอดขาย และ Print ข้อมูลออกมาแสดง

    • ใช้เพื่อคำนวณ ยอดขายรวม
    • ใช้เพื่อคำนวณ ยอดขายเฉลี่ย
    • ใช้เพื่อคำนวณ ส่วนเบี่ยงเบนมาตรฐาน ของยอดขาย

    คำถามนี้ไม่ยุ่งยาก User ต้องการให้ดูว่าผลกำไรของปี 2018 เราได้ผลกำไรจากสินค้าในกลุ่ม Segment อะไรมากที่สุด

    ผมจึงเลือกที่จะใช้ Groupby ในการจัดหมวดหมู่ของสินค้าแยกตาม Segment และให้แสดงผล Profit หรือกำไรออกมาในทั้งหมดทุกกลุ่มที่มีการขายสินค้าในปีนั้น


    คำถามข้อนี้เราจะไม่ได้ทำการแปลงค่าเป็น datetime แบบข้อก่อนๆ และเนื่องจากเหตุผลนี้ ทำให้ตอนที่ผลเขียนคำสั่ง Filter ข้อมูล column Order Date จึงใส่ ทำการใส่เครื่องหมาย “” ลงไปเพื่อให้สามารถเปรียบเทียบข้อมูลได้อย่างถูกต้อง

    จากนั้นเมื่อได้ข้อมูลเปรียบเทียบมาแล้ว ผมได้ทำการ Group by รวมข้อมูลออกมาโดยแบ่งตาม State และเอาข้อมูลยอดขายน้อยที่สุดออกมา โดยใช้คำสั่งดังนี้

    df_least_top_5.groupby(“State”)[“Sales”].sum().sort_values(ascending=True).head(5)


    ผมทำการเรียงลำดับค่า (Sort) ยอดขาย [“Sales”] จากน้อยสุดไปมากสุด โดยเอาเฉพาะ 5 ค่าแรกมาแสดง .head(5)


    คำถามข้อนี้ ต้องการให้คิด % ยอดขายสินค้าแยกตาม Region ในปี 2019 เราเริ่มจากการ Filter ค่าวันที่เหมือนข้อก่อนๆ

    pd.to_datetime(df[“Order Date”]).dt.year == 2019

    จากนั้นก็ทำการ Group by แยกตาม Region และให้แสดงค่า column Sales ออกมา

    พอได้ผลลัพธ์เรียบร้อย คำถามคือให้คิดเป็น % ดังนั้นผมจึงนำผลลัพธ์ที่ได้ เอามาหารด้วยค่ายอดค่ารวมทั้งปี 2019 แล้ว คูณด้วย 100 จะได้เป็นค่า % ยอดขายแต่ละภูมิภาค (Region) แล้วนำผลลัพธ์ไปสร้างเป็น Data frame ก้อนใหม่ ใช้ชื่อว่า df_2019_Region

    จากนั้นขั้นตอนสุดท้าย คำถามถามว่า สัดส่วนยอดขายรวม (%) ของภาคตะวันตก West รวมกับ ภาคกลาง Central คิดเป็นเท่าไหร่ในปี 2019 ผมจึงใช้วิธีพื้นฐานคือเอาค่าทั้ง 2 Region มาบวกกัน จะได้เท่ากับ 55%


    คำถามข้อนี้ต้องการให้หาว่า ช่วงระหว่างปี 2019 – 2020 สินค้าที่ขายดีในแง่ของคำสั่งซื้อ เทียบกับยอดขายรวมมีอะไรน่าสนใจบ้าง 10 ลำดับแรก

    ในคำถามนี้ สิ่งที่เราอยากได้คือค่า Quantity หรือจำนวนคำสั่งซื้อ Filter ในปี 2019 – 2020 เพราะฉะนั้นเราเริ่มจากการ Filter ในส่วนนี้ก่อน พร้อมแทนค่าเป็น Data frame ก้อนใหม่ที่ชื่อว่า df_2019_2020

    และสุดท้ายแสดงค่าผลลัพธ์ 10 ลำดับแรก


    คำถามสุดท้าย ผมได้ทำการนำ dataframe จากข้อก้อนๆมาหาความสัมพันธ์ในรูปแบบกราฟแสดงผลลัพธ์ โดยสร้างออกมา 2 กราฟ ดังนี้

    ความสัมพันธ์นี้ แสดงถึงผลกำไรของสินค้า เทียบกับส่วนลด จะเห็นได้ว่าสินค้าที่มีผลกำไรเยอะ ส่วนใหญ่จะเป็นสินค้าที่ไม่มีส่วนลด หรือลดไม่เยอะมาก ไม่เกิน 20% ในทางตรงกันข้ามสินค้าที่มีส่วนลดเยอะ จะไม่สร้างผลกำไรให้กับบริษัท 80%

    ส่วนกราฟที่ 2 นี้แสดงถึงค่ายอดขายรวมของ State California ที่เราส่งให้เพื่อนไปในตอนต้น โดยการเทียบเป็น Bar Chart ให้ดูว่า สินค้าหมวดหมู่ใดมียอดขายเป็นเท่าไหร่กลุ่มสินค้าตัวไหนยอดขายสูงหรือกลุ่มไหนยอดไหนต่ำ


    ก็จบไปเป็นที่เรียบร้อย ต้องบอกว่า Project ตัวอย่างนี้ เป็นการใช้ทักษะที่ได้เรียนจาก Data Science Bootcamp ใน Part ของ Python เพื่อนำมาใช้ตอบคำถามที่ทางอาจารย์ตั้งโจทย์ไว้ หวังว่าทุกท่านจะได้เห็นแนวคิด แล้วก็วิธีการวิเคราะห์ข้อมูล และการจัดการข้อมูลในแนวทางของผมไปกันเรียบร้อยแล้ว หลังจากนี้จะเป็น Project ที่ทำนอกเหนือจากเนื้อหาที่เรียน โดยการหยิบ dataset จาก kaggle มาวิเคราะห์และตอบคำถาม จากโจทย์ที่ผู้เชี่ยวชาญด้านวิเคราะห์ข้อมูลหรือในที่นี้คือ Gemini เป็นผู้คิดโจทย์ให้

    หวังว่าจะมีประโยชน์กับทุกท่านไม่มากก็น้อยนะครับ


  • PAO YING CHUB in R-Programing

    หลังจากที่ได้เรียน และศึกษาทางด้าน R-Language มาพอสมควร พอมาถึงตอนนี้ได้รับโจทย์ให้ลองเขียน Function สำหรับการเล่นเกมส์ง่ายๆ คือการเป่ายิ้งฉุบ และมีการนับคะแนน แพ้/ชนะ ระหว่างผู้เล่น และ บอท เดี๋ยวเรามาลองดู Function กัน และเดี๋ยวจะมีการอธิบายว่า Code ที่ระบุในแต่ละขั้นตอน ใช้ทำอะไรกันบ้างนะครับ

    ภาพด้านบนจะเป็น Code ทั้งหมดที่ผมทำการเขียนเพื่อใช้เรียก Function การเล่นเกมส์นี้

    ทีนี้เรามาย่อย และทำความเข้าใจ Code ในแต่ละ กระบวนการกันนะครับ


    hand <- c("rock", "paper", "scis")
    • code ในบรรทัดแรก จะเป็นการสร้างตัวแปล hand เพื่อใช้ในการเก็บค่าตัวเลือกที่เป็นไปได้ทั้งหมด ในทีนี้คือ ค้อน(“rock”) กรรไกร(“scis”) และกระดาษ(“paper”)
    play_game <- function() {
      user_score <- 0
      Bot_score <- 0
      
      print("Welcome to a New World")
      print("Let's Play a game!!")
    • code ถัดมาจะเป็นการระบุว่า จะสร้าง Function ที่ชื่อว่า “play_game()” หากพิมพ์ตามนี้จะเป็นการต้อนรับพร้อมกับเปิดการเล่นเกมส์ และนอกเหนือจากนั้น จะมีการนับ Score ด้วย โดยเริ่มต้นใน Score ของผู้เล่น และ บอท เริ่มที่ 0 คะแนนเท่ากัน
        for (round in 1:10) {
        print(paste0("for_round: ",round))
              user_h <- readline("You turn ..and (rock,paper,scis): ")
            while(!(tolower(user_h) %in% hand)) {
              user_h <- readline("Please choose again (rock, paper, scis): ")
            }
        bot_h <- sample(hand, 1)
        print(paste0("for round bot choose: ",bot_h))
    • สำหรับส่วนนี้จะเป็นส่วนสำคัญคือการเล่นเกมส์ และการนับจำนวนรอบ โดยสามารถอธิบายได้ดังนี้
    • user_h <- readline(“You turn ..and (rock,paper,scis): “)
      จะเป็นการขอให้ผู้เล่นป้อนตัวเลือก ว่าจะออก ค้อน กรรไกร หรือ กระดาษ
    • while(!(tolower(user_h) %in% hand)) {
      user_h <- readline(“Please choose again (rock, paper, scis): “)
      }

      จะเป็นการตรวจสอบว่าตัวเลือกที่ผู้เล่นป้อน ตรงกับตัวเลือกที่ระบุในตอนต้นหรือไม่ (rock, paper, scis) หากไม่ใช่ ผู้เล่นจะต้องป้อนใหม่จนกว่าจะถูกต้อง
    • bot_h <- sample(hand, 1)
      จะเป็นการที่ บอท จะทำการสุ่มตัวเลือก ตามที่มีระบุในตอนต้น (rock, paper, scis)
    • print(paste0(“for round bot choose: “,bot_h))
      เป็นการแสดงตัวเลือกที่คอมพิวเตอร์เลือก
    if (tolower(user_h) == bot_h) {
        print("Draw")
            } 
    else if ((tolower(user_h) == "rock" && bot_h == "paper") |
             (tolower(user_h) == "paper" && bot_h == "scis") |
             (tolower(user_h) == "scis" && bot_h == "rock")) 
    {
         print("You lose this round")
         Bot_score <- Bot_score + 1
            } 
    else {
          print("You win in this round!!!")
          user_score <- user_score + 1
         }
    }
    • ส่วนรองสุดท้ายนี้จะเป็นการตัดสินผลแพ้ชนะในแต่ละรอบการเล่น โดยเป็นการกำหนดเงื่อนไขว่า
      – หากตัวเลือกที่ผู้เล่นและบอท เลือกเป็นตัวเดียวกัน ประกาศผลว่า เสมอกัน
      – หากตัวเลือกที่ผู้เล่นเลือก เป็นฝ่ายแพ้ บอท ประกาศว่า บอทชนะในรอบนั้นๆ
      – หากตัวเลือกที่ผู้เล่นเลือก เป็นฝ่ายชนะ บอท ประกาศว่า ผู้เล่นชนะในรอบนั้นๆ
     print("Final score")
     print(paste0("Your score: ", user_score ))
     print(paste0("Bot score: ", Bot_score))
        
     if (user_score > Bot_score) {
            print("YOU A WINNER !!!")
          } else if (user_score == Bot_score) {
            print("DRAW Try Agian")
          } else {
            print("BOT WINNER !!!")
          }
        }
    • ส่วนสุดท้าย เป็นการแสดงผลคะแนน และประกาศผู้ชนะเมื่อเล่นครบ 10 รอบการแข่งขัน
    • ถ้าหาก คะแนนผู้เล่น มากกว่าให้ประกาศว่าผู้เล่นชนะ
      ถ้าหาก คะแนนบอท มากกว่าให้ประกาศว่าบอทชนะ และ
      หากคะแนนเท่ากันให้ประกาศว่าเสมอกัน