21誌の情報をpandas DataFrameで管理します。
import pandas as pd
import numpy as np
# 論文誌データベース構築
journals_data = {
'journal_name': [
'npj Computational Materials',
'Computational Materials Science',
'InfoMat',
'Digital Discovery',
'Nature Communications',
'Nature Materials',
'Advanced Materials',
'Acta Materialia',
'Materials Today',
'Machine Learning: Science and Technology',
'Journal of Chemical Information and Modeling',
'Journal of Cheminformatics',
'Energy Storage Materials',
'Advanced Energy Materials',
'ACS Applied Materials & Interfaces',
'ACS Central Science',
'Science Advances',
'Physical Review Materials',
'Communications Materials',
'Scientific Data',
'Materials Genome Engineering Advances'
],
'impact_factor': [9.0, 3.5, 22.0, 5.0, 16.6, 43.0, 29.4, 9.4, 21.0, 6.8,
5.6, 7.1, 20.4, 27.8, 9.5, 18.2, 13.6, 3.4, 7.5, 6.0, 2.5],
'review_time_months': [2.5, 3.0, 2.5, 1.5, 3.0, 4.5, 2.5, 3.0, 3.5, 2.5,
2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 3.0, 2.5, 2.5, 1.5, 2.5],
'open_access': ['Full OA', 'Hybrid', 'Full OA', 'Full OA', 'Full OA',
'Subscription', 'Hybrid', 'Hybrid', 'Subscription', 'Full OA',
'Hybrid', 'Full OA (Free)', 'Hybrid', 'Hybrid', 'Hybrid',
'Full OA', 'Full OA', 'Hybrid', 'Full OA', 'Full OA', 'Full OA'],
'category': ['MI専門', 'MI専門', 'MI専門', 'MI専門', '計算材料科学', '計算材料科学',
'材料データ科学', '計算材料科学', '材料データ科学', '関連分野',
'材料データ科学', '材料データ科学', '関連分野', '関連分野',
'関連分野', '関連分野', '関連分野', '計算材料科学',
'材料データ科学', '材料データ科学', 'MI専門']
}
df = pd.DataFrame(journals_data)
# データ表示
print("=== MI専門誌21誌データベース ===")
print(df.to_string(index=False))
# カテゴリ別統計
print("\n=== カテゴリ別統計 ===")
print(df.groupby('category').agg({
'impact_factor': ['mean', 'median', 'max'],
'review_time_months': 'mean'
}).round(2))
# Impact Factor上位5誌
print("\n=== Impact Factor 上位5誌 ===")
print(df.nlargest(5, 'impact_factor')[['journal_name', 'impact_factor', 'category']])
# 査読期間が短い誌(2ヶ月以内)
print("\n=== 査読期間が短い論文誌(2ヶ月以内)===")
fast_review = df[df['review_time_months'] <= 2.0]
print(fast_review[['journal_name', 'review_time_months', 'impact_factor']].sort_values('review_time_months'))
# 完全OAで出版費用無料の誌
print("\n=== 完全OA・出版費用無料 ===")
free_oa = df[df['open_access'] == 'Full OA (Free)']
print(free_oa[['journal_name', 'impact_factor']])
論文誌の特性を散布図で可視化します。
import matplotlib.pyplot as plt
import seaborn as sns
# スタイル設定
plt.style.use('seaborn-v0_8-darkgrid')
sns.set_palette("husl")
# 図の作成
fig, ax = plt.subplots(figsize=(12, 8))
# カテゴリ別に色分け
categories = df['category'].unique()
colors = sns.color_palette("husl", len(categories))
category_colors = {cat: color for cat, color in zip(categories, colors)}
for category in categories:
category_df = df[df['category'] == category]
ax.scatter(
category_df['review_time_months'],
category_df['impact_factor'],
label=category,
s=200,
alpha=0.6,
color=category_colors[category],
edgecolors='black',
linewidth=1.5
)
# 論文誌名をラベル表示
for idx, row in df.iterrows():
# 長い名前は省略形に
name = row['journal_name']
if len(name) > 30:
name = name[:27] + '...'
ax.annotate(
name,
(row['review_time_months'], row['impact_factor']),
xytext=(5, 5),
textcoords='offset points',
fontsize=8,
alpha=0.7
)
# グラフ装飾
ax.set_xlabel('査読期間(ヶ月)', fontsize=14, fontweight='bold')
ax.set_ylabel('Impact Factor', fontsize=14, fontweight='bold')
ax.set_title('MI専門誌21誌: Impact Factor vs 査読期間', fontsize=16, fontweight='bold')
ax.legend(title='カテゴリ', fontsize=10, title_fontsize=11)
ax.grid(True, alpha=0.3)
# 理想的なゾーン(高IF・短査読)をハイライト
ax.axhline(y=10, color='green', linestyle='--', alpha=0.3, label='IF 10以上')
ax.axvline(x=2.5, color='blue', linestyle='--', alpha=0.3, label='査読2.5ヶ月以内')
plt.tight_layout()
plt.savefig('journals_if_vs_review_time.png', dpi=300, bbox_inches='tight')
plt.show()
# 統計サマリー
print("=== 相関分析 ===")
correlation = df['impact_factor'].corr(df['review_time_months'])
print(f"Impact Factorと査読期間の相関係数: {correlation:.3f}")
print("\n=== 理想的な論文誌(IF≥10 かつ 査読≤2.5ヶ月)===")
ideal_journals = df[(df['impact_factor'] >= 10) & (df['review_time_months'] <= 2.5)]
print(ideal_journals[['journal_name', 'impact_factor', 'review_time_months']])
研究内容から最適な論文誌をマッチングします。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
# 各論文誌のスコープ記述
journal_scopes = {
'npj Computational Materials': 'machine learning graph neural networks computational materials discovery DFT high-throughput',
'Computational Materials Science': 'computational materials modeling DFT phase diagrams materials databases',
'InfoMat': 'data-driven materials discovery artificial intelligence materials informatics experimental validation',
'Digital Discovery': 'automated discovery data science chemistry materials rapid screening',
'Nature Communications': 'high-impact interdisciplinary materials science broad significance',
'Nature Materials': 'breakthrough discoveries paradigm-shifting materials revolutionary',
'Advanced Materials': 'advanced functional materials high performance applications',
'Acta Materialia': 'structural materials metallurgy phase transformations mechanical properties',
'Materials Today': 'comprehensive reviews perspectives materials science',
'Machine Learning: Science and Technology': 'machine learning scientific applications transfer learning benchmarks',
'Journal of Chemical Information and Modeling': 'cheminformatics molecular property prediction QSAR drug design',
'Journal of Cheminformatics': 'cheminformatics software tools databases open source',
'Energy Storage Materials': 'battery materials energy storage experimental validation electrochemistry',
'Advanced Energy Materials': 'breakthrough energy materials solar cells batteries catalysts',
'ACS Applied Materials & Interfaces': 'applied materials interfaces surface properties applications',
'ACS Central Science': 'interdisciplinary chemistry machine learning methods broad impact',
'Science Advances': 'high-impact science interdisciplinary broad significance',
'Physical Review Materials': 'physics materials quantum materials density functional theory',
'Communications Materials': 'solid materials research experimental computational',
'Scientific Data': 'materials databases data publication data descriptors',
'Materials Genome Engineering Advances': 'materials genome high-throughput databases computational screening'
}
# ユーザーの研究内容記述
def recommend_journals(research_description, top_n=5):
"""
研究内容の記述から最適な論文誌を推薦
Parameters:
-----------
research_description : str
研究内容の説明文
top_n : int
推薦する論文誌の数
Returns:
--------
recommendations : list
推薦論文誌のリスト(類似度順)
"""
# 全テキストを結合
all_texts = [research_description] + list(journal_scopes.values())
journal_names = list(journal_scopes.keys())
# TF-IDFベクトル化
vectorizer = TfidfVectorizer(stop_words='english')
tfidf_matrix = vectorizer.fit_transform(all_texts)
# コサイン類似度計算
research_vector = tfidf_matrix[0:1]
journal_vectors = tfidf_matrix[1:]
similarities = cosine_similarity(research_vector, journal_vectors)[0]
# 類似度順にソート
sorted_indices = np.argsort(similarities)[::-1][:top_n]
recommendations = []
for idx in sorted_indices:
journal_name = journal_names[idx]
similarity = similarities[idx]
journal_info = df[df['journal_name'] == journal_name].iloc[0]
recommendations.append({
'journal': journal_name,
'similarity': similarity,
'impact_factor': journal_info['impact_factor'],
'review_time': journal_info['review_time_months'],
'open_access': journal_info['open_access']
})
return recommendations
# 使用例
research_examples = [
"We developed a graph neural network for predicting material properties with transfer learning",
"Our study presents a new battery cathode material discovered through machine learning and experimental validation",
"We created a large-scale materials database with DFT calculations for high-throughput screening",
"Our work uses machine learning to predict molecular properties for drug discovery"
]
for i, research in enumerate(research_examples, 1):
print(f"\n{'='*70}")
print(f"研究例 {i}: {research}")
print(f"{'='*70}")
recommendations = recommend_journals(research, top_n=3)
for rank, rec in enumerate(recommendations, 1):
print(f"\n{rank}位: {rec['journal']}")
print(f" 類似度: {rec['similarity']:.3f}")
print(f" Impact Factor: {rec['impact_factor']}")
print(f" 査読期間: {rec['review_time']}ヶ月")
print(f" OA: {rec['open_access']}")