【Pandas】空港のクレームデータを分析してみた

 

日本だと馴染みがないですが、アメリカの空港だと、TSA(Transportation Security Administration)という機関が荷物をチェックします。テロ対策ですね。

アメリカだと空港に預けた荷物のチェックインや機内への運搬、TSAによる中身チェックの過程で、荷物が破損しそれに対するクレームが多いみたいです。

日本では考えられません。

 

その多数のクレームをまとめたデータが、以下のTSAクレームデータです。

事件の発生日、空港の名前、航空会社、クレームの種類、クレームの発生した場所、示談金(Close Amount)などが書かれています。

Dispositonというのは、処分という意味で、Deny(却下)なのかApprove in Full(全額支払い)などがあるようです。

 

このTSAの荷物検査に対する顧客のクレームとまとめたデータがネットにあったので、これを分析してみようと思います。

 

使用するデータとパッケージ

 

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になったようです。

これで分析する準備ができました。

おわり。

参考

https://medium.com/kitepython/pandas-tutorial-da4dd84edd00