Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env ruby
- # encoding: utf-8
- #
- # Evaluation script
- # for the Tagesordnung-relevant parts
- # of the Bundesparteitag 2013.1 Antragsreihenfolgeumfrage
- # of the popcorn-industry reviving Piratenpartei Deutschland.
- #
- # Input: CSV export for R
- #
- # Copyright (c) 2013, Stephan Beyer <s-beyer at gmx.net>
- #
- # Redistribution and use in source and binary forms, with or without
- # modification, are permitted provided that the following conditions are met:
- #
- # 1. Redistributions of source code must retain the above copyright notice, this
- # list of conditions and the following disclaimer.
- # 2. Redistributions in binary form must reproduce the above copyright notice,
- # this list of conditions and the following disclaimer in the documentation
- # and/or other materials provided with the distribution.
- #
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
- # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- #
- # The views and conclusions contained in the software and documentation are those
- # of the author and should not be interpreted as representing official policies,
- # either expressed or implied, of the project.
- def question_type(id)
- case id
- when 3..8 then [:matrix, "Demokratie wagen", :topic]
- when 9..12 then [:proposal, "Demokratie wagen"]
- when 13..16 then [:matrix, "Innen- und Rechtspolitik", :topic]
- when 17..20 then [:proposal, "Innen- und Rechtspolitik"]
- when 21..23 then [:matrix, "Europa", :topic]
- when 24..25 then [:proposal, "Europa"]
- when 26..31 then [:matrix, "Außenpolitik", :topic]
- when 32..39 then [:proposal, "Außenpolitik"]
- when 40..45 then [:matrix, "Arbeit und Soziales", :topic]
- when 46..49 then [:proposal, "Arbeit und Soziales"]
- when 50..52 then [:matrix, "Bildung und Forschung", :topic]
- when 53..55 then [:proposal, "Bildung und Forschung"]
- when 56..61 then [:matrix, "Internet, Netzpolitik und Artverwandtes", :topic]
- when 62..66 then [:proposal, "Internet, Netzpolitik und Artverwandtes"]
- when 67..69 then [:matrix, "Familie und Gesellschaft", :topic]
- when 70..72 then [:proposal, "Familie und Gesellschaft"]
- when 73..79 then [:matrix, "Wirtschaft und Finanzen", :topic]
- when 80..88 then [:proposal, "Wirtschaft und Finanzen"]
- when 89..94 then [:matrix, "Freiheit und Grundrechte", :topic]
- when 95..98 then [:proposal, "Freiheit und Grundrechte"]
- when 99..103 then [:matrix, "Gesundheitspolitik", :topic]
- when 104..106 then [:proposal, "Gesundheitspolitik"]
- when 107..111 then [:matrix, "Umwelt und Verbraucherschutz", :topic]
- when 112..114 then [:proposal, "Umwelt und Verbraucherschutz"]
- when 115..128 then [:matrix, "Zeitdauer", :duration]
- when 129..140 then [:matrix, "Zeitpunkt", :time]
- when 141..155 then [:freeproposal, "Grundsatzprogramme, Positionspapiere, Sonstiges"]
- else :unknown
- end
- end
- labels = {
- 3 => "Umfassende Anträge", # WP118 WP161
- 4 => "Bundestagswahlrecht", # WP156 WP036 WP121 WP148
- 5 => "Mitbestimmung", # WP002 WP146
- 6 => "Transparenz", # WP063
- 7 => "Subsidiarität", # WP125
- 8 => "Sonstiges", # WP048
- 9 => "Demokratie wagen",
- 10 => "Demokratie wagen",
- 11 => "Demokratie wagen",
- 12 => "Demokratie wagen",
- 13 => "Umfassende Anträge", # WP060 WP168
- 14 => "Staat und Religion", # WP069 WP062 WP167
- 15 => "Verfassungsschutz", # WP073 WP127
- 16 => "Sonstiges", # WP061 WP065 WP025 WP066
- 17 => "Innen- und Rechtspolitik",
- 18 => "Innen- und Rechtspolitik",
- 19 => "Innen- und Rechtspolitik",
- 20 => "Innen- und Rechtspolitik",
- 21 => "Vision für Europa", # WP133
- 22 => "Fiskalunion und ESM", # WP111 WP080 WP079
- 23 => "Zeitumstellung", # WP076
- 24 => "Europa",
- 25 => "Europa",
- 26 => "Umfassende Anträge", # WP170
- 27 => "Entwicklungspolitik", # WP024
- 28 => "Verteidigungspolitik", # WP022
- 29 => "Präambel", # WP010
- 30 => "Sicherheitspolitik", # WP011 WP096 WP101 WP116 WP021 WP117 WP100 WP031 WP115 WP023 WP017 WP163 WP015 WP120 WP027 WP028 WP029 WP030
- 31 => "Sonstiges", # WP139 WP140
- 32 => "Außenpolitik",
- 33 => "Außenpolitik",
- 34 => "Außenpolitik",
- 35 => "Außenpolitik",
- 36 => "Außenpolitik",
- 37 => "Außenpolitik",
- 38 => "Außenpolitik",
- 39 => "Außenpolitik",
- 40 => "ALG-II / Hartz-IV", # WP013
- 41 => "Bedingungsloses Grundeinkommen", # WP009 WP092
- 42 => "Arbeit", # WP014 WP058 WP020 WP153
- 43 => "Rente", # WP018 WP086 WP059
- 44 => "Commons", # WP090
- 45 => "Sonstiges", # WP057
- 46 => "Arbeit und Soziales",
- 47 => "Arbeit und Soziales",
- 48 => "Arbeit und Soziales",
- 49 => "Arbeit und Soziales",
- 50 => "Forschung und Wissenschaft", # WP067 WP045 WP152 WP046
- 51 => "Bildungspolitik", # WP128 WP132
- 52 => "Sonstiges", # WP141
- 53 => "Bildung und Forschung",
- 54 => "Bildung und Forschung",
- 55 => "Bildung und Forschung",
- 56 => "Umfassende Anträge", # WP162 WP142
- 57 => "Netzneutralität", # WP016
- 58 => "Urheberrecht", # WP097 WP098 WP099
- 59 => "Datenschutz", # WP084 WP126 WP134 WP145
- 60 => "E-Mail", # WP007 WP004 WP102
- 61 => "JMStV", # WP019
- 62 => "Internet, Netzpolitik und Artverwandtes",
- 63 => "Internet, Netzpolitik und Artverwandtes",
- 64 => "Internet, Netzpolitik und Artverwandtes",
- 65 => "Internet, Netzpolitik und Artverwandtes",
- 66 => "Internet, Netzpolitik und Artverwandtes",
- 67 => "Familien- und Geschlechterpolitik", # WP131 WP119 WP165 WP147 WP151
- 68 => "Migration und Inklusion", # WP054 WP068
- 69 => "Asyl", # WP074
- 70 => "Familie und Gesellschaft",
- 71 => "Familie und Gesellschaft",
- 72 => "Familie und Gesellschaft",
- 73 => "Umfassende Anträge", # WP171
- 74 => "Wirtschaft", # WP103 WP143 WP129 WP040
- 75 => "Haushalt", # WP149
- 76 => "Steuern", # WP064 WP034 WP173 WP033 WP112 WP008 WP072 WP026
- 77 => "Finanzpolitik", # WP047 WP051 WP037 WP091 WP081
- 78 => "Transparenz und Antikorruption", # WP052 WP012 WP053 WP093
- 79 => "Sonstiges", # WP003 WP044
- 80 => "Wirtschaft und Finanzen",
- 81 => "Wirtschaft und Finanzen",
- 82 => "Wirtschaft und Finanzen",
- 83 => "Wirtschaft und Finanzen",
- 84 => "Wirtschaft und Finanzen",
- 85 => "Wirtschaft und Finanzen",
- 86 => "Wirtschaft und Finanzen",
- 87 => "Wirtschaft und Finanzen",
- 88 => "Wirtschaft und Finanzen",
- 89 => "Umfassende Anträge", # WP160
- 90 => "Informationelle Selbstbestimmung", # WP055 WP085
- 91 => "Überwachung", # WP110 WP082 WP113
- 92 => "Prostitution", # WP104
- 93 => "Fanrechte", # WP005 WP006
- 94 => "Sonstiges", # WP144 WP124
- 95 => "Freiheit und Grundrechte",
- 96 => "Freiheit und Grundrechte",
- 97 => "Freiheit und Grundrechte",
- 98 => "Freiheit und Grundrechte",
- 99 => "Umfassende Anträge", # WP166
- 100 => "Gesundheitspolitik", # WP078 WP150 WP070
- 101 => "Drogen- und Suchtpolitik", # WP042
- 102 => "Psyche", # WP001
- 103 => "Nichtraucherschutz", # WP056
- 104 => "Gesundheitspolitik",
- 105 => "Gesundheitspolitik",
- 106 => "Gesundheitspolitik",
- 107 => "Umfassende Anträge", # WP164
- 108 => "Atommüll", # WP159 WP114
- 109 => "Bauen und Wohnen", # WP155 WP130 WP157
- 110 => "Bauen und Verkehr", # WP043 WP077
- 111 => "Sonstiges", # WP172
- 112 => "Umwelt und Verbraucherschutz",
- 113 => "Umwelt und Verbraucherschutz",
- 114 => "Umwelt und Verbraucherschutz",
- 115 => "Zeitdauer Gesamtanträge",
- 116 => "Zeitdauer Präambel",
- 117 => "Zeitdauer Freiheit und Grundrechte",
- 118 => "Zeitdauer Demokratie wagen",
- 119 => "Zeitdauer Internet, Netzpolitik und Artverwandtes",
- 120 => "Zeitdauer Bildung und Forschung",
- 121 => "Zeitdauer Umwelt und Verbraucherschutz",
- 122 => "Zeitdauer Arbeit und Soziales",
- 123 => "Zeitdauer Familie und Gesellschaft",
- 124 => "Zeitdauer Gesundheitspolitik",
- 125 => "Zeitdauer Europa",
- 126 => "Zeitdauer Außenpolitik",
- 127 => "Zeitdauer Wirtschaft und Finanzen",
- 128 => "Zeitdauer Innen- und Rechtspolitik",
- 129 => "Zeitpunkt Freiheit und Grundrechte",
- 130 => "Zeitpunkt Demokratie wagen",
- 131 => "Zeitpunkt Internet, Netzpolitik und Artverwandtes",
- 132 => "Zeitpunkt Bildung und Forschung",
- 133 => "Zeitpunkt Umwelt und Verbraucherschutz",
- 134 => "Zeitpunkt Arbeit und Soziales",
- 135 => "Zeitpunkt Familie und Gesellschaft",
- 136 => "Zeitpunkt Gesundheitspolitik",
- 137 => "Zeitpunkt Europa",
- 138 => "Zeitpunkt Außenpolitik",
- 139 => "Zeitpunkt Wirtschaft und Finanzen",
- 140 => "Zeitpunkt Innen- und Rechtspolitik",
- 141 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 142 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 143 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 144 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 145 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 146 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 147 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 148 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 149 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 150 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 151 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 152 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 153 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 154 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- 155 => "Grundsatzprogramme, Positionspapiere, Sonstiges",
- }
- scalelabels = {
- :topic => {
- 1 => "Ja, auf jeden Fall",
- 2 => "Eher ja",
- 3 => "Eher nein",
- 4 => "Nein, auf keinen Fall"
- },
- :duration => {
- 1 => "viel länger",
- 2 => "länger",
- 3 => "genau richtig",
- 4 => "kürzer",
- 5 => "viel kürzer"
- },
- :time => {
- 1 => "Samstag vormittag",
- 2 => "Samstag nachmittag",
- 3 => "Sonntag vormittag",
- 4 => "Sonntag nachmittag"
- }
- }
- buckets = {}
- resfile = File.open("survey_925538_R_data_file.csv")
- i = 0
- labels.each do |key,val|
- qt = question_type(key)
- case qt[0]
- when :matrix
- buckets[key] = Hash.new(0)
- when :proposal
- buckets[val] = Hash.new(0) if buckets[val].nil?
- end
- end
- buckets[:freeproposal] = Hash.new(0)
- resfile.each_line do |l|
- i += 1
- next if i == 1;
- proposalcount = {}
- line = l.chomp!.split(/,/, 168)
- labels.each do |key,val|
- x = line[key]
- if (!x.empty?)
- x = x[1...-1]
- qt = question_type(key)
- case qt[0]
- when :matrix
- x = x.to_i
- buckets[key][x] += 1
- buckets[key][:total] += 1
- when :proposal
- x = x.to_i
- proposalcount[val] = Hash.new(0) if proposalcount[val].nil?
- proposalcount[val][x] += 1
- when :freeproposal
- x.upcase!
- x.tr!(' ', '')
- if (x[0,2] != 'GP' && x[0,2] != 'PP' && x[0,1] != 'X')
- STDERR.puts "Warnung in Zeile #{i}: ungültige Eingabe bei freier Nennung zu GP/X/PP."
- else
- proposalcount[:freeproposal] = Hash.new(0) if proposalcount[val].nil?
- proposalcount[:freeproposal][x] += 1
- end
- end
- end
- end
- if (!proposalcount.empty?)
- proposalcount.each do |key,val|
- val.each do |id,num|
- if (num > 2)
- STDERR.puts "Warnung in Zeile #{i}: #{id} wurde mehr als zwei mal genannt! Zähle nur zwei mal."
- num = 2
- end
- buckets[key][id] += num
- end
- end
- end
- end
- oldpart = ''
- parts = []
- buckets.each do |bkey,bval|
- if bkey.is_a? Numeric
- qt = question_type(bkey)
- if (qt[1] != oldpart)
- puts "== #{oldpart} ==\n\n"
- parts.sort.each do |avg, out|
- print out
- end
- parts = []
- end
- oldpart = qt[1]
- case qt[0]
- when :matrix
- total = bval[:total]
- avg = 0
- out = "#{labels[bkey]}\n"
- out += "* total: #{total}\n"
- scalelabels[qt[2]].each do |tkey,tval|
- out += "* #{tval} (#{tkey}): #{bval[tkey]} (#{"%.3f" % (bval[tkey] / total.to_f * 100)} %)\n"
- avg += tkey * bval[tkey] / total.to_f
- end
- out += "* avg: #{"%.6f" % avg}\n\n"
- parts.push([avg, out])
- end
- elsif bkey.is_a? String
- out = "Freie Nennung von Anträgen im Bereich \"#{bkey}\"\n"
- bval.sort do |a,b|
- a[1] <=> b[1]
- end.reverse.each do |id,num|
- out += "* WP#{"%03d" % id}: #{num}\n"
- end
- out += "\n"
- parts.push([999, out])
- elsif bkey == :freeproposal
- puts "== Rest ==\n\n"
- puts "Freie Nennung von Anträgen im Bereich GP*, PP*, X*"
- bval.sort do |a,b|
- a[1] <=> b[1]
- end.reverse.each do |id,num|
- puts "* #{id}: #{num}"
- end
- puts
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement