はじめに
何か、オープンソースのデータを可視化したいなという思いで作ってみました。
foliumを使用することで地図上に情報を載せることが出来るみたいなので、
自分の興味のあるものと紐づけて作成してみました。
データのダウンロード
pythonのライブラリーのfoliumを用いることで、
地図上に緯度経度情報があるデータを表示することが可能になる。
まず、https://linkdata.org/work/rdf1s8817i
にあるアニメ聖地の位置情報があるサイトにアクセスし、Excelファイルの
ダウンロードを行う。
データの前処理
ダウンロードを行ったExcelファイルから、「作品名」「経度」「緯度」を抜き出し、
新規にエクセルを作成し、コピー&ペーストで貼り付ける。Excelファイルの
名称をdataにする。
df = pd.read_excel("data.xlsx", engine="openpyxl")
df
以下のように出力される。
作品名 緯度 経度
0 櫻子さんの足下には死体が埋まっている 43.770776 142.364744
1 僕だけがいない街 42.634082 141.605510
2 天体のメソッド 42.551203 140.764115
3 薄桜鬼 真改 41.768674 140.728924
4 艦隊これくしょん ‐ 艦これ‐ 41.292748 141.183478
... ... ... ...
459 五島の雲 山本二三美術館 NaN NaN
460 サンリオキャラクターパークハーモニーランド NaN NaN
461 【88番札所】東京都 NaN NaN
462 【0番札所】成田空港 NaN NaN
463 【1番札所】インフォメーションスポット NaN NaN
欠損値の処理
中身に、緯度・経度の情報が空欄の欠損値があるため、欠損値データの削除を行う。
df2 = df.dropna(subset=["緯度", "経度"])
df2
すると以下のように欠損値データがなくなる。
作品名 緯度 経度
0 櫻子さんの足下には死体が埋まっている 43.770776 142.364744
1 僕だけがいない街 42.634082 141.605510
2 天体のメソッド 42.551203 140.764115
3 薄桜鬼 真改 41.768674 140.728924
4 艦隊これくしょん ‐ 艦これ‐ 41.292748 141.183478
... ... ... ...
452 京都国際マンガミュージアム 35.010117 135.751464
454 水木しげるロード 35.539633 133.231627
455 青山剛昌ふるさと館 35.490018 133.758366
456 マチ★アソビ 34.070275 134.554863
457 香美市立やなせたかし記念館アンパンマンミュージアム 33.603884 133.686273
重複の削除
ここで、作品名の昇順に並び変えてみる。そして重複数を見てみる。
df2_sorted = df2.sort_values("作品名", ascending=False)
df2_sorted['作品名'].value_counts()
おへんろ。 16
心が叫びたがってるんだ。 8
ルドルフとイッパイアッテナ 8
艦隊これくしょん ‐ 艦これ‐ 5
文豪ストレイドッグス 4
..
ガールズ&パンツァー 最終章 1
ガーリッシュ ナンバー 1
ガヴリールドロップアウト 1
凪のあすから 1
香美市立やなせたかし記念館・アンパンマンミュージアム 1
重複が存在していることがわかる。そのため、
最初に出現した重複行を残し、その他を削除します。
df3 = df2_sorted.drop_duplicates(subset='作品名', keep='first')
df3
作品名 緯度 経度
100 香美市立やなせたかし記念館・アンパンマンミュージアム 33.603884 133.686273
457 香美市立やなせたかし記念館アンパンマンミュージアム 33.603884 133.686273
45 青梅赤塚不二夫会館 35.787990 139.275791
455 青山剛昌ふるさと館 35.490018 133.758366
412 長門有希ちゃんの消失 34.737877 135.341522
... ... ... ...
280 true tears 36.557318 136.875321
7 Wake Up, Girls! 新章 38.269075 140.870172
265 SHIROBAKO 35.717784 139.566260
107 ROBOTICS;NOTES 30.532819 130.958880
85 RDG レッドデータガール 33.988495 135.792417
105 rows × 3 columns
困った事1
ここで、今回生じた問題として、今回生じた問題として、df3加工済データ内にある。2,3行目「香美市立やなせたかし記念館・アンパンマンミュージアム」「香美市立やなせたかし記念館アンパンマンミュージアム」
7,8「長谷川町子記念館」「長谷川町子美術館」16,17「秒速5センチメートル」「秒速5センチメートル」(半角全角)
29,30の「有頂天家族2」、「有頂天家族2」、32,33「新潟市マンガ・アニメ情報館」、「新潟市マンガの家」
44,45「刀剣乱舞 ‐ONLINE‐」「刀剣乱舞 -ONLINE-」54,55「一休さん(酬恩庵一休寺)」「一休さん」
60,61,62「ヤマノススメ サードシーズン」「ヤマノススメ おもいでプレゼント」「ヤマノススメ サードシーズン」
85、86「ひるね姫~知らないワタシの物語~」「ひるね姫 ~知らないワタシの物語~」
100,101「『エヴァンゲリオン』シリーズ」「「エヴァンゲリオン」シリーズ」
といったいような重複が発見できた。
Levenshtein1で重複とみなす方法も考えましたが、それ以上の差があるものもあることから今回は、緯度経度が同じもので作成名が似ているものを削除する方法を試みようとしました。
困った事2
しかし、「蒼穹のファフナー」「かみちゅ!」が同じ緯度経度であることが判明34.409179 133.205638
「ハルチカ ~ハルタとチカは青春する~」「ちびまる子ちゃんランド」が同じ緯度経度34.975184 138.383293
薄桜鬼 真改 有頂天家族2 有頂天家族2 少年陰陽師 夜は短し歩けよ乙女 京都国際マンガミュージアム いなり、こんこん、恋いろは。 上記はすべて同じ緯度経度35.010117 135.751464 弱虫ペダル 『エヴァンゲリオン』シリーズ35.232366 139.106915
「秒速5センチメートル」「文豪ストレイドッグス」35.444668 139.642153
純情ロマンチカ 世界一初恋 ラブライブ! シュタインズ・ゲート35.694041 139.753586
杉並アニメーションミュージアム アクセル・ワールド アクエリオンロゴス35.699574 139.636385
時をかける少女 刀剣乱舞 ‐ONLINE‐ 刀剣乱舞 -ONLINE- 三ツ星カラーズ35.712607 139.779998
そにアニ -SUPER SONICO THE ANIMATION- SHIROBAKO35.717784 139.56626
ミス・モノクローム ガーリッシュ ナンバー38.601088 140.406779
釣りキチ三平 横手市増田まんが美術館39.313784 140.566648
実際に行ったこと
明らかに同じような緯度経度に様々な作品が重複しすぎているような気がしたため、 また作品数が残り、105ということを考えて、エクセルファイルから似たものを削除していった。 今回削除したものは、昇順にした際の後半のものを削除を行った。 3行目「香美市立やなせたかし記念館アンパンマンミュージアム」8行目「長谷川町子美術館」 17行目「秒速5センチメートル」29行目「有頂天家族2」32行目「新潟市マンガの家」 44行目「刀剣乱舞 -ONLINE-」53行目「一休さん」59,60行目「ヤマノススメ おもいでプレゼント」「ヤマノススメ サードシーズン」 82行目「ひるね姫 ~知らないワタシの物語~」97行目「「エヴァンゲリオン」シリーズ」
マッピングを行う
#94作品をマッピングを行う。
import folium
import pandas as pd
# データを読み込む(エンコーディングを指定する)
df = pd.read_excel("df3sakuzyo.xlsx", engine="openpyxl")
#☆↑ここのエクセルは、削除を行った後の名称に変更する必要あり
# 地図の中心を日本に設定する
map_center = [38.5, 138.5]
# 地図を作成する
map = folium.Map(location=map_center, zoom_start=5)
# データを地図に表示する
for index, row in df.iterrows():
folium.Marker(location=[row["緯度"], row["経度"]], popup=row["作品名"]).add_to(map)
# 地図をHTMLファイルとして保存する
map.save("map1.html")
また、緯度35°00'36.4" 経度135°45'05.3"ここは、京都の二条城前駅の近くのため、重複していてもおかしくはないと予想ができる。
最終的には、正確な場所は各作品を見て判断を行う必要はある。
おまけ<新規に場所を追加していく方法>
今回、下記のデータを追加で挿入してみる。
作品名: "プリパラ", "緯度": 35.6702989, "経度": 139.7074779
作品名: "エロマンガ先生", "緯度": 35.7612453, "経度": 139.8054765
# 追加するデータを辞書型に格納する
new_data_1 = {"作品名": "プリパラ", "緯度": 35.6703247, "経度": 139.7088716}
new_data_2 = {"作品名": "エロマンガ先生", "緯度": 35.7612453, "経度": 139.8054765}
# 追加するデータをDataFrameに変換する
new_df_1 = pd.DataFrame([new_data_1])
new_df_2 = pd.DataFrame([new_data_2])
# dfに新しいデータを追加する
df = df.append(new_df_1, ignore_index=True)
df = df.append(new_df_2, ignore_index=True)
df
作品名 緯度 経度
0 香美市立やなせたかし記念館・アンパンマンミュージアム 33.603884 133.686273
1 青梅赤塚不二夫会館 35.787990 139.275791
2 青山剛昌ふるさと館 35.490018 133.758366
3 長門有希ちゃんの消失 34.737877 135.341522
4 長谷川町子記念館 35.646575 139.653249
... ... ... ...
91 SHIROBAKO 35.717784 139.566260
92 ROBOTICS;NOTES 30.532819 130.958880
93 RDG レッドデータガール 33.988495 135.792417
94 プリパラ 35.670325 139.708872
95 エロマンガ先生 35.761245 139.805476
df.to_excel("df追加更新していく.xlsx", index=False)
import folium
import pandas as pd
# データを読み込む(エンコーディングを指定する)
df = pd.read_excel("df追加更新していく.xlsx", engine="openpyxl")
# 地図の中心を日本に設定する
map_center = [38.5, 138.5]
# 地図を作成する
map = folium.Map(location=map_center, zoom_start=5)
# データを地図に表示する
for index, row in df.iterrows():
folium.Marker(location=[row["緯度"], row["経度"]], popup=row["作品名"]).add_to(map)
# 地図をHTMLファイルとして保存する
map.save("map2.html")