Anomalías en la votación sobre enmiendas a la Constitución rusa. Parte 1

Una votación de toda Rusia sobre la aprobación de las enmiendas a la Constitución de la Federación de Rusia se llevó a cabo del 25 de junio al 1 de julio de 2020 (wikipedia) .



El objetivo principal de esta publicación es demostrar cómo puede comenzar a trabajar rápidamente con datos de votación y mostrar la presencia de cierto tipo de anomalía en ellos.



Todos los cálculos, visualizaciones y análisis de datos se proporcionan en Google Colab, que está disponible en este enlace de Google Colab .



Enlace a la segunda parte



Nos centraremos en identificar casos de votación de varianza cero, es decir, resultados cuando todos los PEC dentro de un TEC votan por igual o con una varianza mínima. Estos casos no tienen una explicación natural, salvo que no se llevó a cabo el escrutinio de votos.



Se ve así (enlace a las páginas de CEC TEC 52 , TEC 33 , TEC 42 y TEC 19 ):











muchos más ejemplos
















y algunos ejemplos más






















Más adelante en el texto 'A favor' = 'Sí', 'En contra' = 'No'.



Fuentes de datos



. . , .



JSON CSV . (no data, no job!). , , Telegram- RUElectionData .





  1. .
  2. , 10.00 12.00 15.00 18.00 .
  3. , .


, .



. () youtube.



18 « » . ( ) 12.00 10.00 3%, 15.00 12.00 5% ( ).





, 91%, — 90% ( ).







Runtime->Run All. 15 .



Google Drive Google account. GoogleCredentials . , . .



.



.



( « »). turnouts_05_Jul_2020_14_56.zip results_06_Jul_2020_19_05.zip RUElectionData.



df2 df1 df:



df= pd.merge(df1, df2.drop(columns=['reg']), how='inner',on=['tik', 'uik'])


transliterate:



!pip install transliterate
from transliterate import translit


:



df['turnout_pct']=df['n_ballots_all']/df['n_registered_voters']*100.
df['yes_pct']=df['yes']/df['n_ballots_polling_station']*100.
df['no_pct']=df['no']/df['n_ballots_polling_station']*100.  
df['invalid_pct']=df['n_ballots_invalid']/df['n_ballots_polling_station']*100.


:



df_original=df.copy(deep=True)


. « » «» «». 100%.



df=df[df['turnout_pct']<100.]
ax = df.plot.scatter(x='turnout_pct',y='yes_pct',label=' ()',c='DarkBlue',s=0.001)
ax = df.plot.scatter(x='turnout_pct',y='no_pct',label=' ()',c='DarkRed',s=0.001,ax=ax)




, , «» :







«» :







80%, 85%, 90% 95%.



. , , , .



. , ( ) (: A Model Is Only as Good as Its Assumptions).



« » Excel . () wiki:Median absolute deviation.



, «» . , . , 1- 2- . , , url , .



100 ‘’ 153 5570 6 . 5.5 . .



«» . .



. ().



4 , : « ».



« » 50 «»(«»).





« », . ( ) id_num . id_num 1616, 1995 2165.



id_num=1616 33 ,

( ). :





, «» ( yes_pct) 71.9%. :







, « » «». plot_top_n_results . plot_top_n_results=50 plot_top_n_results=300 .



.



import shutil
from google.colab import files
directory='/content/drive/anomaly/dispersion'
shutil.make_archive(directory, 'zip', directory)
files.download('/content/drive/anomaly/dispersion.zip')




10 . 10 . .



Facebook' .



:

https://elections.dekoder.org/ru/russia/constitution/2020/

https://www.electoral.graphics/ru-ru/



Movimiento por los derechos de los votantes "Golos" https://www.golosinfo.org/ .



Asociaciones de observadores: https://constitution.observer/



ps Gracias a todos los que leyeron. Espero que haya podido comprobar los cálculos del autor con sus propias manos, utilizando datos y código fuente abierto. Gracias especialesTyomitch y Lissov por los comentarios ingeniosos.






All Articles