日本だと馴染みがないですが、アメリカの空港だと、TSA(Transportation Security Administration)という機関が荷物をチェックします。テロ対策ですね。
アメリカだと空港に預けた荷物のチェックインや機内への運搬、TSAによる中身チェックの過程で、荷物が破損しそれに対するクレームが多いみたいです。
日本では考えられません。
その多数のクレームをまとめたデータが、以下のTSAクレームデータです。

事件の発生日、空港の名前、航空会社、クレームの種類、クレームの発生した場所、示談金(Close Amount)などが書かれています。
Dispositonというのは、処分という意味で、Deny(却下)なのかApprove in Full(全額支払い)などがあるようです。
このTSAの荷物検査に対する顧客のクレームとまとめたデータがネットにあったので、これを分析してみようと思います。
[toc]
使用するデータとパッケージ
Macで以下のコマンドを使いエクセルデータをダウンロードします。
curl -O https://www.dhs.gov/sites/default/files/publications/claims-2014.xls
使用するパッケージはpandasとxlrdを使います。
xlrdはエクセルデータを扱うためのパッケージです。Anacondaを使用している場合は以下のようにインストールできます。
conda install -c anaconda xlrd
# Claim Numberをインデックスとして読み込む df = pd.read_excel(io='claims-2014.xls', index_col='Claim Number') df.info()
データの情報を調べるには`info()`を使用します。
<class 'pandas.core.frame.DataFrame'> Int64Index: 8855 entries, 2013081805991 to 2015012220083 Data columns (total 10 columns): Date Received 8855 non-null datetime64[ns] Incident Date 8855 non-null datetime64[ns] Airport Code 8855 non-null object Airport Name 8855 non-null object Airline Name 8855 non-null object Claim Type 8855 non-null object Claim Site 8855 non-null object Item Category 8855 non-null object Close Amount 8855 non-null object Disposition 8855 non-null object dtypes: datetime64[ns](2), object(8) memory usage: 761.0+ KB
合計で10列*8855行から構成されており、2つの列のdtypeがdatetime64型、8つの列のdtypeがobject型であることが分かりました。メモリは761KB使用しています。
初めの3行を出力するには以下の通りにします。
df.head(3)
Date Received Incident Date Airport Code Airport Name Airline Name Claim Type Claim Site Item Category Close Amount Disposition Claim Number 2013081805991 2014-01-13 2012-12-21 00:00:00 HPN Westchester County, White Plains USAir Personal Injury Checked Baggage Audio/Video; Jewelry & Watches 0 Deny 2014080215586 2014-07-17 2014-06-30 18:38:00 MCO Orlando International Airport Delta Air Lines Property Damage Checked Baggage - 0 Deny 2014010710583 2014-01-07 2013-12-27 22:00:00 SJU Luis Munoz Marin International Jet Blue Property Damage Checked Baggage Food & Drink 50 Approve in Full
datetime型を操作する
dtypeがdatetime型であれば、時間ごとの集計が可能になります。
例えば、時間ごとに起きたクレームの件数を表示するには以下のようにします。
# datetime型を操作すればどの時間にインシデントが起こったか、時間ごとに把握することができる grp = df.groupby(by=df['Incident Date'].dt.hour) grp['Item Category'].describe()
0 3421 146 Baggage/Cases/Purses 489 1 6 5 Other 2 2 11 9 - 2 3 5 5 Baggage/Cases/Purses 1 4 49 18 Baggage/Cases/Purses 6 5 257 39 - 33 6 357 54 - 43 7 343 43 Clothing 41 8 299 47 - 35 9 305 41 - 31 10 349 45 Other 43 11 343 41 - 45 12 363 51 Other 41 13 359 55 - 45 14 386 60 Baggage/Cases/Purses 49 15 376 51 Other 41 16 351 43 Personal Electronics 35 17 307 52 Other 34 18 289 43 Baggage/Cases/Purses 37 19 241 46 Baggage/Cases/Purses 26 20 163 31 Baggage/Cases/Purses 23 21 104 32 Baggage/Cases/Purses 20 22 106 33 Baggage/Cases/Purses 19 23 65 25 Baggage/Cases/Purses 14
dtypeがobjectってどういうこと?
8つの列のdtypeがobjectになっていました。例えば、示談金`Close Amount`なんかは数を表すので、intもしくはfloatじゃないの?って思いますが、そうではないみたいです。
df['Close Amount'].tail()
Claim Number 2015010219514 0 2015010219516 800 2015010219535 0 2015010819728 256 2015012220083 - Name: Close Amount, dtype: object
なんと!! 最後の行にハイフン(-)という文字列が入っています。
pandasでは、int,floatを判別できなかった場合には、”object”としてdtypeを認識するようです。
このハイフンを0に変換したらどうなるのでしょうか。
# ハイフンを、0に変換する関数を作成し、データフレームに適用する def dash_to_zero(x): if '-' in str(x): return 0 else: return x # 値をそのまま返却する df['Close Amount'].apply(dash_to_zero).tail()
Claim Number 2015010219514 0.0 2015010219516 800.0 2015010219535 0.0 2015010819728 256.0 2015012220083 0.0 Name: Close Amount, dtype: float64
dtypeがfloat64になりました。
小数点を持つデータがこの列のどこかに含まれていたのでintではなくfloatになったようです。
これで分析する準備ができました。
おわり。