تمثيل مرئي للانتخابات في سان بطرسبرغ - سحر التفاف الصوت

تحية!

في سبتمبر من هذا العام (2019) ، تم انتخاب حاكم سانت بطرسبرغ. جميع بيانات التصويت متاحة للجمهور على الموقع الإلكتروني للجنة الانتخابات ، ولن نكسر أي شيء ، ولكن ببساطة تصور المعلومات من هذا الموقع www.st-petersburg.vybory.izbirkom.ru بالشكل الذي نحتاج إليه ، وسنقوم بإجراء تحليل بسيط للغاية وتحديد بعض أنماط "السحر".

عادةً لمثل هذه المهام ، أستخدم Google Colab. هذه خدمة تتيح لك تشغيل Jupyter Notebooks ، والوصول إلى GPU (NVidia Tesla K80) مجانًا ، وسوف تسرع بشكل كبير في تحليل البيانات والمعالجة الإضافية. كنت بحاجة إلى بعض الأعمال التحضيرية قبل الاستيراد.

%%time !apt update !apt upgrade !apt install gdal-bin python-gdal python3-gdal # Install rtree - Geopandas requirment !apt install python3-rtree # Install Geopandas !pip install git+git://github.com/geopandas/geopandas.git # Install descartes - Geopandas requirment !pip install descartes 

واردات أخرى.

 import requests from bs4 import BeautifulSoup import numpy as np import pandas as pd import matplotlib.pyplot as plt import geopandas as gpd import xlrd 

وصف المكتبات المستخدمة


  • طلبات - وحدة لطلب للحصول على اتصال إلى موقع

  • BeautifulSoup - وحدة لتحليل وثائق HTML و XML. يسمح لك بالوصول مباشرة إلى محتوى أي علامات في html

  • numpy - وحدة رياضية مع مجموعة أساسية وضرورية من الوظائف الرياضية

  • الباندا - مكتبة تحليل البيانات

  • matplotlib.pyplot - مجموعة من أساليب البناء

  • geopandas - وحدة لبناء خريطة الانتخابات

  • xlrd - وحدة لقراءة ملفات الجدول

لقد حان الوقت لجمع البيانات نفسها ، parsim. اهتمت لجنة الانتخابات بوقتنا وقدمت تقارير في الجداول ، فهي مريحة.

 ### Parser list_of_TIKS = [] for i in range (1, 31): list_of_TIKS.append('   №' + str(i)) num_of_voters = [] num_of_voters_voted = [] appearence = [] votes_for_Amosov_percent = [] votes_for_Beglov_percent = [] votes_for_Tikhonova_percent = [] url = "http://www.st-petersburg.vybory.izbirkom.ru/region/region/st-petersburg?action=show&root=1&tvd=27820001217417&vrn=27820001217413&region=78&global=&sub_region=78&prver=0&pronetvd=null&vibid=27820001217417&type=222" response = requests.get(url) page = BeautifulSoup(response.content, "lxml") main_links = page.find_all('a') for TIK in list_of_TIKS: for main_tag in main_links: main_link = main_tag.get('href') if TIK in main_tag: current_TIK = pd.read_html(main_link, encoding='cp1251', header=0)[7] num_of_voters.extend(int(current_TIK.iloc[0,i]) for i in range (len(current_TIK.columns))) num_of_voters_voted.extend(int(current_TIK.iloc[2,i]) + int(current_TIK.iloc[3,i]) for i in range (len(current_TIK.columns))) appearence.extend(round((int(current_TIK.iloc[2,i]) + int(current_TIK.iloc[3,i]))/int(current_TIK.iloc[0,i])*100, 2) for i in range (len(current_TIK.columns))) votes_for_Amosov_percent.extend(round(float(current_TIK.iloc[12,i][-6]+current_TIK.iloc[12,i][-5]+current_TIK.iloc[12,i][-4]+current_TIK.iloc[12,i][-3]+current_TIK.iloc[12,i][-2]),2) for i in range (len(current_TIK.columns))) votes_for_Beglov_percent.extend(round(float(current_TIK.iloc[13,i][-6]+current_TIK.iloc[13,i][-5]+current_TIK.iloc[13,i][-4]+current_TIK.iloc[13,i][-3]+current_TIK.iloc[13,i][-2]),2) for i in range (len(current_TIK.columns))) votes_for_Tikhonova_percent.extend(round(float(current_TIK.iloc[14,i][-6]+current_TIK.iloc[14,i][-5]+current_TIK.iloc[14,i][-4]+current_TIK.iloc[14,i][-3]+current_TIK.iloc[14,i][-2]),2) for i in range (len(current_TIK.columns))) 

لذلك ، هذا ما نوقش. يتم جمع البيانات في Google Colab بذكاء ، ولكن ليس كثيرًا.

قبل إنشاء العديد من الرسوم البيانية والخرائط ، من الجيد أن يكون لدينا فكرة عما نسميه "مجموعة البيانات".

تحليل بيانات لجنة الانتخابات


في مدينة سان بطرسبرغ ، هناك 30 لجنة إقليمية ؛ بالنسبة لهم ، في العمود الحادي والثلاثين ، نشير إلى مراكز الاقتراع الرقمية.

صورة

كل لجنة إقليمية لديها عدة عشرات من اللجان الانتخابية (لجان الانتخابات السابقة).

صورة

الشيء الرئيسي الذي يهمنا هو الظهور في كل مركز اقتراع ، وما نوع التبعيات التي يمكننا ملاحظتها. سأبني على ما يلي:

  • اعتماد الإقبال وعدد محطات الاقتراع ؛

  • اعتماد نسبة الأصوات للمرشحين على المشاركة ؛

  • اعتماد الإقبال على عدد الناخبين في الدائرة الانتخابية.

من جدول البيانات العارية ، من الصعب للغاية تتبع كيفية سير الانتخابات واستخلاص بعض الاستنتاجات ، وبالتالي فإن الرسوم البيانية هي طريقنا للخروج.

دعونا نبني ما توصلنا إليه.

 ### Plots Data #Votes in percent (appearence) - no need in extra computations #Appearence (num of voters) - no need in extera computations #Number of UIKs (appearence) interval = 1 interval_num_of_UIKs = [] for i in range (int(100/interval+1/interval)): interval_num_of_UIKs.append(0) for i in range (0, int(100/interval+1/interval), interval): for j in range (len(appearence)): if appearence[j] < (i + interval/2) and appearence[j] >= (i - interval/2): interval_num_of_UIKs[i] = interval_num_of_UIKs[i] + 1 

 ### Plotting #Number of UIKs (appearence) plt.figure(figsize=(10, 6)) plt.plot(interval_num_of_UIKs) plt.axis([0, 100, 0, 200]) plt.ylabel('Number of UIKs in a 1% range') plt.xlabel('Appearence') plt.show() #Votes in percent (appearence) plt.figure(figsize=(10, 10)) plt.scatter(appearence, votes_for_Amosov_percent, c = 'g', s = 6) plt.scatter(appearence, votes_for_Beglov_percent, c = 'b', s = 6) plt.scatter(appearence, votes_for_Tikhonova_percent, c = 'r', s = 6) plt.ylabel('Votes in % for each candidate') plt.xlabel('Appearence') plt.show() #Appearence (num of voters) plt.figure(figsize=(10, 6)) plt.scatter(num_of_voters, appearence, c = 'y', s = 6) plt.ylabel('Appearence') plt.xlabel('Number of voters registereg in UIK') plt.show() 

اعتماد الإقبال وعدد محطات الاقتراع

صورة

اعتماد نسبة الأصوات للمرشحين على المشاركة

  • "الأخضر" - يصوت لعاموسوف

  • "الأزرق" - للبيجلوف

  • "الأحمر" - لتخونوف

