Advertisement
Guest User

Auswertungsskript für LimeSurvey-Umfrage zur TO #bpt131

a guest
Apr 21st, 2013
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 12.62 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. # encoding: utf-8
  3. #
  4. # Evaluation script
  5. # for the Tagesordnung-relevant parts
  6. # of the Bundesparteitag 2013.1 Antragsreihenfolgeumfrage
  7. # of the popcorn-industry reviving Piratenpartei Deutschland.
  8. #
  9. # Input: CSV export for R
  10. #
  11. # Copyright (c) 2013, Stephan Beyer <s-beyer at gmx.net>
  12. #
  13. # Redistribution and use in source and binary forms, with or without
  14. # modification, are permitted provided that the following conditions are met:
  15. #
  16. # 1. Redistributions of source code must retain the above copyright notice, this
  17. #    list of conditions and the following disclaimer.
  18. # 2. Redistributions in binary form must reproduce the above copyright notice,
  19. #    this list of conditions and the following disclaimer in the documentation
  20. #    and/or other materials provided with the distribution.
  21. #
  22. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  23. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  24. # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  25. # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
  26. # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  27. # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  28. # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  29. # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  30. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  31. # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32. #
  33. # The views and conclusions contained in the software and documentation are those
  34. # of the author and should not be interpreted as representing official policies,
  35. # either expressed or implied, of the project.
  36.  
  37. def question_type(id)
  38.     case id
  39.         when 3..8 then [:matrix, "Demokratie wagen", :topic]
  40.         when 9..12 then [:proposal, "Demokratie wagen"]
  41.         when 13..16 then [:matrix, "Innen- und Rechtspolitik", :topic]
  42.         when 17..20 then [:proposal, "Innen- und Rechtspolitik"]
  43.         when 21..23 then [:matrix, "Europa", :topic]
  44.         when 24..25 then [:proposal, "Europa"]
  45.         when 26..31 then [:matrix, "Außenpolitik", :topic]
  46.         when 32..39 then [:proposal, "Außenpolitik"]
  47.         when 40..45 then [:matrix, "Arbeit und Soziales", :topic]
  48.         when 46..49 then [:proposal, "Arbeit und Soziales"]
  49.         when 50..52 then [:matrix, "Bildung und Forschung", :topic]
  50.         when 53..55 then [:proposal, "Bildung und Forschung"]
  51.         when 56..61 then [:matrix, "Internet, Netzpolitik und Artverwandtes", :topic]
  52.         when 62..66 then [:proposal, "Internet, Netzpolitik und Artverwandtes"]
  53.         when 67..69 then [:matrix, "Familie und Gesellschaft", :topic]
  54.         when 70..72 then [:proposal, "Familie und Gesellschaft"]
  55.         when 73..79 then [:matrix, "Wirtschaft und Finanzen", :topic]
  56.         when 80..88 then [:proposal, "Wirtschaft und Finanzen"]
  57.         when 89..94 then [:matrix, "Freiheit und Grundrechte", :topic]
  58.         when 95..98 then [:proposal, "Freiheit und Grundrechte"]
  59.         when 99..103 then [:matrix, "Gesundheitspolitik", :topic]
  60.         when 104..106 then [:proposal, "Gesundheitspolitik"]
  61.         when 107..111 then [:matrix, "Umwelt und Verbraucherschutz", :topic]
  62.         when 112..114 then [:proposal, "Umwelt und Verbraucherschutz"]
  63.         when 115..128 then [:matrix, "Zeitdauer", :duration]
  64.         when 129..140 then [:matrix, "Zeitpunkt", :time]
  65.         when 141..155 then [:freeproposal, "Grundsatzprogramme, Positionspapiere, Sonstiges"]
  66.         else :unknown
  67.     end
  68. end
  69.  
  70. labels = {
  71.     3 => "Umfassende Anträge", # WP118 WP161
  72.     4 => "Bundestagswahlrecht", # WP156 WP036 WP121 WP148
  73.     5 => "Mitbestimmung", # WP002 WP146
  74.     6 => "Transparenz", # WP063
  75.     7 => "Subsidiarität", # WP125
  76.     8 => "Sonstiges", # WP048
  77.     9 => "Demokratie wagen",
  78.     10 => "Demokratie wagen",
  79.     11 => "Demokratie wagen",
  80.     12 => "Demokratie wagen",
  81.     13 => "Umfassende Anträge", # WP060 WP168
  82.     14 => "Staat und Religion", # WP069 WP062 WP167
  83.     15 => "Verfassungsschutz", # WP073 WP127
  84.     16 => "Sonstiges", # WP061 WP065 WP025 WP066
  85.     17 => "Innen- und Rechtspolitik",
  86.     18 => "Innen- und Rechtspolitik",
  87.     19 => "Innen- und Rechtspolitik",
  88.     20 => "Innen- und Rechtspolitik",
  89.     21 => "Vision für Europa", # WP133
  90.     22 => "Fiskalunion und ESM", # WP111 WP080 WP079
  91.     23 => "Zeitumstellung", # WP076
  92.     24 => "Europa",
  93.     25 => "Europa",
  94.     26 => "Umfassende Anträge", # WP170
  95.     27 => "Entwicklungspolitik", # WP024
  96.     28 => "Verteidigungspolitik", # WP022
  97.     29 => "Präambel", # WP010
  98.     30 => "Sicherheitspolitik", # WP011 WP096 WP101 WP116 WP021 WP117 WP100 WP031 WP115 WP023 WP017 WP163 WP015 WP120 WP027 WP028 WP029 WP030
  99.     31 => "Sonstiges", # WP139 WP140
  100.     32 => "Außenpolitik",
  101.     33 => "Außenpolitik",
  102.     34 => "Außenpolitik",
  103.     35 => "Außenpolitik",
  104.     36 => "Außenpolitik",
  105.     37 => "Außenpolitik",
  106.     38 => "Außenpolitik",
  107.     39 => "Außenpolitik",
  108.     40 => "ALG-II / Hartz-IV", # WP013
  109.     41 => "Bedingungsloses Grundeinkommen", # WP009 WP092
  110.     42 => "Arbeit", # WP014 WP058 WP020 WP153
  111.     43 => "Rente", # WP018 WP086 WP059
  112.     44 => "Commons", # WP090
  113.     45 => "Sonstiges", # WP057
  114.     46 => "Arbeit und Soziales",
  115.     47 => "Arbeit und Soziales",
  116.     48 => "Arbeit und Soziales",
  117.     49 => "Arbeit und Soziales",
  118.     50 => "Forschung und Wissenschaft", # WP067 WP045 WP152 WP046
  119.     51 => "Bildungspolitik", # WP128 WP132
  120.     52 => "Sonstiges", # WP141
  121.     53 => "Bildung und Forschung",
  122.     54 => "Bildung und Forschung",
  123.     55 => "Bildung und Forschung",
  124.     56 => "Umfassende Anträge", # WP162 WP142
  125.     57 => "Netzneutralität", # WP016
  126.     58 => "Urheberrecht", # WP097 WP098 WP099
  127.     59 => "Datenschutz", # WP084 WP126 WP134 WP145
  128.     60 => "E-Mail", # WP007 WP004 WP102
  129.     61 => "JMStV", # WP019
  130.     62 => "Internet, Netzpolitik und Artverwandtes",
  131.     63 => "Internet, Netzpolitik und Artverwandtes",
  132.     64 => "Internet, Netzpolitik und Artverwandtes",
  133.     65 => "Internet, Netzpolitik und Artverwandtes",
  134.     66 => "Internet, Netzpolitik und Artverwandtes",
  135.     67 => "Familien- und Geschlechterpolitik", # WP131 WP119 WP165 WP147 WP151
  136.     68 => "Migration und Inklusion", # WP054 WP068
  137.     69 => "Asyl", # WP074
  138.     70 => "Familie und Gesellschaft",
  139.     71 => "Familie und Gesellschaft",
  140.     72 => "Familie und Gesellschaft",
  141.     73 => "Umfassende Anträge", # WP171
  142.     74 => "Wirtschaft", # WP103 WP143 WP129 WP040
  143.     75 => "Haushalt", # WP149
  144.     76 => "Steuern", # WP064 WP034 WP173 WP033 WP112 WP008 WP072 WP026
  145.     77 => "Finanzpolitik", # WP047 WP051 WP037 WP091 WP081
  146.     78 => "Transparenz und Antikorruption", # WP052 WP012 WP053 WP093
  147.     79 => "Sonstiges", # WP003 WP044
  148.     80 => "Wirtschaft und Finanzen",
  149.     81 => "Wirtschaft und Finanzen",
  150.     82 => "Wirtschaft und Finanzen",
  151.     83 => "Wirtschaft und Finanzen",
  152.     84 => "Wirtschaft und Finanzen",
  153.     85 => "Wirtschaft und Finanzen",
  154.     86 => "Wirtschaft und Finanzen",
  155.     87 => "Wirtschaft und Finanzen",
  156.     88 => "Wirtschaft und Finanzen",
  157.     89 => "Umfassende Anträge", # WP160
  158.     90 => "Informationelle Selbstbestimmung", # WP055 WP085
  159.     91 => "Überwachung", # WP110 WP082 WP113
  160.     92 => "Prostitution", # WP104
  161.     93 => "Fanrechte", # WP005 WP006
  162.     94 => "Sonstiges", # WP144 WP124
  163.     95 => "Freiheit und Grundrechte",
  164.     96 => "Freiheit und Grundrechte",
  165.     97 => "Freiheit und Grundrechte",
  166.     98 => "Freiheit und Grundrechte",
  167.     99 => "Umfassende Anträge", # WP166
  168.     100 => "Gesundheitspolitik", # WP078 WP150 WP070
  169.     101 => "Drogen- und Suchtpolitik", # WP042
  170.     102 => "Psyche", # WP001
  171.     103 => "Nichtraucherschutz", # WP056
  172.     104 => "Gesundheitspolitik",
  173.     105 => "Gesundheitspolitik",
  174.     106 => "Gesundheitspolitik",
  175.     107 => "Umfassende Anträge", # WP164
  176.     108 => "Atommüll", # WP159 WP114
  177.     109 => "Bauen und Wohnen", # WP155 WP130 WP157
  178.     110 => "Bauen und Verkehr", # WP043 WP077
  179.     111 => "Sonstiges", # WP172
  180.     112 => "Umwelt und Verbraucherschutz",
  181.     113 => "Umwelt und Verbraucherschutz",
  182.     114 => "Umwelt und Verbraucherschutz",
  183.     115 => "Zeitdauer Gesamtanträge",
  184.     116 => "Zeitdauer Präambel",
  185.     117 => "Zeitdauer Freiheit und Grundrechte",
  186.     118 => "Zeitdauer Demokratie wagen",
  187.     119 => "Zeitdauer Internet, Netzpolitik und Artverwandtes",
  188.     120 => "Zeitdauer Bildung und Forschung",
  189.     121 => "Zeitdauer Umwelt und Verbraucherschutz",
  190.     122 => "Zeitdauer Arbeit und Soziales",
  191.     123 => "Zeitdauer Familie und Gesellschaft",
  192.     124 => "Zeitdauer Gesundheitspolitik",
  193.     125 => "Zeitdauer Europa",
  194.     126 => "Zeitdauer Außenpolitik",
  195.     127 => "Zeitdauer Wirtschaft und Finanzen",
  196.     128 => "Zeitdauer Innen- und Rechtspolitik",
  197.     129 => "Zeitpunkt Freiheit und Grundrechte",
  198.     130 => "Zeitpunkt Demokratie wagen",
  199.     131 => "Zeitpunkt Internet, Netzpolitik und Artverwandtes",
  200.     132 => "Zeitpunkt Bildung und Forschung",
  201.     133 => "Zeitpunkt Umwelt und Verbraucherschutz",
  202.     134 => "Zeitpunkt Arbeit und Soziales",
  203.     135 => "Zeitpunkt Familie und Gesellschaft",
  204.     136 => "Zeitpunkt Gesundheitspolitik",
  205.     137 => "Zeitpunkt Europa",
  206.     138 => "Zeitpunkt Außenpolitik",
  207.     139 => "Zeitpunkt Wirtschaft und Finanzen",
  208.     140 => "Zeitpunkt Innen- und Rechtspolitik",
  209.     141 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  210.     142 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  211.     143 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  212.     144 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  213.     145 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  214.     146 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  215.     147 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  216.     148 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  217.     149 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  218.     150 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  219.     151 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  220.     152 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  221.     153 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  222.     154 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  223.     155 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
  224. }
  225.  
  226. scalelabels = {
  227.     :topic => {
  228.         1 => "Ja, auf jeden Fall",
  229.         2 => "Eher ja",
  230.         3 => "Eher nein",
  231.         4 => "Nein, auf keinen Fall"
  232.     },
  233.     :duration => {
  234.         1 => "viel länger",
  235.         2 => "länger",
  236.         3 => "genau richtig",
  237.         4 => "kürzer",
  238.         5 => "viel kürzer"
  239.     },
  240.     :time => {
  241.         1 => "Samstag vormittag",
  242.         2 => "Samstag nachmittag",
  243.         3 => "Sonntag vormittag",
  244.         4 => "Sonntag nachmittag"
  245.     }
  246. }
  247.  
  248. buckets = {}
  249. resfile = File.open("survey_925538_R_data_file.csv")
  250. i = 0
  251.  
  252. labels.each do |key,val|
  253.     qt = question_type(key)
  254.     case qt[0]
  255.     when :matrix
  256.         buckets[key] = Hash.new(0)
  257.     when :proposal
  258.         buckets[val] = Hash.new(0) if buckets[val].nil?
  259.     end
  260. end
  261. buckets[:freeproposal] = Hash.new(0)
  262.  
  263. resfile.each_line do |l|
  264.     i += 1
  265.     next if i == 1;
  266.  
  267.     proposalcount = {}
  268.  
  269.     line = l.chomp!.split(/,/, 168)
  270.     labels.each do |key,val|
  271.         x = line[key]
  272.         if (!x.empty?)
  273.             x = x[1...-1]
  274.             qt = question_type(key)
  275.             case qt[0]
  276.             when :matrix
  277.                 x = x.to_i
  278.                 buckets[key][x] += 1
  279.                 buckets[key][:total] += 1
  280.             when :proposal
  281.                 x = x.to_i
  282.                 proposalcount[val] = Hash.new(0) if proposalcount[val].nil?
  283.                 proposalcount[val][x] += 1
  284.             when :freeproposal
  285.                 x.upcase!
  286.                 x.tr!(' ', '')
  287.                 if (x[0,2] != 'GP' && x[0,2] != 'PP' && x[0,1] != 'X')
  288.                     STDERR.puts "Warnung in Zeile #{i}: ungültige Eingabe bei freier Nennung zu GP/X/PP."
  289.                 else
  290.                     proposalcount[:freeproposal] = Hash.new(0) if proposalcount[val].nil?
  291.                     proposalcount[:freeproposal][x] += 1
  292.                 end
  293.             end
  294.         end
  295.     end
  296.     if (!proposalcount.empty?)
  297.         proposalcount.each do |key,val|
  298.             val.each do |id,num|
  299.                 if (num > 2)
  300.                     STDERR.puts "Warnung in Zeile #{i}: #{id} wurde mehr als zwei mal genannt! Zähle nur zwei mal."
  301.                     num = 2
  302.                 end
  303.                 buckets[key][id] += num
  304.             end
  305.         end
  306.     end
  307. end
  308.  
  309. oldpart = ''
  310. parts = []
  311. buckets.each do |bkey,bval|
  312.     if bkey.is_a? Numeric
  313.         qt = question_type(bkey)
  314.         if (qt[1] != oldpart)
  315.             puts "== #{oldpart} ==\n\n"
  316.             parts.sort.each do |avg, out|
  317.                 print out
  318.             end
  319.             parts = []
  320.         end
  321.         oldpart = qt[1]
  322.  
  323.         case qt[0]
  324.         when :matrix
  325.             total = bval[:total]
  326.             avg = 0
  327.             out = "#{labels[bkey]}\n"
  328.             out += "* total: #{total}\n"
  329.             scalelabels[qt[2]].each do |tkey,tval|
  330.                 out += "* #{tval} (#{tkey}): #{bval[tkey]} (#{"%.3f" % (bval[tkey] / total.to_f * 100)} %)\n"
  331.                 avg += tkey * bval[tkey] / total.to_f
  332.             end
  333.             out += "* avg: #{"%.6f" % avg}\n\n"
  334.             parts.push([avg, out])
  335.         end
  336.     elsif bkey.is_a? String
  337.         out = "Freie Nennung von Anträgen im Bereich \"#{bkey}\"\n"
  338.         bval.sort do |a,b|
  339.             a[1] <=> b[1]
  340.         end.reverse.each do |id,num|
  341.             out += "* WP#{"%03d" % id}: #{num}\n"
  342.         end
  343.         out += "\n"
  344.         parts.push([999, out])
  345.     elsif bkey == :freeproposal
  346.         puts "== Rest ==\n\n"
  347.         puts "Freie Nennung von Anträgen im Bereich GP*, PP*, X*"
  348.         bval.sort do |a,b|
  349.             a[1] <=> b[1]
  350.         end.reverse.each do |id,num|
  351.             puts "* #{id}: #{num}"
  352.         end
  353.         puts
  354.     end
  355. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement