#!/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[ ]: