MIF_E31222492/Pengumpulan Data/Tugas Akhir.ipynb

5367 lines
428 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "QwCBnQJxpbPt"
},
"source": [
"# Pengumpulan Data"
]
},
{
"cell_type": "code",
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')"
],
"metadata": {
"id": "E7F7B9QVpkJK",
"outputId": "bb9ae0d3-d86e-479f-f6d1-7e4df55c67c7",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"execution_count": 17,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n"
]
}
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "KkXH79MxpbPw"
},
"outputs": [],
"source": [
"#@title Twitter Auth Token\n",
"\n",
"twitter_auth_token = 'ccb0a6dc47226f7ddc27a7a0975107094c8899e3'"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "DIGXUll9pbPy"
},
"outputs": [],
"source": [
"# Install Node.js\n",
"%sudo apt-get update\n",
"%sudo apt-get install -y ca-certificates curl gnupg\n",
"%sudo mkdir -p /etc/apt/keyrings\n",
"%curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg\n",
"\n",
"%NODE_MAJOR=20 && echo \"deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main\" | sudo tee /etc/apt/sources.list.d/nodesource.list\n",
"\n",
"%sudo apt-get update\n",
"%sudo apt-get install nodejs -y\n",
"\n",
"%node -v"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "443732olpbP0"
},
"outputs": [],
"source": [
"# Crawl Data\n",
"import os\n",
"\n",
"# List keyword untuk digunakan\n",
"keywords = [\n",
" 'gaji gen z lang:id until:2024-12-31 since:2020-01-01',\n",
" 'kesehatan mental generasi z lang:id until:2024-12-31 since:2020-01-01'\n",
" 'finansial gen z lang:id until:2024-12-31 since:2020-01-01'\n",
"]\n",
"\n",
"# Filename untuk setiap keyword\n",
"filenames = [\n",
" 'dataset-gaji-gen-z.csv',\n",
" 'dataset_kesehatan_mental_generasi_z.csv',\n",
" 'dataset_finansial_gen_z.csv'\n",
"]\n",
"\n",
"# Limit data yang ingin dikumpulkan\n",
"limit = 50000\n",
"\n",
"# Lakukan crawling untuk setiap keyword\n",
"for keyword, filename in zip(keywords, filenames):\n",
" os.system(f'npx -y tweet-harvest@2.6.1 -o \"{filename}\" -s \"{keyword}\" --tab \"LATEST\" -l {limit} --token {twitter_auth_token}')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Fa_zUkx_pbP1"
},
"source": [
"# Pra-pemrosesan data"
]
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "Op1SYYqvvRwE"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"id": "OtOOY93LpbP2",
"outputId": "7d40a52c-bed3-4227-93b8-9941a28847ac",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 4600
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" conversation_id_str created_at favorite_count \\\n",
"0 1873627304632758640 Mon Dec 30 07:08:54 +0000 2024 0 \n",
"1 1873552074291765383 Mon Dec 30 02:09:58 +0000 2024 0 \n",
"2 1873198670558183506 Sun Dec 29 02:45:40 +0000 2024 0 \n",
"3 1872963394632101930 Sat Dec 28 11:10:45 +0000 2024 123 \n",
"4 1872907838714229142 Sat Dec 28 07:30:00 +0000 2024 0 \n",
".. ... ... ... \n",
"446 1287968595243405314 Tue Jul 28 04:30:17 +0000 2020 2 \n",
"447 1273488173532938240 Thu Jun 18 06:29:17 +0000 2020 0 \n",
"448 1235524166519885825 Thu Mar 05 11:14:50 +0000 2020 3 \n",
"449 1215396692926746625 Thu Jan 09 22:15:27 +0000 2020 0 \n",
"450 1215395587614359553 Thu Jan 09 22:11:03 +0000 2020 0 \n",
"\n",
" full_text id_str \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... 1873627304632758640 \n",
"1 4 Langkah Sederhana Investasi untuk Gen Z Capa... 1873552074291765383 \n",
"2 4 Langkah Mudah Mulai Investasi Buat Gen Z Men... 1873198670558183506 \n",
"3 Assalamu alaikum Sahabat Syariah! Tantangan so... 1872963394632101930 \n",
"4 Finansial yang sehat itu bukan cuma soal punya... 1872907838714229142 \n",
".. ... ... \n",
"446 Acara yang berbasis online ini merupakan sebua... 1287968595243405314 \n",
"447 @detiksport Kalo masalahnya finansial bisa dim... 1273503030978068480 \n",
"448 Tahukah Smart People jika Generasi Z tercatat ... 1235524166519885825 \n",
"449 Yrl Mendekati usia 20 tahun gatau kenapa banya... 1215396692926746625 \n",
"450 Mendekati usia 20 tahun gatau kenapa banyak ba... 1215395587614359553 \n",
"\n",
" image_url in_reply_to_screen_name \\\n",
"0 NaN NaN \n",
"1 https://pbs.twimg.com/media/GgAxaBXawAAaveA.jpg NaN \n",
"2 NaN NaN \n",
"3 https://pbs.twimg.com/media/Gf4aRbyawAgqR32.jpg NaN \n",
"4 https://pbs.twimg.com/media/Gf22shuagAA-GV5.jpg NaN \n",
".. ... ... \n",
"446 NaN NaN \n",
"447 NaN detiksport \n",
"448 https://pbs.twimg.com/media/ESV2rbvUwAIiilw.jpg NaN \n",
"449 NaN NaN \n",
"450 NaN NaN \n",
"\n",
" lang location quote_count reply_count retweet_count \\\n",
"0 in Indonesia 0 0 0 \n",
"1 in Indonesia 0 0 0 \n",
"2 in Indonesia 0 0 0 \n",
"3 in Jakarta, Indonesia 0 4 55 \n",
"4 in Jakarta, Indonesia 0 1 1 \n",
".. ... ... ... ... ... \n",
"446 in www.marketeers.com 0 0 0 \n",
"447 in Kota Bandung, Jawa Barat 0 0 0 \n",
"448 in DKI Jakarta 0 1 0 \n",
"449 in RULES TAP LINK ‼️ 0 3 1 \n",
"450 in NaN 0 0 0 \n",
"\n",
" tweet_url user_id_str \\\n",
"0 https://x.com/JavanicaPost/status/187362730463... 1846016698920685568 \n",
"1 https://x.com/digivestasi/status/1873552074291... 1450395130792329223 \n",
"2 https://x.com/ilhamiasnawi/status/187319867055... 305657272 \n",
"3 https://x.com/bankbsi_id/status/18729633946321... 141500996 \n",
"4 https://x.com/CIMBNiaga/status/187290783871422... 949032626 \n",
".. ... ... \n",
"446 https://x.com/the_marketeers/status/1287968595... 79957943 \n",
"447 https://x.com/faithprogress/status/12735030309... 81836775 \n",
"448 https://x.com/tuguinsurance/status/12355241665... 2217154892 \n",
"449 https://x.com/your2rl/status/1215396692926746625 1601505026 \n",
"450 https://x.com/wipilarpa/status/121539558761435... 1024610447847116802 \n",
"\n",
" username \n",
"0 JavanicaPost \n",
"1 digivestasi \n",
"2 ilhamiasnawi \n",
"3 bankbsi_id \n",
"4 CIMBNiaga \n",
".. ... \n",
"446 the_marketeers \n",
"447 faithprogress \n",
"448 tuguinsurance \n",
"449 your2rl \n",
"450 wipilarpa \n",
"\n",
"[451 rows x 15 columns]"
],
"text/html": [
"\n",
" <div id=\"df-0ee037d3-b2c2-468e-9ebe-10e372be8a57\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>conversation_id_str</th>\n",
" <th>created_at</th>\n",
" <th>favorite_count</th>\n",
" <th>full_text</th>\n",
" <th>id_str</th>\n",
" <th>image_url</th>\n",
" <th>in_reply_to_screen_name</th>\n",
" <th>lang</th>\n",
" <th>location</th>\n",
" <th>quote_count</th>\n",
" <th>reply_count</th>\n",
" <th>retweet_count</th>\n",
" <th>tweet_url</th>\n",
" <th>user_id_str</th>\n",
" <th>username</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1873627304632758640</td>\n",
" <td>Mon Dec 30 07:08:54 +0000 2024</td>\n",
" <td>0</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>1873627304632758640</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>in</td>\n",
" <td>Indonesia</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>https://x.com/JavanicaPost/status/187362730463...</td>\n",
" <td>1846016698920685568</td>\n",
" <td>JavanicaPost</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1873552074291765383</td>\n",
" <td>Mon Dec 30 02:09:58 +0000 2024</td>\n",
" <td>0</td>\n",
" <td>4 Langkah Sederhana Investasi untuk Gen Z Capa...</td>\n",
" <td>1873552074291765383</td>\n",
" <td>https://pbs.twimg.com/media/GgAxaBXawAAaveA.jpg</td>\n",
" <td>NaN</td>\n",
" <td>in</td>\n",
" <td>Indonesia</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>https://x.com/digivestasi/status/1873552074291...</td>\n",
" <td>1450395130792329223</td>\n",
" <td>digivestasi</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1873198670558183506</td>\n",
" <td>Sun Dec 29 02:45:40 +0000 2024</td>\n",
" <td>0</td>\n",
" <td>4 Langkah Mudah Mulai Investasi Buat Gen Z Men...</td>\n",
" <td>1873198670558183506</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>in</td>\n",
" <td>Indonesia</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>https://x.com/ilhamiasnawi/status/187319867055...</td>\n",
" <td>305657272</td>\n",
" <td>ilhamiasnawi</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1872963394632101930</td>\n",
" <td>Sat Dec 28 11:10:45 +0000 2024</td>\n",
" <td>123</td>\n",
" <td>Assalamu alaikum Sahabat Syariah! Tantangan so...</td>\n",
" <td>1872963394632101930</td>\n",
" <td>https://pbs.twimg.com/media/Gf4aRbyawAgqR32.jpg</td>\n",
" <td>NaN</td>\n",
" <td>in</td>\n",
" <td>Jakarta, Indonesia</td>\n",
" <td>0</td>\n",
" <td>4</td>\n",
" <td>55</td>\n",
" <td>https://x.com/bankbsi_id/status/18729633946321...</td>\n",
" <td>141500996</td>\n",
" <td>bankbsi_id</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1872907838714229142</td>\n",
" <td>Sat Dec 28 07:30:00 +0000 2024</td>\n",
" <td>0</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>1872907838714229142</td>\n",
" <td>https://pbs.twimg.com/media/Gf22shuagAA-GV5.jpg</td>\n",
" <td>NaN</td>\n",
" <td>in</td>\n",
" <td>Jakarta, Indonesia</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>1</td>\n",
" <td>https://x.com/CIMBNiaga/status/187290783871422...</td>\n",
" <td>949032626</td>\n",
" <td>CIMBNiaga</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>446</th>\n",
" <td>1287968595243405314</td>\n",
" <td>Tue Jul 28 04:30:17 +0000 2020</td>\n",
" <td>2</td>\n",
" <td>Acara yang berbasis online ini merupakan sebua...</td>\n",
" <td>1287968595243405314</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>in</td>\n",
" <td>www.marketeers.com</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>https://x.com/the_marketeers/status/1287968595...</td>\n",
" <td>79957943</td>\n",
" <td>the_marketeers</td>\n",
" </tr>\n",
" <tr>\n",
" <th>447</th>\n",
" <td>1273488173532938240</td>\n",
" <td>Thu Jun 18 06:29:17 +0000 2020</td>\n",
" <td>0</td>\n",
" <td>@detiksport Kalo masalahnya finansial bisa dim...</td>\n",
" <td>1273503030978068480</td>\n",
" <td>NaN</td>\n",
" <td>detiksport</td>\n",
" <td>in</td>\n",
" <td>Kota Bandung, Jawa Barat</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>https://x.com/faithprogress/status/12735030309...</td>\n",
" <td>81836775</td>\n",
" <td>faithprogress</td>\n",
" </tr>\n",
" <tr>\n",
" <th>448</th>\n",
" <td>1235524166519885825</td>\n",
" <td>Thu Mar 05 11:14:50 +0000 2020</td>\n",
" <td>3</td>\n",
" <td>Tahukah Smart People jika Generasi Z tercatat ...</td>\n",
" <td>1235524166519885825</td>\n",
" <td>https://pbs.twimg.com/media/ESV2rbvUwAIiilw.jpg</td>\n",
" <td>NaN</td>\n",
" <td>in</td>\n",
" <td>DKI Jakarta</td>\n",
" <td>0</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>https://x.com/tuguinsurance/status/12355241665...</td>\n",
" <td>2217154892</td>\n",
" <td>tuguinsurance</td>\n",
" </tr>\n",
" <tr>\n",
" <th>449</th>\n",
" <td>1215396692926746625</td>\n",
" <td>Thu Jan 09 22:15:27 +0000 2020</td>\n",
" <td>0</td>\n",
" <td>Yrl Mendekati usia 20 tahun gatau kenapa banya...</td>\n",
" <td>1215396692926746625</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>in</td>\n",
" <td>RULES TAP LINK ‼️</td>\n",
" <td>0</td>\n",
" <td>3</td>\n",
" <td>1</td>\n",
" <td>https://x.com/your2rl/status/1215396692926746625</td>\n",
" <td>1601505026</td>\n",
" <td>your2rl</td>\n",
" </tr>\n",
" <tr>\n",
" <th>450</th>\n",
" <td>1215395587614359553</td>\n",
" <td>Thu Jan 09 22:11:03 +0000 2020</td>\n",
" <td>0</td>\n",
" <td>Mendekati usia 20 tahun gatau kenapa banyak ba...</td>\n",
" <td>1215395587614359553</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>in</td>\n",
" <td>NaN</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>https://x.com/wipilarpa/status/121539558761435...</td>\n",
" <td>1024610447847116802</td>\n",
" <td>wipilarpa</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>451 rows × 15 columns</p>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-0ee037d3-b2c2-468e-9ebe-10e372be8a57')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-0ee037d3-b2c2-468e-9ebe-10e372be8a57 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-0ee037d3-b2c2-468e-9ebe-10e372be8a57');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-d068a85e-c6ad-486d-a0e7-e0f31be8b605\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-d068a85e-c6ad-486d-a0e7-e0f31be8b605')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-d068a85e-c6ad-486d-a0e7-e0f31be8b605 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" <div id=\"id_9139d825-9147-43e3-9776-f1c8808c560b\">\n",
" <style>\n",
" .colab-df-generate {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-generate:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-generate {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-generate:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
" <button class=\"colab-df-generate\" onclick=\"generateWithVariable('df1')\"\n",
" title=\"Generate code using this dataframe.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n",
" </svg>\n",
" </button>\n",
" <script>\n",
" (() => {\n",
" const buttonEl =\n",
" document.querySelector('#id_9139d825-9147-43e3-9776-f1c8808c560b button.colab-df-generate');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" buttonEl.onclick = () => {\n",
" google.colab.notebook.generateWithVariable('df1');\n",
" }\n",
" })();\n",
" </script>\n",
" </div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "df1",
"summary": "{\n \"name\": \"df1\",\n \"rows\": 451,\n \"fields\": [\n {\n \"column\": \"conversation_id_str\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 137338101189843440,\n \"min\": 1215395587614359553,\n \"max\": 1873627304632758640,\n \"num_unique_values\": 430,\n \"samples\": [\n 1290467073399955461,\n 1846151521060507687,\n 1795394936793379161\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"created_at\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 449,\n \"samples\": [\n \"Tue Oct 03 09:36:19 +0000 2023\",\n \"Mon Aug 28 13:00:36 +0000 2023\",\n \"Thu Aug 29 07:29:44 +0000 2024\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"favorite_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 101,\n \"min\": 0,\n \"max\": 1817,\n \"num_unique_values\": 36,\n \"samples\": [\n 10,\n 5,\n 1817\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"full_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 447,\n \"samples\": [\n \"Ini Tantangan Finansial Bagi Gen Z : Okezone Economy https://t.co/VtCMM7P7fL\",\n \"@MiniGoldID Jadilah generasi millenial &amp; Gen Z yang smart finansial untuk ciptakan masa depan yang cerah secerah kemilau MiniGold..\",\n \"Gen Z dan Milenial Lebih Mengutamakan Work-Life Balance daripada Finansial Apa Alasannya? - Bisnis Muda https://t.co/l7MKmgnnft #bisnismuda\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"id_str\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 137334203568879136,\n \"min\": 1215395587614359553,\n \"max\": 1873627304632758640,\n \"num_unique_values\": 451,\n \"samples\": [\n 1696063147482943613,\n 1854206852722307481,\n 1630849872302866434\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"image_url\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 128,\n \"samples\": [\n \"https://pbs.twimg.com/media/GR8h4KCbcAEcaiE.jpg\",\n \"https://pbs.twimg.com/media/GX6SF7caUAEWQfS.jpg\",\n \"https://pbs.twimg.com/media/Ga83N2ubQAAGkjq.jpg\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"in_reply_to_screen_name\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 128,\n \"samples\": [\n \"KemenkeuRI\",\n \"_haye_\",\n \"babinyeleneh\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"lang\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 1,\n \"samples\": [\n \"in\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"location\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 129,\n \"samples\": [\n \"\\u2764\\ufe0f\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"quote_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 0,\n \"min\": 0,\n \"max\": 13,\n \"num_unique_values\": 9,\n \"samples\": [\n 13\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"reply_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 6,\n \"min\": 0,\n \"max\": 135,\n \"num_unique_values\": 15,\n \"samples\": [\n 15\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"retweet_count\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 13,\n \"min\": 0,\n \"max\": 208,\n \"num_unique_values\": 20,\n \"samples\": [\n 0\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tweet_url\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 451,\n \"samples\": [\n \"https://x.com/Bisniscom/status/1696063147482943613\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"user_id_str\",\n \"properties\": {\n \"dtype\": \"number\",\n \"std\": 735132847075928192,\n \"min\": 18129942,\n \"max\": 1862874585315811328,\n \"num_unique_values\": 341,\n \"samples\": [\n 1217102261014294528\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"username\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 341,\n \"samples\": [\n \"matabicara_\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 2
}
],
"source": [
"import pandas as pd\n",
"\n",
"# Membaca dataset\n",
"df1 = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/REAL-DATA/REAL-dataset_finansial_gen_z.csv')\n",
"df2 = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/REAL-DATA/REAL-dataset_gaji_gen_z.csv')\n",
"df3 = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/REAL-DATA/REAL-dataset_kesehatan_mental_generasi_z.csv')\n",
"df4 = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data matang/dataset_finansial_gen_z.csv')\n",
"df5 = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data matang/dataset_gaji_gen_z.csv')\n",
"df6 = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data matang/dataset_kesehatan_mental_generasi_z-TGL.csv')\n",
"\n",
"# Menambahkan kolom keyword\n",
"df1['keyword'] = 'finansial gen z'\n",
"df2['keyword'] = 'gaji gen z'\n",
"df3['keyword'] = 'kesehatan mental generasi z'\n",
"df4['keyword'] = 'finansial gen z'\n",
"df5['keyword'] = 'gaji gen z'\n",
"df6['keyword'] = 'kesehatan mental generasi z'\n",
"\n",
"# Menggabungkan data set berdasarkan keyword\n",
"df_finansial = pd.concat([df1, df4], ignore_index=True)\n",
"df_gaji = pd.concat([df2, df5], ignore_index=True)\n",
"df_kesehatan_mental = pd.concat([df3, df6], ignore_index=True)\n",
"\n",
"# Menggabungkan semua dataframe menjadi satu\n",
"merge_df = pd.concat([df_finansial, df_gaji, df_kesehatan_mental], ignore_index=True)\n",
"\n",
"# Menyimpan ke CSV\n",
"merge_df.to_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-kotor.csv', index=False)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"id": "EzxWJ80fpbP4",
"outputId": "6d58b284-2276-47ef-fa0b-8c1dd5958c39",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 585
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"conversation_id_str 8369\n",
"created_at 8369\n",
"favorite_count 8369\n",
"full_text 8369\n",
"id_str 8369\n",
"image_url 692\n",
"in_reply_to_screen_name 4689\n",
"lang 8369\n",
"location 4065\n",
"quote_count 8369\n",
"reply_count 8369\n",
"retweet_count 8369\n",
"tweet_url 8369\n",
"user_id_str 8369\n",
"username 8369\n",
"keyword 8369\n",
"dtype: int64"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>conversation_id_str</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>created_at</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>favorite_count</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>full_text</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>id_str</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>image_url</th>\n",
" <td>692</td>\n",
" </tr>\n",
" <tr>\n",
" <th>in_reply_to_screen_name</th>\n",
" <td>4689</td>\n",
" </tr>\n",
" <tr>\n",
" <th>lang</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>location</th>\n",
" <td>4065</td>\n",
" </tr>\n",
" <tr>\n",
" <th>quote_count</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>reply_count</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>retweet_count</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>tweet_url</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>user_id_str</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>username</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>keyword</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div><br><label><b>dtype:</b> int64</label>"
]
},
"metadata": {},
"execution_count": 8
}
],
"source": [
"df = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-kotor.csv')\n",
"df.count()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"id": "M_-HgONJpbP8",
"outputId": "881c8cf9-6b3a-4287-a0ea-1d047b566443",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 178
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"created_at 8369\n",
"full_text 8369\n",
"keyword 8369\n",
"dtype: int64"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>created_at</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>full_text</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" <tr>\n",
" <th>keyword</th>\n",
" <td>8369</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div><br><label><b>dtype:</b> int64</label>"
]
},
"metadata": {},
"execution_count": 9
}
],
"source": [
"#drop column is not needed\n",
"df.drop(df.columns[[0,2,4,5,6,7,8,9,10,11,12,11,13,14]], axis=1, inplace=True)\n",
"df.count()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"id": "oufVMghCpbP-",
"outputId": "06d2cff5-a00a-4668-a2e7-25051a81bf7b",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 178
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"created_at 5387\n",
"full_text 5387\n",
"keyword 5387\n",
"dtype: int64"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>created_at</th>\n",
" <td>5387</td>\n",
" </tr>\n",
" <tr>\n",
" <th>full_text</th>\n",
" <td>5387</td>\n",
" </tr>\n",
" <tr>\n",
" <th>keyword</th>\n",
" <td>5387</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div><br><label><b>dtype:</b> int64</label>"
]
},
"metadata": {},
"execution_count": 10
}
],
"source": [
"# drop row have duplicate value\n",
"df.drop_duplicates(subset=['full_text'], inplace=True)\n",
"\n",
"#drop row have missing value\n",
"df.dropna(subset=['full_text'], inplace=True)\n",
"\n",
"df.to_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets.csv', index=False)\n",
"df.count()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_AjsHPfMpbP-"
},
"source": [
"## cleansing data"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"id": "EcBqIvJVpbP_",
"outputId": "f303b7eb-4e6f-43d8-ef84-d77a0fdb3087",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 293
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" created_at \\\n",
"0 Mon Dec 30 07:08:54 +0000 2024 \n",
"1 Mon Dec 30 02:09:58 +0000 2024 \n",
"2 Sun Dec 29 02:45:40 +0000 2024 \n",
"3 Sat Dec 28 11:10:45 +0000 2024 \n",
"4 Sat Dec 28 07:30:00 +0000 2024 \n",
"\n",
" full_text keyword \n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... finansial gen z \n",
"1 4 Langkah Sederhana Investasi untuk Gen Z Capa... finansial gen z \n",
"2 4 Langkah Mudah Mulai Investasi Buat Gen Z Men... finansial gen z \n",
"3 Assalamu alaikum Sahabat Syariah! Tantangan so... finansial gen z \n",
"4 Finansial yang sehat itu bukan cuma soal punya... finansial gen z "
],
"text/html": [
"\n",
" <div id=\"df-cce5170f-51de-46d6-b8bb-6cbb75a5a244\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>created_at</th>\n",
" <th>full_text</th>\n",
" <th>keyword</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Mon Dec 30 07:08:54 +0000 2024</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>finansial gen z</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Mon Dec 30 02:09:58 +0000 2024</td>\n",
" <td>4 Langkah Sederhana Investasi untuk Gen Z Capa...</td>\n",
" <td>finansial gen z</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sun Dec 29 02:45:40 +0000 2024</td>\n",
" <td>4 Langkah Mudah Mulai Investasi Buat Gen Z Men...</td>\n",
" <td>finansial gen z</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Sat Dec 28 11:10:45 +0000 2024</td>\n",
" <td>Assalamu alaikum Sahabat Syariah! Tantangan so...</td>\n",
" <td>finansial gen z</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Sat Dec 28 07:30:00 +0000 2024</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial gen z</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-cce5170f-51de-46d6-b8bb-6cbb75a5a244')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-cce5170f-51de-46d6-b8bb-6cbb75a5a244 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-cce5170f-51de-46d6-b8bb-6cbb75a5a244');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-88529e77-c011-44c5-83cb-7126964f3676\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-88529e77-c011-44c5-83cb-7126964f3676')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-88529e77-c011-44c5-83cb-7126964f3676 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "df",
"summary": "{\n \"name\": \"df\",\n \"rows\": 5387,\n \"fields\": [\n {\n \"column\": \"created_at\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 5229,\n \"samples\": [\n \"Sun Jul 09 21:01:42 +0000 2023\",\n \"Wed May 22 16:50:31 +0000 2024\",\n \"Sun Oct 11 09:39:07 +0000 2020\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"full_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5387,\n \"samples\": [\n \"@worksfess ni yg nanya pasti gen Z. kalo lo expect gaji 2 dijit ngaca dulu yaa please :). kalo masih anak kemaren sore struggle dulu nyet.\",\n \"Dari data dapat disimpulkan sebenarnya gen Z punya minat yang cukup besar menjadi PNS maupun korporat swasta. Berbeda dengan milenial cenderung lebih tinggi menjadi PNS. Hal ini karena milenial berorientasi pada gaji dan tunjangan untuk tabungan masa depan. #IDNTimesLife https://t.co/4wKYGFPnFC\",\n \"Khususnya di tengah masa pandemi seperti ini menurut survei banyak dari generasi z yang merasakan dampak dari pandemi ini kepada kesehatan mental mereka. Generasi yang lebih tua dianggap lebih tangguh karena dari segi finansial ataupun pola pikir yang sudah lebih dewasa.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"keyword\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"finansial gen z\",\n \"gaji gen z\",\n \"kesehatan mental generasi z\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 3
}
],
"source": [
"import pandas as pd\n",
"df = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"id": "ZfLlmtcvpbQA",
"outputId": "172c3819-cee2-4fc6-a4b0-6accf5962f62",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 379
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" created_at \\\n",
"0 Mon Dec 30 07:08:54 +0000 2024 \n",
"1 Mon Dec 30 02:09:58 +0000 2024 \n",
"2 Sun Dec 29 02:45:40 +0000 2024 \n",
"3 Sat Dec 28 11:10:45 +0000 2024 \n",
"4 Sat Dec 28 07:30:00 +0000 2024 \n",
"\n",
" full_text keyword \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... finansial gen z \n",
"1 4 Langkah Sederhana Investasi untuk Gen Z Capa... finansial gen z \n",
"2 4 Langkah Mudah Mulai Investasi Buat Gen Z Men... finansial gen z \n",
"3 Assalamu alaikum Sahabat Syariah! Tantangan so... finansial gen z \n",
"4 Finansial yang sehat itu bukan cuma soal punya... finansial gen z \n",
"\n",
" cleanning_text \n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 Langkah Sederhana Investasi untuk Gen Z Capai ... \n",
"2 Langkah Mudah Mulai Investasi Buat Gen Z Menuj... \n",
"3 Assalamu alaikum Sahabat Syariah Tantangan sos... \n",
"4 Finansial yang sehat itu bukan cuma soal punya... "
],
"text/html": [
"\n",
" <div id=\"df-5f981857-2c3b-4029-ba08-e307d799d28c\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>created_at</th>\n",
" <th>full_text</th>\n",
" <th>keyword</th>\n",
" <th>cleanning_text</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Mon Dec 30 07:08:54 +0000 2024</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Mon Dec 30 02:09:58 +0000 2024</td>\n",
" <td>4 Langkah Sederhana Investasi untuk Gen Z Capa...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Sederhana Investasi untuk Gen Z Capai ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sun Dec 29 02:45:40 +0000 2024</td>\n",
" <td>4 Langkah Mudah Mulai Investasi Buat Gen Z Men...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Mudah Mulai Investasi Buat Gen Z Menuj...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Sat Dec 28 11:10:45 +0000 2024</td>\n",
" <td>Assalamu alaikum Sahabat Syariah! Tantangan so...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Assalamu alaikum Sahabat Syariah Tantangan sos...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Sat Dec 28 07:30:00 +0000 2024</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-5f981857-2c3b-4029-ba08-e307d799d28c')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-5f981857-2c3b-4029-ba08-e307d799d28c button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-5f981857-2c3b-4029-ba08-e307d799d28c');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-587eedde-d54a-4983-b0b3-5c94a7c0cc81\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-587eedde-d54a-4983-b0b3-5c94a7c0cc81')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-587eedde-d54a-4983-b0b3-5c94a7c0cc81 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "df",
"summary": "{\n \"name\": \"df\",\n \"rows\": 5387,\n \"fields\": [\n {\n \"column\": \"created_at\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 5229,\n \"samples\": [\n \"Sun Jul 09 21:01:42 +0000 2023\",\n \"Wed May 22 16:50:31 +0000 2024\",\n \"Sun Oct 11 09:39:07 +0000 2020\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"full_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5387,\n \"samples\": [\n \"@worksfess ni yg nanya pasti gen Z. kalo lo expect gaji 2 dijit ngaca dulu yaa please :). kalo masih anak kemaren sore struggle dulu nyet.\",\n \"Dari data dapat disimpulkan sebenarnya gen Z punya minat yang cukup besar menjadi PNS maupun korporat swasta. Berbeda dengan milenial cenderung lebih tinggi menjadi PNS. Hal ini karena milenial berorientasi pada gaji dan tunjangan untuk tabungan masa depan. #IDNTimesLife https://t.co/4wKYGFPnFC\",\n \"Khususnya di tengah masa pandemi seperti ini menurut survei banyak dari generasi z yang merasakan dampak dari pandemi ini kepada kesehatan mental mereka. Generasi yang lebih tua dianggap lebih tangguh karena dari segi finansial ataupun pola pikir yang sudah lebih dewasa.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"keyword\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"finansial gen z\",\n \"gaji gen z\",\n \"kesehatan mental generasi z\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"cleanning_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5339,\n \"samples\": [\n \"Gaji dan budaya tidak sesuai Gen Z lebih pilih resign Bener gak yah Terus apa dong yang harus dilakukan Swipe Yuk genZ millenials kerja resign faktor didyouknow fact fakta\",\n \"Gamau gen z tapi apa nuntut pengalaman dan entry level job opportunity maks tahun emg gajelas maunya apa Mau yg profesional bisa dijinakin dgn gaji rendah tpi gamau nerima gen z dan gamau ngajarin trs jahat ke younger coworker tpi nyalahin mental melempem\",\n \"Mental health Apa yang ada di pikiran kalian jika mendengar kata itu Untuk para Generasi Z mungkin sudah tidak asing lagi mendengar kata itu Sudah banyak orang yang menyinggung tentang mental health ini Namun kesadaran akan kesehatan mental di Indonesia masih sangat rendah\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 4
}
],
"source": [
"# cleansing data\n",
"import re\n",
"import string\n",
"\n",
"def clean_text(text):\n",
" text = re.sub(r'@[A-Za-z0-9]+', '', text) # delete mention\n",
" text = re.sub(r'#', '', text) # delete hastag\n",
" text = re.sub(r'RT[\\s]+', '', text) # delate RT\n",
" text = re.sub(r'https?:\\/\\/\\S+', '', text) # delete hyperlink\n",
" text = re.sub(r'\\n', '', text) # delete new line\n",
" text = re.sub(r'\\d+', '', text) # delete number\n",
" text = re.sub(r'[^A-Za-z ]+', '', text) # delete non alphabet\n",
"\n",
" text = text.replace('…', '') # delete ellipsis\n",
" text = text.translate(str.maketrans('', '', string.punctuation)) # delete punctuation\n",
" text = text.strip() # delete space\n",
" return text\n",
"\n",
"df ['cleanning_text'] = df['full_text'].apply(clean_text)\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "EpoJ46YFpbQB"
},
"source": [
"## case folding"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"id": "3d82FLCHpbQC",
"outputId": "33e71be8-9854-403d-8b9a-191250ef65c1",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 466
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" created_at \\\n",
"0 Mon Dec 30 07:08:54 +0000 2024 \n",
"1 Mon Dec 30 02:09:58 +0000 2024 \n",
"2 Sun Dec 29 02:45:40 +0000 2024 \n",
"3 Sat Dec 28 11:10:45 +0000 2024 \n",
"4 Sat Dec 28 07:30:00 +0000 2024 \n",
"\n",
" full_text keyword \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... finansial gen z \n",
"1 4 Langkah Sederhana Investasi untuk Gen Z Capa... finansial gen z \n",
"2 4 Langkah Mudah Mulai Investasi Buat Gen Z Men... finansial gen z \n",
"3 Assalamu alaikum Sahabat Syariah! Tantangan so... finansial gen z \n",
"4 Finansial yang sehat itu bukan cuma soal punya... finansial gen z \n",
"\n",
" cleanning_text \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 Langkah Sederhana Investasi untuk Gen Z Capai ... \n",
"2 Langkah Mudah Mulai Investasi Buat Gen Z Menuj... \n",
"3 Assalamu alaikum Sahabat Syariah Tantangan sos... \n",
"4 Finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" case_folding \n",
"0 kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 langkah sederhana investasi untuk gen z capai ... \n",
"2 langkah mudah mulai investasi buat gen z menuj... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial yang sehat itu bukan cuma soal punya... "
],
"text/html": [
"\n",
" <div id=\"df-d1619afa-9401-4b8c-8241-f9748d5bc63f\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>created_at</th>\n",
" <th>full_text</th>\n",
" <th>keyword</th>\n",
" <th>cleanning_text</th>\n",
" <th>case_folding</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Mon Dec 30 07:08:54 +0000 2024</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Mon Dec 30 02:09:58 +0000 2024</td>\n",
" <td>4 Langkah Sederhana Investasi untuk Gen Z Capa...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Sederhana Investasi untuk Gen Z Capai ...</td>\n",
" <td>langkah sederhana investasi untuk gen z capai ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sun Dec 29 02:45:40 +0000 2024</td>\n",
" <td>4 Langkah Mudah Mulai Investasi Buat Gen Z Men...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Mudah Mulai Investasi Buat Gen Z Menuj...</td>\n",
" <td>langkah mudah mulai investasi buat gen z menuj...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Sat Dec 28 11:10:45 +0000 2024</td>\n",
" <td>Assalamu alaikum Sahabat Syariah! Tantangan so...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Assalamu alaikum Sahabat Syariah Tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Sat Dec 28 07:30:00 +0000 2024</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial yang sehat itu bukan cuma soal punya...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-d1619afa-9401-4b8c-8241-f9748d5bc63f')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-d1619afa-9401-4b8c-8241-f9748d5bc63f button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-d1619afa-9401-4b8c-8241-f9748d5bc63f');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-eff5452d-89bc-44e8-9e1d-bea5779cf26f\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-eff5452d-89bc-44e8-9e1d-bea5779cf26f')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-eff5452d-89bc-44e8-9e1d-bea5779cf26f button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "df",
"summary": "{\n \"name\": \"df\",\n \"rows\": 5387,\n \"fields\": [\n {\n \"column\": \"created_at\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 5229,\n \"samples\": [\n \"Sun Jul 09 21:01:42 +0000 2023\",\n \"Wed May 22 16:50:31 +0000 2024\",\n \"Sun Oct 11 09:39:07 +0000 2020\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"full_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5387,\n \"samples\": [\n \"@worksfess ni yg nanya pasti gen Z. kalo lo expect gaji 2 dijit ngaca dulu yaa please :). kalo masih anak kemaren sore struggle dulu nyet.\",\n \"Dari data dapat disimpulkan sebenarnya gen Z punya minat yang cukup besar menjadi PNS maupun korporat swasta. Berbeda dengan milenial cenderung lebih tinggi menjadi PNS. Hal ini karena milenial berorientasi pada gaji dan tunjangan untuk tabungan masa depan. #IDNTimesLife https://t.co/4wKYGFPnFC\",\n \"Khususnya di tengah masa pandemi seperti ini menurut survei banyak dari generasi z yang merasakan dampak dari pandemi ini kepada kesehatan mental mereka. Generasi yang lebih tua dianggap lebih tangguh karena dari segi finansial ataupun pola pikir yang sudah lebih dewasa.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"keyword\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"finansial gen z\",\n \"gaji gen z\",\n \"kesehatan mental generasi z\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"cleanning_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5339,\n \"samples\": [\n \"Gaji dan budaya tidak sesuai Gen Z lebih pilih resign Bener gak yah Terus apa dong yang harus dilakukan Swipe Yuk genZ millenials kerja resign faktor didyouknow fact fakta\",\n \"Gamau gen z tapi apa nuntut pengalaman dan entry level job opportunity maks tahun emg gajelas maunya apa Mau yg profesional bisa dijinakin dgn gaji rendah tpi gamau nerima gen z dan gamau ngajarin trs jahat ke younger coworker tpi nyalahin mental melempem\",\n \"Mental health Apa yang ada di pikiran kalian jika mendengar kata itu Untuk para Generasi Z mungkin sudah tidak asing lagi mendengar kata itu Sudah banyak orang yang menyinggung tentang mental health ini Namun kesadaran akan kesehatan mental di Indonesia masih sangat rendah\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"case_folding\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5336,\n \"samples\": [\n \"sebenernya gen z tuh kerja apa aja dijabanin asal wajar dan umr lu kalo bukan perusahaan yang bener udah kerjaan overload gaji autan terus lu bilang bersyukur lu sama aja menyuburkan perbudakan koncol\",\n \"diluar konteks ini lagian siapa lagi yang berani minta gaji tinggi selain gen z ya betah banget sama umr yang berapa lama ga naik naik itu padahal semuanya udah inflasi\",\n \"ternyata bener jg gen z klo kerja gaji kecil tu mikir hehe\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 5
}
],
"source": [
"# case folding\n",
"def case_folding(text):\n",
" text = text.lower() # change to lower case\n",
" return text\n",
"\n",
"df['case_folding'] = df['cleanning_text'].apply(case_folding)\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2fzDtpQ6pbQC"
},
"source": [
"## convert slang word"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"id": "goccyreFpbQC",
"outputId": "603b754d-f71f-4e36-cf4d-5d72d19f1c88",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 625
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" created_at \\\n",
"0 Mon Dec 30 07:08:54 +0000 2024 \n",
"1 Mon Dec 30 02:09:58 +0000 2024 \n",
"2 Sun Dec 29 02:45:40 +0000 2024 \n",
"3 Sat Dec 28 11:10:45 +0000 2024 \n",
"4 Sat Dec 28 07:30:00 +0000 2024 \n",
"\n",
" full_text keyword \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... finansial gen z \n",
"1 4 Langkah Sederhana Investasi untuk Gen Z Capa... finansial gen z \n",
"2 4 Langkah Mudah Mulai Investasi Buat Gen Z Men... finansial gen z \n",
"3 Assalamu alaikum Sahabat Syariah! Tantangan so... finansial gen z \n",
"4 Finansial yang sehat itu bukan cuma soal punya... finansial gen z \n",
"\n",
" cleanning_text \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 Langkah Sederhana Investasi untuk Gen Z Capai ... \n",
"2 Langkah Mudah Mulai Investasi Buat Gen Z Menuj... \n",
"3 Assalamu alaikum Sahabat Syariah Tantangan sos... \n",
"4 Finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" case_folding \\\n",
"0 kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 langkah sederhana investasi untuk gen z capai ... \n",
"2 langkah mudah mulai investasi buat gen z menuj... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" convert_slang_word \n",
"0 kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 langkah sederhana investasi untuk gen saja cap... \n",
"2 langkah mudah mulai investasi buat gen saja me... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial yang sehat itu bukan cuma soal punya... "
],
"text/html": [
"\n",
" <div id=\"df-44e127d7-0eb2-4807-ab0b-e55df497fe10\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>created_at</th>\n",
" <th>full_text</th>\n",
" <th>keyword</th>\n",
" <th>cleanning_text</th>\n",
" <th>case_folding</th>\n",
" <th>convert_slang_word</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Mon Dec 30 07:08:54 +0000 2024</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Mon Dec 30 02:09:58 +0000 2024</td>\n",
" <td>4 Langkah Sederhana Investasi untuk Gen Z Capa...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Sederhana Investasi untuk Gen Z Capai ...</td>\n",
" <td>langkah sederhana investasi untuk gen z capai ...</td>\n",
" <td>langkah sederhana investasi untuk gen saja cap...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sun Dec 29 02:45:40 +0000 2024</td>\n",
" <td>4 Langkah Mudah Mulai Investasi Buat Gen Z Men...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Mudah Mulai Investasi Buat Gen Z Menuj...</td>\n",
" <td>langkah mudah mulai investasi buat gen z menuj...</td>\n",
" <td>langkah mudah mulai investasi buat gen saja me...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Sat Dec 28 11:10:45 +0000 2024</td>\n",
" <td>Assalamu alaikum Sahabat Syariah! Tantangan so...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Assalamu alaikum Sahabat Syariah Tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Sat Dec 28 07:30:00 +0000 2024</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial yang sehat itu bukan cuma soal punya...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-44e127d7-0eb2-4807-ab0b-e55df497fe10')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-44e127d7-0eb2-4807-ab0b-e55df497fe10 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-44e127d7-0eb2-4807-ab0b-e55df497fe10');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-6e86fa91-0508-4578-a004-048923830ef4\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-6e86fa91-0508-4578-a004-048923830ef4')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-6e86fa91-0508-4578-a004-048923830ef4 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "df",
"summary": "{\n \"name\": \"df\",\n \"rows\": 5387,\n \"fields\": [\n {\n \"column\": \"created_at\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 5229,\n \"samples\": [\n \"Sun Jul 09 21:01:42 +0000 2023\",\n \"Wed May 22 16:50:31 +0000 2024\",\n \"Sun Oct 11 09:39:07 +0000 2020\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"full_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5387,\n \"samples\": [\n \"@worksfess ni yg nanya pasti gen Z. kalo lo expect gaji 2 dijit ngaca dulu yaa please :). kalo masih anak kemaren sore struggle dulu nyet.\",\n \"Dari data dapat disimpulkan sebenarnya gen Z punya minat yang cukup besar menjadi PNS maupun korporat swasta. Berbeda dengan milenial cenderung lebih tinggi menjadi PNS. Hal ini karena milenial berorientasi pada gaji dan tunjangan untuk tabungan masa depan. #IDNTimesLife https://t.co/4wKYGFPnFC\",\n \"Khususnya di tengah masa pandemi seperti ini menurut survei banyak dari generasi z yang merasakan dampak dari pandemi ini kepada kesehatan mental mereka. Generasi yang lebih tua dianggap lebih tangguh karena dari segi finansial ataupun pola pikir yang sudah lebih dewasa.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"keyword\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"finansial gen z\",\n \"gaji gen z\",\n \"kesehatan mental generasi z\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"cleanning_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5339,\n \"samples\": [\n \"Gaji dan budaya tidak sesuai Gen Z lebih pilih resign Bener gak yah Terus apa dong yang harus dilakukan Swipe Yuk genZ millenials kerja resign faktor didyouknow fact fakta\",\n \"Gamau gen z tapi apa nuntut pengalaman dan entry level job opportunity maks tahun emg gajelas maunya apa Mau yg profesional bisa dijinakin dgn gaji rendah tpi gamau nerima gen z dan gamau ngajarin trs jahat ke younger coworker tpi nyalahin mental melempem\",\n \"Mental health Apa yang ada di pikiran kalian jika mendengar kata itu Untuk para Generasi Z mungkin sudah tidak asing lagi mendengar kata itu Sudah banyak orang yang menyinggung tentang mental health ini Namun kesadaran akan kesehatan mental di Indonesia masih sangat rendah\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"case_folding\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5336,\n \"samples\": [\n \"sebenernya gen z tuh kerja apa aja dijabanin asal wajar dan umr lu kalo bukan perusahaan yang bener udah kerjaan overload gaji autan terus lu bilang bersyukur lu sama aja menyuburkan perbudakan koncol\",\n \"diluar konteks ini lagian siapa lagi yang berani minta gaji tinggi selain gen z ya betah banget sama umr yang berapa lama ga naik naik itu padahal semuanya udah inflasi\",\n \"ternyata bener jg gen z klo kerja gaji kecil tu mikir hehe\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"convert_slang_word\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5333,\n \"samples\": [\n \"asmara jika orang ini semuanya dilantik jadi kabinet berapa anggaran gaji tukim honor spj ops bgm nasib milenial genz amp alfa yang akan dhadapkn dengan over demografis coba anggaran itu dialhkan untuk program pembsdm subsidibeasiswa demi indonesia agar tidak cemas\",\n \"essai penugasan raja brawijaya nama bintang anda hartono putra prodi ilmuadministrasibisnis mengatasi dan mengenal gangguan perubahan mental atau kesehatan jiwa dalam remaja generasi saja pada saat pandemi penulis bintang anda hartono\",\n \"ternyata benar juga gen saja kalo kerja gaji kecil itu mikir hehe\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 6
}
],
"source": [
"# convert slang word\n",
"slang_words = pd.read_csv('https://raw.githubusercontent.com/nasalsabila/kamus-alay/refs/heads/master/colloquial-indonesian-lexicon.csv')\n",
"slang_words_dict = dict(zip(slang_words['slang'], slang_words['formal']))\n",
"\n",
"# Fungsi untuk mengonversi slang word\n",
"def convert_slang_word(text):\n",
" return ' '.join([slang_words_dict.get(word, word) for word in text.split()])\n",
"\n",
"# Menerapkan fungsi ke kolom 'case_folding'\n",
"df['convert_slang_word'] = df['case_folding'].apply(convert_slang_word)\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "InaswBd6pbQD"
},
"source": [
"## Stop word"
]
},
{
"cell_type": "code",
"source": [
"!pip install Sastrawi"
],
"metadata": {
"id": "oifhA8okEExE",
"outputId": "16c4daf7-9ea7-4d4a-f12e-6c5a7ca186eb",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Collecting Sastrawi\n",
" Downloading Sastrawi-1.0.1-py2.py3-none-any.whl.metadata (909 bytes)\n",
"Downloading Sastrawi-1.0.1-py2.py3-none-any.whl (209 kB)\n",
"\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m209.7/209.7 kB\u001b[0m \u001b[31m3.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hInstalling collected packages: Sastrawi\n",
"Successfully installed Sastrawi-1.0.1\n"
]
}
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"id": "O7t8MApApbQD",
"outputId": "0d313294-1bf6-4329-c5ff-20ea3057f7b5",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 642
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" created_at \\\n",
"0 Mon Dec 30 07:08:54 +0000 2024 \n",
"1 Mon Dec 30 02:09:58 +0000 2024 \n",
"2 Sun Dec 29 02:45:40 +0000 2024 \n",
"3 Sat Dec 28 11:10:45 +0000 2024 \n",
"4 Sat Dec 28 07:30:00 +0000 2024 \n",
"\n",
" full_text keyword \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... finansial gen z \n",
"1 4 Langkah Sederhana Investasi untuk Gen Z Capa... finansial gen z \n",
"2 4 Langkah Mudah Mulai Investasi Buat Gen Z Men... finansial gen z \n",
"3 Assalamu alaikum Sahabat Syariah! Tantangan so... finansial gen z \n",
"4 Finansial yang sehat itu bukan cuma soal punya... finansial gen z \n",
"\n",
" cleanning_text \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 Langkah Sederhana Investasi untuk Gen Z Capai ... \n",
"2 Langkah Mudah Mulai Investasi Buat Gen Z Menuj... \n",
"3 Assalamu alaikum Sahabat Syariah Tantangan sos... \n",
"4 Finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" case_folding \\\n",
"0 kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 langkah sederhana investasi untuk gen z capai ... \n",
"2 langkah mudah mulai investasi buat gen z menuj... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" convert_slang_word \\\n",
"0 kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 langkah sederhana investasi untuk gen saja cap... \n",
"2 langkah mudah mulai investasi buat gen saja me... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" filtering \n",
"0 kemudahan berbelanja maupun mengakses produk p... \n",
"1 langkah sederhana investasi gen capai stabilit... \n",
"2 langkah mudah mulai investasi buat gen menuju ... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial sehat bukan cuma soal punya banyak u... "
],
"text/html": [
"\n",
" <div id=\"df-3b749406-4923-457c-9b05-5be3e0e12d1e\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>created_at</th>\n",
" <th>full_text</th>\n",
" <th>keyword</th>\n",
" <th>cleanning_text</th>\n",
" <th>case_folding</th>\n",
" <th>convert_slang_word</th>\n",
" <th>filtering</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Mon Dec 30 07:08:54 +0000 2024</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan berbelanja maupun mengakses produk p...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Mon Dec 30 02:09:58 +0000 2024</td>\n",
" <td>4 Langkah Sederhana Investasi untuk Gen Z Capa...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Sederhana Investasi untuk Gen Z Capai ...</td>\n",
" <td>langkah sederhana investasi untuk gen z capai ...</td>\n",
" <td>langkah sederhana investasi untuk gen saja cap...</td>\n",
" <td>langkah sederhana investasi gen capai stabilit...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sun Dec 29 02:45:40 +0000 2024</td>\n",
" <td>4 Langkah Mudah Mulai Investasi Buat Gen Z Men...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Mudah Mulai Investasi Buat Gen Z Menuj...</td>\n",
" <td>langkah mudah mulai investasi buat gen z menuj...</td>\n",
" <td>langkah mudah mulai investasi buat gen saja me...</td>\n",
" <td>langkah mudah mulai investasi buat gen menuju ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Sat Dec 28 11:10:45 +0000 2024</td>\n",
" <td>Assalamu alaikum Sahabat Syariah! Tantangan so...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Assalamu alaikum Sahabat Syariah Tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Sat Dec 28 07:30:00 +0000 2024</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial sehat bukan cuma soal punya banyak u...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-3b749406-4923-457c-9b05-5be3e0e12d1e')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-3b749406-4923-457c-9b05-5be3e0e12d1e button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-3b749406-4923-457c-9b05-5be3e0e12d1e');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-38ae3508-5376-4308-988a-ec006dedfb46\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-38ae3508-5376-4308-988a-ec006dedfb46')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-38ae3508-5376-4308-988a-ec006dedfb46 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "df",
"summary": "{\n \"name\": \"df\",\n \"rows\": 5387,\n \"fields\": [\n {\n \"column\": \"created_at\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 5229,\n \"samples\": [\n \"Sun Jul 09 21:01:42 +0000 2023\",\n \"Wed May 22 16:50:31 +0000 2024\",\n \"Sun Oct 11 09:39:07 +0000 2020\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"full_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5387,\n \"samples\": [\n \"@worksfess ni yg nanya pasti gen Z. kalo lo expect gaji 2 dijit ngaca dulu yaa please :). kalo masih anak kemaren sore struggle dulu nyet.\",\n \"Dari data dapat disimpulkan sebenarnya gen Z punya minat yang cukup besar menjadi PNS maupun korporat swasta. Berbeda dengan milenial cenderung lebih tinggi menjadi PNS. Hal ini karena milenial berorientasi pada gaji dan tunjangan untuk tabungan masa depan. #IDNTimesLife https://t.co/4wKYGFPnFC\",\n \"Khususnya di tengah masa pandemi seperti ini menurut survei banyak dari generasi z yang merasakan dampak dari pandemi ini kepada kesehatan mental mereka. Generasi yang lebih tua dianggap lebih tangguh karena dari segi finansial ataupun pola pikir yang sudah lebih dewasa.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"keyword\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"finansial gen z\",\n \"gaji gen z\",\n \"kesehatan mental generasi z\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"cleanning_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5339,\n \"samples\": [\n \"Gaji dan budaya tidak sesuai Gen Z lebih pilih resign Bener gak yah Terus apa dong yang harus dilakukan Swipe Yuk genZ millenials kerja resign faktor didyouknow fact fakta\",\n \"Gamau gen z tapi apa nuntut pengalaman dan entry level job opportunity maks tahun emg gajelas maunya apa Mau yg profesional bisa dijinakin dgn gaji rendah tpi gamau nerima gen z dan gamau ngajarin trs jahat ke younger coworker tpi nyalahin mental melempem\",\n \"Mental health Apa yang ada di pikiran kalian jika mendengar kata itu Untuk para Generasi Z mungkin sudah tidak asing lagi mendengar kata itu Sudah banyak orang yang menyinggung tentang mental health ini Namun kesadaran akan kesehatan mental di Indonesia masih sangat rendah\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"case_folding\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5336,\n \"samples\": [\n \"sebenernya gen z tuh kerja apa aja dijabanin asal wajar dan umr lu kalo bukan perusahaan yang bener udah kerjaan overload gaji autan terus lu bilang bersyukur lu sama aja menyuburkan perbudakan koncol\",\n \"diluar konteks ini lagian siapa lagi yang berani minta gaji tinggi selain gen z ya betah banget sama umr yang berapa lama ga naik naik itu padahal semuanya udah inflasi\",\n \"ternyata bener jg gen z klo kerja gaji kecil tu mikir hehe\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"convert_slang_word\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5333,\n \"samples\": [\n \"asmara jika orang ini semuanya dilantik jadi kabinet berapa anggaran gaji tukim honor spj ops bgm nasib milenial genz amp alfa yang akan dhadapkn dengan over demografis coba anggaran itu dialhkan untuk program pembsdm subsidibeasiswa demi indonesia agar tidak cemas\",\n \"essai penugasan raja brawijaya nama bintang anda hartono putra prodi ilmuadministrasibisnis mengatasi dan mengenal gangguan perubahan mental atau kesehatan jiwa dalam remaja generasi saja pada saat pandemi penulis bintang anda hartono\",\n \"ternyata benar juga gen saja kalo kerja gaji kecil itu mikir hehe\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"filtering\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5323,\n \"samples\": [\n \"boomers pensiun gen kali sih mempertanyakan gen suka kaburan judging tempat kerjanya toxic menuntut worklife balance padahal enggak balance selama menerima gaji indak suka angkat telepon padahal sih pemberi kerjanya enggak terbiasa chatting\",\n \"pentingnya kesehatan mental terutama generasi thread\",\n \"disadari memiliki pengaruh cukup signifikan kondisi mental health dimiliki beberapa survei menyebutkan generasi memiliki kesadaran lebih rendah mematuhi protokol kesehatandua sangat penting dimiliki\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 8
}
],
"source": [
"# Stop word\n",
"# from nltk.corpus import stopwords\n",
"\n",
"# def filtering(text):\n",
"# stop_words = set(stopwords.words('indonesian'))\n",
"# word_tokens = text.split()\n",
"# text = [word for word in word_tokens if word not in stop_words]\n",
"# text = ' '.join(text)\n",
"# return text\n",
"\n",
"# df['filtering'] = df['convert_slang_word'].apply(filtering)\n",
"# df\n",
"\n",
"# Stop word\n",
"\n",
"from Sastrawi.StopWordRemover.StopWordRemoverFactory import StopWordRemoverFactory\n",
"\n",
"def filtering(text):\n",
" factory = StopWordRemoverFactory()\n",
" stop_words = set(factory.get_stop_words())\n",
" word_tokens = text.split()\n",
" text = [word for word in word_tokens if word not in stop_words]\n",
" text = ' '.join(text)\n",
" return text\n",
"\n",
"df['filtering'] = df['convert_slang_word'].apply(filtering)\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2zX-C_01pbQD"
},
"source": [
"## tokenizing"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"id": "ZSynjnyCpbQE",
"outputId": "7b8a2e25-7ad3-444c-9cad-592e56263363",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stderr",
"text": [
"[nltk_data] Downloading package punkt to /root/nltk_data...\n",
"[nltk_data] Unzipping tokenizers/punkt.zip.\n",
"[nltk_data] Downloading package punkt_tab to /root/nltk_data...\n",
"[nltk_data] Unzipping tokenizers/punkt_tab.zip.\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"True"
]
},
"metadata": {},
"execution_count": 9
}
],
"source": [
"import nltk\n",
"nltk.download('punkt')\n",
"nltk.download('punkt_tab')"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"id": "0jT4u7sfpbQE",
"outputId": "42daddde-1a79-47c2-a3e3-53c5190e12e1",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 642
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" created_at \\\n",
"0 Mon Dec 30 07:08:54 +0000 2024 \n",
"1 Mon Dec 30 02:09:58 +0000 2024 \n",
"2 Sun Dec 29 02:45:40 +0000 2024 \n",
"3 Sat Dec 28 11:10:45 +0000 2024 \n",
"4 Sat Dec 28 07:30:00 +0000 2024 \n",
"\n",
" full_text keyword \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... finansial gen z \n",
"1 4 Langkah Sederhana Investasi untuk Gen Z Capa... finansial gen z \n",
"2 4 Langkah Mudah Mulai Investasi Buat Gen Z Men... finansial gen z \n",
"3 Assalamu alaikum Sahabat Syariah! Tantangan so... finansial gen z \n",
"4 Finansial yang sehat itu bukan cuma soal punya... finansial gen z \n",
"\n",
" cleanning_text \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 Langkah Sederhana Investasi untuk Gen Z Capai ... \n",
"2 Langkah Mudah Mulai Investasi Buat Gen Z Menuj... \n",
"3 Assalamu alaikum Sahabat Syariah Tantangan sos... \n",
"4 Finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" case_folding \\\n",
"0 kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 langkah sederhana investasi untuk gen z capai ... \n",
"2 langkah mudah mulai investasi buat gen z menuj... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" convert_slang_word \\\n",
"0 kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 langkah sederhana investasi untuk gen saja cap... \n",
"2 langkah mudah mulai investasi buat gen saja me... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" filtering \\\n",
"0 kemudahan berbelanja maupun mengakses produk p... \n",
"1 langkah sederhana investasi gen capai stabilit... \n",
"2 langkah mudah mulai investasi buat gen menuju ... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial sehat bukan cuma soal punya banyak u... \n",
"\n",
" tokenizing \n",
"0 [kemudahan, berbelanja, maupun, mengakses, pro... \n",
"1 [langkah, sederhana, investasi, gen, capai, st... \n",
"2 [langkah, mudah, mulai, investasi, buat, gen, ... \n",
"3 [assalamu, alaikum, sahabat, syariah, tantanga... \n",
"4 [finansial, sehat, bukan, cuma, soal, punya, b... "
],
"text/html": [
"\n",
" <div id=\"df-13e4f51b-9ca3-4a78-bc78-009ec2f8c38c\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>created_at</th>\n",
" <th>full_text</th>\n",
" <th>keyword</th>\n",
" <th>cleanning_text</th>\n",
" <th>case_folding</th>\n",
" <th>convert_slang_word</th>\n",
" <th>filtering</th>\n",
" <th>tokenizing</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Mon Dec 30 07:08:54 +0000 2024</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan berbelanja maupun mengakses produk p...</td>\n",
" <td>[kemudahan, berbelanja, maupun, mengakses, pro...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Mon Dec 30 02:09:58 +0000 2024</td>\n",
" <td>4 Langkah Sederhana Investasi untuk Gen Z Capa...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Sederhana Investasi untuk Gen Z Capai ...</td>\n",
" <td>langkah sederhana investasi untuk gen z capai ...</td>\n",
" <td>langkah sederhana investasi untuk gen saja cap...</td>\n",
" <td>langkah sederhana investasi gen capai stabilit...</td>\n",
" <td>[langkah, sederhana, investasi, gen, capai, st...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sun Dec 29 02:45:40 +0000 2024</td>\n",
" <td>4 Langkah Mudah Mulai Investasi Buat Gen Z Men...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Mudah Mulai Investasi Buat Gen Z Menuj...</td>\n",
" <td>langkah mudah mulai investasi buat gen z menuj...</td>\n",
" <td>langkah mudah mulai investasi buat gen saja me...</td>\n",
" <td>langkah mudah mulai investasi buat gen menuju ...</td>\n",
" <td>[langkah, mudah, mulai, investasi, buat, gen, ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Sat Dec 28 11:10:45 +0000 2024</td>\n",
" <td>Assalamu alaikum Sahabat Syariah! Tantangan so...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Assalamu alaikum Sahabat Syariah Tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" <td>[assalamu, alaikum, sahabat, syariah, tantanga...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Sat Dec 28 07:30:00 +0000 2024</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial sehat bukan cuma soal punya banyak u...</td>\n",
" <td>[finansial, sehat, bukan, cuma, soal, punya, b...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-13e4f51b-9ca3-4a78-bc78-009ec2f8c38c')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-13e4f51b-9ca3-4a78-bc78-009ec2f8c38c button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-13e4f51b-9ca3-4a78-bc78-009ec2f8c38c');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-dea4f2d6-dc79-43e0-b519-1051bafe6653\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-dea4f2d6-dc79-43e0-b519-1051bafe6653')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-dea4f2d6-dc79-43e0-b519-1051bafe6653 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "df",
"summary": "{\n \"name\": \"df\",\n \"rows\": 5387,\n \"fields\": [\n {\n \"column\": \"created_at\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 5229,\n \"samples\": [\n \"Sun Jul 09 21:01:42 +0000 2023\",\n \"Wed May 22 16:50:31 +0000 2024\",\n \"Sun Oct 11 09:39:07 +0000 2020\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"full_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5387,\n \"samples\": [\n \"@worksfess ni yg nanya pasti gen Z. kalo lo expect gaji 2 dijit ngaca dulu yaa please :). kalo masih anak kemaren sore struggle dulu nyet.\",\n \"Dari data dapat disimpulkan sebenarnya gen Z punya minat yang cukup besar menjadi PNS maupun korporat swasta. Berbeda dengan milenial cenderung lebih tinggi menjadi PNS. Hal ini karena milenial berorientasi pada gaji dan tunjangan untuk tabungan masa depan. #IDNTimesLife https://t.co/4wKYGFPnFC\",\n \"Khususnya di tengah masa pandemi seperti ini menurut survei banyak dari generasi z yang merasakan dampak dari pandemi ini kepada kesehatan mental mereka. Generasi yang lebih tua dianggap lebih tangguh karena dari segi finansial ataupun pola pikir yang sudah lebih dewasa.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"keyword\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"finansial gen z\",\n \"gaji gen z\",\n \"kesehatan mental generasi z\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"cleanning_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5339,\n \"samples\": [\n \"Gaji dan budaya tidak sesuai Gen Z lebih pilih resign Bener gak yah Terus apa dong yang harus dilakukan Swipe Yuk genZ millenials kerja resign faktor didyouknow fact fakta\",\n \"Gamau gen z tapi apa nuntut pengalaman dan entry level job opportunity maks tahun emg gajelas maunya apa Mau yg profesional bisa dijinakin dgn gaji rendah tpi gamau nerima gen z dan gamau ngajarin trs jahat ke younger coworker tpi nyalahin mental melempem\",\n \"Mental health Apa yang ada di pikiran kalian jika mendengar kata itu Untuk para Generasi Z mungkin sudah tidak asing lagi mendengar kata itu Sudah banyak orang yang menyinggung tentang mental health ini Namun kesadaran akan kesehatan mental di Indonesia masih sangat rendah\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"case_folding\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5336,\n \"samples\": [\n \"sebenernya gen z tuh kerja apa aja dijabanin asal wajar dan umr lu kalo bukan perusahaan yang bener udah kerjaan overload gaji autan terus lu bilang bersyukur lu sama aja menyuburkan perbudakan koncol\",\n \"diluar konteks ini lagian siapa lagi yang berani minta gaji tinggi selain gen z ya betah banget sama umr yang berapa lama ga naik naik itu padahal semuanya udah inflasi\",\n \"ternyata bener jg gen z klo kerja gaji kecil tu mikir hehe\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"convert_slang_word\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5333,\n \"samples\": [\n \"asmara jika orang ini semuanya dilantik jadi kabinet berapa anggaran gaji tukim honor spj ops bgm nasib milenial genz amp alfa yang akan dhadapkn dengan over demografis coba anggaran itu dialhkan untuk program pembsdm subsidibeasiswa demi indonesia agar tidak cemas\",\n \"essai penugasan raja brawijaya nama bintang anda hartono putra prodi ilmuadministrasibisnis mengatasi dan mengenal gangguan perubahan mental atau kesehatan jiwa dalam remaja generasi saja pada saat pandemi penulis bintang anda hartono\",\n \"ternyata benar juga gen saja kalo kerja gaji kecil itu mikir hehe\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"filtering\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5323,\n \"samples\": [\n \"boomers pensiun gen kali sih mempertanyakan gen suka kaburan judging tempat kerjanya toxic menuntut worklife balance padahal enggak balance selama menerima gaji indak suka angkat telepon padahal sih pemberi kerjanya enggak terbiasa chatting\",\n \"pentingnya kesehatan mental terutama generasi thread\",\n \"disadari memiliki pengaruh cukup signifikan kondisi mental health dimiliki beberapa survei menyebutkan generasi memiliki kesadaran lebih rendah mematuhi protokol kesehatandua sangat penting dimiliki\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tokenizing\",\n \"properties\": {\n \"dtype\": \"object\",\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 10
}
],
"source": [
"# tokenizing\n",
"from nltk.tokenize import word_tokenize\n",
"\n",
"def tokenizing(text):\n",
" text = word_tokenize(text)\n",
" return text\n",
"\n",
"df['tokenizing'] = df['filtering'].apply(tokenizing)\n",
"df.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rhdJgP7BpbQE"
},
"source": [
"## stemming"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"id": "OzGIEhUDpbQF",
"outputId": "950963f8-06ba-46c2-f7ae-5a5bc9f65555",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 677
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" created_at \\\n",
"0 Mon Dec 30 07:08:54 +0000 2024 \n",
"1 Mon Dec 30 02:09:58 +0000 2024 \n",
"2 Sun Dec 29 02:45:40 +0000 2024 \n",
"3 Sat Dec 28 11:10:45 +0000 2024 \n",
"4 Sat Dec 28 07:30:00 +0000 2024 \n",
"\n",
" full_text keyword \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... finansial gen z \n",
"1 4 Langkah Sederhana Investasi untuk Gen Z Capa... finansial gen z \n",
"2 4 Langkah Mudah Mulai Investasi Buat Gen Z Men... finansial gen z \n",
"3 Assalamu alaikum Sahabat Syariah! Tantangan so... finansial gen z \n",
"4 Finansial yang sehat itu bukan cuma soal punya... finansial gen z \n",
"\n",
" cleanning_text \\\n",
"0 Kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 Langkah Sederhana Investasi untuk Gen Z Capai ... \n",
"2 Langkah Mudah Mulai Investasi Buat Gen Z Menuj... \n",
"3 Assalamu alaikum Sahabat Syariah Tantangan sos... \n",
"4 Finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" case_folding \\\n",
"0 kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 langkah sederhana investasi untuk gen z capai ... \n",
"2 langkah mudah mulai investasi buat gen z menuj... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" convert_slang_word \\\n",
"0 kemudahan dalam berbelanja maupun mengakses pr... \n",
"1 langkah sederhana investasi untuk gen saja cap... \n",
"2 langkah mudah mulai investasi buat gen saja me... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial yang sehat itu bukan cuma soal punya... \n",
"\n",
" filtering \\\n",
"0 kemudahan berbelanja maupun mengakses produk p... \n",
"1 langkah sederhana investasi gen capai stabilit... \n",
"2 langkah mudah mulai investasi buat gen menuju ... \n",
"3 assalamu alaikum sahabat syariah tantangan sos... \n",
"4 finansial sehat bukan cuma soal punya banyak u... \n",
"\n",
" tokenizing \\\n",
"0 [kemudahan, berbelanja, maupun, mengakses, pro... \n",
"1 [langkah, sederhana, investasi, gen, capai, st... \n",
"2 [langkah, mudah, mulai, investasi, buat, gen, ... \n",
"3 [assalamu, alaikum, sahabat, syariah, tantanga... \n",
"4 [finansial, sehat, bukan, cuma, soal, punya, b... \n",
"\n",
" stemming \n",
"0 mudah belanja maupun akses produk pinjam kini ... \n",
"1 langkah sederhana investasi gen capai stabilit... \n",
"2 langkah mudah mulai investasi buat gen tuju fi... \n",
"3 assalamu alaikum sahabat syariah tantang sosia... \n",
"4 finansial sehat bukan cuma soal punya banyak u... "
],
"text/html": [
"\n",
" <div id=\"df-9617e45e-8dfd-47ad-b3bc-25e09286bcc0\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>created_at</th>\n",
" <th>full_text</th>\n",
" <th>keyword</th>\n",
" <th>cleanning_text</th>\n",
" <th>case_folding</th>\n",
" <th>convert_slang_word</th>\n",
" <th>filtering</th>\n",
" <th>tokenizing</th>\n",
" <th>stemming</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Mon Dec 30 07:08:54 +0000 2024</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan dalam berbelanja maupun mengakses pr...</td>\n",
" <td>kemudahan berbelanja maupun mengakses produk p...</td>\n",
" <td>[kemudahan, berbelanja, maupun, mengakses, pro...</td>\n",
" <td>mudah belanja maupun akses produk pinjam kini ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Mon Dec 30 02:09:58 +0000 2024</td>\n",
" <td>4 Langkah Sederhana Investasi untuk Gen Z Capa...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Sederhana Investasi untuk Gen Z Capai ...</td>\n",
" <td>langkah sederhana investasi untuk gen z capai ...</td>\n",
" <td>langkah sederhana investasi untuk gen saja cap...</td>\n",
" <td>langkah sederhana investasi gen capai stabilit...</td>\n",
" <td>[langkah, sederhana, investasi, gen, capai, st...</td>\n",
" <td>langkah sederhana investasi gen capai stabilit...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sun Dec 29 02:45:40 +0000 2024</td>\n",
" <td>4 Langkah Mudah Mulai Investasi Buat Gen Z Men...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Langkah Mudah Mulai Investasi Buat Gen Z Menuj...</td>\n",
" <td>langkah mudah mulai investasi buat gen z menuj...</td>\n",
" <td>langkah mudah mulai investasi buat gen saja me...</td>\n",
" <td>langkah mudah mulai investasi buat gen menuju ...</td>\n",
" <td>[langkah, mudah, mulai, investasi, buat, gen, ...</td>\n",
" <td>langkah mudah mulai investasi buat gen tuju fi...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Sat Dec 28 11:10:45 +0000 2024</td>\n",
" <td>Assalamu alaikum Sahabat Syariah! Tantangan so...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Assalamu alaikum Sahabat Syariah Tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" <td>assalamu alaikum sahabat syariah tantangan sos...</td>\n",
" <td>[assalamu, alaikum, sahabat, syariah, tantanga...</td>\n",
" <td>assalamu alaikum sahabat syariah tantang sosia...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Sat Dec 28 07:30:00 +0000 2024</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial gen z</td>\n",
" <td>Finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial yang sehat itu bukan cuma soal punya...</td>\n",
" <td>finansial sehat bukan cuma soal punya banyak u...</td>\n",
" <td>[finansial, sehat, bukan, cuma, soal, punya, b...</td>\n",
" <td>finansial sehat bukan cuma soal punya banyak u...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-9617e45e-8dfd-47ad-b3bc-25e09286bcc0')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-9617e45e-8dfd-47ad-b3bc-25e09286bcc0 button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-9617e45e-8dfd-47ad-b3bc-25e09286bcc0');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-60fdfdfb-fb48-48a9-838e-a1a1002340bf\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-60fdfdfb-fb48-48a9-838e-a1a1002340bf')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-60fdfdfb-fb48-48a9-838e-a1a1002340bf button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "df",
"summary": "{\n \"name\": \"df\",\n \"rows\": 5387,\n \"fields\": [\n {\n \"column\": \"created_at\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 5229,\n \"samples\": [\n \"Sun Jul 09 21:01:42 +0000 2023\",\n \"Wed May 22 16:50:31 +0000 2024\",\n \"Sun Oct 11 09:39:07 +0000 2020\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"full_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5387,\n \"samples\": [\n \"@worksfess ni yg nanya pasti gen Z. kalo lo expect gaji 2 dijit ngaca dulu yaa please :). kalo masih anak kemaren sore struggle dulu nyet.\",\n \"Dari data dapat disimpulkan sebenarnya gen Z punya minat yang cukup besar menjadi PNS maupun korporat swasta. Berbeda dengan milenial cenderung lebih tinggi menjadi PNS. Hal ini karena milenial berorientasi pada gaji dan tunjangan untuk tabungan masa depan. #IDNTimesLife https://t.co/4wKYGFPnFC\",\n \"Khususnya di tengah masa pandemi seperti ini menurut survei banyak dari generasi z yang merasakan dampak dari pandemi ini kepada kesehatan mental mereka. Generasi yang lebih tua dianggap lebih tangguh karena dari segi finansial ataupun pola pikir yang sudah lebih dewasa.\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"keyword\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"finansial gen z\",\n \"gaji gen z\",\n \"kesehatan mental generasi z\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"cleanning_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5339,\n \"samples\": [\n \"Gaji dan budaya tidak sesuai Gen Z lebih pilih resign Bener gak yah Terus apa dong yang harus dilakukan Swipe Yuk genZ millenials kerja resign faktor didyouknow fact fakta\",\n \"Gamau gen z tapi apa nuntut pengalaman dan entry level job opportunity maks tahun emg gajelas maunya apa Mau yg profesional bisa dijinakin dgn gaji rendah tpi gamau nerima gen z dan gamau ngajarin trs jahat ke younger coworker tpi nyalahin mental melempem\",\n \"Mental health Apa yang ada di pikiran kalian jika mendengar kata itu Untuk para Generasi Z mungkin sudah tidak asing lagi mendengar kata itu Sudah banyak orang yang menyinggung tentang mental health ini Namun kesadaran akan kesehatan mental di Indonesia masih sangat rendah\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"case_folding\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5336,\n \"samples\": [\n \"sebenernya gen z tuh kerja apa aja dijabanin asal wajar dan umr lu kalo bukan perusahaan yang bener udah kerjaan overload gaji autan terus lu bilang bersyukur lu sama aja menyuburkan perbudakan koncol\",\n \"diluar konteks ini lagian siapa lagi yang berani minta gaji tinggi selain gen z ya betah banget sama umr yang berapa lama ga naik naik itu padahal semuanya udah inflasi\",\n \"ternyata bener jg gen z klo kerja gaji kecil tu mikir hehe\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"convert_slang_word\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5333,\n \"samples\": [\n \"asmara jika orang ini semuanya dilantik jadi kabinet berapa anggaran gaji tukim honor spj ops bgm nasib milenial genz amp alfa yang akan dhadapkn dengan over demografis coba anggaran itu dialhkan untuk program pembsdm subsidibeasiswa demi indonesia agar tidak cemas\",\n \"essai penugasan raja brawijaya nama bintang anda hartono putra prodi ilmuadministrasibisnis mengatasi dan mengenal gangguan perubahan mental atau kesehatan jiwa dalam remaja generasi saja pada saat pandemi penulis bintang anda hartono\",\n \"ternyata benar juga gen saja kalo kerja gaji kecil itu mikir hehe\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"filtering\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5323,\n \"samples\": [\n \"boomers pensiun gen kali sih mempertanyakan gen suka kaburan judging tempat kerjanya toxic menuntut worklife balance padahal enggak balance selama menerima gaji indak suka angkat telepon padahal sih pemberi kerjanya enggak terbiasa chatting\",\n \"pentingnya kesehatan mental terutama generasi thread\",\n \"disadari memiliki pengaruh cukup signifikan kondisi mental health dimiliki beberapa survei menyebutkan generasi memiliki kesadaran lebih rendah mematuhi protokol kesehatandua sangat penting dimiliki\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"tokenizing\",\n \"properties\": {\n \"dtype\": \"object\",\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"stemming\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5323,\n \"samples\": [\n \"boomers pensiun gen kali sih tanya gen suka kabur judging tempat kerja toxic tuntut worklife balance padahal enggak balance lama terima gaji indak suka angkat telepon padahal sih beri kerja enggak biasa chatting\",\n \"penting sehat mental utama generasi thread\",\n \"sadar milik pengaruh cukup signifikan kondisi mental health milik beberapa survei sebut generasi milik sadar lebih rendah patuh protokol kesehatandua sangat penting milik\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 11
}
],
"source": [
"# stemming\n",
"from Sastrawi.Stemmer.StemmerFactory import StemmerFactory\n",
"\n",
"# create stemmer\n",
"factory = StemmerFactory()\n",
"stemmer = factory.create_stemmer()\n",
"\n",
"def stem_text(tokens):\n",
" text = ' '.join(tokens) # Join the tokens back into a single string\n",
" return stemmer.stem(text)\n",
"\n",
"df['stemming'] = df['tokenizing'].apply(stem_text)\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"id": "BfG2wbo2pbQF",
"outputId": "fe5f3922-2e2a-42ea-8d27-48dd4d985560",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 5387 entries, 0 to 5386\n",
"Data columns (total 9 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 created_at 5387 non-null object\n",
" 1 full_text 5387 non-null object\n",
" 2 keyword 5387 non-null object\n",
" 3 cleanning_text 5387 non-null object\n",
" 4 case_folding 5387 non-null object\n",
" 5 convert_slang_word 5387 non-null object\n",
" 6 filtering 5387 non-null object\n",
" 7 tokenizing 5387 non-null object\n",
" 8 stemming 5387 non-null object\n",
"dtypes: object(9)\n",
"memory usage: 378.9+ KB\n"
]
}
],
"source": [
"df.info()"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"id": "lrFlWml7pbQG"
},
"outputs": [],
"source": [
"df.drop(df.columns[[1, 3, 4, 5, 6, 7]], axis=1, inplace=True)\n",
"\n",
"# Rename column 'stemming' to 'full_text'\n",
"df.rename(columns={'stemming': 'full_text'}, inplace=True)\n",
"\n",
"df.to_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-clean.csv', index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kDCcxR4vpbQG"
},
"source": [
"# Pelabelan Data"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"id": "d30hAZZ7pbQG",
"outputId": "fb627f89-198e-48ec-8ace-2f2d9fb65737",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 293
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" created_at keyword \\\n",
"0 Mon Dec 30 07:08:54 +0000 2024 finansial gen z \n",
"1 Mon Dec 30 02:09:58 +0000 2024 finansial gen z \n",
"2 Sun Dec 29 02:45:40 +0000 2024 finansial gen z \n",
"3 Sat Dec 28 11:10:45 +0000 2024 finansial gen z \n",
"4 Sat Dec 28 07:30:00 +0000 2024 finansial gen z \n",
"\n",
" full_text \n",
"0 mudah belanja maupun akses produk pinjam kini ... \n",
"1 langkah sederhana investasi gen capai stabilit... \n",
"2 langkah mudah mulai investasi buat gen tuju fi... \n",
"3 assalamu alaikum sahabat syariah tantang sosia... \n",
"4 finansial sehat bukan cuma soal punya banyak u... "
],
"text/html": [
"\n",
" <div id=\"df-50603f99-07b3-41f4-877c-5567785ac3be\" class=\"colab-df-container\">\n",
" <div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>created_at</th>\n",
" <th>keyword</th>\n",
" <th>full_text</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Mon Dec 30 07:08:54 +0000 2024</td>\n",
" <td>finansial gen z</td>\n",
" <td>mudah belanja maupun akses produk pinjam kini ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Mon Dec 30 02:09:58 +0000 2024</td>\n",
" <td>finansial gen z</td>\n",
" <td>langkah sederhana investasi gen capai stabilit...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Sun Dec 29 02:45:40 +0000 2024</td>\n",
" <td>finansial gen z</td>\n",
" <td>langkah mudah mulai investasi buat gen tuju fi...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Sat Dec 28 11:10:45 +0000 2024</td>\n",
" <td>finansial gen z</td>\n",
" <td>assalamu alaikum sahabat syariah tantang sosia...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Sat Dec 28 07:30:00 +0000 2024</td>\n",
" <td>finansial gen z</td>\n",
" <td>finansial sehat bukan cuma soal punya banyak u...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>\n",
" <div class=\"colab-df-buttons\">\n",
"\n",
" <div class=\"colab-df-container\">\n",
" <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-50603f99-07b3-41f4-877c-5567785ac3be')\"\n",
" title=\"Convert this dataframe to an interactive table.\"\n",
" style=\"display:none;\">\n",
"\n",
" <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
" <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
" </svg>\n",
" </button>\n",
"\n",
" <style>\n",
" .colab-df-container {\n",
" display:flex;\n",
" gap: 12px;\n",
" }\n",
"\n",
" .colab-df-convert {\n",
" background-color: #E8F0FE;\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: #1967D2;\n",
" height: 32px;\n",
" padding: 0 0 0 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-convert:hover {\n",
" background-color: #E2EBFA;\n",
" box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: #174EA6;\n",
" }\n",
"\n",
" .colab-df-buttons div {\n",
" margin-bottom: 4px;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert {\n",
" background-color: #3B4455;\n",
" fill: #D2E3FC;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-convert:hover {\n",
" background-color: #434B5C;\n",
" box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
" filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
" fill: #FFFFFF;\n",
" }\n",
" </style>\n",
"\n",
" <script>\n",
" const buttonEl =\n",
" document.querySelector('#df-50603f99-07b3-41f4-877c-5567785ac3be button.colab-df-convert');\n",
" buttonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
"\n",
" async function convertToInteractive(key) {\n",
" const element = document.querySelector('#df-50603f99-07b3-41f4-877c-5567785ac3be');\n",
" const dataTable =\n",
" await google.colab.kernel.invokeFunction('convertToInteractive',\n",
" [key], {});\n",
" if (!dataTable) return;\n",
"\n",
" const docLinkHtml = 'Like what you see? Visit the ' +\n",
" '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
" + ' to learn more about interactive tables.';\n",
" element.innerHTML = '';\n",
" dataTable['output_type'] = 'display_data';\n",
" await google.colab.output.renderOutput(dataTable, element);\n",
" const docLink = document.createElement('div');\n",
" docLink.innerHTML = docLinkHtml;\n",
" element.appendChild(docLink);\n",
" }\n",
" </script>\n",
" </div>\n",
"\n",
"\n",
"<div id=\"df-45e17e67-531c-466d-a0d0-5bc50897cbb8\">\n",
" <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-45e17e67-531c-466d-a0d0-5bc50897cbb8')\"\n",
" title=\"Suggest charts\"\n",
" style=\"display:none;\">\n",
"\n",
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
" width=\"24px\">\n",
" <g>\n",
" <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
" </g>\n",
"</svg>\n",
" </button>\n",
"\n",
"<style>\n",
" .colab-df-quickchart {\n",
" --bg-color: #E8F0FE;\n",
" --fill-color: #1967D2;\n",
" --hover-bg-color: #E2EBFA;\n",
" --hover-fill-color: #174EA6;\n",
" --disabled-fill-color: #AAA;\n",
" --disabled-bg-color: #DDD;\n",
" }\n",
"\n",
" [theme=dark] .colab-df-quickchart {\n",
" --bg-color: #3B4455;\n",
" --fill-color: #D2E3FC;\n",
" --hover-bg-color: #434B5C;\n",
" --hover-fill-color: #FFFFFF;\n",
" --disabled-bg-color: #3B4455;\n",
" --disabled-fill-color: #666;\n",
" }\n",
"\n",
" .colab-df-quickchart {\n",
" background-color: var(--bg-color);\n",
" border: none;\n",
" border-radius: 50%;\n",
" cursor: pointer;\n",
" display: none;\n",
" fill: var(--fill-color);\n",
" height: 32px;\n",
" padding: 0;\n",
" width: 32px;\n",
" }\n",
"\n",
" .colab-df-quickchart:hover {\n",
" background-color: var(--hover-bg-color);\n",
" box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
" fill: var(--button-hover-fill-color);\n",
" }\n",
"\n",
" .colab-df-quickchart-complete:disabled,\n",
" .colab-df-quickchart-complete:disabled:hover {\n",
" background-color: var(--disabled-bg-color);\n",
" fill: var(--disabled-fill-color);\n",
" box-shadow: none;\n",
" }\n",
"\n",
" .colab-df-spinner {\n",
" border: 2px solid var(--fill-color);\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" animation:\n",
" spin 1s steps(1) infinite;\n",
" }\n",
"\n",
" @keyframes spin {\n",
" 0% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" border-left-color: var(--fill-color);\n",
" }\n",
" 20% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 30% {\n",
" border-color: transparent;\n",
" border-left-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 40% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-top-color: var(--fill-color);\n",
" }\n",
" 60% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" }\n",
" 80% {\n",
" border-color: transparent;\n",
" border-right-color: var(--fill-color);\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" 90% {\n",
" border-color: transparent;\n",
" border-bottom-color: var(--fill-color);\n",
" }\n",
" }\n",
"</style>\n",
"\n",
" <script>\n",
" async function quickchart(key) {\n",
" const quickchartButtonEl =\n",
" document.querySelector('#' + key + ' button');\n",
" quickchartButtonEl.disabled = true; // To prevent multiple clicks.\n",
" quickchartButtonEl.classList.add('colab-df-spinner');\n",
" try {\n",
" const charts = await google.colab.kernel.invokeFunction(\n",
" 'suggestCharts', [key], {});\n",
" } catch (error) {\n",
" console.error('Error during call to suggestCharts:', error);\n",
" }\n",
" quickchartButtonEl.classList.remove('colab-df-spinner');\n",
" quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
" }\n",
" (() => {\n",
" let quickchartButtonEl =\n",
" document.querySelector('#df-45e17e67-531c-466d-a0d0-5bc50897cbb8 button');\n",
" quickchartButtonEl.style.display =\n",
" google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
" })();\n",
" </script>\n",
"</div>\n",
"\n",
" </div>\n",
" </div>\n"
],
"application/vnd.google.colaboratory.intrinsic+json": {
"type": "dataframe",
"variable_name": "df",
"summary": "{\n \"name\": \"df\",\n \"rows\": 5387,\n \"fields\": [\n {\n \"column\": \"created_at\",\n \"properties\": {\n \"dtype\": \"object\",\n \"num_unique_values\": 5229,\n \"samples\": [\n \"Sun Jul 09 21:01:42 +0000 2023\",\n \"Wed May 22 16:50:31 +0000 2024\",\n \"Sun Oct 11 09:39:07 +0000 2020\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"keyword\",\n \"properties\": {\n \"dtype\": \"category\",\n \"num_unique_values\": 3,\n \"samples\": [\n \"finansial gen z\",\n \"gaji gen z\",\n \"kesehatan mental generasi z\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n },\n {\n \"column\": \"full_text\",\n \"properties\": {\n \"dtype\": \"string\",\n \"num_unique_values\": 5323,\n \"samples\": [\n \"boomers pensiun gen kali sih tanya gen suka kabur judging tempat kerja toxic tuntut worklife balance padahal enggak balance lama terima gaji indak suka angkat telepon padahal sih beri kerja enggak biasa chatting\",\n \"penting sehat mental utama generasi thread\",\n \"sadar milik pengaruh cukup signifikan kondisi mental health milik beberapa survei sebut generasi milik sadar lebih rendah patuh protokol kesehatandua sangat penting milik\"\n ],\n \"semantic_type\": \"\",\n \"description\": \"\"\n }\n }\n ]\n}"
}
},
"metadata": {},
"execution_count": 18
}
],
"source": [
"import pandas as pd\n",
"df = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-clean.csv')\n",
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"id": "uQyIeS0kpbQH",
"outputId": "2325a6d0-ef0b-43a4-90f7-de0981b6153a",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 5387 entries, 0 to 5386\n",
"Data columns (total 3 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 created_at 5387 non-null object\n",
" 1 keyword 5387 non-null object\n",
" 2 full_text 5387 non-null object\n",
"dtypes: object(3)\n",
"memory usage: 126.4+ KB\n"
]
}
],
"source": [
"df.info()"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"id": "t4aXN3ZppbQH"
},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"#unduh kamus inset lexicon positif dan negatif\n",
"positive_url = \"https://raw.githubusercontent.com/fajri91/InSet/master/positive.tsv\"\n",
"negative_url = \"https://raw.githubusercontent.com/fajri91/InSet/master/negative.tsv\"\n",
"\n",
"positive_lexicon = set(pd.read_csv(positive_url, sep='\\t', header=None)[0])\n",
"negative_lexicon = set(pd.read_csv(negative_url, sep='\\t', header=None)[0])\n",
"\n",
"#fungsi menghitung skor sentimen\n",
"def determine_sentiment(text):\n",
" if isinstance(text, str):\n",
" positive_count = sum(1 for word in text.split() if word in positive_lexicon)\n",
" negative_count = sum(1 for word in text.split() if word in negative_lexicon)\n",
" sentiment_score = positive_count - negative_count\n",
" if sentiment_score > 0:\n",
" sentiment = 'Positif'\n",
" elif sentiment_score < 0:\n",
" sentiment = 'Negatif'\n",
" else:\n",
" sentiment = 'Netral'\n",
" return sentiment_score, sentiment\n",
" return 0, \"netral\"\n",
"\n",
"#menerapkan perhitungan ke datasets\n",
"df[['score', 'label']] = df['full_text'].apply(lambda x: pd.Series(determine_sentiment(x)))\n",
"\n",
"df.to_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-label.csv', index=False)\n"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"id": "uPqiuk8wpbQI",
"outputId": "52fc2264-16bf-4659-b233-da3cdbb6c64f",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 209
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"label\n",
"Negatif 2955\n",
"Positif 1662\n",
"Netral 770\n",
"Name: count, dtype: int64"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>count</th>\n",
" </tr>\n",
" <tr>\n",
" <th>label</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Negatif</th>\n",
" <td>2955</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Positif</th>\n",
" <td>1662</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Netral</th>\n",
" <td>770</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div><br><label><b>dtype:</b> int64</label>"
]
},
"metadata": {},
"execution_count": 21
}
],
"source": [
"# Menghitung jumlah label\n",
"df['label'].value_counts()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "uXn4fFoSpbQI"
},
"source": [
"# Ekstraksi Fitur"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"id": "oGfljS6zpbQI",
"outputId": "df9c00cb-13d3-42dc-a8aa-0c3786976e5f",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 209
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"label\n",
"Negatif 2955\n",
"Positif 1662\n",
"Netral 770\n",
"Name: count, dtype: int64"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>count</th>\n",
" </tr>\n",
" <tr>\n",
" <th>label</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Negatif</th>\n",
" <td>2955</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Positif</th>\n",
" <td>1662</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Netral</th>\n",
" <td>770</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div><br><label><b>dtype:</b> int64</label>"
]
},
"metadata": {},
"execution_count": 22
}
],
"source": [
"import pandas as pd\n",
"#Membaca dataset yang sudah diberi label\n",
"df = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-label.csv')\n",
"df['label'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"id": "3kwG5OI_pbQR",
"outputId": "4423ae3a-f959-469a-916b-de7ee5344767",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[[0. 0. 0. ... 0. 0. 0.]]\n"
]
}
],
"source": [
"import pandas as pd\n",
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"\n",
"df = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-label.csv')\n",
"# Convert text to vectors using TF-IDF\n",
"tfidf_vectorizer = TfidfVectorizer()\n",
"x = tfidf_vectorizer.fit_transform(df['full_text'])\n",
"\n",
"tfidf = x.toarray()\n",
"print(tfidf[:1])\n",
"\n",
"# Convert the array to a DataFrame\n",
"tfidf_df = pd.DataFrame(tfidf)\n",
"\n",
"# Save the DataFrame to a CSV file\n",
"tfidf_df.to_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-tfidf.csv', index=False)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "TgDVRkE7pbQR"
},
"source": [
"# Data Balancing"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"id": "IeNHm1SzpbQS",
"outputId": "62469c77-ef1f-4a83-9d28-1991992c1825",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" 0 1 2 3 4 5 6 7 8 9 ... 11394 11395 11396 \\\n",
"0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 \n",
"1 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 \n",
"2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 \n",
"3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 \n",
"4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 \n",
"\n",
" 11397 11398 11399 11400 11401 11402 label \n",
"0 0.0 0.0 0.0 0.0 0.0 0.0 Positif \n",
"1 0.0 0.0 0.0 0.0 0.0 0.0 Positif \n",
"2 0.0 0.0 0.0 0.0 0.0 0.0 Positif \n",
"3 0.0 0.0 0.0 0.0 0.0 0.0 Positif \n",
"4 0.0 0.0 0.0 0.0 0.0 0.0 Positif \n",
"\n",
"[5 rows x 11404 columns]\n"
]
}
],
"source": [
"import pandas as pd\n",
"\n",
"tfidf_data = pd.read_csv(\"/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-tfidf.csv\")\n",
"labels_data = pd.read_csv(\"/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-label.csv\")\n",
"\n",
"# Drop rows with null values in labels_data\n",
"labels_data = labels_data.dropna(subset=['label'])\n",
"\n",
"# Merge the TF-IDF features with the labels\n",
"data = pd.concat([tfidf_data, labels_data['label']], axis=1)\n",
"data.to_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-balance.csv', index=False)\n",
"print(data.head())"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"id": "N9P8jdgUpbQS",
"outputId": "b968e82a-0c9b-4e4d-cf53-c82ea86e590a",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 209
}
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"label\n",
"Negatif 2955\n",
"Positif 1662\n",
"Netral 770\n",
"Name: count, dtype: int64"
],
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>count</th>\n",
" </tr>\n",
" <tr>\n",
" <th>label</th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>Negatif</th>\n",
" <td>2955</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Positif</th>\n",
" <td>1662</td>\n",
" </tr>\n",
" <tr>\n",
" <th>Netral</th>\n",
" <td>770</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div><br><label><b>dtype:</b> int64</label>"
]
},
"metadata": {},
"execution_count": 26
}
],
"source": [
"df_combined = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-balance.csv')\n",
"df['label'].value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"id": "HoW2DWLcpbQT",
"outputId": "658d3b98-b33a-4695-8308-12aaef02abb2",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Jumlah kelas sebelum SMOTE:\n",
"label\n",
"Negatif 2955\n",
"Positif 1662\n",
"Netral 770\n",
"Name: count, dtype: int64\n",
"\n",
"Jumlah kelas setelah SMOTE:\n",
"label\n",
"Positif 2955\n",
"Negatif 2955\n",
"Netral 2955\n",
"Name: count, dtype: int64\n"
]
}
],
"source": [
"# Import library yang diperlukan\n",
"import pandas as pd\n",
"from imblearn.over_sampling import SMOTE\n",
"\n",
"# Memisahkan fitur dan label\n",
"X = df_combined.drop(columns=['label']) # Menghapus kolom label\n",
"y = df_combined['label'] # Mengambil kolom label\n",
"\n",
"# Menggunakan SMOTE untuk melakukan data balancing\n",
"smote = SMOTE(random_state=42)\n",
"X_resampled, y_resampled = smote.fit_resample(X, y)\n",
"\n",
"# Menampilkan jumlah kelas setelah balancing\n",
"print(\"Jumlah kelas sebelum SMOTE:\")\n",
"print(y.value_counts())\n",
"print(\"\\nJumlah kelas setelah SMOTE:\")\n",
"print(y_resampled.value_counts())\n",
"\n",
"# Menyimpan dataset yang sudah di-balance ke file CSV\n",
"balanced_df = pd.concat([pd.DataFrame(X_resampled, columns=X.columns), pd.DataFrame(y_resampled, columns=['label'])], axis=1)\n",
"balanced_df.to_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-balanced.csv', index=False)"
]
},
{
"cell_type": "markdown",
"source": [
"# Modeling"
],
"metadata": {
"id": "3c0_ju9YyBlw"
}
},
{
"cell_type": "markdown",
"source": [
"## Support Vector Machine"
],
"metadata": {
"id": "T-suo_4bzVYB"
}
},
{
"cell_type": "code",
"source": [
"# Import library yang diperlukan\n",
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split, cross_val_score\n",
"from sklearn.svm import SVC\n",
"from sklearn.metrics import classification_report, confusion_matrix\n",
"\n",
"# Membaca dataset yang sudah di-balance\n",
"df_balanced = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-balanced.csv')\n",
"\n",
"# Memisahkan fitur dan label\n",
"X = df_balanced.drop(columns=['label']) # Menghapus kolom label\n",
"y = df_balanced['label'] # Mengambil kolom label\n",
"\n",
"# Membagi dataset menjadi data latih (80%) dan data uji 20%)\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n",
"\n",
"# Membuat model SVM\n",
"svm_model = SVC(kernel='linear', random_state=42) # Anda bisa mengganti kernel sesuai kebutuhan\n",
"svm_model.fit(X_train, y_train)\n",
"\n",
"# Melakukan prediksi pada data uji\n",
"y_pred = svm_model.predict(X_test)\n",
"\n",
"# Menampilkan hasil evaluasi\n",
"print(\"Confusion Matrix:\")\n",
"print(confusion_matrix(y_test, y_pred))\n",
"print(\"\\nClassification Report:\")\n",
"print(classification_report(y_test, y_pred))\n",
"\n",
"# Evaluasi model menggunakan cross-validation\n",
"cv_scores = cross_val_score(svm_model, X, y, cv=5) # Menggunakan 5-fold cross-validation\n",
"\n",
"# Menampilkan hasil cross-validation\n",
"print(\"\\nCross-Validation Scores:\")\n",
"print(cv_scores)\n",
"print(f\"Mean Cross-Validation Score: {cv_scores.mean():.4f}\")\n",
"print(f\"Standard Deviation of Cross-Validation Scores: {cv_scores.std():.4f}\")\n"
],
"metadata": {
"id": "noJ-pc-5yG7W",
"outputId": "7bdd9de6-0571-457b-ffe2-9ec1cd56c351",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"execution_count": 28,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Confusion Matrix:\n",
"[[487 85 19]\n",
" [ 16 561 14]\n",
" [ 15 35 541]]\n",
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" Negatif 0.94 0.82 0.88 591\n",
" Netral 0.82 0.95 0.88 591\n",
" Positif 0.94 0.92 0.93 591\n",
"\n",
" accuracy 0.90 1773\n",
" macro avg 0.90 0.90 0.90 1773\n",
"weighted avg 0.90 0.90 0.90 1773\n",
"\n",
"\n",
"Cross-Validation Scores:\n",
"[0.79526227 0.83981951 0.83417936 0.93175409 0.94585448]\n",
"Mean Cross-Validation Score: 0.8694\n",
"Standard Deviation of Cross-Validation Scores: 0.0589\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"# Generate confusion matrix\n",
"conf_matrix = confusion_matrix(y_test, y_pred)\n",
"\n",
"# Visualization\n",
"plt.figure(figsize=(12, 6))\n",
"\n",
"# Subplot for Confusion Matrix\n",
"plt.subplot(1, 2, 1)\n",
"sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', cbar=False)\n",
"plt.title('Confusion Matrix')\n",
"plt.xlabel('Predicted')\n",
"plt.ylabel('True')\n",
"\n",
"# Subplot for Cross-Validation Scores\n",
"plt.subplot(1, 2, 2)\n",
"sns.boxplot(data=cv_scores, orient='w')\n",
"plt.title('Cross-Validation Scores')\n",
"plt.xlabel('Score')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
],
"metadata": {
"id": "SSMxyyBSzc6S",
"outputId": "f26150c0-82a2-4c5e-ebd6-0509ad7144d2",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 349
}
},
"execution_count": 29,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1200x600 with 2 Axes>"
],
"image/png": "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vgcOHNAjjzyip59+WpGRkZo9e7b69Omj4OBg1a1bV926dVOJEiU0ePBg9ejRQx06dJCnp2eh6t+1a5cefPBB3XPPPRo/frxcXV114MAB/fTTT9c877vvvtMDDzygKlWqaOzYsbpw4YKmTp2q0NBQbd26NVcg9thjj6ly5cqKjY3V1q1b9Z///EdlypTRG2+8UaA6u3XrpgEDBmjx4sV66qmnJF252czvk85Dhw5p6dKlevTRR1W5cmWlpqZq5syZCgsL0+7du1WuXDnVrl1b48eP1+jRo9W/f3+1atVKkmz+LM+cOaMHHnhAjz/+uJ544gn5+/vnWd+7776rNWvWKDIyUhs3bpSTk5Nmzpypb7/9VvPnz1e5cuUKNE8AAOylsPc00pUPqD777DNFR0fL19fXGqS0atVK3t7eeuWVV1SsWDHNnDlTbdq00bp16xQSEiLpygdXsbGx6tu3r5o1a6aMjAxt2bJFW7du1X333SdJevjhh7Vr1y4999xzCgoK0qlTp7R69WolJyfn+eGbJFWuXFktWrTQZ599pnfeeUdOTk7WY1eDqqsfaM2dO1eenp6KiYmRp6en1qxZo9GjRysjI0NvvfVWoX5+O3fuVPv27eXn56exY8fq8uXLGjNmTJ73DjNmzFDdunX10EMPydnZWV999ZUGDhwoi8WiQYMGSbqy8ui5556Tp6enRowYIUn53odcnUtUVJSaNm2q2NhYpaam6t1339VPP/2kbdu22ayqz8nJUUREhEJCQvT222/ru+++0+TJk1W1alU9++yz+V7j6oehn3/+uR599FEVL148377nzp1Tq1attGfPHj311FNq3Lix0tLStGzZMh07dky+vr66cOGC2rRpowMHDig6OlqVK1fW559/rj59+ujs2bM2Iah0Jcy7ePGi+vfvL1dXV5UqVUq7du1SaGioypcvr6FDh8rDw0OfffaZunTpokWLFqlr166SCvb7BtwxDAB3hfT0dEOS0blz5wL13759uyHJ6Nu3r037kCFDDEnGmjVrrG2VKlUyJBk//PCDte3UqVOGq6ur8dJLL1nbDh8+bEgy3nrrLZsxIyMjjUqVKuWqYcyYMcbf/5p65513DEnG6dOn86376jXmzJljbWvYsKFRpkwZ48yZM9a2HTt2GI6Ojkbv3r1zXe+pp56yGbNr165G6dKl873m3+fh4eFh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efNr9q1UqZIsFov2799v/QRIuvL1umfPnrVuHlkUSpYsafNNdVfldaPg6Oiodu3aqV27doqLi9OkSZM0YsQIff/99woPD89zHpK0b9++XMf27t0rX19feXh43Pwk8tCzZ0/Nnj1bjo6ONp/G/dMXX3yhtm3b6sMPP7RpP3v2rHx9fa3vCxoQFkRmZqaioqJUp04dtWjRQm+++aa6du1q/YY/AABuZ4W5p8mPn5+fihcvnu89gqOjowIDA61tpUqVUlRUlKKionTu3Dm1bt1aY8eOVd++fa19qlatqpdeekkvvfSS9u/fr4YNG2ry5Mn6+OOP9corr1hXNkn/W4ktSQ899JC8vLy0YMECFStWTH/++afNo3tr167VmTNntHjxYrVu3drafvjw4Ruat7u7e56Phv3zZ/HVV18pKytLy5Yts1lJ/v333+c6t6D3KX+/N7v33ntzXb8o7zHz06RJE61bt04nT55UpUqVVLVq1euGnJUqVdKvv/4qi8Vis1rq6qOT16v76iOixYoVy/Oe9Z8K8vsG3AlYKQXcRV555RV5eHiob9++Sk1NzXX84MGDevfddyVdefxMuvJtKn8XFxcn6cpz/0WlatWqSk9Pt1mWfPLkyVzf8Hd1mfvfNWzYUJKUlZWV59hly5ZVw4YNNW/ePJvg67ffftO3335rneet0LZtW02YMEHvv/++AgIC8u3n5OSUaxXW559/nutrka+GZ3kFeIX16quvKjk5WfPmzVNcXJyCgoIUGRmZ788RAIDbSWHuafLj5OSk9u3b68svv9Tvv/9ubU9NTdWCBQvUsmVL66OCZ86csTnX09NT1apVs/67ef78eeujd1dVrVpVXl5e1j516tRReHi49RUcHGzt6+7urq5du2rFihWaMWOGPDw81LlzZ5taJdtV29nZ2Zo+ffo155jfvCMiIrR06VIlJydb2/fs2aNVq1bl6vvP66anp2vOnDm5xvXw8CjQPUqTJk1UpkwZxcfH29x3fPPNN9qzZ0+R3WOmpKRo9+7dudqzs7OVkJBgs03Fww8/rB07duS695T+N/cOHTooJSVFCxcutB67fPmypk6dKk9PT4WFhV2znjJlyqhNmzaaOXOmTp48mev46dOnrf99vd834E7CSingLlK1alUtWLBA3bt3V+3atdW7d2/Vq1dP2dnZ2rBhg/VrbSWpQYMGioyM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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"import joblib\n",
"from sklearn.metrics import classification_report\n",
"\n",
"# Menampilkan hasil evaluasi\n",
"class_report = classification_report(y_test, y_pred, output_dict=True) # Get report as dict\n",
"\n",
"# Save the model\n",
"with open('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/HASIL-RISET/model-svm.pkl', 'wb') as file:\n",
" joblib.dump(svm_model, file)\n",
"\n",
"# Save evaluation results\n",
"results = {\n",
" 'Confusion Matrix': [conf_matrix.flatten()], # Flatten for easier saving\n",
" 'Classification Report': [class_report],\n",
" 'Cross-Validation Scores': [cv_scores.tolist()],\n",
" 'Mean CV Score': [cv_scores.mean()],\n",
" 'Std Dev CV Score': [cv_scores.std()]\n",
"}\n",
"\n",
"results_df = pd.DataFrame(results)\n",
"results_df.to_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/HASIL-RISET/evaluation_results_SVM.csv', index=False) # Save results to CSV"
],
"metadata": {
"id": "AEy8VwJezgbZ"
},
"execution_count": 30,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## Naive Bayes"
],
"metadata": {
"id": "Z-GsSbYN0V90"
}
},
{
"cell_type": "code",
"source": [
"# Import library yang diperlukan\n",
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split, cross_val_score\n",
"from sklearn.naive_bayes import GaussianNB\n",
"from sklearn.metrics import classification_report, confusion_matrix\n",
"\n",
"# Membaca dataset yang sudah di-balance\n",
"df_balanced = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-balanced.csv')\n",
"\n",
"# Memisahkan fitur dan label\n",
"X = df_balanced.drop(columns=['label']) # Menghapus kolom label\n",
"y = df_balanced['label'] # Mengambil kolom label\n",
"\n",
"# Membagi dataset menjadi data latih (80%) dan data uji 20%)\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n",
"\n",
"# Membuat model Naive Bayes\n",
"nb_model = GaussianNB() # Model Naive Bayes\n",
"nb_model.fit(X_train, y_train)\n",
"\n",
"# Melakukan prediksi pada data uji\n",
"y_pred = nb_model.predict(X_test)\n",
"\n",
"# Menampilkan hasil evaluasi\n",
"print(\"Confusion Matrix:\")\n",
"print(confusion_matrix(y_test, y_pred))\n",
"print(\"\\nClassification Report:\")\n",
"print(classification_report(y_test, y_pred))\n",
"\n",
"# Evaluasi model menggunakan cross-validation\n",
"cv_scores = cross_val_score(nb_model, X, y, cv=5) # Menggunakan 5-fold cross-validation\n",
"\n",
"# Menampilkan hasil cross-validation\n",
"print(\"\\nCross-Validation Scores:\")\n",
"print(cv_scores)\n",
"print(f\"Mean Cross-Validation Score: {cv_scores.mean():.4f}\")\n",
"print(f\"Standard Deviation of Cross-Validation Scores: {cv_scores.std():.4f}\")"
],
"metadata": {
"id": "rK3bzFsp0cM8",
"outputId": "4f68a956-53e9-459c-ebfb-28df22028f65",
"colab": {
"base_uri": "https://localhost:8080/"
}
},
"execution_count": 31,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Confusion Matrix:\n",
"[[226 181 184]\n",
" [ 3 588 0]\n",
" [ 52 84 455]]\n",
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" Negatif 0.80 0.38 0.52 591\n",
" Netral 0.69 0.99 0.81 591\n",
" Positif 0.71 0.77 0.74 591\n",
"\n",
" accuracy 0.72 1773\n",
" macro avg 0.74 0.72 0.69 1773\n",
"weighted avg 0.74 0.72 0.69 1773\n",
"\n",
"\n",
"Cross-Validation Scores:\n",
"[0.68640722 0.69204738 0.69543147 0.74619289 0.75521715]\n",
"Mean Cross-Validation Score: 0.7151\n",
"Standard Deviation of Cross-Validation Scores: 0.0294\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"# Generate confusion matrix\n",
"conf_matrix = confusion_matrix(y_test, y_pred)\n",
"\n",
"# Visualization\n",
"plt.figure(figsize=(12, 6))\n",
"\n",
"# Subplot for Confusion Matrix\n",
"plt.subplot(1, 2, 1)\n",
"sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', cbar=False)\n",
"plt.title('Confusion Matrix')\n",
"plt.xlabel('Predicted')\n",
"plt.ylabel('True')\n",
"\n",
"# Subplot for Cross-Validation Scores\n",
"plt.subplot(1, 2, 2)\n",
"sns.boxplot(data=cv_scores, orient='w')\n",
"plt.title('Cross-Validation Scores')\n",
"plt.xlabel('Score')\n",
"plt.ylabel('CV Fold')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
],
"metadata": {
"id": "QNnCek9g0pYW",
"outputId": "eb6d5a26-6c72-4fd8-f182-5c351e4c96ce",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 349
}
},
"execution_count": 32,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1200x600 with 2 Axes>"
],
"image/png": "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Qw+pb9++6t27t2bOnKk+ffqoYcOGql27th544AGVLFlSQ4YMUY8ePXTPPffI29v7iurfvn277r33XtWrV09jx46Vm5ub9u7dq+++++6Sx33zzTfq0KGDqlSpotGjRysrK0vvvPOOmjdvrs2bN+cJxLp27arKlSsrPj5emzdv1vvvv6+yZctq4sSJharzgQce0OOPP67Fixfrsccek3ThIrKg32Du379fn3/+ubp06aLKlSsrJSVF06dPV0REhHbs2KHy5curVq1aGjt2rEaOHKkBAwaoZcuWkmT3d3n8+HF16NBB3bt3V8+ePRUYGJhvfW+99ZZWr16t3r17a8OGDXJ2dtb06dO1cuVKffjhhypfvnyh5gkAQHF3pdc+0oVfZH3yySeKjY1VQECALUhp2bKlfH199dxzz6lEiRKaPn26WrdurXXr1qlJkyaSLvyCKz4+Xv369VPjxo2VkZGhn3/+WZs3b9bdd98tSXrwwQe1fft2PfXUUwoNDdWxY8e0atUqHTp0KN9f0klS5cqV1axZM33yySd688035ezsbNt3Mai6+Iuv2bNny9vbW3FxcfL29tbq1as1cuRIZWRk6LXXXrui9++3335Tu3btVKZMGY0ePVrnz5/XqFGj8r3GmDZtmmrXrq1OnTrJxcVFX375pZ588klZrVYNGjRI0oU7j5566il5e3vrxRdflKQCr1cuziUmJkZ33HGH4uPjlZKSorfeekvfffedfvnlF7u773NzcxUVFaUmTZro9ddf1zfffKM33nhDVatW1RNPPFHgOS7+0nThwoXq0qWLPD09C+x7+vRptWzZUjt37tRjjz2mBg0aKC0tTUuWLNGff/6pgIAAZWVlqXXr1tq7d69iY2NVuXJlLVy4UH369NGpU6fsQlDpQph39uxZDRgwQG5ubvL399f27dvVvHlzVahQQS+88IK8vLz0ySefKDo6WosWLdL9998vqXCfN+CGZAC46aSnpxuSjM6dOxeq/5YtWwxJRr9+/ezahw4dakgyVq9ebWsLCQkxJBn//e9/bW3Hjh0z3NzcjGeffdbWduDAAUOS8dprr9mN2bt3byMkJCRPDaNGjTL++U/Sm2++aUgyUlNTC6z74jlmzZpla6tfv75RtmxZ4/jx47a2rVu3Gk5OTkavXr3ynO+xxx6zG/P+++83SpcuXeA5/zkPLy8vwzAM46GHHjLatm1rGIZh5ObmGkFBQcaYMWPyfQ/Onj1r5Obm5pmHm5ubMXbsWFvbTz/9lGduF0VERBiSjISEhHz3RURE2LWtWLHCkGSMHz/e2L9/v+Ht7W1ER0dfdo4AANworvTaxzAMQ5Lh5ORkbN++3a49OjracHV1Nfbt22drO3LkiOHj42O0atXK1hYeHm507NixwPFPnjyZ77VQYUyZMsWQZKxYscLWlpuba1SoUMFo2rSpre3MmTN5jh04cKDh6elpnD171taW3/WXJGPUqFG219HR0Ya7u7vxxx9/2Np27NhhODs7G//+38b8zhsVFWVUqVLFrq127dp5rksMwzDWrFljSDLWrFljGIZh5OTkGGXLljXq1KljZGVl2fp99dVXhiRj5MiRdnORZHfdZBiGcfvttxsNGzbMc65/69WrlyHJKFWqlHH//fcbr7/+urFz5848/UaOHGlIMhYvXpxnn9VqNQzDMCZPnmxIMubOnWvbl5OTYzRt2tTw9vY2MjIyDMP43zWrr6+vcezYMbux2rZta9StW9fu78tqtRrNmjUzbrvtNlvb5T5vwI2Kx/eAm1BGRoYkycfHp1D9ly1bJkl5vsXl2WeflaQ86y+EhYXZ7t6RpDJlyqhGjRrav3//Vdf8bxd/G/bFF1/IarUW6pijR49qy5Yt6tOnj/z9/W3t9erV0913322b5z89/vjjdq9btmyp48eP297Dwnj44Ye1du1aJScna/Xq1UpOTs730T3pwjpUTk4X/unNzc3V8ePHbY8mbt68udDndHNzU0xMTKH6tmvXTgMHDtTYsWP1wAMPyN3dvcDb8QEAuBFd6bXPRREREQoLC7O9zs3N1cqVKxUdHa0qVarY2suVK6eHH35Y69evt52rZMmS2r59u/bs2ZPv2B4eHnJ1ddXatWt18uTJK6qrW7duKlGihN0jfOvWrdNff/1le3Tv4jku+vvvv5WWlqaWLVvqzJkz+v333wt9vtzcXK1YsULR0dGqVKmSrb1WrVqKiorKd24XpaenKy0tTREREdq/f7/S09MLfd6Lfv75Zx07dkxPPvmk3VpTHTt2VM2aNfNdCyy/a7jCXIvOmjVL7777ripXrqzPPvtMQ4cOVa1atdS2bVu7RwUXLVqk8PBw251K/3RxyYlly5YpKChIPXr0sO0rUaKEBg8erNOnT2vdunV2xz344IMqU6aM7fWJEye0evVqde3a1fb3l5aWpuPHjysqKkp79uyx1XS5zxtwoyKUAm5Cvr6+ki5cnBTGH3/8IScnJ1WrVs2uPSgoSCVLltQff/xh1/7Pi5WLSpUqdcUXXJfSrVs3NW/eXP369VNgYKC6d++uTz755JIB1cU6a9SokWdfrVq1lJaWpszMTLv2f8+lVKlSknRFc7nnnnvk4+OjBQsW6KOPPtIdd9yR5728yGq16s0339Rtt90mNzc3BQQEqEyZMvr111+v6CKuQoUKV7Qw5uuvvy5/f39t2bJFb7/9dp41EwAAuJFd6bXPRZUrV7Z7nZqaqjNnzhR4LWG1WnX48GFJ0tixY3Xq1ClVr15ddevW1bBhw/Trr7/a+ru5uWnixIn6+uuvFRgYqFatWunVV19VcnKyrU96erqSk5Nt24kTJyRJpUuXVlRUlD777DPbN/nOmzdPLi4udl+usn37dt1///3y8/OTr6+vypQpY/tWviu5rkhNTVVWVpZuu+22PPvyey++++47RUZG2tbvLFOmjG19y6sJpS51DVezZs0816Lu7u524Y5U+GtRJycnDRo0SJs2bVJaWpq++OILdejQQatXr1b37t1t/fbt26c6depctu7bbrvN9gvHi2rVqmU3r4v+/Xnbu3evDMPQiBEjVKZMGbtt1KhRki6sWSVd/vMG3KgIpYCbkK+vr8qXL69t27Zd0XH/Xmi8IP9c2+CfDMO46nP8e2FKDw8P/fe//9U333yjRx99VL/++qu6deumu+++u1CLdxbWtczlIjc3Nz3wwAOaM2eOPvvsswLvkpKkl19+WXFxcWrVqpXmzp2rFStWaNWqVapdu3ah7wiT7H9DWRi//PKL7aLmt99+u6JjAQAo7q722udKf57+U6tWrbRv3z7NnDlTderU0fvvv68GDRro/ffft/V55plntHv3bsXHx8vd3V0jRoxQrVq19Msvv0iSnn76aZUrV862PfDAA7Zje/bsqYyMDH311VfKycnRokWLbGs+SRcW4Y6IiNDWrVs1duxYffnll1q1apVtXcwrua64Evv27VPbtm2VlpamSZMmaenSpVq1apWGDBlyXc/7TwVdv12p0qVLq1OnTlq2bJkiIiK0fv36PEFSUfr35+3iezV06FCtWrUq3+3iLzoL83kDbkQsdA7cpO69917NmDFDGzZsUNOmTS/ZNyQkRFarVXv27LH9Zke68LW5p06dsi0KWRRKlSpl9011F+V3AeDk5KS2bduqbdu2mjRpkl5++WW9+OKLWrNmjSIjI/OdhyTt2rUrz77ff/9dAQEB8vLyuvZJ5OPhhx/WzJkz5eTkZPdbtn/79NNP1aZNGyUmJtq1nzp1SgEBAbbXhQ0ICyMzM1MxMTEKCwtTs2bN9Oqrr+r++++3fcMfAAA3gyu59ilImTJl5OnpWeC1hJOTk4KDg21t/v7+iomJUUxMjE6fPq1WrVpp9OjR6tevn61P1apV9eyzz+rZZ5/Vnj17VL9+fb3xxhuaO3eunnvuOdudTdL/7tiWpE6dOsnHx0fz5s1TiRIldPLkSbtH99auXavjx49r8eLFatWqla39wIEDVzVvDw+PfB8N+/d78eWXXyo7O1tLliyxu+N8zZo1eY4t7PXMP6/h7rrrrjznL8pr0YI0atRI69at09GjRxUSEqKqVateNuQMCQnRr7/+KqvVane31MVHJy9X98VHREuUKJHvte2/FebzBtxouFMKuEk999xz8vLyUr9+/ZSSkpJn/759+/TWW29JuvD4mXThW1L+adKkSZIuPM9fVKpWrar09HS7242PHj2a5xv+Lt6+/k/169eXJGVnZ+c7drly5VS/fn3NmTPHLvjatm2bVq5caZvn9dCmTRuNGzdO7777roKCggrs5+zsnOcurIULF+b5uuOL4Vl+Ad6Vev7553Xo0CHNmTNHkyZNUmhoqHr37l3g+wgAwI3oSq59CuLs7Kx27drpiy++0MGDB23tKSkpmjdvnlq0aGF7VPD48eN2x3p7e6tatWq2n69nzpyxPXp3UdWqVeXj42PrExYWpsjISNvWsGFDW18PDw/df//9WrZsmaZNmyYvLy917tzZrlbJ/u7unJwcTZ069ZJzLGjeUVFR+vzzz3Xo0CFb+86dO7VixYo8ff993vT0dM2aNSvPuF5eXoW6lmnUqJHKli2rhIQEu+uTr7/+Wjt37iyya9Hk5GTt2LEjT3tOTo6SkpLslrN48MEHtXXr1jzXqNL/5n7PPfcoOTlZCxYssO07f/683nnnHXl7eysiIuKS9ZQtW1atW7fW9OnTdfTo0Tz7U1NTbX++3OcNuFFxpxRwk6patarmzZunbt26qVatWurVq5fq1KmjnJwcff/997avq5Wk8PBw9e7dWzNmzLDdCr5x40bNmTNH0dHRatOmTZHV1b17dz3//PO6//77NXjwYJ05c0bTpk1T9erV7Rb6Hjt2rP773/+qY8eOCgkJ0bFjxzR16lRVrFhRLVq0KHD81157TR06dFDTpk3Vt29fZWVl6Z133pGfn59Gjx5dZPP4NycnJ7300kuX7Xfvvfdq7NixiomJUbNmzfTbb7/po48+sltMVbrw91eyZEklJCTIx8dHXl5eatKkSZ61CC5n9erVmjp1qkaNGqUGDRpIurDAZ+vWrTVixAi9+uqrVzQeAADF1ZVc+1zK+PHjtWrVKrVo0UJPPvmkXFxcNH36dGVnZ9v93AwLC1Pr1q3VsGFD+fv76+eff9ann36q2NhYSdLu3bvVtm1bde3aVWFhYXJxcdFnn32mlJSUS95V/U89e/bUBx98oBUrVuiRRx6xu+O7WbNmKlWqlHr37q3BgwfLYrHoww8/vKIlCP5pzJgxWr58uVq2bKknn3zSFq7Url3b7peJ7dq1k6urq+677z4NHDhQp0+f1nvvvaeyZcvmCVYaNmyoadOmafz48apWrZrKli2b504o6cKdQhMnTlRMTIwiIiLUo0cPpaSk6K233lJoaKjt0cBr9eeff6px48a666671LZtWwUFBenYsWP6+OOPtXXrVj3zzDO2O9eHDRumTz/9VF26dNFjjz2mhg0b6sSJE1qyZIkSEhIUHh6uAQMGaPr06erTp482bdqk0NBQffrpp/ruu+80efLkQi28P2XKFLVo0UJ169ZV//79VaVKFaWkpGjDhg36888/tXXrVkmX/7wBNyzHffEfADPs3r3b6N+/vxEaGmq4uroaPj4+RvPmzY133nnH7qtnz507Z4wZM8aoXLmyUaJECSM4ONgYPny4XR/DMIyQkJB8v442IiLC7it/L371bX5fg7xy5UqjTp06hqurq1GjRg1j7ty5xqhRo+y+bjgpKcno3LmzUb58ecPV1dUoX7680aNHD2P37t15zjFr1iy78b/55hujefPmhoeHh+Hr62vcd999xo4dO+z6XDxfamqqXfusWbMMScaBAwcKfE8N48LXEXt5eV2yT37vwdmzZ41nn33WKFeunOHh4WE0b97c2LBhQ573zzAM44svvjDCwsIMFxcXu3lGREQYtWvXzvec/xwnIyPDCAkJMRo0aGCcO3fOrt+QIUMMJycn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KHRfX1/f61gJAADAjYlQCgAA4CqULFlSFoulUH1zc3OvczUAAAA3HkIpAACAq7BmzRrbnw8ePKgXXnhBffr0UdOmTSVJGzZs0Jw5cxQfH++oEgEAAIo1QikAAICrEBERYfvz2LFjNWnSJPXo0cPW1qlTJ9WtW1czZsxQ7969HVEiAABAscZC5wAAANdow4YNatSoUZ72Ro0aaePGjQ6oCAAAoPgjlAIAALhGwcHBeu+99/K0v//++woODnZARQAAAMUfj+8BAABcozfffFMPPvigvv76azVp0kSStHHjRu3Zs0eLFi1ycHUAAADFE3dKAQAAXKN77rlHu3fv1n333acTJ07oxIkTuu+++7R7927dc889ji4PAACgWOJOKQAAgCIQHBysl19+2dFlAAAA3DAIpQAAAK7Cr7/+Wui+9erVu46VAAAA3JgIpQAAAK5C/fr1ZbFYZBjGJftZLBbl5uaaVBUAAMCN46pCqW+//VbTp0/Xvn379Omnn6pChQr68MMPVblyZbVo0aKoawQAACh2Dhw44OgSAAAAbmhXHEotWrRIjz76qB555BH98ssvys7OliSlp6fr5Zdf1rJly4q8SAAAgOImJCTE0SUAAADc0K742/fGjx+vhIQEvffeeypRooStvXnz5tq8eXORFgcAAHCj2Ldvn5566ilFRkYqMjJSgwcP1r59+xxdFgAAQLF1xaHUrl271KpVqzztfn5+OnXqVFHUBAAAcENZsWKFwsLCtHHjRtWrV0/16tXTjz/+qNq1a2vVqlWOLg8AAKBYuuLH94KCgrR3716Fhobata9fv15VqlQpqroAAABuGC+88IKGDBmiV155JU/7888/r7vvvttBlQEAABRfV3ynVP/+/fX000/rxx9/lMVi0ZEjR/TRRx9p6NCheuKJJ65HjQAAAMXazp071bdv3zztjz32mHbs2OGAigAAAIq/K75T6oUXXpDValXbtm115swZtWrVSm5ubho6dKieeuqp61EjAABAsVamTBlt2bJFt912m137li1bVLZsWQdVBQAAULxdcShlsVj04osvatiwYdq7d69Onz6tsLAweXt7X4/6AAAAir3+/ftrwIAB2r9/v5o1ayZJ+u677zRx4kTFxcU5uDoAAIDi6YpDqYtcXV0VFhZWlLWgGPtk/jwtXPCxjhz5S5JUtdptGvD4k2rRMsLB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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"import joblib\n",
"\n",
"# Menampilkan hasil evaluasi\n",
"class_report = classification_report(y_test, y_pred, output_dict=True) # Get report as dict\n",
"\n",
"# Save the model\n",
"with open('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/HASIL-RISET/model-nb.pkl', 'wb') as file:\n",
" joblib.dump(nb_model, file)\n",
"\n",
"# Save evaluation results\n",
"results = {\n",
" 'Confusion Matrix': [conf_matrix.flatten()], # Flatten for easier saving\n",
" 'Classification Report': [class_report],\n",
" 'Cross-Validation Scores': [cv_scores.tolist()],\n",
" 'Mean CV Score': [cv_scores.mean()],\n",
" 'Std Dev CV Score': [cv_scores.std()]\n",
"}\n",
"\n",
"results_df = pd.DataFrame(results)\n",
"results_df.to_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/HASIL-RISET/evaluation_results_nb.csv', index=False) # Save results to CSV"
],
"metadata": {
"id": "JZ8f3lZL094X"
},
"execution_count": 33,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## K-Nearest Neighbor"
],
"metadata": {
"id": "D5wJEcy61Yw-"
}
},
{
"cell_type": "code",
"source": [
"# Import library yang diperlukan\n",
"import pandas as pd\n",
"from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV\n",
"from sklearn.neighbors import KNeighborsClassifier\n",
"from sklearn.metrics import classification_report, confusion_matrix\n",
"\n",
"# Membaca dataset yang sudah di-balance\n",
"df_balanced = pd.read_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/data-analisis/datasets-balanced.csv')\n",
"\n",
"# Memisahkan fitur dan label\n",
"X = df_balanced.drop(columns=['label']) # Menghapus kolom label\n",
"y = df_balanced['label'] # Mengambil kolom label\n",
"\n",
"# Membagi dataset menjadi data latih (80%) dan data uji 20%)\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)\n",
"\n",
"# Mencari nilai K optimal menggunakan GridSearchCV\n",
"param_grid = {'n_neighbors': range(1, 11)} # Mencoba nilai K dari 1 hingga 10\n",
"knn = KNeighborsClassifier()\n",
"grid_search = GridSearchCV(knn, param_grid, cv=5) # Menggunakan 5-fold cross-validation\n",
"grid_search.fit(X_train, y_train)\n",
"\n",
"# Mengambil hasil dari GridSearchCV untuk visualisasi\n",
"results = grid_search.cv_results_\n",
"\n",
"# Menyusun nilai K dan rata-rata akurasi untuk setiap nilai K\n",
"k_values = results['param_n_neighbors'].data # Nilai K yang dicoba\n",
"mean_test_scores = results['mean_test_score'] # Rata-rata akurasi untuk setiap K\n",
"\n",
"# Visualisasi hasil dengan line chart\n",
"plt.figure(figsize=(10, 6))\n",
"plt.plot(k_values, mean_test_scores, marker='o', linestyle='-', color='b', label='Mean Test Score')\n",
"plt.title('Visualisasi Kinerja Model KNN pada Berbagai Nilai K')\n",
"plt.xlabel('Nilai K')\n",
"plt.ylabel('Rata-rata Akurasi (Cross-validation)')\n",
"plt.grid(True)\n",
"plt.show()\n",
"\n",
"# Menentukan nilai K optimal\n",
"optimal_k = grid_search.best_params_['n_neighbors']\n",
"\n",
"# Memastikan nilai K memenuhi kriteria\n",
"if optimal_k == 1:\n",
" # Jika K = 1, mencari nilai K terbaik berikutnya yang lebih besar dari 1 dan ganjil\n",
" valid_k_values = [k for k in range(3, 11, 2)] # K = 3, 5, 7, 9\n",
" param_grid = {'n_neighbors': valid_k_values}\n",
" grid_search = GridSearchCV(knn, param_grid, cv=5)\n",
" grid_search.fit(X_train, y_train)\n",
" optimal_k = grid_search.best_params_['n_neighbors']\n",
" print(f\"Optimal K = {optimal_k}\")\n",
"\n",
"elif optimal_k == 2:\n",
" # Jika K = 2, mencari nilai K terbaik berikutnya yang lebih besar dari 2 dan ganjil\n",
" valid_k_values = [k for k in range(3, 11, 2)] # K = 3, 5, 7, 9\n",
" param_grid = {'n_neighbors': valid_k_values}\n",
" grid_search = GridSearchCV(knn, param_grid, cv=5)\n",
" grid_search.fit(X_train, y_train)\n",
" optimal_k = grid_search.best_params_['n_neighbors']\n",
" print(f\"Optimal K = {optimal_k}\")\n",
"\n",
"else:\n",
" # Jika K tidak sama dengan 1 atau 2, maka K sudah valid\n",
" print(f\"Optimal K = {optimal_k}\")\n",
"\n",
"# Membuat model KNN dengan K optimal\n",
"knn_model = KNeighborsClassifier(n_neighbors = optimal_k)\n",
"knn_model.fit(X_train, y_train)\n",
"\n",
"# Melakukan prediksi pada data uji\n",
"y_pred = knn_model.predict(X_test)\n",
"\n",
"# Menampilkan hasil evaluasi\n",
"print(\"Confusion Matrix:\")\n",
"print(confusion_matrix(y_test, y_pred))\n",
"print(\"\\nClassification Report:\")\n",
"print(classification_report(y_test, y_pred))\n",
"\n",
"# Evaluasi model menggunakan cross-validation\n",
"cv_scores = cross_val_score(knn_model, X, y, cv=5) # Menggunakan 5-fold cross-validation\n",
"\n",
"# Menampilkan hasil cross-validation\n",
"print(\"\\nCross-Validation Scores:\")\n",
"print(cv_scores)\n",
"print(f\"Mean Cross-Validation Score: {cv_scores.mean():.4f}\")\n",
"print(f\"Standard Deviation of Cross-Validation Scores: {cv_scores.std():.4f}\")"
],
"metadata": {
"id": "_r-z131V1idv",
"outputId": "7cffc5b5-8a4a-407e-902d-c9dc800c079d",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 823
}
},
"execution_count": 34,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1000x600 with 1 Axes>"
],
"image/png": "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L3G6zz+H3Lnh2DF4+22roxERERERSRqUfInTZcoE33xj3p8+HVavtjQcEREREZEkQcmXJIhataB/f/P+66/DlSuWhiMiIiIiYjklX5JgRo+GokXhwgXo3h0Mw+qIRERERESso+RLEkzatPDdd+DmBsuWwdy5VkckIiIiImIdJV+SoEqVguHDzft9+sDp05aGIyIiIiJiGSVfkuDefRcqVYKQEOjY0SxDLyIiIiKS2ij5kgSXJg18+y2kSwebN8OkSVZHJCIiIiKS+JR8SaIoUOBB0vXee3DokLXxiIiIiIgkNiVfkmjeeAMaNYLQUGjfHu7dszoiEREREZHEo+RLEo3NBl99Bdmywe+/w7BhVkckIiIiIpJ4lHxJosqRA2bONO+PGwe//WZtPCIiIiIiiUXJlyS6V16Bzp3NRZdfe82sgigiIiIiktIp+RJLTJ4MAQFw6hQMGGBxMCIiIiIiiUDJl1jC29ssP2+zwaxZsHy51RGJiIiIiCQsJV9imapV4Z13zPtdu8LFi9bGIyIiIiKSkJR8iaVGjoTixeHyZTMBMwyrIxIRERERSRhKvsRSHh7w3Xfg7g4rV5pDEEVEREREUiIlX2K5YsXgo4/M+/36wfHj1sYjIiIiIpIQlHxJkjBgAFSvDrduQceOEB5udUQiIiIiIs6l5EuSBFdX+OYbyJABtm2D8eOtjkhERERExLmUfEmSkTcvTJli3h86FP73P2vjERERERFxJsuTr6lTpxIQEICnpyfly5dn9+7dj20fHBxMr1698PPzw8PDg2eeeYbVq1fb9w8fPhybzRblVrhw4SjHuHv3Lr169SJr1qykT5+e5s2bc1F1zpOEDh2gWTMIC4P27eHuXasjEhERERFxDkuTr4ULFxIYGMiwYcPYv38/JUqUoH79+ly6dCnG9qGhodStW5dTp06xZMkSjhw5wsyZM8mVK1eUds899xxBQUH222+//RZl/4ABA1i5ciWLFy9m8+bNnD9/nmbNmiXY65S4s9ngyy8hRw746y94/32rIxIRERERcY40Vp584sSJdO3alc6dOwMwffp0Vq1axaxZsxg0aFC09rNmzeLq1ats374dNzc3AAICAqK1S5MmDb6+vjGe8/r163z99dfMmzePWrVqATB79myKFCnCzp07qVChgpNenTgqWzb4+mto1AgmToSGDeH/PyoRERER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hQrxxx9/8PzzzwPmsMM///wTwzDw9fXl5ZdfZsiQIY/t/Ro+fDgjRoyItn3evHnqNROJxfXr7vToUYfbt93o0eMA9euftjokEREREae7ffs2bdu25fr164/NheLc85UpUyZsNttj2xiGgc1mIzw8/InHu3LlCuHh4eTIkSPK9hw5cnD48OEYn3PixAk2btxIu3btWL16NceOHaNnz56EhYUxbNiwaO0jIiLo378/lStXtideAG3btiVv3rzkzJmTgwcPMnDgQI4cOcKyZctijXfw4MEEBgbaH4eEhODv70+9evXilGxK0hMWFsb69eupW7euvSdVnO+//1wIDIRFi0owbNhzxHNaaIqia04Sk643SWy65iSxJaVrLq4dVXFOvjZt2uRwMM4SERGBj48PM2bMwNXVlTJlynDu3DnGjx8fY/LVq1cvDh06xG+//RZle7du3ez3ixUrhp+fH7Vr1+b48eMUKFAgxnN7eHjg4eERbbubm5vlH7Y8HX2GCatPH5g1Cw4dsjFypBtTp1odkfV0zUli0vUmiU3XnCS2pHDNxfX8cU6+qlev7nAwMcmWLRuurq5cvHgxyvaLFy/GOhfLz88PNze3KEMMixQpwoULFwgNDcX9odVce/fuzU8//cSWLVvInTv3Y2MpX748YA5RjC35EhHHpEkDn30GtWrB9OnQrZs5H0xEREQktXmqdb5u377N4cOHOXjwYJRbXLi7u1OmTBk2bNhg3xYREcGGDRuoWLFijM+pXLkyx44dIyIiwr7tn3/+wc/Pz554GYZB7969+eGHH9i4cSP58uV7YiwHDhwAzORORJyvZk1o0QIiIsyesLjNNBURERFJWRxKvi5fvkyjRo3IkCEDzz33HKVKlYpyi6vAwEBmzpzJN998w99//02PHj24deuWvfphhw4dGDx4sL19jx49uHr1Kv369eOff/5h1apVjB49ml69etnb9OrVi++++4558+aRIUMGLly4wIULF7hz5w4Ax48fZ9SoUezbt49Tp06xYsUKOnToQLVq1ShevLgjb4eIxMGECZA2LWzdCgsWWB2NiIiISOJzKPnq378/wcHB7Nq1i7Rp07JmzRq++eYbChUqxIoVK+J8nFatWjFhwgSGDh1KyZIlOXDgAGvWrLEX4Thz5gxBQUH29v7+/qxdu5Y9e/ZQvHhx+vbtS79+/aKUpZ82bRrXr1+nRo0a+Pn52W8LFy4EzB63X375hXr16lG4cGHeeustmjdvzsqVKx15K0QkjvLkgffeM++/8465ALOIiIhIahLnOV8P27hxI8uXL6ds2bK4uLiQN29e6tati7e3N2PGjKFhw4ZxPlbv3r3p3bt3jPt+/fXXaNsqVqzIzp07Yz3ekyrn+/v7s3nz5jjHJyLO8/bbZvGNkydh9GjzJiIiIpJaONTzdevWLXx8fADInDkzly9fBszKgfv373dedCKSonh6wqRJ5v1PPoFjx6yNR0RERCQxOZR8Pfvssxw5cgSAEiVK8OWXX3Lu3DmmT5+uohUi8liNG0P9+hAaCgMGWB2NiIiISOJxKPnq16+ffS7WsGHD+Pnnn8mTJw+fffYZozWOSEQew2aDyZPNEvQ//QSrV1sdkYiIiEjicGjOV/v27e33y5Qpw+nTpzl8+DB58uQhW7ZsTgtORFKmwoWhf3+zAmK/flC7NsSwhrmIiIhIiuJQz9dvv/0W5bGXlxelS5dW4iUicTZkCPj6mvO+Jk+2OhoRERGRhOdQ8lWrVi3y5cvHe++9x19//eXsmEQkFfD2ho8/Nu+PGgXnzlkbj4iIiEhCcyj5On/+PG+99RabN2/m+eefp2TJkowfP56zZ886Oz4RScHat4eKFeHWLRg40OpoRERERBKWQ8lXtmzZ6N27N9u2beP48eO0aNGCb775hoCAAGrVquXsGEUkhXJxgSlTzCIc338Pj4xoFhEREUlRHEq+HpYvXz4GDRrE2LFjKVasmBYwFpF4KVMG3njDvN+nD4SHWxuPiIiISEJ5quRr27Zt9OzZEz8/P9q2bcvzzz/PqlWrnBWbiKQSH30EmTLBgQMwc6bV0YiIiIgkDIeSr8GDB5MvXz5q1arFmTNn+PTTT7lw4QJz586lQYMGzo5RRFK47Nlh5Ejz/vvvw3//WRuPiIiISEJwKPnasmUL77zzDufOneOnn36iTZs2eHl5OTs2EUlFevSAYsXg6lWzDL2IiIhISuNQ8hU53DBbtmzMnz+fW7duOTsuEUll0qSBzz4z73/5pTkEUURERCQleeqCG927d+fixYvOiEVEUrkaNaBlS4iIgL59wTCsjkhERETEeZ46+TL07UhEnGjCBPDygq1bYf58q6MRERERcZ6nTr5ERJzJ3x/ee8+8/847cPOmtfGIiIiIOMtTJ18///wzuXLlckYsIiIAvPUW5M8P58+bZehFREREUgKHkq87d+5w+/ZtAKpUqcKFCxeYPHky69atc2pwIpI6eXrCpEnm/U8+gaNHrY1HRERExBkcSr6aNGnCt99+C0BwcDDly5fnk08+oUmTJkybNs2pAYpI6vTyy9CgAYSFwYABVkcjIiIi8vQcSr72799P1apVAViyZAk5cuTg9OnTfPvtt3wWWStaROQp2GwweTK4ucGqVeZNREREJDlzKPm6ffs2GTJkAGDdunU0a9YMFxcXKlSowOnTp50aoIikXs8+C/37m/f794d796yMRkREROTpOJR8FSxYkB9//JF///2XtWvXUq9ePQAuXbqEt7e3UwMUkdRtyBDw9YVjxx7MAxMRERFJjhxKvoYOHcrbb79NQEAA5cuXp2LFioDZC1aqVCmnBigiqVuGDDBunHn/ww/h3Dlr4xERERFxlEPJ16uvvsqZM2fYu3cva9assW+vXbs2k/Rf0yLiZO3bQ6VKcOuWufaXiIiISHLk8Dpfvr6+lCpVChcXF0JCQvjxxx/JkCEDhQsXdmZ8IiLYbDBlivlz/nzYutXqiERERETiz6Hkq2XLlnz++eeAueZX2bJladmyJcWLF2fp0qVODVBEBKB0aeja1bzfpw+Eh1sbj4iIiEh8OZR8bdmyxV5q/ocffsAwDIKDg/nss8/48MMPnRqgiEikjz6CzJnh99/hyy+tjkZEREQkfhxKvq5fv06WLFkAWLNmDc2bN8fLy4uGDRty9OhRpwYoIhIpWzYYNcq8/8EH8N9/1sYjIiIiEh8OJV/+/v7s2LGDW7dusWbNGnup+WvXruHp6enUAEVEHta9OxQrBteumQmYiIiISHLhUPLVv39/2rVrR+7cucmZMyc1atQAzOGIxYoVc2Z8IiJRpEljFt8Ac+jh//5nbTwiIiIiceVQ8tWzZ0927NjBrFmz+O2333BxMQ+TP39+zfkSkQRXvTq0agWGYRbfMAyrIxIRERF5ModLzZctW5amTZuSLl06jP//5tOwYUMqV67stOBERGIzYQJ4ecG2bTBvntXRiIiIiDyZw8nXt99+S7FixUibNi1p06alePHizJ0715mxiYjEKndueP998/4778CNG9bGIyIiIvIkDiVfEydOpEePHrz00kssWrSIRYsW0aBBA958800mTZrk7BhFRGIUGAj580NQkFmGXkRERCQpS+PIk6ZMmcK0adPo0KGDfVvjxo157rnnGD58OAMGDHBagCIisfH0hMmToXFjmDgRunSBZ56xOioRERGRmDnU8xUUFESlSpWiba9UqRJBQUFPHZSISFw1agQvvghhYaD/9xEREZGkzKHkq2DBgixatCja9oULF1KoUKGnDkpEJK5sNrP3y80NVq+Gn36yOiIRERGRmDk07HDEiBG0atWKLVu22Ksbbtu2jQ0bNsSYlImIJKRnnjF7vcaNg/79oU4dc0iiiIiISFLiUM9X8+bN2b17N9myZePHH3/kxx9/JFu2bOzevZumTZs6O0YRkSf64APw84Pjx0F1f0RERCQpinfPV1hYGN27d2fIkCF89913CRGTiEi8Zchg9ny99hp8+KH5M3duq6MSEREReSDePV9ubm4sXbo0IWIREXkq7dpB5cpw+7a59peIiIhIUuLQsMNXXnmFH3/80cmhiIg8HZsNpkwxfy5YAFu2WB2RiIiIyAMOFdwoVKgQI0eOZNu2bZQpU4Z06dJF2d+3b1+nBCciEl+lSkG3bvDll9CnD+zbB2kc+ksnIiIi4lwOfSX5+uuvyZQpE/v27WPfvn1R9tlsNiVfImKpjz6CRYvg4EEzCevVy+qIRERERBxMvk6ePOnsOEREnCZrVrPoRq9eMGQItGoF2bJZHZWIiIikdvGe8xUSEkJERES07REREYSEhDglKBGRp9WtGxQvDteumWXoRURERKwWr+Trhx9+oGzZsty9ezfavjt37vDCCy+wcuVKpwUnIuKoNGnM4hsAM2bA/v3WxiMiIiISr+Rr2rRpvPvuu3h5eUXbly5dOgYOHMjnn3/utOBERJ5GtWrQpg0Yhll8wzCsjkhERERSs3glX4cOHaJGjRqx7q9WrRp//PHH08YkIuI048aBlxds3w7ff291NCIiIpKaxSv5unbtGvfv3491f1hYGNeuXXvqoEREnCV37gdzvt59F27csDYeERERSb3ilXwFBASwd+/eWPfv3buXvHnzPnVQIiLOFBgIBQpAUJBZBVFERETECvFKvpo1a8b777/PxYsXo+27cOECH3zwAc2bN49XAFOnTiUgIABPT0/Kly/P7t27H9s+ODiYXr164efnh4eHB8888wyrV6+O1zHv3r1Lr169yJo1K+nTp6d58+YxviYRSRk8PGDy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\n"
},
"metadata": {}
},
{
"output_type": "stream",
"name": "stdout",
"text": [
"Optimal K = 3\n",
"Confusion Matrix:\n",
"[[ 96 370 125]\n",
" [ 0 582 9]\n",
" [ 8 119 464]]\n",
"\n",
"Classification Report:\n",
" precision recall f1-score support\n",
"\n",
" Negatif 0.92 0.16 0.28 591\n",
" Netral 0.54 0.98 0.70 591\n",
" Positif 0.78 0.79 0.78 591\n",
"\n",
" accuracy 0.64 1773\n",
" macro avg 0.75 0.64 0.59 1773\n",
"weighted avg 0.75 0.64 0.59 1773\n",
"\n",
"\n",
"Cross-Validation Scores:\n",
"[0.56739989 0.58657642 0.58319233 0.72758037 0.76875353]\n",
"Mean Cross-Validation Score: 0.6467\n",
"Standard Deviation of Cross-Validation Scores: 0.0841\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"\n",
"# Generate confusion matrix\n",
"conf_matrix = confusion_matrix(y_test, y_pred)\n",
"\n",
"# Visualization\n",
"plt.figure(figsize=(12, 6))\n",
"\n",
"# Subplot for Confusion Matrix\n",
"plt.subplot(1, 2, 1)\n",
"sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', cbar=False)\n",
"plt.title('Confusion Matrix')\n",
"plt.xlabel('Predicted')\n",
"plt.ylabel('True')\n",
"\n",
"# Subplot for Cross-Validation Scores\n",
"plt.subplot(1, 2, 2)\n",
"sns.boxplot(data=cv_scores, orient='w')\n",
"plt.title('Cross-Validation Scores')\n",
"plt.xlabel('Score')\n",
"\n",
"plt.tight_layout()\n",
"plt.show()"
],
"metadata": {
"id": "gfxD10kx149Y",
"outputId": "3a06d921-e8d7-4847-b9f6-d0555569fd47",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 349
}
},
"execution_count": 35,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"<Figure size 1200x600 with 2 Axes>"
],
"image/png": "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PXt0zz33aPDgwRo4cKDmzJmjQYMGKSwsTI0bN1bPnj3l4+OjUaNGqW/fvrrrrrvk4eFRqvq3bdum//znP2rWrJkmTpwoi8WiPXv26Mcff7zgcd999526dOmi2rVra/z48Tp9+rTeeOMNtWnTRps2bSoUiN13332qVauWEhIStGnTJr3zzjvy9/fXiy++WKI6e/bsqYceekifffaZHnjgAUl/X1wW983mvn379MUXX+jee+9VrVq1lJGRobffflvt27fX9u3bVb16dTVs2FATJ07U2LFjNWzYMLVt21aS7P5bHj9+XF26dFGfPn3Uv39/BQQEFFnfa6+9ppUrV2rgwIFKTk6Wi4uL3n77bX377bd6//33Vb169RLNEwCAK0Vpr3Gkv7+w+vjjjxUbGys/Pz9bkNK2bVt5eXnpiSeeUMWKFfX222+rQ4cOWrNmjcLDwyX9/UVWQkKChgwZotatWysnJ0c///yzNm3apDvuuEOS1KtXL23btk0PP/ywQkNDdfToUa1YsUJpaWlFfhknSbVq1dKtt96qjz/+WK+++qpcXFxs+84HVee/4Hr33Xfl4eGhuLg4eXh4aOXKlRo7dqxycnI0ZcqUUv38fvvtN3Xu3FnVqlXT+PHjde7cOY0bN67Ia4m33npLjRs31t13360KFSroq6++0ogRI2S1WhUTEyPp7zuPHn74YXl4eOjpp5+WpGKvS87PJTo6WjfffLMSEhKUkZGh1157TT/++KN++eUXu7vsCwoKFBUVpfDwcL388sv67rvv9Morr6hOnToaPnx4sec4/+XookWLdO+996py5crF9j158qTatm2rHTt26IEHHlDLli2VmZmpxYsX6/fff5efn59Onz6tDh06aM+ePYqNjVWtWrW0aNEiDRo0SFlZWXYhqPR3mHfmzBkNGzZMFotFvr6+2rZtm9q0aaMaNWroySeflLu7uz7++GN1795dn376qXr06CGpZL9vwFXPAHBNy87ONiQZ3bp1K1H/zZs3G5KMIUOG2LWPHj3akGSsXLnS1hYSEmJIMr7//ntb29GjRw2LxWI89thjtrb9+/cbkowpU6bYjTlw4EAjJCSkUA3jxo0z/vnX06uvvmpIMo4dO1Zs3efPMXfuXFtbixYtDH9/f+P48eO2ti1bthjOzs7GgAEDCp3vgQcesBuzR48eRtWqVYs95z/n4e7u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rSQ1b95cAwcO1MyZM223iG/cuFHz5s1T9+7d1bFjxzKrq0+fPhozZox69OihRx55RKdOndJbb72levXq2S30PXHiRH3//ffq2rWrQkJCdPToUc2YMUM33HCDbrvttmLHnzJlirp06aKIiAgNHjxYp0+f1htvvCFvb2+NHz++zObxb87OznrmmWcu2u8///mPJk6cqOjoaN1666367bff9MEHH9gtsir9/d/Px8dHiYmJ8vT0lLu7u8LDwwutUXAxK1eu1IwZMzRu3Di1bNlS0t8Lf3bo0EHPPvusXnrppVKNBwCAo5XmGudCnnvuOa1YsUK33XabRowYoQoVKujtt99WXl6e3b+PjRo1UocOHRQWFiZfX1/9/PPP+uSTTxQbGytJ2rVrlzp16qT77rtPjRo1UoUKFfT5558rIyPjgndP/1P//v313nvvafny5erXr5/dnd233nqrqlSpooEDB+qRRx6Rk5OT3n///VItNfBPEyZM0LJly9S2bVuNGDHCFq40btzY7kvDzp07y9XVVf/973/14IMP6uTJk5o1a5b8/f0LBSthYWF666239Nxzz6lu3bry9/cvdCeU9PedQi+++KKio6PVvn179e3bVxkZGXrttdcUGhpqezTwcv3+++9q3bq1br/9dnXq1EmBgYE6evSoPvroI23ZskWPPvqo7Q71xx9/XJ988onuvfdePfDAAwoLC9OJEye0ePFiJSYmqnnz5ho2bJjefvttDRo0SCkpKQoNDdUnn3yiH3/8UdOmTSvRwvvTp0/XbbfdpqZNm2ro0KGqXbu2MjIylJycrN9//11btmyRdPHfN+Ca4LgX/wEw265du4yhQ4caoaGhhqurq+Hp6Wm0adPGeOONN+xeSXv27FljwoQJRq1atYyKFSsawcHBRnx8vF0fwzCMkJCQIl9T2759e7tXAZ9/JW5Rr0f+9ttvjSZNmhiurq5G/fr1jfnz5xvjxo2zew1xUlKS0a1bN6N69eqGq6urUb16daNv377Grl27Cp1j7ty5duN/9913Rps2bYxKlSoZXl5exn//+19j+/btdn3On+/YsWN27XPnzjUkGfv37y/2Z2oYf7+m2N3d/YJ9ivoZnDlzxnjssceMoKAgo1KlSkabNm2M5OTkQj8/wzCML7/80mjUqJFRoUIFu3m2b9/eaNy4cZHn/Oc4OTk5RkhIiNGy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\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"import joblib\n",
"\n",
"# Menampilkan hasil evaluasi\n",
"class_report = classification_report(y_test, y_pred, output_dict=True) # Get report as dict\n",
"\n",
"# # Save the model\n",
"# joblib.dump(knn_model, 'HASIL-RISET/knn_model.pkl') # Save the model to a file\n",
"with open('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/HASIL-RISET/model-knn.pkl', 'wb') as file:\n",
" joblib.dump(knn_model, file)\n",
"\n",
"# Save evaluation results\n",
"results_knn = {\n",
" 'Confusion Matrix': [conf_matrix.flatten()], # Flatten for easier saving\n",
" 'Classification Report': [class_report],\n",
" 'Cross-Validation Scores': [cv_scores.tolist()],\n",
" 'Mean CV Score': [cv_scores.mean()],\n",
" 'Std Dev CV Score': [cv_scores.std()]\n",
"}\n",
"\n",
"results_df_knn = pd.DataFrame(results_knn)\n",
"results_df_knn.to_csv('/content/drive/MyDrive/Tugas Akhir/datasets penelitian/HASIL-RISET/evaluation_results_knn-new.csv', index=False) # Save results to CSV"
],
"metadata": {
"id": "-AWKeEfP1_Vn"
},
"execution_count": 36,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "ezzOKpOLpbQU"
},
"source": [
"# eksport Data Untuk Dashboard"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "smzFSiD_pbQU"
},
"outputs": [],
"source": [
"import pandas as pd\n",
"from nltk.tokenize import word_tokenize\n",
"from collections import Counter\n",
"\n",
"df=pd.read_csv('REAL-DATA/datasets-clean.csv')\n",
"\n",
"def create_word_count_table(df, text_column):\n",
" # Tokenizing the text data\n",
" df['tokens'] = df[text_column].apply(word_tokenize)\n",
"\n",
" # Flatten the list of tokens and count the occurrences of each word\n",
" all_tokens = [token for sublist in df['tokens'] for token in sublist]\n",
" word_counts = Counter(all_tokens)\n",
"\n",
" # Convert the word counts to a DataFrame\n",
" word_count_df = pd.DataFrame(word_counts.items(), columns=['word', 'count'])\n",
"\n",
" return word_count_df\n",
"\n",
"word_tokenize_df = create_word_count_table(df, 'full_text')\n",
"word_tokenize_df.to_csv('word_count_result.csv', index=False)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "sNdj6ku9pbQV"
},
"outputs": [],
"source": [
"df = pd.read_csv('word_count_result.csv')\n",
"\n",
"df.isnull().sum()\n",
"\n",
"# Mencari baris yang memiliki nilai NaN atau kosong\n",
"df[df.isnull().any(axis=1)]\n",
"\n",
"# Menampilkan baris yang memiliki nilai NaN atau kosong\n",
"# print(rows_with_nan)\n",
"\n",
"df.dropna(inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "B313m4ExpbQV"
},
"outputs": [],
"source": [
"df = pd.read_csv('word_count_result.csv')\n",
"\n",
"positive_lexicon = pd.read_csv('InSet/positive.tsv', sep='\\t', header=None)\n",
"negative_lexicon = pd.read_csv('InSet/negative.tsv', sep='\\t', header=None)\n",
"\n",
"# Gabungkan lexicon positif dan negatif\n",
"positive_lexicon.columns = ['kata', 'polaritas']\n",
"negative_lexicon.columns = ['kata', 'polaritas']\n",
"\n",
"# Pastikan kolom polaritas bertipe numerik\n",
"positive_lexicon['polaritas'] = pd.to_numeric(positive_lexicon['polaritas'], errors='coerce')\n",
"negative_lexicon['polaritas'] = pd.to_numeric(negative_lexicon['polaritas'], errors='coerce')\n",
"\n",
"lexicon = pd.concat([positive_lexicon, negative_lexicon])\n",
"\n",
"# Konversi lexicon ke dictionary untuk lookup cepat\n",
"lexicon_dict = dict(zip(lexicon['kata'], lexicon['polaritas']))\n",
"\n",
"# Fungsi untuk memberikan skor pada teks berdasarkan kamus lexicon\n",
"def label(tweet, lexicon_dict):\n",
" words = tweet.split() # Pisahkan tweet menjadi kata-kata\n",
" sentiment_score = 0 # Inisialisasi skor sentimen\n",
"\n",
" # Hitung skor sentimen berdasarkan kata-kata dalam lexicon\n",
" for word in words:\n",
" sentiment = lexicon_dict.get(word, 0) # Ambil polaritas dari dictionary, default 0 jika tidak ditemukan\n",
" sentiment_score += sentiment\n",
"\n",
" # Berikan label berdasarkan skor polaritas total\n",
" if sentiment_score > 0:\n",
" return 'positif', sentiment_score\n",
" elif sentiment_score < 0:\n",
" return 'negatif', sentiment_score\n",
" else:\n",
" return 'netral', sentiment_score\n",
"\n",
"# Handle NaN values in the 'word' column\n",
"df['word'].fillna('', inplace=True)\n",
"\n",
"df['label', 'score'] = df['word'].apply(lambda x: pd.Series(label(x, lexicon_dict)))\n",
"df.to_csv('word_count_labeled.csv', index=False)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "uAEqGDqZpbQW"
},
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"df = pd.read_csv('word_count_labeled.csv')\n",
"\n",
"df['label'].value_counts()\n",
"\n",
"df.groupby('label').apply(lambda x: x.loc[x['count'].idxmax()])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "30i0VbsvpbQW"
},
"outputs": [],
"source": [
"# import pandas as pd\n",
"# from wordcloud import WordCloud, get_single_color_func\n",
"# import matplotlib.pyplot as plt\n",
"\n",
"# df = pd.read_csv('word_count_labeled.csv')\n",
"\n",
"# # Menampilkan jumlah label\n",
"# # print(df['label'].value_counts())\n",
"\n",
"# # Fungsi untuk membuat dan menampilkan Word Cloud dengan warna berdasarkan label\n",
"# def plot_word_cloud(label, color):\n",
"# words = df[df['label'] == label].set_index('word')['count'].to_dict()\n",
"# wordcloud = WordCloud(width=800, height=400, background_color='white', color_func=get_single_color_func(color)).generate_from_frequencies(words)\n",
"\n",
"# plt.figure(figsize=(10, 5))\n",
"# plt.imshow(wordcloud, interpolation='bilinear')\n",
"# plt.title(f'Word Cloud for {label} words')\n",
"# plt.axis('off')\n",
"# plt.show()\n",
"\n",
"# # Menampilkan Word Cloud untuk setiap label dengan warna yang sesuai\n",
"# label_colors = {\n",
"# 'positif': 'green',\n",
"# 'negatif': 'red',\n",
"# 'netral': 'gray'\n",
"# }\n",
"\n",
"# for label in df['label'].unique():\n",
"# plot_word_cloud(label, label_colors[label])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "8TdWKd4ypbQW",
"outputId": "9f78aa8a-71aa-4083-875f-a1171a31a630"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": []
}
],
"source": [
"import pandas as pd\n",
"\n",
"eval_svm = pd.read_csv('HASIL-RISET/evaluation_results_SVM-new.csv')\n",
"eval_nb = pd.read_csv('HASIL-RISET/evaluation_results_nb-new.csv')\n",
"eval_knn = pd.read_csv('HASIL-RISET/evaluation_results_knn-new.csv')\n",
"\n",
"# penggabungan data evaluation\n",
"# Menambahkan kolom 'model' ke setiap DataFrame\n",
"eval_svm['model'] = 'svm'\n",
"eval_nb['model'] = 'nb'\n",
"eval_knn['model'] = 'knn'\n",
"\n",
"# Mengatur ulang kolom agar 'model' menjadi kolom pertama\n",
"svm = eval_svm[['model'] + [col for col in eval_svm.columns if col != 'model']]\n",
"nb = eval_nb[['model'] + [col for col in eval_nb.columns if col != 'model']]\n",
"knn = eval_knn[['model'] + [col for col in eval_knn.columns if col != 'model']]\n",
"\n",
"# Menggabungkan semua DataFrame\n",
"combined_df = pd.concat([svm, nb, knn], axis=0, ignore_index=True)\n",
"\n",
"# Menampilkan hasil\n",
"print(combined_df.head())\n",
"\n",
"combined_df.to_csv('HASIL-RISET/evaluation_results_combine.csv', index=False)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.11.5"
},
"colab": {
"provenance": [],
"toc_visible": true,
"gpuType": "T4"
}
},
"nbformat": 4,
"nbformat_minor": 0
}