Representasi visual dari pemilihan di St. Petersburg - keajaiban pembungkus suara

Hai

Pada bulan September tahun ini (2019), pemilihan Gubernur St. Petersburg diadakan. Semua data pemungutan suara tersedia untuk umum di situs web komisi pemilihan umum, kami tidak akan memecah apa pun, tetapi cukup memvisualisasikan informasi dari situs web ini www.st-petersburg.vybory.izbirkom.ru dalam bentuk yang kami butuhkan, kami akan melakukan analisis yang sangat sederhana dan mengidentifikasi beberapa Pola "ajaib".

Biasanya untuk tugas seperti itu saya menggunakan Google Colab. Ini adalah layanan yang memungkinkan Anda untuk menjalankan Notebook Jupyter, dan memiliki akses ke GPU (NVidia Tesla K80) secara gratis, ini akan secara signifikan mempercepat penguraian data dan pemrosesan lebih lanjut. Saya perlu beberapa pekerjaan persiapan sebelum mengimpor.

%%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 

Impor lebih lanjut.

 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 

Deskripsi perpustakaan yang digunakan


  • permintaan - modul untuk permintaan untuk terhubung ke situs

  • BeautifulSoup - modul untuk parsing dokumen html dan xml; memungkinkan Anda untuk mengakses langsung konten dari tag apa pun di html

  • numpy - modul matematika dengan seperangkat fungsi matematika dasar dan perlu

  • panda - perpustakaan analisis data

  • matplotlib.pyplot - modul-set metode konstruksi

  • geopanda - modul untuk membangun peta pemilihan

  • xlrd - modul untuk membaca file tabel

Waktunya telah tiba untuk mengumpulkan data itu sendiri, parsim. Panitia pemilihan menjaga waktu kami dan menyediakan pelaporan di tabel, itu mudah.

 ### 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))) 

Jadi, inilah yang dibahas. Data di Google Colab dikumpulkan dengan cerdas, tetapi tidak terlalu banyak.

Sebelum membuat berbagai grafik dan peta, ada baiknya kita memiliki gagasan tentang apa yang kita sebut "dataset".

Analisis data komisi pemilu


Di kota St. Petersburg ada 30 komisi wilayah, untuk mereka, di kolom ke-31, kami merujuk tempat pemungutan suara digital.

gambar

Setiap komisi teritorial memiliki beberapa lus PEC (komisi pemilihan daerah).

gambar

Hal utama yang menarik bagi kami adalah penampilan di setiap TPS, dan ketergantungan seperti apa yang bisa kami amati. Saya akan membangun yang berikut ini:

  • ketergantungan jumlah pemilih dan jumlah tempat pemungutan suara;

  • ketergantungan dari persentase suara untuk kandidat pada jumlah pemilih;

  • Ketergantungan jumlah pemilih pada pemilih di kantor polisi.

Dari tabel data telanjang, cukup sulit untuk melacak bagaimana pemilihan berlangsung dan menarik beberapa kesimpulan, sehingga grafik adalah jalan keluar kami.

Mari kita membangun apa yang kita hasilkan.

 ### 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() 

Ketergantungan jumlah pemilih dan jumlah TPS

gambar

Ketergantungan persentase suara untuk kandidat pada jumlah suara

  • "Hijau" - suara untuk Amosov

  • "Biru" - untuk Beglov

  • "Merah" - untuk Tikhonov

gambar

Ketergantungan jumlah pemilih pada pemilih di kantor polisi

gambar

Konstruksi cukup dapat ditoleransi, tetapi dalam pekerjaannya ternyata rata-rata 400 orang di situs dan persentase untuk Beglov adalah 50 hingga 70, tetapi ada dua situs dengan jumlah pemilih> 1200 orang dan persentase 90 + -0,2. Sangat menarik bahwa ini terjadi di daerah ini. Apakah beberapa agitator yang hebat bekerja? Atau hanya mengendarai 10 orang bus dan dipaksa memilih? Dengan satu atau lain cara, kami senang, penyelidikan kecil seperti itu sedang dilakukan. Tetapi kita masih harus menggambar kartu. Mari kita lanjutkan.

Representasi visual dan bekerja dengan geopanda


 ### 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]) 



Mereka melukis distrik administratif kota dan menandatangani mereka, terlihat akrab, sepertinya Peter, tetapi Neva masih belum cukup.

Jumlah pemilih

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



Jumlah suara

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



Kesimpulan


Anda dapat bersenang-senang dengan data untuk waktu yang lama, menggunakannya di berbagai bidang dan, tentu saja, mendapatkan manfaat, karena ini ada. Alat visualisasi geolokasi sederhana dan canggih dapat melakukan hal-hal besar. Tulis tentang kesuksesan Anda dalam komentar!

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


All Articles