ghdms

centrality.py 수정

- 데이터셋 정리
- 출력 형식 통일
- 영화별 출연진 betweenness 평균과 스크린 수 당 매출액 상관관계 산출

6월 면담확인서 제출

최종보고서 제출
No preview for this file type
1 from igraph import * 1 from igraph import *
2 import pymongo 2 import pymongo
3 +import matplotlib.pyplot as plt
3 4
4 conn = pymongo.MongoClient("localhost") 5 conn = pymongo.MongoClient("localhost")
5 db = conn.test 6 db = conn.test
...@@ -7,9 +8,11 @@ MOVIE = db.movie ...@@ -7,9 +8,11 @@ MOVIE = db.movie
7 cur = MOVIE.find() 8 cur = MOVIE.find()
8 audiences = {} 9 audiences = {}
9 salesPerScreens = [] 10 salesPerScreens = []
11 +salesPerScreensToObj = {}
10 for c in cur: 12 for c in cur:
11 audiences[c["name"]] = c["audiences"] 13 audiences[c["name"]] = c["audiences"]
12 salesPerScreens.append({"name": c["name"], "value": c["sales"] / c["screens"]}) 14 salesPerScreens.append({"name": c["name"], "value": c["sales"] / c["screens"]})
15 + salesPerScreensToObj[c["name"]] = round(c["sales"] / c["screens"], 5)
13 16
14 salesPerScreensTmp = salesPerScreens[:] 17 salesPerScreensTmp = salesPerScreens[:]
15 salesPerScreensSorted = sorted(salesPerScreensTmp, key=lambda n: salesPerScreens[salesPerScreens.index(n)]["value"], reverse=True)[:50] 18 salesPerScreensSorted = sorted(salesPerScreensTmp, key=lambda n: salesPerScreens[salesPerScreens.index(n)]["value"], reverse=True)[:50]
...@@ -143,78 +146,9 @@ data = { ...@@ -143,78 +146,9 @@ data = {
143 # "헬로우 고스트": "차태현,강예원,이문수,고창석,장영남,천보근,공호석,정규수,김진성,구승현", 146 # "헬로우 고스트": "차태현,강예원,이문수,고창석,장영남,천보근,공호석,정규수,김진성,구승현",
144 "하모니": "김윤진,나문희,강예원,이다희,장영남,박준면,정수영,이태경,문경민,도용구,지성원,차진혁,박혜진", #salesPerScreensSorted 44위 147 "하모니": "김윤진,나문희,강예원,이다희,장영남,박준면,정수영,이태경,문경민,도용구,지성원,차진혁,박혜진", #salesPerScreensSorted 44위
145 # "오싹한 연애": "손예진,이민기,박철민,김현숙,이미도,신성훈,윤지민,황승언,이현진", #128위. 300만 이상 148 # "오싹한 연애": "손예진,이민기,박철민,김현숙,이미도,신성훈,윤지민,황승언,이현진", #128위. 300만 이상
146 - # "방자전": "",
147 - # "형": "",
148 - # "마더": "",
149 - # "그놈 목소리": "",
150 - # "친구 2": "",
151 - # "식객": "",
152 - # "26년": "",
153 - # "고지전": "",
154 - # "워낭소리": "", #salesPerScreensSorted 30위
155 - # "프리즌": "",
156 - # "가장 보통의 연애": "",
157 - # "말모이": "",
158 - # "극비수사": "",
159 - # "표적": "",
160 - # "너의 결혼식": "",
161 - # "내가 살인범이다": "",
162 - # "부당거래": "",
163 - # "소원": "",
164 "너는 내 운명": "전도연,황정민,나문희,정유석,서주희,윤제문,임종윤,김상호,고수희,김부선,김광규", #salesPerScreensSorted 42위 149 "너는 내 운명": "전도연,황정민,나문희,정유석,서주희,윤제문,임종윤,김상호,고수희,김부선,김광규", #salesPerScreensSorted 42위
165 - # "시라노; 연애조작단": "",
166 - # "곤지암": "",
167 - # "살인자의 기억법": "",
168 "마파도": "이정진,이문식,여운계,김수미,김을동,김형자,길해연,오달수,서영희", #salesPerScreensSorted 13위 150 "마파도": "이정진,이문식,여운계,김수미,김을동,김형자,길해연,오달수,서영희", #salesPerScreensSorted 13위
169 - # "후궁 : 제왕의 첩": "",
170 - # "탐정 : 더 비기닝": "",
171 - # "지금 만나러 갑니다": "",
172 - # "가문의 부활 - 가문의 영광3": "",
173 - # "위험한 상견례": "",
174 - # "아수라": "",
175 - # "보안관": "",
176 - # "기술자들": "",
177 - # "굿모닝 프레지던트": "",
178 "태극기 휘날리며": "장동건,원빈,이은주,공형진,장민호,이영란", #salesPerScreensSorted 2위 151 "태극기 휘날리며": "장동건,원빈,이은주,공형진,장민호,이영란", #salesPerScreensSorted 2위
179 - # "라스트 갓파더": "",
180 - # "1번가의 기적": "",
181 - # "증인": "",
182 - # "목격자": "",
183 - # "조작된 도시": "",
184 - # "블랙머니": "",
185 - # "반창꼬": "",
186 - # "우리들의 행복한 시간": "",
187 - # "조선명탐정: 흡혈괴마의 비밀": "",
188 - # "화차": "",
189 - # "이웃사람": "",
190 - # "재심": "",
191 - # "히트맨": "",
192 - # "사바하": "",
193 - # "화이: 괴물을 삼킨 아이": "",
194 - # "의뢰인": "",
195 - # "가문의 영광4 - 가문의 수난": "",
196 - # "블라인드": "",
197 - # "박열": "",
198 - # "미인도": "",
199 - # "음란서생": "",
200 - # "내 생애 가장 아름다운 일주일": "",
201 - # "하녀": "",
202 - # "황해": "",
203 - # "7광구": "",
204 - # "타짜: 원 아이드 잭": "",
205 - # "박쥐": "",
206 - # "마당을 나온 암탉": "",
207 - # "악의 연대기": "",
208 - # "강남 1970": "",
209 - # "신의 한 수: 귀수편": "",
210 - # "마이 웨이": "",
211 - # "나의 사랑 나의 신부": "",
212 - # "바르게 살자": "",
213 - # "내 사랑 내 곁에": "",
214 - # "초능력자": "",
215 - # "굿바이 싱글": "",
216 - # "몽타주": "",
217 - # "명당": "",
218 } 152 }
219 #500만 이상 + 스크린 수당 매출액 50위 이상 => 79개 영화, 730개 노드, 9348개 엣지 153 #500만 이상 + 스크린 수당 매출액 50위 이상 => 79개 영화, 730개 노드, 9348개 엣지
220 154
...@@ -239,15 +173,18 @@ def named_union(graph1, graph2): #두 그래프 합성 ...@@ -239,15 +173,18 @@ def named_union(graph1, graph2): #두 그래프 합성
239 Z.vs["label"] = Z.vs["name"][:] 173 Z.vs["label"] = Z.vs["name"][:]
240 return Z 174 return Z
241 175
176 +def replaceText(x):
177 + for r in [" ", "-", ":", "(", ")", ",", "1", "2", "3", "4", "6", "7", "8", "9"]:
178 + x = x.replace(r, "")
179 + return x
180 +
242 def printResult(names, values, x, y, n): 181 def printResult(names, values, x, y, n):
243 for i in range(0, n): 182 for i in range(0, n):
244 - text = names[i][:] 183 + text = replaceText(names[i][:])
245 - for r in [" ", "-", ":", "(", ")", ",", "1", "2", "3", "4", "6", "7", "8", "9"]:
246 - text = text.replace(r, "")
247 name = names[i].rjust(x - len(text)) 184 name = names[i].rjust(x - len(text))
248 value = str(round(values[i], 5)) 185 value = str(round(values[i], 5))
249 value = value.rjust(y) 186 value = value.rjust(y)
250 - print(i, name, value) 187 + print(name, value)
251 188
252 print("<스크린수 당 매출액 1~50위>") 189 print("<스크린수 당 매출액 1~50위>")
253 # nnn = 0 190 # nnn = 0
...@@ -304,13 +241,15 @@ for movie in data: ...@@ -304,13 +241,15 @@ for movie in data:
304 weight[join]["audiences"] += audiences[movie] 241 weight[join]["audiences"] += audiences[movie]
305 weight[join]["count"] += 1 242 weight[join]["count"] += 1
306 243
244 +print("\n<영화 출연 수>")
307 for f in sorted(list(frequency.keys()), key=lambda x: frequency[x], reverse=True)[:10]: 245 for f in sorted(list(frequency.keys()), key=lambda x: frequency[x], reverse=True)[:10]:
308 - print(f, frequency[f]) 246 + print(f, str(frequency[f]).rjust(3))
309 247
310 print("\n<같은 영화에 같이 출연한 빈도수>") 248 print("\n<같은 영화에 같이 출연한 빈도수>")
311 topten = sorted(keys, key=lambda n: weight[n]["count"], reverse=True)[:10] 249 topten = sorted(keys, key=lambda n: weight[n]["count"], reverse=True)[:10]
312 for t in topten: 250 for t in topten:
313 - print(t, ":", weight[t]["count"]) 251 + tt = replaceText(t)
252 + print(t.rjust(14 - len(tt)) + " ", weight[t]["count"])
314 253
315 names, names1, names2 = G.vs["name"][:], G.vs["name"][:], G.vs["name"][:] 254 names, names1, names2 = G.vs["name"][:], G.vs["name"][:], G.vs["name"][:]
316 255
...@@ -326,9 +265,8 @@ for k in keys: ...@@ -326,9 +265,8 @@ for k in keys:
326 continue 265 continue
327 [s, e] = k.split(",") 266 [s, e] = k.split(",")
328 sIdx, eIdx = names.index(s), names.index(e) 267 sIdx, eIdx = names.index(s), names.index(e)
329 - edges = G.es.select(_between = ([sIdx], [eIdx])) 268 + edge = G.es.select(_between = ([sIdx], [eIdx]))[0]
330 - for e in edges: 269 + edge_weight[edge.index] = weight[k]["count"]
331 - edge_weight[e.index] = weight[k]["count"]
332 270
333 print("\n<betweenness>") 271 print("\n<betweenness>")
334 bn = G.betweenness(weights=edge_weight) 272 bn = G.betweenness(weights=edge_weight)
...@@ -349,12 +287,14 @@ topEg = sorted(names1, key=lambda n: eg[names2.index(n)], reverse=True)[:10] ...@@ -349,12 +287,14 @@ topEg = sorted(names1, key=lambda n: eg[names2.index(n)], reverse=True)[:10]
349 printResult(topEg, egSorted, 5, 8, 10) 287 printResult(topEg, egSorted, 5, 8, 10)
350 288
351 avgOfBn = [] 289 avgOfBn = []
290 +avgOfBnToObj = {}
352 totalBn = 0 291 totalBn = 0
353 topActors = topTmp.split(",") 292 topActors = topTmp.split(",")
354 for actor in topActors: 293 for actor in topActors:
355 i = names.index(actor) 294 i = names.index(actor)
356 totalBn += bn[i] 295 totalBn += bn[i]
357 -avgOfBn.append({"movie":"명량", "avgOfBn":totalBn / len(topActors)}) 296 +avgOfBn.append({"movie":"명량", "avgOfBn":round(totalBn / len(topActors), 5)})
297 +avgOfBnToObj["명량"] = round(totalBn / len(topActors), 5)
358 298
359 for movie in data: 299 for movie in data:
360 totalBn = 0 300 totalBn = 0
...@@ -362,12 +302,14 @@ for movie in data: ...@@ -362,12 +302,14 @@ for movie in data:
362 for actor in actors: 302 for actor in actors:
363 i = names.index(actor) 303 i = names.index(actor)
364 totalBn += bn[i] 304 totalBn += bn[i]
365 - avgOfBn.append({"movie":movie, "avgOfBn":totalBn / len(actors)}) 305 + avgOfBn.append({"movie":movie, "avgOfBn":round(totalBn / len(actors), 5)})
306 + avgOfBnToObj[movie] = round(totalBn / len(actors), 5)
366 307
367 print("\n<average of betweenness>") 308 print("\n<average of betweenness>")
368 avgOfBnSorted = sorted(avgOfBn, key=lambda n: n["avgOfBn"], reverse=True)[:10] 309 avgOfBnSorted = sorted(avgOfBn, key=lambda n: n["avgOfBn"], reverse=True)[:10]
369 for a in avgOfBnSorted: 310 for a in avgOfBnSorted:
370 - print(a["movie"], a["avgOfBn"]) 311 + text = replaceText(a["movie"])
312 + print(a["movie"].rjust(30 - len(text)), str(a["avgOfBn"]).rjust(11))
371 313
372 print("\n<total nodes>") 314 print("\n<total nodes>")
373 print(len(G.vs)) 315 print(len(G.vs))
...@@ -388,4 +330,9 @@ out = plot(G, ...@@ -388,4 +330,9 @@ out = plot(G,
388 ) 330 )
389 out.save("test.png") 331 out.save("test.png")
390 332
391 -#C:\Users\ghdms\2014104137\소스코드\centrality.py
...\ No newline at end of file ...\ No newline at end of file
333 +x, y = [], []
334 +for movie in avgOfBnToObj:
335 + x.append(avgOfBnToObj[movie])
336 + y.append(salesPerScreensToObj[movie])
337 +plt.scatter(x, y)
338 +plt.show()
...\ No newline at end of file ...\ No newline at end of file
......
No preview for this file type