Monthly Archives: October 2014

Why You Can’t Make a Living by Blogging

How much can you actually make from blogging?  The question is of more than casual interest to me and to every other blogger out there.  At some point we’ve all wondered how many articles we need to write to get rich, or at least to pay our internet bill.

A couple of years ago Nate Silver, blogging for the _New York Times_, did a rather enlightening analysis  of the Huffington Post’s blog business.  He concluded that HuffPost makes about $13 per blog article.  They don’t pay their bloggers, but if they did they would clearly be paying them less than $13.

Go on Fiverr or similar freelancer marketplaces and you will find any number of people offering to “write a 500 word blog article on any subject” for $5.  I have no idea how many of these they actually book.
What about the rest of us, slightly more casual, bloggers?  Many of us write on Blogger or something similar and monetize through Google Adsense.  What sort of revenue can we expect?

I don’t have access to other bloggers’ data.  I do, however, use Blogger for three of my own blogs.  I started the oldest in 2008 and have posted sporadically ever since.  I decided to see what insights I could glean from my own data.
It wasn’t hard to throw the numbers into a spreadsheet and draw a histogram:

Histogram of actual blog hits.
This distribution might be a little misleading, though.  After all, some of these articles are eight years old, while others were posted this week.  Since blog articles stay on the web forever the older ones will tend to have more lifetime hits, and I needed to correct for this.

Blogger’s dashboard doesn’t give week-by-week histories for individual articles, but I was able to model an article’s hits over time by assuming that it gets 50% of its lifetime visits the first year, 50% of its remaining visits the next year, and so on forever.  If you took calculus you will probably recognize this as an infinite series.  Being a basically lazy person, I avoided doing the math and simply built a spreadsheet to work backwards.  (I won’t go into details.  It involves data tables and lookup functions).  The new distribution, of estimated lifetime hits for all my blog articles, is:

Histogram of lifetime blog hits
By now you will have noticed one of the sad truths about blogging:  for every article that gets a respectable number of hits you write several that hardly anyone reads.

I wanted to come up with an expected number of hits per article.  Since this was a small sample size with an irregular distribution, the best way to handle it was with a simple simulation (statistics nerds would call it a bootstrap).  Returning to my spreadsheet I sampled my distribution 10,000 times.  This allowed me to estimate the expected number of lifetime hits for an article as 1,271, with a 95% confidence interval from 1,192 to 1,350.

According to Adsense, my lifetime RPM (revenue per 1,000 impressions) is $0.96.  I’ve talked with other bloggers, and this seems pretty typical.  By simple multiplication, my expected revenue for a blog article is about $1.22.

One hears stories about people who can bang out five articles a day, every day.  I am not one of those people; I doubt many bloggers are.  When I don’t have any other writing projects, I might be able to manage five a week.  If I did this all year long, I would make about $317.31 from selling ads.  If I sold all of my articles on Fiverr, I could rake in $1,300.  Even if I made as much per article as the Huffington Post, that would still only be $3,380.   Better not quit my day job.  Wait, it’s too late for that.

I think that most bloggers out there are more like me than not, which means that none of us are going to be able to support ourselves from blogging alone.

So Why Do it at All?

The blogging itself doesn’t pay, but it can still make economic sense to blog.  One of the main reasons is to build a writing portfolio that will help you get actual, paying freelance work, or maybe even a regular column.  People have managed it.

Then there are the merchandising opportunities:  You could sell swag like t-shirts and stickers.  Your gross revenue on one bumper sticker is probably bigger than on 1,000 advertising hits.  Or you could try crowdfunding.  Your blog followers are the natural people to hit up for a contribution to your next Kickstarter campaign.

A huge reason for nonfiction writers like me to blog is the chance to post and get feedback on material that will later go in a book.  One of my newer blogs was actually designed from the start to be the first draft of a DIY handbook.  As soon as I hit 150,000 words I’m going to download the whole thing and start arranging it into chapters.

The Lesson

You will never make enough from blogging alone to make a financial difference. However as a writer, blogging might fit into your larger career plan, or help you generate revenue from other sources.

This article was published simultaneously on LinkedIn.

Advertisements

Safety and the Handyman Lifestyle

