14. Mo’ Data, Mo’ Problem
‘데이터가 많으니까 다 될거야!’
일관적 스몰데이터 >>>> 비일관적 빅데이터
15. Mo’ Data, Mo’ Problem
‘데이터가 많으니까 다 될거야!’
일관적 스몰데이터 >>>> 비일관적 빅데이터
16. Mo’ Data, Mo’ Problem
‘데이터가 많으니까 다 될거야!’
일관적 스몰데이터 >>>> 비일관적 빅데이터
불행히도 저는 오른쪽…
17. Mo’ Data, Mo’ Problem – 책임회피
사실 이 문제는
데이터 수집 방식에 원인이 있습니다.
18. How to collect my data
누굴 만났는지 데이터는 자동입력이 불가능하기 때문에 제가 직접 입력합니다
제가 알아서 일관적으로 잘 입력하면 좋았겠지만.
이승훈
이벤트 발생시, 직접 입력
(날짜, 분류, 사람들)
19. How to collect my data - 다중인격편
작년의 나, 지난 달의 나, 어제의 나는 각자
같은 의미를 가진 것을 다르게 입력합니다
이승훈
(2015-2-14, 술(or 야식), 친구1, 친구2)
이벤트 발생시, 직접 입력
(날짜, 분류, 사람들)
(2015-2-13, 술_보드카, 친구1’, 친구2)
(2015-2-12, 야식, 친구1’, 친구2)
(2015-2-14, 맥주, 친구1’’, 친구2)
20. 이상적인 상황
만약 데이터가 아래처럼 되어 있으면, 바로 분석만 하면 됩니다.
특히, 계층구조를 따라가며 다양한 층위에서 분석할 수 있죠
만남
저녁아침 점심 술 기타
이상적인 데이터
술_맥주 술_소주 술_기타
21. 실제 상황(삐뽀삐뽀)
Level-of-depth 가 아주 messy합니다
(종류도 57개)
실제 데이터
만남
저녁아침 점심 야식(or 술)
야식
술_맥주 술_소주
삼겹살 디저트 홍차 커피 아이스크림
간식빵 팥빙수
22. 실제 상황, 응급 처치
아주 다행히도, 상위 8개의 카테고리가 전체의 94%를 차지하고 있어
상위 카테고리에 대해서만 전처리를 했습니다.
실제 데이터
만남
저녁아침 점심 야식(or 술)
야식
술_맥주 술_소주
삼겹살 디저트 홍차 커피 아이스크림
간식빵 팥빙수
26. 예를 들어서.
결과: “이승훈이 이주석을 제일 많이 만난다”
If you know:
이주석과 이승훈은 같은 연구실이다
Obvious
“대학원생이 연구실 사람 많이
만나는 건 당연한 거 아님?”
27. 예를 들어서.
결과: “이승훈이 이주석을 제일 많이 만난다”
If you know:
이주석과 이승훈은 같은 연구실이다
If you don’t know:
이주석과 이승훈은 같은 연구실이다
Obvious
“대학원생이 연구실 사람 많이
만나는 건 당연한 거 아님?”
28. 예를 들어서.
결과: “이승훈이 이주석을 제일 많이 만난다”
If you know:
이주석과 이승훈은 같은 연구실이다
If you don’t know:
이주석과 이승훈은 같은 연구실이다
Obvious
“대학원생이 연구실 사람 많이
만나는 건 당연한 거 아님?”
개별 사람에 대한 context modeling이 필요함
29. Context modelling
그래서 하나하나 제가 입력했습니다…
다만, 전체 사람의 수(unique set)의 수는 600명이 넘고,
상위 159명이 전체의 88%를 차지하기 때문에,
상위 159명에 대해서만 컨텍스트를 작성했습니다.
31. 아마도, 이미 예측하셨겠지만.
앞 부분이 이렇게 긴 것은
이 발표가 사두지미(뱀머리지렁이꼬리) 형식이기 때문이죠
이제 분석결과를 보여드리겠습니다.
32. 질문1: 케빈 베이컨 문제.
“지구에 있는 모든 사람들은
최대 6단계 이내에서 서로 아는 사람으로 연결된다”
정말 그럴까요?
해봅시다.
33. 질문1: 케빈 베이컨 문제.
가정:
- 같은 만남을 가진 집단 (a, b, c)에는 (a, b), (b, c), (c, a)라는 관계가 성립
- weight, directionality를 무시
- 또한 ‘이승훈’이 없는 세상이라고 가정(무섭..ㅠㅠ)
- 당연하지만, 이승훈이 있을 경우, 최대 2 단계면 모두 연결됨
Anyone Anyone
me
34. 질문1: 케빈 베이컨 문제.
여러분이 보기 편하시도록 그림을 그렸습니다.
>>> import networkx as nx
>>> G = nx.Graph(list(set([edge for edge in edge_lst])))
>>> plt.figure()
>>> nx.draw_shell(G)
>>> plt.show()
이를 통해 우리는 모든 사람이 6단계로 연결된다는 것을 알 수 있습니다.
35. 질문1: 케빈 베이컨 문제.
여러분이 보기 편하시도록 그림을 그렸습니다.
>>> import networkx as nx
>>> G = nx.Graph(list(set([edge for edge in edge_lst])))
>>> plt.figure()
>>> nx.draw_shell(G)
>>> plt.show()
이를 통해 우리는 모든 사람이 6단계로 연결된다는 것을 알 수 있습니다.
(잘보면 보여요)
36. 질문1: 케빈 베이컨 문제.
3 가지의 connected component가 나오는 것을 알 수 있습니다.
꼼꼼히 보면, 집단1: 학교 사람(친구 등), 집단2: 훈련소, 집단3: 가족
>>> subG_lst = [subG for subG in nx.connected_component_subgraphs(G)]
>>> print()
>>> for subG in subG_lst:
print('graph size:', len(subG.nodes()), ', path:', max_shortest_path_and_its_length( subG ) )
>>>
graph size: 146 , path: (['p119', 'p39', 'p106', 'p96', 'p63', 'p32', 'p81'], 6)
graph size: 9 , path: (['p25', 'p20'], 1)
graph size: 2 , path: (['p29', 'p14'], 1)
37. 질문1: 케빈 베이컨 문제.
‘친구’집단의 longest shortest path
p119 p39 p106 p96 p63 p32 p81
친형의 친구 같은 동아리 같은 학과 같은 동아리 독서모임 독서모임
방글라데시에서
일하는 영업사원
포항공대 교직원
되…되잖아…
38. 질문1: 케빈 베이컨 문제.
또한, 실제로 존재하는 관계가 있습니다, 이를 고려하면, 더 가까워지겠죠.
친구
가족 훈련소
me
p7
p14
p24
p13
39. 질문1: 케빈 베이컨 문제.
다만, 지금까지 분석한 것은 이미 필터링된 사람들을 대상으로 합니다.
그렇다면,
전체 데이터를 대상으로 해보면 어떤 결과가 나올까요?
그래도 케빈베이컨 수가 유지될까요?
40. 질문1: 케빈 베이컨 문제.
총 8개의 component로 구분되긴 하지만,
가장 큰 graph의 경우 544개의 사이즈, 7단계를 거치면, 다 만난다는 것을 알 수 있네요
그럼 여기에, 제가 아는 edge들 새로 7개를 추가해서 돌려보겠습니다.
>>> for i, sub_G in enumerate(nx.connected_component_subgraphs(total_G)):
temp = max_shortest_path_and_its_length(sub_G)
print("subGraph "+str(i)+" size:", len(sub_G), "max shortest path:", temp[1])
>>>
subGraph 0 size: 544 max shortest path: 7
subGraph 1 size: 9 max shortest path: 1
subGraph 2 size: 10 max shortest path: 3
subGraph 3 size: 9 max shortest path: 3
subGraph 4 size: 14 max shortest path: 3
subGraph 5 size: 3 max shortest path: 1
subGraph 6 size: 4 max shortest path: 2
subGraph 7 size: 2 max shortest path: 1
41. 질문1: 케빈 베이컨 문제.
component를 많이 줄이긴 했지만, 그래도 닿지 못하는 사람들이 있습니다.
나머지 component는
<여행에서 만난 사람들1>, <여행에서 만난 사람들2>, <업무 회의로 만난 사람>으로 정리됩니다.
>>> total_G.add_edges_from(new_edges)
>>> for i, sub_G in enumerate(nx.connected_component_subgraphs(total_G)):
temp = max_shortest_path_and_its_length(sub_G)
print("subGraph "+str(i)+" size:", len(sub_G), "max shortest path:", temp[1])
>>>
subGraph 0 size: 567 max shortest path: 7
subGraph 1 size: 9 max shortest path: 3
subGraph 2 size: 16 max shortest path: 3
subGraph 3 size: 3 max shortest path: 1
42. 질문1: 케빈 베이컨 문제.
전체를 묶지 못했고, 또 거리가 커지기는 했지만
그래도, 가장 큰 컴퍼넌트에서 보면, 꽤 먼 사람이 이어지기는 합니다
p410 p13 p67 p85 p8 p15 p30 p321
포항 단편
영화 감독
천안 사는
공무원 준비생
그래도, 이정도면 좀 유의미하지 않나? 싶어요
케빈베이컨 짝짝짝
44. 질문2: 남녀 비율은 어떻게 되나?
찍어봅니다
>>> from functools import reduce
>>> import seaborn as sns
>>> def plot_percent_as_pie(input_lst):
labels = [x[0] for x in Counter(input_lst).most_common()]
values = [round(x[1]/len(input_lst), 3) for x in Counter(input_lst).most_common()]
patches, texts, autotexts = plt.pie(values, labels=["male", "female"], startangle=90, counterclock=False,
shadow=True, explode=(0, 0.1), autopct='%1.1f%%')
texts[0].set_fontsize(20)
texts[1].set_fontsize(20)
autotexts[0].set_fontsize(30)
autotexts[1].set_fontsize(30)
plt.show()
>>> a = reduce(lambda x, y: x+y, copy_meal_df['friend'])
>>> plot_percent_as_pie( [p_df.loc[x].g for x in list(set(a))] )
51. 아침/점심/저녁/야식+술 로 구분해서 차이를 확인하겠습니다.
우선, 전체를 대상으로 한 순위부터 보시죠
우선 전체를 대상으로 한 순위부터 보시죠
질문3: 카테고리별로 만나는 사람이 다른가?
52. 전체 빈도 순위
g c1 dept CCs
p0 남성 포스텍 산업경영공학과 [연구실사람]
p1 남성 포스텍 산업경영공학과 [연구실사람]
p2 남성 포스텍 산업경영공학과 [연구실사람]
p3 남성 포스텍 산업경영공학과 [연구실사람]
p4 남성 포스텍 산업경영공학과 [연구실사람, 5분반]
p5 남성 포스텍 산업경영공학과 [연구실사람]
p6 남성 포스텍 산업경영공학과 [연구실사람]
p7 남성 포스텍 화학공학과 [준비위원회]
P8 남성 포스텍 신소재공학과 [피펑크, 준비위원회]
P9 남성 포스텍 산업경영공학과 [연구실사람]
- 상위 10명이 전체 만남의 58.4%를 차지함
- 상위 10명이 모두 같은 학교
- 8명은 같은 학과, 연구실
- 2명은 학부 친구
‘연구실 사람을 제일 많이 만난다’
라는 너무도 당연한 결론
54. 시간대별 만나는 사람 변화
<아침>
P14
P23
P24
P19
P18
P21
P25
P20
P22
P26
<점심>
P1
P0
P3
P2
P5
♥
P4
P10
P9
P34
<저녁>
P1
P2
P3
P0
P8
P6
P7
P5
P4
P14
<야식+술>
P7
P8
P2
P16
P0
P27
P12
P13
P5
P4
Out of 10 Out of 10 Out of 10 Out of 10
… … … …
연구실 사람 친구 가족 훈련소
65. Meta-data Management
데이터가 많을수록, 데이터 간의 관계와 특성을 고려하는 것이 중요.
그렇지 않을 경우, 기대 만큼의 성과를 얻기 어려울 수 있음.
(특히, 오랫동안 쌓인 데이터에서는 concept-drift가 발생하기 쉬움)
또한, 카테고리 데이터의 경우는 level-of-depth,
층위 별 span-of-control을 꾸준하게 관리해주는 것이 중요함
(Data consistency or constraint management)
66. Analytic-orientation
데이터를 모으는 것도 물론 중요하지만,
향후 해당 데이터를 어떻게 분석할 지에 대해 충분히 고려한 다음
(analytic-oriented) Data schema를 설계하는 것이 좋다.
그래야 향후 발생할 수 있는 문제점 및 데이터 전처리 비용이 감소함
다시 말하지만, (나처럼) 그냥 모으면 답이 없다