صورة

اعتماد الإقبال على عدد الناخبين في الدائرة الانتخابية

صورة

تعتبر الإنشاءات مقبولة تمامًا ، ولكن أثناء العمل تبين أن متوسط ​​400 شخص في الموقع والنسبة المئوية لـ Beglov يتراوح من 50 إلى 70 شخصًا ، ولكن يوجد موقعان إقبالان أكبر من 1200 شخص ونسبة 90 + -0.2. ومن المثير للاهتمام أن هذا حدث في هذه المناطق. هل عمل بعض المحرضين الرائعين؟ أو فقط قاد 10 باصات وأجبر على التصويت؟ بطريقة أو بأخرى ، نحن متحمسون ، يتم إجراء تحقيق صغير من هذا القبيل. ولكن لا يزال يتعين علينا رسم البطاقات. دعنا نستمر.

التمثيل البصري والعمل مع geopandas


 ### Extra data for visualization: appearence and number of voters by municipal districts current_UIK = pd.read_html(url, encoding='cp1251', header=0)[7] num_of_voters_dist = [] num_of_voters_voted_dist = [] appearence_dist = [] for j in [num_of_voters_dist, num_of_voters_voted_dist, appearence_dist]: j.extend(0 for i in range (18)) districts = { '0' : [1], # '1' : [2], # '2' : [18], # '3' : [16, 30], # '4' : [10, 14, 22], # '5' : [11, 17], # '6' : [4, 25], # '7' : [5, 24], # '8' : [23, 29], # '9' : [9, 12, 28], # '10' : [13], # '11' : [15], # '12' : [21], # '13' : [20], # '14' : [19, 27], # '15' : [3, 7], # '16' : [6, 26], # '17' : [8] # } for i in districts.keys(): for k in range (1, 31): if k in districts[i]: num_of_voters_dist[int(i)]= num_of_voters_dist[int(i)] + int(current_UIK.iloc[0,k-1]) num_of_voters_voted_dist[int(i)] = num_of_voters_voted_dist[int(i)] + int(current_UIK.iloc[2,k-1]) + int(current_UIK.iloc[3,k-1]) for i in range (18): appearence_dist[i] = round(num_of_voters_voted_dist[i]/num_of_voters_dist[i]*100, 2) 

 ### GeoDataFrame SPb_shapes= gpd.read_file('./shapes/Administrative_Discrits.shp', encoding='cp1251') temp = pd.DataFrame({' ': num_of_voters_dist, '':appearence_dist }) temp[''] = SPb_shapes[['']] temp['geometry'] = SPb_shapes[['geometry']] SPB_elections_visualization = gpd.GeoDataFrame(temp) 

 ### Colored districts SPB_elections_visualization.plot(column = '', linewidth=0, cmap='plasma', legend=True, figsize=[15,15]) 



لقد رسموا المناطق الإدارية للمدينة ووقعوها ، يبدو مألوفًا ، يبدو مثل بيتر ، لكن نيفا لا تزال غير كافية.

عدد الناخبين

 ### Number of voters gradient SPB_elections_visualization.plot(column = ' ', linewidth=0, cmap='plasma', legend=True, figsize=[15,15]) 



مظهر

 ### Appearence gradient SPB_elections_visualization.plot(column = '', linewidth=0, cmap='plasma', legend=True, figsize=[15,15]) 



استنتاج


يمكنك الاستمتاع بالبيانات لفترة طويلة ، واستخدامها في مجالات مختلفة ، وبالطبع الحصول على بعض الفوائد ، لأنها موجودة. أدوات تصوير الموقع الجغرافي البسيطة والمتطورة يمكن أن تفعل أشياء عظيمة. اكتب عن نجاحك في التعليقات!

Source: https://habr.com/ru/post/ar475258/


All Articles