From cc4d7827adefc292d712b28ef88eb674af99f135 Mon Sep 17 00:00:00 2001 From: Naitian Zhou Date: Wed, 15 Nov 2023 00:03:18 -0500 Subject: [PATCH] Add case studies and data --- memes/analysis/Case Studies.ipynb | 2113 +++++++++++++++++++++++++++++ memes/data/README.md | 3 + 2 files changed, 2116 insertions(+) create mode 100644 memes/analysis/Case Studies.ipynb create mode 100644 memes/data/README.md diff --git a/memes/analysis/Case Studies.ipynb b/memes/analysis/Case Studies.ipynb new file mode 100644 index 0000000..697d789 --- /dev/null +++ b/memes/analysis/Case Studies.ipynb @@ -0,0 +1,2113 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "4f8189e8", + "metadata": {}, + "source": [ + "# Preparation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "7bcd8288", + "metadata": {}, + "outputs": [], + "source": [ + "import itertools\n", + "from collections import namedtuple, defaultdict\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "6a5c03ef", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + ":219: RuntimeWarning: scipy._lib.messagestream.MessageStream size changed, may indicate binary incompatibility. Expected 56 from C header, got 64 from PyObject\n" + ] + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from scipy import stats\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from tqdm.auto import tqdm\n", + "\n", + "plt.rcParams[\"figure.dpi\"] = 300\n", + "\n", + "sns.set()\n", + "\n", + "from PIL import Image" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "abe53b51", + "metadata": {}, + "outputs": [], + "source": [ + "from memes.utils import DATA_DIR, HashClusters, read_id_to_info\n", + "from memes.visualization_utils import draw_grid" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "2e2a6e9f", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "29082578it [00:46, 631255.51it/s]\n", + "16662070it [00:52, 319238.39it/s]\n", + "10981044it [00:31, 347317.30it/s]\n" + ] + } + ], + "source": [ + "hc = HashClusters(\n", + " \"../data/filepaths/all.tsv\",\n", + " \"../data/imagehashes/all-8-processed-hashes.tsv\",\n", + " \"../data/clusters/all-8-processed-leiden.tsv\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "fcaaecc6", + "metadata": {}, + "outputs": [], + "source": [ + "def load_template_clusters(path=DATA_DIR / \"semantic_clusters/all-8-processed-clusters.tsv\"):\n", + " TplCluster = namedtuple(\"TplCluster\", [\"tpl_to_cluster\", \"cluster_to_tpl\"])\n", + "\n", + " tpl_to_cluster = {}\n", + " cluster_to_tpl = defaultdict(set)\n", + " for line in open(path, \"r\"):\n", + " tpl, cluster = line.strip().split(\"\\t\")\n", + " tpl_to_cluster[tpl] = cluster\n", + " cluster_to_tpl[cluster].add(tpl)\n", + " return TplCluster(tpl_to_cluster, dict(cluster_to_tpl))\n", + "\n", + "template_clusters = load_template_clusters(DATA_DIR / \"semantic_clusters/all-8-processed-clusters-norm-50.tsv\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "fdef8ba6", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\r", + " 0%| | 0/157 [00:00= threshold:\n", + " print(\"\\t\" + matrix.idx2word[i] + \"\\t\\t\" + str(lor[i]))" + ] + }, + { + "cell_type": "markdown", + "id": "05eb3821", + "metadata": {}, + "source": [ + "## Does variation exist?" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "bf82cb30", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ba2febe5f04f44b687d6e675450cecb0", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/100 [00:00 1.96:\n", + " all_pairs.append((c, clu, matrix.idx2word[i], lor[i]))" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "17865f47", + "metadata": {}, + "outputs": [], + "source": [ + "significant = pd.DataFrame(all_pairs, columns=[\"subreddit\", \"cluster\", \"template\", \"zscore\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "0bf40559", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "There is significant variation in 94 semantic clusters\n" + ] + } + ], + "source": [ + "print(f\"There is significant variation in {len(significant.cluster.unique())} semantic clusters\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "8be79a5d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This spans 391 templates and 26 subreddits\n" + ] + } + ], + "source": [ + "print(f\"This spans {len(significant.template.unique())} templates and {len(significant.subreddit.unique())} subreddits\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "dd44e366", + "metadata": {}, + "source": [ + "Some variables with notable variation:\n", + "\n", + "- Cluster 1 is the compare2 cluster\n", + "- Cluster 0 is the declarative cluster\n", + "- Cluster 139 is a \"said displeasing thing\" cluster\n", + "- Cluster 30 is a surprise narrative cluster\n", + "- Cluster 15 is a scalar cluster\n", + "- 14 is concern\n", + "- 19 is looming threat?\n", + "\n", + "- Cluster 39 is self-satisfied" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "118141cb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3.7583405446933598" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "significant.zscore.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "700bbfcb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
templatezscore
subreddit
Animemes20956.068878
HistoryMemes1082.089408
dankmemes606.223277
memes164.731957
memesITA2532.345918
\n", + "
" + ], + "text/plain": [ + " template zscore\n", + "subreddit \n", + "Animemes 2095 6.068878\n", + "HistoryMemes 108 2.089408\n", + "dankmemes 60 6.223277\n", + "memes 16 4.731957\n", + "memesITA 253 2.345918" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "significant[significant.cluster.eq(\"30\")].groupby(\"subreddit\").agg({\"template\": \"first\", \"zscore\": \"first\"})" + ] + }, + { + "cell_type": "markdown", + "id": "8be57c8a", + "metadata": {}, + "source": [ + "# Innovation" + ] + }, + { + "cell_type": "markdown", + "id": "1d8a1950", + "metadata": {}, + "source": [ + "## Entropy" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "e61774e5", + "metadata": {}, + "outputs": [], + "source": [ + "from scipy.stats import entropy\n", + "from scipy.spatial.distance import jensenshannon" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "8e16edbe", + "metadata": {}, + "outputs": [], + "source": [ + "def get_entropy_values_for_cluster(semantic_cluster):\n", + " \"\"\"\n", + " Return size-k list of entropy values where\n", + " \n", + " k = the number of years the cluster has had meme instances\n", + " ith index = the entropy value i years after the first instance\n", + " \"\"\"\n", + " templates = template_clusters.cluster_to_tpl[semantic_cluster]\n", + " instances = get_instances(templates)\n", + " df = pd.DataFrame(instances)\n", + "\n", + " df.loc[:, \"timestamp\"] = pd.to_datetime(df.utc, unit=\"s\")\n", + " \n", + " # get year by num years since first date\n", + " df.loc[:, \"year\"] = ((df.timestamp - df.timestamp.min()).dt.days / 365.2425).astype(int)\n", + "\n", + " df = df[df.year != df.year.max]\n", + "\n", + " counts_by_year_by_tpl = df.groupby([\"year\", df.template]).post_id.count().reset_index()\n", + " counts_by_year_by_tpl[\"proportion\"] = counts_by_year_by_tpl.groupby(\"year\").post_id.transform(lambda x: x / x.sum())\n", + " \n", + " sample_size = counts_by_year_by_tpl.groupby(\"year\").post_id.sum().min()\n", + " if sample_size < 30:\n", + " return None, None\n", + " distributions = counts_by_year_by_tpl.pivot(index=\"year\", columns=\"template\", values=\"proportion\").fillna(0)\n", + "\n", + " years = distributions.index\n", + " min_years = 5\n", + " if len(years) < min_years:\n", + " return None, None\n", + " rng = np.random.default_rng(seed=0xb1ab)\n", + " resampled = pd.DataFrame([\n", + " rng.multinomial(sample_size, row)\n", + " for row in distributions.to_numpy()\n", + " ],\n", + " index=years,\n", + " columns=distributions.columns\n", + " )\n", + " max_years = 8\n", + " entropies = entropy(resampled.to_numpy(), axis=1)\n", + " \n", + " data = pd.DataFrame({\n", + " \"entropy\": entropies[:max_years],\n", + " \"year\": years[:max_years],\n", + " \"cluster\": [semantic_cluster] * min(len(years), max_years)\n", + " })\n", + "# return resampled\n", + "# resampled[\"proportion\"] = resampled.groupby(\"year\").value.transform(lambda x: x / x.sum())\n", + " \n", + "# data[\"cluster\"] = semantic_cluster\n", + "# data[\"timestamp\"] = data[\"timestamp\"] - data[\"timestamp\"].min()\n", + " return data, resampled" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "ed017e0c", + "metadata": {}, + "outputs": [], + "source": [ + "def draw_entropy():\n", + " topk = list(template_clusters.cluster_to_tpl.keys())\n", + " values = [get_entropy_values_for_cluster(clu)[0] for clu in (topk)]\n", + "# resampled = [get_entropy_values_for_cluster(clu)[1] for clu in tqdm(topk)]\n", + " values = [value for value in values if value is not None]\n", + " entropies = pd.concat(values)\n", + " print(f\"We have coverage over {len(df[df.cluster.isin(entropies.cluster.unique())])} posts\")\n", + " print(f\"and {len(values)} clusters\")\n", + " sns.pointplot(entropies, x=\"year\", y=\"entropy\")\n", + " plt.ylabel(\"Entropy\")\n", + " plt.xlabel(\"Years after introduction\")\n", + " plt.savefig(\"../figures/entropy.pdf\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "6486c878", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "We have coverage over 958924 posts\n", + "and 146 clusters\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "draw_entropy()" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "5eb786d7", + "metadata": {}, + "outputs": [], + "source": [ + "def get_js_dists(semantic_cluster):\n", + " \"\"\"\n", + " Return size-k list of entropy values where\n", + " \n", + " k = the number of years the cluster has had meme instances\n", + " ith index = the entropy value i years after the first instance\n", + " \"\"\"\n", + " templates = template_clusters.cluster_to_tpl[semantic_cluster]\n", + " instances = get_instances(templates)\n", + " df = pd.DataFrame(instances)\n", + "\n", + " df.loc[:, \"timestamp\"] = pd.to_datetime(df.utc, unit=\"s\")\n", + "# df.loc[:, \"year\"] = df.timestamp.dt.year\n", + " df.loc[:, \"year\"] = ((df.timestamp - df.timestamp.min()).dt.days / 365.2425).astype(int)\n", + " df = df[df.year != df.year.max]\n", + "\n", + " counts_by_year_by_tpl = df.groupby([df.year, df.template]).post_id.count().reset_index()\n", + " counts_by_year_by_tpl[\"proportion\"] = counts_by_year_by_tpl.groupby(\"year\").post_id.transform(lambda x: x / x.sum())\n", + " post_dist = counts_by_year_by_tpl.pivot(index=\"year\", columns=\"template\", values=\"proportion\").fillna(0)\n", + " pre_dist = post_dist.shift()\n", + "\n", + " sample_size = counts_by_year_by_tpl.groupby(\"year\").post_id.sum().min()\n", + " if sample_size < 30:\n", + " return None\n", + "\n", + " data = []\n", + " \n", + " for (year, pre), (_, post) in zip(pre_dist.iterrows(), post_dist.iterrows()):\n", + " dist = jensenshannon(pre, post)\n", + " data.append({\n", + " \"js_div\": dist,\n", + " \"year\": year,\n", + " \"cluster\": semantic_cluster\n", + " })\n", + " data = pd.DataFrame(data[1:])\n", + "# data[\"year\"] = data[\"year\"] - data[\"year\"].min()\n", + " return data" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "5ef71df1", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "577d54fa1403440aa5d71accd0c0cada", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/784 [00:00" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "def jsdiv():\n", + " topk = list(template_clusters.cluster_to_tpl.keys())#[:100]\n", + " values = [get_js_dists(clu) for clu in tqdm(topk)]\n", + " values = [value for value in values if value is not None]\n", + " dists = pd.concat(values)\n", + "\n", + " sns.lineplot(dists, x=\"year\", y=\"js_div\")\n", + " plt.ylabel(\"JS Divergence\")\n", + " plt.xlabel(\"Years after introduction\")\n", + "jsdiv()" + ] + }, + { + "cell_type": "markdown", + "id": "9fbf022b", + "metadata": {}, + "source": [ + "## Diffusion" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "aca574cf", + "metadata": {}, + "outputs": [], + "source": [ + "def pmi(matrix):\n", + " num_x, num_y = matrix.shape\n", + " total = matrix.sum()\n", + " p_xy = matrix / total\n", + " p_x = matrix.sum(axis=1, keepdims=True) / total\n", + " p_y = matrix.sum(axis=0, keepdims=True) / total\n", + " pmi = np.log2(p_xy) - np.log2(p_x * p_y)\n", + " \n", + " return pmi\n", + "\n", + "\n", + "def npmi(matrix):\n", + " h_xy = -np.log2(matrix / matrix.sum())\n", + " res = pmi(matrix) / h_xy\n", + " return np.where(np.isnan(res), -1, res)\n", + " \n", + "def ppmi(matrix):\n", + " return np.maximum(pmi(matrix), 0)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "731da727", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2facdbd6aade4a3cb36e084fdd285fc7", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/784 [00:00:7: RuntimeWarning: divide by zero encountered in log2\n", + " pmi = np.log2(p_xy) - np.log2(p_x * p_y)\n" + ] + } + ], + "source": [ + "pmi_dict = {}\n", + "for cluster in tqdm(template_clusters.cluster_to_tpl.keys()):\n", + " matrix = create_doc_term_mat(df[df.cluster.eq(cluster)], \"subreddit\", \"template\")\n", + " \n", + " a = ppmi(matrix.mat)\n", + "\n", + " for c, t in zip(*np.unravel_index(range(matrix.mat.size), matrix.mat.shape)):\n", + " pmi_dict[(matrix.idx2word[t], matrix.idx2doc[c])] = a[c, t]" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "1f5202bf", + "metadata": {}, + "outputs": [], + "source": [ + "df.loc[:, \"pmi\"] = df[[\"template\", \"subreddit\"]].apply(lambda x: pmi_dict[(x.template, x.subreddit)], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "a21654f7", + "metadata": {}, + "outputs": [], + "source": [ + "def first_subs_for_templates_in_cluster(semantic_cluster):\n", + " templates = template_clusters.cluster_to_tpl[semantic_cluster]\n", + " instances = get_instances(templates)\n", + " df = pd.DataFrame(instances)\n", + " \n", + " return df.sort_values(by=\"utc\").groupby(\"template\").agg({\"subreddit\": \"first\"})\n", + "\n", + "def topk_proportions(x):\n", + " counts = x.head(100).value_counts()\n", + " counts /= counts.sum()\n", + " return counts.iloc[0]\n", + "\n", + "def top_sub(x):\n", + " counts = x.head(100).value_counts()\n", + " counts /= counts.sum()\n", + " return counts.index[0]\n", + "\n", + "def origin_analysis():\n", + " # calculate the proportion of each subreddit among the starters\n", + " starter_proportions = df.sort_values(\"utc\").groupby(\"template\").agg(\n", + " proportion = (\"subreddit\", topk_proportions),\n", + " subreddit = (\"subreddit\", top_sub)\n", + " )\n", + "\n", + " # bin proportions for later use\n", + " starter_proportions[\"binned_proportion\"] = starter_proportions.proportion * 100 // 10\n", + "\n", + " # filter for at least 200, to do before/after\n", + " enough_posts = [tpl for tpl, ct in df.template.value_counts().to_dict().items() if ct > 200]\n", + " ending = df[df.template.isin(set(enough_posts))]\n", + "\n", + " # construct list of afters for each template\n", + " tmp_dfs = []\n", + " for cluster, inds in tqdm(ending.groupby(\"template\").groups.items()):\n", + " tmp_dfs.append(\n", + " ending.loc[inds].sort_values(\"utc\", ascending=True).iloc[100:]\n", + " )\n", + " ending_df = pd.concat(tmp_dfs, axis=0)\n", + "\n", + " # calculate after PMI\n", + " ending_pmi_dict = {}\n", + " for cluster in tqdm(ending_df.cluster.unique()):\n", + " matrix = create_doc_term_mat(ending_df[ending_df.cluster.eq(cluster)], \"subreddit\", \"template\")\n", + "\n", + " a = ppmi(matrix.mat)\n", + "\n", + " if matrix.mat.size == 0:\n", + " # print(cluster)\n", + " continue\n", + "\n", + " for c, t in zip(*np.unravel_index(np.array(range(matrix.mat.size)), matrix.mat.shape)):\n", + " ending_pmi_dict[(matrix.idx2word[t], matrix.idx2doc[c])] = a[c, t]\n", + "\n", + " ending_df.loc[:, \"pmi\"] = ending_df[[\"template\", \"subreddit\"]].apply(lambda x: ending_pmi_dict.get((x.template, x.subreddit), None), axis=1)\n", + "\n", + "\n", + " starter_subs = starter_proportions.to_dict()[\"subreddit\"]\n", + " mask = ending_df.subreddit.ne(df.template.apply(starter_subs.get))\n", + "\n", + " final_pmis = pd.DataFrame(\n", + " dict(pmi=starter_proportions.reset_index()[[\"template\", \"subreddit\"]].apply(lambda x: ending_pmi_dict.get((x.template, x.subreddit), None), axis=1),\n", + " template=starter_proportions.index)\n", + " ).set_index(\"template\").pmi\n", + "\n", + "\n", + " # final_control is the avg PMI of non-starters\n", + " # final_pmi is the PMI of the starter sub for each\n", + "\n", + " starter_proportions.loc[:, \"final_control\"] = ending_df[mask].groupby(\"template\").pmi.agg(\"mean\")\n", + " starter_proportions.loc[:, \"final_pmi\"] = final_pmis\n", + "\n", + " return starter_proportions" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "10a0d7d3", + "metadata": { + "code_folding": [] + }, + "outputs": [], + "source": [ + "\n", + "def linregplot(starter_proportions):\n", + " data = starter_proportions\n", + " data = data[data.proportion.between(0.5, 1, inclusive=\"left\")]\n", + " sns.regplot(\n", + " data=data,\n", + " x=\"proportion\",\n", + " y=data.final_pmi - data.final_control,\n", + " )\n", + " plt.ylabel(\"Origin PMI - Control PMI\")\n", + " plt.xlabel(\"Proportion of Seed Posts by Innovator Subreddit\")\n", + "\n", + "def linregplotb(starter_proportions):\n", + " data = starter_proportions\n", + " data = data[data.proportion.between(0.5, 1, inclusive=\"left\")]\n", + " sns.regplot(\n", + " data=data,\n", + " x=\"proportion\",\n", + " y=data.final_pmi,\n", + " )\n", + " plt.ylabel(\"Origin PMI\")\n", + " plt.xlabel(\"Proportion of Seed Posts by Innovator Subreddit\")\n", + " plt.savefig(\"../figures/div_linregress.pdf\")\n", + " \n", + "def compareplot(starter_proportions):\n", + " data = starter_proportions.dropna(subset=[\"final_pmi\", \"final_control\"])\n", + " data = data[data.proportion.between(0.5, 1, inclusive=\"left\")]\n", + " data = data.melt(\n", + " id_vars=[\"binned_proportion\", \"subreddit\"],\n", + " value_vars=[\"final_pmi\", \"final_control\"],\n", + " var_name=\"Group\",\n", + " value_name=\"PPMI\"\n", + " )\n", + " sns.pointplot(\n", + " data=data.assign(\n", + " Group=data[\"Group\"].map({\"final_pmi\": \"Origin subreddit\", \"final_control\": \"Other subreddits\"})\n", + " ),\n", + " x=data.binned_proportion / 10,\n", + " y=\"PPMI\",\n", + " hue=\"Group\"\n", + " )\n", + " plt.xlabel(\"% of first 100 posts in origin subreddit\")\n", + " plt.savefig(\"../figures/divergence.pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "89547d3d", + "metadata": {}, + "outputs": [], + "source": [ + "def regress(starter_proportions):\n", + " # do paired ttest\n", + " data = starter_proportions.dropna(subset=[\"final_pmi\", \"final_control\"])\n", + " data = data[data.proportion.between(0.5, 1, inclusive=\"left\")]\n", + "# results = stats.ttest_rel(data.final_pmi, data.final_control)\n", + " print(\"Paired t-test for each cluster\")\n", + " print(stats.linregress(data.proportion, data.final_pmi - data.final_control))" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "bc8290ea", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d36866e0c65d4d8bada2a3ac8b3d26e5", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/3683 [00:00:7: RuntimeWarning: divide by zero encountered in log2\n", + " pmi = np.log2(p_xy) - np.log2(p_x * p_y)\n", + ":69: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n", + " starter_proportions.loc[:, \"final_control\"] = ending_df[mask].groupby(\"template\").pmi.agg(\"mean\")\n" + ] + } + ], + "source": [ + "starter_proportions = origin_analysis()" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "ce1c7009", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Paired t-test for each cluster\n", + "LinregressResult(slope=3.8349818189385787, intercept=-2.354880105716605, rvalue=0.5046915037221197, pvalue=1.1844118404801556e-59, stderr=0.21830066757602912, intercept_stderr=0.13621971707415811)\n" + ] + } + ], + "source": [ + "regress(starter_proportions)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "e4cfdb48", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "linregplot(starter_proportions)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "868b7cac", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "compareplot(starter_proportions)" + ] + }, + { + "cell_type": "markdown", + "id": "a3e2d932", + "metadata": {}, + "source": [ + "# Acculturation" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d660334b", + "metadata": {}, + "outputs": [], + "source": [ + "tmp = df.sort_values(\"utc\").groupby([\"subreddit\", \"user\"])\n", + "df[\"comment_timedelta\"] = tmp.utc.transform(lambda x: x - x.iloc[0])\n", + "df.comment_timedelta = pd.to_timedelta(df.comment_timedelta, unit=\"s\")\n", + "\n", + "a = df[\n", + " df.user.ne(\"[deleted]\")\n", + " & ~df.user.str.lower().str.contains(\"bot\")\n", + " & df.comment_timedelta.dt.days.lt(12 * 30)\n", + "]\n", + "\n", + "user_counts = a.groupby([\"subreddit\", \"user\"]).post_id.count().reset_index()\n", + "keep_user_subs = {(x.subreddit, x.user) for x in user_counts[user_counts.post_id.gt(10)][[\"subreddit\", \"user\"]].itertuples()}\n", + "mask = a[[\"subreddit\", \"user\"]].apply(lambda x: (x.subreddit, x.user) in keep_user_subs, axis=1)\n", + "grouped = a[mask].groupby([\"subreddit\", \"user\", a[mask].comment_timedelta.dt.days // 30]).pmi.mean().reset_index()\n", + "\n", + "keep_groups = grouped.subreddit.value_counts()[grouped.subreddit.value_counts() >= 30].index\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d36ac260", + "metadata": {}, + "outputs": [], + "source": [ + "len(g.user.unique())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "67edd139", + "metadata": {}, + "outputs": [], + "source": [ + "np.random.seed(0xb1ab)\n", + "g = grouped[grouped.subreddit.isin(keep_groups)].groupby('subreddit', group_keys=False).apply(lambda x: x.sample(min(len(x), 100), replace=True))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a12c188f", + "metadata": {}, + "outputs": [], + "source": [ + "sns.pointplot(x=g.comment_timedelta, y=g.pmi)\n", + "\n", + "plt.xlabel(\"Months since first comment\")\n", + "plt.ylabel(\"PPMI\")\n", + "plt.savefig(\"../figures/acculturation.pdf\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "443b4154", + "metadata": {}, + "outputs": [], + "source": [ + "print(stats.pearsonr(g.comment_timedelta, g.pmi))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fd8e33ad", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/memes/data/README.md b/memes/data/README.md new file mode 100644 index 0000000..85bf1ed --- /dev/null +++ b/memes/data/README.md @@ -0,0 +1,3 @@ +# Dataset + +Currently, the images are not available for download. However, semantic\_clusters\_roberta contains IDs of Reddit posts, the image URLs, and the cluster assignments, which you can use to reconstruct the data for all of the experiments.