Many of you know that one of my side projects is a YouTube channel called Handyman Kevin. On the channel, I demonstrate a bunch of skills that I picked up when I dropped out of engineering school and spent a decade as a handyman, bicycle mechanic, factory worker, and cabinet maker. To keep things fun, I invented a character called, eponymously, Handyman Kevin, who is a somewhat courser and all-around goofier character than I. Perhaps he is what I would have turned into if I hadn’t straightened out my life and gotten my last two college degrees. Most people look at my videos and see them as one more guy trying to make a buck off the so-called DIY movement. They aren’t wrong. But I do like to think that I hit a deeper vein of materials now and then. The fact is, I’m lucky enough to have survived a lifestyle which is totally foreign to the average white, middle-class American of my generation. Being a handyman isn’t about having a garage full of expensive tools that you use once a month to build birdhouses. It’s about living in your truck because you only work three days a week for $10/hour and can’t afford an apartment. It’s about being dirty, tired, cold, and wet while some housewife tries to talk down the bill on a $50 job that barely paid for the gas to get you to there. It’s about knowing that you don’t have insurance and that if you get hurt, assuming you are lucky enough to make it to the ER, they will probably give you the minimum care and kick you out the door before you bring down the tone.

Back in the day, I took all of this for granted because, for all the drawbacks of the lifestyle, it also has a lot of freedom and gives you a sense of accomplishment. There is a lot of pride in knowing that only your own skills are keeping you from starving, but that you haven’t starved yet.

Obviously, I and the middle class see things from a very different perspective. Few things drive the perceptual gap home to me as hard as when I post a video and I start getting comment after comment saying things like “You need to be more careful.”, “You should get a vice.”, or “It looked like you almost cut your hand off.”

Actually, I enjoy these comments. Usually, they mean that particular video is going to get an above average number of views—which may say something about my audience. Still, given that my mission is to open a window into the working man’s lifestyle, I feel compelled to raise a few points.

  • There are very few vices on job sites. The plumber might have one, for making up pipe. Carpenters simply don’t use them, and almost no handyman or laborer has one because they are heavy and expensive. For that matter, in the two factories I worked in (one with 11,000 employees and the other with 1,600) there was exactly one vice per factory, both of them in the tool rooms. We were expected to get by without them and hold things with our hips or our knees. It worked fine.
  • In my experience, tradesmen are actually more careful than white-collar workers. Our bodies are our only way to make money. If we get hurt, we usually get fired. Worker’s comp is a joke, even if the company doesn’t find a way to disqualify us. If we’re self employed we don’t even get that.
  • Most tradesmen, who learned to work in the field through apprenticeships, do things that are relatively safe, yet look dangerous to white collar workers. When I was a safety foreman at an oil refinery I spent nearly all of my time arguing with managers to keep them from making rules that would make it impossible for my men to get any work done. Trust me, by the time we turn out as journeymen we know how to work safely. Either we get the skills beat into us by our foremen, or we hurt ourselves badly enough to leave the trade. In the six months I spent at the oil refinery, with an average crew size of about 30, our only reportable injury was an administrative assistant who sprained her ankle when she tripped on the stairs to the office trailer.

Sorry for getting on my soap box. These things seem terribly obvious to me. I bet they are also obvious to your gardener, the guys who built your house, the maintenance guy at your office building, and the people who work in the factories in Asia where everything in your home was made. I realize, though, that they aren’t so obvious to you. That’s why I make these videos. These days, very few of you will ever spend much time on a construction job site or a factory floor. I have, though, and I try to recreate a little of that in my garage every week.

Easy Double Exponential Smoothing in Python

I realized this morning that it has been a while since I posted any Python code. I’ve been a bit busy with Handyman Kevin and haven’t been doing much data science. Still, I decided it was time to carve out a couple hours this morning to practice my skills. The result are these functions, which perform basic double exponential smoothing using the Holt-Winters method. I deliberately avoided using NumPy, SciPy, or any other libraries. It isn’t that I dislike Numpy/Scipy (far from it), but you can’t always get sysadmins to install extra libraries on the machines you’re using, especially if you are a guerrilla data scientist like me.

There are a lot of different time series methods out there, and they all have their points. Holt-Winters is the one that I keep coming back to, though. One of the reasons is simplicity–I can always remember it and bang it into a spreadsheet without needing to Google anything or download libraries. About the 40th time I typed it into a spreadsheet, though, it occurred to me that it would be smart to implement it in Python so I could save some typing.

