#!/usr/bin/env python
# coding: utf-8
#
大菌輪_CCCデータセット:同定ツール
# (daikinrin_CCC_dataset_version1.2を使用)
# 2017/2/21更新
#
# 以下の解析を再現するには、jupyterと必要に応じて各種ライブラリ (pandas、NumPyなど) のインストールが必要です。
# 準備の仕方や基本操作に関してはweb上に多数の資料があるので、そちらを参照ください。
# ※注1:筆者はプログラミング初心者かつ独学なので、もっとよいやり方があるかもしれません。あくまで参考ということでお願いいたします。
# ※注2:以下でご紹介する方法はたぶん全てExcelでも代替できます。コードの読み方が分からない方も、「CCCデータセットを加工するとこんなことができる」という例としてご参考にしていただけます。
# 下の写真のきのこを同定してみます
#
# 傘が緑色で表面に細かい鱗片があり、ひだが褐色で、柄表面にも細かい鱗片があることなどが特徴です。
#
# Copyright © 2013 Caleb Brown
# (CC-BY-SA)
# In[1]:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import sys
get_ipython().run_line_magic('matplotlib', 'inline')
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")
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")
cccdict = dict(zip(dfccc["CCC_JP"],"<"+dfccc["CCC"]+">"))
cccdictr = {v:k for k, v in cccdict.items()}
ccclist = list(dfccc["CCC"])
cccjplist = [cccdictr[a] for a in df.columns[5:] if cccdictr.get(a) != None]
cccjplist.insert(0, "-------------------")
from ipywidgets import *
CCCselects = [Dropdown(description="CCC"+str(i+1), options=cccjplist) for i in range(6)]
VBox([HBox([CCCselects[0], CCCselects[1], CCCselects[2]]), HBox([CCCselects[3], CCCselects[4], CCCselects[5]])])
#↓実行するとボタンが表示されます
# In[3]:
#ドロップダウンメニューから値を取得し、CCCを辞書で英語に変換
#今回は「傘_色_緑」「子実層托_型_襞」「傘_表面_鱗片」「子実層托_色_褐」「柄_表面_鱗片」の5つを選択しました
cccs = [cccdict[CCCselects[i].value] for i in range(len(CCCselects)) if CCCselects[i].value != "-------------------"]
print(cccs)
if len(cccs) == 0:
print("何も選択されていないので終了します。")
sys.exit()
#属名の列を追加して重複除去属名リストからなるデータフレームを作成
df["genus"] = [a[0] for a in df["学名"].str.split(" ")]
resultdf = pd.DataFrame()
for ccc in cccs:
buf =[]
for a in sorted(set(list(df["genus"]))):
genusdf = df[df["genus"]==a]
genuscnt = genusdf.shape[0]
genusdfn = df[df["genus"]!=a]
ariari = genusdf[~genusdf[ccc].str.contains("【0】")].shape[0]
#ariariが1以上(ヒットあり)のみ絞り込み
if ariari != 0:
arinasi = genusdf.shape[0]-ariari
nasiari = genusdfn[~genusdfn[ccc].str.contains("【0】")].shape[0]
nasinasi = genusdfn.shape[0]-nasiari
se = round(ariari/(ariari+arinasi),2)
sp = round(nasinasi/(nasiari+nasinasi),2)
if sp == 1:
sp = 0.99
logpLR = round(np.log(se/(1-sp)),2)
buf.append([a,logpLR,genuscnt])
#陽性尤度比の対数をとったもの(logpLR)を足し合わせます
#print(ccc,a,ariari,arinasi,nasiari,nasinasi,se,sp,logpLR)
df2 = pd.DataFrame(buf)
df2.columns = ["genus","logpLR","genuscnt"]
#print(len(df2["genus"]),df2["genus"])
#df2にある属のみを残す
df = df[df["genus"].isin(df2["genus"])]
print(str(df.shape[0])+"件の記載文を絞り込み")
if resultdf.shape[0] == 0:
resultdf = df2
else:
#古いdf2を基にして左外部結合
resultdf = pd.merge(df2,resultdf,left_on="genus",right_on="genus",how="left")
#pLRを足し合わせて元の2列をdropする
resultdf["logpLR"] = resultdf["logpLR_x"]+resultdf["logpLR_y"]
resultdf = resultdf.drop(["logpLR_x","logpLR_y"],axis=1)
print(ccc+" "+str(resultdf.shape[0])+"属hit!!")
# In[4]:
#重複したgenuscntの列を削除
resultdf = resultdf.T.drop_duplicates().T
sns.set(font_scale=1.2)
resultdf.index = resultdf["genus"]
resultdf = resultdf.sort_values("logpLR",ascending=False)
resultdf[:30]["logpLR"].plot.barh().invert_yaxis()
plt.xlabel("logpLR")
plt.show()
# In[5]:
#上の図で一番値が大きかったStropharia(モエギタケ属)を調べてみます
genusselect = Dropdown(description="属内の種をさらに絞り込み", options=list(resultdf[:30]["genus"]))
genusselect
#↓実行するとボタンが表示されます
# In[6]:
import re
from heapq import merge
columnlist = ["和名","学名"]
df2 = df[df["genus"]==genusselect.value][list(merge(cccs,columnlist))]
df2 = df2.where(df2!="【0】[]", np.nan)
df2 = df2.replace(re.compile("\[.*|【|】"),"")
df2.columns = [cccdictr[a] if cccdictr.get(a) is not None else a for a in df2.columns]
#1つもヒットしなかった分類群を落とす(和名なしも除く)
df2 = df2[~df2["和名"].str.contains("(和名なし)")].dropna(subset=[cccdictr[a] for a in cccs],how="all")
df2 = df2.style.highlight_null("grey")
df2
# モエギタケ属の中で選んだ形質を全て持っているのは「モエギタケ (Stropharia aeruginosa)」であることが分かりました(これが正解です)
# http://mushroomobserver.org/image/show_image/379798?q=1Lb2
# In[ ]: