Python で解析 24
“Advent Calendar 2013 - Python で解析!” の二十四日目。実データの操作。
今回は、実際のデータを探ってみたい。ここまでのデータ操作を使って、簡単にできるところまで。
一応、これが Advent Calendar 2013 の最後。技術系の Advent Calendar では 25 までやるのが慣例のようだが、 Wikipedia で調べたら、 24 までと書いてあったからね!
1. 実データの取得
実データの取得がなかなか難しい…。ブログのネタ用に、データを探してみたのだが、なかなか都合のいいのが見つからない。ネタ的に、野球やサッカーなんかがよかったのだが、 PDF だったり、グラフ化された Web の記事だったり…で、 Pandas を試してみるのに、ちょうどいいのがなかなか見つからない。
政府系の Open Data の取り組みも、 Excel にレポート形式でまとめられてて、ちょっと加工してやらないと…といった感じで、軽いブログ記事でサクッと使うには、なかなか難しい。"DATA GO JP" ってのがあるのだが、フォーマットでは PDF が 4891 件でダントツの一位。う〜む、使えん…。CSV も 389 件あるが、放射濃度のデータがたくさんあって、クリスマスイブに取り上げるのもなぁ…。そんな中でも、レッドリストが使いやすくて、 Pands の練習にはちょうどいい感じ。テーマ的には、クリスマスイブなのに…とは思うが、探しまわるのに疲れたので、これで行くことにする。
import pandas as pd In [1]: import pandas as pd In [2]: df = pd.read_csv('http://www.sizenken.biodic.go.jp/va2007/va_2007.csv', encoding='Shift-JIS')
こんな感じで、 URL から直接 DataFrame が作れるのが便利。これで、クリスマスイブっぽいのが、見つかれば良かったのだが…。
2. 概要の把握
まずは、全体像を。
In [3]: df Out[3]: <class 'pandas.core.frame.DataFrame'> Int64Index: 13498 entries, 0 to 13497 Data columns (total 11 columns): 種コード 13498 non-null values 科名 13498 non-null values 和名 13498 non-null values 学名 13498 non-null values 都道府県コード 13498 non-null values 都道府県 13498 non-null values 平成12年レッドデータブック刊行時のランク 13498 non-null values 平成19年レッドリスト選定時のランク 13498 non-null values 2万5千地形図名 13315 non-null values メッシュコード 13498 non-null values 生育状況 13498 non-null values dtypes: float64(1), int64(2), object(8)
11 項目あって、int64 が 2 件しかないので、数値データではなく文字データのようだ。13,497 件のレコードがあり、ほとんどの項目に値が入っているが、"2万5千地形図名" には欠損があるようだ。"2万5千地形図名" を詳しくは知らないが、市町村名ぐらいで位置情報を特定できるものだと思われる。
軽く各項目の値も見ておく。
In [4]: df.head() Out[4]: 種コード 科名 和名 学名 都道府県コード 都道府県 \ 0 9240 ヒノキ リシリビャクシン Juniperus communis var. montana 1 北海道 1 60990 ヒルムシロ リュウノヒゲモ Potamogeton pectinatus 1 北海道 2 9240 ヒノキ リシリビャクシン Juniperus communis var. montana 1 北海道 3 9240 ヒノキ リシリビャクシン Juniperus communis var. montana 1 北海道 4 9240 ヒノキ リシリビャクシン Juniperus communis var. montana 1 北海道 平成12年レッドデータブック刊行時のランク 平成19年レッドリスト選定時のランク 2万5千地形図名 メッシュコード 生育状況 0 EN VU 鷹泊貯水池 654270 現存(生育) 1 VU NT 鵡川 634167 現存(生育) 2 EN VU 布部岳 644272 現存(生育) 3 EN VU 胆振福山 644222 現存(生育) 4 EN VU 神居古潭 654241 現存(生育)
11 項目もあるので、横には並べられなくて、分割して表示されている。横に並べて綺麗に見るには、 Excel とか…を使う方がいいだろう。
3. 欠損データの傾向調査
試しに、"2万5千地形図名" が入っていない都道府県を調べてみる。
In [5]: df[pd.isnull(df[u"2万5千地形図名"])][u'都道府県'].value_counts() Out[5]: 鹿児島県 58 東京都 19 静岡県 18 熊本県 13 大分県 8
ブログの都合上、トップ 5 だけ抜粋した。
で、きっと、生息地域の偏りと同じに違いない…と思って、全体の都道府県を調べてみる。
In [6]: df[u'都道府県'].value_counts() Out[6]: 北海道 798 岡山県 674 大分県 596 愛知県 537 山形県 533 宮城県 527 千葉県 519 長野県 453 三重県 437 鹿児島県 380
こっちはトップ 10 まで掲載してみたが、関連があるようには見えない。 念のため、統計的に調べてみる。
In [7]: s1 = df[u'都道府県'].value_counts() In [8]: s2 = df[pd.isnull(df[u"2万5千地形図名"])][u'都道府県'].value_counts() In [9]: In [9]: df1 = pd.DataFrame({u'都道府県1': s1}) In [10]: df2 = pd.DataFrame({u'都道府県2': s2}) In [11]: tmp = df1.join(df2) In [12]: tmp[u'都道府県2'] = tmp[u'都道府県2'].fillna(0) # 欠損データがなかったところに 0 を補完する。 In [13]: tmp.corr() # 相関係数 Out[13]: 都道府県1 都道府県2 都道府県1 1.000000 0.163086 都道府県2 0.163086 1.000000
相関係数 0.16 ってことで、生息地域の偏りとは関係なさそうだ。
品種によって生息地が特定しにくい…とかあるのだろうか?
In [14]: s1 = df[u'科名'].value_counts() In [15]: s2 = df[pd.isnull(df[u"2万5千地形図名"])][u'科名'].value_counts() In [16]: In [16]: df1 = pd.DataFrame({u'科名1': s1}) In [17]: df2 = pd.DataFrame({u'科名2': s2}) In [18]: tmp = df1.join(df2) In [19]: tmp[u'科名2'] = tmp[u'科名2'].fillna(0) # 欠損データがなかったところに 0 を補完する。 In [20]: tmp.corr() # 相関係数 Out[20]: 科名1 科名2 科名1 1.000000 0.778866 科名2 0.778866 1.000000
相関係数 0.78 ってことで、正の相関があるようなのだが、納得するには、もう一歩。
In [21]: df1.head(10) Out[21]: 科名1 キク 1605 カヤツリグサ 909 ゴマノハグサ 850 シソ 838 タヌキモ 801 タデ 628 ガガイモ 582 トチカガミ 533 ヒルムシロ 460 ミクリ 386
In [22]: df2.head(10) Out[22]: 科名2 カヤツリグサ 23 キク 20 シソ 12 アカネ 10 ゴマノハグサ 9 ガガイモ 8 ヤブコウジ 7 セリ 6 ミクリ 5 メシダ 5
両方の科名の重複状況から考えて、品種によって…というよりも、品種の多いものが "2万5千地形図名" の欠損が多いということなのだろう。財布を落としやすい名字を調べたら、全国の名字の多い順と類似していた…といったような、まあ、妥当な欠損状況のようだ。
…と、こんな感じで Pandas を活用して、データを調べられる訳だ。
4. 歯切れの悪い終わり方だが…
まだ、調査開始したばかりで、いきなり終わるのも気が引けるが、Advent Calendar の目的が Pandas の機能調査なので、ここまでとしたい。
あわよくば "マクドナルド対コンビニの垣根を越えた戦争が始まっている" みたいなレポートが出せれば良かったのだが、そう簡単には行かない。深堀してゆくには、それなりに時間がかかる (そして、実際のデータマイニングも、こーゆー地道な作業の積み重ねだったりするのだけど) …。
今回はこんなところで。