911 calls capstone project

1.Kaggle

  • Kaggle是一個數據建模和數據分析競賽平台。企業和研究者可在其上發布數據

  • 有眾多策略可以用於解決幾乎所有預測建模的問題, 而研究者不可能在一開始就了解什麼方法對於特定問題是最為有效的, Kaggle的目標則是試圖通過眾包的形式來解決這一難題, 進而使數據科學成為一場運動

2.Emergency - 911 Calls projects

3.讀取資料並了解資料

  1. 第一步必須先匯入pandas, numpy

    import numpy as np
    import pandas as pd
  2. 第二步記得將matplotlib的圖表直接嵌入到Notebook之中 (如果是使用jupyter notebook), 並匯入seaborn, matplotlib等視覺化套件

    import matplotlib.pyplot as plt
    import seaborn as sns
    sns.set_style('whitegrid')
    %matplotlib inline
  3. 讀取資料並分析資料

    df = pd.read_csv('911.csv')
    • 先了解資料欄位的型別以及變數的型態, 由pd.info()可以知道這份資料有9個欄位: 有3筆屬於float, 1筆屬於int64, 5筆屬於object (oject可能是屬於Series)

    df.info()

    • 可以確認前幾筆資料的內容長怎樣, 例如確認前10筆

    df.head(10)

    • 取得資料的基本統計數值: 如數量, 平均值, 標準差, 四分位數等數值

    pf.describe()

4.基本分析

  1. 列出出現次數前幾名的某欄位? 例如列出出現次數前5名的zipcode

    • value_counts會返回一個Series, 預設為由降冪排序, 想改成升冪排序也可以使用ascending=True

    df['zip'].value_counts().head(5)

  2. 某欄位有多少個唯一值? 例如有多少個title

df['title'].nunique()

5.產生新的feature

  1. title的格式是Reason/Department, 例如以EMS: BACK PAINS/INJURY來說, Reason就是EMS, 使用lambda表達式及apply()來創造新的Reason欄位

    pf['Reason'] = pf['title'].apply(lambda title: title.split(':')[0])
  2. 911中最常被呼叫的幾個原因為何?

    pf['Reason'].value_counts()

  3. seaborn產生countplot

    • countplot: x軸指定想要計數的欄位名稱, 指定資料來源

    sns.set_style('whitegrid')
    sns.countplot(x='Reason', data=pf)

  4. 取得timeStamp中的hour

    • 由於在DataFrame中所儲存的timeStamp Series為字串, 需要先轉成datetime

    pf['timeStamp'] = pd.to_datetime(pf['timeStamp'])
    pf['timeStamp'].iloc[0].hour
  5. 將timeStamp中的hour, month, dayofweek存在新欄位中

    • 對pf['timeStamp']中的每一個元素來說, 直接呼叫hour, month, dayofweek就可以取得小時, 月, 日資料

    pf['Hour'] = pf['timeStamp'].apply(lambda time: time.hour)
    pf['Month'] = pf['timeStamp'].apply(lambda time: time.month)
    pf['Day of Week'] = pf['timeStamp'].apply(lambda time: time.dayofweek)
    • 將Day of Week從number轉為string

    dmap = {0:'Mon',1:'Tue',2:'Wed',3:'Thu',4:'Fri',5:'Sat',6:'Sun'}
    pf['Day of Week'] = pf['Day of Week'].map(dmap)
    • 畫出Day of Week的countplot: x軸指定'Day of Week', hue指定'Reason'

    sns.countplot(x='Day of Week', hue = 'Reason', data = pf)
    
    # To relocate the legend
    plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)

    • groupby找出個月份中每個欄位分別的數量

    byMonth = pf.groupby('Month').count()

  6. 用seaborn來做每個月求救次數的線性回歸圖 (linear fit), 可以使用sns.lmplot

    • x軸資料指定為Month, y軸資料指定為twp, data指定為reset_index()後的資料

    sns.lmplot(x='Month',y='twp',data=byMonth.reset_index())

  7. 將timeStamp中的date存在新欄位中

    • 對pf['timeStamp']中的每一個元素來說, 必須呼叫date()以取得date資料

    pf['timeStamp'].iloc[0].date()
    pf['Date'] = pf['timeStamp'].apply(lambda t: t.date())
    • 畫出每日的求救次數的曲線圖

    byDate = pf.groupby('Date').count()['twp'].plot()
    plt.tight_layout()

  8. 對每一種撥打求救電話原因, 畫出其每日的求救次數的曲線圖: 先對原始資料進行條件過濾再plot

    • Taffic的每日的求救次數曲線圖, 並加上title

    pf[pf['Reason']=='Traffic'].groupby('Date').count()['twp'].plot()
    plt.title('Traffic')
    plt.tight_layout()

    • Fire的每日的求救次數曲線圖, 並加上title

    pf[pf['Fire']=='Traffic'].groupby('Date').count()['twp'].plot()
    plt.title('Fire')
    plt.tight_layout()

    • EMS的每日的求救次數曲線圖, 並加上title

    pf[pf['EMS']=='Traffic'].groupby('Date').count()['twp'].plot()
    plt.title('EMS')
    plt.tight_layout()

  9. Heatmap分析

    • 先取得一週中每天每小時的各欄位的累積數量

      pf.groupby(by=['Day of Week','Hour']).count()
    • 取出Reason欄位並畫出熱力圖

    dayHour = pf.groupby(by=['Day of Week','Hour']).count()['Reason'].unstack()
    plt.figure(figsize=(12,6))
    sns.heatmap(dayHour,cmap='viridis')

plt.figure(figsize=(12,6))
sns.clustermap(dayHour,cmap='viridis')

Last updated

Was this helpful?