Ketkä keskustelevat? Milloin ja miten paljon?

[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> 
&nbsp;-&nbsp;
<B>Kimmo Vehkalahti</B> 
&nbsp;20.2.2002 15:41 &nbsp;
<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>&nbsp;20.2.2002 15:41 &nbsp;<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}&nbsp{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
/
/%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/...&nbsp;<B>Kimmo Vehkalahti</B>&nbsp;20.2.2002 15:41 &nbsp;<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>&nbsp;20.2.2002 15:41 &nbsp;<I>...
/%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/
/ Siistitään koodit pois nimen ympäriltä, kohdistin jää Pvm:n alkuun:
/
*{del3}{search}</{R}{del10}
/
/%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/Kimmo Vehkalahti20.2.2002 15:41 &nbsp;<I>...
/%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/
/ Merkitään Pvm ja Klo tekstiblokiksi "20.2.2002 15:41 " ja
/ napataan se talteen:
/
*{block}{block}{search}&nbsp{R}{l}{block}{erase}
/
/%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
/Kimmo Vehkalahti                &nbsp;<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:
[ei vastauksia]

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!

Etusivu  |  Keskustelu
Copyright © Survo Systems 2001-2013. All rights reserved.
Updated 2013-06-15.