วิเคราะห์ข้อมูลด้วย Apache Spark และ Python

ในบทความนี้ คุณจะได้เรียนรู้วิธีการวิเคราะห์ข้อมูลเชิงสํารวจโดยใช้ Azure Open Datasets และ Apache Spark บทความนี้วิเคราะห์ชุดข้อมูลแท็กซี่ของนิวยอร์ก ข้อมูลจะพร้อมใช้งานผ่านชุดข้อมูล Azure Open ชุดข้อมูลย่อยนี้ประกอบด้วยข้อมูลเกี่ยวกับการเดินทางด้วยรถแท็กซี่สีเหลือง: ข้อมูลเกี่ยวกับการเดินทางแต่ละครั้ง เวลาเริ่มต้นและสิ้นสุด และตําแหน่งที่ตั้ง ต้นทุน และแอตทริบิวต์ที่น่าสนใจอื่นๆ

ในบทความนี้ คุณ:

  • ดาวน์โหลดและเตรียมข้อมูล
  • วิเคราะห์ข้อมูล
  • แสดงข้อมูลเป็นภาพ

ข้อกำหนดเบื้องต้น

ดาวน์โหลดและเตรียมข้อมูล

หากต้องการเริ่มต้น ให้ดาวน์โหลด ชุดข้อมูลแท็กซี่ New York City (NYC) และเตรียมข้อมูล

  1. สร้างสมุดบันทึกโดยใช้ PySpark สําหรับคําแนะนํา ให้ดู สร้างสมุดบันทึก

    หมายเหตุ

    เนื่องจากเคอร์เนล PySpark คุณไม่จําเป็นต้องสร้างบริบทอย่างชัดเจน บริบท Spark จะถูกสร้างขึ้นสําหรับคุณโดยอัตโนมัติเมื่อคุณเรียกใช้เซลล์โค้ดแรก

  2. ในบทความนี้ คุณใช้ไลบรารีต่าง ๆ เพื่อช่วยแสดงภาพชุดข้อมูล หากต้องการทําการวิเคราะห์นี้ ให้นําเข้าไลบรารีต่อไปนี้:

    import matplotlib.pyplot as plt
    import seaborn as sns
    import pandas as pd
    
  3. เนื่องจากข้อมูลดิบอยู่ในรูปแบบ Parquet คุณสามารถใช้บริบท Spark เพื่อดึงไฟล์ลงในหน่วยความจําเป็น DataFrame ได้โดยตรง ใช้ API เปิดชุดข้อมูลเพื่อดึงข้อมูลและสร้าง Spark DataFrame หากต้องการอนุมานชนิดข้อมูลและเค้าร่าง ให้ใช้ Schema Spark DataFrame บน คุณสมบัติการอ่าน

    from azureml.opendatasets import NycTlcYellow
    
    end_date = parser.parse('2018-06-06')
    start_date = parser.parse('2018-05-01')
    nyc_tlc = NycTlcYellow(start_date=start_date, end_date=end_date)
    nyc_tlc_pd = nyc_tlc.to_pandas_dataframe()
    
    df = spark.createDataFrame(nyc_tlc_pd)
    
  4. หลังจากอ่านข้อมูลแล้ว ให้ทําการกรองเบื้องต้นบางอย่างเพื่อล้างชุดข้อมูล คุณอาจลบคอลัมน์ที่ไม่จําเป็นออกและเพิ่มคอลัมน์ที่แยกข้อมูลสําคัญ นอกจากนี้ คุณสามารถกรองสิ่งผิดปกติภายในชุดข้อมูลได้

    # Filter the dataset 
    from pyspark.sql.functions import *
    
    filtered_df = df.select('vendorID', 'passengerCount', 'tripDistance','paymentType', 'fareAmount', 'tipAmount'\
                                    , date_format('tpepPickupDateTime', 'hh').alias('hour_of_day')\
                                    , dayofweek('tpepPickupDateTime').alias('day_of_week')\
                                    , dayofmonth(col('tpepPickupDateTime')).alias('day_of_month'))\
                                .filter((df.passengerCount > 0)\
                                    & (df.tipAmount >= 0)\
                                    & (df.fareAmount >= 1) & (df.fareAmount <= 250)\
                                    & (df.tripDistance > 0) & (df.tripDistance <= 200))
    
    filtered_df.createOrReplaceTempView("taxi_dataset")
    

