{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Kaggle Notebooks Analysis","metadata":{}},{"cell_type":"markdown","source":"![image.png](attachment:c4d6e57d-84e2-4de1-beb8-9cd409640aa1.png)","metadata":{},"attachments":{"c4d6e57d-84e2-4de1-beb8-9cd409640aa1.png":{"image/png":"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"}}},{"cell_type":"markdown","source":"# Table of Contents\n\n- 1. Dataset and Dependencies\n   - 1.1 Importing the necessary libraries\n   - 1.2 Reading in the Dataset\n- 2. General EDA\n   - 2.1 Missing Values\n- 3. Detailed Analysis\n   - 3.1 Distribution of cell type column\n   - 3.2 An example of each cell type\n- 4. Text Data Preprocessing\n    - 4.1 Cleaning Codes and Markdown Text\n- 5. Text Statistics\n   - 5.1 Source Length Analysis\n   - 5.2 Word Count Analysis\n- 6. Ngram Analysis\n    - 6.1 Top 20 Unigrams in Code and Markdown Cells\n    - 6.2 Top 20 Bigrams in Code and Markdown Cells\n    - 6.3 Top 20 Trigrams in Code and Markdown Cells\n- 7. Wordclouds\n- 8. Interesting Insights","metadata":{}},{"cell_type":"markdown","source":"# 1. Dataset and Dependencies 📃","metadata":{"execution":{"iopub.status.busy":"2022-05-13T05:57:23.080467Z","iopub.execute_input":"2022-05-13T05:57:23.081065Z","iopub.status.idle":"2022-05-13T05:57:23.08676Z","shell.execute_reply.started":"2022-05-13T05:57:23.081024Z","shell.execute_reply":"2022-05-13T05:57:23.084645Z"}}},{"cell_type":"markdown","source":"## 1.1 Importing the necessary libraries","metadata":{}},{"cell_type":"code","source":"# general dependencies\nimport os\nimport json\nimport numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport warnings\nwarnings.filterwarnings(\"ignore\")\n\n# text processing libraries\nimport re\nimport string\nimport nltk\nfrom nltk.corpus import stopwords\nimport wordcloud\n\n# sklearn libraries\nfrom sklearn import model_selection\nfrom sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:14:25.423934Z","iopub.execute_input":"2022-05-13T08:14:25.424838Z","iopub.status.idle":"2022-05-13T08:14:27.752286Z","shell.execute_reply.started":"2022-05-13T08:14:25.424733Z","shell.execute_reply":"2022-05-13T08:14:27.751179Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.set(style=\"whitegrid\", palette=\"muted\")\nsns.set(rc={'figure.figsize':(11.7,8.27)})","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:14:27.754834Z","iopub.execute_input":"2022-05-13T08:14:27.755275Z","iopub.status.idle":"2022-05-13T08:14:27.765543Z","shell.execute_reply.started":"2022-05-13T08:14:27.755223Z","shell.execute_reply":"2022-05-13T08:14:27.763819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 1.2 Reading in the Dataset","metadata":{}},{"cell_type":"markdown","source":"Pandas Dataframe used is created by Darien Schettler. \n\nLink to dataset - https://www.kaggle.com/datasets/dschettler8845/ai4code-train-dataframe","metadata":{}},{"cell_type":"code","source":"## Reading the train dataframe\ntrain = pd.read_csv(\"../input/ai4code-train-dataframe/train.csv\")","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:14:27.768205Z","iopub.execute_input":"2022-05-13T08:14:27.7687Z","iopub.status.idle":"2022-05-13T08:15:27.637464Z","shell.execute_reply.started":"2022-05-13T08:14:27.768662Z","shell.execute_reply":"2022-05-13T08:15:27.636585Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 2. General EDA 📊","metadata":{}},{"cell_type":"markdown","source":"## 2.1 Overview of the data","metadata":{}},{"cell_type":"code","source":"train.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:15:27.639142Z","iopub.execute_input":"2022-05-13T08:15:27.640256Z","iopub.status.idle":"2022-05-13T08:15:27.666768Z","shell.execute_reply.started":"2022-05-13T08:15:27.640124Z","shell.execute_reply":"2022-05-13T08:15:27.666133Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.info()","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:15:27.66779Z","iopub.execute_input":"2022-05-13T08:15:27.668603Z","iopub.status.idle":"2022-05-13T08:15:27.696238Z","shell.execute_reply.started":"2022-05-13T08:15:27.668557Z","shell.execute_reply":"2022-05-13T08:15:27.694456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.shape, train.nunique()","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:15:27.697781Z","iopub.execute_input":"2022-05-13T08:15:27.698073Z","iopub.status.idle":"2022-05-13T08:15:41.866601Z","shell.execute_reply.started":"2022-05-13T08:15:27.698036Z","shell.execute_reply":"2022-05-13T08:15:41.865637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"* Training dataframe has 6370646 records and 4 features.\n\n* There are two cell types: codes and markdowns\n\n* Source column contains text data for the corresponding cell.","metadata":{}},{"cell_type":"code","source":"print(f\"Number of notebooks present in train set: \",len(os.listdir(\"../input/AI4Code/train\")))\nprint(f\"Number of notebooks present in test set: \",len(os.listdir(\"../input/AI4Code/test\")))","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:15:41.868245Z","iopub.execute_input":"2022-05-13T08:15:41.868633Z","iopub.status.idle":"2022-05-13T08:15:44.505176Z","shell.execute_reply.started":"2022-05-13T08:15:41.868582Z","shell.execute_reply":"2022-05-13T08:15:44.504161Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 2.2 Missing Values","metadata":{}},{"cell_type":"code","source":"train.isna().sum()","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:15:44.506696Z","iopub.execute_input":"2022-05-13T08:15:44.507236Z","iopub.status.idle":"2022-05-13T08:15:47.591423Z","shell.execute_reply.started":"2022-05-13T08:15:44.507195Z","shell.execute_reply":"2022-05-13T08:15:47.590577Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Since there are only 4 missing values, let's drop them from our analysis.","metadata":{}},{"cell_type":"code","source":"train = train.dropna()","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:15:47.592494Z","iopub.execute_input":"2022-05-13T08:15:47.592728Z","iopub.status.idle":"2022-05-13T08:15:51.352813Z","shell.execute_reply.started":"2022-05-13T08:15:47.592687Z","shell.execute_reply":"2022-05-13T08:15:51.351939Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 3. Detailed Analysis 🔎","metadata":{}},{"cell_type":"markdown","source":"## 3.1 Distribution of cell type column","metadata":{}},{"cell_type":"code","source":"train['cell_type'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:15:51.357057Z","iopub.execute_input":"2022-05-13T08:15:51.357328Z","iopub.status.idle":"2022-05-13T08:15:52.366442Z","shell.execute_reply.started":"2022-05-13T08:15:51.357296Z","shell.execute_reply":"2022-05-13T08:15:52.3654Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Checking the distribution of cell type variable\n\ncelltype1 = train['cell_type'].value_counts()['markdown']\ncelltype0 = train['cell_type'].value_counts()['code']\ncelltype1per = celltype1 / train.shape[0] * 100\ncelltype0per = celltype0 / train.shape[0] * 100\n\nprint('{} of {} records are codes it is the {:.2f}% of the training set.'.format(celltype0, train.shape[0], celltype0per))\nprint('{} of {} records are markdowns and it is the {:.2f}% of the training set.'.format(celltype1, train.shape[0], celltype1per))\n\nplt.figure(figsize=(8,6))\nsns.countplot(train['cell_type'], palette = 'viridis', order = sorted(train['cell_type'].unique()))\n\nplt.xlabel('celltype', size=12, labelpad=15)\nplt.ylabel('Count', size=12, labelpad=15)\nplt.xticks((0, 1), ['Code ({0:.2f}%)'.format(celltype0per), 'Markdown ({0:.2f}%)'.format(celltype1per)])\nplt.tick_params(axis='x', labelsize=12)\nplt.tick_params(axis='y', labelsize=12)\n\nplt.title('Training Data Cell type Distribution', size=15, y=1.05)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:15:52.367955Z","iopub.execute_input":"2022-05-13T08:15:52.368691Z","iopub.status.idle":"2022-05-13T08:16:00.484971Z","shell.execute_reply.started":"2022-05-13T08:15:52.368634Z","shell.execute_reply":"2022-05-13T08:16:00.483545Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"2/3rd of the records contain Codes and 1/3rd contains Markdown text.","metadata":{}},{"cell_type":"markdown","source":"## 3.2 An example of each cell type","metadata":{}},{"cell_type":"code","source":"# Code\nprint(\"Code :\\n\",train[train['cell_type']=='code']['source'].values[0])\nprint(\"*\"*40)\n# Markdown\nprint(\"\\nMarkdown :\\n\",train[train['cell_type']=='markdown']['source'].values[0])","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:16:00.487935Z","iopub.execute_input":"2022-05-13T08:16:00.488816Z","iopub.status.idle":"2022-05-13T08:16:03.399089Z","shell.execute_reply.started":"2022-05-13T08:16:00.488763Z","shell.execute_reply":"2022-05-13T08:16:03.398175Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4. Text Data Preprocessing ✨","metadata":{}},{"cell_type":"code","source":"#Performing the below analysis only on a sample to save memory\ntrain = train.sample(500000, random_state = 1)","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:16:03.401138Z","iopub.execute_input":"2022-05-13T08:16:03.40149Z","iopub.status.idle":"2022-05-13T08:16:04.736681Z","shell.execute_reply.started":"2022-05-13T08:16:03.401431Z","shell.execute_reply":"2022-05-13T08:16:04.735385Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 4.1 Cleaning Codes and Markdown Text","metadata":{}},{"cell_type":"markdown","source":"Let's create a function to clean the codes and markdown text. Following tasks are performed on the text data:\n\n1. Make text lowercase\n2. Remove hyperlinks\n3. Remove punctuation\n4. Remove numbers\n5. Tokenize the text\n6. Remove stopwords","metadata":{}},{"cell_type":"code","source":"####Source: https://www.kaggle.com/code/parulpandey/eda-and-preprocessing-for-bert\n\n# text preprocessing helper functions\n\ndef clean_text(text):\n    '''Make text lowercase, remove text in square brackets,remove links,remove punctuation\n    and remove words containing numbers.'''\n    text = text.lower()\n    text = text.strip()\n    text = re.sub('\\[.*?\\]', '', text)\n    text = re.sub('https?://\\S+|www\\.\\S+', '', text)\n    text = re.sub('<.*?>+', '', text)\n    text = re.sub('[%s]' % re.escape(string.punctuation), '', text)\n    text = re.sub('\\n', '', text)\n    text = re.sub('\\w*\\d\\w*', '', text)\n    return text\n\ndef text_preprocessing(text):\n    \"\"\"\n    Cleaning and parsing the text.\n\n    \"\"\"\n    tokenizer = nltk.tokenize.RegexpTokenizer(r'\\w+')\n    nopunc = clean_text(text)\n    tokenized_text = tokenizer.tokenize(nopunc)\n    combined_text = ' '.join(tokenized_text)\n    return combined_text\n\n# code text preprocessing helped functions\n\ndef clean_code(text):\n    '''Make text lowercase, remove text in square brackets,remove links,remove punctuation\n    and remove words containing numbers.'''\n    text = text.replace('[', ' ').replace(']', ' ').replace('(', ' ').replace(')', ' ').replace('{', ' ').replace('}', ' ').replace('=', ' ').replace(',', ' ')\n    text = text.lower()\n    text = text.replace('_', '')\n    text = text.replace('\\n', ' ')\n    text = text.replace('.', ' ')\n    text = re.sub(r'\".*\"', ' ', text)\n    text = re.sub(r\"'.*'\", ' ', text)\n    text = re.sub(\"^\\d+\\s|\\s\\d+\\s|\\s\\d+$\", ' ', text)\n    text = re.sub(' +', ' ', text)\n    text = text.strip()\n    return text\n\ndef code_preprocessing(text):\n    \"\"\"\n    Cleaning and parsing the text.\n\n    \"\"\"\n    tokenizer = nltk.tokenize.RegexpTokenizer(r'\\w+')\n    nopunc = clean_code(text)\n    tokenized_text = tokenizer.tokenize(nopunc)\n    combined_text = ' '.join(tokenized_text)\n    return combined_text","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:16:04.738312Z","iopub.execute_input":"2022-05-13T08:16:04.738737Z","iopub.status.idle":"2022-05-13T08:16:04.755035Z","shell.execute_reply.started":"2022-05-13T08:16:04.73867Z","shell.execute_reply":"2022-05-13T08:16:04.753789Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Let's divide the data by cell type\n\nmarkdowns = train[train['cell_type'] == 'markdown']\ncodes = train[train['cell_type'] == 'code']","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:16:04.75665Z","iopub.execute_input":"2022-05-13T08:16:04.757006Z","iopub.status.idle":"2022-05-13T08:16:05.047704Z","shell.execute_reply.started":"2022-05-13T08:16:04.75696Z","shell.execute_reply":"2022-05-13T08:16:05.046615Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Applying the cleaning function on codes and markdown data\n\ncodes['source_clean'] = codes['source'].apply(str).apply(lambda x: code_preprocessing(x))\nmarkdowns['source_clean'] = markdowns['source'].apply(str).apply(lambda x: text_preprocessing(x))","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:16:05.04922Z","iopub.execute_input":"2022-05-13T08:16:05.05008Z","iopub.status.idle":"2022-05-13T08:16:34.783771Z","shell.execute_reply.started":"2022-05-13T08:16:05.050039Z","shell.execute_reply":"2022-05-13T08:16:34.782637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Concatenating clean text into train data\n\ntrain = pd.concat([codes, markdowns], ignore_index = True)","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:16:34.785242Z","iopub.execute_input":"2022-05-13T08:16:34.78567Z","iopub.status.idle":"2022-05-13T08:16:34.926261Z","shell.execute_reply.started":"2022-05-13T08:16:34.785631Z","shell.execute_reply":"2022-05-13T08:16:34.925125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 5. Text Statistics 📉","metadata":{}},{"cell_type":"markdown","source":"Let's create two new features to help us understand this data and do the below analysis:\n\n1. Text length analysis\n2. Word Count analysis","metadata":{}},{"cell_type":"code","source":"train['text_len'] = train['source_clean'].astype(str).apply(len)\ntrain['text_word_count'] = train['source_clean'].apply(lambda x: len(str(x).split()))","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:16:34.927499Z","iopub.execute_input":"2022-05-13T08:16:34.927757Z","iopub.status.idle":"2022-05-13T08:16:36.325961Z","shell.execute_reply.started":"2022-05-13T08:16:34.927727Z","shell.execute_reply":"2022-05-13T08:16:36.324785Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"markdowns = train[train['cell_type'] == 'markdown']\ncodes = train[train['cell_type'] == 'code']","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:16:36.327196Z","iopub.execute_input":"2022-05-13T08:16:36.327451Z","iopub.status.idle":"2022-05-13T08:16:36.958423Z","shell.execute_reply.started":"2022-05-13T08:16:36.327419Z","shell.execute_reply":"2022-05-13T08:16:36.957483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train.head()","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:16:36.959725Z","iopub.execute_input":"2022-05-13T08:16:36.959976Z","iopub.status.idle":"2022-05-13T08:16:36.974437Z","shell.execute_reply.started":"2022-05-13T08:16:36.959941Z","shell.execute_reply":"2022-05-13T08:16:36.973313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## 5.1 Source Length Analysis","metadata":{}},{"cell_type":"markdown","source":"Plotting all values result in a highly skewed distribution.\n\nLet's plot only the most frequent values.","metadata":{}},{"cell_type":"code","source":"x = train['text_len'].value_counts()\ntrain_sample = train[train['text_len'].isin(x[x>200].index)]","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:28:54.363913Z","iopub.execute_input":"2022-05-13T08:28:54.364691Z","iopub.status.idle":"2022-05-13T08:28:54.60361Z","shell.execute_reply.started":"2022-05-13T08:28:54.364639Z","shell.execute_reply":"2022-05-13T08:28:54.602557Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.kdeplot(data=train_sample, x=\"text_len\", hue = 'cell_type', palette = 'viridis', shade = True)\nplt.title('Text Character Length Countplot', size=12)\nplt.xlabel('Character Length', size=10, labelpad=10)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:28:54.604942Z","iopub.execute_input":"2022-05-13T08:28:54.605187Z","iopub.status.idle":"2022-05-13T08:28:57.545472Z","shell.execute_reply.started":"2022-05-13T08:28:54.605156Z","shell.execute_reply":"2022-05-13T08:28:57.544113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Most people prefer to write short text. (Just like this one.)","metadata":{}},{"cell_type":"code","source":"sns.boxplot(data=train,x = 'cell_type', y=\"text_len\", palette = 'viridis', showfliers = False)\nplt.title('Text Character Length Boxplot', size=15)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:16:42.174366Z","iopub.execute_input":"2022-05-13T08:16:42.174746Z","iopub.status.idle":"2022-05-13T08:16:42.818826Z","shell.execute_reply.started":"2022-05-13T08:16:42.17468Z","shell.execute_reply":"2022-05-13T08:16:42.817675Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"We can see that markdowns are generally longer than code snippet.\n\nMedian Code length is slightly above 50 characters and median Markdown length is slightly above that of the code. ","metadata":{}},{"cell_type":"markdown","source":"## 5.2 Word Count Analysis","metadata":{}},{"cell_type":"code","source":"x = train['text_word_count'].value_counts()\ntrain_sample = train[train['text_word_count'].isin(x[x>200].index)]\n\nsns.kdeplot(data=train_sample, x=\"text_word_count\", hue = 'cell_type', palette = 'viridis', shade = True)\n\nplt.title('Text Word Countplot', size=12)\nplt.xlabel('Word Count', size=10, labelpad=10)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:29:35.735965Z","iopub.execute_input":"2022-05-13T08:29:35.736914Z","iopub.status.idle":"2022-05-13T08:29:39.041366Z","shell.execute_reply.started":"2022-05-13T08:29:35.736868Z","shell.execute_reply":"2022-05-13T08:29:39.040614Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sns.boxplot(data=train,x = 'cell_type', y=\"text_word_count\", palette = 'viridis', showfliers = False)\nplt.title('Word Count Boxplot', size=15)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:16:46.372335Z","iopub.execute_input":"2022-05-13T08:16:46.372876Z","iopub.status.idle":"2022-05-13T08:16:47.181387Z","shell.execute_reply.started":"2022-05-13T08:16:46.372828Z","shell.execute_reply":"2022-05-13T08:16:47.180684Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Again, We can confirm that markdowns are generally longer than code snippet.\n\nMedian Code word count is about 8 words and median Markdown word count is slightly above that of the code. ","metadata":{}},{"cell_type":"markdown","source":"# 6. Ngram Analysis 📈","metadata":{}},{"cell_type":"markdown","source":"## 6.1 Top 20 Unigrams in Code and Markdown Cells","metadata":{}},{"cell_type":"code","source":"#source of code : https://medium.com/@cristhianboujon/how-to-list-the-most-common-words-from-text-corpus-using-scikit-learn-dad4d0cab41d\ndef get_top_n_words(corpus, n=None):\n    \"\"\"\n    List the top n words in a vocabulary according to occurrence in a text corpus.\n    \"\"\"\n    vec = CountVectorizer(stop_words = 'english').fit(corpus)\n    bag_of_words = vec.transform(corpus)\n    sum_words = bag_of_words.sum(axis=0) \n    words_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.items()]\n    words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)\n    return words_freq[:n]","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:16:47.182881Z","iopub.execute_input":"2022-05-13T08:16:47.183394Z","iopub.status.idle":"2022-05-13T08:16:47.191567Z","shell.execute_reply.started":"2022-05-13T08:16:47.183344Z","shell.execute_reply":"2022-05-13T08:16:47.190914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"codes_unigrams = get_top_n_words(codes['source_clean'],20)\n\ndf1 = pd.DataFrame(codes_unigrams, columns = ['Text' , 'count'])\ndf1 = df1.groupby('Text').sum()['count'].sort_values(ascending=False)\ndf1 = pd.DataFrame(df1).reset_index()\nsns.barplot(y = 'Text', x = 'count', data = df1, palette = 'viridis')\nplt.title('Top 20 Code Unigrams', size=15)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:16:47.19618Z","iopub.execute_input":"2022-05-13T08:16:47.196596Z","iopub.status.idle":"2022-05-13T08:17:04.026849Z","shell.execute_reply.started":"2022-05-13T08:16:47.196544Z","shell.execute_reply":"2022-05-13T08:17:04.026104Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Most common keywords found in code snippets are:\n\n1. Import\n2. plt\n3. df\n4. data\n5. print","metadata":{}},{"cell_type":"code","source":"markdowns_unigrams = get_top_n_words(markdowns['source_clean'],20)\n\ndf2 = pd.DataFrame(markdowns_unigrams, columns = ['Text' , 'count'])\ndf2 = df2.groupby('Text').sum()['count'].sort_values(ascending=False)\ndf2 = pd.DataFrame(df2).reset_index()\nsns.barplot(y = 'Text', x = 'count', data = df2, palette = 'viridis')\nplt.title('Top 20 Markdown Unigrams', size=15)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:17:04.030549Z","iopub.execute_input":"2022-05-13T08:17:04.031318Z","iopub.status.idle":"2022-05-13T08:17:16.897397Z","shell.execute_reply.started":"2022-05-13T08:17:04.031273Z","shell.execute_reply":"2022-05-13T08:17:16.896407Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Most common keywords found in Markdown text are:\n\n1. data\n2. model\n3. dataset\n4. values\n5. use","metadata":{}},{"cell_type":"markdown","source":"## 6.2 Top 20 Bigrams in Code and Markdown Cells","metadata":{}},{"cell_type":"code","source":"def get_top_n_gram(corpus,ngram_range,n=None):\n    vec = CountVectorizer(ngram_range=ngram_range,stop_words = 'english').fit(corpus)\n    bag_of_words = vec.transform(corpus)\n    sum_words = bag_of_words.sum(axis=0) \n    words_freq = [(word, sum_words[0, idx]) for word, idx in vec.vocabulary_.items()]\n    words_freq =sorted(words_freq, key = lambda x: x[1], reverse=True)\n    return words_freq[:n]","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:17:16.898785Z","iopub.execute_input":"2022-05-13T08:17:16.899004Z","iopub.status.idle":"2022-05-13T08:17:16.906119Z","shell.execute_reply.started":"2022-05-13T08:17:16.898976Z","shell.execute_reply":"2022-05-13T08:17:16.905393Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"codes_bigrams = get_top_n_gram(codes['source_clean'],(2,2),20)\n\n#for word, freq in top_bigrams:\ndf1 = pd.DataFrame(codes_bigrams, columns = ['Text' , 'count'])\ndf1 = df1.groupby('Text').sum()['count'].sort_values(ascending=False)\ndf1 = pd.DataFrame(df1).reset_index()\nsns.barplot(y = 'Text', x = 'count', data = df1, palette = 'viridis')\nplt.title('Top 20 Code Bigrams', size=15)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:17:16.907243Z","iopub.execute_input":"2022-05-13T08:17:16.907876Z","iopub.status.idle":"2022-05-13T08:17:49.391059Z","shell.execute_reply.started":"2022-05-13T08:17:16.907836Z","shell.execute_reply":"2022-05-13T08:17:49.390125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Most common bigrams found in Code snippets are:\n\n1. plt.figure\n2. pd.read_csv \n3. figure.figsize\n4. xtrain, ytrain\n5. pd.DataFrame","metadata":{}},{"cell_type":"code","source":"markdowns_bigrams = get_top_n_gram(markdowns['source_clean'],(2,2),20)\n\n#for word, freq in top_bigrams:\ndf2 = pd.DataFrame(markdowns_bigrams, columns = ['Text' , 'count'])\ndf2 = df2.groupby('Text').sum()['count'].sort_values(ascending=False)\ndf2 = pd.DataFrame(df2).reset_index()\nsns.barplot(y = 'Text', x = 'count', data = df2, palette = 'viridis')\nplt.title('Top 20 Markdown Bigrams', size=15)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:17:49.392556Z","iopub.execute_input":"2022-05-13T08:17:49.392878Z","iopub.status.idle":"2022-05-13T08:18:16.422135Z","shell.execute_reply.started":"2022-05-13T08:17:49.39284Z","shell.execute_reply":"2022-05-13T08:18:16.421188Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Most common bigrams found in Markdown text are:\n\n1. missing values\n2. machine learning\n3. random forest (Most Famous ML Algorithm)\n4. data analysis\n5. logistic regression","metadata":{}},{"cell_type":"markdown","source":"## 6.3 Top 20 Trigrams in Code and Markdown Cells","metadata":{}},{"cell_type":"code","source":"codes_bigrams = get_top_n_gram(codes['source_clean'],(3,3),20)\n\n#for word, freq in top_bigrams:\ndf1 = pd.DataFrame(codes_bigrams, columns = ['Text' , 'count'])\ndf1 = df1.groupby('Text').sum()['count'].sort_values(ascending=False)\ndf1 = pd.DataFrame(df1).reset_index()\nsns.barplot(y = 'Text', x = 'count', data = df1, palette = 'viridis')\nplt.title('Top 20 Code Trigrams', size=15)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:18:16.423362Z","iopub.execute_input":"2022-05-13T08:18:16.423603Z","iopub.status.idle":"2022-05-13T08:18:53.287756Z","shell.execute_reply.started":"2022-05-13T08:18:16.423573Z","shell.execute_reply":"2022-05-13T08:18:53.286728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Most common trigrams found in Code snippets are:\n\n1. plt.figure.figsize\n2. import numpy as np\n3. import pandas as pd\n4. import matplotlib.pyplot\n5. matplot.pyplot as plt","metadata":{}},{"cell_type":"code","source":"markdowns_bigrams = get_top_n_gram(markdowns['source_clean'],(3,3),20)\n\n#for word, freq in top_bigrams:\ndf2 = pd.DataFrame(markdowns_bigrams, columns = ['Text' , 'count'])\ndf2 = df2.groupby('Text').sum()['count'].sort_values(ascending=False)\ndf2 = pd.DataFrame(df2).reset_index()\nsns.barplot(y = 'Text', x = 'count', data = df2, palette = 'viridis')\nplt.title('Top 20 Markdown Trigrams', size=15)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:18:53.289003Z","iopub.execute_input":"2022-05-13T08:18:53.289237Z","iopub.status.idle":"2022-05-13T08:19:25.040867Z","shell.execute_reply.started":"2022-05-13T08:18:53.289208Z","shell.execute_reply":"2022-05-13T08:19:25.039558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Most common trigrams found in Markdown text are:\n\n1. exploratory data analysis\n2. random forest classifier\n3. machine learning model\n4. train test data\n5. machine learning algorithms","metadata":{}},{"cell_type":"markdown","source":"# 7. Wordclouds ☁️","metadata":{}},{"cell_type":"code","source":"from wordcloud import WordCloud, STOPWORDS\nimport matplotlib.pyplot as plt\nstopwords = set(STOPWORDS)\n\ndef show_wordcloud(data, title = None):\n    wordcloud = WordCloud(\n        background_color='white',\n        stopwords=stopwords,\n        max_words=2000000,\n        max_font_size=40, \n        scale=2,\n        random_state=1).generate(str(data))\n\n    fig = plt.figure(1, figsize=(12, 12))\n    plt.axis('off')\n    if title: \n        fig.suptitle(title, fontsize=20)\n        fig.subplots_adjust(top=2.3)\n\n    plt.imshow(wordcloud)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:19:25.043075Z","iopub.execute_input":"2022-05-13T08:19:25.04349Z","iopub.status.idle":"2022-05-13T08:19:25.054745Z","shell.execute_reply.started":"2022-05-13T08:19:25.043421Z","shell.execute_reply":"2022-05-13T08:19:25.053788Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Word Cloud for Codes\")\nshow_wordcloud(codes['source_clean'].values)\nprint(\"\\nWord Cloud for Markdowns\")\nshow_wordcloud(markdowns['source_clean'].values)","metadata":{"execution":{"iopub.status.busy":"2022-05-13T08:19:25.056172Z","iopub.execute_input":"2022-05-13T08:19:25.057136Z","iopub.status.idle":"2022-05-13T08:19:25.933625Z","shell.execute_reply.started":"2022-05-13T08:19:25.057087Z","shell.execute_reply":"2022-05-13T08:19:25.932798Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 8. Interesting Insights 🥇🥈🥉","metadata":{}},{"cell_type":"markdown","source":"## 8.1 Kaggler's Favorite Library 🏆\n\nLet's find out which is the library is the most famous on Kaggle","metadata":{}},{"cell_type":"code","source":"codes_import = codes[codes['source_clean'].str.contains('import')]\n\ncodes_unigrams = get_top_n_words(codes_import['source_clean'],10)[1:]\n\ndf1 = pd.DataFrame(codes_unigrams, columns = ['Text' , 'count'])\ndf1 = df1.groupby('Text').sum()['count'].sort_values(ascending=False)\ndf1 = pd.DataFrame(df1).reset_index()\nsns.barplot(y = 'Text', x = 'count', data = df1, palette = 'viridis')\nplt.title('Most Famous Dependencies', size=15)\nplt.show()","metadata":{"_kg_hide-input":true,"execution":{"iopub.status.busy":"2022-05-13T08:19:25.935039Z","iopub.execute_input":"2022-05-13T08:19:25.935518Z","iopub.status.idle":"2022-05-13T08:19:29.823646Z","shell.execute_reply.started":"2022-05-13T08:19:25.935469Z","shell.execute_reply":"2022-05-13T08:19:29.822916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Most Famous Python Libraries on Kaggle:\n\n1. Sklearn\n2. Matplotlib\n3. Numpy\n4. Pandas\n\n**Sklearn is the most famous library! It has been imported maximum number of times.**","metadata":{}},{"cell_type":"markdown","source":"## 8.2 Favorite ML Algorithms 🥇\nFor proof, check the bigrams and trigrams above.\n\n1. Random Forest Classifier\n2. Logistic Regression\n3. Support Vector Machine\n4. Decision Trees\n5. Linear Regression","metadata":{}},{"cell_type":"markdown","source":"# The End!\nThank you for reading this notebook. I hope you found this analysis interesting and useful.\n\n### Please upvote if you liked the analysis. It will motivate me to do better :)\n![](http://68.media.tumblr.com/e1aed171ded2bd78cc8dc0e73b594eaf/tumblr_o17frv0cdu1u9u459o1_500.gif)","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}