Data Science FAQ | https://www.kaggle.com/rounakbanik/data-science-faq
Novice to Grandmaster | https://www.kaggle.com/ash316/novice-to-grandmaster
-복잡한 코드 리뷰 형식으로
-더보기에 jupyter노트북으로 했던거 있음
Q1. 파이썬과 R중 뭘 배워야 할까
data = mcq[(mcq['CurrentJobTitleSelect'].notnull()) & (
(mcq['LanguageRecommendationSelect'] == 'Python') | (
mcq['LanguageRecommendationSelect'] == 'R'))]
print(data.shape)
plt.figure(figsize=(8, 10))
sns.countplot(y='CurrentJobTitleSelect',
hue='LanguageRecommendationSelect',
data=data)
- data에 CurrentJobTitleSelect가 null이 아니고 LanguageRecommendationSelect가 Python이나 R인것을 넣는다.
- countplot으로 y축은 CurrentJobTitleSelect로 hue는 LanguageRecommendationSelect로 하여 그려준다
Q3. 어디에서 데이터 사이언스를 배워야 할까?
mcq['LearningPlatformSelect'] = mcq['LearningPlatformSelect'].astype('str').apply(lambda x: x.split(','))
s = mcq.apply(
lambda x: pd.Series(x['LearningPlatformSelect']),
axis=1).stack().reset_index(level=1, drop=True)
s.name = 'platform'
- apply()
- DataFrame.apply(func, axis=0, broadcast=None, raw=False, reduce=None, result_type=None, args=(), **kwds)
- 데이터 프레임의 행이나 열에 대해서 func을 적용시켜 데이터를 바꿔주는 메서드
- 한 줄로 되어있는 응답을 각 원소별로 나눠서 리스트에 저장. split함수는 string에서만 사용가능. 원소별로 나누기 위해서 split함수를 사용해야함. 이때 대답 안한 사람의 데이터가 NaN이 되고 이는 float로 인식된다. 따라서 apply()에 나오는 lambda가 split(',')을 사용하는데 astype('str')로 컬럼 내의 데이터를 전부 string으로 바꿔줘야함.
- mcq.apply(
lambda x: pd.Series(x['LearningPlatformSelect']),
axis=1)- mcq의 LearningPlatformSelect컬럼 중, axis가 1인 즉, 열의 값을 선택해서 내부의 데이터를 Series 데이터 구조로 바꾼다.(리스트의 원소값을 분리해서 한 행에 하나의 데이터만 들어가도록 데이터 처리)
- mcq.apply(
lambda x: pd.Series(x['LearningPlatformSelect']),
axis=1).stack()- 그렇게 나온 값을 stack()을 이용해서 2 level의 데이터 프레임으로 바꿔준다. 여기서 2레벨이라는 것은 인덱스를 2개 사용해서 2차원 배열 구조를 시각화 한 것을 말한다. stack() 메서드를 사용하면 0번 인덱스에 저장되었던 값이 세부항목을 리스트가 아닌 리스트에 달려있던 인덱스 넘버로 출력되는 것을 알 수 있다.
- mcq.apply(
lambda x: pd.Series(x['LearningPlatformSelect']),
axis=1).stack().reset_index(level=1, drop=True)- level 인덱스 중, 하나를 없애서 보기 편하게 바꾼다. 2 레벨의 데이터 프레임의 인덱스 중, level=1의 인덱스를 drop시킨다.
- s에 컬럼 이름을 platform이라고 이름지어준다.
plt.figure(figsize=(6,8))
data = s[s != 'nan'].value_counts().head(15)
sns.barplot(y=data.index, x=data)
- s에서 s가 nan인 값을 제외하고 각 원소가 몇 개 있는지 갯수를 센다.
- data에서는 s에서 데이터로 사용된 것이 index로 들어가게 되므로 y축에는 data.index, x축에는 data값을 위치시킨다.
use_features = [x for x in mcq.columns if x.find(
'LearningPlatformUsefulness') != -1]
- mcq의 컬럼 중, LearningPlatformUsefulness가 들어간 것들을 찾아서 use_features 리스트에 넣는다.
# 학습플랫폼과 유용함에 대한 연관성을 살펴본다.
fdf = {} # 데이터를 담을 사전 타입의 객체를 생성한다.
for feature in use_features:
a = mcq[feature].value_counts() # use_features에서 담긴 각 항목들의 갯수를 센다.
a = a/a.sum() # 퍼센트로 표현한다.(비율로 표현)
fdf[feature[len('LearningPlatformUsefulness'):]] = a
fdf = pd.DataFrame(fdf).transpose().sort_values(
'Very useful', ascending=False)
# 학습플랫폼들이 얼마나 유용한지에 대한 상관관계를 그려본다.
plt.figure(figsize=(10,10))
sns.heatmap(
fdf.sort_values(
"Very useful", ascending=False), annot=True)
- fdf[feature[len('LearningPlatformUsefulness'):]] = a
- 예를 들면, fdf에 LearningPlatformUsefulnessArxiv의 LearningPlatformUsefulness을 뺀 것을 key로, a를 value로 한다. =>Arxiv가 key가 됨
- 행에 '유용하지 않다.', '조금 유용하다.', '많이 유용하다.'가 있고 'fdf 데이터'열에 fdf{} 키의 값이 배치되었다.
- fdf = pd.DataFrame(fdf).transpose().sort_values(
'Very useful', ascending=False)- 위에서 나온 행과 열의 위치를 바꿔주기 위해서 transpose()를 하고 Very useful컬럼을 내림차순으로 정렬한다. Very useful에 대한 내림차순 정렬을 하기 위해서 변형을 한 것이다
- Very Useful에 대해 내림차순 정렬된 히트맵을 그린다.
더보기
In [1]:
#노트북 안에서 그래프를 그리기 위해
%matplotlib inline
# Import the standard Python Scientific Libraries
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
# Suppress Deprecation and Incorrect Usage Warnings
import warnings
warnings.filterwarnings('ignore')
In [33]:
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:100% !important; }</style>"))
#창 맞추기위함
In [3]:
question = pd.read_csv('data/schema.csv')
question.shape
Out[3]:
(290, 3)
In [4]:
mcq = pd.read_csv('data/multipleChoiceResponses.csv', encoding="ISO-8859-1", low_memory=False)
mcq.shape
Out[4]:
(16716, 228)
Q1. 파이썬과 R중 뭘 배워야 할까¶
In [5]:
sns.countplot(y='LanguageRecommendationSelect', data=mcq)
Out[5]:
<AxesSubplot:xlabel='count', ylabel='LanguageRecommendationSelect'>
In [6]:
# 현재 하고 있는 일
sns.countplot(y=mcq['CurrentJobTitleSelect'])
Out[6]:
<AxesSubplot:xlabel='count', ylabel='CurrentJobTitleSelect'>
In [7]:
# 현재 하고 있는 일에 대한 전체 응답수
mcq[mcq['CurrentJobTitleSelect'].notnull()]['CurrentJobTitleSelect'].shape
Out[7]:
(11830,)
In [8]:
# 현재 하고 있는 일에 대한 응답을 해준 사람 중 Python과 R을 사용하는 사람
# 응답자들이 실제 업무에서 어떤 언어를 주로 사용하는지 볼 수 있다.
data = mcq[(mcq['CurrentJobTitleSelect'].notnull()) & (
(mcq['LanguageRecommendationSelect'] == 'Python') | (
mcq['LanguageRecommendationSelect'] == 'R'))]
print(data.shape)
plt.figure(figsize=(8, 10))
sns.countplot(y='CurrentJobTitleSelect',
hue='LanguageRecommendationSelect',
data=data)
(7158, 228)
Out[8]:
<AxesSubplot:xlabel='count', ylabel='CurrentJobTitleSelect'>
Q2. 데이터 사이언스 분야에서 앞으로 크게 주목받을 것은 무엇일까?¶
데이터사이언스 툴¶
In [11]:
mcq_ml_tool_count = pd.DataFrame(
mcq['MLToolNextYearSelect'].value_counts())
mcq_ml_tool_percent = pd.DataFrame(
mcq['MLToolNextYearSelect'].value_counts(normalize=True))
mcq_ml_tool_df = mcq_ml_tool_count.merge(
mcq_ml_tool_percent, left_index=True, right_index=True).head(20)
mcq_ml_tool_df.columns = ['응답 수', '비율']
mcq_ml_tool_df
Out[11]:
응답 수 | 비율 | |
---|---|---|
TensorFlow | 2621 | 0.238316 |
Python | 1713 | 0.155756 |
R | 910 | 0.082742 |
Spark / MLlib | 755 | 0.068649 |
Hadoop/Hive/Pig | 417 | 0.037916 |
Other | 407 | 0.037007 |
Amazon Machine Learning | 392 | 0.035643 |
Jupyter notebooks | 358 | 0.032551 |
I don't plan on learning a new tool/technology | 341 | 0.031006 |
Google Cloud Compute | 296 | 0.026914 |
Amazon Web services | 273 | 0.024823 |
Julia | 222 | 0.020185 |
Microsoft Azure Machine Learning | 220 | 0.020004 |
DataRobot | 220 | 0.020004 |
IBM Watson / Waton Analytics | 194 | 0.017640 |
C/C++ | 186 | 0.016912 |
Tableau | 150 | 0.013639 |
SQL | 138 | 0.012548 |
Java | 116 | 0.010547 |
MATLAB/Octave | 115 | 0.010456 |
In [12]:
data = mcq['MLToolNextYearSelect'].value_counts().head(20)
sns.barplot(y=data.index, x=data)
Out[12]:
<AxesSubplot:xlabel='MLToolNextYearSelect'>
다음 해에 주목할 만한 Data Science Methods¶
In [14]:
data = mcq['MLMethodNextYearSelect'].value_counts().head(15)
sns.barplot(y=data.index, x=data)
Out[14]:
<AxesSubplot:xlabel='MLMethodNextYearSelect'>
Q3. 어디에서 데이터 사이언스를 배워야 할까?¶
In [15]:
mcq['LearningPlatformSelect'] = mcq['LearningPlatformSelect'].astype('str').apply(lambda x: x.split(','))
s = mcq.apply(
lambda x: pd.Series(x['LearningPlatformSelect']),
axis=1).stack().reset_index(level=1, drop=True)
s.name = 'platform'
In [16]:
plt.figure(figsize=(6,8))
data = s[s != 'nan'].value_counts().head(15)
sns.barplot(y=data.index, x=data)
Out[16]:
<AxesSubplot:xlabel='platform'>
In [17]:
# 설문내용과 누구에게 물어봤는지를 찾아봄
qc = question.loc[question[
'Column'].str.contains('LearningCategory')]
print(qc.shape)
qc
(7, 3)
Out[17]:
Column | Question | Asked | |
---|---|---|---|
91 | LearningCategorySelftTaught | What percentage of your current machine learni... | All |
92 | LearningCategoryOnlineCourses | What percentage of your current machine learni... | All |
93 | LearningCategoryWork | What percentage of your current machine learni... | All |
94 | LearningCategoryUniversity | What percentage of your current machine learni... | All |
95 | LearningCategoryKaggle | What percentage of your current machine learni... | All |
96 | LearningCategoryOther | What percentage of your current machine learni... | All |
97 | LearningCategoryOtherFreeForm | What percentage of your current machine learni... | All |
In [18]:
use_features = [x for x in mcq.columns if x.find(
'LearningPlatformUsefulness') != -1]
In [19]:
# 학습플랫폼과 유용함에 대한 연관성을 살펴본다.
fdf = {}
for feature in use_features:
a = mcq[feature].value_counts()
a = a/a.sum()
fdf[feature[len('LearningPlatformUsefulness'):]] = a
fdf = pd.DataFrame(fdf).transpose().sort_values(
'Very useful', ascending=False)
# 학습플랫폼들이 얼마나 유용한지에 대한 상관관계를 그려본다.
plt.figure(figsize=(10,10))
sns.heatmap(
fdf.sort_values(
"Very useful", ascending=False), annot=True)
Out[19]:
<AxesSubplot:>
In [20]:
# 유용함의 정도를 각 플랫폼별로 그룹화 해서 본다.
fdf.plot(kind='bar', figsize=(20,8),
title="Usefullness of Learning Platforms")
plt.xticks(rotation=60, ha='right')
Out[20]:
(array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17]),
[Text(0, 0, 'Projects'),
Text(1, 0, 'Courses'),
Text(2, 0, 'SO'),
Text(3, 0, 'Kaggle'),
Text(4, 0, 'Tutoring'),
Text(5, 0, 'Textbook'),
Text(6, 0, 'College'),
Text(7, 0, 'Arxiv'),
Text(8, 0, 'Documentation'),
Text(9, 0, 'Communities'),
Text(10, 0, 'TradeBook'),
Text(11, 0, 'Blogs'),
Text(12, 0, 'YouTube'),
Text(13, 0, 'Friends'),
Text(14, 0, 'Company'),
Text(15, 0, 'Conferences'),
Text(16, 0, 'Newsletters'),
Text(17, 0, 'Podcasts')])
In [21]:
cat_features = [x for x in mcq.columns if x.find(
'LearningCategory') != -1]
cat_features
Out[21]:
['LearningCategorySelftTaught',
'LearningCategoryOnlineCourses',
'LearningCategoryWork',
'LearningCategoryUniversity',
'LearningCategoryKaggle',
'LearningCategoryOther']
In [22]:
cdf = {}
for feature in cat_features:
cdf[feature[len('LearningCategory'):]] = mcq[feature].mean()
# 파이차트를 그리기 위해 평균 값을 구해와서 담아준다.
cdf = pd.Series(cdf)
cdf
Out[22]:
SelftTaught 33.366771
OnlineCourses 27.375514
Work 15.217593
University 16.988607
Kaggle 5.531434
Other 1.795940
dtype: float64
In [23]:
# 학습 플랫폼 별 도움이 되는 정도를 그려본다.
plt.pie(cdf, labels=cdf.index,
autopct='%1.1f%%', shadow=True, startangle=140)
plt.axis('equal')
plt.title("Contribution of each Platform to Learning")
plt.show()
Q4. 데이터과학을 위해 높은 사양의 컴퓨터가 필요한가요?¶
In [24]:
# 설문내용과 누구에게 물어봤는지를 찾아봄
qc = question.loc[question[
'Column'].str.contains('HardwarePersonalProjectsSelect')]
print(qc.shape)
qc
(1, 3)
Out[24]:
Column | Question | Asked | |
---|---|---|---|
74 | HardwarePersonalProjectsSelect | Which computing hardware do you use for your p... | Learners |
In [25]:
mcq[mcq['HardwarePersonalProjectsSelect'].notnull()][
'HardwarePersonalProjectsSelect'].shape
Out[25]:
(4206,)
In [27]:
mcq['HardwarePersonalProjectsSelect'
] = mcq['HardwarePersonalProjectsSelect'
].astype('str').apply(lambda x: x.split(','))
s = mcq.apply(lambda x:
pd.Series(x['HardwarePersonalProjectsSelect']),
axis=1).stack().reset_index(level=1, drop=True)
s.name = 'hardware'
In [28]:
s = s[s != 'nan']
In [29]:
pd.DataFrame(s.value_counts())
Out[29]:
hardware | |
---|---|
Basic laptop (Macbook) | 2246 |
Azure | 669 |
GCE ...) | 669 |
Laptop + Cloud service (AWS | 669 |
Gaming Laptop (Laptop + CUDA capable GPU) | 641 |
Traditional Workstation | 527 |
Laptop or Workstation and local IT supported servers | 445 |
GPU accelerated Workstation | 416 |
Workstation + Cloud service | 174 |
Other | 147 |
Q5. 데이터 사이언스 공부에 얼마나 많은 시간을 사용하는지?¶
In [30]:
plt.figure(figsize=(6, 8))
sns.countplot(y='TimeSpentStudying',
data=mcq,
hue='EmploymentStatus'
).legend(loc='center left',
bbox_to_anchor=(1, 0.5))
Out[30]:
<matplotlib.legend.Legend at 0x2613cfe9d00>
In [31]:
full_time = mcq.loc[(mcq['EmploymentStatus'] == 'Employed full-time')]
print(full_time.shape)
looking_for_job = mcq.loc[(
mcq['EmploymentStatus'] == 'Not employed, but looking for work')]
print(looking_for_job.shape)
(10897, 228)
(2110, 228)
In [32]:
figure, (ax1, ax2) = plt.subplots(ncols=2)
figure.set_size_inches(12,5)
sns.countplot(x='TimeSpentStudying',
data=full_time,
hue='EmploymentStatus', ax=ax1
).legend(loc='center right',
bbox_to_anchor=(1, 0.5))
sns.countplot(x='TimeSpentStudying',
data=looking_for_job,
hue='EmploymentStatus', ax=ax2
).legend(loc='center right',
bbox_to_anchor=(1, 0.5))
Out[32]:
<matplotlib.legend.Legend at 0x26141c517f0>
In [ ]: