DA MASER A MONFUMO | MOTO GUZZI V85TT | PURE SOUND POV 4K

🏍️ Il mio nuovo canale YouTube: giri in moto in POV, solo audio, tra le Dolomiti in 4K. Niente musica, niente parole — solo il motore e le Alpi. Vieni a fare un giro!

Iscriviti

Ingegneri che scattano foto, capire come le immagini performano online può fornire indicazioni preziose sulle preferenze e il coinvolgimento del pubblico. In questo post, vi guiderò attraverso uno script Python che ho creato per analizzare le performance delle mie foto su Unsplash. Lo script recupera le foto, calcola i punteggi di performance, identifica gli outlier, normalizza i punteggi e genera una visualizzazione.

Il codice completo si trova nel repository disponibile su lucavallin/uppa.

Cosa Fa lo Script?

Ecco una panoramica ad alto livello di ciò che fa lo script:

  1. Recupera le foto da Unsplash: Ottiene le vostre foto tramite l'API di Unsplash.
  2. Calcola i punteggi di performance: Calcola i punteggi di performance grezzi in base alle visualizzazioni per giorno e ai download per visualizzazione.
  3. Identifica gli outlier del limite superiore: Utilizza il metodo dell'Interquartile Range (IQR) per calcolare il limite superiore degli outlier.
  4. Filtra gli outlier del limite superiore: Rimuove le foto identificate come outlier del limite superiore.
  5. Ricalcola i punteggi minimi e massimi: Ricalcola i punteggi grezzi minimi e massimi dopo la rimozione degli outlier.
  6. Normalizza i punteggi: Normalizza i punteggi delle foto rimanenti su una scala da 0 a 100.
  7. Mostra i risultati: Stampa i punteggi normalizzati, genera un grafico a barre e opzionalmente salva i risultati in un file JSON.

Perché Ho Scritto Questo Script

Unsplash fornisce statistiche su visualizzazioni e download per ogni foto, ma questi numeri da soli non sono molto significativi. Per ottenere informazioni più approfondite sulle performance delle mie foto, ho dovuto prendere in considerazione ulteriori fattori:

  • Quante visualizzazioni in quanti giorni?: Questo aiuta a capire il ritmo con cui una foto viene vista.
  • Quanti download in quanti giorni?: Fornisce un'indicazione del ritmo con cui una foto viene scaricata.
  • Quante visualizzazioni si convertono in download?: Questo tasso di conversione riflette l'appeal e l'efficacia di una foto.

Tenendo conto di questi aspetti, lo script calcola un punteggio di performance più completo, permettendomi di valutare e confrontare meglio il successo delle mie foto su Unsplash.

Prerequisiti

Per iniziare, assicuratevi di avere Python 3.x installato insieme alle librerie necessarie:

  • requests: Questa libreria viene utilizzata per effettuare richieste HTTP all'API di Unsplash per recuperare le foto.
  • numpy: Questa libreria viene utilizzata per operazioni numeriche, come il calcolo dell'Interquartile Range (IQR) per identificare gli outlier e normalizzare i punteggi.
  • matplotlib: Questa libreria viene utilizzata per generare un grafico a barre per visualizzare i punteggi normalizzati delle foto.

È possibile installare le librerie richieste usando pip:

sh
pip install requests numpy matplotlib

Avrete anche bisogno di un access key per l'API di Unsplash, che potete ottenere registrandovi come developer sul sito di Unsplash.

Impostazione delle Variabili d'Ambiente

Prima di eseguire lo script, impostate le variabili d'ambiente per il vostro access key e username di Unsplash.

Su macOS/Linux

Aggiungete le seguenti righe al vostro .bashrc o .bash_profile:

sh
export UNSPLASH_ACCESS_KEY='your_unsplash_access_key'
export UNSPLASH_USERNAME='your_unsplash_username'

Poi, aggiornate il file per applicare le modifiche:

sh
source ~/.bashrc  # or source ~/.bash_profile

Su Windows

Impostate le variabili d'ambiente tramite riga di comando o tramite la finestra Proprietà del sistema:

sh
setx UNSPLASH_ACCESS_KEY "your_unsplash_access_key"
setx UNSPLASH_USERNAME "your_unsplash_username"

Lo Script

Ecco lo script Python completo con spiegazioni:

Passo 1: Importa le Librerie e Leggi le Variabili d'Ambiente

Per prima cosa, importiamo le librerie necessarie e leggiamo l'access key e lo username dalle variabili d'ambiente.

python
import os
import requests
import numpy as np
import json
import matplotlib.pyplot as plt
 
# Read ACCESS_KEY and USERNAME from environment variables
ACCESS_KEY = os.getenv('UNSPLASH_ACCESS_KEY')
USERNAME = os.getenv('UNSPLASH_USERNAME')
 
# Check if ACCESS_KEY and USERNAME are set
if not ACCESS_KEY or not USERNAME:
    print("Please set the UNSPLASH_ACCESS_KEY and UNSPLASH_USERNAME environment variables.")
    exit()
 
PHOTOS_FILENAME = 'photos.json'

Passo 2: Recupera le Foto da Unsplash

Definiamo una funzione per recuperare le foto dall'API di Unsplash con paginazione.

python
def get_unsplash_photos(username, access_key):
    url = f"https://api.unsplash.com/users/{username}/photos"
    all_photos = []
    page = 1
    per_page = 30
 
    while True:
        params = {
            'client_id': access_key,
            'page': page,
            'per_page': per_page,
            'stats': 'true'
        }
        response = requests.get(url, params=params)
        if response.status_code != 200:
            print(f"Error: {response.status_code}")
            break
 
        photos = response.json()
        if not photos:
            break
 
        all_photos.extend(photos)
        page += 1
 
    return all_photos

Passo 3: Salva e Carica le Foto

Creiamo funzioni per salvare le foto in un file JSON e caricarle dal file se esiste.

python
def save_photos_to_file(photos, filename):
    with open(filename, 'w') as f:
        json.dump(photos, f, indent=4)
 
def load_photos_from_file(filename):
    with open(filename, 'r') as f:
        return json.load(f)

Passo 4: Carica o Recupera le Foto

Per risparmiare sulle richieste API, che possono essere limitate e richiedere tempo, controlliamo prima se esiste un file locale (photos.json). Se esiste, carichiamo le foto da questo file. In caso contrario, recuperiamo le foto da Unsplash e le salviamo nel file locale per un uso futuro.

python
if (os.path.exists(PHOTOS_FILENAME)):
    photos = load_photos_from_file(PHOTOS_FILENAME)
    print("Loaded photos from photos.json")
else:
    photos = get_unsplash_photos(USERNAME, ACCESS_KEY)
    if not photos:
        print("No photos retrieved. Please check your username and access key.")
        exit()
    save_photos_to_file(photos, PHOTOS_FILENAME)
    print("Fetched photos from Unsplash API and saved to photos.json")

Passo 5: Calcola i Punteggi di Performance Grezzi

Successivamente, calcoliamo i punteggi di performance grezzi per ogni foto. Questo viene fatto considerando sia il numero di visualizzazioni che il numero di download ricevuti dalla foto, e quanto tempo la foto è stata online. La formula utilizzata qui combina le visualizzazioni per giorno e i download per visualizzazione per fornire una misura equilibrata delle performance.

Ci concentriamo sulle foto che sono state online per almeno 30 giorni per garantire un'analisi significativa, poiché le foto molto recenti potrebbero non avere abbastanza dati per fornire un punteggio di performance affidabile.

python
W_v = 1.5
W_d = 0.5
filtered_photos = []
 
for photo in photos:
    days_online = (np.datetime64('now') - np.datetime64(photo['created_at'])).astype(int) / (24 * 60 * 60)
    if days_online >= 30:
        views = photo['statistics']['views']['total'] or 1  # Avoid division by zero
        downloads = photo['statistics']['downloads']['total']
        raw_score = (views / days_online) * W_v + (downloads / views) * W_d
        photo['days_online'] = days_online
        photo['raw_score'] = raw_score
        filtered_photos.append(photo)

Passo 6: Identifica e Filtra gli Outlier del Limite Superiore

Per garantire che la nostra analisi non sia distorta da foto con performance eccezionalmente elevate, identifichiamo e filtriamo questi outlier. Usiamo il metodo dell'Interquartile Range (IQR) per trovare il limite superiore. L'IQR è una misura della dispersione statistica e viene utilizzato qui per rilevare gli outlier.

Rimuovendo le foto con punteggi superiori a questo limite superiore, ci concentriamo sulla maggioranza delle foto, fornendo una rappresentazione più accurata delle performance tipiche.

python
raw_scores = np.array([photo['raw_score'] for photo in filtered_photos])
Q1 = np.percentile(raw_scores, 25)
Q3 = np.percentile(raw_scores, 75)
IQR = Q3 - Q1
upper_bound = Q3 + 1.5 * IQR
 
filtered_photos = [photo for photo in filtered_photos if photo['raw_score'] <= upper_bound]

Passo 7: Normalizza i Punteggi

Dopo aver filtrato gli outlier, normalizziamo i punteggi grezzi in un intervallo da 0 a 100. La normalizzazione ci consente di confrontare le performance delle foto su una scala comune, rendendo più facile identificare i migliori performer.

Prima ricalcoliamo i punteggi grezzi minimi e massimi dai dati filtrati. Poi applichiamo la formula di normalizzazione al punteggio grezzo di ogni foto.

python
filtered_raw_scores = np.array([photo['raw_score'] for photo in filtered_photos])
min_raw = filtered_raw_scores.min()
max_raw = filtered_raw_scores.max()
 
for photo in filtered_photos:
    photo['normalized_score'] = ((photo['raw_score'] - min_raw) / (max_raw - min_raw)) * 100
    photo['days_online'] = int(photo['days_online'])

Passo 8: Ordina e Mostra i Risultati

Ordiniamo le foto per i loro punteggi normalizzati e stampiamo i risultati. Questo fornisce un modo semplice per vedere quali foto stanno performando meglio.

python
sorted_photos = sorted(filtered_photos, key=lambda x: x['normalized_score'], reverse=True)
for photo in sorted_photos:
    print(f"Photo URL: https://unsplash.com/photos/{photo['id']}, Days Online: {photo['days_online'] }, Views: {photo['statistics']['views']['total']}, Downloads: {photo['statistics']['downloads']['total']}, Normalized Score: {photo['normalized_score']:.2f}")

L'output sarà simile a questo:

Photo URL: https://unsplash.com/photos/kEOpys1hHkc, Days Online: 38, Views: 5035, Downloads: 58, Normalized Score: 100.00
Photo URL: https://unsplash.com/photos/wimuq4MFt34, Days Online: 38, Views: 5004, Downloads: 69, Normalized Score: 99.34
Photo URL: https://unsplash.com/photos/fNb_pAywgts, Days Online: 38, Views: 3869, Downloads: 17, Normalized Score: 75.09
Photo URL: https://unsplash.com/photos/D8ZVdmF8glM, Days Online: 114, Views: 11183, Downloads: 97, Normalized Score: 71.92
Photo URL: https://unsplash.com/photos/kHeTz2vhBQM, Days Online: 37, Views: 3395, Downloads: 27, Normalized Score: 67.27
....

Passo 9: Genera un Grafico a Barre

Infine, generiamo un grafico a barre per visualizzare i punteggi normalizzati delle foto. Questo aiuta a identificare rapidamente le foto con le migliori performance.

python
photo_ids = [photo['id'] for photo in sorted_photos]
normalized_scores = [photo['normalized_score'] for photo in sorted_photos]
 
plt.figure(figsize=(10, 8))
plt.barh(photo_ids, normalized_scores, color='skyblue')
plt.xlabel('Normalized Score')
plt.ylabel('Photo ID')
plt.title('Normalized Scores of Unsplash Photos')
plt.gca().invert_yaxis()  # Invert y-axis to have the highest score at the top
plt.show()

Questo è uno dei grafici generati dallo script:

Normalized Scores of Unsplash Photos

Esecuzione dello Script

Per eseguire lo script, assicuratevi di aver impostato le variabili d'ambiente e poi lanciate:

sh
python uppa.py

Il codice completo si trova nel repository disponibile su lucavallin/uppa.

Conclusione

Analizzando le performance delle vostre foto su Unsplash, potete ottenere informazioni aggiuntive su quali foto funzionano meglio sul sito. Questo script fornisce un modo abbastanza buono (credo?) per verificare le performance delle foto, aiutandovi a prendere decisioni "data-driven" per il vostro portfolio fotografico.