کار با گرافها و شبکهها در پایتون با NetworkX: پروژه تحلیل شبکه اجتماعی 📊🔗
دنیای ما شبکهای پیچیده از ارتباطات است. از دوستیها و دنبالکردنها در شبکههای اجتماعی گرفته تا تعاملات پروتئینها در زیستشناسی، مسیرهای حملونقل شهری، یا حتی لینکهای بین صفحات وب، همگی ساختارهایی هستند که میتوان آنها را به صورت گراف (Graph) یا شبکه (Network) مدلسازی کرد. درک این ساختارها و روابط پنهان در آنها، کلید حل بسیاری از مسائل پیچیده در علم داده، جامعهشناسی و مهندسی است. پایتون (Python)، به عنوان زبان پیشرو در علم داده، ابزاری فوقالعاده قدرتمند برای کار با این شبکهها ارائه میدهد: کتابخانه NetworkX. در این مقاله، به صورت پروژهمحور، نحوه استفاده از NetworkX برای تحلیل یک شبکه اجتماعی ساده را بررسی میکنیم.
NetworkX چیست و چرا از آن استفاده کنیم؟ 🤔
NetworkX یک کتابخانه پایتون برای ایجاد، دستکاری و مطالعه ساختار، پویایی و عملکرد شبکههای پیچیده است. این کتابخانه به شما اجازه میدهد تا:
- به راحتی گرافهای مختلف (ساده، جهتدار، وزندار) را بسازید.
- گرهها (Nodes) و یالها (Edges) را با ویژگیهای دلخواه اضافه یا حذف کنید.
- از الگوریتمهای استاندارد تئوری گراف برای تحلیل شبکه استفاده کنید (مانند یافتن کوتاهترین مسیر، محاسبه معیارهای مرکزیت، تشخیص جوامع).
- گرافها را از فرمتهای مختلف بخوانید و به فرمتهای دیگر بنویسید.
مزیت بزرگ NetworkX، سادگی و “پایتونیک” بودن آن است. کار با گرافها تقریباً به همان سادگی کار با دیکشنریها و لیستهای پایتون است و به خوبی با سایر کتابخانههای علم داده مانند NumPy, Pandas و Matplotlib ادغام میشود.
مفاهیم پایه تئوری گراف 🧩
قبل از شروع کدنویسی، چند اصطلاح کلیدی را مرور کنیم:
• گره (Node / Vertex): موجودیتهای اصلی در شبکه (مثلاً افراد در یک شبکه اجتماعی، شهرها در یک شبکه حملونقل).
• یال (Edge / Link): ارتباط یا رابطه بین دو گره (مثلاً دوستی، پرواز مستقیم، لینک وب).
• گراف ساده (Undirected Graph): یالها جهت ندارند (اگر A دوست B باشد، B هم دوست A است).
• گراف جهتدار (Directed Graph / DiGraph): یالها جهت دارند (اگر A صفحه B را دنبال کند، لزوماً B صفحه A را دنبال نمیکند).
• یال وزندار (Weighted Edge): یالها دارای یک مقدار عددی هستند که نشاندهنده قدرت، هزینه یا فاصله ارتباط است (مثلاً تعداد پیامهای رد و بدل شده بین دو دوست).
پروژه: تحلیل یک شبکه اجتماعی کوچک 👥
بیایید یک شبکه دوستی کوچک را مدلسازی و تحلیل کنیم. فرض کنید روابط دوستی زیر بین ۷ نفر وجود دارد: (آلیس-باب)، (آلیس-چارلی)، (باب-دیوید)، (چارلی-دیوید)، (دیوید-النا)، (النا-فرانک)، (النا-گریس).
گام اول: نصب و ساخت گراف
# 1. Install NetworkX (if you haven't already)
pip install networkx matplotlib
import networkx as nx
import matplotlib.pyplot as plt
# 2. Create an empty undirected graph
G = nx.Graph()
# 3. Add nodes (people)
people = ["آلیس", "باب", "چارلی", "دیوید", "النا", "فرانک", "گریس"]
G.add_nodes_from(people)
# 4. Add edges (friendships)
friendships = [("آلیس", "باب"), ("آلیس", "چارلی"), ("باب", "دیوید"),
("چارلی", "دیوید"), ("دیوید", "النا"), ("النا", "فرانک"),
("النا", "گریس")]
G.add_edges_from(friendships)
# 5. (Optional) Basic Visualization
plt.figure(figsize=(8, 6))
# Use a layout algorithm (e.g., spring_layout for better node positioning)
pos = nx.spring_layout(G, seed=42)
nx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=2000,
edge_color='gray', font_size=12, font_family='Vazirmatn')
plt.title("نمایش گراف شبکه دوستی")
plt.show()
گام دوم: تحلیل با معیارهای مرکزیت (Centrality Measures)
حالا بیایید ببینیم چه کسی در این شبکه “مهمتر” است. مفهوم “اهمیت” میتواند معانی مختلفی داشته باشد:
# 1. Degree Centrality (تعداد دوستان) - محبوبیت
degree_centrality = nx.degree_centrality(G)
print("مرکزیت درجه (محبوبیت):")
# Sort for better readability
for node, centrality in sorted(degree_centrality.items(), key=lambda item: item[1], reverse=True):
print(f"{node}: {centrality:.2f}")
# 2. Betweenness Centrality (میزان واسطه بودن) - نقش پل ارتباطی
betweenness_centrality = nx.betweenness_centrality(G)
print("\nمرکزیت بینابینی (نقش پل):")
for node, centrality in sorted(betweenness_centrality.items(), key=lambda item: item[1], reverse=True):
print(f"{node}: {centrality:.2f}")
# 3. Closeness Centrality (نزدیکی به همه) - پخش کننده خوب اطلاعات
closeness_centrality = nx.closeness_centrality(G)
print("\nمرکزیت نزدیکی (سرعت انتشار):")
for node, centrality in sorted(closeness_centrality.items(), key=lambda item: item[1], reverse=True):
print(f"{node}: {centrality:.2f}")
# --- Sample Output Interpretation ---
# Degree: David and Elena likely have the most friends.
# Betweenness: David likely acts as a bridge between Alice/Bob/Charlie and Elena/Frank/Grace.
# Closeness: David and Elena are likely central and can spread information fastest.
کاربردهای دیگر تحلیل گراف 🌐
تحلیل شبکه فقط به فیسبوک و توییتر محدود نمیشود. NetworkX در حوزههای بیشماری کاربرد دارد:
| حوزه | مثال کاربرد |
|---|---|
| زیستشناسی | تحلیل شبکههای تعامل پروتئینها، مدلسازی شیوع بیماری. |
| حملونقل | یافتن کوتاهترین مسیر، تحلیل ترافیک شهری، بهینهسازی شبکههای لجستیک. |
| وب و اینترنت | تحلیل ساختار لینکهای وب (پایه الگوریتم PageRank گوگل)، تشخیص جوامع آنلاین. |
| سیستمهای توصیهگر | پیشنهاد دوست در فیسبوک یا محصول در آمازون بر اساس ارتباطات شبکه. |
جمعبندی ✅
NetworkX ابزاری ضروری در جعبهابزار هر دانشمند داده یا تحلیلگر علاقهمند به درک سیستمهای پیچیده است. این کتابخانه به شما قدرت میدهد تا الگوها، افراد کلیدی و ساختارهای پنهان در شبکههای اطراف خود را کشف کنید. تحلیل یک شبکه اجتماعی ساده، نقطه شروعی عالی برای یادگیری مفاهیم تئوری گراف و کاربرد عملی آن با پایتون است. با تسلط بر این مهارتها، که در دورههای پیشرفته آموزشگاه البرز پوشش داده میشوند، میتوانید به تحلیل داده از زاویهای کاملاً جدید نگاه کنید.
روابط پنهان در دادهها را کشف کنید! 🔍
با یادگیری پایتون و ورود به دنیای تحلیل گراف با NetworkX، میتوانید ساختار شبکههای اجتماعی، سیستمهای بیولوژیکی یا هر شبکه پیچیده دیگری را درک کرده و تحلیل کنید.
- ✅ آموزش پایتون از مقدماتی تا علم داده
- ✅ کار عملی با کتابخانه NetworkX برای تحلیل گراف
- ✅ محاسبه معیارهای مرکزیت و تحلیل ساختار شبکه
ثبتنام در دوره پایتون و علم داده













