[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!