[viesti Survo-keskustelupalstalla (2001-2013)]
Kirjoittaja: | Kimmo Vehkalahti |
---|---|
Sähköposti: | Kimmo.Vehkalahti'at'helsinki.fi |
Päiväys: | 6.3.2002 12:35 |
Haluaisin demonstroida (minulle) tyypillistä Survo-työskentelyä käyttämällä esimerkkinä tietoja tämän keskusteluryhmän viesteistä. Kyseessä on täysin julkinen aineisto, nimittäin se lista, jonka näkee avatessaan nettiselaimella tämän keskusteluryhmän. Olisi hauska selvittää esimerkiksi, kuka on kirjoittanut ja miten monta viestiä, minä viikonpäivinä ja mihin kellonaikaan on yleensäkin kirjoiteltu jne. Katsotaanpa miten se käy. Talletan keskustelun pääsivun HTML-muodossa selaimellani (IE): View -> Source -> (Notepad) -> File -> Save As -> E:\keskustelu.html (Olisin voinut siirtää tekstin leikepöydän kautta, mutta talletin nyt kuitenkin tekstitiedostoksi.) Sitten vain Survo auki ja työhön: DIR E:\keskustelu.html KESKUS~1.HTM 73641 05.03.2002 08:54 Windowsissa esiintyy pitkiä ja lyhyitä tiedostonimiä. Lyhyestä virsi kaunis, mutta joskus tarvitaan noita pidempiäkin (esim. WWW-sivuja tehdessä). Tässä tiedostonimen tekee pitkäksi sekä nimi ("keskustelu") että tyyppi (".html"). Ei haittaa. Tarvittaessa molempien käsittelyyn löytyy Survosta välineet: INDEX /SHORTNAME E:\keskustelu.html E:\KESKUS~1.HTM INDEX /LONGNAME E:\KESKUS~1.HTM E:\keskustelu.html Myös muut ns. työpöytätoiminnot (DD, DM jne.) osaavat suhtautua asiallisesti minkälaisiin nimiin tahansa (tässä asiassa olen viimeisen puolen vuoden aikana tehnyt muutamia tarkennuksia, kun olen kohdannut joitain ongelmatilanteita). Kopioidaan DIR-komento edeltä (alt-F3) ja pannaan SHOW käyntiin: SHOW E:\keskustelu.html Selailemalla selviää että kiinnostavia ovat rivit 55-309, joista pisin on jotakuinkin 430 merkkiä. Levennetään ja pidennetään toimituskenttä riittävän kokoiseksi: REDIM 2000 500 Koska tiedosto on Windows-merkistössä, käytetään LOADW- eikä tyypillisempää LOADP-komentoa: (Kopioidaan taas komento edeltä ja vaihdetaan hevosta; poimitaan vain keskusteluotsikot ja jätetään muu tauhka pois.) LOADW E:\keskustelu.html 55,309,END+10 / jätetään väliin työtilaa (sitä saa tietenkin lisää alt-F9:llä tarpeen mukaan) En kopioi rivejä tähän viestiini; jokainen näkee omalla selaimellaan, mistä on kysymys. Rivit ovat joka tapauksessa muotoa <img src="/board/html/images/dots.gif" alt="- "> <TT> <A HREF="board.cgi?&read=000260-000259.msg&area=keskustelua_survosta"> Re: ääkköset</A> </TT> <SMALL> - <B>Kimmo Vehkalahti</B> 20.2.2002 15:41 <I></I> </SMALL> <BR> Kaikki nuo siis samalla rivillä peräkkäin; img-koodien määrä alussa vaihtelee sen mukaan onko kyseessä jutun aloitus vai kommentti. Edellisten kohdalla <I>- ja </I>-koodien välissä on "Uusin vastaus" -teksti. (Tätä puuroa suoltaa siis Soneran skripti, osittain tekemieni säätöjen mukaisesti.) Kopioin huvikseni tekstimassan samantien uuteen tekstitiedostoon (SAVEW-komennolla) jotta sain sen laajuuden selville: 68374 tavua. Suurin osa on tässä yhteydessä turhaa, HTML-koodeja ym. Nyt tästä sotkusta on parasta muotoilla kunnollinen tilastoaineisto. Rakennetta tutkimalla selviää että viestien numerointi noudattaa tiettyä logiikkaa. Kaksiosaisen koodin ensimmäinen luku on juokseva numero, eli monesko viesti kaikkiaan on kyseessä tässä keskusteluryhmässä. Toinen puolestaan näyttää olevan nolla mikäli kyseessä on uusi aihe ja kommentin tapauksessa kommentoitavan viestin numero. Nämä lukemat kannattaa myös haalia talteen. Muodostettavan aineiston muuttujat olisivat siis seuraavat: Nro1 Nro2 Pvm Klo Nimi Tiedot ovat nimiä lukuunottamatta melko täsmällisiä (Pvm ja Klo ovat kyllä samanmuotoisia mutta ilman etunollia jolloin ne ovat vaihtelevan pituisia). Kokemus sanoo, että nimet kannattaa järjestää rivien loppuun. Sillä säästää jonkin verran vaivaa aineiston ryhdistämisessä. Päätän jättää viestien otsikot tässä yhteydessä käsittelemättä. Kukin voi halutessaan laajentaa tarkastelut koskemaan myös niitä. Nyt ei tarvitse muuta kuin oivaltaa se systematiikka, jolla tiedot ovat kaivettavissa turhien koodien seasta. Katsotaanpa: Kaksi ensimmäistä tietoa on upotettu seuraavanlaisiin kääreisiin: ...cgi?&read=000260-000259.msg... Tästä ne on helppo tunnistaa ja poistaa turhat edestä ja takaa. Sen jälkeen saakin poistaa aika paljon (kun viestien otsikot unohdetaan). Seuraavan tiedon signaalina toimii HTML-koodin <B>. Sen loppumerkistä </B> eteenpäin ovat nähtävissä muut tiedot. Kellonajan jälkeisestä tyhjästä eteenpäin voi poistaa loput ja siirtyä seuraavaan tietueeseen. <B>Kimmo Vehkalahti</B> 20.2.2002 15:41 <I></I>... Mitään ohjelmaa tässä ei kannata alkaa kirjoittaa. Tehtävä hoituu helpommin ns. tutoriaalisessa moodissa eli nauhoittamalla, ts. näytetään Survolle kerran miten homma tehdään ja käsketään sen jatkaa eli hoitaa likainen työ hamaan loppuun saakka. Kun Survo pääsee vauhtiin, se ei ominpäin lopettaisi lainkaan. Se täytyy vain keskeyttää (painamalla pistettä) sitten kun alkaa näyttää että menee tyhjäntoimittamiseksi. Teenpä tässä välissä työtä selostettua... (toimituskenttä kannattaa viimeistään nyt panna talteen, jotta voi kokeilla yrityksen ja erehdyksen kautta niin kauan että onnistuu). [Vaati pari kokeilua, koska havaitsin samantien kehitystarpeita.] Panin nimittäin sukron samalla ryhdistämään tiedot valmiiksi jo niin pitkälle, että ne alkavat samoista sarakkeista. Tällä tavoin materiaali tulee muuntumaan suoraan Survo-dataksi ilman että tarvitsee nähdä erikseen mitään lisävaivaa. Laitanpa raakadatan yläpuolelle valmiit mallirivit, joiden mukaan asettelen tiedot näppäinsekvenssejä nauhoittaessani: 111111 111111 AAAAAAAAAA AAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Nro1 Nro2 Pvm Klo Nimi Sukron työtä on ilo katsella - atk:ta parhaimmillaan! Kovin kauaa sitä iloa ei kestä, sillä hetken päästä ollaan jo seuraavassa vaiheessa. Sukron survoma taulukko näyttää alkupäästään tältä: 000262 000000 4.3.2002 9:48 Seppo Mustonen 000261 000000 24.2.2002 17:02 Seppo Mustonen 000259 000000 20.2.2002 12:54 Erkki Laukkanen 000260 000259 20.2.2002 15:41 Kimmo Vehkalahti 000242 000000 6.2.2002 16:24 Juha Wikström 000243 000242 6.2.2002 18:29 Seppo Mustonen 000244 000243 7.2.2002 8:55 Juha Wikström 000258 000244 17.2.2002 12:06 Kimmo Vehkalahti 000254 000000 10.2.2002 12:04 Esko Kaukonen Voisi olla hyödyllistä katsastaa, millä tavalla tämä raskain työvaihe lopulta toteutui. Tarkastellaan siis sukroa TMP (niin kuin temporary l. väliaikainen, usein käyttämäni nimi tällaisissa operaatioissa), joka nauhoituksen jäljiltä on tallettunut: TUTLOAD TMP / otetaan sukrokoodi esiin aivan paljaaltaan {search}&read{R} {r6}{d}{u}{ins line}{u}{merge}{line start}{del line}{r6} {r6}{d}{u} {ins line}{u}{merge}{line start}{R} {search}<B{R} {d}{u}{ins line}{u}{merge}{line start}{del line}{del3}{search}</{R} {del10}{block}{block}{search} {R} {l}{block}{erase}{erase}{u}{line end} {block}{block}{block}{block} {next word}{block}{block}{line end}{block}{erase}{line start}{r25} {block}{block}{block}{block}{line start}{r31}{merge}{R} {del line}{repeat} Katsotaan vaiheet pala palalta. Samalla talletetaan sukro vastaisen varalle eri nimellä, ja lisäksi dokumentoituna. Edelleen voidaan järjestää niin että sukro osaa itse lopettaa työskentelynsä kun kohtaa tyhjän rivin. Myös sen aloitus on luontevampaa järjestää tietojen yläpuolelta eikä ensimmäiseltä riviltä. Lisätään siis alkuun yksi {R} eli Enter. [Jotta sukrokoodin kannalta oleellinen kentän 0. sarake eli ns. kontrollisarake näkyisi, olen siirtänyt koodin lopullisessa esityksessä yhden pykälän oikealla INSERT-komennolla. Sen voi palauttaa vastaavasti vasemmalle DELETE-komennolla, kun aktivoi sen asetettuaan kohdistimen ensin kontrollisarakkeeseen.] DELETE *TUTSAVE KES /-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- / KES.TUT / Keskustelua Survosta -sisällyksen ryhdistäminen jatkokäsittelyä / varten (K.Vehkalahti 5.3.2002) / Oletetaan että viestien tiedot ovat toimituskentän peräkkäisillä / riveillä alkuperäisessä (HTML-)muodossaan. / / %%%%%%%%-rivien välissä on osoitettu malli työn kohteena olevan / rivin vaiheista oleellisimmilta osiltaan. / / (Sukro on suorastaan ylikommentoitu demotarkoituksessa.) / /-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- / / Tehdään sukron tyypilliset alustustoimet ja pannaan täysi rähinä / (maksimaalinen vauhti) päälle: / *{init}{tempo -1} / / Kohdistimen paikka talteen paluuta varten: / *{ref set 1} / / Siirrytään ensimmäiselle riville ja käydään työhön: / *{R} / / Tarkistetaan onko mitään tehtävää: / + Työ: {save word W1} - if W1 '=' {sp} then goto Loppu / / 1) Viestien numerot Nro1 ja Nro2 / /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /...board.cgi?&read=000260-000259.msg&area... /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / / Siirretään Nro1:stä alkaen tiedot uudelle riville: / *{search}&read{R}{r6}{d}{u}{ins line}{u}{merge} / / ({d}{u} on rutiininomainen varotoimenpide ennen {ins line}-koodia, / joka varmistaa ettei hankaluuksia synny jos ollaan ikkunan / alimmalla rivillä, {r6} tarkoittaa nuoli oikealle 6 kertaa, / {R} tässä kohtaa lopettaa {search}:illä alt-F5 aloitetun haun) / / Tuhotaan omalle rivilleen jätetty alkuosa, kohdistin sen jälkeen / uuden rivin alussa: / *{line start}{del line} / / ({line start}: pomminvarma koodi, jota on parasta käyttää sukroissa / {home}-koodin sijasta, jonka toiminta riippuu siitä missä kohdistin / kulloinkin on; {line start}:in näppäinyhdistelmä on F2-B) / /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /000260-000259.msg&area... /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / / Katkaistaan vastaavasti .msg:stä alkaen seuraavalle riville; / ohimennen muutetaan väliviiva välilyönniksi: / *{r6} {r6}{d}{u}{ins line}{u}{merge} / /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /000260 000259 /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / / Jätetään Nro1 ja Nro2 keskenään, siirrytään seuraavan rivin alkuun: / *{line start}{R} / / 2) Nimi, Pvm ja Klo / /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /... <B>Kimmo Vehkalahti</B> 20.2.2002 15:41 <I>... /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / / Aivan samoin kuin edellä, siirretään oleelliset ja tuhotaan turhat: / *{search}<B{R}{d}{u}{ins line}{u}{merge} / *{line start}{del line} / /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /<B>Kimmo Vehkalahti</B> 20.2.2002 15:41 <I>... /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / / Siistitään koodit pois nimen ympäriltä, kohdistin jää Pvm:n alkuun: / *{del3}{search}</{R}{del10} / /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Kimmo Vehkalahti20.2.2002 15:41 <I>... /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / / Merkitään Pvm ja Klo tekstiblokiksi "20.2.2002 15:41 " ja / napataan se talteen: / *{block}{block}{search} {R}{l}{block}{erase} / /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /Kimmo Vehkalahti <I>... /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / / Poistetaan loputkin rivistä; palataan edelliselle ja kopioidaan / blokki sinne Nro2:n perään, kohdistin jää Pvm:n alkuun: / *{erase}{u}{line end} {block}{block}{block}{block} / /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /000260 000259 20.2.2002 15:41 /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / / Siirretään Klo sen verran oikealle että pisimmänkin Pvm:n jälkeen / on aina yksi tyhjä välissä. Käytetään taas blokkia: / *{next word}{block}{block}{line end}{block}{erase} *{line start}{r25}{block}{block}{block}{block} / / ({next word} on usein hyödyllinen koodi, näppäinyhdelmä on F2-W) / /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /000260 000259 20.2.2002 15:41 /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / / Haetaan vastaavalla tavalla sopiva paikka kirjoittajan nimelle ja / siirretään se paikalleen seuraavalta riviltä: / *{line start}{r31}{merge} / /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% /000260 000259 20.2.2002 15:41 Kimmo Vehkalahti /%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% / / Tuhotaan lopuksi tyhjäksi jäänyt alempi rivi, jolloin ollaan uuden / haasteen edessä - ei kun takaisin Työhön: / *{R}{del line}{goto Työ} / / Työn loputtua (kun sukromuistiin on tallentunut vain tyhjää {sp}:n / muodossa), tullaan tänne. Viedään kohdistin alkuperäiseen paikkaan / ja lopetetaan (samalla täysi rähinä pois): / + Loppu: {ref jump 1}{tempo +1}{end} Nyt sukron nauhoituksessa käytetyistä malliriveistä saadaan kaikki hyöty irti, kun varustetaan taulukko DATA-määrittelyllä. Rivejähän on alussa todetun mukaisesti 309-55+1=255, joten riittää nimetä esim. muuttujarivi A:ksi; aineiston 1. havainto on tällöin rivillä A+1, viimeinen rivillä A+255 ja muuttujien maskit rivillä A-1. (Maskirivi on tarpeen nimissä esiintyvien välilyöntien vuoksi.) Siis näin: [tämäkin kohta kontrollisarakkeen takia siirretty oikealle] *DATA K A+1 A+255 A A-1 *111111 111111 AAAAAAAAAA AAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ANro1 Nro2 Pvm Klo Nimi *000262 000000 4.3.2002 9:48 Seppo Mustonen *000261 000000 24.2.2002 17:02 Seppo Mustonen *000259 000000 20.2.2002 12:54 Erkki Laukkanen *000260 000259 20.2.2002 15:41 Kimmo Vehkalahti * - - - - [250 riviä poistettu] - - - - - - *000001 000000 5.6.2001 10:52 Seppo Mustonen Kentässä ei kannata datoja säilytellä, tehdään siis samantien Survon havaintotiedosto KES: FILE COPY K TO KES FILE SHOW KES / hyvältä näyttää! Tiedoston rakenne on muotoutunut seuraavaksi: FILE STATUS KES Copy of data matrix K FIELDS: (active) 1 N1_ 8 Nro1 (######) 2 N1_ 8 Nro2 (######) 3 SA_ 10 Pvm 4 SA_ 5 Klo 5 SA_ 38 Nimi END Survo data file KES: record=106 bytes, M1=10 L=64 M=5 N=255 Kaksi ensimmäistä muuttujaa ovat siis numeerisia (N) ja loput sanallisia (S), pituudet 10, 5 ja 38 merkkiä (maskin perusteella). Tehdäänpä alustava yhteenveto sen kummemmin miettimättä: STAT KES CUR+1 / perusstatistiikka muuttujittain Basic statistics: KES N=255 Variable: Nro1 (######) min=1 in obs.#255 max=262 in obs.#1 mean=131.1137 stddev=75.7006 skewness=0.006538 kurtosis=-1.204417 autocorrelation=0.9906 lower_Q=65.52632 median=131 upper_Q=196.75 up.limit f % class width=20 20 19 7.5 ******************* 40 20 7.8 ******************** 60 20 7.8 ******************** 80 19 7.5 ******************* 100 20 7.8 ******************** 120 19 7.5 ******************* 140 20 7.8 ******************** 160 20 7.8 ******************** 180 18 7.1 ****************** 200 20 7.8 ******************** 220 20 7.8 ******************** 240 19 7.5 ******************* 260 19 7.5 ******************* 280 2 0.8 ** Tästä nyt ei voi luonnollisesti päätellä muuta kuin että ensimmäisen viestin numero on 1 ja viimeisen 262 sekä että joitakin numeroita puuttuu välistä (tyhjiä ym. poistettuja viestejä). Variable: Nro2 (######) min=0 in obs.#1 max=259 in obs.#4 mean=84.38431 stddev=84.88539 skewness=0.521627 kurtosis=-1.184836 lower_Q=-4.518072 median=61.53846 upper_Q=159.5455 up.limit f % *=2 obs. class width=20 0 83 32.5 ***************************************** 20 15 5.9 ******* 40 14 5.5 ******* 60 15 5.9 ******* 80 13 5.1 ****** 100 16 6.3 ******** 120 9 3.5 **** 140 16 6.3 ******** 160 11 4.3 ***** 180 12 4.7 ****** 200 14 5.5 ******* 220 16 6.3 ******** 240 11 4.3 ***** 260 10 3.9 ***** Muuttujan Nro2 tiedoista voi sen sijaan jo nähdä, että uusia viestiaiheita on 83, joten kommentteja niihin on N-83=172 (saman voisi laskea myös kosketuslaskennalla yo. frekvenssitaulukosta, mutta tässä editoriaalinen laskenta oli kätevämpi, varsinkin kun tiesin että STAT kirjoittaa N:n tulosten alkuun jolloin sitä voi hyödyntää suoraan symbolisessa muodossa). Variable: Pvm min=1.2 in obs.#36 max=31.8 in obs.#187 mean=16.0038 stddev=9.113495 skewness=0.064441 kurtosis=-1.372444 autocorrelation=0.5537 lower_Q=7.396552 median=16 upper_Q=24.7381 up.limit f % class width=2 2 3 1.2 *** 4 16 6.3 **************** 6 25 9.8 ************************* 8 29 11.4 ***************************** 10 13 5.1 ************* 12 19 7.5 ******************* 14 8 3.1 ******** 16 15 5.9 *************** 18 9 3.5 ********* 20 15 5.9 *************** 22 23 9.0 *********************** 24 9 3.5 ********* 26 21 8.2 ********************* 28 25 9.8 ************************* 30 13 5.1 ************* 32 12 4.7 ************ Survo osaa hyödyntää tiedot numeerisesti myös merkkijonomuuttujista, mikä on usein erittäin hyödyllistä. Tässä kun pvm-erottimena on piste (sama kuin Survon desimaalierotin), seuraa pyöristyksiä, joiden johdosta tulokset ovat hieman karkeita. Palataan Pvm-muuttujaan myöhemmin hieman toisella tavalla. Variable: Klo min=0 in obs.#49 max=23 in obs.#31 mean=13.3098 stddev=3.784825 skewness=-0.510942 kurtosis=2.122659 lower_Q=11 median=13 upper_Q=16 Klo f % 0 5 2.0 ***** 1 1 0.4 * 8 5 2.0 ***** 9 21 8.2 ********************* 10 23 9.0 *********************** 11 18 7.1 ****************** 12 29 11.4 ***************************** 13 29 11.4 ***************************** 14 33 12.9 ********************************* 15 23 9.0 *********************** 16 25 9.8 ************************* 17 17 6.7 ***************** 18 10 3.9 ********** 19 2 0.8 ** 20 5 2.0 ***** 21 3 1.2 *** 22 4 1.6 **** 23 2 0.8 ** Kellonajan suhteen (erottimena kaksoispiste) tapahtuu vain katkaisu, joten yllä oleva jakauma kertoo millä tunneilla viestejä on lähetelty. Kuten näkyy, pikkutunneilla on hiljaista. Variable: Nimi Cannot be classified Eri kirjoittajia on sen verran ettei frekvenssijakaumaa saada ellei säädetä STATin toimintaa erikseen CLASSMAX-täsmennyksellä. En tee sitä kuitenkaan nyt. ............................. Lajitellaan aineisto selailun kannalta loogisempaan järjestykseen: FILE SORT KES BY Nro1 TO KES1 FILE SHOW KES1 Tutkitaan sitten päivämääriä tarkemmin. Tehdään uusi muuttuja VAR Päivä:S12=MISSING TO KES1 Täytetään se viikonpäivillä DATE-operaation avulla: DATE KES1 / VARS=Pvm(D),Päivä(a) IDATE=DD.MM.YYYY ............................. Muutetaan viikonpäivät samantien suomenkielisiksi (samaan muuttujaan, siksi 12 merkin tilavaraus): CLASSIFY KES1,VKO,Päivä,Päivä CLASSIFICATION VKO Mon: maanantai Tue: tiistai Wed: keskiviikko Thu: torstai Fri: perjantai Sat: lauantai Sun: sunnuntai END FILE SHOW KES1 Kysymys kuuluu: "Minä päivinä tänne kirjoitellaan?" Vastauksen antaa jälleen STAT: STAT KES1 CUR+1 / VARS=Päivä MAXSTRING=11 Basic statistics: KES1 N=255 Variable: Päivä ~MISSING entropy=2.622884 (93.4%) Päivä f % *=2 obs. keskiviikko 35 13.7 ***************** lauantai 12 4.7 ****** maanantai 59 23.1 ***************************** perjantai 53 20.8 ************************** sunnuntai 12 4.7 ****** tiistai 46 18.0 *********************** torstai 38 14.9 ******************* STAT aakkostaa nämä viran puolesta, mutta heitetään ne tuosta luonnolliseen järjestykseensä kosketuslaskennan mainiolla rivien keräilytekniikalla (F3 -> 'V' vuorotellen, '=' tulostaa): maanantai 59 23.1 ***************************** tiistai 46 18.0 *********************** keskiviikko 35 13.7 ***************** torstai 38 14.9 ******************* perjantai 53 20.8 ************************** lauantai 12 4.7 ****** sunnuntai 12 4.7 ****** Arkiviikon alut ja loput ovat siis tyypillisimpiä, viikonloput yllättävänkin hiljaisia. ................................................ Entä millainen on päivien numeroiden jakauma? Käytetään samaa muuttujaa ja ongitaan asia selville: DATE KES1 / VARS=Pvm(D),Päivä(d) IDATE=DD.MM.YYYY ODATE=DD FILE SHOW KES1 Tässä on taas hyötyä siitä että merkkijonomuuttujilla voi tehdä numeerisia operaatioita. Joissain tilanteissa saatetaan tarvita etunollia, jotka tässäkin DATE tallettaa; silloin merkkijonomuuttuja on välttämätön. Yleensä etunollilla ei ole mitään merkitystä, ja mikäli muuttujaa voidaan käsitellä numeerisena, etunollat häviävät tulostuksissa. Laitetaanpa datatiedoston KES1 rakenteeseen lisätieto että muuttuja Päivä on järjetysasteikollinen (FILE ACTIVATE -toiminnon avulla). Tällöin etunollat säilyvät myös STATin tulostuksissa (ja samalla jäävät tässä yhteydessä epäloogiset keskiarvot ym. tulostamatta): STAT KES1 CUR+2 / VARS=Päivä CLASSMAX=31 Basic statistics: KES1 N=255 Variable: Päivä ~MISSING Ordinal scale min=1 in obs.#72 max=31 in obs.#56 lower_Q=7 median=15 upper_Q=24 Päivä f % 01 3 1.2 *** 02 10 3.9 ********** 03 6 2.4 ****** 04 16 6.3 **************** 05 9 3.5 ********* 06 10 3.9 ********** 07 19 7.5 ******************* 08 8 3.1 ******** 09 5 2.0 ***** 10 9 3.5 ********* 11 10 3.9 ********** 12 2 0.8 ** 13 6 2.4 ****** 14 7 2.7 ******* 15 8 3.1 ******** 16 3 1.2 *** 17 6 2.4 ****** 18 11 4.3 *********** 19 4 1.6 **** 20 14 5.5 ************** 21 9 3.5 ********* 22 3 1.2 *** 23 6 2.4 ****** 24 10 3.9 ********** 25 11 4.3 *********** 26 14 5.5 ************** 27 11 4.3 *********** 28 7 2.7 ******* 29 6 2.4 ****** 30 4 1.6 **** 31 8 3.1 ******** Tasaisesta jakaumasta tuskin voidaan puhua, mutta tarkistetaan nyt kuitenkin histogrammin ja jakaumansovituksen avulla: GHISTO KES1,Päivä,END+2 / Päivä=0.5(1)31.5 FIT=UNIFORM(1,31) (histogrammi ilmestyy omaan kuvaikkunaansa) Frequency distribution of Päivä in KES1: N=255 Class midpoint f % Sum % e e f X^2 1.0 3 1.2 3 1.2 6.3 6.3 3 1.7 2.0 10 3.9 13 5.1 8.4 8.4 10 0.3 3.0 6 2.4 19 7.5 8.4 8.4 6 0.7 4.0 16 6.3 35 13.7 8.4 8.4 16 7.0 5.0 9 3.5 44 17.3 8.4 8.4 9 0.0 6.0 10 3.9 54 21.2 8.4 8.4 10 0.3 7.0 19 7.5 73 28.6 8.4 8.4 19 13.5 8.0 8 3.1 81 31.8 8.4 8.4 8 0.0 9.0 5 2.0 86 33.7 8.4 8.4 5 1.4 10.0 9 3.5 95 37.3 8.4 8.4 9 0.0 11.0 10 3.9 105 41.2 8.4 8.4 10 0.3 12.0 2 0.8 107 42.0 8.4 8.4 2 4.8 13.0 6 2.4 113 44.3 8.4 8.4 6 0.7 14.0 7 2.7 120 47.1 8.4 8.4 7 0.2 15.0 8 3.1 128 50.2 8.4 8.4 8 0.0 16.0 3 1.2 131 51.4 8.4 8.4 3 3.4 17.0 6 2.4 137 53.7 8.4 8.4 6 0.7 18.0 11 4.3 148 58.0 8.4 8.4 11 0.8 19.0 4 1.6 152 59.6 8.4 8.4 4 2.3 20.0 14 5.5 166 65.1 8.4 8.4 14 3.8 21.0 9 3.5 175 68.6 8.4 8.4 9 0.0 22.0 3 1.2 178 69.8 8.4 8.4 3 3.4 23.0 6 2.4 184 72.2 8.4 8.4 6 0.7 24.0 10 3.9 194 76.1 8.4 8.4 10 0.3 25.0 11 4.3 205 80.4 8.4 8.4 11 0.8 26.0 14 5.5 219 85.9 8.4 8.4 14 3.8 27.0 11 4.3 230 90.2 8.4 8.4 11 0.8 28.0 7 2.7 237 92.9 8.4 8.4 7 0.2 29.0 6 2.4 243 95.3 8.4 8.4 6 0.7 30.0 4 1.6 247 96.9 8.4 8.4 4 2.3 31.0 8 3.1 255 100.0 6.3 6.3 8 0.5 Mean=15.61961 Std.dev.=9.031991 Fitted by UNIFORM(1,31) distribution Chi-square=55.66 df=30 P=0.0030 Tasajakaumahypoteesi kaatuukin kirkkaasti. Toisaalta havaintojakin on melko vähän jaettavaksi 31 päivälle. .................................. Eräs kiintoisa kysymys kuuluu tietysti: "Kuka tänne kirjoittaa?" Järjestetään aineisto ensin kirjoittajan mukaan, kuitenkin niin ettei samasteta pieniä ja ISOJA kirjaimia (kuten oletuksena tapahtuu) eli käytetään FILTER=SORTLOW.BIN -täsmennystä. Jotkut ovat nimittäin kirjoittaneet nimensä välillä pienin, välillä isoin kirjaimin tms. Nimissä on kyllä muutakin sotkua, kuten aineistoa selaillessa voi havaita. Ei nyt välitetä siitä. Aggrekoidaan aineisto nimen mukaan. Kovin paljon vaihtoehtoja ei ole millekään laskelmille, mutta lasketaan vaikka aikaisin ajankohta (tunnin tarkkuudella) jolloin on kirjoittanut viestin. Valitaan siis VARS=Nimi,Klo ja funktioksi AGGRE=MIN (tietysti voidaan kysyä, onko klo 0 tai 1 aikaisin vai myöhään..). Uutena muuttujana saadaan joka tapauksessa FREQ, joka kertoo havaintojen lukumäärän aggrekaatin sisällä, ts. jokaisen eri nimisen kirjoittajan viestien lukumäärän. AGGRE-sukro tekee työnsä ja antaa lopuksi valmiin FILE SHOW -komennon kenttään: /AGGRE KES1 BY Nimi TO KES2 FILE SHOW KES2 / MIN-aggregated KES1 AGGRE-sukro käyttää mm. FILE SORT- ja FILE AGGR -operaatioita, jotka lukevat Survolle ominaiseen tapaan täsmennykset sujuvasti komennon ympäristöstä, myös tekstin seasta kuten yllä tapahtuu. Täsmennystietoja ei siis tarvitse kerätä komennon lähistölle mihinkään tiukkaan ohjelmatyyppiseen muotoon kuten muissa jollain tavoin Survoa muistuttavissa ohjelmissa (SAS, SPSS jne.). Välillä tuota vapautta täytyy rajoittaa. Silloin tarvitaan rajariviä (vähintään 10 pistettä rivin alussa peräkkäin): ....................................................... Saadusta 36 havainnon aineistosta voidaan poimia esim. kaikki vähintään 10 viestiä kirjoittaneet, eli ne jotka täyttävät ehdon IND=FREQ,10,255 (ylärajana voisi olla vaikka 1000 yhtä hyvin). Valitaan tulostettavat (ainoat) muuttujat järjestyksessä VARS=Nimi,FREQ,Klo (aineistossa FREQ on ensimmäisenä). [kontrollisarake otettu taas näkyviin myöhemmin] *FILE LOAD KES2 CUR+3 / poimitaan osa-aineisto kenttään *-SORT B,C,CUR+1 / lajitellaan se alla näkyvään järjestykseen * 111 *DATA KES2*,B,C,D D Nimi FREQ Klo B Seppo Mustonen 70 9.000 * Kimmo Vehkalahti 38 0.000 * Marjut Schreck 22 8.000 * Juha Valtonen 21 8.000 * Markku Verkasalo 13 11.000 * Pauli Posti 11 9.000 C Maija Polus 10 10.000 Tästä kuvastuu keskustelun tähänastinen luonne: kolme ensimmäistä sijaa vievät SM, KV ja MS. Nyt kaikki muutkin kirjoittamaan, ei tämän mitään keskitettyä tiedotusta ole tarkoitus olla. :-) Se mikä näkyy myös, on että allekirjoittanut kirjoittelee tänne ihan omia aikojaan... Jos jaksoit kahlata jutun tänne asti, jaksaisit varmaan itsekin kirjoitella vähän jutuntynkää nähtäville, vai mitä? :-) Millään muulla ohjelmalla ei tällaisen jutun laatiminen käy näin helposti: sen kun tekee, työ dokumentoi itsensä sitä mukaa. Proosaa voi suoltaa mukaan sen verran kuin huvittaa - tähän tuli nyt aika paljon... - Kimmo -- http://www.helsinki.fi/people/Kimmo.Vehkalahti/
Vastaukset: |
---|
Survo-keskustelupalstan (2001-2013) viestit arkistoitiin aika ajoin sukrolla, joka automaattisesti rakensi viesteistä (yli 1600 kpl) HTML-muotoisen sivukokonaisuuden. Vuoden 2013 alusta Survo-keskustelua on jatkettu entistäkin aktiivisemmin osoitteessa forum.survo.fi. Tervetuloa mukaan!