Chapter6

중고등학생을 위한 머신러닝

Chapter 6: Dictionary와 그래프

우리는 이제 프로그래밍까지 공부하면서 훈련을 통해 자신이 생각하는 것을 컴퓨터로 구현해낼 수 있어요. 집합 그리고 List를 이용하여 그룹들을 나눠서 데이터가 무엇이 있는 지, 데이터가 얼마나 있는 지도 확인할 수 있죠. 그래서 오늘은 이러한 데이터들을 종합하여 저장한 후 그래프를 그리는 연습을 해보려고 해요.

In [1]:
import random
data=[]
for i in range(10000):
    data.append(random.randint(1,100))
In [2]:
names=set(data)
우리는 리스트에 있는 데이터들을 집합으로 나타내어 무엇이 있는 지를 Set에 저장하였어요. 그러면 이게 몇 개씩 있는 지 어떻게 알 수 있을까요? 먼저 집합을 참조하여 데이터를 불러와볼까요?
In [3]:
names[0]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-9963261f3259> in <module>()
----> 1 names[0]

TypeError: 'set' object does not support indexing
그러나, Set은 슬라이싱을 할 수 없기 때문에 슬라이싱을 하려면 이러한 집합을 슬라이싱이 가능한 List로 변환한 후 사용하는 게 일반적이요.
In [4]:
names=list(names)
In [5]:
names[0]
Out[5]:
1
그러면 for문을 사용하여 각 데이터가 몇 개 있는 지 살펴볼까요?
In [6]:
for i in names:
    if i <=10:
        print data.count(i)
    else: break
90
108
101
114
100
110
97
96
100
100

(편의상 열개만 불러왔어요). 그런데 나중에 데이터를 분석하기 위한 그래프를 그려야 하는데 이런식으로는 누가누군지 알 수가 없죠.

그래서 필요한 것이 Dictonary(사전)이에요

In [7]:
counts={}
for i in names:
    counts[i]=data.count(i)
In [8]:
print counts[1]
print counts[99]
90
93
딕셔너리는 이런식으로 집합의 원소를 참조하여 데이터를 불러내죠. 그럼 딕셔너리의 자주 쓰는 함수들을 살펴볼까요?
In [9]:
counts.keys()
Out[9]:
[1,
 2,
 3,
 4,
 5,
 6,
 7,
 8,
 9,
 10,
 11,
 12,
 13,
 14,
 15,
 16,
 17,
 18,
 19,
 20,
 21,
 22,
 23,
 24,
 25,
 26,
 27,
 28,
 29,
 30,
 31,
 32,
 33,
 34,
 35,
 36,
 37,
 38,
 39,
 40,
 41,
 42,
 43,
 44,
 45,
 46,
 47,
 48,
 49,
 50,
 51,
 52,
 53,
 54,
 55,
 56,
 57,
 58,
 59,
 60,
 61,
 62,
 63,
 64,
 65,
 66,
 67,
 68,
 69,
 70,
 71,
 72,
 73,
 74,
 75,
 76,
 77,
 78,
 79,
 80,
 81,
 82,
 83,
 84,
 85,
 86,
 87,
 88,
 89,
 90,
 91,
 92,
 93,
 94,
 95,
 96,
 97,
 98,
 99,
 100]

keys()는 집합 자체를 불러오는 기능이에요. 실행하면 우리가 아까 저장했었던 집합들이 나타나게 되죠. dictionary에서의 key는 데이터의 집합!

In [10]:
counts.values()
Out[10]:
[90,
 108,
 101,
 114,
 100,
 110,
 97,
 96,
 100,
 100,
 109,
 92,
 101,
 89,
 113,
 91,
 102,
 93,
 100,
 108,
 107,
 96,
 95,
 97,
 101,
 103,
 94,
 87,
 92,
 99,
 99,
 114,
 99,
 75,
 86,
 91,
 105,
 117,
 104,
 117,
 110,
 105,
 88,
 103,
 106,
 87,
 95,
 90,
 95,
 85,
 102,
 111,
 120,
 87,
 101,
 118,
 101,
 86,
 113,
 129,
 98,
 110,
 81,
 101,
 99,
 106,
 91,
 97,
 93,
 100,
 96,
 97,
 105,
 108,
 99,
 105,
 107,
 111,
 97,
 94,
 94,
 80,
 83,
 122,
 80,
 106,
 89,
 96,
 112,
 92,
 98,
 105,
 89,
 95,
 102,
 116,
 114,
 104,
 93,
 111]

values()는 집합의 개수를 나타내는 List에요. 위 데이터의 경우 1에서 100까지 각각 몇개씩 있는 지 나타내는 거죠. dictionary에서의 value는 집합의 원소 개수!

