Calcolare frequenza cumulata

di il
10 risposte

Calcolare frequenza cumulata

Ciao, vorrei calcolare la frequenza cumulata di una matrice composta da una colonna e N righe contenente stringhe. Esempio:
m = [ CASA CANE PORTA CASA CANE]. Vorrei contare quante volte è presente ognuna delle parole all'interno della matrice e avere il risultato in un vettore. Consigli su una possibile funzione da utilizzare?

10 Risposte

  • Re: Calcolare frequenza cumulata

    Puoi usare una combinazione delle funzioni:
    strsplit: per dividere il vettore di caratteri in un callarraay di stringhe

    unique: per avere l'elenco (in ordine alfabetico) delle stringhe "uniche", la posizione della prima occorrenza, la posizione nel cellarray. Nell'identificazione delle stringhe "uniche" bisogna decidere se considerare in modo diverso stringhe uguali ma con lettere maiuscole / minuscole. Se si vogliono considerare uguali, si può usare la funzione upper o la funzione lower per convertire la stringa originale in maiuscolo o minuscolo

    accumarray per calcolare il numero di occorrenze delle stringhe "uniche"
  • Re: Calcolare frequenza cumulata

    Una possibile implementazione potrebbe essere:
    m=['CASA CANE PORTA CASA CANE prova cane PROVA']
    % Split the string 
    str=strsplit(upper(m));
    % Get the unique strings
    [uni_str,idx,pos]=unique(str,'first');
    % Count the occurrences
    fr=accumarray(pos',1);
    
    %
    % STAMPA RISULTATI %
    %
    
    fprintf(['Le parole uniche sono:\n' repmat('%s ',1,length(uni_str)) '\n\n'],uni_str{:})
    for i=1:length(uni_str)
       fprintf(['%s è presente %d volte nelle locazioni ' repmat('%d ',1,fr(i)) '\n'], uni_str{i},fr(i),find(pos == i))
    end
    
    
  • Re: Calcolare frequenza cumulata

    Ciao, grazie mille per la risposta! scusa il ritardo se ti rispondo solo ora. Ho usato le funzioni e andavano bene. Ho un ulteriore domanda: se volessi plottare il grafico della frequenza e decidere l'ordine delle parole nell'asse delle ascisse, come potrei fare? Non voglio che sei in ordine alfabetico.
    Esempio:
    20 pere
    30 mele
    0 angurie
    4 meloni
    Il grafico potrebbe avere nell'asse delle ascisse le parole in quest'ordine: pere angurie mele meloni. E' possibile? grazie mille in anticipo.
  • Re: Calcolare frequenza cumulata

    Immagino che tu voglia creare un grafico a barre.

    Cambiare le stringhe è semplice.
    Basta creare un cellarray con le parole desiderate e nell'ordine desiderato e quindi assegnare al parametro "xticklabel" del grafico il cellarray con le stringhe personalizzate.

    Nel momento che scegli l'ordine delle parole, devi adeguare quello dei valori: come hai definito le coppie "quantità - frutto"

    Di seguito un semplice esempio (il vettore con i dati è stato ordinato "a mano" in base alla sequenza dei nomi dei frutti)
    
    % Definizione delle stringhe personalizzate
    x_lab={'pere','angurie','mele','meloni'}
    % Dati di input
    data=[20 0 30 4]
    % Creaz<ione del grfico a barre
    bar(data)
    % identificazione dell'handle del sistema d'assi
    ax=gca
    % Settaggio delle stringhe personalizzate
    set(ax,'xticklabel',x_lab)
    
  • Re: Calcolare frequenza cumulata

    Grazie mille!Ha funzionato!
  • Re: Calcolare frequenza cumulata

    Scusami, ho un altro dubbio.. se non volessi ordinare a mano le quantità? Esempio: ho un vettore delle frequenze e un vettore di stringhe con l'ordine delle parole. Il vettore frequenze es.( 5 9 8 7) non è nel ordine del vettore delle stringhe es.(pere mele angurie meloni) ma il 5 corrisponde alle mele, il nove ai meloni, l'8 alle pere e il 7 alle angurie. Come faccio a ordinare il vettore frequenze nell'ordine del vettore di stringhe ma non manualmente? Grazie in anticipo!
  • Re: Calcolare frequenza cumulata

    Dipende da come ordini le stringhe e come queste sono associate ai valori corrispondenti.

    Come ordini le stringhe?
    Come sono associati stringhe e valori?
  • Re: Calcolare frequenza cumulata

    Per risponderti ti invio il codice che sto implementando. I miei dati sono contenuti nella matrice "s", conto con la funzione histcounts quanti di questi ricadono nelle categorie descritte dal vettore "str".Ottengo un vettore contenente le frequenze. Ora vorrei fare il grafico a barre ma non so identificare le frequenze alle categorie: non so se il primo numero dei vettore sia della categoria A o B ecc quindi vorrei ordinarlo in modo da saperlo.
    s = [matrice]
    s = string(s);
    s = lower(s);
    [words,~,idx] = unique(s);
    str=["A" "B" "C" "D"];
    numOccurrences = histcounts(idx,numel(str));
    numWords = length(s);
    PercentOfText = numOccurrences / numWords * 100.0; %frequenza relativa
    CumulativePercentOfText = cumsum(PercentOfText); %frequenza cumulata
    Grazie in anticipo!
  • Re: Calcolare frequenza cumulata

    Non capisco la domanda.

    Il codice che hai pubblicato e la sua descrizione sembrano simili a quello che hai chiesto nella prima domanda, anche se il codice è un po' diverso da quello che ti ho suggerito (ovviamente non sei tenuta ad usarlo).

    Se però il problema è lo stesso della prima domanda, con l'aggiunta del grafico a barre, nella soluzione che ti ho proposto alla prima domanda ti permette di conoscere automaticamente il numero di occorrenze delle varie parole e l'ordine.
    Se, invece, non è così, ed il problema è diverso, dovresti, per lo meno pubblicare i valori di input (la matrice "s") e, per semplicità, spiegare in che modo il problema è diverso da quello della prima domanda.

    Se il problema è lo stesso (a parte il grafico a barre), si può modificare il codice originale aggiungendo le istruzioni per il calcolo delle frequenze e per la creazione del grafico a barre come segue.
    
    m=['CASA CANE PORTA CASA CANE prova cane PROVA']
    % Split the string 
    str=strsplit(upper(m));
    % Get the unique strings
    [uni_str,idx,pos]=unique(str,'first');
    % Count the occurrences
    fr=accumarray(pos,1);
    
    %
    % STAMPA RISULTATI %
    %
    
    fprintf(['Le parole uniche sono:\n' repmat('%s ',1,length(uni_str)) '\n\n'],uni_str{:})
    for i=1:length(uni_str)
       fprintf(['%s è presente %d volte nelle locazioni ' repmat('%d ',1,fr(i)) '\n'], uni_str{i},fr(i),find(pos == i))
    end
    
    bar(fr)
    ax=gca;
    ax.XTickLabel=uni_str;
    ax.Title.String='Occorrenze'
    
    PercentOfText = fr / length(str) * 100.0 %frequenza relativa
    CumulativePercentOfText = cumsum(PercentOfText) %frequenza cumulata
    
    figure
    bar(PercentOfText)
    ax=gca;
    ax.Title.String='PercentOfText'
    ax.XTickLabel=uni_str;
    
    figure
    bar(CumulativePercentOfText)
    ax=gca;
    ax.XTickLabel=uni_str;
    ax.Title.String='CumulativePercentOfText'
    
    
  • Re: Calcolare frequenza cumulata

    Ciao, cerco di spiegarmi meglio. Il primo problema era riuscire a eseguire un frequenza cumulata, il secondo problema (quello che non sono riuscita a spiegarti) è la visualizzazione della frequenza sul grafico a barre. Io vorrei scegliere l'ordine della prima barra, della seconda ecc nelle ascisse del grafico.
    Eseguendo il tuo codice, l'ordine nelle ascisse è alfabetico : la prima barra è riferita a Cane,la seconda a Casa, la terza a Porta e la quarta a Prova. Io vorrei cambiare l'ordine e avere come prima barra quella della Porta per esempio. Grazie mille!
Devi accedere o registrarti per scrivere nel forum
10 risposte