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:
- Recupera le foto da Unsplash: Ottiene le vostre foto tramite l'API di Unsplash.
- Calcola i punteggi di performance: Calcola i punteggi di performance grezzi in base alle visualizzazioni per giorno e ai download per visualizzazione.
- Identifica gli outlier del limite superiore: Utilizza il metodo dell'Interquartile Range (IQR) per calcolare il limite superiore degli outlier.
- Filtra gli outlier del limite superiore: Rimuove le foto identificate come outlier del limite superiore.
- Ricalcola i punteggi minimi e massimi: Ricalcola i punteggi grezzi minimi e massimi dopo la rimozione degli outlier.
- Normalizza i punteggi: Normalizza i punteggi delle foto rimanenti su una scala da 0 a 100.
- 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:
pip install requests numpy matplotlibAvrete 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:
export UNSPLASH_ACCESS_KEY='your_unsplash_access_key'
export UNSPLASH_USERNAME='your_unsplash_username'Poi, aggiornate il file per applicare le modifiche:
source ~/.bashrc # or source ~/.bash_profileSu Windows
Impostate le variabili d'ambiente tramite riga di comando o tramite la finestra Proprietà del sistema:
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.
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.
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_photosPasso 3: Salva e Carica le Foto
Creiamo funzioni per salvare le foto in un file JSON e caricarle dal file se esiste.
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.
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.
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.
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.
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.
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.
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:

Esecuzione dello Script
Per eseguire lo script, assicuratevi di aver impostato le variabili d'ambiente e poi lanciate:
python uppa.pyIl 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.
lucavallin

