SIT742Task1.docx
SIT742Task1.ipynb
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "EMX0qNbHot1x"
},
"source": [
"# SIT742: Modern Data Science \n",
"**(2020 Assessment Task 01: Exploration for Data Scientists Survey Data)**\n",
"\n",
"---\n",
"- Materials in this module include resources collected from various open-source online repositories.\n",
"- You are free to use, change and distribute this package.\n",
"\n",
"Prepared by **SIT742 Teaching Team**\n",
"\n",
"\n",
"---\n",
"\n",
"\n",
"Enter your information in the following cell. Please make sure you fill your Student ID and Name correctly. \n",
"
\n",
"\n",
"**Student Information:** Please fill your information below\n",
"\n",
"- Name: \n",
"- Student ID: \n",
"- Email: \n",
"- Lab Session and Tutor (for on campus students): \n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "cHdQMSVzJyip"
},
"source": [
"## Overview\n",
"\n",
"In 2017, [Kaggle](https://www.kaggle.com) (a data science community and competition platform) conducted a survey on a large range of users registered as the data scientist in their platform. The survey data are broadly covered the skill set of the data scientists, the demographic of the data scientists, the feedback of the platform and many other information. \n",
"\n",
"In this task, you will need to \n",
"\n",
"- **Part 1**: Given the following two data sets, you are required to finish some required analysis, with the exploreation data analytics skills as well as visuilization skills\n",
" - [MCQResponses.csv](https://github.com/tulip-lab/sit742/raw/master/Assessment/2020/data/MCQResponses.csv): Participants' answers to multiple choice questions. Each column contains the answers of one respondent to a specific question. \n",
" - [ConversionRates.csv](https://github.com/tulip-lab/sit742/raw/master/Assessment/2020/data/ConversionRates.csv): Currency conversion rates to USD. \n",
"- **Part 2**: Given the following data set, you are required to find out top keywords for hiring the data scientists. \n",
" - [JobPostings.csv](https://github.com/tulip-lab/sit742/raw/master/Assessment/2020/data/JobPostings.csv): Data scientists job advertising in US with job descriptions, from JobPikr.\n",
"\n",
"\n",
"You will be required to complete the coding to answer the questions with a neat and clean format, and your commenting and adherence to code standards will also be considered when marking. Further information on Python standards, please visit https://www.python.org/dev/peps/pep-0008/ \n",
"\n",
"\n",
"**Note**: You are not necessary to stick to the partial code provided, and you can write your own code to implement the required tasks. But you should provide sufficient comments.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "0d3FjO8fJyir"
},
"source": [
"## Part 1 - What we could know about the Data Scientists? "
]
},
{
"cell_type": "markdown",
"metadata": {
"_cell_guid": "06c9b38b-000e-4b8a-95f0-65a93bb332f2",
"_uuid": "2bfa8ca86a226c9900a67a02236a072274bc0d18",
"colab_type": "text",
"id": "NuDhBkqaot17"
},
"source": [
"### 1.0. Libraries and data files\n",
"\n",
"***\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 193
},
"colab_type": "code",
"id": "Tzx_NMcsJyiv",
"outputId": "e6e14060-52f1-497f-8e0e-f7b719d41fa5"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: wget in c:\\users\\kanish\\anaconda3\\lib\\site-packages (3.2)\n"
]
}
],
"source": [
"!pip install wget"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"_cell_guid": "bf6d21b3-22d5-48e4-8a62-a50ef36bae42",
"_kg_hide-input": true,
"_kg_hide-output": false,
"_uuid": "76567470049e7d7e878b76d72e81858f56bdbd2a",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 72
},
"colab_type": "code",
"id": "7AVjZqvmot2A",
"outputId": "da316df2-73b9-4ff7-f0da-70872bd0e55c",
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Kanish\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:4: FutureWarning: The pandas.datetime class is deprecated and will be removed from pandas in a future version. Import from datetime module instead.\n",
" after removing the cwd from sys.path.\n"
]
}
],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import pandas as pd\n",
"from pandas import datetime\n",
"import wget\n",
"import seaborn as sns\n",
"sns.set(style=\"whitegrid\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"_cell_guid": "bf6d21b3-22d5-48e4-8a62-a50ef36bae42",
"_kg_hide-input": true,
"_kg_hide-output": false,
"_uuid": "76567470049e7d7e878b76d72e81858f56bdbd2a",
"colab": {},
"colab_type": "code",
"id": "xtJ1n3tO0AKO",
"scrolled": true
},
"outputs": [],
"source": [
"link_to_data = 'https://github.com/tulip-lab/sit742/raw/master/Assessment/2020/data/MCQResponses.csv'\n",
"DataSet = wget.download(link_to_data)\n",
"\n",
"link_to_data = 'https://github.com/tulip-lab/sit742/raw/master/Assessment/2020/data/ConversionRates.csv'\n",
"DataSet = wget.download(link_to_data)\n",
"\n",
"link_to_data = 'https://github.com/tulip-lab/sit742/raw/master/Assessment/2020/data/JobPostings.csv'\n",
"DataSet = wget.download(link_to_data)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "xt84oidr-jof"
},
"source": [
"
\n",
"\n",
"**Code**: \n",
" You are required to load MCQResponses.csv into dataframe df_demog, and check the data statistics and general infommation by printing its top 5 rows.\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 395
},
"colab_type": "code",
"id": "Xl5VV8v4ot2N",
"outputId": "3026ed31-5315-49ad-b84b-7cd170c94834"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
"\n",
"\n",
" | \n",
"GenderSelect | \n",
"Country | \n",
"Age | \n",
"EmploymentStatus | \n",
"CodeWriter | \n",
"CurrentJobTitleSelect | \n",
"TitleFit | \n",
"CurrentEmployerType | \n",
"MLToolNextYearSelect | \n",
"MLMethodNextYearSelect | \n",
"LanguageRecommendationSelect | \n",
"FormalEducation | \n",
"MajorSelect | \n",
"FirstTrainingSelect | \n",
"CompensationAmount | \n",
"CompensationCurrency | \n",
"JobSatisfaction | \n",
"
\n",
"\n",
"\n",
"\n",
"0 | \n",
"Male | \n",
"United States | \n",
"56 | \n",
"Independent contractor, freelancer, or self-em... | \n",
"Yes | \n",
"Operations Research Practitioner | \n",
"Poorly | \n",
"Self-employed | \n",
"TensorFlow | \n",
"Neural Nets | \n",
"Python | \n",
"Master's degree | \n",
"Mathematics or statistics | \n",
"University courses | \n",
"250000.0 | \n",
"USD | \n",
"10 - Highly Satisfied | \n",
"
\n",
"\n",
"1 | \n",
"Female | \n",
"Australia | \n",
"43 | \n",
"Employed full-time | \n",
"Yes | \n",
"Business Analyst | \n",
"Fine | \n",
"Employed by non-profit or NGO | \n",
"Microsoft Excel Data Mining | \n",
"Link Analysis | \n",
"Python | \n",
"Bachelor's degree | \n",
"NaN | \n",
"Work | \n",
"80000.0 | \n",
"AUD | \n",
"7 | \n",
"
\n",
"\n",
"2 | \n",
"Male | \n",
"Russia | \n",
"33 | \n",
"Employed full-time | \n",
"Yes | \n",
"Software Developer/Software Engineer | \n",
"Fine | \n",
"Employed by a company that doesn't perform adv... | \n",
"C/C++ | \n",
"Deep learning | \n",
"Python | \n",
"Bachelor's degree | \n",
"Other | \n",
"Self-taught | \n",
"1200000.0 | \n",
"RUB | \n",
"7 | \n",
"
\n",
"\n",
"3 | \n",
"Male | \n",
"India | \n",
"27 | \n",
"Employed full-time | \n",
"Yes | \n",
"Data Scientist | \n",
"Fine | \n",
"Employed by professional services/consulting f... | \n",
"Other | \n",
"Deep learning | \n",
"Python | \n",
"Bachelor's degree | \n",
"Electrical Engineering | \n",
"University courses | \n",
"95000.0 | \n",
"INR | \n",
"7 | \n",
"
\n",
"\n",
"4 | \n",
"Male | \n",
"Taiwan | \n",
"26 | \n",
"Employed full-time | \n",
"Yes | \n",
"Software Developer/Software Engineer | \n",
"Fine | \n",
"Employed by professional services/consulting firm | \n",
"TensorFlow | \n",
"Deep learning | \n",
"Python | \n",
"Master's degree | \n",
"Computer Science | \n",
"Online courses (coursera, udemy, edx, etc.) | \n",
"1100000.0 | \n",
"TWD | \n",
"5 | \n",
"
\n",
"\n",
"
\n",
"
"
],
"text/plain": [
" GenderSelect Country Age \\\n",
"0 Male United States 56 \n",
"1 Female Australia 43 \n",
"2 Male Russia 33 \n",
"3 Male India 27 \n",
"4 Male Taiwan 26 \n",
"\n",
" EmploymentStatus CodeWriter \\\n",
"0 Independent contractor, freelancer, or self-em... Yes \n",
"1 Employed full-time Yes \n",
"2 Employed full-time Yes \n",
"3 Employed full-time Yes \n",
"4 Employed full-time Yes \n",
"\n",
" CurrentJobTitleSelect TitleFit \\\n",
"0 Operations Research Practitioner Poorly \n",
"1 Business Analyst Fine \n",
"2 Software Developer/Software Engineer Fine \n",
"3 Data Scientist Fine \n",
"4 Software Developer/Software Engineer Fine \n",
"\n",
" CurrentEmployerType \\\n",
"0 Self-employed \n",
"1 Employed by non-profit or NGO \n",
"2 Employed by a company that doesn't perform adv... \n",
"3 Employed by professional services/consulting f... \n",
"4 Employed by professional services/consulting firm \n",
"\n",
" MLToolNextYearSelect MLMethodNextYearSelect \\\n",
"0 TensorFlow Neural Nets \n",
"1 Microsoft Excel Data Mining Link Analysis \n",
"2 C/C++ Deep learning \n",
"3 Other Deep learning \n",
"4 TensorFlow Deep learning \n",
"\n",
" LanguageRecommendationSelect FormalEducation MajorSelect \\\n",
"0 Python Master's degree Mathematics or statistics \n",
"1 Python Bachelor's degree NaN \n",
"2 Python Bachelor's degree Other \n",
"3 Python Bachelor's degree Electrical Engineering \n",
"4 Python Master's degree Computer Science \n",
"\n",
" FirstTrainingSelect CompensationAmount \\\n",
"0 University courses 250000.0 \n",
"1 Work 80000.0 \n",
"2 Self-taught 1200000.0 \n",
"3 University courses 95000.0 \n",
"4 Online courses (coursera, udemy, edx, etc.) 1100000.0 \n",
"\n",
" CompensationCurrency JobSatisfaction \n",
"0 USD 10 - Highly Satisfied \n",
"1 AUD 7 \n",
"2 RUB 7 \n",
"3 INR 7 \n",
"4 TWD 5 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Your code\n",
"\n",
"df_demog = pd.read_csv('MCQResponses.csv')\n",
"df_demog.head(5)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "7gclqLjREEe7"
},
"source": [
"
\n",
"\n",
"**Code**: \n",
" Check which columns have NAs (don't remove them now), and for each of those columns, display how many records with values\n",
"\n",
"\n",
"
\n",
" \n",
"**Report**: \n",
" **1.0.A** Please include your result for this coding task into your report, with proper section title '1.0.A'.\n",
"
\n",
"
\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 570
},
"colab_type": "code",
"id": "jk5oshZLot2U",
"outputId": "bc8f13a8-08ee-408f-c112-3f8edf0e8ed2"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
"\n",
"\n",
" | \n",
"0 | \n",
"
\n",
"\n",
"\n",
"\n",
"GenderSelect | \n",
"0 | \n",
"
\n",
"\n",
"Country | \n",
"0 | \n",
"
\n",
"\n",
"Age | \n",
"0 | \n",
"
\n",
"\n",
"EmploymentStatus | \n",
"0 | \n",
"
\n",
"\n",
"CodeWriter | \n",
"0 | \n",
"
\n",
"\n",
"CurrentJobTitleSelect | \n",
"0 | \n",
"
\n",
"\n",
"TitleFit | \n",
"76 | \n",
"
\n",
"\n",
"CurrentEmployerType | \n",
"52 | \n",
"
\n",
"\n",
"MLToolNextYearSelect | \n",
"121 | \n",
"
\n",
"\n",
"MLMethodNextYearSelect | \n",
"157 | \n",
"
\n",
"\n",
"LanguageRecommendationSelect | \n",
"99 | \n",
"
\n",
"\n",
"FormalEducation | \n",
"0 | \n",
"
\n",
"\n",
"MajorSelect | \n",
"375 | \n",
"
\n",
"\n",
"FirstTrainingSelect | \n",
"3 | \n",
"
\n",
"\n",
"CompensationAmount | \n",
"0 | \n",
"
\n",
"\n",
"CompensationCurrency | \n",
"0 | \n",
"
\n",
"\n",
"JobSatisfaction | \n",
"10 | \n",
"
\n",
"\n",
"
\n",
"
"
],
"text/plain": [
" 0\n",
"GenderSelect 0\n",
"Country 0\n",
"Age 0\n",
"EmploymentStatus 0\n",
"CodeWriter 0\n",
"CurrentJobTitleSelect 0\n",
"TitleFit 76\n",
"CurrentEmployerType 52\n",
"MLToolNextYearSelect 121\n",
"MLMethodNextYearSelect 157\n",
"LanguageRecommendationSelect 99\n",
"FormalEducation 0\n",
"MajorSelect 375\n",
"FirstTrainingSelect 3\n",
"CompensationAmount 0\n",
"CompensationCurrency 0\n",
"JobSatisfaction 10"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Your Code\n",
"display(pd.DataFrame(df_demog.isna().sum()))"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "MclqalahEVm-"
},
"source": [
"
\n",
"\n",
"**Code**: \n",
" Select the users whose current job title is 'Data Scientist', and store into variable df_demog_ds \n",
"\n",
"
\n",
" \n",
"**Report**: \n",
" **1.0.B** Please include your result of `how many Data Scientists?' into your report, with proper section title '1.0.B'.\n",
"
\n",
"
\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"colab_type": "code",
"id": "sjdZZOc8ot2g",
"outputId": "25bd7d78-fc76-47ab-87a7-5abcfc6c40e6"
},
"outputs": [
{
"data": {
"text/plain": [
"(1263, 17)"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Your code\n",
"\n",
"df_demog_ds = df_demog[df_demog.CurrentJobTitleSelect.isin([\"Data Scientist\"])]\n",
"display(df_demog_ds.shape)"
]
},
{
"cell_type": "markdown",
"metadata": {
"_cell_guid": "3e161447-2816-45ec-872f-3a20da79c042",
"_uuid": "d6bdc03f0c63a08754efc13378661dc986d2bcb8",
"colab_type": "text",
"id": "iuhutBLOot5O"
},
"source": [
"### 1.1. Education\n",
"
\n",
"***\n",
"In data scientists job, education is important. Is it reasonable to ask data scientists to have a Master's or Doctoral degree? Let's find out. \n"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "yHyeeZvDot5Q"
},
"source": [
"
\n",
"\n",
"**Code**: \n",
" Plot and display as text output the number and percentage of data scientist with each type of formal education. \n",
"\n",
"
\n",
" \n",
"**Report**: \n",
" **1.1.A** Please include your running result of this coding task into your report, with proper section title '1.1.A'.\n",
"
\n",
"\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 233
},
"colab_type": "code",
"id": "lRXfdfvgot5S",
"outputId": "cccbd37f-6b78-4fcf-eb0e-8534705dbb53"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
"\n",
"\n",
" | \n",
"count | \n",
"percentage | \n",
"
\n",
"\n",
"\n",
"\n",
"Master's degree | \n",
"635 | \n",
"50.277118 | \n",
"
\n",
"\n",
"Doctoral degree | \n",
"326 | \n",
"25.811560 | \n",
"
\n",
"\n",
"Bachelor's degree | \n",
"252 | \n",
"19.952494 | \n",
"
\n",
"\n",
"Professional degree | \n",
"25 | \n",
"1.979414 | \n",
"
\n",
"\n",
"Some college/university study without earning a bachelor's degree | \n",
"19 | \n",
"1.504355 | \n",
"
\n",
"\n",
"I did not complete any formal education past high school | \n",
"6 | \n",
"0.475059 | \n",
"
\n",
"\n",
"
\n",
"
"
],
"text/plain": [
" count percentage\n",
"Master's degree 635 50.277118\n",
"Doctoral degree 326 25.811560\n",
"Bachelor's degree 252 19.952494\n",
"Professional degree 25 1.979414\n",
"Some college/university study without earning a... 19 1.504355\n",
"I did not complete any formal education past hi... 6 0.475059"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Your code\n",
"display(pd.merge(df_demog_ds.FormalEducation.value_counts(),\n",
" df_demog_ds.FormalEducation.value_counts(normalize=True)*100,\n",
" left_index=True,\n",
" right_index=True).rename(columns={\n",
" \"FormalEducation_x\": \"count\",\n",
" \"FormalEducation_y\": \"percentage\"\n",
" }))"
]
},
{
"cell_type": "markdown",
"metadata": {
"_cell_guid": "551f7dba-71d3-4f77-8852-fce4f789d644",
"_uuid": "31449fb18bfea68bb723b010b78dcab6c8fe5439",
"colab_type": "text",
"id": "K-yMEEFLot7P"
},
"source": [
"### 1.2. Salary\n",
"
\n",
"\n",
"Data science is considered a very well paying role, let's find out the salary information. Since all of the respondents did not come from one country, we can assume that they gave their salaries in their countries currency. We have filtered the data for you and provided exchange rates in a file called *ConversionRates.csv* which should already be imported. \n",
"\n",
"First of all, you need to merge the multiple choice data with the *ConversionRates.csv* by using the compensation currency and originCountry respectively. And then you will need to multiply the compensation amount with exchangeRateAUS to have the Australian dollors."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 141
},
"colab_type": "code",
"id": "BZaQ7vykot7U",
"outputId": "28731e36-d93b-4f88-d4df-9686e098f3a7"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"C:\\Users\\Kanish\\anaconda3\\lib\\site-packages\\pandas\\core\\generic.py:5303: SettingWithCopyWarning: \n",
"A value is trying to be set on a copy of a slice from a DataFrame.\n",
"Try using .loc[row_indexer,col_indexer] = value instead\n",
"\n",
"See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
" self[name] = value\n"
]
}
],
"source": [
"# Your code\n",
"conversionRates = pd.read_csv('ConversionRates.csv')\n",
"\n",
"df_demog_ds.CompensationAmount = pd.merge(\n",
" df_demog_ds,\n",
" conversionRates,\n",
" left_on='CompensationCurrency',\n",
" right_on='originCountry',\n",
" how='left'\n",
").exchangeRate.multiply(\n",
" df_demog_ds.CompensationAmount.to_list(),\n",
" axis='index'\n",
")"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "6MYDXU6dot7T"
},
"source": [
"
\n",
"\n",
"**Code**: \n",
"Use the codes for each country to merge the files so that you can convert the salary data to Australian Dollars (AUD). Print out the maximum and median salary in AUD. Hint: think about what data type you have.\n",
" \n",
"
\n",
" \n",
"**Report**: \n",
" **1.2.A** In your report's section '1.2.A', answer what is the maximum and median salary in AUD.\n",
"
\n",
"\n",
"\n",
"
\n"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "tyMNN-r3Jyjc"
},
"outputs": [
{
"data": {
"text/plain": [
"'Maximum salary: 400000.000000'"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Your Code\n",
"display(\"Maximum salary: %f\" % df_demog_ds.CompensationAmount.max())"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "nA9JygJ2ot7v"
},
"outputs": [
{
"data": {
"text/plain": [
"'Median salary: 65770.430000'"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Your code\n",
"display(\"Median salary: %f\" % df_demog_ds.CompensationAmount.median())"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "kAtIFQgxMcR9"
},
"source": [
"
\n",
"\n",
"**Code**: \n",
"Plot a boxplot of the Australian respondents salary distribution. Print out the maximum and median salaries for Australian repsondnts.\n",
"\n",
" \n",
"
\n",
" \n",
"**Report**: \n",
" **1.2.B** In your report's section '1.2.B', answer what is the maximum and median salary in AUD for Australian respondents, and also include your plotted boxplot of this coding task into your report. \n",
"
\n",
"\n",
"\n",
"
\n"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "44a4HBqvMb_N"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"