Compute the probabilities of getting each of the possible sums when throwing 2 dice, n times
First thing to note is that since you only check up to s=12, your code won't work for more than 2 dice. What you really need is a list so how high you go can be a variable.  Also N*(float(M)/N) seems the same as float(M), so I'm not sure what you're trying to do there.

def freq_2dice(n, N):
    dice_list = [0] * (n*6+1)
    for reps in xrange(N):
        s = 0
        for dice in xrange(n):
            outcome = randint(1, 6)
            s += outcome
        dice_list[s] += 1
    return dice_list


I rewrote your freq_2dice using an list.  My version is a little different because it'll return 0 through 6*n instead of 2 through 12.  dice_list = [0] * (n*6+1) lets me start with a list populated with all zeroes that is n*6+1 long (since it starts with 0 but I still want to include 6*n in the list)

Next, you're running the really expensive part of your program (freq_2dice) 22 times! You're actually running it twice every line, so that the number of 2's won't match the corresponding probability because those are two different runs.  Running it the first time provides all of the information you need.

Instead of all your print statements, a loop would be good there too.  So first, I'm going to run each function just ONCE instead of repeatedly and I'll store the results. Then I'll use a loop for the print statement (which could let you make the print range dynamic for more than 2 dice as well, but I'll just keep it simple here) 

freq_2_dice_results = freq_2dice(n, N)
dice_chance_results = chance_die()
for dice_value in range(2, 13):
    print 'No. of %d: %d, probability: %.2f, expected: %.2f' % (
        dice_value,
        freq_2_dice_results[dice_value],
        float(freq_2_dice_results[dice_value])/(N/100),
        dice_chance_results[dice_value]/.36)


I hope that gives you a good place to start.