The first function, MAPE, simply calculates the mean absolute percentage error (MAPE) of a list of estimated values, as compared to a list of actual values.

The next function, holtwinters, uses Holt-Winters to predict the next three values in a time series. You need to supply two smoothing coefficients, alpha and beta, for the level and trend, respectively. Typically, you would have a pretty good idea what these were from doing similar forecasts in the past.

If you don’t know the coefficients then use the third function, holtwinters_auto, to automatically determine them. This function uses a grid search. Those of you who have read my monograph probably remember that I’m not usually wild about grid searches. In this case it makes sense, though, since you don’t usually need more than a few digits of precision on the coefficients.

Screenshot (3)

def MAPE(actual, estimate):
    '''Given two lists, one of actual values and one of estimated values, 
        computes the Mean Absolute Percentage Error'''
        
    if len(actual) != len(estimate):
        print "ERROR: Lists not the same length."
        return []
        
    pcterrors = []
    
    for i in range(len(estimate)):
        pcterrors.append(abs(estimate[i]-actual[i])/actual[i])
    
    return sum(pcterrors)/len(pcterrors)
def holtwinters(ts, *args):
    '''Uses the Holt-Winters exp. smoothing method to forecast the next
       three points in a time series.  The second two arguments are 
       smoothing coefficients, alpha and beta.  If no coefficients are given,
       both are assumed to be 0.5.
       '''
       
    if len(args) >= 1:
        alpha = args[0]
       
    else:
        alpha = .5
        findcoeff = True
    
    if len(args) >= 2:
        beta = args[1]
    else:
        beta = .5
            
    if len(ts) < 3:
        print "ERROR: At least three points are required for TS forecast."
        return 0
    
    est = []    #estimated value (level)
    trend = []  #estimated trend
    
    '''For first value, assume trend and level are both 0.'''
    est.append(0)
    trend.append(0)
    
    '''For second value, assume trend still 0 and level same as first          
        actual value'''
    est.append(ts[0])
    trend.append(0)
    
    '''Now roll on for the rest of the values'''
    for i in range(len(ts)-2):
        trend.append(beta*(ts[i+1]-ts[i])+(1-beta)*trend[i+1])
        est.append(alpha*ts[i+1]+(1-alpha)*est[i+1]+trend[i+2])
        
    
    '''now back-cast for the first three values that we fudged'''
    est.reverse()
    trend.reverse()
    ts.reverse()
    
    for i in range(len(ts)-3, len(ts)):
        trend[i] = beta*(ts[i-1]-ts[i-2])+(1-beta)*(trend[i-1])
        est[i] = alpha*ts[i-1]+(1-alpha)*est[i-1]+trend[i]
    
       
    est.reverse()
    trend.reverse()
    ts.reverse()
    
    '''and do one last forward pass to smooth everything out'''
    for i in range(2, len(ts)):
        trend[i] = beta*(ts[i-1]-ts[i-2])+(1-beta)*(trend[i-1])
        est[i]= alpha*ts[i-1]+(1-alpha)*est[i-1]+trend[i]
        
    
    '''Holt-Winters method is only good for about 3 periods out'''
    next3 = [alpha*ts[-1]+(1-alpha)*(est[-1])+beta*(ts[-1]-ts[-2])+(1-beta)*         trend[-1]]
    next3.append(next3[0]+trend[-1])
    next3.append(next3[1]+trend[-1])
    
    return next3, MAPE(ts,est)
def holtwinters_auto(ts, *args):
    '''Calls the holtwinters function, but automatically determines the
    alpha and betta coefficients which minimize the error.
    
    The optional argument is the number of digits of precision you need
    for the coefficients.  The default is 4, which is plenty for most real
    life forecasting applications.
    '''
    
    if len(args) > 0:
        digits = args[0]
    else:
        digits = 4
    
    '''Perform an iterative grid search to find minimum MAPE'''
    
    alpha = .5
    beta = .5
    
    for d in range(1,digits):
        grid = []
        for b in [x * .1**d+beta for x in range(-5,6)]:
            for a in [x * .1**d+alpha for x in range(-5,6)]:
                grid.append(holtwinters(ts, a, b)[-1])
                if grid[-1]==min(grid):
                    alpha = a
                    beta = b
            
    next3, mape = holtwinters(ts, alpha, beta)
        
    return(next3, mape, alpha, beta)