In [11]:
counts.get(99)
Out[11]:
93
get()은 집합의 원소가 무엇인 지 나타내는 함수에요.
In [12]:
1 in counts
Out[12]:
True
In [13]:
101 in counts
Out[13]:
False

in을 통해서 딕셔너리에 값이 있는 지 없는 지도 나타낼 수 있죠.

물론 딕셔너리의 key와 value에 문자형 리스트도 들어갈 수 있어요.

In [14]:
class1={'Boys':25,'girls':20}
In [15]:
class1vector={'number1':[170,50],'number2':[155,40]}
In [16]:
class1vector
Out[16]:
{'number1': [170, 50], 'number2': [155, 40]}

이런식으로 딕셔너리를 통해서 원하는 값들을 만들어낼 수도 있죠. 그러니, 딕셔너리에는 우리의 관심있는 데이터들이 모여있는 집합물이라고 할 수 있죠. 위의 class1에서는 남자가 여자가 몇명인지 궁금한 반면, class1vector에선 키와 몸무게를 저장했으니깐 말이죠.

In [17]:
import matplotlib.pyplot as plt
%matplotlib inline  
In [18]:
plt.bar(counts.keys(),counts.values())
plt.show()

이 그래프는 히스토그램이에요. 각 집합의 빈도수를 나타내서 사람들이 이해하기 쉽게 만드는거죠.

~에서

In [19]:
import pandas as pd
wine=pd.read_csv('https://ocw.mit.edu/courses/sloan-school-of-management/15-097-prediction-machine-learning-and-statistics-spring-2012/datasets/wine.csv',header=None)
In [20]:
Alcohol=list(wine.ix[:,0]);
Acid=list(wine.ix[:,1]);
proline=list(wine.ix[:,12])

~까지는 그냥 실행만 하세요~ 데이터를 리스트화시키는 작업일뿐이에요.

In [21]:
plt.scatter(Acid,proline,c=Alcohol)
plt.show()

이 그림 와인에서 산성과 프롤린의 관계를 찾아내려고 그린 산점도에요. 그룹은 알콜이 어느정도 들어강있느냐에따라 나누었구요.

In [23]:
items=set(Alcohol)
items=list(items)
howmany={}
for item in items:
    howmany[item]=Alcohol.count(item)

이렇게 되면 howmany라는 Alocohol이 얼만큼 있는 지 넣을 수 있겠죠?

In [24]:
plt.bar(howmany.keys(),howmany.values(),color=['red','green','blue'])
Out[24]:
<Container object of 3 artists>

데이터를 나타내는 기본 : Vector(벡터)

벡터라는 말이 갑자기 생소하게 나오니깐 무슨말인지 모르겠지만, 코드와 그림을 보면서 쉽게 이해해봐요.

In [25]:
%%html
<img src='http://cfile5.uf.tistory.com/image/03302733515503933FD919' width=300 height=300>
학생들 한 명 한 명마다 키, 몸무게, 가족의 수, 애완동물의 수를 조사한다고 해볼게요.
In [26]:
person1=[170,62,4,0];person2=[165,66,6,2];person3=[160,50,10,15]

위의 경우에는 값이 한 사람마다 우리에게 주는 정보가 4개씩 있다는 것을 알 수 있어요. 그리고 이를 나타내는 게 Vector(벡터)에요. 결국, 조사한 게 얼마냐에 따라서 벡터의 ,수가 정해지는거죠. 그리고 벡터의 값의 개수를 차원이라고 부르죠

In [27]:
%%html
<img src="http://3.bp.blogspot.com/_mkkVHG-vLEw/TD_hrvDTtDI/AAAAAAAAAas/3lIMonAZP6Y/s320/quad19.png" width=250 height=250>

그럼 사람들을 여러 명 조사해서 세로로 쌓게 되면 어떻게 될까요? 그리고 이러한 사각형(직사각형 혹은 정사각형)의 형태를 띈 데이터의 모임을 행렬이라고 부르죠 키,몸무게,가족의 수, 애완동물의 수를 조사하는 사람들을 100명 조사했다면, (100*4)개의 값이 있는 행렬이 되겠죠? 이를 100x4행렬이라고도 부르죠.

In [28]:
[person1,person2,person3]
Out[28]:
[[170, 62, 4, 0], [165, 66, 6, 2], [160, 50, 10, 15]]

만약 세명만 조사했다면 3x4행렬이라고 부르고요.

basic

이제 머신러닝을 공부하기 위한 기본이 되었어요.

파이썬을 통해서 웹스크래핑, 페이지 제작 등 많은 것을 할 수 있어요.

머신러닝 공부에 들어가기 앞서 모르는 게 있으면 단단히 더 공부하고 시작하세요!

그럼 이제 머신러닝이 뭔지 파헤쳐볼까요?

In [ ]: