{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 45524 characters]",
      "text/plain": [
       "<Figure size 1200x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import numpy as np\n",
    "\n",
    "# 그룹 번호 리스트 설정 (1부터 5까지)\n",
    "group_numbers = range(1, 6)\n",
    "\n",
    "# 빈 데이터프레임 생성\n",
    "combined_data = pd.DataFrame()\n",
    "\n",
    "# 그룹별 CSV 파일 읽고 데이터 합치기\n",
    "for group_number in group_numbers:\n",
    "    file_path = f'0.class_document/knn_tfidf/{group_number}/test_p_c.csv'\n",
    "    data = pd.read_csv(file_path)\n",
    "    combined_data = pd.concat([combined_data, data], ignore_index=True)\n",
    "\n",
    "# p_MDM이 True인 항목 필터링\n",
    "filtered_data = combined_data\n",
    "\n",
    "# ctp_correct가 True인 경우와 False인 경우의 c_score 추출\n",
    "correct_scores = filtered_data[filtered_data['ctp_correct'] == True]['c_score']\n",
    "incorrect_scores = filtered_data[filtered_data['ctp_correct'] == False]['c_score']\n",
    "\n",
    "# 시각화 스타일 설정\n",
    "sns.set(style=\"whitegrid\")\n",
    "\n",
    "# 0.0에서 1.0까지 0.2 간격으로 bin을 설정\n",
    "bins = np.arange(0, 1.1, 0.05)\n",
    "\n",
    "# 플롯 크기 설정\n",
    "plt.figure(figsize=(12, 4))\n",
    "\n",
    "# alpha 값을 낮추고, 두 분포가 겹치도록 설정\n",
    "# Correct: 초록색, Incorrect: 빨간색, 테두리 추가\n",
    "sns.histplot(correct_scores, bins=bins, kde=False, color='green', alpha=0.5, label='Correct', edgecolor='black')\n",
    "sns.histplot(incorrect_scores, bins=bins, kde=False, color='red', alpha=0.5, label='Incorrect', edgecolor='black')\n",
    "\n",
    "# 그래프 꾸미기\n",
    "plt.xlabel('Score', fontsize=18)\n",
    "plt.ylabel('Frequency', fontsize=18)\n",
    "plt.xticks(fontsize=16)\n",
    "plt.yticks(fontsize=16)\n",
    "\n",
    "# 범례 폰트 크기를 키우고 위치 설정\n",
    "plt.legend(fontsize=20, loc='upper left')\n",
    "\n",
    "# 레이아웃 조정 및 출력\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 40520 characters]",
      "text/plain": [
       "<Figure size 1200x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import numpy as np\n",
    "\n",
    "# 그룹 번호 리스트 설정 (1부터 5까지)\n",
    "group_numbers = range(1, 6)\n",
    "\n",
    "# 빈 데이터프레임 생성\n",
    "combined_data = pd.DataFrame()\n",
    "\n",
    "# 그룹별 CSV 파일 읽고 데이터 합치기\n",
    "for group_number in group_numbers:\n",
    "    file_path = f'0.class_document/distilbert/{group_number}/test_p_c.csv'\n",
    "    data = pd.read_csv(file_path)\n",
    "    combined_data = pd.concat([combined_data, data], ignore_index=True)\n",
    "\n",
    "# p_MDM이 True인 항목 필터링\n",
    "filtered_data = combined_data\n",
    "\n",
    "# ctp_correct가 True인 경우와 False인 경우의 c_score 추출\n",
    "correct_scores = filtered_data[filtered_data['ctp_correct'] == True]['c_score']\n",
    "incorrect_scores = filtered_data[filtered_data['ctp_correct'] == False]['c_score']\n",
    "\n",
    "# 시각화 스타일 설정\n",
    "sns.set(style=\"whitegrid\")\n",
    "\n",
    "# 0.0에서 1.0까지 0.2 간격으로 bin을 설정\n",
    "bins = np.arange(0, 1.1, 0.05)\n",
    "\n",
    "# 플롯 크기 설정\n",
    "plt.figure(figsize=(12, 4))\n",
    "\n",
    "# alpha 값을 낮추고, 두 분포가 겹치도록 설정\n",
    "# Correct: 초록색, Incorrect: 빨간색, 테두리 추가\n",
    "sns.histplot(correct_scores, bins=bins, kde=False, color='green', alpha=0.5, label='Correct', edgecolor='black')\n",
    "sns.histplot(incorrect_scores, bins=bins, kde=False, color='red', alpha=0.5, label='Incorrect', edgecolor='black')\n",
    "\n",
    "# 그래프 꾸미기\n",
    "plt.xlabel('Score', fontsize=18)\n",
    "plt.ylabel('Frequency', fontsize=18)\n",
    "plt.xticks(fontsize=16)\n",
    "plt.yticks(fontsize=16)\n",
    "\n",
    "# 범례 폰트 크기를 키우고 위치 설정\n",
    "plt.legend(fontsize=20, loc='upper left')\n",
    "\n",
    "# 레이아웃 조정 및 출력\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "[encoded data, 67336 characters]",
      "text/plain": [
       "<Figure size 1200x700 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import numpy as np\n",
    "\n",
    "# 그룹 번호 리스트 설정 (1부터 5까지)\n",
    "group_numbers = range(1, 6)\n",
    "\n",
    "# 빈 데이터프레임 생성 (TF-IDF와 DistilBERT)\n",
    "combined_data_tfidf = pd.DataFrame()\n",
    "combined_data_bert = pd.DataFrame()\n",
    "\n",
    "# TF-IDF 데이터 읽기\n",
    "for group_number in group_numbers:\n",
    "    file_path_tfidf = f'0.class_document/knn_tfidf/{group_number}/test_p_c.csv'\n",
    "    data_tfidf = pd.read_csv(file_path_tfidf)\n",
    "    combined_data_tfidf = pd.concat([combined_data_tfidf, data_tfidf], ignore_index=True)\n",
    "\n",
    "# DistilBERT 데이터 읽기\n",
    "for group_number in group_numbers:\n",
    "    file_path_bert = f'0.class_document/distilbert/{group_number}/test_p_c.csv'\n",
    "    data_bert = pd.read_csv(file_path_bert)\n",
    "    combined_data_bert = pd.concat([combined_data_bert, data_bert], ignore_index=True)\n",
    "\n",
    "# 데이터 필터링 및 점수 추출\n",
    "filtered_data_tfidf = combined_data_tfidf\n",
    "filtered_data_bert = combined_data_bert\n",
    "\n",
    "correct_scores_tfidf = filtered_data_tfidf[filtered_data_tfidf['ctp_correct'] == True]['c_score']\n",
    "incorrect_scores_tfidf = filtered_data_tfidf[filtered_data_tfidf['ctp_correct'] == False]['c_score']\n",
    "\n",
    "correct_scores_bert = filtered_data_bert[filtered_data_bert['ctp_correct'] == True]['c_score']\n",
    "incorrect_scores_bert = filtered_data_bert[filtered_data_bert['ctp_correct'] == False]['c_score']\n",
    "\n",
    "# 시각화 스타일 설정\n",
    "sns.set(style=\"whitegrid\")\n",
    "\n",
    "# 0.0에서 1.0까지 0.05 간격으로 bin을 설정\n",
    "bins = np.arange(0, 1.05, 0.05)\n",
    "\n",
    "# TF-IDF와 DistilBERT 점수 분포 계산\n",
    "tfidf_correct_hist, _ = np.histogram(correct_scores_tfidf, bins=bins)\n",
    "tfidf_incorrect_hist, _ = np.histogram(incorrect_scores_tfidf, bins=bins)\n",
    "\n",
    "bert_correct_hist, _ = np.histogram(correct_scores_bert, bins=bins)\n",
    "bert_incorrect_hist, _ = np.histogram(incorrect_scores_bert, bins=bins)\n",
    "\n",
    "# 나비 차트 그리기\n",
    "fig, ax = plt.subplots(figsize=(12, 7))\n",
    "\n",
    "bin_centers = 0.5 * (bins[1:] + bins[:-1])\n",
    "\n",
    "# 왼쪽: DistilBERT 점수 분포\n",
    "ax.barh(bin_centers, -bert_correct_hist, height=0.05, color='green', alpha=0.7, label='DistilBERT Correct', edgecolor='black')\n",
    "ax.barh(bin_centers, -bert_incorrect_hist, height=0.05, color='red', alpha=0.4, label='DistilBERT Incorrect', edgecolor='black')\n",
    "\n",
    "# 오른쪽: TF-IDF 점수 분포\n",
    "ax.barh(bin_centers, tfidf_correct_hist, height=0.05, color='green', alpha=0.7, label='TF-IDF Correct', edgecolor='black', left=0)\n",
    "ax.barh(bin_centers, tfidf_incorrect_hist, height=0.05, color='red', alpha=0.4, label='TF-IDF Incorrect', edgecolor='black', left=0)\n",
    "\n",
    "\n",
    "ax.set_xlabel('Frequency', fontsize=18)  # x축 폰트 크기를 18로 설정\n",
    "ax.set_ylabel('Score', fontsize=18)      # y축 폰트 크기를 18로 설정\n",
    "\n",
    "# x축과 y축의 눈금 폰트 크기 조정\n",
    "ax.tick_params(axis='x', labelsize=16)   # x축 눈금 폰트 크기를 16으로 설정\n",
    "ax.tick_params(axis='y', labelsize=16)   # y축 눈금 폰트 크기를 16으로 설정\n",
    "\n",
    "ax.set_yticks(np.arange(0, 1.1, 0.1))\n",
    "# 기존의 x축 눈금을 설정한 부분을 수정\n",
    "ax.set_xticks(np.arange(-10000, 10001, 2000))  # x축 단위를 2000으로 설정\n",
    "\n",
    "# 음수 눈금을 양수로 표시하도록 라벨을 변경\n",
    "ax.set_xticklabels([str(abs(x)) for x in np.arange(-10000, 10001, 2000)])\n",
    "\n",
    "# 범례 폰트 크기를 키우고 위치 설정\n",
    "# DistilBERT는 좌측 하단에, TF-IDF는 우측 하단에 범례 표시\n",
    "legend_bert = ax.legend(['DistilBERT Correct', 'DistilBERT Incorrect'], fontsize=20, loc='lower left')\n",
    "legend_tfidf = ax.legend(['TF-IDF Correct', 'TF-IDF Incorrect'], fontsize=20, loc='lower right')\n",
    "\n",
    "# 범례 두 개 모두 추가\n",
    "ax.add_artist(legend_bert)\n",
    "\n",
    "# 레이아웃 조정 및 출력\n",
    "plt.tight_layout()\n",
    "plt.show()\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "torch",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
