#!/usr/bin/env python
# coding: utf-8
#
大菌輪_CCCデータセット:つかいかた
# (daikinrin_CCC_dataset_version1.2を使用)
# 2017/2/21更新
#
# 以下の解析を再現するには、jupyterと必要に応じて各種ライブラリ (pandas、NumPyなど) のインストールが必要です。
# 準備の仕方や基本操作に関してはweb上に多数の資料があるので、そちらを参照ください。
# ※注1:筆者はプログラミング初心者かつ独学なので、もっとよいやり方があるかもしれません。あくまで参考ということでお願いいたします。
# ※注2:以下でご紹介する方法はたぶん全てExcelでも代替できます。コードの読み方が分からない方も、「CCCデータセットを加工するとこんなことができる」という例としてご参考にしていただけます。
# ①csvファイルの読み込み
# In[1]:
import pandas as pd
import numpy as np
dfccc = pd.read_csv("C:\\Users\\Atsushi Nakajima\\Dropbox\\大菌輪_CCC\\daikinrin_CCC_dataset_version1.2\\ccclist_daikinrin_ccc_ver._1.2_for_informal_or_mining_use_only.csv")
cccdictej = dict(zip("<"+dfccc["CCC"]+">",dfccc["CCC_JP"]))
#↓の保存場所は各自のPCに合わせたものを指定してください
#今回は担子菌のデータを使います
df = pd.read_csv("C:\\Users\\Atsushi Nakajima\\Dropbox\\大菌輪_CCC\\daikinrin_CCC_dataset_version1.2\\basidiomycota_daikinrin_ccc_ver._1.2_for_informal_or_mining_use_only.csv")
print(df.shape)
ccclist = list(df.columns)[5:]
#3249行×264列のデータを読み込みました
# ②CCCから該当する分類群一覧を出力
# In[2]:
#まずどんなCCCがあるのか確認します(とりあえず20件表示)
print(ccclist[:20])
# In[3]:
#「」を持つ分類群の一覧を出力します
i = ""
#本データセットではヒットなしの欄には「【0】[]」の値が入っています
#「~」の記号を先頭に加えることで「【0】」を除外しています
df2 = df[~df[i].str.contains("【0】")][["和名","学名",i]]
print(df2.shape[0],"件hit!")
#383件もヒットしたので、最初の5つを表示してみます
df2.head()
# In[4]:
#和名があるものに絞り込みたい時は
df2 = df[(~df["和名"].str.contains("和名なし"))&(~df[i].str.contains("【0】"))][["和名","学名",i]]
print(df2.shape[0],"件hit!")
df2.head()
# In[5]:
#「傘が灰色系で円筒形~棍棒形」など、複数のCCCで絞り込む場合も同じ要領です
#かつ
i1 =""
i2 = ""
df2 = df[(~df["和名"].str.contains("和名なし"))&(~df[i1].str.contains("【0】"))&(~df[i2].str.contains("【0】"))][["和名","学名"]]
print(df2.shape[0],"件hit!")
print(sorted(list(df2["和名"])))
#13の分類群が「傘が灰色系」かつ「傘が円筒形~棍棒形」ということが分かりました
#想定通り、ヒトヨタケの仲間が得られています
# ③特定の分類群のCCC一覧を出力
# In[6]:
from ipywidgets import *
wameilist = sorted([a for a in list(df["和名"]) if "和名なし" not in a])
wameiselect = Dropdown(description="好きなきのこを選んでね", options=wameilist)
wameiselect
# In[7]:
q = wameiselect.value
#「.T」で転置するのがポイント。CCCの部分だけを[5:]でスライスしている
df3 = df[df["和名"]==q].T[5:]
df3.columns = [q]
df3[q] = df3[q].astype(str)
df3 = df3[df3[q].str.contains("【[1-9]")].sort_index()
print(df3.shape[0],"件hit!")
df3.index = [cccdictej[a] for a in df3.index]
df3.sort_index(inplace=True)
df3
# ④解析例 その1(形質の比較)
# In[8]:
wameiselects = [Dropdown(description="和名"+str(i+1), options=wameilist) for i in range(3)]
print("傘の色を比較するきのこを3つ選んでね")
VBox([HBox([wameiselects[0], wameiselects[1], wameiselects[2]])])
# In[9]:
#3種の選んだきのこの傘の色を比べてみます
q = [wameiselects[0].value,wameiselects[1].value,wameiselects[2].value]
wameidict = dict(zip(df.index,df.iloc[:,1]))
#リスト形式で指定し、str.containsではなくisinを使います
df3 = df[df["和名"].isin(q)].T[5:]
df3 = df3.rename(columns={df3.columns[0]: wameidict[df3.columns[0]], df3.columns[1]: wameidict[df3.columns[1]], df3.columns[2]: wameidict[df3.columns[2]]})
df3 = df3[df3.index.str.contains("pileus_color")]
df3 = df3.where(df3!="【0】[]", np.nan)
df3.index = [cccdictej[a] for a in df3.index]
df3.sort_index(inplace=True)
df3 = df3.style.highlight_null("grey")
df3
# ⑤解析例 その2(よく似た分類群の検出)
# In[10]:
#次に選んだきのこに最も似ている分類群を調べてみます(少し実行に時間がかかる)
wameiselect = Dropdown(description="好きなきのこを選んでね", options=wameilist)
wameiselect
# In[13]:
q1 = wameiselect.value
from tqdm import tqdm
print(q1+"と似ているきのこを探索中…(少し時間がかかる)")
df5 = pd.DataFrame()
for wamei in tqdm(list(df[(~df["和名"].str.contains("和名なし"))]["和名"])):
q2 = wamei
df4 = df.T.iloc[5:,:].dropna()
df4.columns = df.T.iloc[1,:]
df4 = df4[[q1,q2]]
c = df4[(~df4.iloc[:,0].str.contains("【0】"))&(~df4.iloc[:,1].str.contains("【0】"))].shape[0]
a = df4[(~df4.iloc[:,0].str.contains("【0】"))].shape[0]
b = df4[(~df4.iloc[:,1].str.contains("【0】"))].shape[0]
jaccard = np.round(c/(a+b-c),2)
dfbuf = pd.DataFrame(np.array([wamei,jaccard])).T
df5 = pd.concat([df5,dfbuf])
df5.columns = ["和名","類似度(Jaccard係数)"]
df5 = df5.sort_values("類似度(Jaccard係数)",ascending=False).iloc[0:11,:]
df5.reset_index().drop("index",axis=1)
#上位10件を表示。
# 今後データを拡充していきます。解析の方法次第で色々な可能性があると思いますので、ぜひ楽しんでみてください。
# In[ ]: