Skip to main content
Quantify Myself – self사생활침해
Powered by Gong4.py
이승훈
저는 저를 정량화하는 것에 관심이 많습니다
어쩌다 이런 인간이 되어버렸는지 모르겠습니다.
물론 중요한 정량적 지표인 학점은 엉망진창입니다만…
저는 저를 정량화하는 것에 관심이 많습니다
어쩌다 이런 인간이 되어버렸는지 모르겠습니다.
정작 중요한 정량적 지표인 학점은 엉망진창입니다만…
이런 데이터들을 모으고 있습니다
- 만나는 사람들(식사, 술 등)
- 가계부
- 연구실에서 머무르는 시간(IFTTT이용)
이런 데이터들을 모으고 있습니다
- 만나는 사람들(식사, 술 등)
- 가계부
- 연구실에서 머무르는 시간(IFTTT이용)
오늘은 “만나는 사람들“ 데이터만 분석해서 말씀드릴게요
큰 그림
총 4,279개의 이벤트(수집기간: 2013년 12월 30일 ~ 2017년 9월 12일)를 분석해서
이승훈이 가진 행동패턴, 인맥관계 등을 도출하는 것
이 본 발표를 준비하면서 가졌던 목적이었습니다만…
큰 그림, 그러나
총 4,279개의 이벤트(수집기간: 2013년 12월 30일 ~ 2017년 9월 12일)를 분석해서
이승훈이 가진 행동패턴, 인맥관계 등을 도출하는 것
이 본 발표를 준비하면서 가졌던 목적이었습니다만…
이래저래 데이터를 굴려보다 보니,
근본적인 질문이 생겼습니다
안물.
내가 누굴 만난다는 걸 여러분이 알아서 뭐할까요
그래서
그나마 조금 재밌을 것 같은 질문 몇 개만 분석했습니다.
(물론 저만 재밌을 수도 있어요)
그래서
그나마 조금 재밌을 것 같은 질문 몇 개만 분석했습니다.
(물론 저만 재밌을 수도 있어요)
그래서
그나마 조금 재밌을 것 같은 질문 몇 개만 분석했습니다.
(물론 저만 재밌을 수도 있어요)
그전에
우선 분석 중에 있었던 일들을 조금 설명드리겠습니다
Mo’ Data Mo’ Problem
Mo’ Data, Mo’ Problem
‘데이터가 많으니까 다 될거야!’
일관적 스몰데이터 >>>> 비일관적 빅데이터
Mo’ Data, Mo’ Problem
‘데이터가 많으니까 다 될거야!’
일관적 스몰데이터 >>>> 비일관적 빅데이터
Mo’ Data, Mo’ Problem
‘데이터가 많으니까 다 될거야!’
일관적 스몰데이터 >>>> 비일관적 빅데이터
불행히도 저는 오른쪽…
Mo’ Data, Mo’ Problem – 책임회피
사실 이 문제는
데이터 수집 방식에 원인이 있습니다.
How to collect my data
누굴 만났는지 데이터는 자동입력이 불가능하기 때문에 제가 직접 입력합니다
제가 알아서 일관적으로 잘 입력하면 좋았겠지만.
이승훈
이벤트 발생시, 직접 입력
(날짜, 분류, 사람들)
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)
이상적인 상황
만약 데이터가 아래처럼 되어 있으면, 바로 분석만 하면 됩니다.
특히, 계층구조를 따라가며 다양한 층위에서 분석할 수 있죠
만남
저녁아침 점심 술 기타
이상적인 데이터
술_맥주 술_소주 술_기타
실제 상황(삐뽀삐뽀)
Level-of-depth 가 아주 messy합니다
(종류도 57개)
실제 데이터
만남
저녁아침 점심 야식(or 술)
야식
술_맥주 술_소주
삼겹살 디저트 홍차 커피 아이스크림
간식빵 팥빙수
실제 상황, 응급 처치
아주 다행히도, 상위 8개의 카테고리가 전체의 94%를 차지하고 있어
상위 카테고리에 대해서만 전처리를 했습니다.
실제 데이터
만남
저녁아침 점심 야식(or 술)
야식
술_맥주 술_소주
삼겹살 디저트 홍차 커피 아이스크림
간식빵 팥빙수
No Context, No Information
컨텍스트를 모른다면,
쓸모 없는 정보가 된다.
예를 들어서.
결과: “이승훈이 이주석을 제일 많이 만난다”
예를 들어서.
결과: “이승훈이 이주석을 제일 많이 만난다”
If you know:
이주석과 이승훈은 같은 연구실이다
Obvious
“대학원생이 연구실 사람 많이
만나는 건 당연한 거 아님?”
예를 들어서.
결과: “이승훈이 이주석을 제일 많이 만난다”
If you know:
이주석과 이승훈은 같은 연구실이다
If you don’t know:
이주석과 이승훈은 같은 연구실이다
Obvious
“대학원생이 연구실 사람 많이
만나는 건 당연한 거 아님?”
예를 들어서.
결과: “이승훈이 이주석을 제일 많이 만난다”
If you know:
이주석과 이승훈은 같은 연구실이다
If you don’t know:
이주석과 이승훈은 같은 연구실이다
Obvious
“대학원생이 연구실 사람 많이
만나는 건 당연한 거 아님?”
개별 사람에 대한 context modeling이 필요함
Context modelling
그래서 하나하나 제가 입력했습니다…
다만, 전체 사람의 수(unique set)의 수는 600명이 넘고,
상위 159명이 전체의 88%를 차지하기 때문에,
상위 159명에 대해서만 컨텍스트를 작성했습니다.
Context modelling
People Context
(성별, 대분류, 소속학과, 공통 집단들)
아마도, 이미 예측하셨겠지만.
앞 부분이 이렇게 긴 것은
이 발표가 사두지미(뱀머리지렁이꼬리) 형식이기 때문이죠
이제 분석결과를 보여드리겠습니다.
질문1: 케빈 베이컨 문제.
“지구에 있는 모든 사람들은
최대 6단계 이내에서 서로 아는 사람으로 연결된다”
정말 그럴까요?
해봅시다.
질문1: 케빈 베이컨 문제.
가정:
- 같은 만남을 가진 집단 (a, b, c)에는 (a, b), (b, c), (c, a)라는 관계가 성립
- weight, directionality를 무시
- 또한 ‘이승훈’이 없는 세상이라고 가정(무섭..ㅠㅠ)
- 당연하지만, 이승훈이 있을 경우, 최대 2 단계면 모두 연결됨
Anyone Anyone
me
질문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단계로 연결된다는 것을 알 수 있습니다.
질문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단계로 연결된다는 것을 알 수 있습니다.
(잘보면 보여요)
질문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)
질문1: 케빈 베이컨 문제.
‘친구’집단의 longest shortest path
p119 p39 p106 p96 p63 p32 p81
친형의 친구 같은 동아리 같은 학과 같은 동아리 독서모임 독서모임
방글라데시에서
일하는 영업사원
포항공대 교직원
되…되잖아…
질문1: 케빈 베이컨 문제.
또한, 실제로 존재하는 관계가 있습니다, 이를 고려하면, 더 가까워지겠죠.
친구
가족 훈련소
me
p7
p14
p24
p13
질문1: 케빈 베이컨 문제.
다만, 지금까지 분석한 것은 이미 필터링된 사람들을 대상으로 합니다.
그렇다면,
전체 데이터를 대상으로 해보면 어떤 결과가 나올까요?
그래도 케빈베이컨 수가 유지될까요?
질문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
질문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
질문1: 케빈 베이컨 문제.
전체를 묶지 못했고, 또 거리가 커지기는 했지만
그래도, 가장 큰 컴퍼넌트에서 보면, 꽤 먼 사람이 이어지기는 합니다
p410 p13 p67 p85 p8 p15 p30 p321
포항 단편
영화 감독
천안 사는
공무원 준비생
그래도, 이정도면 좀 유의미하지 않나? 싶어요
케빈베이컨 짝짝짝
질문2: 남녀 비율은 어떻게 되나?
너는 똥인지 된장인지 꼭 맛을 봐야 아냐?
질문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))] )
질문2: 남녀 비율은 어떻게 되나? - 희망편
제 인맥에서 20%만 여자입니다.
질문2: 남녀 비율은 어떻게 되나? - 슬픔편
보통 일상생활에서 8%의 여자를 만납니다
질문2: 남녀 비율은 어떻게 되나?
하지만, 저기서 여자친구와 어머니를 뺀다면?
질문2: 남녀 비율은 어떻게 되나? - 절망편
저는 사실 일상생활에서 5%의 여자만 만납니다
질문2: 남녀 비율은 어떻게 되나? - 절망편
저는 사실 일상생활에서 5%의 여자만 만납니다
이런 저를 구원해준
서울 사시는 임소희 양에게 심심한 감사를 드립니다.
♥♥♥
아침/점심/저녁/야식+술 로 구분해서 차이를 확인하겠습니다.
우선, 전체를 대상으로 한 순위부터 보시죠
우선 전체를 대상으로 한 순위부터 보시죠
질문3: 카테고리별로 만나는 사람이 다른가?
전체 빈도 순위
g c1 dept CCs
p0 남성 포스텍 산업경영공학과 [연구실사람]
p1 남성 포스텍 산업경영공학과 [연구실사람]
p2 남성 포스텍 산업경영공학과 [연구실사람]
p3 남성 포스텍 산업경영공학과 [연구실사람]
p4 남성 포스텍 산업경영공학과 [연구실사람, 5분반]
p5 남성 포스텍 산업경영공학과 [연구실사람]
p6 남성 포스텍 산업경영공학과 [연구실사람]
p7 남성 포스텍 화학공학과 [준비위원회]
P8 남성 포스텍 신소재공학과 [피펑크, 준비위원회]
P9 남성 포스텍 산업경영공학과 [연구실사람]
- 상위 10명이 전체 만남의 58.4%를 차지함
- 상위 10명이 모두 같은 학교
- 8명은 같은 학과, 연구실
- 2명은 학부 친구
‘연구실 사람을 제일 많이 만난다’
라는 너무도 당연한 결론
<아침>
P14
P23
P24
P19
P18
P21
P25
P20
P22
P26
<점심>
P1
P0
P3
P2
P5
P11
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
… … … …
시간대별 만나는 사람 변화
연구실 사람 친구 가족 훈련소
시간대별 만나는 사람 변화
<아침>
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
… … … …
연구실 사람 친구 가족 훈련소
<아침>
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
… … … …
시간대별 만나는 사람 변화
연구실 사람 친구 가족 훈련소
<아침>
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
… … … …
시간대별 만나는 사람 변화
연구실 사람 친구 가족 훈련소
<아침>
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
… … … …
시간대별 만나는 사람 변화
연구실 사람 친구 가족 훈련소
<아침>
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
… … … …
시간대별 만나는 사람 변화
연구실 사람 친구 가족 훈련소
질문4: 시간이 변하면서, 인맥이 달라졌는가?
요즘 부쩍,
만나는 사람이 줄었다는 생각을 합니다.
정말 그럴까요?
질문4: 시간이 변하면서, 인맥이 달라졌는가?
만나는 사람(인맥)의 수는 줄어들고 있는데,
사람을 덜 만나는 건 아니네요
맨날 만나는 사람만 더 자주 만난다…라는 해석이 가능하겠네요
<만나는 사람의 분기별 변화> <만남의 분기별 변화>
기타 질문
질문4: 시간의 변화에 따라 만나는 사람이 달라지는가?
질문5: node의 특성을 변경하여 네트워크 도출
질문6: 누가 중요한 친구인가! - centrality 분석
기타 질문
질문4: 시간의 변화에 따라 만나는 사람이 달라지는가?
질문5: node의 특성을 변경하여 네트워크 도출
질문6: 누가 중요한 친구인가! - centrality 분석
해봤는데, 노잼 결과만 나와서 안 보여드립니다ㅜㅠ
그래,
니가 뭘 했는지는 알겠고,
그럼 뭘 배웠는가?
레슨 런드
metadata management
and
Analytic-orientation
Meta-data Management
데이터가 많을수록, 데이터 간의 관계와 특성을 고려하는 것이 중요.
그렇지 않을 경우, 기대 만큼의 성과를 얻기 어려울 수 있음.
(특히, 오랫동안 쌓인 데이터에서는 concept-drift가 발생하기 쉬움)
또한, 카테고리 데이터의 경우는 level-of-depth,
층위 별 span-of-control을 꾸준하게 관리해주는 것이 중요함
(Data consistency or constraint management)
Analytic-orientation
데이터를 모으는 것도 물론 중요하지만,
향후 해당 데이터를 어떻게 분석할 지에 대해 충분히 고려한 다음
(analytic-oriented) Data schema를 설계하는 것이 좋다.
그래야 향후 발생할 수 있는 문제점 및 데이터 전처리 비용이 감소함
다시 말하지만, (나처럼) 그냥 모으면 답이 없다
그렇다고 합니다.
질문 있으신 분?