วิเคราะห์ข้อมูล

ในฐานะนักวิเคราะห์ข้อมูล คุณมีเครื่องมือมากมายที่พร้อมใช้งานเพื่อช่วยให้คุณสามารถแยกข้อมูลเชิงลึกจากข้อมูลได้ ในส่วนนี้ของบทความ เรียนรู้เกี่ยวกับเครื่องมือที่มีประโยชน์บางตัวที่พร้อมใช้งานภายในสมุดบันทึก Microsoft Fabric ในการวิเคราะห์นี้ คุณต้องการทําความเข้าใจปัจจัยที่ให้เคล็ดลับแท็กซี่ที่สูงขึ้นสําหรับรอบระยะเวลาที่เลือก

Apache Spark SQL เมจิก

ก่อนอื่น ทําการวิเคราะห์ข้อมูลสํารวจโดยใช้ Apache Spark SQL และคําสั่งเวทมนตร์ด้วยสมุดบันทึก Microsoft Fabric หลังจากที่คุณมีคิวรี แสดงภาพผลลัพธ์โดยใช้ความสามารถที่มีอยู่ภายในchart options

  1. ในสมุดบันทึก ให้สร้างเซลล์ใหม่และคัดลอกโค้ดต่อไปนี้ โดยใช้คิวรีนี้ คุณสามารถทําความเข้าใจว่าปริมาณคําแนะนําโดยเฉลี่ยมีการเปลี่ยนแปลงในรอบระยะเวลาที่คุณเลือกอย่างไร คิวรีนี้ยังช่วยให้คุณระบุข้อมูลเชิงลึกที่มีประโยชน์อื่น ๆ รวมถึงจํานวนคําแนะนําต่ําสุด/สูงสุดต่อวันและจํานวนค่าเฉลี่ย

    %%sql
    SELECT 
        day_of_month
        , MIN(tipAmount) AS minTipAmount
        , MAX(tipAmount) AS maxTipAmount
        , AVG(tipAmount) AS avgTipAmount
        , AVG(fareAmount) as fareAmount
    FROM taxi_dataset 
    GROUP BY day_of_month
    ORDER BY day_of_month ASC
    
  2. หลังจากคิวรีของคุณทํางานเสร็จสิ้น คุณสามารถแสดงภาพผลลัพธ์ได้โดยการสลับไปยังมุมมองแผนภูมิ ตัวอย่างนี้สร้างแผนภูมิเส้นโดยระบุ day_of_month เขตข้อมูลเป็นคีย์และ avgTipAmount เป็นค่า หลังจากที่คุณทําการเลือกแล้ว เลือก นําไปใช้ เพื่อรีเฟรชแผนภูมิของคุณ

แสดงข้อมูลเป็นภาพ

นอกจากตัวเลือกการสร้างแผนภูมิสมุดบันทึกที่มีอยู่ภายในแล้ว คุณสามารถใช้ไลบรารีโอเพนซอร์สยอดนิยมเพื่อสร้างการแสดงภาพของคุณเองได้ ในตัวอย่างต่อไปนี้ ให้ใช้ Seaborn และ Matplotlib ซึ่งเป็นไลบรารี Python ที่ใช้กันทั่วไปสําหรับการแสดงภาพข้อมูล

  1. เพื่อให้การพัฒนาง่ายขึ้นและมีราคาแพงน้อยลง ลดจํานวนตัวอย่างชุดข้อมูล ใช้ความสามารถในการสุ่มตัวอย่าง Apache Spark ที่มีอยู่แล้วภายใน นอกจากนี้ ทั้ง Seaborn และ Matplotlib ต้องการอาร์เรย์ Pandas DataFrame หรือ NumPy หากต้องการรับ DataFrame ของ toPandas() Pandas ให้ใช้คําสั่ง เพื่อแปลง DataFrame

    # To make development easier, faster, and less expensive, downsample for now
    sampled_taxi_df = filtered_df.sample(True, 0.001, seed=1234)
    
    # The charting package needs a Pandas DataFrame or NumPy array to do the conversion
    sampled_taxi_pd_df = sampled_taxi_df.toPandas()
    
  2. คุณสามารถทําความเข้าใจการแจกจ่ายเคล็ดลับในชุดข้อมูลได้ ใช้ Matplotlib เพื่อสร้างฮิสโทแกรมที่แสดงการแจกแจงจํานวนคําแนะนําและจํานวน จากการแจกแจง คุณจะเห็นว่าเคล็ดลับถูกบิดเบริดไปตามจํานวนที่น้อยกว่าหรือเท่ากับ $10

    # Look at a histogram of tips by count by using Matplotlib
    
    ax1 = sampled_taxi_pd_df['tipAmount'].plot(kind='hist', bins=25, facecolor='lightblue')
    ax1.set_title('Tip amount distribution')
    ax1.set_xlabel('Tip Amount ($)')
    ax1.set_ylabel('Counts')
    plt.suptitle('')
    plt.show()
    

    สกรีนช็อตของฮิสโทแกรมที่แสดงการแจกแจงยอดเงินเคล็ดลับ

  3. ถัดไป ลองทําความเข้าใจความสัมพันธ์ระหว่างเคล็ดลับสําหรับการเดินทางที่กําหนดและวันในสัปดาห์ ใช้ Seaborn เพื่อสร้างแผนภูมิกล่องที่สรุปแนวโน้มสําหรับแต่ละวันของสัปดาห์

    # View the distribution of tips by day of week using Seaborn
    ax = sns.boxplot(x="day_of_week", y="tipAmount",data=sampled_taxi_pd_df, showfliers = False)
    ax.set_title('Tip amount distribution per day')
    ax.set_xlabel('Day of Week')
    ax.set_ylabel('Tip Amount ($)')
    plt.show()
    
    

    กราฟที่แสดงการกระจายของเคล็ดลับต่อวัน

  4. สมมติฐานอื่นอาจเป็นเพราะมีความสัมพันธ์เชิงบวกระหว่างจํานวนผู้โดยสารและจํานวนทิปแท็กซี่รวม เพื่อยืนยันความสัมพันธ์นี้ ให้เรียกใช้รหัสต่อไปนี้เพื่อสร้างการลงจุดกล่องที่แสดงการกระจายเคล็ดลับสําหรับจํานวนผู้โดยสารแต่ละราย

    # How many passengers tipped by various amounts 
    ax2 = sampled_taxi_pd_df.boxplot(column=['tipAmount'], by=['passengerCount'])
    ax2.set_title('Tip amount by Passenger count')
    ax2.set_xlabel('Passenger count')
    ax2.set_ylabel('Tip Amount ($)')
    ax2.set_ylim(0,30)
    plt.suptitle('')
    plt.show()
    

    กราฟที่แสดงแผนภูมิวิสเกอร์แบบกล่องจํานวนคําแนะนําตามจํานวนผู้โดยสาร

  5. สุดท้าย สํารวจความสัมพันธ์ระหว่างยอดเงินค่าโดยสารและจํานวนคําแนะนํา จากผลลัพธ์คุณจะเห็นว่ามีข้อสังเกตหลายอย่างที่ผู้คนไม่ได้ให้คําแนะนํา อย่างไรก็ตาม มีความสัมพันธ์เชิงบวกระหว่างค่าโดยสารโดยรวมและจํานวนทิป

    # Look at the relationship between fare and tip amounts
    
    ax = sampled_taxi_pd_df.plot(kind='scatter', x= 'fareAmount', y = 'tipAmount', c='blue', alpha = 0.10, s=2.5*(sampled_taxi_pd_df['passengerCount']))
    ax.set_title('Tip amount by Fare amount')
    ax.set_xlabel('Fare Amount ($)')
    ax.set_ylabel('Tip Amount ($)')
    plt.axis([-2, 80, -2, 20])
    plt.suptitle('')
    plt.show()
    

    สกรีนช็อตของแผนภูมิกระจายของจํานวนคําแนะนํา