大菌輪_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列のデータを読み込みました
(3249, 264)
C:\Users\Atsushi Nakajima\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py:2717: DtypeWarning: Columns (257,263) have mixed types. Specify dtype option on import or set low_memory=False.
  interactivity=interactivity, compiler=compiler, result=result)

②CCCから該当する分類群一覧を出力

In [2]:
#まずどんなCCCがあるのか確認します(とりあえず20件表示)
print(ccclist[:20])
['<pileus_length=under_10mm>', '<pileus_length=10-30mm>', '<pileus_length=30-50mm>', '<pileus_length=50-100mm>', '<pileus_length=100-150mm>', '<pileus_length=150-200mm>', '<pileus_length=over_200mm>', '<pileus_color=whitish_to_greyish_cream>', '<pileus_color=greyish>', '<pileus_color=yellowish>', '<pileus_color=pinkish_to_rose>', '<pileus_color=orange_to_red>', '<pileus_color=greenish>', '<pileus_color=purple_to_blueish>', '<pileus_color=brownish>', '<pileus_color=blackish_brown_to_black>', '<pileus_shape=ellipsoidal_to_oval>', '<pileus_shape=conical>', '<pileus_shape=globose_to_subglobose>', '<pileus_shape=cylindric_to_clavate>']
In [3]:
#「<pileus_color=pinkish_to_rose>」を持つ分類群の一覧を出力します
i = "<pileus_color=pinkish_to_rose>"
#本データセットではヒットなしの欄には「【0】[]」の値が入っています
#「~」の記号を先頭に加えることで「【0】」を除外しています
df2 = df[~df[i].str.contains("【0】")][["和名","学名",i]]
print(df2.shape[0],"件hit!")
#383件もヒットしたので、最初の5つを表示してみます
df2.head()
424 件hit!
Out[3]:
和名 学名 <pileus_color=pinkish_to_rose>
0 ニクウチワタケ Abortiporus biennis 【1】[11354]
6 シロオオハラタケ Agaricus arvensis 【1】[2980]
8 (和名なし) Agaricus augustus 【1】[6017]
12 ツクリタケ Agaricus bisporus 【1】[6009]
22 (和名なし) Agaricus devoniensis 【1】[1098]
In [4]:
#和名があるものに絞り込みたい時は
df2 = df[(~df["和名"].str.contains("和名なし"))&(~df[i].str.contains("【0】"))][["和名","学名",i]]
print(df2.shape[0],"件hit!")
df2.head()
156 件hit!
Out[4]:
和名 学名 <pileus_color=pinkish_to_rose>
0 ニクウチワタケ Abortiporus biennis 【1】[11354]
6 シロオオハラタケ Agaricus arvensis 【1】[2980]
12 ツクリタケ Agaricus bisporus 【1】[6009]
37 ナカグロモリノカサ Agaricus moelleri 【1】[6012]
109 ササクレシロオニタケ Amanita eijii 【1】[10543]
In [5]:
#「傘が灰色系で円筒形~棍棒形」など、複数のCCCで絞り込む場合も同じ要領です
#<pileus_color=greyish>かつ<pileus_shape=cylindric_to_clavate>
i1 ="<pileus_color=greyish>"
i2 = "<pileus_shape=cylindric_to_clavate>"
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の分類群が「傘が灰色系」かつ「傘が円筒形~棍棒形」ということが分かりました
#想定通り、ヒトヨタケの仲間が得られています
18 件hit!
['ウシグソヒトヨタケ', 'クズヒトヨタケ', 'コガネキヌカラカサタケ', 'コナヒトヨタケ', 'ザラエノヒトヨタケ', 'トフンヒトヨタケ', 'ナカグロヒガサタケ', 'ニオイコナヒトヨタケ', 'ネナガノヒトヨタケ', 'バフンヒトヨタケ', 'ヒトヨタケ', 'ヒメクズヒトヨタケ', 'ヒメコナヒトヨタケ', 'ヒメヒガサヒトヨタケ', 'ホソネヒトヨタケ', 'マルミザラエノヒトヨタケ', 'ユバリヒトヨタケ', 'ワタヒトヨタケ']

③特定の分類群の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
50 件hit!
Out[7]:
クロハツ
つば_有無_無 【3】[1616, 6549, 8129]
つぼ_有無_無 【3】[1616, 6549, 8129]
傘_形状_凸形 【2】[1616, 6549]
傘_形状_凹形 【3】[1616, 6549, 8129]
傘_形状_扁平 【1】[6549]
傘_直径_100-150mm 【3】[1616, 6549, 8129]
傘_直径_150-200mm 【2】[1616, 8129]
傘_直径_200mm以上 【1】[1616]
傘_直径_30-50mm 【2】[1616, 6549]
傘_直径_50-100mm 【3】[1616, 6549, 8129]
傘_色_桃 【1】[1616]
傘_色_橙赤 【1】[6549]
傘_色_灰 【2】[6549, 8129]
傘_色_白 【3】[1616, 6549, 8129]
傘_色_褐 【3】[1616, 6549, 8129]
傘_色_黒 【3】[1616, 6549, 8129]
傘_表面_乾性 【1】[1616]
傘_表面_亀裂 【2】[6549, 8129]
傘_表面_湿性 【1】[6549]
傘_表面_粘性 【2】[6549, 8129]
子実層托_位置_上生 【1】[6549]
子実層托_位置_垂生 【1】[6549]
子実層托_位置_直生 【1】[1616]
子実層托_厚さ_厚 【2】[1616, 8129]
子実層托_型_襞 【3】[1616, 6549, 8129]
子実層托_色_桃 【1】[1616]
子実層托_色_橙赤 【1】[8129]
子実層托_色_灰 【1】[1616]
子実層托_色_緑 【1】[1616]
子実層托_色_黄 【2】[1616, 8129]
子実層托_色_黒 【1】[1616]
子実層托_間隔_疎 【3】[1616, 6549, 8129]
担子胞子_幅_5-7.5µm 【2】[1616, 6549]
担子胞子_形状_楕円 【2】[1616, 6549]
担子胞子_表面_畝 【1】[6549]
担子胞子_表面_疣状 【2】[1616, 6549]
担子胞子_表面_網目 【2】[1616, 6549]
担子胞子_長さ_5-7.5µm 【2】[1616, 6549]
担子胞子_長さ_7.5-10µm 【2】[1616, 6549]
担子胞子_隔壁_無 【2】[1616, 6549]
柄_幅_10-30mm 【1】[6549]
柄_幅_30-50mm 【1】[6549]
柄_形状_先細/棍棒状 【1】[6549]
柄_形状_円筒 【1】[6549]
柄_色_橙赤 【3】[1616, 6549, 8129]
柄_色_白 【3】[1616, 6549, 8129]
柄_色_褐 【2】[1616, 8129]
柄_色_黒 【3】[1616, 6549, 8129]
柄_長さ_50-100mm 【1】[6549]
胞子紋_色_白 【3】[1616, 6549, 8129]

④解析例 その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]])])
傘の色を比較するきのこを3つ選んでね
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
Out[9]:
アイゾメヒカゲタケ ワライタケ センボンサイギョウガサ
傘_色_桃 【1】[7789] 【1】[7795] 【1】[7792]
傘_色_橙赤 nan nan 【2】[97, 2130]
傘_色_灰 【1】[94] 【6】[99, 2129, 7794, 7795, 7796, 8835] 【1】[97]
傘_色_白 【2】[101, 7789] 【3】[99, 2125, 8835] nan
傘_色_緑 nan 【1】[7796] nan
傘_色_褐 【2】[94, 3197] 【7】[99, 2125, 2129, 7794, 7795, 7796, 8835] 【3】[97, 2130, 7792]
傘_色_青紫 【2】[94, 101] 【1】[99] 【1】[97]
傘_色_黄 【2】[94, 3197] 【5】[99, 2125, 2129, 7795, 7796] 【2】[2130, 7792]
傘_色_黒 nan 【3】[2129, 7796, 8835] nan

⑤解析例 その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件を表示。
ニセショウロ と似ているきのこを探索中…(少し時間がかかる)
100%|██████████████████████████████████████████████████████████████████████████████| 1101/1101 [01:53<00:00,  9.71it/s]  0%|                                                                                 | 1/1101 [00:00<01:54,  9.58it/s]
Out[13]:
和名 類似度(Jaccard係数)
0 ニセショウロ 1.0
1 ハマニセショウロ 0.6
2 タマネギモドキ 0.58
3 シロニセショウロ 0.55
4 ツチグリカタカワタケ 0.54
5 ヒメカタショウロ 0.54
6 コツブタケ 0.48
7 ツチグリ 0.48
8 ザラツキカタカワタケ 0.45
9 アミメツチダンゴ 0.35
10 エリマキツチグリ 0.34

今後データを拡充していきます。解析の方法次第で色々な可能性があると思いますので、ぜひ楽しんでみてください。