{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "# Inspect user interactions\n", "\n", "Inspecting the user interactions obtained from the NN, DTC and TC graphs." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Import the dataset." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "\n", "casename = '...'\n", "case = '...'\n", "\n", "df_data = pd.read_csv(f'../datasets/{case}-closed-s-users.csv')\n", "\n", "df_data.describe()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Plot the distributions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "plt.figure(figsize=(15, 10))\n", "\n", "plt.subplot(2,3,1)\n", "sns.histplot(df_data['nn-count'], bins=20)\n", "plt.yscale('log')\n", "plt.title('Distribution of NN interactions')\n", "plt.xlabel('NN interactions')\n", "plt.ylabel('Count')\n", "plt.grid()\n", "plt.tick_params(axis='both', direction='in',top=True, right=True)\n", "\n", "plt.subplot(2,3,2)\n", "sns.histplot(df_data['dtc-count'], bins=20)\n", "plt.yscale('log')\n", "plt.title('Distribution of DTC interactions')\n", "plt.xlabel('DTC interactions')\n", "plt.ylabel('Count')\n", "plt.grid()\n", "plt.tick_params(axis='both', direction='in',top=True, right=True)\n", "\n", "plt.subplot(2,3,3)\n", "sns.histplot(df_data['tc-count'], bins=20)\n", "plt.yscale('log')\n", "plt.title('Distribution of TC interactions')\n", "plt.xlabel('TC interactions')\n", "plt.ylabel('Count')\n", "plt.grid()\n", "plt.tick_params(axis='both', direction='in',top=True, right=True)\n", "\n", "plt.subplot(2,3,4)\n", "sns.histplot(df_data['post-count'], bins=20)\n", "plt.yscale('log')\n", "plt.title('Distribution of posts')\n", "plt.xlabel('Number of posts')\n", "plt.ylabel('Count')\n", "plt.grid()\n", "plt.tick_params(axis='both', direction='in',top=True, right=True)\n", "\n", "plt.subplot(2,3,5)\n", "sns.histplot(df_data['mean-sentiment'], bins=20, kde=True)\n", "plt.title('Distribution of mean sentiment')\n", "plt.xlabel('Mean sentiment')\n", "plt.ylabel('Count')\n", "plt.grid()\n", "plt.tick_params(axis='both', direction='in',top=True, right=True)\n", "\n", "plt.subplot(2,3,6)\n", "sns.histplot(df_data['std-sentiment'], bins=20, kde=True)\n", "plt.title('Distribution of SD sentiment')\n", "plt.xlabel('SD sentiment')\n", "plt.ylabel('Count')\n", "plt.grid()\n", "plt.tick_params(axis='both', direction='in',top=True, right=True)\n", "\n", "plt.suptitle(f'Distribution of user metrics {casename} case', fontsize=16)\n", "plt.tight_layout(rect=[0, 0, 1, 0.99])\n", "\n", "plt.savefig(f'../datasets/{case}-user-metrics.png')\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Plot interaction count against mean sentiment, SD sentiment and post count." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "# Define the pairs of variables for the subplots\n", "variables = [\n", " (\"nn-count\", \"mean-sentiment\"),\n", " (\"dtc-count\", \"mean-sentiment\"),\n", " (\"tc-count\", \"mean-sentiment\"),\n", " (\"nn-count\", \"std-sentiment\"),\n", " (\"dtc-count\", \"std-sentiment\"),\n", " (\"tc-count\", \"std-sentiment\"),\n", " (\"nn-count\", \"post-count\"),\n", " (\"dtc-count\", \"post-count\"),\n", " (\"tc-count\", \"post-count\"),\n", "]\n", "\n", "# Create the figure\n", "plt.figure(figsize=(15, 15))\n", "\n", "# Loop through the variables and create subplots\n", "for i, (x_var, y_var) in enumerate(variables):\n", " plt.subplot(3, 3, i + 1)\n", " \n", " # Drop NaN values for the current pair of variables\n", " df_nonan = df_data.dropna(subset=[x_var, y_var])\n", " \n", " # Create scatter plot\n", " sns.scatterplot(x=x_var, y=y_var, data=df_nonan, alpha=0.4, color=\"black\", edgecolor=None)\n", " \n", " # Create Lowess regression plot\n", " sns.regplot(x=x_var, y=y_var, data=df_nonan, scatter=False, lowess=True, line_kws={'color': 'blue', 'linewidth': 2}, label=\"Lowess fit\")\n", " \n", " # Set logarithmic scale for x-axis\n", " plt.xscale(\"log\")\n", " \n", " # Set labels and grid\n", " plt.xlabel(x_var.replace('-', ' '))\n", " plt.ylabel(y_var.replace('-', ' '))\n", " plt.grid()\n", " plt.legend()\n", " plt.tick_params(axis='both', direction='in', top=True, right=True)\n", "\n", "# Set the overall title and layout\n", "plt.suptitle(f'Scatter plot of user metrics against interaction count {casename} case', fontsize=16)\n", "plt.tight_layout(rect=[0, 0, 1, 0.99])\n", "\n", "# Save the figure\n", "plt.savefig(f'../datasets/{case}-user-interaction-scatter.png')\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Plot (simplified) interaction count against mean sentiment, SD sentiment and post count. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "from scipy import stats\n", "\n", "# Assuming df_data is your DataFrame and casename and case are defined\n", "plt.figure(figsize=(15, 15))\n", "\n", "# Define the pairs of variables for the subplots\n", "variables = [\n", " (\"nn-count\", \"mean-sentiment\"),\n", " (\"dtc-count\", \"mean-sentiment\"),\n", " (\"tc-count\", \"mean-sentiment\"),\n", " (\"nn-count\", \"std-sentiment\"),\n", " (\"dtc-count\", \"std-sentiment\"),\n", " (\"tc-count\", \"std-sentiment\"),\n", " (\"nn-count\", \"post-count\"),\n", " (\"dtc-count\", \"post-count\"),\n", " (\"tc-count\", \"post-count\"),\n", "]\n", "\n", "# Loop through the variables and create subplots\n", "for i, (x_var, y_var) in enumerate(variables):\n", " plt.subplot(3, 3, i + 1)\n", " \n", " # Drop NaN values for the current pair of variables\n", " df_nonan = df_data.dropna(subset=[x_var, y_var])\n", " \n", " # Create the regression plot\n", " sns.regplot(x=x_var, y=y_var, data=df_nonan, scatter=False, ci=68, line_kws={'color': 'blue', 'linewidth': 2})\n", " \n", " # Fit the regression model and get r and p values\n", " slope, intercept, r_value, p_value, std_err = stats.linregress(df_nonan[x_var], df_nonan[y_var])\n", " \n", " # Add labels and grid\n", " plt.xlabel(x_var.replace('-', ' '))\n", " plt.ylabel(y_var.replace('-', ' '))\n", " plt.grid()\n", " plt.tick_params(axis='both', direction='in', top=True, right=True)\n", " \n", " # Add text annotation for r and p values\n", " plt.text(0.05, 0.95, f'r = {r_value:.4f}\\np = {max(p_value, 0.0001):.4f}', transform=plt.gca().transAxes, fontsize=12, verticalalignment='top', bbox=dict(facecolor='white', alpha=0.5))\n", "\n", "# Set the overall title and layout\n", "plt.suptitle(f'Regression plot of user metrics against interaction count {casename} case', fontsize=16)\n", "plt.tight_layout(rect=[0, 0, 1, 0.99])\n", "\n", "# Save the figure\n", "plt.savefig(f'../datasets/{case}-user-interaction-regression.png')\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Take out change in sentiment regressions." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "from scipy import stats\n", "\n", "# Assuming df_data is your DataFrame and casename and case are defined\n", "fig, axes = plt.subplots(1, 3, figsize=(15, 6), sharey=True)\n", "\n", "# Define the variables for std-sentiment plots\n", "variables = [\n", " (\"nn-count\", \"std-sentiment\"),\n", " (\"dtc-count\", \"std-sentiment\"),\n", " (\"tc-count\", \"std-sentiment\"),\n", "]\n", "\n", "# Loop through the variables and create subplots\n", "for i, (ax, (x_var, y_var)) in enumerate(zip(axes, variables)):\n", " # Drop NaN values for the current pair of variables\n", " df_nonan = df_data.dropna(subset=[x_var, y_var])\n", " \n", " # Create the regression plot\n", " sns.regplot(x=x_var, y=y_var, data=df_nonan, scatter=False, ci=68, line_kws={'color': 'blue', 'linewidth': 2}, ax=ax)\n", " \n", " # Fit the regression model and get r and p values\n", " slope, intercept, r_value, p_value, std_err = stats.linregress(df_nonan[x_var], df_nonan[y_var])\n", " \n", " # Add labels and grid\n", " ax.set_xlabel(x_var.replace('-', ' '))\n", " if i == 0:\n", " ax.set_ylabel(y_var.replace('-', ' '))\n", " else:\n", " ax.set_ylabel('')\n", " ax.grid()\n", " ax.tick_params(axis='both', direction='in', top=True, right=True)\n", " \n", " # Add text annotation for r and p values\n", " ax.text(0.05, 0.95, f'r = {r_value:.4f}\\np = {max(p_value, 0.0001):.4f}', transform=ax.transAxes, fontsize=12, verticalalignment='top', bbox=dict(facecolor='white', alpha=0.5))\n", "\n", "# Set the overall title and layout\n", "plt.suptitle(f'Regression plot of standard deviation of sentiment against interaction count {casename} case', fontsize=16)\n", "plt.tight_layout(rect=[0, 0, 1, 0.95])\n", "\n", "# Save the figure\n", "plt.savefig(f'../datasets/{case}-user-std-sentiment-regression.png')\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.14.6" }, "vscode": { "interpreter": { "hash": "8c75c0fdd1a718867cdcb84b32adcfdbeaad00b3a4e00a59385211aeed084d4c" } } }, "nbformat": 4, "nbformat_minor": 4 }